diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2011-05-03 07:25:50 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-06-02 08:19:38 -0400 |
commit | 706bf8264cb48aac36e36ff5e23f0ad8a47ff73c (patch) | |
tree | 87b859e7ee84a971e1ddde053ebd90338ef96375 | |
parent | 934c9d8546b71ddea91ac16b0928101903e2608e (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.c | 33 |
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) |