fcrange.c revision 953daeba
1953daebaSmrg/*
2953daebaSmrg * fontconfig/src/fcrange.c
3953daebaSmrg *
4953daebaSmrg * Copyright © 2002 Keith Packard
5953daebaSmrg *
6953daebaSmrg * Permission to use, copy, modify, distribute, and sell this software and its
7953daebaSmrg * documentation for any purpose is hereby granted without fee, provided that
8953daebaSmrg * the above copyright notice appear in all copies and that both that
9953daebaSmrg * copyright notice and this permission notice appear in supporting
10953daebaSmrg * documentation, and that the name of the author(s) not be used in
11953daebaSmrg * advertising or publicity pertaining to distribution of the software without
12953daebaSmrg * specific, written prior permission.  The authors make no
13953daebaSmrg * representations about the suitability of this software for any purpose.  It
14953daebaSmrg * is provided "as is" without express or implied warranty.
15953daebaSmrg *
16953daebaSmrg * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17953daebaSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18953daebaSmrg * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19953daebaSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20953daebaSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21953daebaSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22953daebaSmrg * PERFORMANCE OF THIS SOFTWARE.
23953daebaSmrg */
24953daebaSmrg
25953daebaSmrg#include "fcint.h"
26953daebaSmrg
27953daebaSmrg
28953daebaSmrgFcRange *
29953daebaSmrgFcRangeCreateDouble (double begin, double end)
30953daebaSmrg{
31953daebaSmrg    FcRange *ret = malloc (sizeof (FcRange));
32953daebaSmrg
33953daebaSmrg    if (ret)
34953daebaSmrg    {
35953daebaSmrg	ret->begin = begin;
36953daebaSmrg	ret->end = end;
37953daebaSmrg    }
38953daebaSmrg
39953daebaSmrg    return ret;
40953daebaSmrg}
41953daebaSmrg
42953daebaSmrgFcRange *
43953daebaSmrgFcRangeCreateInteger (FcChar32 begin, FcChar32 end)
44953daebaSmrg{
45953daebaSmrg    FcRange *ret = malloc (sizeof (FcRange));
46953daebaSmrg
47953daebaSmrg    if (ret)
48953daebaSmrg    {
49953daebaSmrg	ret->begin = begin;
50953daebaSmrg	ret->end = end;
51953daebaSmrg    }
52953daebaSmrg
53953daebaSmrg    return ret;
54953daebaSmrg}
55953daebaSmrg
56953daebaSmrgvoid
57953daebaSmrgFcRangeDestroy (FcRange *range)
58953daebaSmrg{
59953daebaSmrg    free (range);
60953daebaSmrg}
61953daebaSmrg
62953daebaSmrgFcRange *
63953daebaSmrgFcRangeCopy (const FcRange *range)
64953daebaSmrg{
65953daebaSmrg    return FcRangeCreateDouble (range->begin, range->end);
66953daebaSmrg}
67953daebaSmrg
68953daebaSmrgFcBool
69953daebaSmrgFcRangeGetDouble(const FcRange *range, double *begin, double *end)
70953daebaSmrg{
71953daebaSmrg    if (!range)
72953daebaSmrg	return FcFalse;
73953daebaSmrg    if (begin)
74953daebaSmrg	*begin = range->begin;
75953daebaSmrg    if (end)
76953daebaSmrg	*end = range->end;
77953daebaSmrg
78953daebaSmrg    return FcTrue;
79953daebaSmrg}
80953daebaSmrg
81953daebaSmrgFcRange *
82953daebaSmrgFcRangePromote (double v, FcValuePromotionBuffer *vbuf)
83953daebaSmrg{
84953daebaSmrg    typedef struct {
85953daebaSmrg	FcRange	r;
86953daebaSmrg    } FcRangePromotionBuffer;
87953daebaSmrg    FcRangePromotionBuffer *buf = (FcRangePromotionBuffer *) vbuf;
88953daebaSmrg
89953daebaSmrg    FC_ASSERT_STATIC (sizeof (FcRangePromotionBuffer) <= sizeof (FcValuePromotionBuffer));
90953daebaSmrg    buf->r.begin = v;
91953daebaSmrg    buf->r.end = v;
92953daebaSmrg
93953daebaSmrg    return &buf->r;
94953daebaSmrg}
95953daebaSmrg
96953daebaSmrgFcBool
97953daebaSmrgFcRangeIsInRange (const FcRange *a, const FcRange *b)
98953daebaSmrg{
99953daebaSmrg    if (!a || !b)
100953daebaSmrg	return FcFalse;
101953daebaSmrg
102953daebaSmrg    return a->begin >= b->begin && a->end <= b->end;
103953daebaSmrg}
104953daebaSmrg
105953daebaSmrgFcBool
106953daebaSmrgFcRangeCompare (FcOp op, const FcRange *a, const FcRange *b)
107953daebaSmrg{
108953daebaSmrg    switch ((int) op) {
109953daebaSmrg    case FcOpEqual:
110953daebaSmrg    case FcOpContains:
111953daebaSmrg    case FcOpListing:
112953daebaSmrg	return FcRangeIsInRange (a, b);
113953daebaSmrg    case FcOpNotEqual:
114953daebaSmrg    case FcOpNotContains:
115953daebaSmrg	return !FcRangeIsInRange (a, b);
116953daebaSmrg    case FcOpLess:
117953daebaSmrg	return a->begin < b->begin;
118953daebaSmrg    case FcOpLessEqual:
119953daebaSmrg	return a->begin <= b->begin;
120953daebaSmrg    case FcOpMore:
121953daebaSmrg	return a->end > b->end;
122953daebaSmrg    case FcOpMoreEqual:
123953daebaSmrg	return a->end >= b->end;
124953daebaSmrg    default:
125953daebaSmrg	break;
126953daebaSmrg    }
127953daebaSmrg    return FcFalse;
128953daebaSmrg}
129953daebaSmrg
130953daebaSmrgFcChar32
131953daebaSmrgFcRangeHash (const FcRange *r)
132953daebaSmrg{
133953daebaSmrg    int b = (int) (r->begin * 100);
134953daebaSmrg    int e = (int) (r->end * 100);
135953daebaSmrg
136953daebaSmrg    return b ^ (b << 1) ^ (e << 9);
137953daebaSmrg}
138953daebaSmrg
139953daebaSmrgFcBool
140953daebaSmrgFcRangeSerializeAlloc (FcSerialize *serialize, const FcRange *r)
141953daebaSmrg{
142953daebaSmrg    if (!FcSerializeAlloc (serialize, r, sizeof (FcRange)))
143953daebaSmrg	return FcFalse;
144953daebaSmrg    return FcTrue;
145953daebaSmrg}
146953daebaSmrg
147953daebaSmrgFcRange *
148953daebaSmrgFcRangeSerialize (FcSerialize *serialize, const FcRange *r)
149953daebaSmrg{
150953daebaSmrg    FcRange *r_serialize = FcSerializePtr (serialize, r);
151953daebaSmrg
152953daebaSmrg    if (!r_serialize)
153953daebaSmrg	return NULL;
154953daebaSmrg    memcpy (r_serialize, r, sizeof (FcRange));
155953daebaSmrg
156953daebaSmrg    return r_serialize;
157953daebaSmrg}
158953daebaSmrg
159953daebaSmrg#define __fcrange__
160953daebaSmrg#include "fcaliastail.h"
161953daebaSmrg#undef __fcrange__
162