[gimp/gimp-2-10] plug-ins: port grid to GEGL, stupid 8-bit port only
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/gimp-2-10] plug-ins: port grid to GEGL, stupid 8-bit port only
- Date: Wed, 10 Jul 2019 10:46:28 +0000 (UTC)
commit 0df4376aa4415e50dac0d715d94dd6fd00287725
Author: Michael Natterer <mitch gimp org>
Date: Wed Jul 10 12:43:27 2019 +0200
plug-ins: port grid to GEGL, stupid 8-bit port only
(cherry picked from commit 0326a3e79aa37c281bd9effbe238d1604f8ffea2)
plug-ins/common/Makefile.am | 1 +
plug-ins/common/grid.c | 179 ++++++++++++++++++++++++-----------------
plug-ins/common/plugin-defs.pl | 2 +-
3 files changed, 105 insertions(+), 77 deletions(-)
---
diff --git a/plug-ins/common/Makefile.am b/plug-ins/common/Makefile.am
index cd3ce63591..a781da30af 100644
--- a/plug-ins/common/Makefile.am
+++ b/plug-ins/common/Makefile.am
@@ -1456,6 +1456,7 @@ grid_LDADD = \
$(libgimpcolor) \
$(libgimpbase) \
$(GTK_LIBS) \
+ $(GEGL_LIBS) \
$(RT_LIBS) \
$(INTLLIBS) \
$(grid_RC)
diff --git a/plug-ins/common/grid.c b/plug-ins/common/grid.c
index c302b0f52d..7abdf2fdbb 100644
--- a/plug-ins/common/grid.c
+++ b/plug-ins/common/grid.c
@@ -65,10 +65,10 @@ static guchar best_cmap_match (const guchar *cmap,
gint ncolors,
const GimpRGB *color);
static void grid (gint32 image_ID,
- GimpDrawable *drawable,
+ gint32 drawable_ID,
GimpPreview *preview);
static gint dialog (gint32 image_ID,
- GimpDrawable *drawable);
+ gint32 drawable_ID);
const GimpPlugInInfo PLUG_IN_INFO =
{
@@ -162,19 +162,20 @@ run (const gchar *name,
GimpParam **return_vals)
{
static GimpParam values[1];
- GimpDrawable *drawable;
gint32 image_ID;
+ gint32 drawable_ID;
GimpRunMode run_mode;
GimpPDBStatusType status = GIMP_PDB_SUCCESS;
+ INIT_I18N ();
+ gegl_init (NULL, NULL);
+
*nreturn_vals = 1;
*return_vals = values;
- INIT_I18N ();
-
- run_mode = param[0].data.d_int32;
- image_ID = param[1].data.d_int32;
- drawable = gimp_drawable_get (param[2].data.d_drawable);
+ run_mode = param[0].data.d_int32;
+ image_ID = param[1].data.d_int32;
+ drawable_ID = param[2].data.d_drawable;
if (run_mode == GIMP_RUN_NONINTERACTIVE)
{
@@ -224,7 +225,7 @@ run (const gchar *name,
if (run_mode == GIMP_RUN_INTERACTIVE)
{
- if (!dialog (image_ID, drawable))
+ if (! dialog (image_ID, drawable_ID))
{
/* The dialog was closed, or something similarly evil happened. */
status = GIMP_PDB_EXECUTION_ERROR;
@@ -239,20 +240,17 @@ run (const gchar *name,
if (status == GIMP_PDB_SUCCESS)
{
gimp_progress_init (_("Drawing grid"));
- gimp_tile_cache_ntiles (2 * (drawable->width / gimp_tile_width () + 1));
- grid (image_ID, drawable, NULL);
+ grid (image_ID, drawable_ID, NULL);
if (run_mode != GIMP_RUN_NONINTERACTIVE)
gimp_displays_flush ();
if (run_mode == GIMP_RUN_INTERACTIVE)
gimp_set_data (PLUG_IN_PROC, &grid_cfg, sizeof (grid_cfg));
-
- gimp_drawable_detach (drawable);
}
- values[0].type = GIMP_PDB_STATUS;
+ values[0].type = GIMP_PDB_STATUS;
values[0].data.d_status = status;
}
@@ -325,22 +323,26 @@ pix_composite (guchar *p1,
}
static void
-grid (gint32 image_ID,
- GimpDrawable *drawable,
- GimpPreview *preview)
+grid (gint32 image_ID,
+ gint32 drawable_ID,
+ GimpPreview *preview)
{
- GimpPixelRgn srcPR, destPR;
- gint bytes;
- gint x_offset, y_offset;
- guchar *dest, *buffer = NULL;
- gint x, y;
- gboolean alpha;
- gboolean blend;
- guchar hcolor[4];
- guchar vcolor[4];
- guchar icolor[4];
- guchar *cmap;
- gint ncolors;
+ GeglBuffer *src_buffer;
+ GeglBuffer *dest_buffer;
+ const Babl *format;
+ gint bytes;
+ gint x_offset;
+ gint y_offset;
+ guchar *dest;
+ guchar *buffer = NULL;
+ gint x, y;
+ gboolean alpha;
+ gboolean blend;
+ guchar hcolor[4];
+ guchar vcolor[4];
+ guchar icolor[4];
+ guchar *cmap;
+ gint ncolors;
gimp_rgba_get_uchar (&grid_cfg.hcolor,
hcolor, hcolor + 1, hcolor + 2, hcolor + 3);
@@ -349,10 +351,17 @@ grid (gint32 image_ID,
gimp_rgba_get_uchar (&grid_cfg.icolor,
icolor, icolor + 1, icolor + 2, icolor + 3);
+ alpha = gimp_drawable_has_alpha (drawable_ID);
+
switch (gimp_image_base_type (image_ID))
{
case GIMP_RGB:
blend = TRUE;
+
+ if (alpha)
+ format = babl_format ("R'G'B'A u8");
+ else
+ format = babl_format ("R'G'B' u8");
break;
case GIMP_GRAY:
@@ -360,6 +369,11 @@ grid (gint32 image_ID,
vcolor[0] = gimp_rgb_luminance_uchar (&grid_cfg.vcolor);
icolor[0] = gimp_rgb_luminance_uchar (&grid_cfg.icolor);
blend = TRUE;
+
+ if (alpha)
+ format = babl_format ("Y'A u8");
+ else
+ format = babl_format ("Y' u8");
break;
case GIMP_INDEXED:
@@ -371,6 +385,8 @@ grid (gint32 image_ID,
g_free (cmap);
blend = FALSE;
+
+ format = gimp_drawable_get_format (drawable_ID);
break;
default:
@@ -378,8 +394,7 @@ grid (gint32 image_ID,
blend = FALSE;
}
- bytes = drawable->bpp;
- alpha = gimp_drawable_has_alpha (drawable->drawable_id);
+ bytes = babl_format_get_bytes_per_pixel (format);
if (preview)
{
@@ -395,24 +410,25 @@ grid (gint32 image_ID,
{
gint w, h;
- if (! gimp_drawable_mask_intersect (drawable->drawable_id,
+ if (! gimp_drawable_mask_intersect (drawable_ID,
&sx1, &sy1, &w, &h))
return;
sx2 = sx1 + w;
sy2 = sy1 + h;
- gimp_pixel_rgn_init (&destPR, drawable, 0, 0, w, h, TRUE, TRUE);
+ dest_buffer = gimp_drawable_get_shadow_buffer (drawable_ID);
}
- gimp_pixel_rgn_init (&srcPR,
- drawable, 0, 0, sx2 - sx1, sy2 - sy1, FALSE, FALSE);
+ src_buffer = gimp_drawable_get_buffer (drawable_ID);
dest = g_new (guchar, (sx2 - sx1) * bytes);
for (y = sy1; y < sy2; y++)
{
- gimp_pixel_rgn_get_row (&srcPR, dest, sx1, y, (sx2 - sx1));
+ gegl_buffer_get (src_buffer, GEGL_RECTANGLE (sx1, y, sx2 - sx1, 1), 1.0,
+ format, dest,
+ GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
y_offset = y - grid_cfg.hoffset;
while (y_offset < 0)
@@ -492,7 +508,10 @@ grid (gint32 image_ID,
}
else
{
- gimp_pixel_rgn_set_row (&destPR, dest, sx1, y, (sx2 - sx1));
+ gegl_buffer_set (dest_buffer,
+ GEGL_RECTANGLE (sx1, y, sx2 - sx1, 1), 0,
+ format, dest,
+ GEGL_AUTO_ROWSTRIDE);
if (y % 16 == 0)
gimp_progress_update ((gdouble) y / (gdouble) (sy2 - sy1));
@@ -501,6 +520,8 @@ grid (gint32 image_ID,
g_free (dest);
+ g_object_unref (src_buffer);
+
if (preview)
{
gimp_preview_draw_buffer (preview, buffer, bytes * (sx2 - sx1));
@@ -509,9 +530,11 @@ grid (gint32 image_ID,
else
{
gimp_progress_update (1.0);
- gimp_drawable_flush (drawable);
- gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
- gimp_drawable_update (drawable->drawable_id,
+
+ g_object_unref (dest_buffer);
+
+ gimp_drawable_merge_shadow (drawable_ID, TRUE);
+ gimp_drawable_update (drawable_ID,
sx1, sy1, sx2 - sx1, sy2 - sy1);
}
}
@@ -557,11 +580,13 @@ update_values (void)
static void
update_preview (GimpPreview *preview,
- GimpDrawable *drawable)
+ gpointer drawable_ID)
{
update_values ();
- grid (gimp_item_get_image (drawable->drawable_id), drawable, preview);
+ grid (gimp_item_get_image (GPOINTER_TO_INT (drawable_ID)),
+ GPOINTER_TO_INT (drawable_ID),
+ preview);
}
static void
@@ -615,8 +640,8 @@ color_callback (GtkWidget *widget,
static gint
-dialog (gint32 image_ID,
- GimpDrawable *drawable)
+dialog (gint32 image_ID,
+ gint32 drawable_ID)
{
GimpColorConfig *config;
GtkWidget *dlg;
@@ -626,20 +651,25 @@ dialog (gint32 image_ID,
GtkWidget *label;
GtkWidget *preview;
GtkWidget *button;
- GtkWidget *width;
- GtkWidget *space;
- GtkWidget *offset;
- GtkWidget *chain_button;
- GtkWidget *table;
- GimpUnit unit;
- gdouble xres;
- gdouble yres;
- gboolean run;
+ GtkWidget *width;
+ GtkWidget *space;
+ GtkWidget *offset;
+ GtkWidget *chain_button;
+ GtkWidget *table;
+ GimpUnit unit;
+ gint d_width;
+ gint d_height;
+ gdouble xres;
+ gdouble yres;
+ gboolean run;
g_return_val_if_fail (main_dialog == NULL, FALSE);
gimp_ui_init (PLUG_IN_BINARY, TRUE);
+ d_width = gimp_drawable_width (drawable_ID);
+ d_height = gimp_drawable_height (drawable_ID);
+
main_dialog = dlg = gimp_dialog_new (_("Grid"), PLUG_IN_ROLE,
NULL, 0,
gimp_standard_help_func, PLUG_IN_PROC,
@@ -666,13 +696,13 @@ dialog (gint32 image_ID,
main_vbox, TRUE, TRUE, 0);
gtk_widget_show (main_vbox);
- preview = gimp_drawable_preview_new_from_drawable_id (drawable->drawable_id);
+ preview = gimp_drawable_preview_new_from_drawable_id (drawable_ID);
gtk_box_pack_start (GTK_BOX (main_vbox), preview, TRUE, TRUE, 0);
gtk_widget_show (preview);
g_signal_connect (preview, "invalidated",
G_CALLBACK (update_preview),
- drawable);
+ GINT_TO_POINTER (drawable_ID));
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
gtk_box_pack_start (GTK_BOX (main_vbox), vbox, FALSE, FALSE, 0);
@@ -701,18 +731,17 @@ dialog (gint32 image_ID,
gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (width), 2, xres, TRUE);
/* set the size (in pixels) that will be treated as 0% and 100% */
- gimp_size_entry_set_size (GIMP_SIZE_ENTRY (width), 0, 0.0, drawable->height);
- gimp_size_entry_set_size (GIMP_SIZE_ENTRY (width), 1, 0.0, drawable->width);
- gimp_size_entry_set_size (GIMP_SIZE_ENTRY (width), 2, 0.0, drawable->width);
+ gimp_size_entry_set_size (GIMP_SIZE_ENTRY (width), 0, 0.0, d_height);
+ gimp_size_entry_set_size (GIMP_SIZE_ENTRY (width), 1, 0.0, d_width);
+ gimp_size_entry_set_size (GIMP_SIZE_ENTRY (width), 2, 0.0, d_width);
/* set upper and lower limits (in pixels) */
gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (width), 0, 0.0,
- drawable->height);
+ d_height);
gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (width), 1, 0.0,
- drawable->width);
+ d_width);
gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (width), 2, 0.0,
- MAX (drawable->width,
- drawable->height));
+ MAX (d_width, d_height));
gtk_table_set_row_spacing (GTK_TABLE (width), 0, 6);
gtk_table_set_col_spacings (GTK_TABLE (width), 6);
gtk_table_set_col_spacing (GTK_TABLE (width), 2, 12);
@@ -775,18 +804,17 @@ dialog (gint32 image_ID,
gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (space), 2, xres, TRUE);
/* set the size (in pixels) that will be treated as 0% and 100% */
- gimp_size_entry_set_size (GIMP_SIZE_ENTRY (space), 0, 0.0, drawable->height);
- gimp_size_entry_set_size (GIMP_SIZE_ENTRY (space), 1, 0.0, drawable->width);
- gimp_size_entry_set_size (GIMP_SIZE_ENTRY (space), 2, 0.0, drawable->width);
+ gimp_size_entry_set_size (GIMP_SIZE_ENTRY (space), 0, 0.0, d_height);
+ gimp_size_entry_set_size (GIMP_SIZE_ENTRY (space), 1, 0.0, d_width);
+ gimp_size_entry_set_size (GIMP_SIZE_ENTRY (space), 2, 0.0, d_width);
/* set upper and lower limits (in pixels) */
gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (space), 0, 1.0,
- drawable->height);
+ d_height);
gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (space), 1, 1.0,
- drawable->width);
+ d_width);
gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (space), 2, 0.0,
- MAX (drawable->width,
- drawable->height));
+ MAX (d_width, d_height));
gtk_table_set_col_spacings (GTK_TABLE (space), 6);
gtk_table_set_col_spacing (GTK_TABLE (space), 2, 12);
@@ -842,18 +870,17 @@ dialog (gint32 image_ID,
gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (offset), 2, xres, TRUE);
/* set the size (in pixels) that will be treated as 0% and 100% */
- gimp_size_entry_set_size (GIMP_SIZE_ENTRY (offset), 0, 0.0, drawable->height);
- gimp_size_entry_set_size (GIMP_SIZE_ENTRY (offset), 1, 0.0, drawable->width);
- gimp_size_entry_set_size (GIMP_SIZE_ENTRY (offset), 2, 0.0, drawable->width);
+ gimp_size_entry_set_size (GIMP_SIZE_ENTRY (offset), 0, 0.0, d_height);
+ gimp_size_entry_set_size (GIMP_SIZE_ENTRY (offset), 1, 0.0, d_width);
+ gimp_size_entry_set_size (GIMP_SIZE_ENTRY (offset), 2, 0.0, d_width);
/* set upper and lower limits (in pixels) */
gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (offset), 0, 0.0,
- drawable->height);
+ d_height);
gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (offset), 1, 0.0,
- drawable->width);
+ d_width);
gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (offset), 2, 0.0,
- MAX (drawable->width,
- drawable->height));
+ MAX (d_width, d_height));
gtk_table_set_col_spacings (GTK_TABLE (offset), 6);
gtk_table_set_col_spacing (GTK_TABLE (offset), 2, 12);
diff --git a/plug-ins/common/plugin-defs.pl b/plug-ins/common/plugin-defs.pl
index e453560874..a23060f2ad 100644
--- a/plug-ins/common/plugin-defs.pl
+++ b/plug-ins/common/plugin-defs.pl
@@ -65,7 +65,7 @@
'fractal-trace' => { ui => 1 },
'goat-exercise' => { gegl => 1 },
'gradient-map' => { gegl => 1 },
- 'grid' => { ui => 1 },
+ 'grid' => { ui => 1, gegl => 1 },
'guillotine' => {},
'hot' => { ui => 1 },
'jigsaw' => { ui => 1, gegl => 1 },
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]