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{
591cc69409Smrg    if (range)
601cc69409Smrg	free (range);
61953daebaSmrg}
62953daebaSmrg
63953daebaSmrgFcRange *
64953daebaSmrgFcRangeCopy (const FcRange *range)
65953daebaSmrg{
66953daebaSmrg    return FcRangeCreateDouble (range->begin, range->end);
67953daebaSmrg}
68953daebaSmrg
69953daebaSmrgFcBool
70953daebaSmrgFcRangeGetDouble(const FcRange *range, double *begin, double *end)
71953daebaSmrg{
72953daebaSmrg    if (!range)
73953daebaSmrg	return FcFalse;
74953daebaSmrg    if (begin)
75953daebaSmrg	*begin = range->begin;
76953daebaSmrg    if (end)
77953daebaSmrg	*end = range->end;
78953daebaSmrg
79953daebaSmrg    return FcTrue;
80953daebaSmrg}
81953daebaSmrg
82953daebaSmrgFcRange *
83953daebaSmrgFcRangePromote (double v, FcValuePromotionBuffer *vbuf)
84953daebaSmrg{
85953daebaSmrg    typedef struct {
86953daebaSmrg	FcRange	r;
87953daebaSmrg    } FcRangePromotionBuffer;
88953daebaSmrg    FcRangePromotionBuffer *buf = (FcRangePromotionBuffer *) vbuf;
89953daebaSmrg
90953daebaSmrg    FC_ASSERT_STATIC (sizeof (FcRangePromotionBuffer) <= sizeof (FcValuePromotionBuffer));
91953daebaSmrg    buf->r.begin = v;
92953daebaSmrg    buf->r.end = v;
93953daebaSmrg
94953daebaSmrg    return &buf->r;
95953daebaSmrg}
96953daebaSmrg
97953daebaSmrgFcBool
98953daebaSmrgFcRangeIsInRange (const FcRange *a, const FcRange *b)
99953daebaSmrg{
100953daebaSmrg    return a->begin >= b->begin && a->end <= b->end;
101953daebaSmrg}
102953daebaSmrg
103953daebaSmrgFcBool
104953daebaSmrgFcRangeCompare (FcOp op, const FcRange *a, const FcRange *b)
105953daebaSmrg{
106953daebaSmrg    switch ((int) op) {
107953daebaSmrg    case FcOpEqual:
108a32e9e42Smrg	return a->begin == b->begin && a->end == b->end;
109953daebaSmrg    case FcOpContains:
110953daebaSmrg    case FcOpListing:
111953daebaSmrg	return FcRangeIsInRange (a, b);
112953daebaSmrg    case FcOpNotEqual:
113a32e9e42Smrg	return a->begin != b->begin || a->end != b->end;
114953daebaSmrg    case FcOpNotContains:
115953daebaSmrg	return !FcRangeIsInRange (a, b);
116953daebaSmrg    case FcOpLess:
117a32e9e42Smrg	return a->end < b->begin;
118953daebaSmrg    case FcOpLessEqual:
119a32e9e42Smrg	return a->end <= b->begin;
120953daebaSmrg    case FcOpMore:
121a32e9e42Smrg	return a->begin > b->end;
122953daebaSmrg    case FcOpMoreEqual:
123a32e9e42Smrg	return a->begin >= 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