diff options
-rw-r--r-- | render/filter.c | 24 | ||||
-rw-r--r-- | render/picturestr.h | 5 |
2 files changed, 22 insertions, 7 deletions
diff --git a/render/filter.c b/render/filter.c index f81cc4a8c..61e040093 100644 --- a/render/filter.c +++ b/render/filter.c @@ -271,11 +271,16 @@ 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); + + for (s = 0; s < screenInfo.numScreens; s++) { + if (PictureFindFilter (screenInfo.screens[s], name, len) != pFilter) + return BadMatch; + } if (!pFilter) return BadName; @@ -300,8 +305,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; } diff --git a/render/picturestr.h b/render/picturestr.h index 25969a622..f1617f627 100644 --- a/render/picturestr.h +++ b/render/picturestr.h @@ -355,7 +355,12 @@ typedef struct _PictureScreen { */ 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; |