[cairo] [PATCH pixman 3/4] Changed PIXMAN_KERNEL enums

Bill Spitzak spitzak at gmail.com
Thu Jul 31 15:16:50 PDT 2014


Added TENT filter.

Renamed IMPULSE to NEAREST as this is the term used elsewhere

Renamed other values to match what they are now producing.

Add back-compatibility #define for old names.
---
 demos/scale.c          |    9 +++++----
 pixman/pixman-filter.c |   51 ++++++++++++++++++++++++++++++++++++------------
 pixman/pixman.h        |   17 +++++++++++-----
 3 files changed, 55 insertions(+), 22 deletions(-)

diff --git a/demos/scale.c b/demos/scale.c
index 0b6c715..bfd34f6 100644
--- a/demos/scale.c
+++ b/demos/scale.c
@@ -71,13 +71,14 @@ typedef struct
 static const named_int_t filters[] =
 {
     { "Box",			PIXMAN_KERNEL_BOX },
-    { "Impulse",		PIXMAN_KERNEL_IMPULSE },
+    { "Nearest",		PIXMAN_KERNEL_NEAREST },
     { "Linear",			PIXMAN_KERNEL_LINEAR },
-    { "Cubic",			PIXMAN_KERNEL_CUBIC },
-    { "Lanczos2",		PIXMAN_KERNEL_LANCZOS2 },
+    { "Tent",			PIXMAN_KERNEL_TENT },
+    { "Mitchell",		PIXMAN_KERNEL_MITCHELL },
+    { "Catmull-Rom",		PIXMAN_KERNEL_CATMULL_ROM },
     { "Lanczos3",		PIXMAN_KERNEL_LANCZOS3 },
     { "Lanczos3 Stretched",	PIXMAN_KERNEL_LANCZOS3_STRETCHED },
-    { "Gaussian",		PIXMAN_KERNEL_GAUSSIAN },
+    { "Notch",			PIXMAN_KERNEL_NOTCH },
 };
 
 static const named_int_t repeats[] =
diff --git a/pixman/pixman-filter.c b/pixman/pixman-filter.c
index 253ed90..9446c55 100644
--- a/pixman/pixman-filter.c
+++ b/pixman/pixman-filter.c
@@ -53,20 +53,20 @@ typedef struct
     kernel_width_func_t	width;
 } filter_info_t;
 
-/* PIXMAN_KERNEL_IMPULSE: Returns pixel nearest the center.  This
+/* PIXMAN_KERNEL_NEAREST: Returns pixel nearest the center.  This
  * matches PIXMAN_FILTER_NEAREST. This is useful if you wish to
  * combine the result of nearest in one direction with another filter
  * in the other.
  */
 
 static double
-impulse_kernel (double x, double r)
+nearest_kernel (double x, double r)
 {
     return 1;
 }
 
 static int
-impulse_width (double r)
+nearest_width (double r)
 {
     return 1;
 }
@@ -250,17 +250,42 @@ nice_width (double r)
     return MAX (2.0, ceil (r * 8));
 }
 
+/* PIXMAN_KERNEL_TENT: Triangle of width 2r. Lots of software uses
+ * this as a "better" filter, twice the size of a box but smaller than
+ * a cubic.
+ *
+ * When r == 1.0, PIXMAN_KERNEL_BOX, PIXMAN_KERNEL_LINEAR, and
+ * PIXMAN_KERNEL_TENT all produce the same filter, allowing them to be
+ * exchanged at this point.
+ */
+
+static double
+tent_kernel (double x, double r)
+{
+    if (r < 1.0)
+	return box_kernel(x, r);
+    else
+	return MAX (1.0 - fabs(x / r), 0.0);
+}
+
+static int
+tent_width (double r)
+{
+    return r < 1.0 ? 2 : ceil(2 * r);
+}
+
 
 static const filter_info_t filters[] =
 {
-    { PIXMAN_KERNEL_IMPULSE,	        impulse_kernel,   impulse_width },
-    { PIXMAN_KERNEL_BOX,	        box_kernel,       box_width },
-    { PIXMAN_KERNEL_LINEAR,	        linear_kernel,    linear_width },
-    { PIXMAN_KERNEL_CUBIC,		mitchell_kernel,  cubic_width },
-    { PIXMAN_KERNEL_GAUSSIAN,	        notch_kernel,     cubic_width },
-    { PIXMAN_KERNEL_LANCZOS2,	        cubic_kernel,     cubic_width },
-    { PIXMAN_KERNEL_LANCZOS3,	        lanczos3_kernel,  lanczos3_width },
-    { PIXMAN_KERNEL_LANCZOS3_STRETCHED, nice_kernel,      nice_width },
+    { PIXMAN_KERNEL_NEAREST,		nearest_kernel,   nearest_width },
+    { PIXMAN_KERNEL_BOX,		box_kernel,       box_width },
+    { PIXMAN_KERNEL_LINEAR,		linear_kernel,    linear_width },
+    { PIXMAN_KERNEL_MITCHELL,		mitchell_kernel,  cubic_width },
+    { PIXMAN_KERNEL_NOTCH,		notch_kernel,     cubic_width },
+    { PIXMAN_KERNEL_CATMULL_ROM,	cubic_kernel,     cubic_width },
+    { PIXMAN_KERNEL_LANCZOS3,		lanczos3_kernel,  lanczos3_width },
+    { PIXMAN_KERNEL_LANCZOS3_STRETCHED,	nice_kernel,      nice_width },
+    { PIXMAN_KERNEL_TENT,		tent_kernel,	  tent_width }
 };
 
 
@@ -275,7 +300,7 @@ static void get_filter(pixman_kernel_t filter, double r,
     double step = 1.0 / n_phases;
     kernel_func_t func = filters[filter].func;
 
-    /* special-case the impulse filter: */
+    /* special-case the nearest filter: */
     if (width <= 1)
     {
 	for (i = 0; i < n_phases; ++i)
@@ -342,7 +367,7 @@ pixman_filter_create_separable_convolution (int             *n_values,
      * The old version did have a quirk that may be relied on and is
      * useful: If the reconstruct was BOX then the result was "boxy"
      * pixels, which is the result of a filter of scale < 1.  Both
-     * this and IMPULSE (which was broken) produce this effect.  If
+     * this and NEAREST (which was broken) produce this effect.  If
      * BOX reconstruct is really wanted, use LINEAR for it as it is
      * the same at scale=1.
      */
diff --git a/pixman/pixman.h b/pixman/pixman.h
index 509ba5e..61ca567 100644
--- a/pixman/pixman.h
+++ b/pixman/pixman.h
@@ -834,16 +834,23 @@ pixman_format_code_t pixman_image_get_format	     (pixman_image_t		   *image);
 
 typedef enum
 {
-    PIXMAN_KERNEL_IMPULSE,
+    PIXMAN_KERNEL_NEAREST,
     PIXMAN_KERNEL_BOX,
     PIXMAN_KERNEL_LINEAR,
-    PIXMAN_KERNEL_CUBIC,
-    PIXMAN_KERNEL_GAUSSIAN,
-    PIXMAN_KERNEL_LANCZOS2,
+    PIXMAN_KERNEL_MITCHELL,
+    PIXMAN_KERNEL_NOTCH,
+    PIXMAN_KERNEL_CATMULL_ROM,
     PIXMAN_KERNEL_LANCZOS3,
-    PIXMAN_KERNEL_LANCZOS3_STRETCHED       /* Jim Blinn's 'nice' filter */
+    PIXMAN_KERNEL_LANCZOS3_STRETCHED,	/* Jim Blinn's 'nice' filter */
+    PIXMAN_KERNEL_TENT
 } pixman_kernel_t;
 
+/* Back-compatibility enums, do not use: */
+#define PIXMAN_KERNEL_IMPULSE	PIXMAN_KERNEL_NEAREST
+#define PIXMAN_KERNEL_CUBIC	PIXMAN_KERNEL_MITCHELL
+#define PIXMAN_KERNEL_LANCZOS2	PIXMAN_KERNEL_CATMULL_ROM
+#define PIXMAN_KERNEL_GAUSSIAN	PIXMAN_KERNEL_NOTCH
+
 /* Create the parameter list for a SEPARABLE_CONVOLUTION filter
  * with the given kernels and scale parameters.
  */
-- 
1.7.9.5



More information about the cairo mailing list