We never expect to fail to find the appropriate function as the
general_composite_rect should always match. So if somehow we fallthrough
the search, emit a _pixman_log_error() and return a dummy function.

Note that we remove some conditionals and a level of indentation hence a
large amount of code movement. This also reveals that in a few places we
are duplicating stack variables that can be eliminated later.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 pixman/pixman-fast-path.c      |  224 +++++++++++++++++++---------------------
 pixman/pixman-glyph.c          |    8 +-
 pixman/pixman-implementation.c |   16 ++-
 pixman/pixman-private.h        |    4 +-
 pixman/pixman.c                |   60 ++++++-----
 5 files changed, 153 insertions(+), 159 deletions(-)

diff --git a/pixman/pixman-fast-path.c b/pixman/pixman-fast-path.c
index c625e0c..1ac2d11 100644
--- a/pixman/pixman-fast-path.c
+++ b/pixman/pixman-fast-path.c
@@ -1243,6 +1243,18 @@ fast_composite_tiled_repeat (pixman_implementation_t 
*imp,
     pixman_composite_func_t func;
     pixman_format_code_t mask_format;
     uint32_t src_flags, mask_flags;
+    int32_t sx, sy;
+    int32_t width_remain;
+    int32_t num_pixels;
+    int32_t src_width;
+    int32_t i, j;
+    pixman_image_t extended_src_image;
+    uint32_t extended_src[REPEAT_MIN_WIDTH * 2];
+    pixman_bool_t need_src_extension;
+    uint32_t *src_line;
+    int32_t src_stride;
+    int32_t src_bpp;
+    pixman_composite_info_t info2 = *info;
 
     src_flags = (info->src_flags & ~FAST_PATH_NORMAL_REPEAT) |
                    FAST_PATH_SAMPLES_COVER_CLIP_NEAREST;
@@ -1258,149 +1270,131 @@ fast_composite_tiled_repeat (pixman_implementation_t 
*imp,
        mask_flags = FAST_PATH_IS_OPAQUE;
     }
 
-    if (_pixman_implementation_lookup_composite (
-           imp->toplevel, info->op,
-           src_image->common.extended_format_code, src_flags,
-           mask_format, mask_flags,
-           dest_image->common.extended_format_code, info->dest_flags,
-           &imp, &func))
+    _pixman_implementation_lookup_composite (
+       imp->toplevel, info->op,
+       src_image->common.extended_format_code, src_flags,
+       mask_format, mask_flags,
+       dest_image->common.extended_format_code, info->dest_flags,
+       &imp, &func);
+
+    src_bpp = PIXMAN_FORMAT_BPP (src_image->bits.format);
+
+    if (src_image->bits.width < REPEAT_MIN_WIDTH               &&
+       (src_bpp == 32 || src_bpp == 16 || src_bpp == 8)        &&
+       !src_image->bits.indexed)
     {
-       int32_t sx, sy;
-       int32_t width_remain;
-       int32_t num_pixels;
-       int32_t src_width;
-       int32_t i, j;
-       pixman_image_t extended_src_image;
-       uint32_t extended_src[REPEAT_MIN_WIDTH * 2];
-       pixman_bool_t need_src_extension;
-       uint32_t *src_line;
-       int32_t src_stride;
-       int32_t src_bpp;
-       pixman_composite_info_t info2 = *info;
-
-       src_bpp = PIXMAN_FORMAT_BPP (src_image->bits.format);
-
-       if (src_image->bits.width < REPEAT_MIN_WIDTH            &&
-           (src_bpp == 32 || src_bpp == 16 || src_bpp == 8)    &&
-           !src_image->bits.indexed)
-       {
-           sx = src_x;
-           sx = MOD (sx, src_image->bits.width);
-           sx += width;
-           src_width = 0;
+       sx = src_x;
+       sx = MOD (sx, src_image->bits.width);
+       sx += width;
+       src_width = 0;
 
-           while (src_width < REPEAT_MIN_WIDTH && src_width <= sx)
-               src_width += src_image->bits.width;
+       while (src_width < REPEAT_MIN_WIDTH && src_width <= sx)
+           src_width += src_image->bits.width;
 
-           src_stride = (src_width * (src_bpp >> 3) + 3) / (int) sizeof 
(uint32_t);
+       src_stride = (src_width * (src_bpp >> 3) + 3) / (int) sizeof (uint32_t);
 
-           /* Initialize/validate stack-allocated temporary image */
-           _pixman_bits_image_init (&extended_src_image, 
src_image->bits.format,
-                                    src_width, 1, &extended_src[0], src_stride,
-                                    FALSE);
-           _pixman_image_validate (&extended_src_image);
+       /* Initialize/validate stack-allocated temporary image */
+       _pixman_bits_image_init (&extended_src_image, src_image->bits.format,
+                                src_width, 1, &extended_src[0], src_stride,
+                                FALSE);
+       _pixman_image_validate (&extended_src_image);
 
-           info2.src_image = &extended_src_image;
-           need_src_extension = TRUE;
-       }
-       else
-       {
-           src_width = src_image->bits.width;
-           need_src_extension = FALSE;
-       }
+       info2.src_image = &extended_src_image;
+       need_src_extension = TRUE;
+    }
+    else
+    {
+       src_width = src_image->bits.width;
+       need_src_extension = FALSE;
+    }
 
-       sx = src_x;
-       sy = src_y;
+    sx = src_x;
+    sy = src_y;
 
-       while (--height >= 0)
-       {
-           sx = MOD (sx, src_width);
-           sy = MOD (sy, src_image->bits.height);
+    while (--height >= 0)
+    {
+       sx = MOD (sx, src_width);
+       sy = MOD (sy, src_image->bits.height);
 
-           if (need_src_extension)
+       if (need_src_extension)
+       {
+           if (src_bpp == 32)
            {
-               if (src_bpp == 32)
-               {
-                   PIXMAN_IMAGE_GET_LINE (src_image, 0, sy, uint32_t, 
src_stride, src_line, 1);
+               PIXMAN_IMAGE_GET_LINE (src_image, 0, sy, uint32_t, src_stride, 
src_line, 1);
 
-                   for (i = 0; i < src_width; )
-                   {
-                       for (j = 0; j < src_image->bits.width; j++, i++)
-                           extended_src[i] = src_line[j];
-                   }
-               }
-               else if (src_bpp == 16)
+               for (i = 0; i < src_width; )
                {
-                   uint16_t *src_line_16;
-
-                   PIXMAN_IMAGE_GET_LINE (src_image, 0, sy, uint16_t, 
src_stride,
-                                          src_line_16, 1);
-                   src_line = (uint32_t*)src_line_16;
-
-                   for (i = 0; i < src_width; )
-                   {
-                       for (j = 0; j < src_image->bits.width; j++, i++)
-                           ((uint16_t*)extended_src)[i] = 
((uint16_t*)src_line)[j];
-                   }
+                   for (j = 0; j < src_image->bits.width; j++, i++)
+                       extended_src[i] = src_line[j];
                }
-               else if (src_bpp == 8)
-               {
-                   uint8_t *src_line_8;
+           }
+           else if (src_bpp == 16)
+           {
+               uint16_t *src_line_16;
 
-                   PIXMAN_IMAGE_GET_LINE (src_image, 0, sy, uint8_t, 
src_stride,
-                                          src_line_8, 1);
-                   src_line = (uint32_t*)src_line_8;
+               PIXMAN_IMAGE_GET_LINE (src_image, 0, sy, uint16_t, src_stride,
+                                      src_line_16, 1);
+               src_line = (uint32_t*)src_line_16;
 
-                   for (i = 0; i < src_width; )
-                   {
-                       for (j = 0; j < src_image->bits.width; j++, i++)
-                           ((uint8_t*)extended_src)[i] = 
((uint8_t*)src_line)[j];
-                   }
+               for (i = 0; i < src_width; )
+               {
+                   for (j = 0; j < src_image->bits.width; j++, i++)
+                       ((uint16_t*)extended_src)[i] = ((uint16_t*)src_line)[j];
                }
-
-               info2.src_y = 0;
            }
-           else
+           else if (src_bpp == 8)
            {
-               info2.src_y = sy;
+               uint8_t *src_line_8;
+
+               PIXMAN_IMAGE_GET_LINE (src_image, 0, sy, uint8_t, src_stride,
+                                      src_line_8, 1);
+               src_line = (uint32_t*)src_line_8;
+
+               for (i = 0; i < src_width; )
+               {
+                   for (j = 0; j < src_image->bits.width; j++, i++)
+                       ((uint8_t*)extended_src)[i] = ((uint8_t*)src_line)[j];
+               }
            }
 
-           width_remain = width;
+           info2.src_y = 0;
+       }
+       else
+       {
+           info2.src_y = sy;
+       }
 
-           while (width_remain > 0)
-           {
-               num_pixels = src_width - sx;
+       width_remain = width;
 
-               if (num_pixels > width_remain)
-                   num_pixels = width_remain;
+       while (width_remain > 0)
+       {
+           num_pixels = src_width - sx;
 
-               info2.src_x = sx;
-               info2.width = num_pixels;
-               info2.height = 1;
+           if (num_pixels > width_remain)
+               num_pixels = width_remain;
 
-               func (imp, &info2);
+           info2.src_x = sx;
+           info2.width = num_pixels;
+           info2.height = 1;
 
-               width_remain -= num_pixels;
-               info2.mask_x += num_pixels;
-               info2.dest_x += num_pixels;
-               sx = 0;
-           }
+           func (imp, &info2);
 
-           sx = src_x;
-           sy++;
-           info2.mask_x = info->mask_x;
-           info2.mask_y++;
-           info2.dest_x = info->dest_x;
-           info2.dest_y++;
+           width_remain -= num_pixels;
+           info2.mask_x += num_pixels;
+           info2.dest_x += num_pixels;
+           sx = 0;
        }
 
-       if (need_src_extension)
-           _pixman_image_fini (&extended_src_image);
-    }
-    else
-    {
-       _pixman_log_error (FUNC, "Didn't find a suitable function ");
+       sx = src_x;
+       sy++;
+       info2.mask_x = info->mask_x;
+       info2.mask_y++;
+       info2.dest_x = info->dest_x;
+       info2.dest_y++;
     }
+
+    if (need_src_extension)
+       _pixman_image_fini (&extended_src_image);
 }
 
 /* Use more unrolling for src_0565_0565 because it is typically CPU bound */
diff --git a/pixman/pixman-glyph.c b/pixman/pixman-glyph.c
index 6d2c8bb..5a271b6 100644
--- a/pixman/pixman-glyph.c
+++ b/pixman/pixman-glyph.c
@@ -463,16 +463,13 @@ pixman_composite_glyphs_no_mask (pixman_op_t            
op,
                {
                    glyph_format = glyph_img->common.extended_format_code;
                    glyph_flags = glyph_img->common.flags;
-                   
+
                    _pixman_implementation_lookup_composite (
                        get_implementation(), op,
                        src->common.extended_format_code, src->common.flags,
                        glyph_format, glyph_flags | extra,
                        dest_format, dest_flags,
                        &implementation, &func);
-
-                   if (!func)
-                       goto out;
                }
 
                info.src_x = src_x + composite_box.x1 - dest_x;
@@ -582,9 +579,6 @@ add_glyphs (pixman_glyph_cache_t *cache,
                mask_format, info.mask_flags,
                dest_format, dest_flags,
                &implementation, &func);
-
-           if (!func)
-               goto out;
        }
 
        glyph_box.x1 = glyphs[i].x - glyph->origin_x + off_x;
diff --git a/pixman/pixman-implementation.c b/pixman/pixman-implementation.c
index ec467a6..05cb5ea 100644
--- a/pixman/pixman-implementation.c
+++ b/pixman/pixman-implementation.c
@@ -65,7 +65,13 @@ typedef struct
 
 PIXMAN_DEFINE_THREAD_LOCAL (cache_t, fast_path_cache);
 
-pixman_bool_t
+static void
+dummy_composite_rect (pixman_implementation_t *imp,
+                     pixman_composite_info_t *info)
+{
+}
+
+void
 _pixman_implementation_lookup_composite (pixman_implementation_t  *toplevel,
                                         pixman_op_t               op,
                                         pixman_format_code_t      src_format,
@@ -142,7 +148,11 @@ _pixman_implementation_lookup_composite 
(pixman_implementation_t  *toplevel,
            ++info;
        }
     }
-    return FALSE;
+
+    /* We should never reach this point */
+    _pixman_log_error (FUNC, "No known composite function\n");
+    *out_imp = NULL;
+    *out_func = dummy_composite_rect;
 
 update_cache:
     if (i)
@@ -160,8 +170,6 @@ update_cache:
        cache->cache[0].fast_path.dest_flags = dest_flags;
        cache->cache[0].fast_path.func = *out_func;
     }
-
-    return TRUE;
 }
 
 pixman_combine_32_func_t
diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h
index e5ab873..3981873 100644
--- a/pixman/pixman-private.h
+++ b/pixman/pixman-private.h
@@ -497,7 +497,7 @@ pixman_implementation_t *
 _pixman_implementation_create (pixman_implementation_t *fallback,
                               const pixman_fast_path_t *fast_paths);
 
-pixman_bool_t
+void
 _pixman_implementation_lookup_composite (pixman_implementation_t  *toplevel,
                                         pixman_op_t               op,
                                         pixman_format_code_t      src_format,
@@ -1052,7 +1052,7 @@ _pixman_log_error (const char *function, const char 
*message);
 
 #else
 
-#define _pixman_log_error(f,m) do { } while (0)                                
\
+#define _pixman_log_error(f,m) do { } while (0)
 
 #define return_if_fail(expr)                                           \
     do                                                                  \
diff --git a/pixman/pixman.c b/pixman/pixman.c
index 3fabed1..97a4590 100644
--- a/pixman/pixman.c
+++ b/pixman/pixman.c
@@ -586,6 +586,9 @@ pixman_image_composite32 (pixman_op_t      op,
     pixman_box32_t extents;
     pixman_implementation_t *imp;
     pixman_composite_func_t func;
+    pixman_composite_info_t info;
+    const pixman_box32_t *pbox;
+    int n;
 
     _pixman_image_validate (src);
     if (mask)
@@ -678,40 +681,35 @@ pixman_image_composite32 (pixman_op_t      op,
      */
     op = optimize_operator (op, src_flags, mask_flags, dest_flags);
 
-    if (_pixman_implementation_lookup_composite (
-           get_implementation (), op,
-           src_format, src_flags, mask_format, mask_flags, dest_format, 
dest_flags,
-           &imp, &func))
-    {
-       pixman_composite_info_t info;
-       const pixman_box32_t *pbox;
-       int n;
+    _pixman_implementation_lookup_composite (
+       get_implementation (), op,
+       src_format, src_flags, mask_format, mask_flags, dest_format, dest_flags,
+       &imp, &func);
 
-       info.op = op;
-       info.src_image = src;
-       info.mask_image = mask;
-       info.dest_image = dest;
-       info.src_flags = src_flags;
-       info.mask_flags = mask_flags;
-       info.dest_flags = dest_flags;
+    info.op = op;
+    info.src_image = src;
+    info.mask_image = mask;
+    info.dest_image = dest;
+    info.src_flags = src_flags;
+    info.mask_flags = mask_flags;
+    info.dest_flags = dest_flags;
 
-       pbox = pixman_region32_rectangles (&region, &n);
+    pbox = pixman_region32_rectangles (&region, &n);
 
-       while (n--)
-       {
-           info.src_x = pbox->x1 + src_x - dest_x;
-           info.src_y = pbox->y1 + src_y - dest_y;
-           info.mask_x = pbox->x1 + mask_x - dest_x;
-           info.mask_y = pbox->y1 + mask_y - dest_y;
-           info.dest_x = pbox->x1;
-           info.dest_y = pbox->y1;
-           info.width = pbox->x2 - pbox->x1;
-           info.height = pbox->y2 - pbox->y1;
-
-           func (imp, &info);
-
-           pbox++;
-       }
+    while (n--)
+    {
+       info.src_x = pbox->x1 + src_x - dest_x;
+       info.src_y = pbox->y1 + src_y - dest_y;
+       info.mask_x = pbox->x1 + mask_x - dest_x;
+       info.mask_y = pbox->y1 + mask_y - dest_y;
+       info.dest_x = pbox->x1;
+       info.dest_y = pbox->y1;
+       info.width = pbox->x2 - pbox->x1;
+       info.height = pbox->y2 - pbox->y1;
+
+       func (imp, &info);
+
+       pbox++;
     }
 
 out:
-- 
1.7.10.4

_______________________________________________
Pixman mailing list
Pixman@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/pixman

Reply via email to