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