Compute the image flags at validation time instead of composite time
authorSøren Sandmann Pedersen <sandmann@redhat.com>
Fri, 18 Sep 2009 07:54:36 +0000 (03:54 -0400)
committerSøren Sandmann Pedersen <ssp@redhat.com>
Thu, 25 Feb 2010 04:20:27 +0000 (23:20 -0500)
Instead of computing all the image flags at composite time, we compute
them once in _pixman_image_validate() and cache them in the image.

pixman/pixman-image.c
pixman/pixman-private.h
pixman/pixman.c

index 6036c56..880c49f 100644 (file)
@@ -243,12 +243,69 @@ _pixman_image_reset_clip_region (pixman_image_t *image)
     image->common.have_clip_region = FALSE;
 }
 
+static void
+compute_flags (pixman_image_t *image)
+{
+    uint32_t flags = 0;
+
+    if (!image->common.transform)
+    {
+       flags |= FAST_PATH_ID_TRANSFORM;
+    }
+    else if (image->common.transform &&
+            image->common.transform->matrix[0][1] == 0 &&
+            image->common.transform->matrix[1][0] == 0 &&
+            image->common.transform->matrix[2][0] == 0 &&
+            image->common.transform->matrix[2][1] == 0 &&
+            image->common.transform->matrix[2][2] == pixman_fixed_1)
+    {
+       flags |= FAST_PATH_SCALE_TRANSFORM;
+    }
+
+    if (!image->common.alpha_map)
+       flags |= FAST_PATH_NO_ALPHA_MAP;
+
+    if (image->common.filter != PIXMAN_FILTER_CONVOLUTION)
+    {
+       flags |= FAST_PATH_NO_CONVOLUTION_FILTER;
+
+       if (image->common.filter == PIXMAN_FILTER_NEAREST)
+           flags |= FAST_PATH_NEAREST_FILTER;
+    }
+
+    if (image->common.repeat != PIXMAN_REPEAT_PAD)
+       flags |= FAST_PATH_NO_PAD_REPEAT;
+
+    if (image->common.repeat != PIXMAN_REPEAT_REFLECT)
+       flags |= FAST_PATH_NO_REFLECT_REPEAT;
+
+    flags |= (FAST_PATH_NO_ACCESSORS | FAST_PATH_NO_WIDE_FORMAT);
+    if (image->common.type == BITS)
+    {
+       if (image->bits.read_func || image->bits.write_func)
+           flags &= ~FAST_PATH_NO_ACCESSORS;
+
+       if (PIXMAN_FORMAT_IS_WIDE (image->bits.format))
+           flags &= ~FAST_PATH_NO_WIDE_FORMAT;
+    }
+
+    if (image->common.component_alpha)
+       flags |= FAST_PATH_COMPONENT_ALPHA;
+    else
+       flags |= FAST_PATH_UNIFIED_ALPHA;
+
+    image->common.flags = flags;
+}
+
 void
 _pixman_image_validate (pixman_image_t *image)
 {
     if (image->common.dirty)
     {
        image->common.property_changed (image);
+
+       compute_flags (image);
+
        image->common.dirty = FALSE;
     }
 
index 7ed8aa7..2cafe3a 100644 (file)
@@ -103,6 +103,8 @@ struct image_common
 
     pixman_image_destroy_func_t destroy_func;
     void *                      destroy_data;
+
+    uint32_t                   flags;
 };
 
 struct source_image
index 6a260ed..c7d3bcc 100644 (file)
@@ -453,56 +453,8 @@ get_image_info (pixman_image_t       *image,
                pixman_format_code_t *code,
                uint32_t             *flags)
 {
-    *flags = 0;
-    
-    if (!image->common.transform)
-    {
-       *flags |= FAST_PATH_ID_TRANSFORM;
-    }
-    else
-    {
-       if (image->common.transform->matrix[0][1] == 0 &&
-           image->common.transform->matrix[1][0] == 0 &&
-           image->common.transform->matrix[2][0] == 0 &&
-           image->common.transform->matrix[2][1] == 0 &&
-           image->common.transform->matrix[2][2] == pixman_fixed_1)
-       {
-           *flags |= FAST_PATH_SCALE_TRANSFORM;
-       }
-    }
-    
-    if (!image->common.alpha_map)
-       *flags |= FAST_PATH_NO_ALPHA_MAP;
-    
-    if (image->common.filter != PIXMAN_FILTER_CONVOLUTION)
-    {
-       *flags |= FAST_PATH_NO_CONVOLUTION_FILTER;
-       
-       if (image->common.filter == PIXMAN_FILTER_NEAREST)
-           *flags |= FAST_PATH_NEAREST_FILTER;
-    }
-    
-    if (image->common.repeat != PIXMAN_REPEAT_PAD)
-       *flags |= FAST_PATH_NO_PAD_REPEAT;
-    
-    if (image->common.repeat != PIXMAN_REPEAT_REFLECT)
-       *flags |= FAST_PATH_NO_REFLECT_REPEAT;
-    
-    *flags |= (FAST_PATH_NO_ACCESSORS | FAST_PATH_NO_WIDE_FORMAT);
-    if (image->type == BITS)
-    {
-       if (image->bits.read_func || image->bits.write_func)
-           *flags &= ~FAST_PATH_NO_ACCESSORS;
-       
-       if (PIXMAN_FORMAT_IS_WIDE (image->bits.format))
-           *flags &= ~FAST_PATH_NO_WIDE_FORMAT;
-    }
-    
-    if (image->common.component_alpha)
-       *flags |= FAST_PATH_COMPONENT_ALPHA;
-    else
-       *flags |= FAST_PATH_UNIFIED_ALPHA;
-    
+    *flags = image->common.flags;
+
     if (_pixman_image_is_solid (image))
        *code = PIXMAN_solid;
     else if (image->common.type == BITS)