_X_EXPORT int PictureAddFilter (ScreenPtr pScreen, char *filter, PictFilterValidateParamsProcPtr ValidateParams) { PictureScreenPtr ps = GetPictureScreen(pScreen); int id = PictureGetFilterId (filter, -1, TRUE); int i; PictFilterPtr filters; if (id < 0) return -1; /* * It's an error to attempt to reregister a filter */ for (i = 0; i < ps->nfilters; i++) if (ps->filters[i].id == id) return -1; if (ps->filters) filters = xrealloc (ps->filters, (ps->nfilters + 1) * sizeof (PictFilterRec)); else filters = xalloc (sizeof (PictFilterRec)); if (!filters) return -1; ps->filters = filters; i = ps->nfilters++; ps->filters[i].name = PictureGetFilterName (id); ps->filters[i].id = id; ps->filters[i].ValidateParams = ValidateParams; return id; }
_X_EXPORT Bool PictureSetFilterAlias (ScreenPtr pScreen, char *filter, char *alias) { PictureScreenPtr ps = GetPictureScreen(pScreen); int filter_id = PictureGetFilterId (filter, -1, FALSE); int alias_id = PictureGetFilterId (alias, -1, TRUE); int i; if (filter_id < 0 || alias_id < 0) return FALSE; for (i = 0; i < ps->nfilterAliases; i++) if (ps->filterAliases[i].alias_id == alias_id) break; if (i == ps->nfilterAliases) { PictFilterAliasPtr aliases; if (ps->filterAliases) aliases = xrealloc (ps->filterAliases, (ps->nfilterAliases + 1) * sizeof (PictFilterAliasRec)); else aliases = xalloc (sizeof (PictFilterAliasRec)); if (!aliases) return FALSE; ps->filterAliases = aliases; ps->filterAliases[i].alias = PictureGetFilterName (alias_id); ps->filterAliases[i].alias_id = alias_id; ps->nfilterAliases++; } ps->filterAliases[i].filter_id = filter_id; return TRUE; }
static void cwValidatePicture(PicturePtr pPicture, Mask mask) { DrawablePtr pDrawable = pPicture->pDrawable; ScreenPtr pScreen = pDrawable->pScreen; cwPsDecl(pScreen); cwPicturePrivate; cwPsUnwrap(ValidatePicture); /* * Must call ValidatePicture to ensure pPicture->pCompositeClip is valid */ (*ps->ValidatePicture) (pPicture, mask); if (!cwDrawableIsRedirWindow(pDrawable)) { if (pPicturePrivate) cwDestroyPicturePrivate(pPicture); } else { PicturePtr pBackingPicture; DrawablePtr pBackingDrawable; int x_off, y_off; pBackingDrawable = cwGetBackingDrawable(pDrawable, &x_off, &y_off); if (pPicturePrivate && pPicturePrivate->pBackingPicture->pDrawable != pBackingDrawable) { cwDestroyPicturePrivate(pPicture); pPicturePrivate = 0; } if (!pPicturePrivate) { pPicturePrivate = cwCreatePicturePrivate(pPicture); if (!pPicturePrivate) { cwPsWrap(ValidatePicture, cwValidatePicture); return; } } pBackingPicture = pPicturePrivate->pBackingPicture; /* * Always copy transform and filters because there's no * indication of when they've changed */ SetPictureTransform(pBackingPicture, pPicture->transform); if (pBackingPicture->filter != pPicture->filter || pPicture->filter_nparams > 0) { char *filter = PictureGetFilterName(pPicture->filter); SetPictureFilter(pBackingPicture, filter, strlen(filter), pPicture->filter_params, pPicture->filter_nparams); } pPicturePrivate->stateChanges |= mask; if (pPicturePrivate->serialNumber != pDrawable->serialNumber || (pPicturePrivate-> stateChanges & (CPClipXOrigin | CPClipYOrigin | CPClipMask))) { SetPictureClipRegion(pBackingPicture, x_off - pDrawable->x, y_off - pDrawable->y, pPicture->pCompositeClip); pPicturePrivate->serialNumber = pDrawable->serialNumber; pPicturePrivate->stateChanges &= ~(CPClipXOrigin | CPClipYOrigin | CPClipMask); } CopyPicture(pPicture, pPicturePrivate->stateChanges, pBackingPicture); ValidatePicture(pBackingPicture); } cwPsWrap(ValidatePicture, cwValidatePicture); }