| /* |
| * fontconfig/src/fcrange.c |
| * |
| * Copyright © 2002 Keith Packard |
| * |
| * Permission to use, copy, modify, distribute, and sell this software and its |
| * documentation for any purpose is hereby granted without fee, provided that |
| * the above copyright notice appear in all copies and that both that |
| * copyright notice and this permission notice appear in supporting |
| * documentation, and that the name of the author(s) not be used in |
| * advertising or publicity pertaining to distribution of the software without |
| * specific, written prior permission. The authors make no |
| * representations about the suitability of this software for any purpose. It |
| * is provided "as is" without express or implied warranty. |
| * |
| * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, |
| * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO |
| * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR |
| * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, |
| * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER |
| * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
| * PERFORMANCE OF THIS SOFTWARE. |
| */ |
| |
| #include "fcint.h" |
| |
| |
| FcRange * |
| FcRangeCreateDouble (double begin, double end) |
| { |
| FcRange *ret = malloc (sizeof (FcRange)); |
| |
| if (ret) |
| { |
| ret->begin = begin; |
| ret->end = end; |
| } |
| |
| return ret; |
| } |
| |
| FcRange * |
| FcRangeCreateInteger (FcChar32 begin, FcChar32 end) |
| { |
| FcRange *ret = malloc (sizeof (FcRange)); |
| |
| if (ret) |
| { |
| ret->begin = begin; |
| ret->end = end; |
| } |
| |
| return ret; |
| } |
| |
| void |
| FcRangeDestroy (FcRange *range) |
| { |
| free (range); |
| } |
| |
| FcRange * |
| FcRangeCopy (const FcRange *range) |
| { |
| return FcRangeCreateDouble (range->begin, range->end); |
| } |
| |
| FcBool |
| FcRangeGetDouble(const FcRange *range, double *begin, double *end) |
| { |
| if (!range) |
| return FcFalse; |
| if (begin) |
| *begin = range->begin; |
| if (end) |
| *end = range->end; |
| |
| return FcTrue; |
| } |
| |
| FcRange * |
| FcRangePromote (double v, FcValuePromotionBuffer *vbuf) |
| { |
| typedef struct { |
| FcRange r; |
| } FcRangePromotionBuffer; |
| FcRangePromotionBuffer *buf = (FcRangePromotionBuffer *) vbuf; |
| |
| FC_ASSERT_STATIC (sizeof (FcRangePromotionBuffer) <= sizeof (FcValuePromotionBuffer)); |
| buf->r.begin = v; |
| buf->r.end = v; |
| |
| return &buf->r; |
| } |
| |
| FcBool |
| FcRangeIsInRange (const FcRange *a, const FcRange *b) |
| { |
| return a->begin >= b->begin && a->end <= b->end; |
| } |
| |
| FcBool |
| FcRangeCompare (FcOp op, const FcRange *a, const FcRange *b) |
| { |
| switch ((int) op) { |
| case FcOpEqual: |
| return a->begin == b->begin && a->end == b->end; |
| case FcOpContains: |
| case FcOpListing: |
| return FcRangeIsInRange (a, b); |
| case FcOpNotEqual: |
| return a->begin != b->begin || a->end != b->end; |
| case FcOpNotContains: |
| return !FcRangeIsInRange (a, b); |
| case FcOpLess: |
| return a->end < b->begin; |
| case FcOpLessEqual: |
| return a->end <= b->begin; |
| case FcOpMore: |
| return a->begin > b->end; |
| case FcOpMoreEqual: |
| return a->begin >= b->end; |
| default: |
| break; |
| } |
| return FcFalse; |
| } |
| |
| FcChar32 |
| FcRangeHash (const FcRange *r) |
| { |
| int b = (int) (r->begin * 100); |
| int e = (int) (r->end * 100); |
| |
| return b ^ (b << 1) ^ (e << 9); |
| } |
| |
| FcBool |
| FcRangeSerializeAlloc (FcSerialize *serialize, const FcRange *r) |
| { |
| if (!FcSerializeAlloc (serialize, r, sizeof (FcRange))) |
| return FcFalse; |
| return FcTrue; |
| } |
| |
| FcRange * |
| FcRangeSerialize (FcSerialize *serialize, const FcRange *r) |
| { |
| FcRange *r_serialize = FcSerializePtr (serialize, r); |
| |
| if (!r_serialize) |
| return NULL; |
| memcpy (r_serialize, r, sizeof (FcRange)); |
| |
| return r_serialize; |
| } |
| |
| #define __fcrange__ |
| #include "fcaliastail.h" |
| #undef __fcrange__ |