[gthumb] scale: added a CUBIC filter
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] scale: added a CUBIC filter
- Date: Sun, 30 Jun 2013 08:42:24 +0000 (UTC)
commit f712386e43ebaba5179854d8df49d9be73109251
Author: Paolo Bacchilega <paobac src gnome org>
Date: Sat Jun 29 16:05:09 2013 +0200
scale: added a CUBIC filter
gthumb/cairo-scale.c | 37 +++++++++++++++++++++++++++++++++++++
gthumb/cairo-scale.h | 3 ++-
2 files changed, 39 insertions(+), 1 deletions(-)
---
diff --git a/gthumb/cairo-scale.c b/gthumb/cairo-scale.c
index ed2e662..e267514 100644
--- a/gthumb/cairo-scale.c
+++ b/gthumb/cairo-scale.c
@@ -166,6 +166,37 @@ triangle (ScaleReal x)
}
+static ScaleReal Cubic_P0, Cubic_P2, Cubic_P3;
+static ScaleReal Cubic_Q0, Cubic_Q1, Cubic_Q2, Cubic_Q3;
+static gsize coefficients_initialization = 0;
+
+
+static void
+initialize_coefficients (ScaleReal B,
+ ScaleReal C)
+{
+ Cubic_P0 = (6.0 - 2.0 * B) / 6.0;
+ /*Cubic_P1 = 0.0;*/
+ Cubic_P2 = (-18.0 + 12.0 * B + 6.0 * C) / 6.0;
+ Cubic_P3 = ( 12.0 - 9.0 * B - 6.0 * C) / 6.0;
+ Cubic_Q0 = (8.0 * B + 24.0 * C) / 6.0;
+ Cubic_Q1 = (-12.0 * B - 48.0 * C) / 6.0;
+ Cubic_Q2 = (6.0 * B + 30.0 * C) / 6.0;
+ Cubic_Q3 = (-1.0 * B - 6.0 * C) / 6.0;
+}
+
+
+static ScaleReal inline
+cubic (ScaleReal x)
+{
+ if (x < 1.0)
+ return Cubic_P0 + x * (x * (Cubic_P2 + x * Cubic_P3));
+ if (x < 2.0)
+ return Cubic_Q0 + x * (Cubic_Q1 + x * (Cubic_Q2 + x * Cubic_Q3));
+ return 0.0;
+}
+
+
static ScaleReal inline
sinc_fast (ScaleReal x)
{
@@ -207,6 +238,7 @@ const filters[N_SCALE_FILTERS] = {
{ box, .0 },
{ box, .5 },
{ triangle, 1.0 },
+ { cubic, 2.0 },
{ sinc_fast, 3.0 }
};
@@ -449,6 +481,11 @@ _cairo_image_surface_scale (cairo_surface_t *image,
if (scaled == NULL)
return NULL;
+ if (g_once_init_enter (&coefficients_initialization)) {
+ initialize_coefficients (1.0, 0.0);
+ g_once_init_leave (&coefficients_initialization, 1);
+ }
+
resize_filter = resize_filter_create (filter, task);
resize_filter->total_lines = scaled_width + scaled_height;
resize_filter->processed_lines = 0;
diff --git a/gthumb/cairo-scale.h b/gthumb/cairo-scale.h
index 4ce1924..1533ebc 100644
--- a/gthumb/cairo-scale.h
+++ b/gthumb/cairo-scale.h
@@ -32,9 +32,10 @@ G_BEGIN_DECLS
typedef enum /*< skip >*/ {
- SCALE_FILTER_POINT = 0,
+ SCALE_FILTER_POINT,
SCALE_FILTER_BOX,
SCALE_FILTER_TRIANGLE,
+ SCALE_FILTER_CUBIC,
SCALE_FILTER_LANCZOS_3,
N_SCALE_FILTERS,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]