[gimp] pagecurl: avoid 8 bit handling.



commit c4498e78f6e0561c3b493c64e2685ba1ee993a71
Author: Simon Budig <simon budig de>
Date:   Mon Apr 18 22:08:44 2016 +0200

    pagecurl: avoid 8 bit handling.

 plug-ins/pagecurl/pagecurl.c |  194 +++++++++++++----------------------------
 1 files changed, 62 insertions(+), 132 deletions(-)
---
diff --git a/plug-ins/pagecurl/pagecurl.c b/plug-ins/pagecurl/pagecurl.c
index c67f4c4..97554a9 100644
--- a/plug-ins/pagecurl/pagecurl.c
+++ b/plug-ins/pagecurl/pagecurl.c
@@ -124,7 +124,7 @@ static void       init_calculation     (gint32            drawable_id);
 static gint32     do_curl_effect       (gint32            drawable_id);
 static void       clear_curled_region  (gint32            drawable_id);
 static gint32     page_curl            (gint32            drawable_id);
-static guchar   * get_gradient_samples (gint32            drawable_id,
+static GimpRGB  * get_gradient_samples (gint32            drawable_id,
                                         gboolean          reverse);
 
 
@@ -170,8 +170,8 @@ static gdouble diagm_slope;
 
 /* User-configured parameters */
 
-static guchar fore_color[3];
-static guchar back_color[3];
+static GimpRGB fg_color;
+static GimpRGB bg_color;
 
 
 /***** Functions *****/
@@ -629,7 +629,6 @@ init_calculation (gint32 drawable_id)
   GimpVector2  v1, v2;
   gint32      *image_layers;
   gint32       nlayers;
-  GimpRGB      color;
 
   gimp_layer_add_alpha (drawable_id);
 
@@ -691,11 +690,8 @@ init_calculation (gint32 drawable_id)
 
   /* Colors */
 
-  gimp_context_get_foreground (&color);
-  gimp_rgb_get_uchar (&color, &fore_color[0], &fore_color[1], &fore_color[2]);
-
-  gimp_context_get_background (&color);
-  gimp_rgb_get_uchar (&color, &back_color[0], &back_color[1], &back_color[2]);
+  gimp_context_get_foreground (&fg_color);
+  gimp_context_get_background (&bg_color);
 }
 
 static gint32
@@ -704,16 +700,14 @@ do_curl_effect (gint32 drawable_id)
   gint          x = 0;
   gint          y = 0;
   gboolean      color_image;
-  gint          x1, y1, k;
-  guint         alpha_pos, progress, max_progress;
+  gint          x1, y1;
+  guint         progress, max_progress;
   gdouble       intensity, alpha;
   GimpVector2   v, dl, dr;
   gdouble       dl_mag, dr_mag, angle, factor;
-  guchar        fore_grayval, back_grayval;
-  guchar       *gradsamp;
   GeglBuffer   *curl_buffer;
   gint32        curl_layer_id;
-  guchar       *grad_samples  = NULL;
+  GimpRGB      *grad_samples = NULL;
   gint          width, height, bpp;
   GeglRectangle *roi;
   GeglBufferIterator *iter;
