[gimp] app: inline the inner curve mapping function for internal use
- From: Michael Natterer <mitch src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gimp] app: inline the inner curve mapping function for internal use
- Date: Mon, 28 Dec 2009 19:55:51 +0000 (UTC)
commit 79c40235529abba485809ceaeb1d708a1ae869fc
Author: Michael Natterer <mitch gimp org>
Date: Mon Dec 28 20:50:26 2009 +0100
app: inline the inner curve mapping function for internal use
Makes gegl-curves about 1/3 faster for a simple case where only
the "value" curve was changed. The speedup should be better when
multiple curves are changed from the identity mapping.
app/core/gimpcurve-map.c | 116 ++++++++++++++++++++++++---------------------
1 files changed, 62 insertions(+), 54 deletions(-)
---
diff --git a/app/core/gimpcurve-map.c b/app/core/gimpcurve-map.c
index aaea7ae..3d02c49 100644
--- a/app/core/gimpcurve-map.c
+++ b/app/core/gimpcurve-map.c
@@ -39,11 +39,13 @@ enum
CURVE_ALPHA = 1 << 4
};
-static guint gimp_curve_get_apply_mask (GimpCurve *curve_colors,
- GimpCurve *curve_red,
- GimpCurve *curve_green,
- GimpCurve *curve_blue,
- GimpCurve *curve_alpha);
+static guint gimp_curve_get_apply_mask (GimpCurve *curve_colors,
+ GimpCurve *curve_red,
+ GimpCurve *curve_green,
+ GimpCurve *curve_blue,
+ GimpCurve *curve_alpha);
+static inline gdouble gimp_curve_map_value_inline (GimpCurve *curve,
+ gdouble value);
gdouble
@@ -52,35 +54,7 @@ gimp_curve_map_value (GimpCurve *curve,
{
g_return_val_if_fail (GIMP_IS_CURVE (curve), 0.0);
- if (curve->identity)
- {
- return value;
- }
-
- if (value < 0.0)
- {
- return curve->samples[0];
- }
- else if (value >= 1.0)
- {
- return curve->samples[curve->n_samples - 1];
- }
- else /* interpolate the curve */
- {
- gdouble f;
- gint index;
-
- /* map value to the sample space */
- value = value * (curve->n_samples - 1);
-
- /* determine the indices of the closest sample points */
- index = (gint) value;
-
- /* calculate the position between the sample points */
- f = value - index;
-
- return (1.0 - f) * curve->samples[index] + f * curve->samples[index + 1];
- }
+ return gimp_curve_map_value_inline (curve, value);
}
void
@@ -112,9 +86,9 @@ gimp_curve_map_pixels (GimpCurve *curve_colors,
case CURVE_COLORS:
while (samples--)
{
- dest[0] = gimp_curve_map_value (curve_colors, src[0]);
- dest[1] = gimp_curve_map_value (curve_colors, src[1]);
- dest[2] = gimp_curve_map_value (curve_colors, src[2]);
+ dest[0] = gimp_curve_map_value_inline (curve_colors, src[0]);
+ dest[1] = gimp_curve_map_value_inline (curve_colors, src[1]);
+ dest[2] = gimp_curve_map_value_inline (curve_colors, src[2]);
/* don't apply the colors curve to the alpha channel */
dest[3] = src[3];
@@ -126,7 +100,7 @@ gimp_curve_map_pixels (GimpCurve *curve_colors,
case CURVE_RED:
while (samples--)
{
- dest[0] = gimp_curve_map_value (curve_red, src[0]);
+ dest[0] = gimp_curve_map_value_inline (curve_red, src[0]);
dest[1] = src[1];
dest[2] = src[2];
dest[3] = src[3];
@@ -140,7 +114,7 @@ gimp_curve_map_pixels (GimpCurve *curve_colors,
while (samples--)
{
dest[0] = src[0];
- dest[1] = gimp_curve_map_value (curve_green, src[1]);
+ dest[1] = gimp_curve_map_value_inline (curve_green, src[1]);
dest[2] = src[2];
dest[3] = src[3];
@@ -154,7 +128,7 @@ gimp_curve_map_pixels (GimpCurve *curve_colors,
{
dest[0] = src[0];
dest[1] = src[1];
- dest[2] = gimp_curve_map_value (curve_blue, src[2]);
+ dest[2] = gimp_curve_map_value_inline (curve_blue, src[2]);
dest[3] = src[3];
src += 4;
@@ -168,7 +142,7 @@ gimp_curve_map_pixels (GimpCurve *curve_colors,
dest[0] = src[0];
dest[1] = src[1];
dest[2] = src[2];
- dest[3] = gimp_curve_map_value (curve_alpha, src[3]);
+ dest[3] = gimp_curve_map_value_inline (curve_alpha, src[3]);
src += 4;
dest += 4;
@@ -178,9 +152,9 @@ gimp_curve_map_pixels (GimpCurve *curve_colors,
case (CURVE_RED | CURVE_GREEN | CURVE_BLUE):
while (samples--)
{
- dest[0] = gimp_curve_map_value (curve_red, src[0]);
- dest[1] = gimp_curve_map_value (curve_green, src[1]);
- dest[2] = gimp_curve_map_value (curve_blue, src[2]);
+ dest[0] = gimp_curve_map_value_inline (curve_red, src[0]);
+ dest[1] = gimp_curve_map_value_inline (curve_green, src[1]);
+ dest[2] = gimp_curve_map_value_inline (curve_blue, src[2]);
dest[3] = src[3];
src += 4;
@@ -191,17 +165,17 @@ gimp_curve_map_pixels (GimpCurve *curve_colors,
default:
while (samples--)
{
- dest[0] = gimp_curve_map_value (curve_colors,
- gimp_curve_map_value (curve_red,
- src[0]));
- dest[1] = gimp_curve_map_value (curve_colors,
- gimp_curve_map_value (curve_green,
- src[1]));
- dest[2] = gimp_curve_map_value (curve_colors,
- gimp_curve_map_value (curve_blue,
- src[2]));
+ dest[0] = gimp_curve_map_value_inline (curve_colors,
+ gimp_curve_map_value_inline (curve_red,
+ src[0]));
+ dest[1] = gimp_curve_map_value_inline (curve_colors,
+ gimp_curve_map_value_inline (curve_green,
+ src[1]));
+ dest[2] = gimp_curve_map_value_inline (curve_colors,
+ gimp_curve_map_value_inline (curve_blue,
+ src[2]));
/* don't apply the colors curve to the alpha channel */
- dest[3] = gimp_curve_map_value (curve_alpha, src[3]);
+ dest[3] = gimp_curve_map_value_inline (curve_alpha, src[3]);
src += 4;
dest += 4;
@@ -224,3 +198,37 @@ gimp_curve_get_apply_mask (GimpCurve *curve_colors,
(gimp_curve_is_identity (curve_alpha) ? 0 : CURVE_ALPHA));
}
+static inline gdouble
+gimp_curve_map_value_inline (GimpCurve *curve,
+ gdouble value)
+{
+ if (curve->identity)
+ {
+ return value;
+ }
+
+ if (value < 0.0)
+ {
+ return curve->samples[0];
+ }
+ else if (value >= 1.0)
+ {
+ return curve->samples[curve->n_samples - 1];
+ }
+ else /* interpolate the curve */
+ {
+ gdouble f;
+ gint index;
+
+ /* map value to the sample space */
+ value = value * (curve->n_samples - 1);
+
+ /* determine the indices of the closest sample points */
+ index = (gint) value;
+
+ /* calculate the position between the sample points */
+ f = value - index;
+
+ return (1.0 - f) * curve->samples[index] + f * curve->samples[index + 1];
+ }
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]