1/* 2 * fontconfig/src/fcrange.c 3 * 4 * Copyright © 2002 Keith Packard 5 * 6 * Permission to use, copy, modify, distribute, and sell this software and its 7 * documentation for any purpose is hereby granted without fee, provided that 8 * the above copyright notice appear in all copies and that both that 9 * copyright notice and this permission notice appear in supporting 10 * documentation, and that the name of the author(s) not be used in 11 * advertising or publicity pertaining to distribution of the software without 12 * specific, written prior permission. The authors make no 13 * representations about the suitability of this software for any purpose. It 14 * is provided "as is" without express or implied warranty. 15 * 16 * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 17 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 18 * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR 19 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 20 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 21 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 22 * PERFORMANCE OF THIS SOFTWARE. 23 */ 24 25#include "fcint.h" 26 27 28FcRange * 29FcRangeCreateDouble (double begin, double end) 30{ 31 FcRange *ret = malloc (sizeof (FcRange)); 32 33 if (ret) 34 { 35 ret->begin = begin; 36 ret->end = end; 37 } 38 39 return ret; 40} 41 42FcRange * 43FcRangeCreateInteger (FcChar32 begin, FcChar32 end) 44{ 45 FcRange *ret = malloc (sizeof (FcRange)); 46 47 if (ret) 48 { 49 ret->begin = begin; 50 ret->end = end; 51 } 52 53 return ret; 54} 55 56void 57FcRangeDestroy (FcRange *range) 58{ 59 if (range) 60 free (range); 61} 62 63FcRange * 64FcRangeCopy (const FcRange *range) 65{ 66 return FcRangeCreateDouble (range->begin, range->end); 67} 68 69FcBool 70FcRangeGetDouble(const FcRange *range, double *begin, double *end) 71{ 72 if (!range) 73 return FcFalse; 74 if (begin) 75 *begin = range->begin; 76 if (end) 77 *end = range->end; 78 79 return FcTrue; 80} 81 82FcRange * 83FcRangePromote (double v, FcValuePromotionBuffer *vbuf) 84{ 85 typedef struct { 86 FcRange r; 87 } FcRangePromotionBuffer; 88 FcRangePromotionBuffer *buf = (FcRangePromotionBuffer *) vbuf; 89 90 FC_ASSERT_STATIC (sizeof (FcRangePromotionBuffer) <= sizeof (FcValuePromotionBuffer)); 91 buf->r.begin = v; 92 buf->r.end = v; 93 94 return &buf->r; 95} 96 97FcBool 98FcRangeIsInRange (const FcRange *a, const FcRange *b) 99{ 100 return a->begin >= b->begin && a->end <= b->end; 101} 102 103FcBool 104FcRangeCompare (FcOp op, const FcRange *a, const FcRange *b) 105{ 106 switch ((int) op) { 107 case FcOpEqual: 108 return a->begin == b->begin && a->end == b->end; 109 case FcOpContains: 110 case FcOpListing: 111 return FcRangeIsInRange (a, b); 112 case FcOpNotEqual: 113 return a->begin != b->begin || a->end != b->end; 114 case FcOpNotContains: 115 return !FcRangeIsInRange (a, b); 116 case FcOpLess: 117 return a->end < b->begin; 118 case FcOpLessEqual: 119 return a->end <= b->begin; 120 case FcOpMore: 121 return a->begin > b->end; 122 case FcOpMoreEqual: 123 return a->begin >= b->end; 124 default: 125 break; 126 } 127 return FcFalse; 128} 129 130FcChar32 131FcRangeHash (const FcRange *r) 132{ 133 int b = (int) (r->begin * 100); 134 int e = (int) (r->end * 100); 135 136 return b ^ (b << 1) ^ (e << 9); 137} 138 139FcBool 140FcRangeSerializeAlloc (FcSerialize *serialize, const FcRange *r) 141{ 142 if (!FcSerializeAlloc (serialize, r, sizeof (FcRange))) 143 return FcFalse; 144 return FcTrue; 145} 146 147FcRange * 148FcRangeSerialize (FcSerialize *serialize, const FcRange *r) 149{ 150 FcRange *r_serialize = FcSerializePtr (serialize, r); 151 152 if (!r_serialize) 153 return NULL; 154 memcpy (r_serialize, r, sizeof (FcRange)); 155 156 return r_serialize; 157} 158 159#define __fcrange__ 160#include "fcaliastail.h" 161#undef __fcrange__ 162