Jon Ciesla bf231a
From 9422570f4e099a834fc43619f7b2a7eb6b442e25 Mon Sep 17 00:00:00 2001
Jon Ciesla 599c4e
From: Tom Hughes <tom@compton.nu>
Jon Ciesla 599c4e
Date: Sun, 19 May 2013 15:31:01 +0100
Jon Ciesla bf231a
Subject: [PATCH 06/15] Implement grain-merge blending mode (GIMP)
Jon Ciesla 599c4e
Jon Ciesla 599c4e
---
Jon Ciesla 599c4e
 include/agg_pixfmt_rgba.h | 42 ++++++++++++++++++++++++++++++++++++++++--
Jon Ciesla 599c4e
 1 file changed, 40 insertions(+), 2 deletions(-)
Jon Ciesla 599c4e
Jon Ciesla 599c4e
diff --git a/include/agg_pixfmt_rgba.h b/include/agg_pixfmt_rgba.h
Jon Ciesla bf231a
index 79d10dc..f576ce4 100644
Jon Ciesla 599c4e
--- a/include/agg_pixfmt_rgba.h
Jon Ciesla 599c4e
+++ b/include/agg_pixfmt_rgba.h
Jon Ciesla 599c4e
@@ -1401,9 +1401,46 @@ namespace agg
Jon Ciesla 599c4e
         }
Jon Ciesla 599c4e
     };
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
+    //================================================comp_op_rgba_grain_merge
Jon Ciesla 599c4e
+    template <typename ColorT, typename Order> struct comp_op_rgba_grain_merge
Jon Ciesla 599c4e
+    {
Jon Ciesla 599c4e
+        typedef ColorT color_type;
Jon Ciesla 599c4e
+        typedef Order order_type;
Jon Ciesla 599c4e
+        typedef typename color_type::value_type value_type;
Jon Ciesla 599c4e
+        typedef typename color_type::calc_type calc_type;
Jon Ciesla 599c4e
+        typedef typename color_type::long_type long_type;
Jon Ciesla 599c4e
+        enum base_scale_e
Jon Ciesla 599c4e
+        {
Jon Ciesla 599c4e
+            base_shift = color_type::base_shift,
Jon Ciesla 599c4e
+            base_mask  = color_type::base_mask
Jon Ciesla 599c4e
+        };
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
+        // E = I + M - 128
Jon Ciesla 599c4e
+        static AGG_INLINE void blend_pix(value_type* p,
Jon Ciesla 599c4e
+                                         unsigned sr, unsigned sg, unsigned sb,
Jon Ciesla 599c4e
+                                         unsigned sa, unsigned cover)
Jon Ciesla 599c4e
+        {
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
-
Jon Ciesla 599c4e
+            if(cover < 255)
Jon Ciesla 599c4e
+            {
Jon Ciesla 599c4e
+                sr = (sr * cover + 255) >> 8;
Jon Ciesla 599c4e
+                sg = (sg * cover + 255) >> 8;
Jon Ciesla 599c4e
+                sb = (sb * cover + 255) >> 8;
Jon Ciesla 599c4e
+                sa = (sa * cover + 255) >> 8;
Jon Ciesla 599c4e
+            }
Jon Ciesla 599c4e
+            if(sa)
Jon Ciesla 599c4e
+            {
Jon Ciesla 599c4e
+                calc_type da = p[Order::A];
Jon Ciesla bf231a
+                int dr = sr + p[Order::R] - 128;
Jon Ciesla bf231a
+                int dg = sg + p[Order::G] - 128;
Jon Ciesla bf231a
+                int db = sb + p[Order::B] - 128;
Jon Ciesla 599c4e
+                p[Order::R] = (value_type)(dr < 0 ? 0 : (dr > 255 ? 255 : dr));
Jon Ciesla 599c4e
+                p[Order::G] = (value_type)(dg < 0 ? 0 : (dg > 255 ? 255 : dg));
Jon Ciesla 599c4e
+                p[Order::B] = (value_type)(db < 0 ? 0 : (db > 255 ? 255 : db));
Jon Ciesla 599c4e
+                p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift));
Jon Ciesla 599c4e
+            }
Jon Ciesla 599c4e
+        }
Jon Ciesla 599c4e
+    };
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
     //======================================================comp_op_table_rgba
Jon Ciesla 599c4e
     template<class ColorT, class Order> struct comp_op_table_rgba
Jon Ciesla 599c4e
@@ -1451,6 +1488,7 @@ namespace agg
Jon Ciesla 599c4e
         comp_op_rgba_contrast   <ColorT,Order>::blend_pix,
Jon Ciesla 599c4e
         comp_op_rgba_invert     <ColorT,Order>::blend_pix,
Jon Ciesla 599c4e
         comp_op_rgba_invert_rgb <ColorT,Order>::blend_pix,
Jon Ciesla 599c4e
+        comp_op_rgba_grain_merge<ColorT,Order>::blend_pix,
Jon Ciesla 599c4e
         0
Jon Ciesla 599c4e
     };
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
@@ -1486,6 +1524,7 @@ namespace agg
Jon Ciesla 599c4e
         comp_op_contrast,      //----comp_op_contrast
Jon Ciesla 599c4e
         comp_op_invert,        //----comp_op_invert
Jon Ciesla 599c4e
         comp_op_invert_rgb,    //----comp_op_invert_rgb
Jon Ciesla 599c4e
+        comp_op_grain_merge,   //----comp_op_grain_merge
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
         end_of_comp_op_e
Jon Ciesla 599c4e
     };
Jon Ciesla 599c4e
@@ -2908,4 +2947,3 @@ namespace agg
Jon Ciesla 599c4e
 }
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
 #endif
Jon Ciesla 599c4e
-
Jon Ciesla 599c4e
-- 
Jon Ciesla 599c4e
1.8.1.4
Jon Ciesla 599c4e