hb-ot-shape-complex-private.hh 6.5 KB
Newer Older
1
/*
B
Behdad Esfahbod 已提交
2
 * Copyright © 2010,2011  Google, Inc.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
 *
 *  This is part of HarfBuzz, a text shaping library.
 *
 * Permission is hereby granted, without written agreement and without
 * license or royalty fees, to use, copy, modify, and distribute this
 * software and its documentation for any purpose, provided that the
 * above copyright notice and the following two paragraphs appear in
 * all copies of this software.
 *
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 *
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 *
 * Google Author(s): Behdad Esfahbod
 */

#ifndef HB_OT_SHAPE_COMPLEX_PRIVATE_HH
#define HB_OT_SHAPE_COMPLEX_PRIVATE_HH

30
#include "hb-private.hh"
31

32
#include "hb-ot-map-private.hh"
33 34 35



36
/* buffer var allocations, used during the entire shaping process */
37 38 39
#define general_category() var1.u8[0] /* unicode general_category (hb_unicode_general_category_t) */
#define combining_class() var1.u8[1] /* unicode combining_class (uint8_t) */

40 41 42 43 44 45 46 47
/* buffer var allocations, used by complex shapers */
#define complex_var_persistent_u8_0()	var2.u8[0]
#define complex_var_persistent_u8_1()	var2.u8[1]
#define complex_var_persistent_u16()	var2.u16[0]
#define complex_var_temporary_u8_0()	var2.u8[2]
#define complex_var_temporary_u8_1()	var2.u8[3]
#define complex_var_temporary_u16()	var2.u16[1]

48

49 50 51 52 53 54
#define HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS \
  HB_COMPLEX_SHAPER_IMPLEMENT (default) /* should be first */ \
  HB_COMPLEX_SHAPER_IMPLEMENT (arabic) \
  HB_COMPLEX_SHAPER_IMPLEMENT (indic) \
  /* ^--- Add new shapers here */

55
enum hb_ot_complex_shaper_t {
56 57 58
#define HB_COMPLEX_SHAPER_IMPLEMENT(name) hb_ot_complex_shaper_##name,
  HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
#undef HB_COMPLEX_SHAPER_IMPLEMENT
59 60
};

61 62 63
static inline hb_ot_complex_shaper_t
hb_ot_shape_complex_categorize (const hb_segment_properties_t *props)
{
64 65
  switch ((int) props->script)
  {
66 67 68
    default:
      return hb_ot_complex_shaper_default;

69
    case HB_SCRIPT_ARABIC:
70
    case HB_SCRIPT_MANDAIC:
71
    case HB_SCRIPT_MONGOLIAN:
B
Behdad Esfahbod 已提交
72 73
    case HB_SCRIPT_NKO:
    case HB_SCRIPT_SYRIAC:
74 75
      return hb_ot_complex_shaper_arabic;

B
Behdad Esfahbod 已提交
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
    /* TODO: These are all the scripts that the ucd/IndicSyllabicCategory.txt covers.
     * Quite possibly many of these need no shaping, and some other are encoded visually.
     * Needs to be refined.
     */
    case HB_SCRIPT_BALINESE:
    case HB_SCRIPT_BATAK:
    case HB_SCRIPT_BENGALI:
    case HB_SCRIPT_BRAHMI:
    case HB_SCRIPT_BUGINESE:
    case HB_SCRIPT_BUHID:
    case HB_SCRIPT_CHAM:
    case HB_SCRIPT_DEVANAGARI:
    case HB_SCRIPT_GUJARATI:
    case HB_SCRIPT_GURMUKHI:
    case HB_SCRIPT_HANUNOO:
    case HB_SCRIPT_JAVANESE:
    case HB_SCRIPT_KAITHI:
    case HB_SCRIPT_KANNADA:
    case HB_SCRIPT_KAYAH_LI:
    case HB_SCRIPT_KHAROSHTHI:
    case HB_SCRIPT_KHMER:
    case HB_SCRIPT_LAO:
    case HB_SCRIPT_LEPCHA:
    case HB_SCRIPT_LIMBU:
    case HB_SCRIPT_MALAYALAM:
    case HB_SCRIPT_MEETEI_MAYEK:
    case HB_SCRIPT_MYANMAR:
    case HB_SCRIPT_NEW_TAI_LUE:
    case HB_SCRIPT_ORIYA:
    case HB_SCRIPT_PHAGS_PA:
    case HB_SCRIPT_REJANG:
    case HB_SCRIPT_SAURASHTRA:
    case HB_SCRIPT_SINHALA:
    case HB_SCRIPT_SUNDANESE:
    case HB_SCRIPT_SYLOTI_NAGRI:
    case HB_SCRIPT_TAGALOG:
    case HB_SCRIPT_TAGBANWA:
    case HB_SCRIPT_TAI_LE:
    case HB_SCRIPT_TAI_THAM:
    case HB_SCRIPT_TAI_VIET:
    case HB_SCRIPT_TAMIL:
    case HB_SCRIPT_TELUGU:
    case HB_SCRIPT_THAI:
    case HB_SCRIPT_TIBETAN:
      return hb_ot_complex_shaper_indic;

122
    /* ^--- Add new shapers here */
123 124 125 126 127 128 129 130
  }
}



