[gimp] app: mypaint: Add colorize mode
- From: Daniel Sabo <daniels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: mypaint: Add colorize mode
- Date: Mon, 28 Dec 2015 22:00:09 +0000 (UTC)
commit e0fc362b12044357bc66242dfcd1ab65c2fee055
Author: Daniel Sabo <DanielSabo gmail com>
Date: Mon Dec 28 10:16:31 2015 -0800
app: mypaint: Add colorize mode
app/paint/gimpmybrushsurface.c | 39 +++++++++++++++++++++++++++++++++++----
1 files changed, 35 insertions(+), 4 deletions(-)
---
diff --git a/app/paint/gimpmybrushsurface.c b/app/paint/gimpmybrushsurface.c
index b16eca9..5c5809d 100644
--- a/app/paint/gimpmybrushsurface.c
+++ b/app/paint/gimpmybrushsurface.c
@@ -25,6 +25,10 @@
#include "libgimpmath/gimpmath.h"
+#include <cairo.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include "libgimpcolor/gimpcolor.h"
+
#include "gimpmybrushsurface.h"
@@ -332,6 +336,7 @@ gimp_mypaint_surface_draw_dab (MyPaintSurface *base_surface,
const double angle_rad = angle / 360 * 2 * M_PI;
const float cs = cos(angle_rad);
const float sn = sin(angle_rad);
+ float normal_mode;
float segment1_slope;
float segment2_slope;
float r_aa_start;
@@ -345,6 +350,9 @@ gimp_mypaint_surface_draw_dab (MyPaintSurface *base_surface,
r_aa_start = MAX (r_aa_start, 0);
r_aa_start = (r_aa_start * r_aa_start) / aspect_ratio;
+ normal_mode = opaque * (1.0f - colorize);
+ colorize = opaque * colorize;
+
/* FIXME: This should use the real matrix values to trim aspect_ratio dabs */
dabRect = calculate_dab_roi (x, y, radius);
gegl_rectangle_intersect (&dabRect, &dabRect, gegl_buffer_get_extent (surface->buffer));
@@ -367,12 +375,13 @@ gimp_mypaint_surface_draw_dab (MyPaintSurface *base_surface,
{
for (ix = iter->roi[0].x; ix < iter->roi[0].x + iter->roi[0].width; ix++)
{
- float rr, alpha, dst_alpha, r, g, b, a;
+ float rr, base_alpha, alpha, dst_alpha, r, g, b, a;
if (radius < 3.0f)
rr = calculate_rr_antialiased (ix, iy, x, y, aspect_ratio, sn, cs, one_over_radius2,
r_aa_start);
else
rr = calculate_rr (ix, iy, x, y, aspect_ratio, sn, cs, one_over_radius2);
- alpha = calculate_alpha_for_rr (rr, hardness, segment1_slope, segment2_slope) * opaque;
+ base_alpha = calculate_alpha_for_rr (rr, hardness, segment1_slope, segment2_slope);
+ alpha = base_alpha * normal_mode;
dst_alpha = pixel[ALPHA];
/* a = alpha * color_a + dst_alpha * (1.0f - alpha);
* which converts to: */
@@ -393,8 +402,30 @@ gimp_mypaint_surface_draw_dab (MyPaintSurface *base_surface,
b = color_b * src_term + b * dst_term;
}
- /* FIXME: Implement mypaint style lock-alpha mode */
- /* FIXME: Implement colorize mode */
+ if (colorize > 0.0f && base_alpha > 0.0f)
+ {
+ alpha = base_alpha * colorize;
+ a = alpha + dst_alpha - alpha * dst_alpha;
+ if (a > 0.0f)
+ {
+ GimpHSL pixel_hsl, out_hsl;
+ GimpRGB pixel_rgb = {color_r, color_g, color_b};
+ GimpRGB out_rgb = {r, g, b};
+ float src_term = alpha / a;
+ float dst_term = 1.0f - src_term;
+
+ gimp_rgb_to_hsl (&pixel_rgb, &pixel_hsl);
+ gimp_rgb_to_hsl (&out_rgb, &out_hsl);
+
+ out_hsl.h = pixel_hsl.h;
+ out_hsl.s = pixel_hsl.s;
+ gimp_hsl_to_rgb (&out_hsl, &out_rgb);
+
+ r = (float)out_rgb.r * src_term + r * dst_term;
+ g = (float)out_rgb.g * src_term + g * dst_term;
+ b = (float)out_rgb.b * src_term + b * dst_term;
+ }
+ }
if (component_mask != GIMP_COMPONENT_MASK_ALL)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]