2
* $Id: filter.c,v 1.11.4.1 2006/01/18 07:21:43 airlied Exp $
4
* Copyright Ā© 2002 Keith Packard
6
* Permission to use, copy, modify, distribute, and sell this software and its
7
* documentation for any purpose is hereby granted without fee, provided that
8
* the above copyright notice appear in all copies and that both that
9
* copyright notice and this permission notice appear in supporting
10
* documentation, and that the name of Keith Packard not be used in
11
* advertising or publicity pertaining to distribution of the software without
12
* specific, written prior permission. Keith Packard makes no
13
* representations about the suitability of this software for any purpose. It
14
* is provided "as is" without express or implied warranty.
16
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22
* PERFORMANCE OF THIS SOFTWARE.
25
#ifdef HAVE_DIX_CONFIG_H
26
#include <dix-config.h>
30
#include "scrnintstr.h"
32
#include "regionstr.h"
34
#include "windowstr.h"
37
#include "colormapst.h"
38
#include "cursorstr.h"
39
#include "dixstruct.h"
42
#include "picturestr.h"
44
static char **filterNames;
45
static int nfilterNames;
48
* standard but not required filters don't have constant indices
52
PictureGetFilterId (char *filter, int len, Bool makeit)
59
len = strlen (filter);
60
for (i = 0; i < nfilterNames; i++)
61
if (!CompareISOLatin1Lowered ((unsigned char *) filterNames[i], -1, (unsigned char *) filter, len))
65
name = xalloc (len + 1);
68
memcpy (name, filter, len);
71
names = xrealloc (filterNames, (nfilterNames + 1) * sizeof (char *));
73
names = xalloc (sizeof (char *));
81
filterNames[i] = name;
86
PictureSetDefaultIds (void)
88
/* careful here -- this list must match the #define values */
90
if (PictureGetFilterId (FilterNearest, -1, TRUE) != PictFilterNearest)
92
if (PictureGetFilterId (FilterBilinear, -1, TRUE) != PictFilterBilinear)
95
if (PictureGetFilterId (FilterFast, -1, TRUE) != PictFilterFast)
97
if (PictureGetFilterId (FilterGood, -1, TRUE) != PictFilterGood)
99
if (PictureGetFilterId (FilterBest, -1, TRUE) != PictFilterBest)
102
if (PictureGetFilterId (FilterConvolution, -1, TRUE) != PictFilterConvolution)
108
PictureGetFilterName (int id)
110
if (0 <= id && id < nfilterNames)
111
return filterNames[id];
117
PictureFreeFilterIds (void)
121
for (i = 0; i < nfilterNames; i++)
122
xfree (filterNames[i]);
129
PictureAddFilter (ScreenPtr pScreen,
131
PictFilterValidateParamsProcPtr ValidateParams)
133
PictureScreenPtr ps = GetPictureScreen(pScreen);
134
int id = PictureGetFilterId (filter, -1, TRUE);
136
PictFilterPtr filters;
141
* It's an error to attempt to reregister a filter
143
for (i = 0; i < ps->nfilters; i++)
144
if (ps->filters[i].id == id)
147
filters = xrealloc (ps->filters, (ps->nfilters + 1) * sizeof (PictFilterRec));
149
filters = xalloc (sizeof (PictFilterRec));
152
ps->filters = filters;
154
ps->filters[i].name = PictureGetFilterName (id);
155
ps->filters[i].id = id;
156
ps->filters[i].ValidateParams = ValidateParams;
161
PictureSetFilterAlias (ScreenPtr pScreen, char *filter, char *alias)
163
PictureScreenPtr ps = GetPictureScreen(pScreen);
164
int filter_id = PictureGetFilterId (filter, -1, FALSE);
165
int alias_id = PictureGetFilterId (alias, -1, TRUE);
168
if (filter_id < 0 || alias_id < 0)
170
for (i = 0; i < ps->nfilterAliases; i++)
171
if (ps->filterAliases[i].alias_id == alias_id)
173
if (i == ps->nfilterAliases)
175
PictFilterAliasPtr aliases;
177
if (ps->filterAliases)
178
aliases = xrealloc (ps->filterAliases,
179
(ps->nfilterAliases + 1) *
180
sizeof (PictFilterAliasRec));
182
aliases = xalloc (sizeof (PictFilterAliasRec));
185
ps->filterAliases = aliases;
186
ps->filterAliases[i].alias = PictureGetFilterName (alias_id);
187
ps->filterAliases[i].alias_id = alias_id;
188
ps->nfilterAliases++;
190
ps->filterAliases[i].filter_id = filter_id;
195
PictureFindFilter (ScreenPtr pScreen, char *name, int len)
197
PictureScreenPtr ps = GetPictureScreen(pScreen);
198
int id = PictureGetFilterId (name, len, FALSE);
203
/* Check for an alias, allow them to recurse */
204
for (i = 0; i < ps->nfilterAliases; i++)
205
if (ps->filterAliases[i].alias_id == id)
207
id = ps->filterAliases[i].filter_id;
210
/* find the filter */
211
for (i = 0; i < ps->nfilters; i++)
212
if (ps->filters[i].id == id)
213
return &ps->filters[i];
218
convolutionFilterValidateParams (PicturePtr pPicture,
226
if (xFixedFrac (params[0]) || xFixedFrac (params[1]))
230
if ((xFixedToInt (params[0]) * xFixedToInt (params[1])) > nparams)
238
PictureSetDefaultFilters (ScreenPtr pScreen)
241
if (!PictureSetDefaultIds ())
243
if (PictureAddFilter (pScreen, FilterNearest, 0) < 0)
245
if (PictureAddFilter (pScreen, FilterBilinear, 0) < 0)
248
if (!PictureSetFilterAlias (pScreen, FilterNearest, FilterFast))
250
if (!PictureSetFilterAlias (pScreen, FilterBilinear, FilterGood))
252
if (!PictureSetFilterAlias (pScreen, FilterBilinear, FilterBest))
255
if (PictureAddFilter (pScreen, FilterConvolution, convolutionFilterValidateParams) < 0)
262
PictureResetFilters (ScreenPtr pScreen)
264
PictureScreenPtr ps = GetPictureScreen(pScreen);
267
xfree (ps->filterAliases);
268
PictureFreeFilterIds ();
272
SetPictureFilter (PicturePtr pPicture, char *name, int len, xFixed *params, int nparams)
276
PictFilterPtr pFilter;
280
if (!pPicture->pDrawable)
283
pScreen = pPicture->pDrawable->pScreen;
284
ps = GetPictureScreen(pScreen);
285
pFilter = PictureFindFilter (pScreen, name, len);
289
if (pFilter->ValidateParams)
291
if (!(*pFilter->ValidateParams) (pPicture, pFilter->id, params, nparams))
297
if (nparams != pPicture->filter_nparams)
299
new_params = xalloc (nparams * sizeof (xFixed));
302
xfree (pPicture->filter_params);
303
pPicture->filter_params = new_params;
304
pPicture->filter_nparams = nparams;
306
for (i = 0; i < nparams; i++)
307
pPicture->filter_params[i] = params[i];
308
pPicture->filter = pFilter->id;
310
result = (*ps->ChangePictureFilter) (pPicture, pPicture->filter,