[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:
Keith Packard 2008-03-14 13:46:30 -07:00
parent e3d6f279d5
commit acda790e43
2 changed files with 51 additions and 23 deletions

View File

@ -213,7 +213,7 @@ PictureFindFilter (ScreenPtr pScreen, char *name, int len)
} }
static Bool static Bool
convolutionFilterValidateParams (PicturePtr pPicture, convolutionFilterValidateParams (ScreenPtr pScreen,
int filter, int filter,
xFixed *params, xFixed *params,
int nparams) int nparams)
@ -270,29 +270,51 @@ int
SetPictureFilter (PicturePtr pPicture, char *name, int len, xFixed *params, int nparams) SetPictureFilter (PicturePtr pPicture, char *name, int len, xFixed *params, int nparams)
{ {
PictFilterPtr pFilter; PictFilterPtr pFilter;
xFixed *new_params; ScreenPtr pScreen;
int i, s, result;
pFilter = PictureFindFilter (screenInfo.screens[0], name, len); if (pPicture->pDrawable != NULL)
pScreen = pPicture->pDrawable->pScreen;
else
pScreen = screenInfo.screens[0];
if (pPicture->pDrawable == NULL) { pFilter = PictureFindFilter (pScreen, name, len);
/* 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) if (!pFilter)
return BadName; 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)
{ {
if (!(*pFilter->ValidateParams) (pPicture, pFilter->id, params, nparams)) if (!(*pFilter->ValidateParams) (pScreen, pFilter->id, params, nparams))
return BadMatch; return BadMatch;
} }
else if (nparams) else if (nparams)
@ -300,7 +322,7 @@ SetPictureFilter (PicturePtr pPicture, char *name, int len, xFixed *params, int
if (nparams != pPicture->filter_nparams) if (nparams != pPicture->filter_nparams)
{ {
new_params = xalloc (nparams * sizeof (xFixed)); xFixed *new_params = xalloc (nparams * sizeof (xFixed));
if (!new_params && nparams) if (!new_params && nparams)
return BadAlloc; return BadAlloc;
xfree (pPicture->filter_params); 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_params[i] = params[i];
pPicture->filter = pFilter->id; pPicture->filter = pFilter->id;
if (pPicture->pDrawable) { if (pPicture->pDrawable)
ScreenPtr pScreen = pPicture->pDrawable->pScreen; {
PictureScreenPtr ps = GetPictureScreen(pScreen); PictureScreenPtr ps = GetPictureScreen(pScreen);
int result;
result = (*ps->ChangePictureFilter) (pPicture, pPicture->filter, result = (*ps->ChangePictureFilter) (pPicture, pPicture->filter,
params, nparams); params, nparams);

View File

@ -184,7 +184,7 @@ typedef struct _Picture {
SourcePictPtr pSourcePict; SourcePictPtr pSourcePict;
} PictureRec; } PictureRec;
typedef Bool (*PictFilterValidateParamsProcPtr) (PicturePtr pPicture, int id, typedef Bool (*PictFilterValidateParamsProcPtr) (ScreenPtr pScreen, int id,
xFixed *params, int nparams); xFixed *params, int nparams);
typedef struct { typedef struct {
char *name; char *name;
@ -473,7 +473,12 @@ PictFilterPtr
PictureFindFilter (ScreenPtr pScreen, char *name, int len); PictureFindFilter (ScreenPtr pScreen, char *name, int len);
int 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 Bool
PictureFinishInit (void); PictureFinishInit (void);