plug-ins: port sphere-designer to GEGL, stupid 8-bit port only

This commit is contained in:
Michael Natterer
2019-07-11 10:39:13 +02:00
parent a6ad02a60a
commit 0188853b23
3 changed files with 68 additions and 53 deletions

View File

@ -1709,6 +1709,7 @@ sphere_designer_LDADD = \
$(libgimpcolor) \ $(libgimpcolor) \
$(libgimpbase) \ $(libgimpbase) \
$(GTK_LIBS) \ $(GTK_LIBS) \
$(GEGL_LIBS) \
$(RT_LIBS) \ $(RT_LIBS) \
$(INTLLIBS) \ $(INTLLIBS) \
$(sphere_designer_RC) $(sphere_designer_RC)

View File

@ -81,7 +81,7 @@
'smooth-palette' => { ui => 1, gegl => 1 }, 'smooth-palette' => { ui => 1, gegl => 1 },
'softglow' => { ui => 1 }, 'softglow' => { ui => 1 },
'sparkle' => { ui => 1 }, 'sparkle' => { ui => 1 },
'sphere-designer' => { ui => 1 }, 'sphere-designer' => { ui => 1, gegl => 1 },
'tile' => { ui => 1, gegl => 1 }, 'tile' => { ui => 1, gegl => 1 },
'tile-small' => { ui => 1, gegl => 1 }, 'tile-small' => { ui => 1, gegl => 1 },
'unit-editor' => { ui => 1 }, 'unit-editor' => { ui => 1 },

View File