/*
 * collect_features()
 *
B
Behdad Esfahbod 已提交
131 132
 * Called during shape_plan().
 *
133
 * Shapers should use map to add their features and callbacks.
134 135
 */

136
typedef void hb_ot_shape_complex_collect_features_func_t (hb_ot_map_builder_t *map, const hb_segment_properties_t  *props);
137 138 139 140
#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
  HB_INTERNAL hb_ot_shape_complex_collect_features_func_t _hb_ot_shape_complex_collect_features_##name;
  HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
#undef HB_COMPLEX_SHAPER_IMPLEMENT
141 142

static inline void
143 144
hb_ot_shape_complex_collect_features (hb_ot_complex_shaper_t shaper,
				      hb_ot_map_builder_t *map,
145 146
				      const hb_segment_properties_t  *props)
{
147
  switch (shaper) {
B
Minor  
Behdad Esfahbod 已提交
148
    default:
149
#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
    case hb_ot_complex_shaper_##name:	_hb_ot_shape_complex_collect_features_##name (map, props); return;
    HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
#undef HB_COMPLEX_SHAPER_IMPLEMENT
  }
}


/*
 * prefer_decomposed()
 *
 * Called during shape_execute().
 *
 * Shapers should return TRUE if it prefers decomposed (NFD) input rather than precomposed (NFC).
 */

typedef bool hb_ot_shape_complex_prefer_decomposed_func_t (void);
#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
  HB_INTERNAL hb_ot_shape_complex_prefer_decomposed_func_t _hb_ot_shape_complex_prefer_decomposed_##name;
  HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
#undef HB_COMPLEX_SHAPER_IMPLEMENT

static inline bool
hb_ot_shape_complex_prefer_decomposed (hb_ot_complex_shaper_t shaper)
{
  switch (shaper) {
    default:
#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
    case hb_ot_complex_shaper_##name:	return _hb_ot_shape_complex_prefer_decomposed_##name ();
178 179
    HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
#undef HB_COMPLEX_SHAPER_IMPLEMENT
180 181 182 183
  }
}


B
Behdad Esfahbod 已提交
184 185 186 187
/* setup_masks()
 *
 * Called during shape_execute().
 *
188
 * Shapers should use map to get feature masks and set on buffer.
B
Behdad Esfahbod 已提交
189 190
 */

191
typedef void hb_ot_shape_complex_setup_masks_func_t (hb_ot_map_t *map, hb_buffer_t *buffer);
192 193 194 195
#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
  HB_INTERNAL hb_ot_shape_complex_setup_masks_func_t _hb_ot_shape_complex_setup_masks_##name;
  HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
#undef HB_COMPLEX_SHAPER_IMPLEMENT
B
Behdad Esfahbod 已提交
196 197

static inline void
198 199 200
hb_ot_shape_complex_setup_masks (hb_ot_complex_shaper_t shaper,
				 hb_ot_map_t *map,
				 hb_buffer_t *buffer)
B
Behdad Esfahbod 已提交
201
{
202
  switch (shaper) {
B
Minor  
Behdad Esfahbod 已提交
203
    default:
204
#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
205
    case hb_ot_complex_shaper_##name:	_hb_ot_shape_complex_setup_masks_##name (map, buffer); return;
206 207
    HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
#undef HB_COMPLEX_SHAPER_IMPLEMENT
B
Behdad Esfahbod 已提交
208 209 210
  }
}

211 212 213


#endif /* HB_OT_SHAPE_COMPLEX_PRIVATE_HH */