On Tue, Apr 12, 2011 at 10:55 PM, sourav de <souravde1...@gmail.com> wrote:

>
>
> On Thu, Apr 7, 2011 at 5:36 PM, Mukund Sivaraman <m...@mukund.org> wrote:
>
>> Hi Sourav
>>
>> On Wed, Apr 06, 2011 at 09:44:31PM +0530, sourav de wrote:
>> > I tried to implement the blur operation in GEGL. The algorithm is same
>> as of
>> > the blur plug-in in GIMP. The patch file for GEGL operation and the
>> blur.c
>> > file for the plug-in are attached below. Kindly let me know if there is
>> any
>> > mistake in my implementation.
>> >
>> > +{
>> > +dst_buf[offset*4+c]=ROUND(
>> > +                           ((gdouble) (src_pix[c-src_width*4 - 4] *
>> src_pix[c-src_width*4 - c])
>> > +                            + (gdouble) (src_pix[c-src_width*4] *
>> src_pix[c-src_width*4 + 4 - c])
>> > +                            + (gdouble) (src_pix[c-src_width*4 + 4] *
>> src_pix[c-src_width*4 + 2*4 - c])
>> > +                            + (gdouble) (src_pix[c - bytes] * src_pix[c
>> - c])
>> > +                            + (gdouble) (src_pix[c] * src_pix[c + 4 -
>> c])
>> > +                            + (gdouble) (src_pix[c + 4] * src_pix[c +
>> 2*4 - c])
>> > +                            + (gdouble) (src_pix[c+src_width*4 - 4] *
>> src_pix[c+src_width*4 - c])
>> > +                            + (gdouble) (src_pix[c+src_width*4] *
>> src_pix[c+src_width*4 + 4 - c])
>> > +                            + (gdouble) (src_pix[c+src_width*4 + 4] *
>> src_pix[c+src_width*4 + 2*4 - c]))
>> > +                           / ((gdouble) src_pix[c-src_width*4 - c]
>> > +                              + (gdouble) src_pix[c-src_width*4 + 4 -
>> c]
>> > +                              + (gdouble) src_pix[c-src_width*4 + 2*4 -
>> c]
>> > +                              + (gdouble) src_pix[c -c]
>> > +                              + (gdouble) src_pix[c + 4 - c]
>> > +                              + (gdouble) src_pix[c + 2*4 - c]
>> > +                              + (gdouble) src_pix[c+src_width*4 - c]
>> > +                              + (gdouble) src_pix[c+src_width*4 + 4 -
>> c]
>> > +                              + (gdouble) src_pix[c+src_width*4 + 2*4 -
>> c]));
>> > +
>> > +}
>> > +
>> > +dst_buf[offset*4+3]=
>> ((gint)src_pix[c-4-src_width*4]+(gint)src_pix[c-src_width*4]+(gint)src_pix[c+4-src_width*4]
>> +
>> > +     (gint)src_pix[c-4]+(gint)src_pix[c]+(gint)src_pix[c+4]+
>> > +
>> (gint)src_pix[c-4+src_width*4]+(gint)src_pix[c+src_width*4]+(gint)src_pix[c+4+src_width*4]+4)/9;
>>
>> Did this code work for you? Were you able to use this inside GEGL to
>> perform a blur?
>>
>> You can help me review this code if you clean it up and comment it.
>>
>>                Mukund
>>
>
> Hi,
>
> I changed the code little bit.
> I placed the blur.c file in gegl-0.1.2/operations/common folder & followed
> these steps to compile GEGL.
>
> 1. configure
> 2. make
> 3. make install
>
> it compiled successfully. But I don't know how to check whether it runs or
> not. Please help me finding this out & cleaning it up. Sorry for replying
> late.
>
>
>
> --
> Sourav De
> 2nd Year Student
> Department of Computer Science and Engineering
> IIT KHARAGPUR
>
>
I overlooked the option in GIMP to run GEGL operation. Now I have checked
it, and it works.

-- 
Sourav De
2nd Year Student
Department of Computer Science and Engineering
IIT KHARAGPUR
#include "config.h"
#include <glib/gi18n-lib.h>

#ifdef GEGL_CHANT_PROPERTIES

#else

#define GEGL_CHANT_TYPE_AREA_FILTER
#define GEGL_CHANT_C_FILE  "blur.c"

#include <gegl-chant.h>
#include <math.h>
#include <stdio.h>

#define BLUR_RADIUS 1;

static void blur(GeglBuffer *src,const GeglRectangle *src_rect,GeglBuffer *dst,const GeglRectangle *dst_rect);

