201
213
g_return_if_fail (GIMP_IS_CONTEXT (context));
202
214
g_return_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress));
204
gimage = gimp_item_get_image (GIMP_ITEM (drawable));
216
image = gimp_item_get_image (GIMP_ITEM (drawable));
206
218
if (! gimp_drawable_mask_intersect (drawable, &x, &y, &width, &height))
209
gimp_set_busy (gimage->gimp);
211
bytes = gimp_drawable_bytes (drawable);
221
gimp_set_busy (image->gimp);
213
223
/* Always create an alpha temp buf (for generality) */
214
if (! gimp_drawable_has_alpha (drawable))
224
bytes = gimp_drawable_bytes_with_alpha (drawable);
219
226
buf_tiles = tile_manager_new (width, height, bytes);
220
227
pixel_region_init (&bufPR, buf_tiles, 0, 0, width, height, TRUE);
222
gradient_fill_region (gimage, drawable, context,
223
&bufPR, width, height,
224
blend_mode, gradient_type, offset, repeat, reverse,
225
supersample, max_depth, threshold, dither,
226
(startx - x), (starty - y),
227
(endx - x), (endy - y),
229
gradient_fill_region (image, drawable, context,
230
&bufPR, width, height,
231
blend_mode, gradient_type, offset, repeat, reverse,
232
supersample, max_depth, threshold, dither,
233
(startx - x), (starty - y),
234
(endx - x), (endy - y),
285
292
rat = acos (rat) / G_PI;
286
293
rat = pow (rat, (offset / 10.0) + 1.0);
288
rat = CLAMP (rat, 0.0, 1.0);
295
return CLAMP (rat, 0.0, 1.0);
299
304
gradient_calc_conical_asym_factor (gdouble dist,
314
else if (x != 0 || y != 0)
320
ang0 = atan2 (axis[0], axis[1]) + G_PI;
322
ang1 = atan2 (x, y) + G_PI;
329
rat = ang / (2.0 * G_PI);
330
rat = pow (rat, (offset / 10.0) + 1.0);
332
return CLAMP (rat, 0.0, 1.0);
315
if ((x != 0) || (y != 0))
317
ang0 = atan2 (axis[0], axis[1]) + G_PI;
318
ang1 = atan2 (x, y) + G_PI;
325
rat = ang / (2.0 * G_PI);
326
rat = pow (rat, (offset / 10.0) + 1.0);
328
rat = CLAMP (rat, 0.0, 1.0);
332
rat = 0.5; /* We are on middle point */
336
return 0.5; /* We are on middle point */
340
341
gradient_calc_square_factor (gdouble dist,
354
355
/* Calculate offset from start as a value in [0, 1] */
356
357
offset = offset / 100.0;
462
457
if (fabs (rat) < offset)
464
459
else if (offset == 1.0)
465
rat = (rat == 1.0) ? 1.0 : 0.0;
460
return (rat == 1.0) ? 1.0 : 0.0;
467
rat = (fabs (rat) - offset) / (1.0 - offset);
462
return (fabs (rat) - offset) / (1.0 - offset);
474
467
gradient_calc_spiral_factor (gdouble dist,
478
else if (x != 0.0 || y != 0.0)
484
ang0 = atan2 (axis[0], axis[1]) + G_PI;
485
ang1 = atan2 (x, y) + G_PI;
495
r = sqrt (SQR (x) + SQR (y)) / dist;
497
return fmod (ang / (2.0 * G_PI) + r + offset, 1.0);
491
if (x != 0.0 || y != 0.0)
493
ang0 = atan2 (axis[0], axis[1]) + G_PI;
494
ang1 = atan2 (x, y) + G_PI;
504
r = sqrt (x * x + y * y) / dist;
505
rat = ang / (2.0 * G_PI) + r + offset;
506
rat = fmod (rat, 1.0);
509
rat = 0.5 ; /* We are on the middle point */
501
return 0.5 ; /* We are on the middle point */
516
506
gradient_calc_shapeburst_angular_factor (gdouble x,
511
gint ix = CLAMP (x, 0.0, distR.w - 0.7);
512
gint iy = CLAMP (y, 0.0, distR.h - 0.7);
523
ix = (gint) CLAMP (x, 0.0, distR.w - 0.7);
524
iy = (gint) CLAMP (y, 0.0, distR.h - 0.7);
525
514
tile = tile_manager_get_tile (distR.tiles, ix, iy, TRUE, FALSE);
526
516
value = 1.0 - *((gfloat *) tile_data_pointer (tile,
528
518
iy % TILE_HEIGHT));
529
520
tile_release (tile, FALSE);
607
600
gimp_drawable_mask_bounds (drawable, &x1, &y1, &x2, &y2);
608
601
gimp_item_offsets (GIMP_ITEM (drawable), &offx, &offy);
610
pixel_region_init (&maskR, gimp_drawable_data (GIMP_DRAWABLE (mask)),
611
x1 + offx, y1 + offy, (x2 - x1), (y2 - y1), FALSE);
603
pixel_region_init (&maskR, gimp_drawable_get_tiles (GIMP_DRAWABLE (mask)),
604
x1 + offx, y1 + offy, (x2 - x1), (y2 - y1), FALSE);
613
606
/* copy the mask to the temp mask */
614
607
copy_region (&maskR, &tempR);
619
611
/* If the intended drawable has an alpha channel, use that */
620
612
if (gimp_drawable_has_alpha (drawable))
622
PixelRegion drawableR;
624
pixel_region_init (&drawableR, gimp_drawable_data (drawable),
625
PR->x, PR->y, PR->w, PR->h, FALSE);
627
extract_alpha_region (&drawableR, NULL, &tempR);
614
PixelRegion drawableR;
616
pixel_region_init (&drawableR, gimp_drawable_get_tiles (drawable),
617
PR->x, PR->y, PR->w, PR->h, FALSE);
619
extract_alpha_region (&drawableR, NULL, &tempR);
631
/* Otherwise, just fill the shapeburst to white */
632
color_region (&tempR, white);
623
/* Otherwise, just fill the shapeburst to white */
624
color_region (&tempR, white);
636
628
pixel_region_init (&tempR, tempR.tiles, 0, 0, PR->w, PR->h, TRUE);
677
669
switch (rbd->gradient_type)
679
671
case GIMP_GRADIENT_LINEAR:
680
factor = gradient_calc_linear_factor (rbd->dist, rbd->vec, rbd->offset,
681
x - rbd->sx, y - rbd->sy);
672
factor = gradient_calc_linear_factor (rbd->dist,
673
rbd->vec, rbd->offset,
674
x - rbd->sx, y - rbd->sy);
684
677
case GIMP_GRADIENT_BILINEAR:
685
factor = gradient_calc_bilinear_factor (rbd->dist, rbd->vec, rbd->offset,
686
x - rbd->sx, y - rbd->sy);
678
factor = gradient_calc_bilinear_factor (rbd->dist,
679
rbd->vec, rbd->offset,
680
x - rbd->sx, y - rbd->sy);
689
683
case GIMP_GRADIENT_RADIAL:
690
factor = gradient_calc_radial_factor (rbd->dist, rbd->offset,
691
x - rbd->sx, y - rbd->sy);
684
factor = gradient_calc_radial_factor (rbd->dist,
686
x - rbd->sx, y - rbd->sy);
694
689
case GIMP_GRADIENT_SQUARE:
695
690
factor = gradient_calc_square_factor (rbd->dist, rbd->offset,
696
x - rbd->sx, y - rbd->sy);
691
x - rbd->sx, y - rbd->sy);
699
694
case GIMP_GRADIENT_CONICAL_SYMMETRIC:
700
factor = gradient_calc_conical_sym_factor (rbd->dist, rbd->vec, rbd->offset,
701
x - rbd->sx, y - rbd->sy);
695
factor = gradient_calc_conical_sym_factor (rbd->dist,
696
rbd->vec, rbd->offset,
697
x - rbd->sx, y - rbd->sy);
704
700
case GIMP_GRADIENT_CONICAL_ASYMMETRIC:
705
factor = gradient_calc_conical_asym_factor (rbd->dist, rbd->vec, rbd->offset,
706
x - rbd->sx, y - rbd->sy);
701
factor = gradient_calc_conical_asym_factor (rbd->dist,
702
rbd->vec, rbd->offset,
703
x - rbd->sx, y - rbd->sy);
709
706
case GIMP_GRADIENT_SHAPEBURST_ANGULAR:
792
792
gradient_put_pixel (gint x,
795
gpointer put_pixel_data)
795
gpointer put_pixel_data)
797
PutPixelData *ppd = put_pixel_data;
802
data = ppd->row_data + ppd->bytes * x;
797
PutPixelData *ppd = put_pixel_data;
798
guchar *dest = ppd->row_data + ppd->bytes * x;
804
800
if (ppd->bytes >= 3)
812
ftmp = color->r * 255.0;
814
dither_prob = ftmp - itmp;
816
if (g_rand_double (ppd->dither_rand) < dither_prob)
817
color->r += (1.0 / 255.0);
819
ftmp = color->g * 255.0;
821
dither_prob = ftmp - itmp;
823
if (g_rand_double (ppd->dither_rand) < dither_prob)
824
color->g += (1.0 / 255.0);
826
ftmp = color->b * 255.0;
828
dither_prob = ftmp - itmp;
830
if (g_rand_double (ppd->dither_rand) < dither_prob)
831
color->b += (1.0 / 255.0);
833
ftmp = color->a * 255.0;
835
dither_prob = ftmp - itmp;
837
if (g_rand_double (ppd->dither_rand) < dither_prob)
838
color->a += (1.0 / 255.0);
840
if (color->r > 1.0) color->r = 1.0;
841
if (color->g > 1.0) color->g = 1.0;
842
if (color->b > 1.0) color->b = 1.0;
843
if (color->a > 1.0) color->a = 1.0;
846
*data++ = color->r * 255.0;
847
*data++ = color->g * 255.0;
848
*data++ = color->b * 255.0;
849
*data++ = color->a * 255.0;
802
if (ppd->dither_rand)
804
gint i = g_rand_int (ppd->dither_rand);
806
*dest++ = color->r * 255.0 + (gdouble) (i & 0xff) / 256.0; i >>= 8;
807
*dest++ = color->g * 255.0 + (gdouble) (i & 0xff) / 256.0; i >>= 8;
808
*dest++ = color->b * 255.0 + (gdouble) (i & 0xff) / 256.0; i >>= 8;
809
*dest++ = color->a * 255.0 + (gdouble) (i & 0xff) / 256.0;
813
*dest++ = ROUND (color->r * 255.0);
814
*dest++ = ROUND (color->g * 255.0);
815
*dest++ = ROUND (color->b * 255.0);
816
*dest++ = ROUND (color->a * 255.0);
853
821
/* Convert to grayscale */
854
gdouble gray = gimp_rgb_intensity (color);
864
dither_prob = ftmp - itmp;
866
if (g_rand_double (ppd->dither_rand) < dither_prob)
867
gray += (1.0 / 255.0);
869
ftmp = color->a * 255.0;
871
dither_prob = ftmp - itmp;
873
if (g_rand_double (ppd->dither_rand) < dither_prob)
874
color->a += (1.0 / 255.0);
876
if (gray > 1.0) gray = 1.0;
877
if (color->a > 1.0) color->a = 1.0;
880
*data++ = gray * 255.0;
881
*data++ = color->a * 255.0;
822
gdouble gray = gimp_rgb_luminance (color);
824
if (ppd->dither_rand)
826
gint i = g_rand_int (ppd->dither_rand);
828
*dest++ = gray * 255.0 + (gdouble) (i & 0xff) / 256.0; i >>= 8;
829
*dest++ = color->a * 255.0 + (gdouble) (i & 0xff) / 256.0;
833
*dest++ = ROUND (gray * 255.0);
834
*dest++ = ROUND (color->a * 255.0);
884
838
/* Paint whole row if we are on the rightmost pixel */
1019
970
ppd.row_data = g_malloc (width * PR->bytes);
1020
971
ppd.bytes = PR->bytes;
1021
972
ppd.width = width;
1022
ppd.dither = dither;
1023
ppd.dither_rand = dither_rand;
973
ppd.dither_rand = g_rand_new ();
1025
975
gimp_adaptive_supersample_area (0, 0, (width - 1), (height - 1),
1026
max_depth, threshold,
1027
gradient_render_pixel, &rbd,
1028
gradient_put_pixel, &ppd,
976
max_depth, threshold,
977
gradient_render_pixel, &rbd,
978
gradient_put_pixel, &ppd,
1030
980
gimp_progress_update_and_flush : NULL,
983
g_rand_free (ppd.dither_rand);
1033
984
g_free (ppd.row_data);
1037
gint max_progress = PR->w * PR->h;
1038
gint curr_progress = 0;
1040
for (pr = pixel_regions_register (1, PR);
1042
pr = pixel_regions_process (pr))
1045
endx = PR->x + PR->w;
1046
endy = PR->y + PR->h;
1048
for (y = PR->y; y < endy; y++)
1050
for (x = PR->x; x < endx; x++)
1052
gradient_render_pixel (x, y, &color, &rbd);
1058
gdouble dither_prob;
1062
ftmp = color.r * 255.0;
1064
dither_prob = ftmp - itmp;
1066
if (g_rand_double (dither_rand) < dither_prob)
1067
color.r += (1.0 / 255.0);
1069
ftmp = color.g * 255.0;
1071
dither_prob = ftmp - itmp;
1073
if (g_rand_double (dither_rand) < dither_prob)
1074
color.g += (1.0 / 255.0);
1076
ftmp = color.b * 255.0;
1078
dither_prob = ftmp - itmp;
1080
if (g_rand_double (dither_rand) < dither_prob)
1081
color.b += (1.0 / 255.0);
1083
ftmp = color.a * 255.0;
1085
dither_prob = ftmp - itmp;
1087
if (g_rand_double (dither_rand) < dither_prob)
1088
color.a += (1.0 / 255.0);
1090
if (color.r > 1.0) color.r = 1.0;
1091
if (color.g > 1.0) color.g = 1.0;
1092
if (color.b > 1.0) color.b = 1.0;
1093
if (color.a > 1.0) color.a = 1.0;
1096
*data++ = color.r * 255.0;
1097
*data++ = color.g * 255.0;
1098
*data++ = color.b * 255.0;
1099
*data++ = color.a * 255.0;
1103
/* Convert to grayscale */
1104
gdouble gray = gimp_rgb_intensity (&color);
1108
gdouble dither_prob;
1112
ftmp = gray * 255.0;
1114
dither_prob = ftmp - itmp;
1116
if (g_rand_double (dither_rand) < dither_prob)
1117
gray += (1.0 / 255.0);
1119
ftmp = color.a * 255.0;
1121
dither_prob = ftmp - itmp;
1123
if (g_rand_double (dither_rand) < dither_prob)
1124
color.a += (1.0 / 255.0);
1126
if (gray > 1.0) gray = 1.0;
1127
if (color.a > 1.0) color.a = 1.0;
1130
*data++ = gray * 255.0;
1131
*data++ = color.a * 255.0;
1138
curr_progress += PR->w * PR->h;
1140
gimp_progress_set_value (progress,
1141
(gdouble) curr_progress /
1142
(gdouble) max_progress);
988
PixelProcessorFunc func;
989
PixelProcessorProgressFunc progress_func = NULL;
993
rbd.seed = g_rand_new ();
996
func = (PixelProcessorFunc) gradient_fill_single_region_rgb_dither;
998
func = (PixelProcessorFunc) gradient_fill_single_region_gray_dither;
1003
func = (PixelProcessorFunc) gradient_fill_single_region_rgb;
1005
func = (PixelProcessorFunc) gradient_fill_single_region_gray;
1009
progress_func = (PixelProcessorProgressFunc) gimp_progress_set_value;
1011
pixel_regions_process_parallel_progress (func, &rbd,
1012
progress_func, progress,
1016
g_rand_free (rbd.seed);
1148
g_rand_free (dither_rand);
1019
g_object_unref (rbd.gradient);
1023
gradient_fill_single_region_rgb (RenderBlendData *rbd,
1026
guchar *dest = PR->data;
1027
gint endx = PR->x + PR->w;
1028
gint endy = PR->y + PR->h;
1031
for (y = PR->y; y < endy; y++)
1032
for (x = PR->x; x < endx; x++)
1036
gradient_render_pixel (x, y, &color, rbd);
1038
*dest++ = ROUND (color.r * 255.0);
1039
*dest++ = ROUND (color.g * 255.0);
1040
*dest++ = ROUND (color.b * 255.0);
1041
*dest++ = ROUND (color.a * 255.0);
1046
gradient_fill_single_region_rgb_dither (RenderBlendData *rbd,
1049
GRand *dither_rand = g_rand_new_with_seed (g_rand_int (rbd->seed));
1050
guchar *dest = PR->data;
1051
gint endx = PR->x + PR->w;
1052
gint endy = PR->y + PR->h;
1055
for (y = PR->y; y < endy; y++)
1056
for (x = PR->x; x < endx; x++)
1059
gint i = g_rand_int (dither_rand);
1061
gradient_render_pixel (x, y, &color, rbd);
1063
*dest++ = color.r * 255.0 + (gdouble) (i & 0xff) / 256.0; i >>= 8;
1064
*dest++ = color.g * 255.0 + (gdouble) (i & 0xff) / 256.0; i >>= 8;
1065
*dest++ = color.b * 255.0 + (gdouble) (i & 0xff) / 256.0; i >>= 8;
1066
*dest++ = color.a * 255.0 + (gdouble) (i & 0xff) / 256.0;
1069
g_rand_free (dither_rand);
1073
gradient_fill_single_region_gray (RenderBlendData *rbd,
1076
guchar *dest = PR->data;
1077
gint endx = PR->x + PR->w;
1078
gint endy = PR->y + PR->h;
1081
for (y = PR->y; y < endy; y++)
1082
for (x = PR->x; x < endx; x++)
1086
gradient_render_pixel (x, y, &color, rbd);
1088
*dest++ = gimp_rgb_luminance_uchar (&color);
1089
*dest++ = ROUND (color.a * 255.0);
1094
gradient_fill_single_region_gray_dither (RenderBlendData *rbd,
1097
GRand *dither_rand = g_rand_new_with_seed (g_rand_int (rbd->seed));
1098
guchar *dest = PR->data;
1099
gint endx = PR->x + PR->w;
1100
gint endy = PR->y + PR->h;
1103
for (y = PR->y; y < endy; y++)
1104
for (x = PR->x; x < endx; x++)
1108
gint i = g_rand_int (dither_rand);
1110
gradient_render_pixel (x, y, &color, rbd);
1112
gray = gimp_rgb_luminance (&color);
1114
*dest++ = gray * 255.0 + (gdouble) (i & 0xff) / 256.0; i >>= 8;
1115
*dest++ = color.a * 255.0 + (gdouble) (i & 0xff) / 256.0;
1118
g_rand_free (dither_rand);