Simplify FcRange
This commit is contained in:
parent
13a5ae9fb9
commit
5bad26ccb6
10
src/fcdbg.c
10
src/fcdbg.c
|
@ -29,8 +29,6 @@
|
||||||
static void
|
static void
|
||||||
_FcValuePrintFile (FILE *f, const FcValue v)
|
_FcValuePrintFile (FILE *f, const FcValue v)
|
||||||
{
|
{
|
||||||
FcRange r;
|
|
||||||
|
|
||||||
switch (v.type) {
|
switch (v.type) {
|
||||||
case FcTypeUnknown:
|
case FcTypeUnknown:
|
||||||
fprintf (f, "<unknown>");
|
fprintf (f, "<unknown>");
|
||||||
|
@ -64,8 +62,7 @@ _FcValuePrintFile (FILE *f, const FcValue v)
|
||||||
fprintf (f, "face");
|
fprintf (f, "face");
|
||||||
break;
|
break;
|
||||||
case FcTypeRange:
|
case FcTypeRange:
|
||||||
r = FcRangeCanonicalize (v.u.r);
|
fprintf (f, "[%g %g)", v.u.r->begin, v.u.r->end);
|
||||||
fprintf (f, "[%g %g)", r.u.d.begin, r.u.d.end);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -267,8 +264,6 @@ FcOpPrint (FcOp op_)
|
||||||
void
|
void
|
||||||
FcExprPrint (const FcExpr *expr)
|
FcExprPrint (const FcExpr *expr)
|
||||||
{
|
{
|
||||||
FcRange r;
|
|
||||||
|
|
||||||
if (!expr) printf ("none");
|
if (!expr) printf ("none");
|
||||||
else switch (FC_OP_GET_OP (expr->op)) {
|
else switch (FC_OP_GET_OP (expr->op)) {
|
||||||
case FcOpInteger: printf ("%d", expr->u.ival); break;
|
case FcOpInteger: printf ("%d", expr->u.ival); break;
|
||||||
|
@ -286,8 +281,7 @@ FcExprPrint (const FcExpr *expr)
|
||||||
printf ("]");
|
printf ("]");
|
||||||
break;
|
break;
|
||||||
case FcOpRange:
|
case FcOpRange:
|
||||||
r = FcRangeCanonicalize (expr->u.rval);
|
printf ("(%g, %g)", expr->u.rval->begin, expr->u.rval->end);
|
||||||
printf ("(%g, %g)", r.u.d.begin, r.u.d.end);
|
|
||||||
break;
|
break;
|
||||||
case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break;
|
case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break;
|
||||||
case FcOpCharSet: printf ("charset\n"); break;
|
case FcOpCharSet: printf ("charset\n"); break;
|
||||||
|
|
25
src/fcint.h
25
src/fcint.h
|
@ -96,11 +96,6 @@ extern pfnSHGetFolderPathA pSHGetFolderPathA;
|
||||||
#define FC_MAX(a,b) ((a) > (b) ? (a) : (b))
|
#define FC_MAX(a,b) ((a) > (b) ? (a) : (b))
|
||||||
#define FC_ABS(a) ((a) < 0 ? -(a) : (a))
|
#define FC_ABS(a) ((a) < 0 ? -(a) : (a))
|
||||||
|
|
||||||
#define FcDoubleIsZero(a) (fabs ((a)) <= DBL_EPSILON)
|
|
||||||
#define FcDoubleCmpEQ(a,b) (fabs ((a) - (b)) <= DBL_EPSILON)
|
|
||||||
#define FcDoubleCmpGE(a,b) (FcDoubleCmpEQ (a, b) || (a) > (b))
|
|
||||||
#define FcDoubleCmpLE(a,b) (FcDoubleCmpEQ (a, b) || (a) < (b))
|
|
||||||
|
|
||||||
/* slim_internal.h */
|
/* slim_internal.h */
|
||||||
#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(__ELF__) && !defined(__sun)
|
#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(__ELF__) && !defined(__sun)
|
||||||
#define FcPrivate __attribute__((__visibility__("hidden")))
|
#define FcPrivate __attribute__((__visibility__("hidden")))
|
||||||
|
@ -252,21 +247,9 @@ typedef struct _FcExprName {
|
||||||
FcMatchKind kind;
|
FcMatchKind kind;
|
||||||
} FcExprName;
|
} FcExprName;
|
||||||
|
|
||||||
typedef struct _FcRangeInt {
|
struct _FcRange {
|
||||||
FcChar32 begin;
|
|
||||||
FcChar32 end;
|
|
||||||
} FcRangeInt;
|
|
||||||
typedef struct _FcRangeDouble {
|
|
||||||
double begin;
|
double begin;
|
||||||
double end;
|
double end;
|
||||||
} FcRangeDouble;
|
|
||||||
struct _FcRange {
|
|
||||||
FcBool is_double;
|
|
||||||
FcBool is_inclusive;
|
|
||||||
union {
|
|
||||||
FcRangeInt i;
|
|
||||||
FcRangeDouble d;
|
|
||||||
} u;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1083,15 +1066,9 @@ FcMatrixFree (FcMatrix *mat);
|
||||||
|
|
||||||
/* fcrange.c */
|
/* fcrange.c */
|
||||||
|
|
||||||
FcPrivate FcRange
|
|
||||||
FcRangeCanonicalize (const FcRange *range);
|
|
||||||
|
|
||||||
FcPrivate FcRange *
|
FcPrivate FcRange *
|
||||||
FcRangePromote (double v, FcValuePromotionBuffer *vbuf);
|
FcRangePromote (double v, FcValuePromotionBuffer *vbuf);
|
||||||
|
|
||||||
FcPrivate FcBool
|
|
||||||
FcRangeIsZero (const FcRange *r);
|
|
||||||
|
|
||||||
FcPrivate FcBool
|
FcPrivate FcBool
|
||||||
FcRangeIsInRange (const FcRange *a, const FcRange *b);
|
FcRangeIsInRange (const FcRange *a, const FcRange *b);
|
||||||
|
|
||||||
|
|
|
@ -220,7 +220,7 @@ FcCompareSizeRange (FcValue *v1, FcValue *v2)
|
||||||
if (FcRangeIsInRange (r1, r2))
|
if (FcRangeIsInRange (r1, r2))
|
||||||
ret = 0.0;
|
ret = 0.0;
|
||||||
else
|
else
|
||||||
ret = FC_MIN (fabs (r1->u.d.end - r2->u.d.begin), fabs (r1->u.d.begin - r2->u.d.end));
|
ret = FC_MIN (fabs (r1->end - r2->begin), fabs (r1->begin - r2->end));
|
||||||
|
|
||||||
bail:
|
bail:
|
||||||
if (r1)
|
if (r1)
|
||||||
|
|
12
src/fcname.c
12
src/fcname.c
|
@ -500,7 +500,6 @@ FcNameUnparseValue (FcStrBuf *buf,
|
||||||
{
|
{
|
||||||
FcChar8 temp[1024];
|
FcChar8 temp[1024];
|
||||||
FcValue v = FcValueCanonicalize(v0);
|
FcValue v = FcValueCanonicalize(v0);
|
||||||
FcRange r;
|
|
||||||
|
|
||||||
switch (v.type) {
|
switch (v.type) {
|
||||||
case FcTypeUnknown:
|
case FcTypeUnknown:
|
||||||
|
@ -527,18 +526,9 @@ FcNameUnparseValue (FcStrBuf *buf,
|
||||||
case FcTypeFTFace:
|
case FcTypeFTFace:
|
||||||
return FcTrue;
|
return FcTrue;
|
||||||
case FcTypeRange:
|
case FcTypeRange:
|
||||||
r = FcRangeCanonicalize (v.u.r);
|
sprintf ((char *) temp, "[%g %g)", v.u.r->begin, v.u.r->end);
|
||||||
if (!FcDoubleIsZero (r.u.d.begin) || !FcDoubleIsZero (r.u.d.end))
|
|
||||||
{
|
|
||||||
if (FcDoubleCmpEQ (r.u.d.begin, r.u.d.end))
|
|
||||||
sprintf ((char *) temp, "%g", r.u.d.begin);
|
|
||||||
else
|
|
||||||
sprintf ((char *) temp, "[%g %g)", r.u.d.begin, r.u.d.end);
|
|
||||||
return FcNameUnparseString (buf, temp, 0);
|
return FcNameUnparseString (buf, temp, 0);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
return FcTrue;
|
|
||||||
}
|
|
||||||
return FcFalse;
|
return FcFalse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
105
src/fcrange.c
105
src/fcrange.c
|
@ -32,10 +32,8 @@ FcRangeCreateDouble (double begin, double end)
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
ret->is_double = FcTrue;
|
ret->begin = begin;
|
||||||
ret->is_inclusive = FcDoubleCmpEQ (begin, end);
|
ret->end = end;
|
||||||
ret->u.d.begin = begin;
|
|
||||||
ret->u.d.end = end;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -48,10 +46,8 @@ FcRangeCreateInteger (FcChar32 begin, FcChar32 end)
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
ret->is_double = FcFalse;
|
ret->begin = begin;
|
||||||
ret->is_inclusive = (begin == end);
|
ret->end = end;
|
||||||
ret->u.i.begin = begin;
|
|
||||||
ret->u.i.end = end;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -66,14 +62,7 @@ FcRangeDestroy (FcRange *range)
|
||||||
FcRange *
|
FcRange *
|
||||||
FcRangeCopy (const FcRange *range)
|
FcRangeCopy (const FcRange *range)
|
||||||
{
|
{
|
||||||
FcRange *ret;
|
return FcRangeCreateDouble (range->begin, range->end);
|
||||||
|
|
||||||
if (range->is_double)
|
|
||||||
ret = FcRangeCreateDouble (range->u.d.begin, range->u.d.end);
|
|
||||||
else
|
|
||||||
ret = FcRangeCreateInteger (range->u.i.begin, range->u.i.end);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FcBool
|
FcBool
|
||||||
|
@ -81,41 +70,14 @@ FcRangeGetDouble(const FcRange *range, double *begin, double *end)
|
||||||
{
|
{
|
||||||
if (!range)
|
if (!range)
|
||||||
return FcFalse;
|
return FcFalse;
|
||||||
if (range->is_double)
|
|
||||||
{
|
|
||||||
if (begin)
|
if (begin)
|
||||||
*begin = range->u.d.begin;
|
*begin = range->begin;
|
||||||
if (end)
|
if (end)
|
||||||
*end = range->u.d.end;
|
*end = range->end;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (begin)
|
|
||||||
*begin = (double)range->u.i.begin;
|
|
||||||
if (end)
|
|
||||||
*end = (double)range->u.i.end;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FcTrue;
|
return FcTrue;
|
||||||
}
|
}
|
||||||
|
|
||||||
FcRange
|
|
||||||
FcRangeCanonicalize (const FcRange *range)
|
|
||||||
{
|
|
||||||
FcRange new;
|
|
||||||
|
|
||||||
if (range->is_double)
|
|
||||||
new = *range;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
new.is_double = FcTrue;
|
|
||||||
new.is_inclusive = range->is_inclusive;
|
|
||||||
new.u.d.begin = (double)range->u.i.begin;
|
|
||||||
new.u.d.end = (double)range->u.i.end;
|
|
||||||
}
|
|
||||||
return new;
|
|
||||||
}
|
|
||||||
|
|
||||||
FcRange *
|
FcRange *
|
||||||
FcRangePromote (double v, FcValuePromotionBuffer *vbuf)
|
FcRangePromote (double v, FcValuePromotionBuffer *vbuf)
|
||||||
{
|
{
|
||||||
|
@ -125,50 +87,24 @@ FcRangePromote (double v, FcValuePromotionBuffer *vbuf)
|
||||||
FcRangePromotionBuffer *buf = (FcRangePromotionBuffer *) vbuf;
|
FcRangePromotionBuffer *buf = (FcRangePromotionBuffer *) vbuf;
|
||||||
|
|
||||||
FC_ASSERT_STATIC (sizeof (FcRangePromotionBuffer) <= sizeof (FcValuePromotionBuffer));
|
FC_ASSERT_STATIC (sizeof (FcRangePromotionBuffer) <= sizeof (FcValuePromotionBuffer));
|
||||||
buf->r.is_double = FcTrue;
|
buf->r.begin = v;
|
||||||
buf->r.is_inclusive = FcTrue;
|
buf->r.end = v;
|
||||||
buf->r.u.d.begin = v;
|
|
||||||
buf->r.u.d.end = v;
|
|
||||||
|
|
||||||
return &buf->r;
|
return &buf->r;
|
||||||
}
|
}
|
||||||
|
|
||||||
FcBool
|
|
||||||
FcRangeIsZero (const FcRange *r)
|
|
||||||
{
|
|
||||||
FcRange c;
|
|
||||||
|
|
||||||
if (!r)
|
|
||||||
return FcFalse;
|
|
||||||
c = FcRangeCanonicalize (r);
|
|
||||||
|
|
||||||
return FcDoubleIsZero (c.u.d.begin) && FcDoubleIsZero (c.u.d.end);
|
|
||||||
}
|
|
||||||
|
|
||||||
FcBool
|
FcBool
|
||||||
FcRangeIsInRange (const FcRange *a, const FcRange *b)
|
FcRangeIsInRange (const FcRange *a, const FcRange *b)
|
||||||
{
|
{
|
||||||
FcRange ca, cb;
|
|
||||||
FcBool f;
|
|
||||||
|
|
||||||
if (!a || !b)
|
if (!a || !b)
|
||||||
return FcFalse;
|
return FcFalse;
|
||||||
|
|
||||||
ca = FcRangeCanonicalize (a);
|
return a->begin >= b->begin && a->end <= b->end;
|
||||||
cb = FcRangeCanonicalize (b);
|
|
||||||
if (ca.is_inclusive & cb.is_inclusive)
|
|
||||||
f = ca.u.d.end <= cb.u.d.end;
|
|
||||||
else
|
|
||||||
f = ca.u.d.end < cb.u.d.end;
|
|
||||||
|
|
||||||
return FcDoubleCmpGE (ca.u.d.begin, cb.u.d.begin) && f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FcBool
|
FcBool
|
||||||
FcRangeCompare (FcOp op, const FcRange *a, const FcRange *b)
|
FcRangeCompare (FcOp op, const FcRange *a, const FcRange *b)
|
||||||
{
|
{
|
||||||
FcRange ca, cb;
|
|
||||||
|
|
||||||
switch ((int) op) {
|
switch ((int) op) {
|
||||||
case FcOpEqual:
|
case FcOpEqual:
|
||||||
case FcOpContains:
|
case FcOpContains:
|
||||||
|
@ -178,21 +114,13 @@ FcRangeCompare (FcOp op, const FcRange *a, const FcRange *b)
|
||||||
case FcOpNotContains:
|
case FcOpNotContains:
|
||||||
return !FcRangeIsInRange (a, b);
|
return !FcRangeIsInRange (a, b);
|
||||||
case FcOpLess:
|
case FcOpLess:
|
||||||
ca = FcRangeCanonicalize (a);
|
return a->begin < b->begin;
|
||||||
cb = FcRangeCanonicalize (b);
|
|
||||||
return ca.u.d.begin < cb.u.d.begin;
|
|
||||||
case FcOpLessEqual:
|
case FcOpLessEqual:
|
||||||
ca = FcRangeCanonicalize (a);
|
return a->begin <= b->begin;
|
||||||
cb = FcRangeCanonicalize (b);
|
|
||||||
return FcDoubleCmpLE (ca.u.d.begin, cb.u.d.begin);
|
|
||||||
case FcOpMore:
|
case FcOpMore:
|
||||||
ca = FcRangeCanonicalize (a);
|
return a->end > b->end;
|
||||||
cb = FcRangeCanonicalize (b);
|
|
||||||
return ca.u.d.end > cb.u.d.end;
|
|
||||||
case FcOpMoreEqual:
|
case FcOpMoreEqual:
|
||||||
ca = FcRangeCanonicalize (a);
|
return a->end >= b->end;
|
||||||
cb = FcRangeCanonicalize (b);
|
|
||||||
return FcDoubleCmpGE (ca.u.d.end, cb.u.d.end);
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -202,9 +130,8 @@ FcRangeCompare (FcOp op, const FcRange *a, const FcRange *b)
|
||||||
FcChar32
|
FcChar32
|
||||||
FcRangeHash (const FcRange *r)
|
FcRangeHash (const FcRange *r)
|
||||||
{
|
{
|
||||||
FcRange c = FcRangeCanonicalize (r);
|
int b = (int) (r->begin * 100);
|
||||||
int b = (int) (c.u.d.begin * 100);
|
int e = (int) (r->end * 100);
|
||||||
int e = FcDoubleCmpEQ (c.u.d.end, DBL_MAX) ? INT_MAX : (int) (c.u.d.end * 100);
|
|
||||||
|
|
||||||
return b ^ (b << 1) ^ (e << 9);
|
return b ^ (b << 1) ^ (e << 9);
|
||||||
}
|
}
|
||||||
|
|
12
src/fcxml.c
12
src/fcxml.c
|
@ -1261,7 +1261,6 @@ FcParseBlank (FcConfigParse *parse)
|
||||||
{
|
{
|
||||||
int n = FcVStackElements (parse);
|
int n = FcVStackElements (parse);
|
||||||
FcChar32 i, begin, end;
|
FcChar32 i, begin, end;
|
||||||
FcRange r;
|
|
||||||
|
|
||||||
while (n-- > 0)
|
while (n-- > 0)
|
||||||
{
|
{
|
||||||
|
@ -1278,9 +1277,8 @@ FcParseBlank (FcConfigParse *parse)
|
||||||
goto bail;
|
goto bail;
|
||||||
break;
|
break;
|
||||||
case FcVStackRange:
|
case FcVStackRange:
|
||||||
r = FcRangeCanonicalize (v->u.range);
|
begin = (FcChar32) v->u.range->begin;
|
||||||
begin = (FcChar32)r.u.d.begin;
|
end = (FcChar32) v->u.range->end;
|
||||||
end = (FcChar32)r.u.d.end;
|
|
||||||
if (begin <= end)
|
if (begin <= end)
|
||||||
{
|
{
|
||||||
for (i = begin; i <= end; i++)
|
for (i = begin; i <= end; i++)
|
||||||
|
@ -1593,7 +1591,6 @@ FcParseCharSet (FcConfigParse *parse)
|
||||||
FcVStack *vstack;
|
FcVStack *vstack;
|
||||||
FcCharSet *charset = FcCharSetCreate ();
|
FcCharSet *charset = FcCharSetCreate ();
|
||||||
FcChar32 i, begin, end;
|
FcChar32 i, begin, end;
|
||||||
FcRange r;
|
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
|
||||||
while ((vstack = FcVStackPeek (parse)))
|
while ((vstack = FcVStackPeek (parse)))
|
||||||
|
@ -1608,9 +1605,8 @@ FcParseCharSet (FcConfigParse *parse)
|
||||||
n++;
|
n++;
|
||||||
break;
|
break;
|
||||||
case FcVStackRange:
|
case FcVStackRange:
|
||||||
r = FcRangeCanonicalize (vstack->u.range);
|
begin = (FcChar32) vstack->u.range->begin;
|
||||||
begin = (FcChar32)r.u.d.begin;
|
end = (FcChar32) vstack->u.range->end;
|
||||||
end = (FcChar32)r.u.d.end;
|
|
||||||
|
|
||||||
if (begin <= end)
|
if (begin <= end)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue