[PATCH pixman 07/11] pixman-filter: reduce amount of malloc/free/memcpy to generate filter

Bill Spitzak <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <1411783570-24329-8-git-send-email-spitzak__23939.1770367094$1411783608$gmane$org@gmail.com>
---
 pixman/pixman-filter.c |   57 ++++++++++++++++++++----------------------------
 1 file changed, 24 insertions(+), 33 deletions(-)

diff --git a/pixman/pixman-filter.c b/pixman/pixman-filter.c
index 4561af2..1a465ac 100644
--- a/pixman/pixman-filter.c
+++ b/pixman/pixman-filter.c
@@ -225,25 +225,25 @@ integral (pixman_kernel_t reconstruct, double x1,
     }
 }
 
-static pixman_fixed_t *
-create_1d_filter (int             *width,
+static int
+filter_width (pixman_kernel_t reconstruct,
+	      pixman_kernel_t sample,
+	      double scale)
+{
+    return ceil(scale * filters[sample].width + filters[reconstruct].width);
+}
+
+static void
+create_1d_filter (int              width,
 		  pixman_kernel_t  reconstruct,
 		  pixman_kernel_t  sample,
 		  double           scale,
-		  int              n_phases)
+		  int              n_phases,
+		  pixman_fixed_t *p)
 {
-    pixman_fixed_t *params, *p;
     double step;
-    double size;
     int i;
 
-    size = scale * filters[sample].width + filters[reconstruct].width;
-    *width = ceil (size);
-
-    p = params = malloc (*width * n_phases * sizeof (pixman_fixed_t));
-    if (!params)
-        return NULL;
-
     step = 1.0 / n_phases;
 
     for (i = 0; i < n_phases; ++i)
@@ -258,8 +258,8 @@ create_1d_filter (int             *width,
 	 * and sample positions.
 	 */
 
-	x1 = ceil (frac - *width / 2.0 - 0.5);
-        x2 = x1 + *width;
+	x1 = ceil (frac - width / 2.0 - 0.5);
+        x2 = x1 + width;
 
 	total = 0;
         for (x = x1; x < x2; ++x)
@@ -287,7 +287,7 @@ create_1d_filter (int             *width,
         }
 
 	/* Normalize */
-	p -= *width;
+	p -= width;
         total = 1 / total;
         new_total = 0;
 	for (x = x1; x < x2; ++x)
@@ -301,8 +301,6 @@ create_1d_filter (int             *width,
 	if (new_total != pixman_fixed_1)
 	    *(p - *width / 2) += (pixman_fixed_1 - new_total);
     }
-
-    return params;
 }
 
 /* Create the parameter list for a SEPARABLE_CONVOLUTION filter
@@ -321,38 +319,31 @@ pixman_filter_create_separable_convolution (int             *n_values,
 {
     double sx = fabs (pixman_fixed_to_double (scale_x));
     double sy = fabs (pixman_fixed_to_double (scale_y));
-    pixman_fixed_t *horz = NULL, *vert = NULL, *params = NULL;
+    pixman_fixed_t *params;
     int subsample_x, subsample_y;
     int width, height;
 
     subsample_x = (1 << subsample_bits_x);
     subsample_y = (1 << subsample_bits_y);
 
-    horz = create_1d_filter (&width, reconstruct_x, sample_x, sx, subsample_x);
-    vert = create_1d_filter (&height, reconstruct_y, sample_y, sy, subsample_y);
+    width = filter_width (reconstruct_x, sample_x, sx);
+    height = filter_width (reconstruct_y, sample_y, sy);
 
-    if (!horz || !vert)
-        goto out;
-    
     *n_values = 4 + width * subsample_x + height * subsample_y;
-    
+
     params = malloc (*n_values * sizeof (pixman_fixed_t));
     if (!params)
-        goto out;
+        return NULL;
 
     params[0] = pixman_int_to_fixed (width);
     params[1] = pixman_int_to_fixed (height);
     params[2] = pixman_int_to_fixed (subsample_bits_x);
     params[3] = pixman_int_to_fixed (subsample_bits_y);
 
-    memcpy (params + 4, horz,
-	    width * subsample_x * sizeof (pixman_fixed_t));
-    memcpy (params + 4 + width * subsample_x, vert,
-	    height * subsample_y * sizeof (pixman_fixed_t));
-
-out:
-    free (horz);
-    free (vert);
+    create_1d_filter (width, reconstruct_x, sample_x, sx, subsample_x,
+		      params + 4);
+    create_1d_filter (height, reconstruct_y, sample_y, sy, subsample_y,
+		      params + 4 + width * subsample_x);
 
     return params;
 }
-- 
1.7.9.5

-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.