[X2Go-Commits] [nx-libs] 01/01: nx-X11: handle source pictures (those without a Drawable surface) gracefully.

git-admin at x2go.org git-admin at x2go.org
Sun Mar 29 04:27:54 CEST 2015


This is an automated email from the git hooks/post-receive script.

x2go pushed a commit to branch 3.6.x
in repository nx-libs.

commit 0d56c45a7fc6350879377f368944a5832783764c
Author: Mihai Moldovan <ionic at ionic.de>
Date:   Sun Mar 29 04:26:10 2015 +0200

    nx-X11: handle source pictures (those without a Drawable surface) gracefully.
    
    Cherry-picked from branch 3.5.0.x.
    
    This is basically a merge of the most current xorg-server (1.17.1) code
    into nx-X11.
    
    It makes sure that for source pictures, which do not have a drawable
    surface, a filter is selected that is supported on the "main" and all
    other screens.  Alternatively, if the requested filter is not available
    on all screens and the picture is a source picture, this function fails
    gracefully.
    
    Additionally, the ChangePictureFilter hook is now called for non-source
    pictures.
    
    This also needs an implementation in mipict.{c,h}. The default hook does
    nothing and returns a success value.
---
 nx-X11/programs/Xserver/render/filter.c     |   76 ++++++++++++++++++++-------
 nx-X11/programs/Xserver/render/mipict.c     |   18 +++++++
 nx-X11/programs/Xserver/render/mipict.h     |    9 ++++
 nx-X11/programs/Xserver/render/picturestr.h |    6 +++
 4 files changed, 89 insertions(+), 20 deletions(-)

