Sophie

Sophie

distrib > Mageia > 5 > i586 > media > core-updates-src > by-pkgid > 054cef8d7f016ac9fb831856b7968669 > files > 12

x11-server-1.16.4-2.1.mga5.src.rpm

diff --git a/exa/exa_glyphs.c b/exa/exa_glyphs.c
index 5c46ec9..1a41c5a 100644
--- a/exa/exa_glyphs.c
+++ b/exa/exa_glyphs.c
@@ -686,6 +686,7 @@
     PixmapPtr pMaskPixmap = 0;
     PicturePtr pMask = NULL;
     ScreenPtr pScreen = pDst->pDrawable->pScreen;
+    ExaScreenPriv(pScreen);
     int width = 0, height = 0;
     int x, y;
     int first_xOff = list->xOff, first_yOff = list->yOff;
@@ -697,7 +698,6 @@
     ExaGlyphBuffer buffer;
 
     if (maskFormat) {
-        ExaScreenPriv(pScreen);
         GCPtr pGC;
         xRectangle rect;
 
@@ -719,22 +719,20 @@
                                                 maskFormat->depth,
                                                 CREATE_PIXMAP_USAGE_SCRATCH);
         if (!pMaskPixmap)
-            return;
+	    goto fallback;
         component_alpha = NeedsComponent(maskFormat->format);
         pMask = CreatePicture(0, &pMaskPixmap->drawable,
                               maskFormat, CPComponentAlpha, &component_alpha,
                               serverClient, &error);
-        if (!pMask ||
-            (!component_alpha && pExaScr->info->CheckComposite &&
-             !(*pExaScr->info->CheckComposite) (PictOpAdd, pSrc, NULL, pMask)))
+	(*pScreen->DestroyPixmap) (pMaskPixmap);
+	if (!pMask)
+	    goto fallback;
+
+	if (!component_alpha && pExaScr->info->CheckComposite &&
+	    !(*pExaScr->info->CheckComposite) (PictOpAdd, pSrc, NULL, pMask))
         {
             PictFormatPtr argbFormat;
 
-            (*pScreen->DestroyPixmap) (pMaskPixmap);
-
-            if (!pMask)
-                return;
-
             /* The driver can't seem to composite to a8, let's try argb (but
              * without component-alpha) */
             FreePicture((void *) pMask, (XID) 0);
@@ -748,15 +746,25 @@
                                                     maskFormat->depth,
                                                     CREATE_PIXMAP_USAGE_SCRATCH);
             if (!pMaskPixmap)
-                return;
+		goto fallback;
 
             pMask = CreatePicture(0, &pMaskPixmap->drawable, maskFormat, 0, 0,
                                   serverClient, &error);
-            if (!pMask) {
-                (*pScreen->DestroyPixmap) (pMaskPixmap);
-                return;
-            }
+	    (*pScreen->DestroyPixmap) (pMaskPixmap);
+	    if (!pMask)
+		goto fallback;
         }
+
+	if (pExaScr->info->CheckComposite &&
+	    (!(*pExaScr->info->CheckComposite) (PictOpAdd, pSrc, NULL, pMask) ||
+	     (!(*pExaScr->info->CheckComposite) (op, pSrc, pMask, pDst) &&
+	      (op != PictOpOver ||
+	       !(*pExaScr->info->CheckComposite) (PictOpOutReverse, pSrc, pMask, pDst) ||
+	       !(*pExaScr->info->CheckComposite) (PictOpOver, pSrc, pMask, pDst))))) {
+	    FreePicture ((void *) pMask, (XID) 0);
+	    goto fallback;
+	}
+
         pGC = GetScratchGC(pMaskPixmap->drawable.depth, pScreen);
         ValidateGC(&pMaskPixmap->drawable, pGC);
         rect.x = 0;
@@ -769,6 +777,12 @@
         y = -extents.y1;
     }
     else {
+	if (pExaScr->info->CheckComposite &&
+	    !(*pExaScr->info->CheckComposite) (op, pSrc, NULL, pDst) &&
+	    (op != PictOpOver ||
+	     !(*pExaScr->info->CheckComposite) (PictOpOutReverse, pSrc, NULL, pDst) ||
+	     !(*pExaScr->info->CheckComposite) (PictOpOver, pSrc, NULL, pDst)))
+	    goto fallback;
         x = 0;
         y = 0;
     }
@@ -834,6 +848,10 @@
                          xSrc + x - first_xOff,
                          ySrc + y - first_yOff, 0, 0, x, y, width, height);
         FreePicture((void *) pMask, (XID) 0);
-        (*pScreen->DestroyPixmap) (pMaskPixmap);
     }
+
+    return;
+
+fallback:
+    ExaCheckGlyphs(op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs);
 }
diff --git a/exa/exa_render.c b/exa/exa_render.c
index 3974afe..d1c363a 100644
--- a/exa/exa_render.c
+++ b/exa/exa_render.c
@@ -878,7 +878,7 @@ exaComposite(CARD8 op,
     Bool saveMaskRepeat = pMask ? pMask->repeat : 0;
     RegionRec region;
 
-    if (pExaScr->swappedOut)
+    if (pExaScr->fallback_counter || pExaScr->swappedOut)
         goto fallback;
 
     /* Remove repeat in source if useless */