summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-07-22 22:14:52 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-07-22 22:41:58 +0100
commit9402bdcc13f7e96dfe527ff4a3da8d13a7870a02 (patch)
tree88b9ddc32974cd989f604388781750ba35dce661 /src
parentb315e0ebb75d8391ebef7ebe53741a5e33c968bb (diff)
sna/glyphs: Also discard the glyph mask for bitmaps with an opaque source
Though I expect all such glyphs to be caught by the non-overlapping checks... Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src')
-rw-r--r--src/sna/sna_glyphs.c44
1 files changed, 40 insertions, 4 deletions
diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index 46fbf8d5..918b51c7 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -1248,6 +1248,44 @@ out:
return format;
}
+static bool can_discard_mask(uint8_t op, PicturePtr src, PictFormatPtr mask,
+ int nlist, GlyphListPtr list, GlyphPtr *glyphs)
+{
+ PictFormatPtr g;
+ uint32_t color;
+
+ if (nlist == 1 && list->len == 1)
+ return true;
+
+ if (!op_is_bounded(op))
+ return false;
+
+ /* No glyphs overlap and we are not performing a mask conversion. */
+ g = glyphs_format(nlist, list, glyphs);
+ if (mask == g)
+ return true;
+
+ /* Otherwise if the glyphs are all bitmaps and we have an
+ * opaque source we can also render directly to the dst.
+ */
+ if (g == NULL) {
+ while (nlist--) {
+ if (list->format->depth != 1)
+ return false;
+
+ list++;
+ }
+ } else {
+ if (g->depth != 1)
+ return false;
+ }
+
+ if (!sna_picture_is_solid(src, &color))
+ return false;
+
+ return color >> 24 == 0xff;
+}
+
#if HAS_PIXMAN_GLYPHS
static void
glyphs_fallback(CARD8 op,
@@ -1309,8 +1347,7 @@ glyphs_fallback(CARD8 op,
RegionTranslate(&region, -dst->pDrawable->x, -dst->pDrawable->y);
if (mask_format &&
- (op_is_bounded(op) || (nlist == 1 && list->len == 1)) &&
- mask_format == glyphs_format(nlist, list, glyphs))
+ can_discard_mask(op, src, mask_format, nlist, list, glyphs))
mask_format = NULL;
cache = sna->render.glyph_cache;
@@ -1674,8 +1711,7 @@ sna_glyphs(CARD8 op,
/* Try to discard the mask for non-overlapping glyphs */
if (mask && dst->pCompositeClip->data == NULL &&
- (op_is_bounded(op) || (nlist == 1 && list->len == 1)) &&
- mask == glyphs_format(nlist, list, glyphs)) {
+ can_discard_mask(op, src, mask, nlist, list, glyphs)) {
DBG(("%s: discarding mask\n", __FUNCTION__));
if (glyphs_to_dst(sna, op,
src, dst,