The structure of the adaptor-matching algorithm was obscured by trying
to use "continue" and "break" as the only control-flow primitives. It's
a lot more clear if you add "return" to that set.

In some ways this patch is easier to review with `git diff -w`.

Signed-off-by: Jamey Sharp <[email protected]>
---
 Xext/xvdisp.c |  147 +++++++++++++++++++++++++--------------------------------
 1 files changed, 64 insertions(+), 83 deletions(-)

diff --git a/Xext/xvdisp.c b/Xext/xvdisp.c
index b6fc34f..4345672 100644
--- a/Xext/xvdisp.c
+++ b/Xext/xvdisp.c
@@ -1850,110 +1850,91 @@ XineramaXvPutStill(ClientPtr client)
     return result;
 }
 
+static Bool
+isImageAdaptor(XvAdaptorPtr pAdapt)
+{
+    return (pAdapt->type & XvImageMask) && (pAdapt->nImages > 0);
+}
+
+static Bool
+hasOverlay(XvAdaptorPtr pAdapt)
+{
+    int i;
+    for(i = 0; i < pAdapt->nAttributes; i++)
+       if(!strcmp(pAdapt->pAttributes[i].name, "XV_COLORKEY"))
+           return TRUE;
+    return FALSE;
+}
+
+static XvAdaptorPtr
+matchAdaptor(ScreenPtr pScreen, XvAdaptorPtr refAdapt, Bool isOverlay)
+{
+    int i;
+    XvScreenPtr xvsp = dixLookupPrivate(&pScreen->devPrivates, 
XvGetScreenKey());
+    /* Do not try to go on if xv is not supported on this screen */
+    if(xvsp == NULL)
+       return NULL;
+
+    /* if the adaptor has the same name it's a perfect match */
+    for(i = 0; i < xvsp->nAdaptors; i++) {
+       XvAdaptorPtr pAdapt = xvsp->pAdaptors + i;
+       if(!strcmp(refAdapt->name, pAdapt->name))
+           return pAdapt;
+    }
+
+    /* otherwise we only look for XvImage adaptors */
+    if(!isImageAdaptor(refAdapt))
+       return NULL;
+
+    /* prefer overlay/overlay non-overlay/non-overlay pairing */
+    for(i = 0; i < xvsp->nAdaptors; i++) {
+       XvAdaptorPtr pAdapt = xvsp->pAdaptors + i;
+       if(isImageAdaptor(pAdapt) && isOverlay == hasOverlay(pAdapt))
+           return pAdapt;
+    }
+
+    /* but we'll take any XvImage pairing if we can get it */
+    for(i = 0; i < xvsp->nAdaptors; i++) {
+       XvAdaptorPtr pAdapt = xvsp->pAdaptors + i;
+       if(isImageAdaptor(pAdapt))
+           return pAdapt;
+    }
+    return NULL;
+}
+
 void XineramifyXv(void)
 {
-   ScreenPtr pScreen, screen0 = screenInfo.screens[0];
-   XvScreenPtr xvsp0 = (XvScreenPtr)dixLookupPrivate(&screen0->devPrivates,
-                                                    XvGetScreenKey());
-   XvAdaptorPtr refAdapt, pAdapt;
-   XvAttributePtr pAttr;
-   XvScreenPtr xvsp;
-   Bool isOverlay, hasOverlay;
-   PanoramiXRes *port;
+   XvScreenPtr xvsp0 = dixLookupPrivate(&screenInfo.screens[0]->devPrivates, 
XvGetScreenKey());
    XvAdaptorPtr MatchingAdaptors[MAXSCREENS];
-   int i, j, k, l;
+   int i, j, k;
 
    XvXRTPort = CreateNewResourceType(XineramaDeleteResource, "XvXRTPort");
 
    if (!xvsp0 || !XvXRTPort) return;
 
    for(i = 0; i < xvsp0->nAdaptors; i++) {
-      refAdapt = xvsp0->pAdaptors + i;
+      Bool isOverlay;
+      XvAdaptorPtr refAdapt = xvsp0->pAdaptors + i;
+      if(!(refAdapt->type & XvInputMask)) continue;
 
-      bzero(MatchingAdaptors, sizeof(XvAdaptorPtr) * MAXSCREENS);
-      
       MatchingAdaptors[0] = refAdapt;
-   
-      if(!(refAdapt->type & XvInputMask)) continue;
-      
-      isOverlay = FALSE;
-      for(j = 0; j < refAdapt->nAttributes; j++) {
-         pAttr = refAdapt->pAttributes + j;
-         if(!strcmp(pAttr->name, "XV_COLORKEY")) {
-           isOverlay = TRUE;
-           break;
-        }
-      }
-   
-      for(j = 1; j < PanoramiXNumScreens; j++) {
-         pScreen = screenInfo.screens[j];
-        xvsp = (XvScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
-                                             XvGetScreenKey());
-         /* Do not try to go on if xv is not supported on this screen */
-         if (xvsp==NULL) continue ;
-        
-         /* if the adaptor has the same name it's a perfect match */
-        for(k = 0; k < xvsp->nAdaptors; k++) {
-          pAdapt = xvsp->pAdaptors + k;
-           if(!strcmp(refAdapt->name, pAdapt->name)) {
-              MatchingAdaptors[j] = pAdapt;
-              break;
-          }
-         }
-        if(MatchingAdaptors[j]) continue; /* found it */
-        
-        /* otherwise we only look for XvImage adaptors */
-        if(!(refAdapt->type & XvImageMask)) continue;
-        if(refAdapt->nImages <= 0) continue;
-        
-        /* prefer overlay/overlay non-overlay/non-overlay pairing */
-        for(k = 0; k < xvsp->nAdaptors; k++) {
-           pAdapt = xvsp->pAdaptors + k;
-           if((pAdapt->type & XvImageMask) && (pAdapt->nImages > 0)) {
-             hasOverlay = FALSE;
-              for(l = 0; l < pAdapt->nAttributes; l++) {
-                if(!strcmp(pAdapt->pAttributes[l].name, "XV_COLORKEY")) {
-                  hasOverlay = TRUE;
-                  break;
-                }
-             }
-             if(isOverlay && hasOverlay) {
-                MatchingAdaptors[j] = pAdapt;
-                break;
-             }
-              else if(!isOverlay && !hasOverlay) {
-                MatchingAdaptors[j] = pAdapt;
-                break;
-             }
-           }
-         }
-        
-        if(MatchingAdaptors[j]) continue; /* found it */
-        
-        /* but we'll take any XvImage pairing if we can get it */
-                
-        for(k = 0; k < xvsp->nAdaptors; k++) {
-           pAdapt = xvsp->pAdaptors + k;
-           if((pAdapt->type & XvImageMask) && (pAdapt->nImages > 0)) {
-                MatchingAdaptors[j] = pAdapt;
-                break;
-           }
-         }
-      }
+      isOverlay = hasOverlay(refAdapt);
+      for(j = 1; j < PanoramiXNumScreens; j++)
+        MatchingAdaptors[j] = matchAdaptor(screenInfo.screens[j], refAdapt, 
isOverlay);
 
       /* now create a resource for each port */
       for(j = 0; j < refAdapt->nPorts; j++) {
-         if(!(port = xalloc(sizeof(PanoramiXRes))))
+        PanoramiXRes *port = xalloc(sizeof(PanoramiXRes));
+        if(!port)
            break;
-        port->info[0].id = MatchingAdaptors[0]->base_id + j;
-        AddResource(port->info[0].id, XvXRTPort, port);
 
-        for(k = 1; k < PanoramiXNumScreens; k++) {
+        for(k = 0; k < PanoramiXNumScreens; k++) {
            if(MatchingAdaptors[k] && (MatchingAdaptors[k]->nPorts > j)) 
                port->info[k].id = MatchingAdaptors[k]->base_id + j;
            else
                port->info[k].id = 0;
         } 
+        AddResource(port->info[0].id, XvXRTPort, port);
       }
    }
 
-- 
1.7.0

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to