Blame src/fcrange.c

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