* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
+ * documentation, and that the name of the author(s) not be used in
* advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
+ * specific, written prior permission. The authors make no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
*/
#include "fcint.h"
+#include <assert.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
FcCompareNumber (FcValue *value1, FcValue *value2)
{
double v1, v2, v;
-
+
switch (value1->type) {
case FcTypeInteger:
v1 = (double) value1->u.i;
static double
FcCompareString (FcValue *v1, FcValue *v2)
{
- return (double) FcStrCmpIgnoreCase (fc_value_string(v1), fc_value_string(v2)) != 0;
+ return (double) FcStrCmpIgnoreCase (FcValueString(v1), FcValueString(v2)) != 0;
}
static double
FcCompareFamily (FcValue *v1, FcValue *v2)
{
- /* rely on the guarantee in FcPatternAddWithBinding that
+ /* rely on the guarantee in FcPatternObjectAddWithBinding that
* families are always FcTypeString. */
- const FcChar8* v1_string = fc_value_string(v1);
- const FcChar8* v2_string = fc_value_string(v2);
+ const FcChar8* v1_string = FcValueString(v1);
+ const FcChar8* v2_string = FcValueString(v2);
if (FcToLower(*v1_string) != FcToLower(*v2_string) &&
*v1_string != ' ' && *v2_string != ' ')
{
FcLangResult result;
FcValue value1 = FcValueCanonicalize(v1), value2 = FcValueCanonicalize(v2);
-
+
switch (value1.type) {
case FcTypeLangSet:
switch (value2.type) {
result = FcLangSetCompare (value1.u.l, value2.u.l);
break;
case FcTypeString:
- result = FcLangSetHasLang (value1.u.l,
+ result = FcLangSetHasLang (value1.u.l,
value2.u.s);
break;
default:
result = FcLangSetHasLang (value2.u.l, value1.u.s);
break;
case FcTypeString:
- result = FcLangCompare (value1.u.s,
+ result = FcLangCompare (value1.u.s,
value2.u.s);
break;
default:
static double
FcCompareBool (FcValue *v1, FcValue *v2)
{
- if (fc_storage_type(v2) != FcTypeBool || fc_storage_type(v1) != FcTypeBool)
+ if (v2->type != FcTypeBool || v1->type != FcTypeBool)
return -1.0;
return (double) v2->u.b != v1->u.b;
}
static double
FcCompareCharSet (FcValue *v1, FcValue *v2)
{
- return (double) FcCharSetSubtractCount (fc_value_charset(v1), fc_value_charset(v2));
+ return (double) FcCharSetSubtractCount (FcValueCharSet(v1), FcValueCharSet(v2));
}
static double
* each value, earlier values are more significant than
* later values
*/
-static FcMatcher _FcMatchers [] = {
+static const FcMatcher _FcMatchers [] = {
{ FC_FOUNDRY_OBJECT, FcCompareString, 0, 0 },
#define MATCH_FOUNDRY 0
-#define MATCH_FOUNDRY_INDEX 0
-
{ FC_CHARSET_OBJECT, FcCompareCharSet, 1, 1 },
#define MATCH_CHARSET 1
-#define MATCH_CHARSET_INDEX 1
-
{ FC_FAMILY_OBJECT, FcCompareFamily, 2, 4 },
#define MATCH_FAMILY 2
-#define MATCH_FAMILY_STRONG_INDEX 2
-#define MATCH_FAMILY_WEAK_INDEX 4
-
{ FC_LANG_OBJECT, FcCompareLang, 3, 3 },
#define MATCH_LANG 3
#define MATCH_LANG_INDEX 3
-
{ FC_SPACING_OBJECT, FcCompareNumber, 5, 5 },
#define MATCH_SPACING 4
-#define MATCH_SPACING_INDEX 5
-
{ FC_PIXEL_SIZE_OBJECT, FcCompareSize, 6, 6 },
#define MATCH_PIXEL_SIZE 5
-#define MATCH_PIXEL_SIZE_INDEX 6
-
{ FC_STYLE_OBJECT, FcCompareString, 7, 7 },
#define MATCH_STYLE 6
-#define MATCH_STYLE_INDEX 7
-
{ FC_SLANT_OBJECT, FcCompareNumber, 8, 8 },
#define MATCH_SLANT 7
-#define MATCH_SLANT_INDEX 8
-
{ FC_WEIGHT_OBJECT, FcCompareNumber, 9, 9 },
#define MATCH_WEIGHT 8
-#define MATCH_WEIGHT_INDEX 9
-
{ FC_WIDTH_OBJECT, FcCompareNumber, 10, 10 },
#define MATCH_WIDTH 9
-#define MATCH_WIDTH_INDEX 10
-
{ FC_DECORATIVE_OBJECT, FcCompareBool, 11, 11 },
#define MATCH_DECORATIVE 10
-#define MATCH_DECORATIVE_INDEX 11
-
{ FC_ANTIALIAS_OBJECT, FcCompareBool, 12, 12 },
#define MATCH_ANTIALIAS 11
-#define MATCH_ANTIALIAS_INDEX 12
-
{ FC_RASTERIZER_OBJECT, FcCompareString, 13, 13 },
#define MATCH_RASTERIZER 12
-#define MATCH_RASTERIZER_INDEX 13
-
{ FC_OUTLINE_OBJECT, FcCompareBool, 14, 14 },
#define MATCH_OUTLINE 13
-#define MATCH_OUTLINE_INDEX 14
-
{ FC_FONTVERSION_OBJECT, FcCompareNumber, 15, 15 },
#define MATCH_FONTVERSION 14
-#define MATCH_FONTVERSION_INDEX 15
};
#define NUM_MATCH_VALUES 16
-static FcMatcher*
+static const FcMatcher*
FcObjectToMatcher (FcObject object)
{
int i;
FcValueListPtr v1, v2;
double v, best, bestStrong, bestWeak;
int j;
- FcMatcher *match = FcObjectToMatcher(object);
+ const FcMatcher *match = FcObjectToMatcher(object);
if (!match)
{
FcResult *result)
{
int i, i1, i2;
-
+
for (i = 0; i < NUM_MATCH_VALUES; i++)
value[i] = 0.0;
-
+
i1 = 0;
i2 = 0;
while (i1 < pat->num && i2 < fnt->num)
FcPatternElt *fe, *pe;
FcValue v;
FcResult result;
-
+
+ assert (pat != NULL);
+ assert (font != NULL);
+
new = FcPatternCreate ();
if (!new)
return 0;
pe = FcPatternObjectFindElt (pat, fe->object);
if (pe)
{
- if (!FcCompareValueList (pe->object, FcPatternEltValues(pe),
+ if (!FcCompareValueList (pe->object, FcPatternEltValues(pe),
FcPatternEltValues(fe), &v, 0, &result))
{
FcPatternDestroy (new);
{
FcPattern *best;
+ assert (sets != NULL);
+ assert (p != NULL);
+ assert (result != NULL);
+
if (!config)
{
config = FcConfigGetCurrent ();
FcPattern *
FcFontMatch (FcConfig *config,
- FcPattern *p,
+ FcPattern *p,
FcResult *result)
{
FcFontSet *sets[2];
int nsets;
FcPattern *best;
+ assert (p != NULL);
+ assert (result != NULL);
+
if (!config)
{
config = FcConfigGetCurrent ();
FcBool *patternLangSat;
FcValue patternLang;
+ assert (sets != NULL);
+ assert (p != NULL);
+ assert (result != NULL);
+
+ /* There are some implementation that relying on the result of
+ * "result" to check if the return value of FcFontSetSort
+ * is valid or not.
+ * So we should initialize it to the conservative way since
+ * this function doesn't return NULL anymore.
+ */
+ if (result)
+ *result = FcResultNoMatch;
+
if (FcDebug () & FC_DBG_MATCH)
{
printf ("Sort ");
nnodes += s->nfont;
}
if (!nnodes)
- goto bail0;
-
+ return FcFontSetCreate ();
+
for (nPatternLang = 0;
FcPatternGet (p, FC_LANG, nPatternLang, &patternLang) == FcResultMatch;
nPatternLang++)
;
/* freed below */
- nodes = malloc (nnodes * sizeof (FcSortNode) +
+ nodes = malloc (nnodes * sizeof (FcSortNode) +
nnodes * sizeof (FcSortNode *) +
nPatternLang * sizeof (FcBool));
if (!nodes)
goto bail0;
nodeps = (FcSortNode **) (nodes + nnodes);
patternLangSat = (FcBool *) (nodeps + nnodes);
-
+
new = nodes;
nodep = nodeps;
for (set = 0; set < nsets; set++)
}
nnodes = new - nodes;
-
+
qsort (nodeps, nnodes, sizeof (FcSortNode *),
FcSortCompare);
-
+
for (i = 0; i < nPatternLang; i++)
patternLangSat[i] = FcFalse;
-
+
for (f = 0; f < nnodes; f++)
{
FcBool satisfies = FcFalse;
* If this node matches any language, go check
* which ones and satisfy those entries
*/
- if (nodeps[f]->score[MATCH_LANG_INDEX] < 200)
+ if (nodeps[f]->score[MATCH_LANG_INDEX] < 2000)
{
for (i = 0; i < nPatternLang; i++)
{
FcFontSet *
FcFontSort (FcConfig *config,
- FcPattern *p,
+ FcPattern *p,
FcBool trim,
FcCharSet **csp,
FcResult *result)
FcFontSet *sets[2];
int nsets;
+ assert (p != NULL);
+ assert (result != NULL);
+
if (!config)
{
config = FcConfigGetCurrent ();