summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2011-05-03 07:25:50 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2012-06-02 08:19:38 -0400
commit706bf8264cb48aac36e36ff5e23f0ad8a47ff73c (patch)
tree87b859e7ee84a971e1ddde053ebd90338ef96375
parent934c9d8546b71ddea91ac16b0928101903e2608e (diff)
Speed up _pixman_image_get_solid() in common casesglyph4
Make _pixman_image_get_solid() faster by special-casing the common cases where the image is SOLID or a repeating a8r8g8b8 image. This optimization together with the previous one results in a small but reproducable performance improvement on the xfce4-terminal-a1 cairo trace: [ # ] backend test min(s) median(s) stddev. count Before: [ 0] image xfce4-terminal-a1 1.221 1.239 1.21% 100/100 After: [ 0] image xfce4-terminal-a1 1.170 1.199 1.26% 100/100 Either optimization by itself is difficult to separate from noise.
-rw-r--r--pixman/pixman-image.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/pixman/pixman-image.c b/pixman/pixman-image.c
index 6a965e46..8b634a7d 100644
--- a/pixman/pixman-image.c
+++ b/pixman/pixman-image.c
@@ -879,13 +879,34 @@ _pixman_image_get_solid (pixman_implementation_t *imp,
pixman_format_code_t format)
{
uint32_t result;
- pixman_iter_t iter;
- _pixman_implementation_src_iter_init (
- imp, &iter, image, 0, 0, 1, 1,
- (uint8_t *)&result, ITER_NARROW, image->common.flags);
-
- result = *iter.get_scanline (&iter, NULL);
+ if (image->type == SOLID)
+ {
+ result = image->solid.color_32;
+ }
+ else if (image->type == BITS)
+ {
+ if (image->bits.format == PIXMAN_a8r8g8b8)
+ result = image->bits.bits[0];
+ else if (image->bits.format == PIXMAN_x8r8g8b8)
+ result = image->bits.bits[0] | 0xff000000;
+ else if (image->bits.format == PIXMAN_a8)
+ result = (*(uint8_t *)image->bits.bits) << 24;
+ else
+ goto otherwise;
+ }
+ else
+ {
+ pixman_iter_t iter;
+
+ otherwise:
+ _pixman_implementation_src_iter_init (
+ imp, &iter, image, 0, 0, 1, 1,
+ (uint8_t *)&result,
+ ITER_NARROW, image->common.flags);
+
+ result = *iter.get_scanline (&iter, NULL);
+ }
/* If necessary, convert RGB <--> BGR. */
if (PIXMAN_FORMAT_TYPE (format) != PIXMAN_TYPE_ARGB)