plug-ins: port sphere-designer to GEGL, stupid 8-bit port only
This commit is contained in:
@ -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)
|
||||||
|
@ -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 },
|
||||||
|
@ -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,37 +2936,50 @@ render (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
realrender (GimpDrawable *drawable)
|
realrender (gint32 drawable_ID)
|
||||||
{
|
{
|
||||||
gint x, y;
|
GeglBuffer *src_buffer;
|
||||||
ray r;
|
GeglBuffer *dest_buffer;
|
||||||
GimpVector4 rcol;
|
const Babl *format;
|
||||||
gint width, height;
|
gint x, y;
|
||||||
gint x1, y1;
|
ray r;
|
||||||
guchar *dest;
|
GimpVector4 rcol;
|
||||||
gint bpp;
|
gint width, height;
|
||||||
GimpPixelRgn pr, dpr;
|
gint x1, y1;
|
||||||
guchar *buffer, *ibuffer;
|
guchar *dest;
|
||||||
|
gint bpp;
|
||||||
|
guchar *buffer, *ibuffer;
|
||||||
|
|
||||||
initworld ();
|
initworld ();
|
||||||
|
|
||||||
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");
|
||||||
buffer = g_malloc (width * 4);
|
}
|
||||||
|
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);
|
||||||
ibuffer = g_malloc (width * 4);
|
ibuffer = g_malloc (width * 4);
|
||||||
|
|
||||||
gimp_progress_init (_("Rendering sphere"));
|
gimp_progress_init (_("Rendering sphere"));
|
||||||
@ -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,24 +3103,24 @@ 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;
|
||||||
|
|
||||||
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))
|
||||||
{
|
return;
|
||||||
gimp_drawable_detach (drawable);
|
|
||||||
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)
|
||||||
{
|
return;
|
||||||
gimp_drawable_detach (drawable);
|
|
||||||
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 ()
|
||||||
|
Reference in New Issue
Block a user