From 3413f75e5265e8957813df10af5af5aece9cfec4 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Fri, 30 Jun 2006 12:03:47 +0200 Subject: [PATCH] Bug #7366: Fix crashes when setting filters on source pictures. Now, filters may only be set on source pictures when the filter is common to all screens. Also, like SetPictureTransform, ChangePictureFilter is now not called on source pictures. (cherry picked from f5e92542a14f51029347b6476e4e4af69144930b commit) (cherry picked from 25d871d98462f0481ee419295ddc94b8c79dc881 commit) --- render/filter.c | 32 +++++++++++++++++++++++++------- render/picturestr.h | 5 +++++ 2 files changed, 30 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; } diff --git a/render/picturestr.h b/render/picturestr.h index 81dab5b26..beda9553f 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;