summaryrefslogtreecommitdiff
path: root/render/filter.c
diff options
context:
space:
mode:
Diffstat (limited to 'render/filter.c')
-rw-r--r--render/filter.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/render/filter.c b/render/filter.c
index f81cc4a8c..71375dae9 100644
--- a/render/filter.c
+++ b/render/filter.c
@@ -271,11 +271,24 @@ PictureResetFilters (ScreenPtr pScreen)
int
SetPictureFilter (PicturePtr pPicture, char *name, int len, xFixed *params, int nparams)
{
- ScreenPtr pScreen = pPicture->pDrawable->pScreen;
- PictureScreenPtr ps = GetPictureScreen(pScreen);
- PictFilterPtr pFilter = PictureFindFilter (pScreen, name, len);
+ PictFilterPtr pFilter;
xFixed *new_params;
- int i, result;
+ int i, s, result;
+
+ pFilter = PictureFindFilter (screenInfo.screens[0], name, len);
+
+ if (pPicture->pDrawable == NULL) {
+ /* 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 = 0; s < screenInfo.numScreens; s++) {
+ if (PictureFindFilter (screenInfo.screens[s], name, len)->id !=
+ pFilter->id)
+ {
+ return BadMatch;
+ }
+ }
+ }
if (!pFilter)
return BadName;
@@ -300,8 +313,13 @@ SetPictureFilter (PicturePtr pPicture, char *name, int len, xFixed *params, int
pPicture->filter_params[i] = params[i];
pPicture->filter = pFilter->id;
- result = (*ps->ChangePictureFilter) (pPicture, pPicture->filter,
- params, nparams);
- return result;
+ if (pPicture->pDrawable) {
+ ScreenPtr pScreen = pPicture->pDrawable->pScreen;
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+
+ result = (*ps->ChangePictureFilter) (pPicture, pPicture->filter,
+ params, nparams);
+ return result;
+ }
return Success;
}