diff --git a/ChangeLog b/ChangeLog index 3d90440132..9bfc6f2d12 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,18 @@ +2004-12-31 Sven Neumann + + * tools/kernelgen.c: fixed rounding so that all brush kernels are + created with a constant sum of 256. + + * app/paint/gimpbrushcore-kernels.h: regenerated. + + * app/paint/gimpbrushcore.c (gimp_brush_core_subsample_mask): use + the constant defined un app/paint/gimpbrushcore-kernels.h. Should + give a tiny speedup. + 2004-12-31 Bill Skaggs - * app/paint/gimpbrushcore.c: invert dependence of brush size on pressure, - using formula from Dave Ahlswede in bug #149576. + * app/paint/gimpbrushcore.c: invert dependence of brush size on + pressure, using formula from Dave Ahlswede in bug #149576. 2004-12-31 Michael Natterer diff --git a/app/paint/gimpbrushcore-kernels.h b/app/paint/gimpbrushcore-kernels.h index a71e7e60ff..a9ae0768d0 100644 --- a/app/paint/gimpbrushcore-kernels.h +++ b/app/paint/gimpbrushcore-kernels.h @@ -10,6 +10,7 @@ #define KERNEL_WIDTH 3 #define KERNEL_HEIGHT 3 #define KERNEL_SUBSAMPLE 4 +#define KERNEL_SUM 256 /* Brush pixel subsampling kernels */ @@ -17,37 +18,37 @@ static const int subsample[5][5][9] = { { { 64, 64, 0, 64, 64, 0, 0, 0, 0, }, - { 25, 102, 0, 25, 102, 0, 0, 0, 0, }, + { 25, 103, 0, 25, 103, 0, 0, 0, 0, }, { 0, 128, 0, 0, 128, 0, 0, 0, 0, }, - { 0, 102, 25, 0, 102, 25, 0, 0, 0, }, + { 0, 103, 25, 0, 103, 25, 0, 0, 0, }, { 0, 64, 64, 0, 64, 64, 0, 0, 0, } }, { - { 25, 25, 0, 102, 102, 0, 0, 0, 0, }, - { 6, 43, 0, 43, 162, 0, 0, 0, 0, }, - { 0, 50, 0, 0, 205, 0, 0, 0, 0, }, - { 0, 43, 6, 0, 162, 43, 0, 0, 0, }, - { 0, 25, 25, 0, 102, 102, 0, 0, 0, } + { 25, 25, 0, 103, 103, 0, 0, 0, 0, }, + { 6, 44, 0, 44, 162, 0, 0, 0, 0, }, + { 0, 50, 0, 0, 206, 0, 0, 0, 0, }, + { 0, 44, 6, 0, 162, 44, 0, 0, 0, }, + { 0, 25, 25, 0, 103, 103, 0, 0, 0, } }, { { 0, 0, 0, 128, 128, 0, 0, 0, 0, }, - { 0, 0, 0, 50, 205, 0, 0, 0, 0, }, + { 0, 0, 0, 50, 206, 0, 0, 0, 0, }, { 0, 0, 0, 0, 256, 0, 0, 0, 0, }, - { 0, 0, 0, 0, 205, 50, 0, 0, 0, }, + { 0, 0, 0, 0, 206, 50, 0, 0, 0, }, { 0, 0, 0, 0, 128, 128, 0, 0, 0, } }, { - { 0, 0, 0, 102, 102, 0, 25, 25, 0, }, - { 0, 0, 0, 43, 162, 0, 6, 43, 0, }, - { 0, 0, 0, 0, 205, 0, 0, 50, 0, }, - { 0, 0, 0, 0, 162, 43, 0, 43, 6, }, - { 0, 0, 0, 0, 102, 102, 0, 25, 25, } + { 0, 0, 0, 103, 103, 0, 25, 25, 0, }, + { 0, 0, 0, 44, 162, 0, 6, 44, 0, }, + { 0, 0, 0, 0, 206, 0, 0, 50, 0, }, + { 0, 0, 0, 0, 162, 44, 0, 44, 6, }, + { 0, 0, 0, 0, 103, 103, 0, 25, 25, } }, { { 0, 0, 0, 64, 64, 0, 64, 64, 0, }, - { 0, 0, 0, 25, 102, 0, 25, 102, 0, }, + { 0, 0, 0, 25, 103, 0, 25, 103, 0, }, { 0, 0, 0, 0, 128, 0, 0, 128, 0, }, - { 0, 0, 0, 0, 102, 25, 0, 102, 25, }, + { 0, 0, 0, 0, 103, 25, 0, 103, 25, }, { 0, 0, 0, 0, 64, 64, 0, 64, 64, } } }; diff --git a/app/paint/gimpbrushcore.c b/app/paint/gimpbrushcore.c index e831762b83..d2fb3d8218 100644 --- a/app/paint/gimpbrushcore.c +++ b/app/paint/gimpbrushcore.c @@ -909,13 +909,16 @@ gimp_brush_core_subsample_mask (GimpBrushCore *core, gint r, s; gulong *accum[KERNEL_HEIGHT]; gint offs; - gint kernel_sum; - while (x < 0) x += mask->width; + while (x < 0) + x += mask->width; + left = x - floor (x); index1 = (gint) (left * (gdouble) (KERNEL_SUBSAMPLE + 1)); - while (y < 0) y += mask->height; + while (y < 0) + y += mask->height; + left = y - floor (y); index2 = (gint) (left * (gdouble) (KERNEL_SUBSAMPLE + 1)); @@ -971,15 +974,6 @@ gimp_brush_core_subsample_mask (GimpBrushCore *core, for (i = 0; i < KERNEL_HEIGHT ; i++) accum[i] = g_new0 (gulong, dest->width + 1); - /* Investigate modifiying kernelgen to make the sum the same - * for all kernels. That way kernal_sum becomes a constant - */ - kernel_sum = 0; - for (i = 0; i < KERNEL_HEIGHT * KERNEL_WIDTH; i++) - { - kernel_sum += kernel[i]; - } - core->kernel_brushes[index2][index1] = dest; m = mask_buf_data (mask); @@ -993,9 +987,7 @@ gimp_brush_core_subsample_mask (GimpBrushCore *core, offs = j + dest_offset_x; s = KERNEL_WIDTH; while (s--) - { - accum[r][offs++] += *m * *k++; - } + accum[r][offs++] += *m * *k++; } m++; } @@ -1003,7 +995,7 @@ gimp_brush_core_subsample_mask (GimpBrushCore *core, /* store the accum buffer into the destination mask */ d = mask_buf_data (dest) + (i + dest_offset_y) * dest->width; for (j = 0; j < dest->width; j++) - *d++ = (accum[0][j] + 127) / kernel_sum; + *d++ = (accum[0][j] + 127) / KERNEL_SUM; rotate_pointers (accum, KERNEL_HEIGHT); @@ -1015,7 +1007,7 @@ gimp_brush_core_subsample_mask (GimpBrushCore *core, { d = mask_buf_data (dest) + (i + dest_offset_y) * dest->width; for (j = 0; j < dest->width; j++) - *d++ = (accum[0][j] + (kernel_sum / 2)) / kernel_sum; + *d++ = (accum[0][j] + (KERNEL_SUM / 2)) / KERNEL_SUM; rotate_pointers (accum, KERNEL_HEIGHT); i++; @@ -1113,7 +1105,7 @@ gimp_brush_core_pressurize_mask (GimpBrushCore *core, j = pressure + pressure; k = 0; - + for (i = 0; i < 256; i++) { if (k > 255) @@ -1134,9 +1126,7 @@ gimp_brush_core_pressurize_mask (GimpBrushCore *core, i = subsample_mask->width * subsample_mask->height; while (i--) - { - *dest++ = mapi[(*source++)]; - } + *dest++ = mapi[(*source++)]; return core->pressure_brush; } @@ -1156,7 +1146,8 @@ gimp_brush_core_solidify_mask (GimpBrushCore *core, if ((brush_mask->width % 2) == 0) { - while (x < 0) x += brush_mask->width; + while (x < 0) + x += brush_mask->width; if ((x - floor (x)) >= 0.5) dest_offset_x++; @@ -1164,7 +1155,8 @@ gimp_brush_core_solidify_mask (GimpBrushCore *core, if ((brush_mask->height % 2) == 0) { - while (y < 0) y += brush_mask->height; + while (y < 0) + y += brush_mask->height; if ((y - floor (y)) >= 0.5) dest_offset_y++; @@ -1203,9 +1195,7 @@ gimp_brush_core_solidify_mask (GimpBrushCore *core, for (i = 0; i < brush_mask->height; i++) { for (j = 0; j < brush_mask->width; j++) - { - *d++ = (*m++) ? OPAQUE_OPACITY : TRANSPARENT_OPACITY; - } + *d++ = (*m++) ? OPAQUE_OPACITY : TRANSPARENT_OPACITY; d += 2; } @@ -1478,7 +1468,6 @@ paint_line_pixmap_mask (GimpImage *dest, for (byte_loop = 0; byte_loop < bytes - 1; byte_loop++) d[byte_loop] *= alpha; - /* printf("i: %i d->r: %i d->g: %i d->b: %i d->a: %i\n",i,(int)d[0], (int)d[1], (int)d[2], (int)d[3]); */ gimp_image_transform_color (dest, drawable, d, GIMP_RGB, p); d += bytes; } diff --git a/tools/kernelgen.c b/tools/kernelgen.c index 793ac57a3e..3ed2d63f16 100644 --- a/tools/kernelgen.c +++ b/tools/kernelgen.c @@ -30,6 +30,7 @@ #define STEPS 64 #define KERNEL_WIDTH 3 /* changing these makes no sense */ #define KERNEL_HEIGHT 3 /* changing these makes no sense */ +#define KERNEL_SUM 256 #define SUBSAMPLE 4 #define THRESHOLD 0.25 /* try to change this one */ @@ -58,7 +59,7 @@ create_kernel (double x, for (i = 0; i < STEPS * KERNEL_WIDTH; i++) { - dist_x = x - (((double)i + 0.5) / (double)STEPS); + dist_x = x - (((double) i + 0.5) / (double) STEPS); /* I've tried to use a gauss function here instead of a threshold, but the result was not that impressive. */ @@ -73,8 +74,8 @@ create_kernel (double x, { for (i = 0; i < KERNEL_WIDTH; i++) { - w = 256.0 * (value[i][j] / sum); - printf (" %3d,", (int)w); + w = (double) KERNEL_SUM * value[i][j] / sum; + printf (" %3d,", (int) (w + 0.5)); } } } @@ -96,6 +97,7 @@ main (int argc, printf ("#define KERNEL_WIDTH %d\n", KERNEL_WIDTH); printf ("#define KERNEL_HEIGHT %d\n", KERNEL_HEIGHT); printf ("#define KERNEL_SUBSAMPLE %d\n", SUBSAMPLE); + printf ("#define KERNEL_SUM %d\n", KERNEL_SUM); printf ("\n\n"); printf ("/* Brush pixel subsampling kernels */\n"); printf ("static const int subsample[%d][%d][%d] =\n{\n", @@ -103,13 +105,13 @@ main (int argc, for (j = 0; j <= SUBSAMPLE; j++) { - y = (double)j / (double)(SUBSAMPLE); + y = (double) j / (double) SUBSAMPLE; printf (" {\n"); for (i = 0; i <= SUBSAMPLE; i++) { - x = (double)i / (double)(SUBSAMPLE); + x = (double) i / (double) SUBSAMPLE; printf (" {"); create_kernel (x, y);