|
Jon Ciesla |
599c4e |
From 6cef3ddecc1b8a614ba4d47bf9daf6b04bea9995 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:43:18 +0100
|
|
Jon Ciesla |
599c4e |
Subject: [PATCH 07/11] Implement grain-extract blending mode (GIMP)
|
|
Jon Ciesla |
599c4e |
|
|
Jon Ciesla |
599c4e |
---
|
|
Jon Ciesla |
599c4e |
include/agg_pixfmt_rgba.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++
|
|
Jon Ciesla |
599c4e |
1 file changed, 47 insertions(+)
|
|
Jon Ciesla |
599c4e |
|
|
Jon Ciesla |
599c4e |
diff --git a/include/agg_pixfmt_rgba.h b/include/agg_pixfmt_rgba.h
|
|
Jon Ciesla |
599c4e |
index 99b1c9f..e0a6dc1 100644
|
|
Jon Ciesla |
599c4e |
--- a/include/agg_pixfmt_rgba.h
|
|
Jon Ciesla |
599c4e |
+++ b/include/agg_pixfmt_rgba.h
|
|
Jon Ciesla |
599c4e |
@@ -1442,6 +1442,51 @@ namespace agg
|
|
Jon Ciesla |
599c4e |
}
|
|
Jon Ciesla |
599c4e |
};
|
|
Jon Ciesla |
599c4e |
|
|
Jon Ciesla |
599c4e |
+ //==============================================comp_op_rgba_grain_extract
|
|
Jon Ciesla |
599c4e |
+ template <typename ColorT, typename Order> struct comp_op_rgba_grain_extract
|
|
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 |
+ calc_type da = (p[Order::A] * sa + 255) >> 8;
|
|
Jon Ciesla |
599c4e |
+ calc_type dr = p[Order::R] - sr + 128;
|
|
Jon Ciesla |
599c4e |
+ calc_type dg = p[Order::G] - sg + 128;
|
|
Jon Ciesla |
599c4e |
+ calc_type db = p[Order::B] - sb + 128;
|
|
Jon Ciesla |
599c4e |
+
|
|
Jon Ciesla |
599c4e |
+ dr = dr < 0 ? 0 : (dr > 255 ? 255 : dr);
|
|
Jon Ciesla |
599c4e |
+ dg = dg < 0 ? 0 : (dg > 255 ? 255 : dg);
|
|
Jon Ciesla |
599c4e |
+ db = db < 0 ? 0 : (db > 255 ? 255 : db);
|
|
Jon Ciesla |
599c4e |
+
|
|
Jon Ciesla |
599c4e |
+ p[Order::A] = da;
|
|
Jon Ciesla |
599c4e |
+
|
|
Jon Ciesla |
599c4e |
+ if(da < 255)
|
|
Jon Ciesla |
599c4e |
+ {
|
|
Jon Ciesla |
599c4e |
+ p[Order::R] = (dr * da + 255) >> 8;
|
|
Jon Ciesla |
599c4e |
+ p[Order::G] = (dg * da + 255) >> 8;
|
|
Jon Ciesla |
599c4e |
+ p[Order::B] = (db * da + 255) >> 8;
|
|
Jon Ciesla |
599c4e |
+ }
|
|
Jon Ciesla |
599c4e |
+ else
|
|
Jon Ciesla |
599c4e |
+ {
|
|
Jon Ciesla |
599c4e |
+ p[Order::R] = dr;
|
|
Jon Ciesla |
599c4e |
+ p[Order::G] = dg;
|
|
Jon Ciesla |
599c4e |
+ p[Order::B] = db;
|
|
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 |
{
|
|
Jon Ciesla |
599c4e |
@@ -1489,6 +1534,7 @@ namespace agg
|
|
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 |
+ comp_op_rgba_grain_extract<ColorT,Order>::blend_pix,
|
|
Jon Ciesla |
599c4e |
0
|
|
Jon Ciesla |
599c4e |
};
|
|
Jon Ciesla |
599c4e |
|
|
Jon Ciesla |
599c4e |
@@ -1525,6 +1571,7 @@ namespace agg
|
|
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 |
+ comp_op_grain_extract, //----comp_op_grain_extract
|
|
Jon Ciesla |
599c4e |
|
|
Jon Ciesla |
599c4e |
end_of_comp_op_e
|
|
Jon Ciesla |
599c4e |
};
|
|
Jon Ciesla |
599c4e |
--
|
|
Jon Ciesla |
599c4e |
1.8.1.4
|
|
Jon Ciesla |
599c4e |
|