summaryrefslogtreecommitdiff
path: root/uxa
diff options
context:
space:
mode:
Diffstat (limited to 'uxa')
-rw-r--r--uxa/uxa-glyphs.c101
1 files changed, 67 insertions, 34 deletions
diff --git a/uxa/uxa-glyphs.c b/uxa/uxa-glyphs.c
index 7db094b4..08937797 100644
--- a/uxa/uxa-glyphs.c
+++ b/uxa/uxa-glyphs.c
@@ -451,15 +451,17 @@ uxa_check_glyphs(CARD8 op,
{
pixman_image_t *image;
PixmapPtr scratch;
- PicturePtr mask;
+ PicturePtr mask, white = NULL;
int width = 0, height = 0;
int x, y, n;
int xDst = list->xOff, yDst = list->yOff;
BoxRec extents = { 0, 0, 0, 0 };
+ CARD8 mask_op;
if (maskFormat) {
pixman_format_code_t format;
CARD32 component_alpha;
+ xRenderColor color;
int error;
uxa_glyph_extents(nlist, list, glyphs, &extents);
@@ -500,6 +502,12 @@ uxa_check_glyphs(CARD8 op,
x = -extents.x1;
y = -extents.y1;
+
+ color.red = color.green = color.blue = color.alpha = 0xffff;
+ src = white = CreateSolidPicture(0, &color, &error);
+
+ mask_op = op;
+ op = PictOpAdd;
} else {
mask = dst;
x = 0;
@@ -514,24 +522,14 @@ uxa_check_glyphs(CARD8 op,
GlyphPtr glyph = *glyphs++;
PicturePtr g = GetGlyphPicture(glyph, dst->pDrawable->pScreen);
if (g) {
- if (maskFormat) {
- CompositePicture(PictOpAdd, g, NULL, mask,
- 0, 0,
- 0, 0,
- x - glyph->info.x,
- y - glyph->info.y,
- glyph->info.width,
- glyph->info.height);
- } else {
- CompositePicture(op, src, g, dst,
- xSrc + (x - glyph->info.x) - xDst,
- ySrc + (y - glyph->info.y) - yDst,
- 0, 0,
- x - glyph->info.x,
- y - glyph->info.y,
- glyph->info.width,
- glyph->info.height);
- }
+ CompositePicture(op, src, g, dst,
+ xSrc + (x - glyph->info.x) - xDst,
+ ySrc + (y - glyph->info.y) - yDst,
+ 0, 0,
+ x - glyph->info.x,
+ y - glyph->info.y,
+ glyph->info.width,
+ glyph->info.height);
}
x += glyph->info.xOff;
@@ -540,10 +538,13 @@ uxa_check_glyphs(CARD8 op,
list++;
}
+ if (white)
+ FreePicture(white, 0);
+
if (maskFormat) {
x = extents.x1;
y = extents.y1;
- CompositePicture(op, src, mask, dst,
+ CompositePicture(mask_op, src, mask, dst,
xSrc + x - xDst,
ySrc + y - yDst,
0, 0,
@@ -703,6 +704,23 @@ fallback:
}
}
+static PicturePtr
+create_white_solid(ScreenPtr screen)
+{
+ PicturePtr white, ret = NULL;
+ xRenderColor color;
+ int error;
+
+ color.red = color.green = color.blue = color.alpha = 0xffff;
+ white = CreateSolidPicture(0, &color, &error);
+ if (white) {
+ ret = uxa_acquire_solid(screen, white->pSourcePict);
+ FreePicture(white, 0);
+ }
+
+ return ret;
+}
+
static int
uxa_glyphs_via_mask(CARD8 op,
PicturePtr pSrc,
@@ -714,8 +732,8 @@ uxa_glyphs_via_mask(CARD8 op,
ScreenPtr screen = pDst->pDrawable->pScreen;
uxa_screen_t *uxa_screen = uxa_get_screen(screen);
CARD32 component_alpha;
- PixmapPtr pixmap;
- PicturePtr glyph_atlas, mask;
+ PixmapPtr pixmap, white_pixmap;
+ PicturePtr glyph_atlas, mask, white;
int xDst = list->xOff, yDst = list->yOff;
int x, y, width, height;
int dst_off_x, dst_off_y;
@@ -755,6 +773,17 @@ uxa_glyphs_via_mask(CARD8 op,
return -1;
}
+ white_pixmap = NULL;
+ white = create_white_solid(screen);
+ if (white)
+ white_pixmap = uxa_get_drawable_pixmap(white->pDrawable);
+ if (!white_pixmap) {
+ if (white)
+ FreePicture(white, 0);
+ screen->DestroyPixmap(pixmap);
+ return -1;
+ }
+
uxa_clear_pixmap(screen, uxa_screen, pixmap);
component_alpha = NeedsComponent(maskFormat->format);
@@ -763,8 +792,10 @@ uxa_glyphs_via_mask(CARD8 op,
&component_alpha, serverClient, &error);
screen->DestroyPixmap(pixmap);
- if (!mask)
+ if (!mask) {
+ FreePicture(white, 0);
return 1;
+ }
ValidatePicture(mask);
@@ -776,7 +807,7 @@ uxa_glyphs_via_mask(CARD8 op,
while (n--) {
GlyphPtr glyph = *glyphs++;
PicturePtr this_atlas;
- int src_x, src_y;
+ int glyph_x, glyph_y;
struct uxa_glyph *priv;
if (glyph->info.width == 0 || glyph->info.height == 0)
@@ -784,34 +815,35 @@ uxa_glyphs_via_mask(CARD8 op,
priv = uxa_glyph_get_private(glyph);
if (priv != NULL) {
- src_x = priv->x;
- src_y = priv->y;
+ glyph_x = priv->x;
+ glyph_y = priv->y;
this_atlas = priv->cache->picture;
} else {
if (glyph_atlas) {
uxa_screen->info->done_composite(pixmap);
glyph_atlas = NULL;
}
- this_atlas = uxa_glyph_cache(screen, glyph, &src_x, &src_y);
+ this_atlas = uxa_glyph_cache(screen, glyph, &glyph_x, &glyph_y);
if (this_atlas == NULL) {
/* no cache for this glyph */
this_atlas = GetGlyphPicture(glyph, screen);
- src_x = src_y = 0;
+ glyph_x = glyph_y = 0;
}
}
if (this_atlas != glyph_atlas) {
- PixmapPtr src_pixmap;
+ PixmapPtr glyph_pixmap;
if (glyph_atlas)
uxa_screen->info->done_composite(pixmap);
- src_pixmap =
+ glyph_pixmap =
uxa_get_drawable_pixmap(this_atlas->pDrawable);
- if (!uxa_pixmap_is_offscreen(src_pixmap) ||
+ if (!uxa_pixmap_is_offscreen(glyph_pixmap) ||
!uxa_screen->info->prepare_composite(PictOpAdd,
- this_atlas, NULL, mask,
- src_pixmap, NULL, pixmap)) {
+ white, this_atlas, mask,
+ white_pixmap, glyph_pixmap, pixmap)) {
+ FreePicture(white, 0);
FreePicture(mask, 0);
return -1;
}
@@ -820,8 +852,8 @@ uxa_glyphs_via_mask(CARD8 op,
}
uxa_screen->info->composite(pixmap,
- src_x, src_y,
0, 0,
+ glyph_x, glyph_y,
x - glyph->info.x,
y - glyph->info.y,
glyph->info.width,
@@ -844,6 +876,7 @@ next_glyph:
dst_off_x, dst_off_y,
width, height);
+ FreePicture(white, 0);
FreePicture(mask, 0);
return 0;
}