[render] Split out filter finding from filter setting.
To prepare for RandR using filters in transforms, split out code paths so that the RandR code can validate the filter name and parameters during the transform set operation so that use of the filter later will not have unreportable errors.
This commit is contained in:
parent
e3d6f279d5
commit
acda790e43
|
@ -213,7 +213,7 @@ PictureFindFilter (ScreenPtr pScreen, char *name, int len)
|
|||
}
|
||||
|
||||
static Bool
|
||||
convolutionFilterValidateParams (PicturePtr pPicture,
|
||||
convolutionFilterValidateParams (ScreenPtr pScreen,
|
||||
int filter,
|
||||
xFixed *params,
|
||||
int nparams)
|
||||
|
@ -270,29 +270,51 @@ int
|
|||
SetPictureFilter (PicturePtr pPicture, char *name, int len, xFixed *params, int nparams)
|
||||
{
|
||||
PictFilterPtr pFilter;
|
||||
xFixed *new_params;
|
||||
int i, s, result;
|
||||
ScreenPtr pScreen;
|
||||
|
||||
pFilter = PictureFindFilter (screenInfo.screens[0], name, len);
|
||||
if (pPicture->pDrawable != NULL)
|
||||
pScreen = pPicture->pDrawable->pScreen;
|
||||
else
|
||||
pScreen = screenInfo.screens[0];
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
pFilter = PictureFindFilter (pScreen, name, len);
|
||||
|
||||
if (!pFilter)
|
||||
return BadName;
|
||||
|
||||
if (pPicture->pDrawable == NULL)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
return SetPicturePictFilter (pPicture, pFilter, params, nparams);
|
||||
}
|
||||
|
||||
int
|
||||
SetPicturePictFilter (PicturePtr pPicture, PictFilterPtr pFilter,
|
||||
xFixed *params, int nparams)
|
||||
{
|
||||
ScreenPtr pScreen;
|
||||
int i;
|
||||
|
||||
if (pPicture->pDrawable)
|
||||
pScreen = pPicture->pDrawable->pScreen;
|
||||
else
|
||||
pScreen = screenInfo.screens[0];
|
||||
|
||||
if (pFilter->ValidateParams)
|
||||
{
|
||||
if (!(*pFilter->ValidateParams) (pPicture, pFilter->id, params, nparams))
|
||||
if (!(*pFilter->ValidateParams) (pScreen, pFilter->id, params, nparams))
|
||||
return BadMatch;
|
||||
}
|
||||
else if (nparams)
|
||||
|
@ -300,7 +322,7 @@ SetPictureFilter (PicturePtr pPicture, char *name, int len, xFixed *params, int
|
|||
|
||||
if (nparams != pPicture->filter_nparams)
|
||||
{
|
||||
new_params = xalloc (nparams * sizeof (xFixed));
|
||||
xFixed *new_params = xalloc (nparams * sizeof (xFixed));
|
||||
if (!new_params && nparams)
|
||||
return BadAlloc;
|
||||
xfree (pPicture->filter_params);
|
||||
|
@ -311,9 +333,10 @@ SetPictureFilter (PicturePtr pPicture, char *name, int len, xFixed *params, int
|
|||
pPicture->filter_params[i] = params[i];
|
||||
pPicture->filter = pFilter->id;
|
||||
|
||||
if (pPicture->pDrawable) {
|
||||
ScreenPtr pScreen = pPicture->pDrawable->pScreen;
|
||||
PictureScreenPtr ps = GetPictureScreen(pScreen);
|
||||
if (pPicture->pDrawable)
|
||||
{
|
||||
PictureScreenPtr ps = GetPictureScreen(pScreen);
|
||||
int result;
|
||||
|
||||
result = (*ps->ChangePictureFilter) (pPicture, pPicture->filter,
|
||||
params, nparams);
|
||||
|
|
|
@ -184,7 +184,7 @@ typedef struct _Picture {
|
|||
SourcePictPtr pSourcePict;
|
||||
} PictureRec;
|
||||
|
||||
typedef Bool (*PictFilterValidateParamsProcPtr) (PicturePtr pPicture, int id,
|
||||
typedef Bool (*PictFilterValidateParamsProcPtr) (ScreenPtr pScreen, int id,
|
||||
xFixed *params, int nparams);
|
||||
typedef struct {
|
||||
char *name;
|
||||
|
@ -473,7 +473,12 @@ PictFilterPtr
|
|||
PictureFindFilter (ScreenPtr pScreen, char *name, int len);
|
||||
|
||||
int
|
||||
SetPictureFilter (PicturePtr pPicture, char *name, int len, xFixed *params, int nparams);
|
||||
SetPicturePictFilter (PicturePtr pPicture, PictFilterPtr pFilter,
|
||||
xFixed *params, int nparams);
|
||||
|
||||
int
|
||||
SetPictureFilter (PicturePtr pPicture, char *name, int len,
|
||||
xFixed *params, int nparams);
|
||||
|
||||
Bool
|
||||
PictureFinishInit (void);
|
||||
|
|
Loading…
Reference in New Issue