diff options
author | Stuart Kreitman <stuart.kreitman@sun.com> | 2004-03-30 17:34:45 +0000 |
---|---|---|
committer | Stuart Kreitman <stuart.kreitman@sun.com> | 2004-03-30 17:34:45 +0000 |
commit | 97162b0a4f725b069ee1d8c567d14166567f6d4a (patch) | |
tree | 889a629dd8ce336019e71260b4b5bf02b194f03b | |
parent | 0b4b3cae27790477983a9b56dce6419383103175 (diff) |
integration from modular tree in support of damage ext. Modified Files:
Tag: DAMAGE-XFIXES filter.c
-rw-r--r-- | render/filter.c | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/render/filter.c b/render/filter.c index 4435197e2..0d2868de5 100644 --- a/render/filter.c +++ b/render/filter.c @@ -1,7 +1,7 @@ /* - * $XFree86$ + * $Id$ * - * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc. + * Copyright © 2002 Keith Packard * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -22,6 +22,9 @@ * PERFORMANCE OF THIS SOFTWARE. */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif #include "misc.h" #include "scrnintstr.h" #include "os.h" @@ -40,6 +43,12 @@ static char **filterNames; static int nfilterNames; +/* + * standard but not required filters don't have constant indices + */ + +int pictFilterConvolution; + int PictureGetFilterId (char *filter, int len, Bool makeit) { @@ -50,15 +59,14 @@ PictureGetFilterId (char *filter, int len, Bool makeit) if (len < 0) len = strlen (filter); for (i = 0; i < nfilterNames; i++) - if (len == strlen (filterNames[i]) && - !strncmp (filterNames[i], filter, len)) + if (!CompareISOLatin1Lowered (filterNames[i], -1, filter, len)) return i; if (!makeit) return -1; - name = xalloc (strlen (filter) + 1); + name = xalloc (len + 1); if (!name) return -1; - strncpy (name, filter, len); + memcpy (name, filter, len); name[len] = '\0'; if (filterNames) names = xrealloc (filterNames, (nfilterNames + 1) * sizeof (char *)); @@ -116,7 +124,9 @@ PictureFreeFilterIds (void) } int -PictureAddFilter (ScreenPtr pScreen, char *filter, xFixed *params, int nparams) +PictureAddFilter (ScreenPtr pScreen, + char *filter, + PictFilterValidateParamsProcPtr ValidateParams) { PictureScreenPtr ps = GetPictureScreen(pScreen); int id = PictureGetFilterId (filter, -1, TRUE); @@ -140,9 +150,8 @@ PictureAddFilter (ScreenPtr pScreen, char *filter, xFixed *params, int nparams) ps->filters = filters; i = ps->nfilters++; ps->filters[i].name = PictureGetFilterName (id); - ps->filters[i].params = params; - ps->filters[i].nparams = nparams; ps->filters[i].id = id; + ps->filters[i].ValidateParams = ValidateParams; return id; } @@ -209,11 +218,12 @@ PictureSetDefaultFilters (ScreenPtr pScreen) if (!filterNames) if (!PictureSetDefaultIds ()) return FALSE; - if (PictureAddFilter (pScreen, FilterNearest, 0, 0) < 0) + + if (PictureAddFilter (pScreen, FilterNearest, 0) < 0) return FALSE; - if (PictureAddFilter (pScreen, FilterBilinear, 0, 0) < 0) + if (PictureAddFilter (pScreen, FilterBilinear, 0) < 0) return FALSE; - + if (!PictureSetFilterAlias (pScreen, FilterNearest, FilterFast)) return FALSE; if (!PictureSetFilterAlias (pScreen, FilterBilinear, FilterGood)) @@ -243,21 +253,25 @@ SetPictureFilter (PicturePtr pPicture, char *name, int len, xFixed *params, int if (!pFilter) return BadName; - if (nparams > pFilter->nparams) + if (pFilter->ValidateParams) + { + if (!(*pFilter->ValidateParams) (pPicture, pFilter->id, params, nparams)) + return BadMatch; + } + else if (nparams) return BadMatch; - if (pFilter->nparams != pPicture->filter_nparams) + + if (nparams != pPicture->filter_nparams) { - new_params = xalloc (pFilter->nparams * sizeof (xFixed)); + new_params = xalloc (nparams * sizeof (xFixed)); if (!new_params) return BadAlloc; xfree (pPicture->filter_params); pPicture->filter_params = new_params; - pPicture->filter_nparams = pFilter->nparams; + pPicture->filter_nparams = nparams; } for (i = 0; i < nparams; i++) pPicture->filter_params[i] = params[i]; - for (; i < pFilter->nparams; i++) - pPicture->filter_params[i] = pFilter->params[i]; pPicture->filter = pFilter->id; return Success; } |