hb-private.hh revision 35a7383c6138fd705560f0d4bb30659cbd1ab64c
164aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod/* 26c78683c042250a7b5a6fc6ebae4717b03fadf9eBehdad Esfahbod * Copyright (C) 2007,2008,2009 Red Hat, Inc. 364aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * 464aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * This is part of HarfBuzz, an OpenType Layout engine library. 564aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * 664aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * Permission is hereby granted, without written agreement and without 764aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this 864aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * software and its documentation for any purpose, provided that the 964aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * above copyright notice and the following two paragraphs appear in 1064aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * all copies of this software. 1164aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * 1264aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 1364aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 1464aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 1564aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 1664aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * DAMAGE. 1764aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * 1864aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 1964aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 2064aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 2164aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 2264aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 2364aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * 2464aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * Red Hat Author(s): Behdad Esfahbod 2564aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod */ 2664aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod 278dd1c8b8d6797d899d0f5b0a8015886bf6520ca2Behdad Esfahbod#ifndef HB_PRIVATE_H 288dd1c8b8d6797d899d0f5b0a8015886bf6520ca2Behdad Esfahbod#define HB_PRIVATE_H 295b3f7702a64fe0513d08a67bdb72704e46fd7cd4Behdad Esfahbod 30f9cd1014f8f4d0394b5e0e9eefc1e2af13c59cabBehdad Esfahbod#include "hb-common.h" 31c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod 3212360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#include <glib.h> 3312360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod 3412360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod/* Macros to convert to/from BigEndian */ 3512360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_uint8_t 3612360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_int8_t 3712360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_uint16_t GUINT16_TO_BE 3812360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_int16_t GINT16_TO_BE 3912360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_uint32_t GUINT32_TO_BE 4012360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_int32_t GINT32_TO_BE 4112360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_uint64_t GUINT64_TO_BE 4212360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_int64_t GINT64_TO_BE 4312360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod 44c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#define HB_LIKELY G_LIKELY 4512360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define HB_UNLIKELY G_UNLIKELY 467586089c6fa8185cad8387869d3703c637e5cbb1Behdad Esfahbod#define HB_UNUSED(arg) ((arg) = (arg)) 47c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#define HB_GNUC_UNUSED G_GNUC_UNUSED 48c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod 49c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod 50c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#include <stdlib.h> 51c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#include <stdio.h> /* XXX */ 52f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#include <string.h> 53f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#include <assert.h> 54c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod 55c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod/* Basics */ 56c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod 57c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#undef MIN 58c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#define MIN(a,b) ((a) < (b) ? (a) : (b)) 597586089c6fa8185cad8387869d3703c637e5cbb1Behdad Esfahbod 60c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#ifndef HB_INTERNAL 61c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod# define HB_INTERNAL 62c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#endif 63c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod 64c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#ifndef NULL 65c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod# define NULL ((void *)0) 66c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#endif 67c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod 68c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#ifndef FALSE 69c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod# define FALSE 0 70c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#endif 71c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod 72c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#ifndef TRUE 73c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod# define TRUE 1 74c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#endif 7512360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod 7635a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod#define HB_STMT_START do 7735a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod#define HB_STMT_END while (0) 785b3f7702a64fe0513d08a67bdb72704e46fd7cd4Behdad Esfahbod 79303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod#define _ASSERT_STATIC1(_line, _cond) typedef int _static_assert_on_line_##_line##_failed[(_cond)?1:-1] 80303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod#define _ASSERT_STATIC0(_line, _cond) _ASSERT_STATIC1 (_line, (_cond)) 81303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod#define ASSERT_STATIC(_cond) _ASSERT_STATIC0 (__LINE__, (_cond)) 82303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod 83303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod#define ASSERT_SIZE(_type, _size) ASSERT_STATIC (sizeof (_type) == (_size)) 84303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod 85c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod 86c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod/* Return the number of 1 bits in mask. 87c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod * 88c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod * GCC 3.4 supports a "population count" builtin, which on many targets is 89c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod * implemented with a single instruction. There is a fallback definition 90c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod * in libgcc in case a target does not have one, which should be just as 91c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod * good as the open-coded solution below, (which is "HACKMEM 169"). 92c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod */ 93c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbodstatic inline unsigned int 94c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod_hb_popcount32 (uint32_t mask) 95c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod{ 96c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) 97c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod return __builtin_popcount (mask); 98c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#else 99c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod register int y; 100c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod 101c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod y = (mask >> 1) &033333333333; 102c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod y = mask - y - ((y >>1) & 033333333333); 103c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod return (((y + (y >> 3)) & 030707070707) % 077); 104c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#endif 105c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod} 106c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod 1078dd1c8b8d6797d899d0f5b0a8015886bf6520ca2Behdad Esfahbod#endif /* HB_PRIVATE_H */ 108