Doing profiles reveals that the check for "is this pixel at end of row?" if ((cur_pix + 1 - lines) % width == 0) leads to 2 divisions, one to compute (cur_pix + 1 - lines) (divided by sizeof(*cur_pix) which could be 3) and one for (x % width). Although the substituted code looks more long is faster as it does not involve divisions. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/red_bitmap_utils.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/server/red_bitmap_utils.h b/server/red_bitmap_utils.h index bf82e79..1849588 100644 --- a/server/red_bitmap_utils.h +++ b/server/red_bitmap_utils.h @@ -117,7 +117,8 @@ static void FNAME(compute_lines_gradual_score)(PIXEL *lines, int width, int num_ double *o_samples_sum_score, int *o_num_samples) { int jump = (SAMPLE_JUMP % width) ? SAMPLE_JUMP : SAMPLE_JUMP - 1; - PIXEL *cur_pix = lines + width / 2; + int cur_x = width / 2; + PIXEL *cur_pix = lines + cur_x; PIXEL *bottom_pix; PIXEL *last_line = lines + (num_lines - 1) * width; int num_samples; @@ -133,13 +134,17 @@ static void FNAME(compute_lines_gradual_score)(PIXEL *lines, int width, int num_ num_samples = 0; while (cur_pix < last_line) { - if ((cur_pix + 1 - lines) % width == 0) { // last pixel in the row + if (cur_x + 1 == width) { // last pixel in the row cur_pix--; // jump is bigger than 1 so we will not enter endless loop + cur_x--; } bottom_pix = cur_pix + width; samples_sum_score += FNAME(pixels_square_score)(cur_pix, bottom_pix); num_samples++; cur_pix += jump; + cur_x += jump; + while (cur_x >= width) + cur_x -= width; } (*o_samples_sum_score) = samples_sum_score; -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel