diff -uprN gtk+-2.8.13.org/gdk-pixbuf/pixops/pixops.c gtk+-2.8.13.INNER_LOOP/gdk-pixbuf/pixops/pixops.c --- gtk+-2.8.13.org/gdk-pixbuf/pixops/pixops.c Tue Jul 12 18:58:57 2005 +++ gtk+-2.8.13.INNER_LOOP/gdk-pixbuf/pixops/pixops.c Tue May 9 17:30:53 2006 @@ -71,35 +71,24 @@ get_check_shift (int check_size) return check_shift; } -static void -pixops_scale_nearest (guchar *dest_buf, - int render_x0, - int render_y0, - int render_x1, - int render_y1, - int dest_rowstride, - int dest_channels, - gboolean dest_has_alpha, - const guchar *src_buf, - int src_width, - int src_height, - int src_rowstride, - int src_channels, - gboolean src_has_alpha, - double scale_x, - double scale_y) -{ - int i; - int x; - int x_step = (1 << SCALE_SHIFT) / scale_x; - int y_step = (1 << SCALE_SHIFT) / scale_y; - int xmax, xstart, xstop, x_pos, y_pos; - const guchar *p; +typedef struct { guchar a,b,c; } b3; +extern void BUG_bad_size_of_struct_b3(void); -#define INNER_LOOP(SRC_CHANNELS,DEST_CHANNELS,ASSIGN_PIXEL) \ +#define INNER_LOOP_PREP() \ + do { \ + x = render_x0 * x_step + x_step / 2; \ xmax = x + (render_x1 - render_x0) * x_step; \ xstart = MIN (0, xmax); \ xstop = MIN (src_width << SCALE_SHIFT, xmax); \ + } while(0) + +#define INNER_LOOP_BODY(SRC_CHANNELS,DEST_CHANNELS,ASSIGN_PIXEL)\ + do { \ + y_pos = ((i + render_y0) * y_step + y_step / 2) >> SCALE_SHIFT; \ + y_pos = CLAMP (y_pos, 0, src_height - 1); \ + src = src_buf + y_pos * src_rowstride; \ + dest = dest_buf + i * dest_rowstride; \ + x = render_x0 * x_step + x_step / 2; \ p = src + (CLAMP (x, xstart, xstop) >> SCALE_SHIFT) * SRC_CHANNELS; \ while (x < xstart) \ { \ @@ -121,42 +110,58 @@ pixops_scale_nearest (guchar *des ASSIGN_PIXEL; \ dest += DEST_CHANNELS; \ x += x_step; \ - } + } \ + } while(0) - for (i = 0; i < (render_y1 - render_y0); i++) - { - const guchar *src; - guchar *dest; - y_pos = ((i + render_y0) * y_step + y_step / 2) >> SCALE_SHIFT; - y_pos = CLAMP (y_pos, 0, src_height - 1); - src = src_buf + y_pos * src_rowstride; - dest = dest_buf + i * dest_rowstride; +static void +pixops_scale_nearest (guchar *dest_buf, + int render_x0, + int render_y0, + int render_x1, + int render_y1, + int dest_rowstride, + int dest_channels, + gboolean dest_has_alpha, + const guchar *src_buf, + int src_width, + int src_height, + int src_rowstride, + int src_channels, + gboolean src_has_alpha, + double scale_x, + double scale_y) +{ + int i; + int x; + int x_step = (1 << SCALE_SHIFT) / scale_x; + int y_step = (1 << SCALE_SHIFT) / scale_y; + int xmax, xstart, xstop, x_pos, y_pos; + const guchar *p; - x = render_x0 * x_step + x_step / 2; + const guchar *src; + guchar *dest; - if (src_channels == 3) - { - if (dest_channels == 3) - { - INNER_LOOP (3, 3, dest[0]=p[0];dest[1]=p[1];dest[2]=p[2]); - } - else - { - INNER_LOOP (3, 4, dest[0]=p[0];dest[1]=p[1];dest[2]=p[2];dest[3]=0xff); - } - } - else if (src_channels == 4) - { - if (dest_channels == 3) - { - INNER_LOOP (4, 3, dest[0]=p[0];dest[1]=p[1];dest[2]=p[2]); - } - else - { - guint32 *p32; - INNER_LOOP(4, 4, p32=(guint32*)dest;*p32=*((guint32*)p)); - } - } + if(sizeof(b3) != 3) BUG_bad_size_of_struct_b3(); + + INNER_LOOP_PREP(); + + if (src_channels == 3) + { + if (dest_channels == 3) + for (i = 0; i < (render_y1 - render_y0); i++) + INNER_LOOP_BODY (3, 3, *(b3*)dest = *(b3*)p); + else + for (i = 0; i < (render_y1 - render_y0); i++) + INNER_LOOP_BODY (3, 4, (*(b3*)dest = *(b3*)p, dest[3]=0xff) ); + } + else if (src_channels == 4) + { + if (dest_channels == 3) + for (i = 0; i < (render_y1 - render_y0); i++) + INNER_LOOP_BODY (4, 3, *(b3*)dest = *(b3*)p); + else + for (i = 0; i < (render_y1 - render_y0); i++) + INNER_LOOP_BODY (4, 4, *(guint32*)dest = *((guint32*)p)); } } @@ -187,18 +192,14 @@ pixops_composite_nearest (guchar const guchar *p; unsigned int a0; + INNER_LOOP_PREP(); + for (i = 0; i < (render_y1 - render_y0); i++) { const guchar *src; guchar *dest; - y_pos = ((i + render_y0) * y_step + y_step / 2) >> SCALE_SHIFT; - y_pos = CLAMP (y_pos, 0, src_height - 1); - src = src_buf + y_pos * src_rowstride; - dest = dest_buf + i * dest_rowstride; - - x = render_x0 * x_step + x_step / 2; - INNER_LOOP(src_channels, dest_channels, + INNER_LOOP_BODY(src_channels, dest_channels, if (src_has_alpha) a0 = (p[3] * overall_alpha) / 0xff; else @@ -209,9 +210,7 @@ pixops_composite_nearest (guchar case 0: break; case 255: - dest[0] = p[0]; - dest[1] = p[1]; - dest[2] = p[2]; + *(b3*)dest = *(b3*)p; if (dest_has_alpha) dest[3] = 0xff; break; @@ -279,17 +278,12 @@ pixops_composite_color_nearest (guchar const guchar *p; unsigned int a0; + INNER_LOOP_PREP(); + for (i = 0; i < (render_y1 - render_y0); i++) { const guchar *src; guchar *dest; - y_pos = ((i + render_y0) * y_step + y_step / 2) >> SCALE_SHIFT; - y_pos = CLAMP (y_pos, 0, src_height - 1); - src = src_buf + y_pos * src_rowstride; - dest = dest_buf + i * dest_rowstride; - - x = render_x0 * x_step + x_step / 2; - if (((i + check_y) >> check_shift) & 1) { @@ -313,7 +307,7 @@ pixops_composite_color_nearest (guchar } j = 0; - INNER_LOOP(src_channels, dest_channels, + INNER_LOOP_BODY(src_channels, dest_channels, if (src_has_alpha) a0 = (p[3] * overall_alpha + 0xff) >> 8; else @@ -372,7 +366,8 @@ pixops_composite_color_nearest (guchar ); } } -#undef INNER_LOOP +#undef INNER_LOOP_BODY +#undef INNER_LOOP_PREP static void composite_pixel (guchar *dest, int dest_x, int dest_channels, int dest_has_alpha,