From: Søren Sandmann Pedersen <s...@redhat.com>

This is set if the image can't be used for compositing, such as when
it's bigger than 0xffff or has size 0.
---
 pixman/pixman-image.c   |   10 ++++++++++
 pixman/pixman-private.h |    1 +
 pixman/pixman.c         |   10 +++-------
 3 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/pixman/pixman-image.c b/pixman/pixman-image.c
index 029a1df..512142d 100644
--- a/pixman/pixman-image.c
+++ b/pixman/pixman-image.c
@@ -398,6 +398,16 @@ compute_image_info (pixman_image_t *image)
        {
            code = image->bits.format;
 
+           /* During repeat mode calculations we might convert the
+            * width/height of an image to fixed 16.16, so we need
+            * them to be smaller than 16 bits.
+            */
+           if (image->bits.width == 0      || image->bits.height == 0 ||
+               image->bits.width >= 0xffff || image->bits.height >= 0xffff)
+           {
+               flags |= FAST_PATH_UNCOMPOSITABLE;
+           }
+           
            if (!image->common.transform &&
                image->common.repeat == PIXMAN_REPEAT_NORMAL)
            {
diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h
index d85868f..b05a68d 100644
--- a/pixman/pixman-private.h
+++ b/pixman/pixman-private.h
@@ -572,6 +572,7 @@ _pixman_choose_implementation (void);
 #define FAST_PATH_NO_NORMAL_REPEAT             (1 << 21)
 #define FAST_PATH_HAS_TRANSFORM                        (1 << 22)
 #define FAST_PATH_SAMPLES_OPAQUE               (1 << 23)
+#define FAST_PATH_UNCOMPOSITABLE               (1 << 24)
 
 #define FAST_PATH_PAD_REPEAT                                           \
     (FAST_PATH_NO_NONE_REPEAT          |                               \
diff --git a/pixman/pixman.c b/pixman/pixman.c
index 285bbfc..ea048cc 100644
--- a/pixman/pixman.c
+++ b/pixman/pixman.c
@@ -715,13 +715,6 @@ analyze_extent (pixman_image_t *image, int x, int y,
     transform = image->common.transform;
     if (image->common.type == BITS)
     {
-       /* During repeat mode calculations we might convert the
-        * width/height of an image to fixed 16.16, so we need
-        * them to be smaller than 16 bits.
-        */
-       if (image->bits.width >= 0x7fff || image->bits.height >= 0x7fff)
-           return FALSE;
-
        if (image->common.repeat == PIXMAN_REPEAT_NONE &&
            (x > extents->x1 || y > extents->y1 ||
             x + image->bits.width < extents->x2 ||
@@ -882,6 +875,9 @@ pixman_image_composite32 (pixman_op_t      op,
     dest_format = dest->common.extended_format_code;
     dest_flags = dest->common.flags;
 
+    if ((src_flags | dest_flags | mask_flags) & FAST_PATH_UNCOMPOSITABLE)
+       return;
+    
     /* Check for pixbufs */
     if ((mask_format == PIXMAN_a8r8g8b8 || mask_format == PIXMAN_a8b8g8r8) &&
        (src->type == BITS && src->bits.bits == mask->bits.bits)           &&
-- 
1.7.1.1

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

Reply via email to