diff --git a/nx-X11/programs/Xserver/render/filter.c b/nx-X11/programs/Xserver/render/filter.c
index 919d599..a9028e0 100644
--- a/nx-X11/programs/Xserver/render/filter.c
+++ b/nx-X11/programs/Xserver/render/filter.c
@@ -271,33 +271,69 @@ PictureResetFilters (ScreenPtr pScreen)
 int
 SetPictureFilter (PicturePtr pPicture, char *name, int len, xFixed *params, int nparams)
 {
-    ScreenPtr		pScreen = pPicture->pDrawable->pScreen;
-    PictFilterPtr	pFilter = PictureFindFilter (pScreen, name, len);
-    xFixed		*new_params;
-    int			i;
+    ScreenPtr     pScreen;
+    PictFilterPtr pFilter;
+    xFixed        *new_params;
+    int           i;
+
+    if (pPicture->pDrawable) {
+        pScreen = pPicture->pDrawable->pScreen;
+    }
+    else {
+        pScreen = screenInfo.screens[0];
+    }
+
+    pFilter = PictureFindFilter (pScreen, name, len);
 
     if (!pFilter)
-	return BadName;
-    if (pFilter->ValidateParams)
-    {
-	if (!(*pFilter->ValidateParams) (pPicture, pFilter->id, params, nparams))
-	    return BadMatch;
+        return BadName;
+
+    if (!pPicture->pDrawable) {
+        int s;
+
+        /* For source pictures, the picture isn't tied to a screen.  So, ensure
+         * that all screens can handle a filter we set for the picture.
+         */
+        for (s = 1; s < screenInfo.numScreens; s++) {
+            PictFilterPtr pScreenFilter;
+
+            pScreenFilter = PictureFindFilter(screenInfo.screens[s], name, len);
+            if (!pScreenFilter || pScreenFilter->id != pFilter->id)
+                return BadMatch;
+        }
     }
-    else if (nparams)
-	return BadMatch;
 
-    if (nparams != pPicture->filter_nparams)
-    {
-	new_params = xalloc (nparams * sizeof (xFixed));
-	if (!new_params)
-	    return BadAlloc;
-	xfree (pPicture->filter_params);
-	pPicture->filter_params = new_params;
-	pPicture->filter_nparams = nparams;
+    if (pFilter->ValidateParams) {
+        if (!(*pFilter->ValidateParams) (pPicture, pFilter->id, params, nparams))
+          return BadMatch;
+    }
+    else if (nparams) {
+        return BadMatch;
+    }
+
+    if (nparams != pPicture->filter_nparams) {
+        new_params = xalloc (nparams * sizeof (xFixed));
+
+        if (!new_params && nparams)
+            return BadAlloc;
+        xfree (pPicture->filter_params);
+        pPicture->filter_params = new_params;
+        pPicture->filter_nparams = nparams;
     }
     for (i = 0; i < nparams; i++)
-	pPicture->filter_params[i] = params[i];
+        pPicture->filter_params[i] = params[i];
     pPicture->filter = pFilter->id;
+
+    if (pPicture->pDrawable) {
+        PictureScreenPtr ps = GetPictureScreen (pscreen);
+        int result;
+
+        result = (*ps->ChangePictureFilter) (pPicture, pPicture->filter,
+                                             params, nparams);
+
+        return result;
+    }
     pPicture->serialNumber |= GC_CHANGE_SERIAL_BIT;
+
     return Success;
 }
diff --git a/nx-X11/programs/Xserver/render/mipict.c b/nx-X11/programs/Xserver/render/mipict.c
index 81c7758..59707ea 100644
--- a/nx-X11/programs/Xserver/render/mipict.c
+++ b/nx-X11/programs/Xserver/render/mipict.c
@@ -250,6 +250,22 @@ miValidatePicture (PicturePtr pPicture,
     }
 }
 
+int
+miChangePictureTransform (PicturePtr	pPicture,
+			  PictTransform *transform)
+{
+    return Success;
+}
+
+int
+miChangePictureFilter (PicturePtr pPicture,
+		       int	  filter,
+		       xFixed     *params,
+		       int	  nparams)
+{
+    return Success;
+}
+
 #define BOUND(v)	(INT16) ((v) < MINSHORT ? MINSHORT : (v) > MAXSHORT ? MAXSHORT : (v))
 
 static __inline Bool
@@ -611,6 +627,8 @@ miPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
     ps->InitIndexed = miInitIndexed;
     ps->CloseIndexed = miCloseIndexed;
     ps->UpdateIndexed = miUpdateIndexed;
+    ps->ChangePictureTransform = miChangePictureTransform;
+    ps->ChangePictureFilter = miChangePictureFilter;
 
     /* MI rendering routines */
     ps->Composite	= 0;			/* requires DDX support */
diff --git a/nx-X11/programs/Xserver/render/mipict.h b/nx-X11/programs/Xserver/render/mipict.h
index e6e8b70..0c2ed04 100644
--- a/nx-X11/programs/Xserver/render/mipict.h
+++ b/nx-X11/programs/Xserver/render/mipict.h
@@ -71,6 +71,15 @@ void
 miValidatePicture (PicturePtr pPicture,
 		   Mask       mask);
 
+int
+miChangePictureTransform (PicturePtr	pPicture,
+			  PictTransform *transform);
+
+int
+miChangePictureFilter (PicturePtr pPicture,
+		       int	  filter,
+		       xFixed     *params,
+		       int	  nparams);
 
 Bool
 miClipPicture (RegionPtr    pRegion,
diff --git a/nx-X11/programs/Xserver/render/picturestr.h b/nx-X11/programs/Xserver/render/picturestr.h
index 4775793..5616257 100644
--- a/nx-X11/programs/Xserver/render/picturestr.h
+++ b/nx-X11/programs/Xserver/render/picturestr.h
@@ -344,7 +344,13 @@ typedef struct _PictureScreen {
     int				nfilterAliases;
 
     ChangePictureTransformProcPtr   ChangePictureTransform;
+
+    /**
+     * Called immediately after a picture's transform is changed through the
+     * SetPictureFilter request.  Not called for source-only pictures.
+     */
     ChangePictureFilterProcPtr	ChangePictureFilter;
+
     DestroyPictureFilterProcPtr	DestroyPictureFilter;
 
     TrapezoidsProcPtr		Trapezoids;

--
Alioth's /srv/git/code.x2go.org/nx-libs.git//..//_hooks_/post-receive-email on /srv/git/code.x2go.org/nx-libs.git


More information about the x2go-commits mailing list