Re-write some parts of the algorithm. This should fix #82464, #71922 and #121966.

This commit is contained in:
David Odin 2004-01-15 21:08:21 +00:00
parent cc2534b167
commit 15234e8923
2 changed files with 60 additions and 56 deletions

View File

@ -1,3 +1,8 @@
2004-01-15 DindinX <david@dindinx.org>
* plug-ins/common/nova.c: Re-write some parts of the algorithm.
This should fix #82464, #71922 and #121966.
2004-01-15 Manish Singh <yosh@gimp.org> 2004-01-15 Manish Singh <yosh@gimp.org>
* app/text/gimpfontlist.c: Set PangoStretch from FC_WIDTH. This * app/text/gimpfontlist.c: Set PangoStretch from FC_WIDTH. This

View File

@ -711,13 +711,13 @@ nova_center_preview_events (GtkWidget *widget,
static gdouble static gdouble
gauss (GRand *gr) gauss (GRand *gr)
{ {
gdouble sum = 0; gdouble sum = 0.0;
gint i; gint i;
for (i = 0; i < 6; i++) for (i = 0; i < 6; i++)
sum += (gdouble) g_rand_double (gr); sum += (gdouble) g_rand_double (gr);
return sum / 6; return sum / 6.0;
} }
static void static void
@ -727,30 +727,23 @@ nova (GimpDrawable *drawable,
GimpPixelRgn src_rgn; GimpPixelRgn src_rgn;
GimpPixelRgn dest_rgn; GimpPixelRgn dest_rgn;
gpointer pr; gpointer pr;
guchar *src_row, *dest_row; guchar *src_row, *dest_row, *save_src;
guchar *src, *dest; guchar *src, *dest;
gint x1, y1, x2, y2; gint x1, y1, x2, y2, x, y;
gint row, col; gint row, col;
gint x, y;
gint alpha, bpp; gint alpha, bpp;
gint progress, max_progress; gint progress, max_progress;
gboolean has_alpha; gboolean has_alpha;
gint xc, yc; /* center of nova */ gint xc, yc; /* center of nova */
gdouble u, v; gdouble u, v, l, w, w1, c;
gdouble l;
gdouble w, w1, c;
gdouble *spoke; gdouble *spoke;
gdouble nova_alpha; gdouble nova_alpha, src_alpha, new_alpha = 0.0;
gdouble src_alpha; gdouble compl_ratio, ratio;
gdouble new_alpha;
gdouble compl_ratio;
gdouble ratio;
GimpRGB color; GimpRGB color;
GimpRGB src_color;
GimpRGB *spokecolor; GimpRGB *spokecolor;
GimpHSV hsv; GimpHSV hsv;
gdouble spokecol; gdouble spokecol;
gint i, j; gint i;
GRand *gr; GRand *gr;
gr = g_rand_new (); gr = g_rand_new ();
@ -787,14 +780,11 @@ nova (GimpDrawable *drawable,
x2 = preview->width; x2 = preview->width;
y2 = preview->height; y2 = preview->height;
bpp = preview->bpp; bpp = preview->bpp;
has_alpha = FALSE;
alpha = bpp;
} }
else else
{ {
gimp_drawable_mask_bounds (drawable->drawable_id, &x1, &y1, &x2, &y2); gimp_drawable_mask_bounds (drawable->drawable_id, &x1, &y1, &x2, &y2);
bpp = gimp_drawable_bpp (drawable->drawable_id); bpp = gimp_drawable_bpp (drawable->drawable_id);
alpha = (has_alpha) ? bpp - 1 : bpp;
xc = pvals.xcenter; xc = pvals.xcenter;
yc = pvals.ycenter; yc = pvals.ycenter;
@ -803,6 +793,7 @@ nova (GimpDrawable *drawable,
gimp_pixel_rgn_init (&dest_rgn, drawable, gimp_pixel_rgn_init (&dest_rgn, drawable,
x1, y1, x2-x1, y2-y1, TRUE, TRUE); x1, y1, x2-x1, y2-y1, TRUE, TRUE);
} }
alpha = (has_alpha) ? bpp - 1 : bpp;
/* Initialize progress */ /* Initialize progress */
progress = 0; progress = 0;
@ -810,10 +801,10 @@ nova (GimpDrawable *drawable,
if (preview_mode) if (preview_mode)
{ {
src_row = g_malloc (y2 * preview->rowstride); save_src = src_row = g_new (guchar, y2 * preview->rowstride);
memcpy (src_row, preview->cache, y2 * preview->rowstride); memcpy (src_row, preview->cache, y2 * preview->rowstride);
dest_row = g_malloc (preview->rowstride); dest_row = g_new (guchar, preview->rowstride);
for (row = 0, y = 0; row < y2; row++, y++) for (row = 0, y = 0; row < y2; row++, y++)
{ {
@ -851,7 +842,8 @@ nova (GimpDrawable *drawable,
ratio = nova_alpha; ratio = nova_alpha;
compl_ratio = 1.0 - ratio; compl_ratio = 1.0 - ratio;
/* red */
/* red or gray */
spokecol = (gdouble)spokecolor[i ].r * (1.0-c) + spokecol = (gdouble)spokecolor[i ].r * (1.0-c) +
(gdouble)spokecolor[(i+1) % pvals.nspoke].r * c; (gdouble)spokecolor[(i+1) % pvals.nspoke].r * c;
@ -863,6 +855,8 @@ nova (GimpDrawable *drawable,
color.r += c; color.r += c;
dest[0] = CLAMP (color.r*255.0, 0, 255); dest[0] = CLAMP (color.r*255.0, 0, 255);
if (bpp>2)
{
/* green */ /* green */
spokecol = (gdouble)spokecolor[i ].g * (1.0-c) + spokecol = (gdouble)spokecolor[i ].g * (1.0-c) +
(gdouble)spokecolor[(i+1) % pvals.nspoke].g * c; (gdouble)spokecolor[(i+1) % pvals.nspoke].g * c;
@ -886,6 +880,7 @@ nova (GimpDrawable *drawable,
c = CLAMP (w1 * w, 0.0, 1.0); c = CLAMP (w1 * w, 0.0, 1.0);
color.b += c; color.b += c;
dest[2] = CLAMP (color.b*255.0, 0, 255); dest[2] = CLAMP (color.b*255.0, 0, 255);
}
/* alpha */ /* alpha */
if (has_alpha) if (has_alpha)
@ -901,11 +896,14 @@ nova (GimpDrawable *drawable,
} }
gtk_widget_queue_draw (preview->widget); gtk_widget_queue_draw (preview->widget);
g_free (save_src);
g_free (dest_row);
} }
else else
{ /* normal mode */ { /* normal mode */
for (pr = gimp_pixel_rgns_register (2, &src_rgn, &dest_rgn); for (pr = gimp_pixel_rgns_register (2, &src_rgn, &dest_rgn);
pr != NULL; pr = gimp_pixel_rgns_process (pr)) pr != NULL ;
pr = gimp_pixel_rgns_process (pr))
{ {
src_row = src_rgn.data; src_row = src_rgn.data;
dest_row = dest_rgn.data; dest_row = dest_rgn.data;
@ -983,7 +981,7 @@ nova (GimpDrawable *drawable,
else else
color.g = src[1]/255.0 * compl_ratio + spokecol * ratio; color.g = src[1]/255.0 * compl_ratio + spokecol * ratio;
c = CLAMP (w1 * w, 0.0, 1.0); c = CLAMP (w1 * w, 0.0, 1.0);
color.r += c; color.g += c;
dest[1] = CLAMP (color.g*255.0, 0, 255); dest[1] = CLAMP (color.g*255.0, 0, 255);
/* blue */ /* blue */
spokecol = (gdouble)spokecolor[i ].b * (1.0-c) + spokecol = (gdouble)spokecolor[i ].b * (1.0-c) +
@ -1021,4 +1019,5 @@ nova (GimpDrawable *drawable,
g_free (spoke); g_free (spoke);
g_free (spokecolor); g_free (spokecolor);
g_rand_free (gr);
} }