From 395f07b1fe950ad09d439a0b9eba1792ba6a245d Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sun, 22 Sep 2013 10:31:15 +0100 Subject: [PATCH] sna: Undo region translation after failing to begin ImageGlyphs If we fail the initial tests, we need to undo our translation to the region before returning and starting the fallback paths. Signed-off-by: Chris Wilson --- src/sna/sna_accel.c | 48 ++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index e8e5d276..4bbecd68 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -13287,26 +13287,32 @@ sna_glyph_blt(DrawablePtr drawable, GCPtr gc, } } - get_drawable_deltas(drawable, pixmap, &dx, &dy); + if (get_drawable_deltas(drawable, pixmap, &dx, &dy)) + RegionTranslate(clip, dx, dy); _x += drawable->x + dx; _y += drawable->y + dy; - RegionTranslate(clip, dx, dy); extents = RegionRects(clip); last_extents = extents + RegionNumRects(clip); - if (!transparent) /* emulate miImageGlyphBlt */ - sna_blt_fill_boxes(sna, GXcopy, - bo, drawable->bitsPerPixel, - bg, extents, RegionNumRects(clip)); + if (!transparent) { /* emulate miImageGlyphBlt */ + if (!sna_blt_fill_boxes(sna, GXcopy, + bo, drawable->bitsPerPixel, + bg, extents, last_extents - extents)) { + RegionTranslate(clip, -dx, -dy); + return false; + } + } kgem_set_mode(&sna->kgem, KGEM_BLT, bo); if (!kgem_check_batch(&sna->kgem, 16) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc(&sna->kgem, 1)) { kgem_submit(&sna->kgem); - if (!kgem_check_bo_fenced(&sna->kgem, bo)) + if (!kgem_check_bo_fenced(&sna->kgem, bo)) { + RegionTranslate(clip, -dx, -dy); return false; + } _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -13753,8 +13759,8 @@ out: static void sna_image_text8(DrawablePtr drawable, GCPtr gc, - int x, int y, - int count, char *chars) + int x, int y, + int count, char *chars) { struct sna_font *priv = gc->font->devPrivates[sna_font_key]; CharInfoPtr info[255]; @@ -13834,8 +13840,8 @@ out: static void sna_image_text16(DrawablePtr drawable, GCPtr gc, - int x, int y, - int count, unsigned short *chars) + int x, int y, + int count, unsigned short *chars) { struct sna_font *priv = gc->font->devPrivates[sna_font_key]; CharInfoPtr info[255]; @@ -13947,26 +13953,32 @@ sna_reversed_glyph_blt(DrawablePtr drawable, GCPtr gc, } } - get_drawable_deltas(drawable, pixmap, &dx, &dy); + if (get_drawable_deltas(drawable, pixmap, &dx, &dy)) + RegionTranslate(clip, dx, dy); _x += drawable->x + dx; _y += drawable->y + dy; - RegionTranslate(clip, dx, dy); extents = RegionRects(clip); last_extents = extents + RegionNumRects(clip); - if (!transparent) /* emulate miImageGlyphBlt */ - sna_blt_fill_boxes(sna, GXcopy, - bo, drawable->bitsPerPixel, - bg, extents, RegionNumRects(clip)); + if (!transparent) { /* emulate miImageGlyphBlt */ + if (!sna_blt_fill_boxes(sna, GXcopy, + bo, drawable->bitsPerPixel, + bg, extents, last_extents - extents)) { + RegionTranslate(clip, -dx, -dy); + return false; + } + } kgem_set_mode(&sna->kgem, KGEM_BLT, bo); if (!kgem_check_batch(&sna->kgem, 16) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc(&sna->kgem, 1)) { kgem_submit(&sna->kgem); - if (!kgem_check_bo_fenced(&sna->kgem, bo)) + if (!kgem_check_bo_fenced(&sna->kgem, bo)) { + RegionTranslate(clip, -dx, -dy); return false; + } _kgem_set_mode(&sna->kgem, KGEM_BLT); }