diff --git a/ChangeLog b/ChangeLog index 6a34a79298..4cc67d20e1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2007-12-13 Sven Neumann + + * app/base/tile-pyramid.c (tile_pyramid_write_quarter) + * app/display/gimpdisplayshell-render.c + (render_image_tile_fault_nearest): corrected formula used for + pre-multiplying the alpha value. + 2007-12-13 Sven Neumann Speed up our display rendering code paths by keeping data with diff --git a/app/base/tile-pyramid.c b/app/base/tile-pyramid.c index 84d1fb0764..b0755937a6 100644 --- a/app/base/tile-pyramid.c +++ b/app/base/tile-pyramid.c @@ -505,10 +505,10 @@ tile_pyramid_write_quarter (Tile *dest, break; default: - dst[0] = ((src0[0] * src0[1] + - src1[0] * src1[1] + - src2[0] * src2[1] + - src3[0] * src3[1]) >> 10); + dst[0] = ((src0[0] * (src0[1] + 1) + + src1[0] * (src1[1] + 1) + + src2[0] * (src2[1] + 1) + + src3[0] * (src3[1] + 1)) >> 10); dst[1] = (a + 2) >> 2; break; } @@ -557,19 +557,26 @@ tile_pyramid_write_quarter (Tile *dest, break; default: - dst[0] = ((src0[0] * src0[3] + - src1[0] * src1[3] + - src2[0] * src2[3] + - src3[0] * src3[3]) >> 10); - dst[1] = ((src0[1] * src0[3] + - src1[1] * src1[3] + - src2[1] * src2[3] + - src3[1] * src3[3]) >> 10); - dst[2] = ((src0[2] * src0[3] + - src1[2] * src1[3] + - src2[2] * src2[3] + - src3[2] * src3[3]) >> 10); - dst[3] = (a + 2) >> 2; + { + const guint a0 = src0[3] + 1; + const guint a1 = src1[3] + 1; + const guint a2 = src2[3] + 1; + const guint a3 = src3[3] + 1; + + dst[0] = (src0[0] * a0 + + src1[0] * a1 + + src2[0] * a2 + + src3[0] * a3) >> 10; + dst[1] = (src0[1] * a0 + + src1[1] * a1 + + src2[1] * a2 + + src3[1] * a3) >> 10; + dst[2] = (src0[2] * a0 + + src1[2] * a1 + + src2[2] * a2 + + src3[2] * a3) >> 10; + dst[3] = (a + 2) >> 2; + } break; } diff --git a/app/display/gimpdisplayshell-render.c b/app/display/gimpdisplayshell-render.c index 28d16ec455..8e98955c58 100644 --- a/app/display/gimpdisplayshell-render.c +++ b/app/display/gimpdisplayshell-render.c @@ -778,6 +778,7 @@ box_filter_premult (const guint left_weight, } } + /* fast paths */ static const guchar * render_image_tile_fault_one_row (RenderInfo *info); static const guchar * render_image_tile_fault_nearest (RenderInfo *info); @@ -1594,9 +1595,9 @@ render_image_tile_fault_nearest (RenderInfo *info) switch (bpp) { case 4: - d[0] = (s[0] * s[3]) >> 8; - d[1] = (s[1] * s[3]) >> 8; - d[2] = (s[2] * s[3]) >> 8; + d[0] = (s[0] * (s[3] + 1)) >> 8; + d[1] = (s[1] * (s[3] + 1)) >> 8; + d[2] = (s[2] * (s[3] + 1)) >> 8; d[3] = s[3]; d += 4; @@ -1604,7 +1605,7 @@ render_image_tile_fault_nearest (RenderInfo *info) break; case 2: - d[0] = (s[0] * s[1]) >> 8; + d[0] = (s[0] * (s[1] + 1)) >> 8; d[1] = s[1]; d += 2;