static inline void  prepare(GeglOperation *operation)
{
GeglOperationAreaFilter *area = GEGL_OPERATION_AREA_FILTER (operation);
area->left = area->right = area->top = area->bottom=BLUR_RADIUS;
gegl_operation_set_format (operation, "input", babl_format ("RGBA float"));
gegl_operation_set_format (operation, "output", babl_format ("RGBA float"));
}

static gboolean process (GeglOperation *operation, GeglBuffer *input, GeglBuffer *output, const GeglRectangle *result)
{
GeglChantO   *o = GEGL_CHANT_PROPERTIES (operation);
GeglRectangle compute;
compute = gegl_operation_get_required_for_output (operation, "input",result);
blur(input, &compute, output, result);
return TRUE;
}


static void blur (GeglBuffer *src,const GeglRectangle *src_rect,GeglBuffer *dst,const GeglRectangle *dst_rect)
{
gint x,y;
gint i,j;
gfloat *src_buf,*dst_buf;
gint offset;


src_buf = g_new0 (gfloat, src_rect->width * src_rect->height * 4);
dst_buf = g_new0 (gfloat, dst_rect->width * dst_rect->height * 4);

gint src_width=src_rect->width;

gegl_buffer_get (src, 1.0, src_rect, babl_format ("RGBA float"), src_buf, GEGL_AUTO_ROWSTRIDE);

offset=0;
for(y=0; y<dst_rect->height; y++)
{
for (x=0; x<dst_rect->width; x++)
{

gint c;
i=x+BLUR_RADIUS;
 j=y+BLUR_RADIUS;
gfloat *src_pix = src_buf + (i + j * src_width) * 4;

for (c=0;c<3;c++)
{
dst_buf[offset*4+c]=lround(
                           ((gdouble) (src_pix[c-src_width*4 - 4] * src_pix[c-src_width*4 - c])
                            + (gdouble) (src_pix[c-src_width*4] * src_pix[c-src_width*4 + 4 - c])
                            + (gdouble) (src_pix[c-src_width*4 + 4] * src_pix[c-src_width*4 + 2*4 - c])
                            + (gdouble) (src_pix[c - 4] * src_pix[c - c])
                            + (gdouble) (src_pix[c] * src_pix[c + 4 - c])
                            + (gdouble) (src_pix[c + 4] * src_pix[c + 2*4 - c])
                            + (gdouble) (src_pix[c+src_width*4 - 4] * src_pix[c+src_width*4 - c])
                            + (gdouble) (src_pix[c+src_width*4] * src_pix[c+src_width*4 + 4 - c])
                            + (gdouble) (src_pix[c+src_width*4 + 4] * src_pix[c+src_width*4 + 2*4 - c]))
                           / ((gdouble) src_pix[c-src_width*4 - c]
                              + (gdouble) src_pix[c-src_width*4 + 4 - c]
                              + (gdouble) src_pix[c-src_width*4 + 2*4 - c]
                              + (gdouble) src_pix[c -c]
                              + (gdouble) src_pix[c + 4 - c]
                              + (gdouble) src_pix[c + 2*4 - c]
                              + (gdouble) src_pix[c+src_width*4 - c]
                              + (gdouble) src_pix[c+src_width*4 + 4 - c]
                              + (gdouble) src_pix[c+src_width*4 + 2*4 - c]));

}

dst_buf[offset*4+3]= ((gint)src_pix[c-4-src_width*4]+(gint)src_pix[c-src_width*4]+(gint)src_pix[c+4-src_width*4] +
	(gint)src_pix[c-4]+(gint)src_pix[c]+(gint)src_pix[c+4]+
	(gint)src_pix[c-4+src_width*4]+(gint)src_pix[c+src_width*4]+(gint)src_pix[c+4+src_width*4]+4)/9;



offset++;
}

}

gegl_buffer_set (dst, dst_rect, babl_format ("RGBA float"), dst_buf,GEGL_AUTO_ROWSTRIDE);

g_free (src_buf);
g_free (dst_buf);

}

static void
gegl_chant_class_init (GeglChantClass *klass)
{
  GeglOperationClass       *operation_class;
  GeglOperationFilterClass *filter_class;

  operation_class = GEGL_OPERATION_CLASS (klass);
  filter_class    = GEGL_OPERATION_FILTER_CLASS (klass);

  filter_class->process    = process;
  operation_class->prepare = prepare;

  operation_class->categories  = "blur";
  operation_class->name        = "gegl:blur";
  operation_class->description =
       _("Performs an averaging of pixels.");
}

#endif
_______________________________________________
Gimp-developer mailing list
Gimp-developer@lists.XCF.Berkeley.EDU
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer

Reply via email to