@ -310,7 +310,7 @@ static void restartrender (void);
static void drawcolor1 (GtkWidget *widget); static void drawcolor1 (GtkWidget *widget);
static void drawcolor2 (GtkWidget *widget); static void drawcolor2 (GtkWidget *widget);
static gboolean render (void); static gboolean render (void);
static void realrender (GimpDrawable *drawable); static void realrender (gint32 drawable_ID);
static void fileselect (GtkFileChooserAction action, static void fileselect (GtkFileChooserAction action,
GtkWidget *parent); GtkWidget *parent);
static gint traceray (ray *r, static gint traceray (ray *r,
@ -2936,8 +2936,11 @@ render (void)
} }
static void static void
realrender (GimpDrawable *drawable) realrender (gint32 drawable_ID)
{ {
GeglBuffer *src_buffer;
GeglBuffer *dest_buffer;
const Babl *format;
gint x, y; gint x, y;
ray r; ray r;
GimpVector4 rcol; GimpVector4 rcol;
@ -2945,7 +2948,6 @@ realrender (GimpDrawable *drawable)
gint x1, y1; gint x1, y1;
guchar *dest; guchar *dest;
gint bpp; gint bpp;
GimpPixelRgn pr, dpr;
guchar *buffer, *ibuffer; guchar *buffer, *ibuffer;
initworld (); initworld ();
@ -2953,19 +2955,30 @@ realrender (GimpDrawable *drawable)
r.v1.z = -10.0; r.v1.z = -10.0;
r.v2.z = 0.0; r.v2.z = 0.0;
if (! gimp_drawable_mask_intersect (drawable->drawable_id, if (! gimp_drawable_mask_intersect (drawable_ID,
&x1, &y1, &width, &height)) &x1, &y1, &width, &height))
return; return;
gimp_pixel_rgn_init (&pr, drawable, 0, 0, src_buffer = gimp_drawable_get_buffer (drawable_ID);
gimp_drawable_width (drawable->drawable_id), dest_buffer = gimp_drawable_get_shadow_buffer (drawable_ID);
gimp_drawable_height (drawable->drawable_id), FALSE,
FALSE); if (gimp_drawable_is_rgb (drawable_ID))
gimp_pixel_rgn_init (&dpr, drawable, 0, 0, {
gimp_drawable_width (drawable->drawable_id), if (gimp_drawable_has_alpha (drawable_ID))
gimp_drawable_height (drawable->drawable_id), TRUE, format = babl_format ("R'G'B'A u8");
TRUE); else
bpp = gimp_drawable_bpp (drawable->drawable_id); format = babl_format ("R'G'B' u8");
}
else
{
if (gimp_drawable_has_alpha (drawable_ID))
format = babl_format ("Y'A u8");
else
format = babl_format ("Y' u8");
}
bpp = babl_format_get_bytes_per_pixel (format);
buffer = g_malloc (width * 4); buffer = g_malloc (width * 4);
ibuffer = g_malloc (width * 4); ibuffer = g_malloc (width * 4);
@ -2986,7 +2999,11 @@ realrender (GimpDrawable *drawable)
dest[3] = pixelval (255 * rcol.w); dest[3] = pixelval (255 * rcol.w);
dest += 4; dest += 4;
} }
gimp_pixel_rgn_get_row (&pr, ibuffer, x1, y1 + y, width);
gegl_buffer_get (src_buffer, GEGL_RECTANGLE (x1, y1 + y, width, 1), 1.0,
format, ibuffer,
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
for (x = 0; x < width; x++) for (x = 0; x < width; x++)
{ {
gint k, dx = x * 4, sx = x * bpp; gint k, dx = x * 4, sx = x * bpp;
@ -2998,15 +3015,23 @@ realrender (GimpDrawable *drawable)
buffer[dx + k] * a + ibuffer[sx + k] * (1.0 - a); buffer[dx + k] * a + ibuffer[sx + k] * (1.0 - a);
} }
} }
gimp_pixel_rgn_set_row (&dpr, ibuffer, x1, y1 + y, width);
gegl_buffer_set (dest_buffer, GEGL_RECTANGLE (x1, y1 + y, width, 1), 0,
format, ibuffer,
GEGL_AUTO_ROWSTRIDE);
gimp_progress_update ((gdouble) y / (gdouble) height); gimp_progress_update ((gdouble) y / (gdouble) height);
} }
gimp_progress_update (1.0); gimp_progress_update (1.0);
g_free (buffer); g_free (buffer);
g_free (ibuffer); g_free (ibuffer);
gimp_drawable_flush (drawable);
gimp_drawable_merge_shadow (drawable->drawable_id, TRUE); g_object_unref (src_buffer);
gimp_drawable_update (drawable->drawable_id, x1, y1, width, height); g_object_unref (dest_buffer);
gimp_drawable_merge_shadow (drawable_ID, TRUE);
gimp_drawable_update (drawable_ID, x1, y1, width, height);
} }
static void static void
@ -3037,7 +3062,7 @@ query (void)
} }
static gboolean static gboolean
sphere_main (GimpDrawable *drawable) sphere_main (gint32 drawable_ID)
{ {
gimp_ui_init (PLUG_IN_BINARY, TRUE); gimp_ui_init (PLUG_IN_BINARY, TRUE);
@ -3078,14 +3103,13 @@ run (const gchar *name,
GimpParam **return_vals) GimpParam **return_vals)
{ {
static GimpParam values[1]; static GimpParam values[1];
GimpDrawable *drawable;
GimpRunMode run_mode; GimpRunMode run_mode;
gint32 drawable_ID;
GimpPDBStatusType status = GIMP_PDB_SUCCESS; GimpPDBStatusType status = GIMP_PDB_SUCCESS;
gint x, y, w, h; gint x, y, w, h;
run_mode = param[0].data.d_int32;
INIT_I18N (); INIT_I18N ();
gegl_init (NULL, NULL);
*nreturn_vals = 1; *nreturn_vals = 1;
*return_vals = values; *return_vals = values;
@ -3093,9 +3117,10 @@ run (const gchar *name,
values[0].type = GIMP_PDB_STATUS; values[0].type = GIMP_PDB_STATUS;
values[0].data.d_status = status; values[0].data.d_status = status;
drawable = gimp_drawable_get (param[2].data.d_drawable); run_mode = param[0].data.d_int32;
drawable_ID = param[2].data.d_drawable;
if (! gimp_drawable_mask_intersect (drawable->drawable_id, &x, &y, &w, &h)) if (! gimp_drawable_mask_intersect (drawable_ID, &x, &y, &w, &h))
{ {
g_message (_("Region selected for plug-in is empty")); g_message (_("Region selected for plug-in is empty"));
return; return;
@ -3106,40 +3131,29 @@ run (const gchar *name,
case GIMP_RUN_INTERACTIVE: case GIMP_RUN_INTERACTIVE:
s.com.numtexture = 0; s.com.numtexture = 0;
gimp_get_data (PLUG_IN_PROC, &s); gimp_get_data (PLUG_IN_PROC, &s);
if (!sphere_main (drawable)) if (! sphere_main (drawable_ID))
{
gimp_drawable_detach (drawable);
return; return;
}
break; break;
case GIMP_RUN_WITH_LAST_VALS: case GIMP_RUN_WITH_LAST_VALS:
s.com.numtexture = 0; s.com.numtexture = 0;
gimp_get_data (PLUG_IN_PROC, &s); gimp_get_data (PLUG_IN_PROC, &s);
if (s.com.numtexture == 0) if (s.com.numtexture == 0)
{
gimp_drawable_detach (drawable);
return; return;
}
break; break;
case GIMP_RUN_NONINTERACTIVE: case GIMP_RUN_NONINTERACTIVE:
default: default:
/* Not implemented yet... */ /* Not implemented yet... */
gimp_drawable_detach (drawable);
return; return;
} }
gimp_set_data (PLUG_IN_PROC, &s, sizeof (s)); gimp_set_data (PLUG_IN_PROC, &s, sizeof (s));
realrender (drawable); realrender (drawable_ID);
gimp_displays_flush (); gimp_displays_flush ();
*nreturn_vals = 1;
*return_vals = values;
values[0].type = GIMP_PDB_STATUS;
values[0].data.d_status = status; values[0].data.d_status = status;
gimp_drawable_detach (drawable);
} }
MAIN () MAIN ()