Hello,

I have a problem creating a cery simple gimp plugin..

The idea is to select a part of an image, and the plugin should create
a new image with the size of the selection, and put (processed) pixels
in that new image (a bit like "Copy && Past As New").

The plugin compiles, runs without crashing, the progress bar is ok,
but I do not see the new image anywhere.
I must be doing something *obvious* wrong somewhere...


void
render (gint32              image_ID,
        GimpDrawable       *src_drawable,
        PlugInVals         *vals,
        PlugInImageVals    *image_vals,
        PlugInDrawableVals *drawable_vals)
{
 gint    progress, max_progress;
 gint    x1, y1, x2, y2;
 gint    x, y, width, height;
 GimpPixelRgn src_rgn, msk_rgn, dst_rgn;
 gint    rgn_stride, msk_stride, dst_stride;
 gint    rgn_bpp, msk_bpp, dst_bpp;
 guchar  *rgn_buf, *msk_buf, *dst_buf;
 guchar  **src, **msk, **dst;

 gint32 selection_ID;
 GimpDrawable* msk_drawable;

 gint32 dst_image;
 gint32 dst_layer;
 GimpDrawable* dst_drawable;

 /* Get selection */
 selection_ID = gimp_image_get_selection (image_ID);

 /* Get selection area */
 gimp_drawable_mask_bounds (src_drawable->drawable_id, &x1, &y1, &x2, &y2);
 rgn_bpp   = gimp_drawable_bpp (src_drawable->drawable_id);

 width = (x2 - x1);
 height = (y2 - y1);

 /* Get selection mask */
 msk_drawable = gimp_drawable_get (selection_ID);
 msk_bpp   = gimp_drawable_bpp (msk_drawable->drawable_id);

 /* create new image */
 dst_image = gimp_image_new(width, height, GIMP_RGB);
 gimp_image_undo_disable(dst_image);
 dst_layer = gimp_layer_new(dst_image, "Histogram", width, height,
GIMP_RGB_IMAGE, 100, GIMP_NORMAL_MODE);
 gimp_image_add_layer(dst_image, dst_layer, 0);
 dst_drawable = gimp_drawable_get(dst_layer);
 dst_bpp  = gimp_drawable_bpp (dst_drawable->drawable_id);

 /* Initialize progress */
 progress = 0;
 max_progress = width * height;

 /* substitute pixel vales */
 gimp_pixel_rgn_init (&src_rgn, src_drawable,
                      x1, y1, width, height, FALSE, FALSE);
 gimp_pixel_rgn_init (&msk_rgn, msk_drawable,
                       x1, y1, width, height, FALSE, FALSE);
 gimp_pixel_rgn_init (&dst_rgn, dst_drawable,
                       0, 0, width, height, FALSE, FALSE);

 rgn_buf = g_new0 (guchar, width * height * rgn_bpp);
 msk_buf = g_new0 (guchar, width * height * msk_bpp);
 dst_buf = g_new0 (guchar, width * height * dst_bpp);

 gimp_progress_init (_("Histogram"));

 gimp_pixel_rgn_get_rect(&src_rgn, rgn_buf, x1, y1, width, height);
 gimp_pixel_rgn_get_rect(&msk_rgn, msk_buf, x1, y1, width, height);
 gimp_pixel_rgn_get_rect(&dst_rgn, dst_buf, 0, 0, width, height);

 rgn_stride = width * rgn_bpp;
 msk_stride = width * msk_bpp;
 dst_stride = width * dst_bpp;

 src = g_new (guchar*, height);
 dst = g_new (guchar*, height);
 msk = g_new (guchar*, height);

 for(y = 0; y < height; y++) {
   src[y] = &rgn_buf[y * rgn_stride];
   dst[y] = &dst_buf[y * dst_stride];
   msk[y] = &msk_buf[y * msk_stride];
 }

 /* here goes the processing */
   for (y = 1; y < height-1; y++)
     {
        for (x = 0; x < width-1; x++)
          {
            if (msk[y][x]!=0) {
              dst[y][x] = src[y][x];
            }
          }

        /* Update progress */
        progress += width;

        gimp_progress_update ((double) progress / (double) max_progress);
     }

 gimp_progress_update (1.0);

 /*  update the region  */
 gimp_drawable_flush (dst_drawable);
 gimp_drawable_detach(dst_drawable);

 //gimp_pixel_rgn_set_rect(&dst_rgn, dst_buf, 0, 0, width, height);

 g_free(src);
 g_free(dst);
 g_free(msk);

 g_free(rgn_buf);
 g_free(dst_buf);
 g_free(msk_buf);
}


_______________________________________________
Gimp-developer mailing list
Gimp-developer@lists.xcf.berkeley.edu
http://lists.xcf.berkeley.edu/mailman/listinfo/gimp-developer

Reply via email to