mirror of https://github.com/GNOME/gimp.git
app/gimage_mask.c applied patch from Ben Jackson to fix fractional pixel
* app/gimage_mask.c * app/paint_core.c: applied patch from Ben Jackson to fix fractional pixel errors and reverted the old fix. * app/paint_funcs.h: changed the #defines for ERASE_MODE and REPLACE_MODE to correctly match layer_modes[] -Yosh
This commit is contained in:
parent
a705770e83
commit
09a5fde1ce
|
@ -1,3 +1,12 @@
|
||||||
|
Mon Mar 23 18:08:59 PST 1998 Manish Singh <yosh@gimp.org>
|
||||||
|
|
||||||
|
* app/gimage_mask.c
|
||||||
|
* app/paint_core.c: applied patch from Ben Jackson to fix
|
||||||
|
fractional pixel errors and reverted the old fix.
|
||||||
|
|
||||||
|
* app/paint_funcs.h: changed the #defines for ERASE_MODE and
|
||||||
|
REPLACE_MODE to correctly match layer_modes[]
|
||||||
|
|
||||||
Mon Mar 23 20:51:53 1998 Owen Taylor <owt1@cornell.edu>
|
Mon Mar 23 20:51:53 1998 Owen Taylor <owt1@cornell.edu>
|
||||||
|
|
||||||
* INSTALL configure.in: Added some documentation
|
* INSTALL configure.in: Added some documentation
|
||||||
|
|
|
@ -573,33 +573,16 @@ gimage_mask_stroke (gimage, drawable)
|
||||||
non_gui_paint_core.paint_func = gimage_mask_stroke_paint_func;
|
non_gui_paint_core.paint_func = gimage_mask_stroke_paint_func;
|
||||||
gimage_mask_stroking = TRUE;
|
gimage_mask_stroking = TRUE;
|
||||||
|
|
||||||
/* Note added by Raph Levien, 27 Jan 1998
|
non_gui_paint_core.startx = non_gui_paint_core.lastx = (stroke_segs[0].x1 - offx);
|
||||||
|
non_gui_paint_core.starty = non_gui_paint_core.lasty = (stroke_segs[0].y1 - offy);
|
||||||
The subtraction of 0.125 is to compensate for imprecision in
|
|
||||||
paint_core_subsample_mask. Ben Jackson posted a patch on 14 Jan
|
|
||||||
1998 to gimp-developers which addresses the imprecision more
|
|
||||||
directly. However, I've chosen this quick hack instead because it
|
|
||||||
is a less drastic change, and has no impact on performance. By
|
|
||||||
contrast, Ben's patch builds 25 rather than 16 subsampled brush
|
|
||||||
masks.
|
|
||||||
|
|
||||||
I'm planning to rework the subsample mechanism anyway to make way
|
|
||||||
for the natural brushes. When that happens, I'll be sure to make
|
|
||||||
it round precisely, at which point these -0.125 offsets can come
|
|
||||||
out.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
non_gui_paint_core.startx = non_gui_paint_core.lastx = (stroke_segs[0].x1 - offx) - 0.125;
|
|
||||||
non_gui_paint_core.starty = non_gui_paint_core.lasty = (stroke_segs[0].y1 - offy) - 0.125;
|
|
||||||
|
|
||||||
seg = 0;
|
seg = 0;
|
||||||
for (i = 0; i < num_strokes; i++)
|
for (i = 0; i < num_strokes; i++)
|
||||||
{
|
{
|
||||||
while (stroke_segs[seg].x2 != -1)
|
while (stroke_segs[seg].x2 != -1)
|
||||||
{
|
{
|
||||||
non_gui_paint_core.curx = (stroke_segs[seg].x2 - offx - 0.125);
|
non_gui_paint_core.curx = (stroke_segs[seg].x2 - offx);
|
||||||
non_gui_paint_core.cury = (stroke_segs[seg].y2 - offy - 0.125);
|
non_gui_paint_core.cury = (stroke_segs[seg].y2 - offy);
|
||||||
|
|
||||||
paint_core_interpolate (&non_gui_paint_core, drawable);
|
paint_core_interpolate (&non_gui_paint_core, drawable);
|
||||||
|
|
||||||
|
|
|
@ -573,33 +573,16 @@ gimage_mask_stroke (gimage, drawable)
|
||||||
non_gui_paint_core.paint_func = gimage_mask_stroke_paint_func;
|
non_gui_paint_core.paint_func = gimage_mask_stroke_paint_func;
|
||||||
gimage_mask_stroking = TRUE;
|
gimage_mask_stroking = TRUE;
|
||||||
|
|
||||||
/* Note added by Raph Levien, 27 Jan 1998
|
non_gui_paint_core.startx = non_gui_paint_core.lastx = (stroke_segs[0].x1 - offx);
|
||||||
|
non_gui_paint_core.starty = non_gui_paint_core.lasty = (stroke_segs[0].y1 - offy);
|
||||||
The subtraction of 0.125 is to compensate for imprecision in
|
|
||||||
paint_core_subsample_mask. Ben Jackson posted a patch on 14 Jan
|
|
||||||
1998 to gimp-developers which addresses the imprecision more
|
|
||||||
directly. However, I've chosen this quick hack instead because it
|
|
||||||
is a less drastic change, and has no impact on performance. By
|
|
||||||
contrast, Ben's patch builds 25 rather than 16 subsampled brush
|
|
||||||
masks.
|
|
||||||
|
|
||||||
I'm planning to rework the subsample mechanism anyway to make way
|
|
||||||
for the natural brushes. When that happens, I'll be sure to make
|
|
||||||
it round precisely, at which point these -0.125 offsets can come
|
|
||||||
out.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
non_gui_paint_core.startx = non_gui_paint_core.lastx = (stroke_segs[0].x1 - offx) - 0.125;
|
|
||||||
non_gui_paint_core.starty = non_gui_paint_core.lasty = (stroke_segs[0].y1 - offy) - 0.125;
|
|
||||||
|
|
||||||
seg = 0;
|
seg = 0;
|
||||||
for (i = 0; i < num_strokes; i++)
|
for (i = 0; i < num_strokes; i++)
|
||||||
{
|
{
|
||||||
while (stroke_segs[seg].x2 != -1)
|
while (stroke_segs[seg].x2 != -1)
|
||||||
{
|
{
|
||||||
non_gui_paint_core.curx = (stroke_segs[seg].x2 - offx - 0.125);
|
non_gui_paint_core.curx = (stroke_segs[seg].x2 - offx);
|
||||||
non_gui_paint_core.cury = (stroke_segs[seg].y2 - offy - 0.125);
|
non_gui_paint_core.cury = (stroke_segs[seg].y2 - offy);
|
||||||
|
|
||||||
paint_core_interpolate (&non_gui_paint_core, drawable);
|
paint_core_interpolate (&non_gui_paint_core, drawable);
|
||||||
|
|
||||||
|
|
|
@ -438,8 +438,8 @@ void hls_to_rgb (int *, int *, int *);
|
||||||
#define SATURATION_MODE 12
|
#define SATURATION_MODE 12
|
||||||
#define COLOR_MODE 13
|
#define COLOR_MODE 13
|
||||||
#define VALUE_MODE 14
|
#define VALUE_MODE 14
|
||||||
#define ERASE_MODE 20
|
#define ERASE_MODE 15
|
||||||
#define REPLACE_MODE 21
|
#define REPLACE_MODE 16
|
||||||
|
|
||||||
/* Applying layer modes... */
|
/* Applying layer modes... */
|
||||||
|
|
||||||
|
|
|
@ -68,10 +68,7 @@ static TempBuf * canvas_buf = NULL;
|
||||||
|
|
||||||
/* brush buffers */
|
/* brush buffers */
|
||||||
static MaskBuf * solid_brush;
|
static MaskBuf * solid_brush;
|
||||||
static MaskBuf * kernel_brushes[4][4] = { {NULL, NULL, NULL, NULL},
|
static MaskBuf * kernel_brushes[5][5];
|
||||||
{NULL, NULL, NULL, NULL},
|
|
||||||
{NULL, NULL, NULL, NULL},
|
|
||||||
{NULL, NULL, NULL, NULL}};
|
|
||||||
|
|
||||||
|
|
||||||
/* paint buffers utility functions */
|
/* paint buffers utility functions */
|
||||||
|
@ -85,32 +82,42 @@ static void free_paint_buffers (void);
|
||||||
#define KERNEL_HEIGHT 3
|
#define KERNEL_HEIGHT 3
|
||||||
|
|
||||||
/* Brush pixel subsampling kernels */
|
/* Brush pixel subsampling kernels */
|
||||||
static int subsample[4][4][9] =
|
static int subsample[5][5][9] = {
|
||||||
{
|
{
|
||||||
{
|
{ 64, 64, 0, 64, 64, 0, 0, 0, 0, },
|
||||||
{ 16, 48, 0, 48, 144, 0, 0, 0, 0 },
|
{ 32, 96, 0, 32, 96, 0, 0, 0, 0, },
|
||||||
{ 0, 64, 0, 0, 192, 0, 0, 0, 0 },
|
{ 0, 128, 0, 0, 128, 0, 0, 0, 0, },
|
||||||
{ 0, 48, 16, 0, 144, 48, 0, 0, 0 },
|
{ 0, 96, 32, 0, 96, 32, 0, 0, 0, },
|
||||||
{ 0, 32, 32, 0, 96, 96, 0, 0, 0 },
|
{ 0, 64, 64, 0, 64, 64, 0, 0, 0, },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 0, 0, 0, 64, 192, 0, 0, 0, 0 },
|
{ 32, 32, 0, 96, 96, 0, 0, 0, 0, },
|
||||||
{ 0, 0, 0, 0, 256, 0, 0, 0, 0 },
|
{ 16, 48, 0, 48, 144, 0, 0, 0, 0, },
|
||||||
{ 0, 0, 0, 0, 192, 64, 0, 0, 0 },
|
{ 0, 64, 0, 0, 192, 0, 0, 0, 0, },
|
||||||
{ 0, 0, 0, 0, 128, 128, 0, 0, 0 },
|
{ 0, 48, 16, 0, 144, 48, 0, 0, 0, },
|
||||||
},
|
{ 0, 32, 32, 0, 96, 96, 0, 0, 0, },
|
||||||
{
|
},
|
||||||
{ 0, 0, 0, 48, 144, 0, 16, 48, 0 },
|
{
|
||||||
{ 0, 0, 0, 0, 192, 0, 0, 64, 0 },
|
{ 0, 0, 0, 128, 128, 0, 0, 0, 0, },
|
||||||
{ 0, 0, 0, 0, 144, 48, 0, 48, 16 },
|
{ 0, 0, 0, 64, 192, 0, 0, 0, 0, },
|
||||||
{ 0, 0, 0, 0, 96, 96, 0, 32, 32 },
|
{ 0, 0, 0, 0, 256, 0, 0, 0, 0, },
|
||||||
},
|
{ 0, 0, 0, 0, 192, 64, 0, 0, 0, },
|
||||||
{
|
{ 0, 0, 0, 0, 128, 128, 0, 0, 0, },
|
||||||
{ 0, 0, 0, 32, 96, 0, 32, 96, 0 },
|
},
|
||||||
{ 0, 0, 0, 0, 128, 0, 0, 128, 0 },
|
{
|
||||||
{ 0, 0, 0, 0, 96, 32, 0, 96, 32 },
|
{ 0, 0, 0, 96, 96, 0, 32, 32, 0, },
|
||||||
{ 0, 0, 0, 0, 64, 64, 0, 64, 64 },
|
{ 0, 0, 0, 48, 144, 0, 16, 48, 0, },
|
||||||
},
|
{ 0, 0, 0, 0, 192, 0, 0, 64, 0, },
|
||||||
|
{ 0, 0, 0, 0, 144, 48, 0, 48, 16, },
|
||||||
|
{ 0, 0, 0, 0, 96, 96, 0, 32, 32, },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ 0, 0, 0, 64, 64, 0, 64, 64, 0, },
|
||||||
|
{ 0, 0, 0, 32, 96, 0, 32, 96, 0, },
|
||||||
|
{ 0, 0, 0, 0, 128, 0, 0, 128, 0, },
|
||||||
|
{ 0, 0, 0, 0, 96, 32, 0, 96, 32, },
|
||||||
|
{ 0, 0, 0, 0, 64, 64, 0, 64, 64, },
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -687,22 +694,20 @@ paint_core_subsample_mask (mask, x, y)
|
||||||
int r, s;
|
int r, s;
|
||||||
|
|
||||||
x += (x < 0) ? mask->width : 0;
|
x += (x < 0) ? mask->width : 0;
|
||||||
left = x - ((int) x);
|
left = x - floor(x) + 0.125;
|
||||||
index1 = (int) (left * 4);
|
index1 = (int) (left * 4);
|
||||||
index1 = (index1 < 0) ? 0 : index1;
|
|
||||||
|
|
||||||
y += (y < 0) ? mask->height : 0;
|
y += (y < 0) ? mask->height : 0;
|
||||||
left = y - ((int) y);
|
left = y - floor(y) + 0.125;
|
||||||
index2 = (int) (left * 4);
|
index2 = (int) (left * 4);
|
||||||
index2 = (index2 < 0) ? 0 : index2;
|
|
||||||
|
|
||||||
kernel = subsample[index2][index1];
|
kernel = subsample[index2][index1];
|
||||||
|
|
||||||
if ((mask == last_brush) && kernel_brushes[index2][index1])
|
if ((mask == last_brush) && kernel_brushes[index2][index1])
|
||||||
return kernel_brushes[index2][index1];
|
return kernel_brushes[index2][index1];
|
||||||
else if (mask != last_brush)
|
else if (mask != last_brush)
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 5; i++)
|
||||||
for (j = 0; j < 4; j++)
|
for (j = 0; j < 5; j++)
|
||||||
{
|
{
|
||||||
if (kernel_brushes[i][j])
|
if (kernel_brushes[i][j])
|
||||||
mask_buf_free (kernel_brushes[i][j]);
|
mask_buf_free (kernel_brushes[i][j]);
|
||||||
|
|
|
@ -438,8 +438,8 @@ void hls_to_rgb (int *, int *, int *);
|
||||||
#define SATURATION_MODE 12
|
#define SATURATION_MODE 12
|
||||||
#define COLOR_MODE 13
|
#define COLOR_MODE 13
|
||||||
#define VALUE_MODE 14
|
#define VALUE_MODE 14
|
||||||
#define ERASE_MODE 20
|
#define ERASE_MODE 15
|
||||||
#define REPLACE_MODE 21
|
#define REPLACE_MODE 16
|
||||||
|
|
||||||
/* Applying layer modes... */
|
/* Applying layer modes... */
|
||||||
|
|
||||||
|
|
|
@ -68,10 +68,7 @@ static TempBuf * canvas_buf = NULL;
|
||||||
|
|
||||||
/* brush buffers */
|
/* brush buffers */
|
||||||
static MaskBuf * solid_brush;
|
static MaskBuf * solid_brush;
|
||||||
static MaskBuf * kernel_brushes[4][4] = { {NULL, NULL, NULL, NULL},
|
static MaskBuf * kernel_brushes[5][5];
|
||||||
{NULL, NULL, NULL, NULL},
|
|
||||||
{NULL, NULL, NULL, NULL},
|
|
||||||
{NULL, NULL, NULL, NULL}};
|
|
||||||
|
|
||||||
|
|
||||||
/* paint buffers utility functions */
|
/* paint buffers utility functions */
|
||||||
|
@ -85,32 +82,42 @@ static void free_paint_buffers (void);
|
||||||
#define KERNEL_HEIGHT 3
|
#define KERNEL_HEIGHT 3
|
||||||
|
|
||||||
/* Brush pixel subsampling kernels */
|
/* Brush pixel subsampling kernels */
|
||||||
static int subsample[4][4][9] =
|
static int subsample[5][5][9] = {
|
||||||
{
|
{
|
||||||
{
|
{ 64, 64, 0, 64, 64, 0, 0, 0, 0, },
|
||||||
{ 16, 48, 0, 48, 144, 0, 0, 0, 0 },
|
{ 32, 96, 0, 32, 96, 0, 0, 0, 0, },
|
||||||
{ 0, 64, 0, 0, 192, 0, 0, 0, 0 },
|
{ 0, 128, 0, 0, 128, 0, 0, 0, 0, },
|
||||||
{ 0, 48, 16, 0, 144, 48, 0, 0, 0 },
|
{ 0, 96, 32, 0, 96, 32, 0, 0, 0, },
|
||||||
{ 0, 32, 32, 0, 96, 96, 0, 0, 0 },
|
{ 0, 64, 64, 0, 64, 64, 0, 0, 0, },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 0, 0, 0, 64, 192, 0, 0, 0, 0 },
|
{ 32, 32, 0, 96, 96, 0, 0, 0, 0, },
|
||||||
{ 0, 0, 0, 0, 256, 0, 0, 0, 0 },
|
{ 16, 48, 0, 48, 144, 0, 0, 0, 0, },
|
||||||
{ 0, 0, 0, 0, 192, 64, 0, 0, 0 },
|
{ 0, 64, 0, 0, 192, 0, 0, 0, 0, },
|
||||||
{ 0, 0, 0, 0, 128, 128, 0, 0, 0 },
|
{ 0, 48, 16, 0, 144, 48, 0, 0, 0, },
|
||||||
},
|
{ 0, 32, 32, 0, 96, 96, 0, 0, 0, },
|
||||||
{
|
},
|
||||||
{ 0, 0, 0, 48, 144, 0, 16, 48, 0 },
|
{
|
||||||
{ 0, 0, 0, 0, 192, 0, 0, 64, 0 },
|
{ 0, 0, 0, 128, 128, 0, 0, 0, 0, },
|
||||||
{ 0, 0, 0, 0, 144, 48, 0, 48, 16 },
|
{ 0, 0, 0, 64, 192, 0, 0, 0, 0, },
|
||||||
{ 0, 0, 0, 0, 96, 96, 0, 32, 32 },
|
{ 0, 0, 0, 0, 256, 0, 0, 0, 0, },
|
||||||
},
|
{ 0, 0, 0, 0, 192, 64, 0, 0, 0, },
|
||||||
{
|
{ 0, 0, 0, 0, 128, 128, 0, 0, 0, },
|
||||||
{ 0, 0, 0, 32, 96, 0, 32, 96, 0 },
|
},
|
||||||
{ 0, 0, 0, 0, 128, 0, 0, 128, 0 },
|
{
|
||||||
{ 0, 0, 0, 0, 96, 32, 0, 96, 32 },
|
{ 0, 0, 0, 96, 96, 0, 32, 32, 0, },
|
||||||
{ 0, 0, 0, 0, 64, 64, 0, 64, 64 },
|
{ 0, 0, 0, 48, 144, 0, 16, 48, 0, },
|
||||||
},
|
{ 0, 0, 0, 0, 192, 0, 0, 64, 0, },
|
||||||
|
{ 0, 0, 0, 0, 144, 48, 0, 48, 16, },
|
||||||
|
{ 0, 0, 0, 0, 96, 96, 0, 32, 32, },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ 0, 0, 0, 64, 64, 0, 64, 64, 0, },
|
||||||
|
{ 0, 0, 0, 32, 96, 0, 32, 96, 0, },
|
||||||
|
{ 0, 0, 0, 0, 128, 0, 0, 128, 0, },
|
||||||
|
{ 0, 0, 0, 0, 96, 32, 0, 96, 32, },
|
||||||
|
{ 0, 0, 0, 0, 64, 64, 0, 64, 64, },
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -687,22 +694,20 @@ paint_core_subsample_mask (mask, x, y)
|
||||||
int r, s;
|
int r, s;
|
||||||
|
|
||||||
x += (x < 0) ? mask->width : 0;
|
x += (x < 0) ? mask->width : 0;
|
||||||
left = x - ((int) x);
|
left = x - floor(x) + 0.125;
|
||||||
index1 = (int) (left * 4);
|
index1 = (int) (left * 4);
|
||||||
index1 = (index1 < 0) ? 0 : index1;
|
|
||||||
|
|
||||||
y += (y < 0) ? mask->height : 0;
|
y += (y < 0) ? mask->height : 0;
|
||||||
left = y - ((int) y);
|
left = y - floor(y) + 0.125;
|
||||||
index2 = (int) (left * 4);
|
index2 = (int) (left * 4);
|
||||||
index2 = (index2 < 0) ? 0 : index2;
|
|
||||||
|
|
||||||
kernel = subsample[index2][index1];
|
kernel = subsample[index2][index1];
|
||||||
|
|
||||||
if ((mask == last_brush) && kernel_brushes[index2][index1])
|
if ((mask == last_brush) && kernel_brushes[index2][index1])
|
||||||
return kernel_brushes[index2][index1];
|
return kernel_brushes[index2][index1];
|
||||||
else if (mask != last_brush)
|
else if (mask != last_brush)
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 5; i++)
|
||||||
for (j = 0; j < 4; j++)
|
for (j = 0; j < 5; j++)
|
||||||
{
|
{
|
||||||
if (kernel_brushes[i][j])
|
if (kernel_brushes[i][j])
|
||||||
mask_buf_free (kernel_brushes[i][j]);
|
mask_buf_free (kernel_brushes[i][j]);
|
||||||
|
|
Loading…
Reference in New Issue