From: Søren Sandmann Pedersen <s...@redhat.com> This flag is set whenever the pixels of a bits image don't have an alpha channel. Together with FAST_PATH_SAMPLES_COVER_CLIP it implies that the image effectively is opaque, so we can do operator reductions such as OVER->SRC. --- pixman/pixman-image.c | 10 ++++++---- pixman/pixman-private.h | 1 + pixman/pixman.c | 11 +++++++++++ 3 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/pixman/pixman-image.c b/pixman/pixman-image.c index 0b8bb3c..0e3601f 100644 --- a/pixman/pixman-image.c +++ b/pixman/pixman-image.c @@ -406,12 +406,14 @@ compute_image_info (pixman_image_t *image) } } - if (image->common.repeat != PIXMAN_REPEAT_NONE && - !PIXMAN_FORMAT_A (image->bits.format) && + if (!PIXMAN_FORMAT_A (image->bits.format) && PIXMAN_FORMAT_TYPE (image->bits.format) != PIXMAN_TYPE_GRAY && PIXMAN_FORMAT_TYPE (image->bits.format) != PIXMAN_TYPE_COLOR) { - flags |= FAST_PATH_IS_OPAQUE; + flags |= FAST_PATH_SAMPLES_OPAQUE; + + if (image->common.repeat != PIXMAN_REPEAT_NONE) + flags |= FAST_PATH_IS_OPAQUE; } if (source_image_needs_out_of_bounds_workaround (&image->bits)) @@ -459,7 +461,7 @@ compute_image_info (pixman_image_t *image) image->common.filter == PIXMAN_FILTER_CONVOLUTION || image->common.component_alpha) { - flags &= ~FAST_PATH_IS_OPAQUE; + flags &= ~(FAST_PATH_IS_OPAQUE | FAST_PATH_SAMPLES_OPAQUE); } image->common.flags = flags; diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h index c4e6bb8..dedea0b 100644 --- a/pixman/pixman-private.h +++ b/pixman/pixman-private.h @@ -571,6 +571,7 @@ _pixman_choose_implementation (void); #define FAST_PATH_BILINEAR_FILTER (1 << 20) #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_PAD_REPEAT \ (FAST_PATH_NO_NONE_REPEAT | \ diff --git a/pixman/pixman.c b/pixman/pixman.c index e79e135..55c5981 100644 --- a/pixman/pixman.c +++ b/pixman/pixman.c @@ -884,6 +884,17 @@ do_composite (pixman_op_t op, if (!analyze_extent (mask, dest_x - mask_x, dest_y - mask_y, extents, &mask_flags)) goto out; + /* If the clip is within the source samples, and the samples are opaque, + * then the source is effectively opaque. + */ +#define BOTH (FAST_PATH_SAMPLES_OPAQUE | FAST_PATH_SAMPLES_COVER_CLIP) + + if ((src_flags & BOTH) == BOTH) + src_flags |= FAST_PATH_IS_OPAQUE; + + if ((mask_flags & BOTH) == BOTH) + mask_flags |= FAST_PATH_IS_OPAQUE; + /* * Check if we can replace our operator by a simpler one * if the src or dest are opaque. The output operator should be -- 1.7.1.1 _______________________________________________ Pixman mailing list Pixman@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/pixman