(root)/
fontconfig-2.14.2/
src/
fcrange.c
       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  
      28  FcRange *
      29  FcRangeCreateDouble (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  
      42  FcRange *
      43  FcRangeCreateInteger (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  
      56  void
      57  FcRangeDestroy (FcRange *range)
      58  {
      59      if (range)
      60  	free (range);
      61  }
      62  
      63  FcRange *
      64  FcRangeCopy (const FcRange *range)
      65  {
      66      return FcRangeCreateDouble (range->begin, range->end);
      67  }
      68  
      69  FcBool
      70  FcRangeGetDouble(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  
      82  FcRange *
      83  FcRangePromote (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  
      97  FcBool
      98  FcRangeIsInRange (const FcRange *a, const FcRange *b)
      99  {
     100      return a->begin >= b->begin && a->end <= b->end;
     101  }
     102  
     103  FcBool
     104  FcRangeCompare (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  
     130  FcChar32
     131  FcRangeHash (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  
     139  FcBool
     140  FcRangeSerializeAlloc (FcSerialize *serialize, const FcRange *r)
     141  {
     142      if (!FcSerializeAlloc (serialize, r, sizeof (FcRange)))
     143  	return FcFalse;
     144      return FcTrue;
     145  }
     146  
     147  FcRange *
     148  FcRangeSerialize (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__