@@ -746,7 +740,7 @@ do_curl_effect (gint32 drawable_id)
 
   iter = gegl_buffer_iterator_new (curl_buffer,
                                    GEGL_RECTANGLE (0, 0, width, height), 0,
-                                   babl_format ("R'G'B'A u8"),
+                                   format,
                                    GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
 
   /* Init shade_under */
@@ -758,15 +752,6 @@ do_curl_effect (gint32 drawable_id)
   dr_mag = gimp_vector2_length (&dr);
   alpha = acos (gimp_vector2_inner_product (&dl, &dr) / (dl_mag * dr_mag));
 
-  /* Init shade_curl */
-
-  fore_grayval = GIMP_RGB_LUMINANCE (fore_color[0],
-                                     fore_color[1],
-                                     fore_color[2]) + 0.5;
-  back_grayval = GIMP_RGB_LUMINANCE (back_color[0],
-                                     back_color[1],
-                                     back_color[2]) + 0.5;
-
   /* Gradient Samples */
   switch (curl.colors)
     {
@@ -783,19 +768,18 @@ do_curl_effect (gint32 drawable_id)
   max_progress = 2 * sel_width * sel_height;
   progress = 0;
 
-  alpha_pos = bpp - 1;
-
   /* Main loop */
   while (gegl_buffer_iterator_next (iter))
     {
-      guchar *pp, *dest;
+      guchar *dest;
 
       roi = &iter->roi[0];
       dest = iter->data[0];
 
       for (y1 = roi->y; y1 < roi->y + roi->height; y1++)
         {
-          pp = dest;
+          GimpRGB color;
+
           for (x1 = roi->x; x1 < roi->x + roi->width; x1++)
             {
               /* Map coordinates to get the curl correct... */
@@ -813,18 +797,16 @@ do_curl_effect (gint32 drawable_id)
                 }
 
               if (left_of_diagl (x, y))
-                { /* uncurled region */
-                  for (k = 0; k <= alpha_pos; k++)
-                    pp[k] = 0;
+                { /* uncurled region: transparent black */
+                  gimp_rgba_set (&color, 0, 0, 0, 0);
                 }
               else if (right_of_diagr (x, y) ||
                        (right_of_diagm (x, y) &&
                         below_diagb (x, y) &&
                         !inside_circle (x, y)))
                 {
-                  /* curled region */
-                  for (k = 0; k <= alpha_pos; k++)
-                    pp[k] = 0;
+                  /* curled region: transparent black */
+                  gimp_rgba_set (&color, 0, 0, 0, 0);
                 }
               else
                 {
@@ -837,75 +819,49 @@ do_curl_effect (gint32 drawable_id)
                     {
                       /* Below the curl. */
                       factor = angle / alpha;
-                      for (k = 0; k < alpha_pos; k++)
-                        pp[k] = 0;
-
-                      pp[alpha_pos] = (curl.shade ?
-                                       (guchar) ((float) 255 * (float) factor) :
-                                       0);
+                      gimp_rgba_set (&color, 0, 0, 0, curl.shade ? factor : 0);
                     }
                   else
                     {
+                      GimpRGB *gradrgb;
+
                       /* On the curl */
                       switch (curl.colors)
                         {
                         case CURL_COLORS_FG_BG:
                           intensity = pow (sin (G_PI * angle / alpha), 1.5);
-                          if (color_image)
-                            {
-                              pp[0] = (intensity * back_color[0] +
-                                       (1.0 - intensity) * fore_color[0]);
-                              pp[1] = (intensity * back_color[1] +
-                                       (1.0 - intensity) * fore_color[1]);
-                              pp[2] = (intensity * back_color[2] +
-                                       (1.0 - intensity) * fore_color[2]);
-                            }
-                          else
-                            pp[0] = (intensity * back_grayval +
-                                     (1 - intensity) * fore_grayval);
-
-                          pp[alpha_pos] = (guchar) ((double) 255.99 *
-                                                    (1.0 - intensity *
-                                                     (1.0 - curl.opacity)));
+                          gimp_rgba_set (&color,
+                                         intensity * bg_color.r + (1.0 - intensity) * fg_color.r,
+                                         intensity * bg_color.g + (1.0 - intensity) * fg_color.g,
+                                         intensity * bg_color.b + (1.0 - intensity) * fg_color.b,
+                                         (1.0 - intensity * (1.0 - curl.opacity)));
                           break;
 
                         case CURL_COLORS_GRADIENT:
                         case CURL_COLORS_GRADIENT_REVERSE:
                           /* Calculate position in Gradient */
-                          intensity =
-                            (angle/alpha) + sin (G_PI*2 * angle/alpha) * 0.075;
+                          intensity = (angle/alpha) + sin (G_PI*2 * angle/alpha) * 0.075;
+
+                          gradrgb = grad_samples + ((guint) (intensity * NGRADSAMPLES));
 
                           /* Check boundaries */
                           intensity = CLAMP (intensity, 0.0, 1.0);
-                          gradsamp  = (grad_samples +
-                                       ((guint) (intensity * NGRADSAMPLES)) *
-                                       bpp);
-
-                          if (color_image)
-                            {
-                              pp[0] = gradsamp[0];
-                              pp[1] = gradsamp[1];
-                              pp[2] = gradsamp[2];
-                            }
-                          else
-                            pp[0] = gradsamp[0];
-
-                          pp[alpha_pos] =
-                            (guchar) ((double) gradsamp[alpha_pos] *
-                                      (1.0 - intensity * (1.0 - curl.opacity)));
+                          color = *gradrgb;
+                          color.a = gradrgb->a * (1.0 - intensity * (1.0 - curl.opacity));
                           break;
                         }
                     }
                 }
-              pp += bpp;
+
+              gimp_rgba_get_pixel (&color, format, dest);
+              dest += bpp;
             }
-          dest = pp;
         }
       progress += roi->width * roi->height;
       gimp_progress_update ((double) progress / (double) max_progress);
     }
 
-  gimp_progress_update (1.0);
+  gimp_progress_update (0.5);
   gegl_buffer_flush (curl_buffer);
   gimp_drawable_merge_shadow (curl_layer_id, FALSE);
   gimp_drawable_update (curl_layer_id, 0, 0, width, height);
@@ -923,15 +879,15 @@ clear_curled_region (gint32 drawable_id)
   gint          x = 0;
   gint          y = 0;
   guint         x1, y1;
-  guchar       *dest, *pp, *src, *sp;
-  guint         alpha_pos, progress, max_progress;
+  guchar       *dest, *src;
+  guint         progress, max_progress;
   GeglBuffer   *buf;
   GeglBuffer   *shadow_buf;
   GeglRectangle *roi;
   GeglBufferIterator *iter;
   const Babl   *format;
   gint          width, height, bpp;
-  gint          i, buf_index;
+  gint          buf_index;
 
   max_progress = 2 * sel_width * sel_height;
   progress = max_progress / 2;
@@ -944,26 +900,21 @@ clear_curled_region (gint32 drawable_id)
   bpp    = babl_format_get_bytes_per_pixel (format);
 
   iter = gegl_buffer_iterator_new (shadow_buf,
-                                   GEGL_RECTANGLE (0, 0, width, height), 0,
-                                   babl_format ("R'G'B'A u8"),
+                                   GEGL_RECTANGLE (0, 0, width, height), 0, format,
                                    GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
-  buf_index = gegl_buffer_iterator_add (iter, buf, NULL,
-                                        0, babl_format ("R'G'B'A u8"),
+  buf_index = gegl_buffer_iterator_add (iter, buf, NULL, 0, format,
                                         GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
 
-  alpha_pos = bpp - 1;
-
   while (gegl_buffer_iterator_next (iter))
     {
-      roi = &iter->roi[0];
+      GimpRGB color;
+
+      roi  = &iter->roi[0];
       dest = iter->data[0];
       src  = iter->data[buf_index];
 
       for (y1 = roi->y; y1 < roi->y + roi->height; y1++)
         {
-          pp = dest;
-          sp = src;
-
           for (x1 = roi->x; x1 < roi->x + roi->width; x1++)
             {
               /* Map coordinates to get the curl correct... */
@@ -984,28 +935,22 @@ clear_curled_region (gint32 drawable_id)
                   break;
                 }
 
-              for (i = 0; i < alpha_pos; i++)
-                pp[i] = sp[i];
+              gimp_rgba_set_pixel (&color, format, src);
 
               if (right_of_diagr (x, y) ||
                   (right_of_diagm (x, y) &&
                    below_diagb (x, y) &&
                    !inside_circle (x, y)))
                 {
-                  /* Right of the curl */
-                  pp[alpha_pos] = 0;
-                }
-              else
-                {
-                  pp[alpha_pos] = sp[alpha_pos];
+                  /* Right of the curl: Alpha = 0 */
+                  color.a = 0.0;
                 }
 
-              pp += bpp;
-              sp += bpp;
-            }
+              gimp_rgba_get_pixel (&color, format, dest);
 
-          dest = pp;
-          src = sp;
+              dest += bpp;
+              src += bpp;
+            }
         }
 
       progress += roi->width * roi->height;
@@ -1045,47 +990,32 @@ page_curl (gint32 drawable_id)
   Each sample has (gimp_drawable_bpp (drawable_id)) bytes.
   "ripped" from gradmap.c.
  */
-static guchar *
+static GimpRGB *
 get_gradient_samples (gint32    drawable_id,
                       gboolean  reverse)
 {
   gchar   *gradient_name;
-  gint     n_f_samples;
-  gdouble *f_samples, *f_samp;    /* float samples */
-  guchar  *b_samples, *b_samp;    /* byte samples */
-  gint     bpp, color, has_alpha, alpha;
-  gint     i, j;
+  gint     n_d_samples;
+  gdouble *d_samples = NULL;
+  GimpRGB *rgba;
+  gint     i;
 
   gradient_name = gimp_context_get_gradient ();
 
   gimp_gradient_get_uniform_samples (gradient_name, NGRADSAMPLES, reverse,
-                                     &n_f_samples, &f_samples);
-
-  g_free (gradient_name);
-
-  bpp       = gimp_drawable_bpp (drawable_id);
-  color     = gimp_drawable_is_rgb (drawable_id);
-  has_alpha = gimp_drawable_has_alpha (drawable_id);
-  alpha     = (has_alpha ? bpp - 1 : bpp);
-
-  b_samples = g_new (guchar, NGRADSAMPLES * bpp);
+                                     &n_d_samples, &d_samples);
 
+  rgba = g_new0 (GimpRGB, NGRADSAMPLES);
   for (i = 0; i < NGRADSAMPLES; i++)
     {
-      b_samp = &b_samples[i * bpp];
-      f_samp = &f_samples[i * 4];
-
-      if (color)
-        for (j = 0; j < 3; j++)
-          b_samp[j] = f_samp[j] * 255;
-      else
-        b_samp[0] = GIMP_RGB_LUMINANCE (f_samp[0], f_samp[1], f_samp[2]) * 255;
-
-      if (has_alpha)
-        b_samp[alpha] = f_samp[3] * 255;
+      gimp_rgba_set (rgba + i,
+                     d_samples[i*4 + 0],
+                     d_samples[i*4 + 1],
+                     d_samples[i*4 + 2],
+                     d_samples[i*4 + 3]);
     }
 
-  g_free (f_samples);
+  g_free (gradient_name);
 
-  return b_samples;
+  return rgba;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]