hb-ot-shape-complex-indic.cc 6.6 KB
Newer Older
B
Behdad Esfahbod 已提交
1
/*
B
Behdad Esfahbod 已提交
2
 * Copyright © 2011  Google, Inc.
B
Behdad Esfahbod 已提交
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 30 31 32
 *
 *  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
 */

#include "hb-ot-shape-complex-private.hh"

HB_BEGIN_DECLS


/* buffer var allocations */
33 34
#define indic_category() var2.u8[0] /* indic_category_t */
#define indic_position() var2.u8[1] /* indic_matra_category_t */
B
Behdad Esfahbod 已提交
35 36 37

#define INDIC_TABLE_ELEMENT_TYPE uint8_t

B
Behdad Esfahbod 已提交
38 39 40
/* Cateories used in the OpenType spec:
 * https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx
 */
41 42
/* Note: This enum is duplicated in the -machine.rl source file.
 * Not sure how to avoid duplication. */
43
enum indic_category_t {
B
Behdad Esfahbod 已提交
44 45
  OT_X = 0,
  OT_C,
46
  OT_Ra, /* Not explicitly listed in the OT spec, but used in the grammar. */
B
Behdad Esfahbod 已提交
47 48 49 50 51 52 53 54 55
  OT_V,
  OT_N,
  OT_H,
  OT_ZWNJ,
  OT_ZWJ,
  OT_M,
  OT_SM,
  OT_VD,
  OT_A,
56
  OT_NBSP
B
Behdad Esfahbod 已提交
57 58 59 60
};

/* Categories used in IndicSyllabicCategory.txt from UCD */
/* The assignments are guesswork */
B
Behdad Esfahbod 已提交
61
enum indic_syllabic_category_t {
B
Behdad Esfahbod 已提交
62 63
  INDIC_SYLLABIC_CATEGORY_OTHER			= OT_X,

64
  INDIC_SYLLABIC_CATEGORY_AVAGRAHA		= OT_X,
B
Behdad Esfahbod 已提交
65 66 67 68 69 70 71 72 73
  INDIC_SYLLABIC_CATEGORY_BINDU			= OT_SM,
  INDIC_SYLLABIC_CATEGORY_CONSONANT		= OT_C,
  INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD	= OT_C,
  INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL	= OT_C,
  INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER	= OT_C,
  INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL	= OT_C,
  INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER	= OT_NBSP,
  INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED	= OT_C,
  INDIC_SYLLABIC_CATEGORY_CONSONANT_REPHA	= OT_C,
74
  INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER	= OT_X,
B
Behdad Esfahbod 已提交
75
  INDIC_SYLLABIC_CATEGORY_NUKTA			= OT_N,
76 77 78
  INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER	= OT_X,
  INDIC_SYLLABIC_CATEGORY_TONE_LETTER		= OT_X,
  INDIC_SYLLABIC_CATEGORY_TONE_MARK		= OT_X,
B
Behdad Esfahbod 已提交
79 80 81 82
  INDIC_SYLLABIC_CATEGORY_VIRAMA		= OT_H,
  INDIC_SYLLABIC_CATEGORY_VISARGA		= OT_SM,
  INDIC_SYLLABIC_CATEGORY_VOWEL			= OT_V,
  INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT	= OT_M,
83
  INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT	= OT_V
B
Behdad Esfahbod 已提交
84 85
};

B
Behdad Esfahbod 已提交
86
/* Categories used in IndicSMatraCategory.txt from UCD */
B
Behdad Esfahbod 已提交
87
enum indic_matra_category_t {
B
Behdad Esfahbod 已提交
88 89
  INDIC_MATRA_CATEGORY_NOT_APPLICABLE		= 0,

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
  INDIC_MATRA_CATEGORY_LEFT			= 0x01,
  INDIC_MATRA_CATEGORY_TOP			= 0x02,
  INDIC_MATRA_CATEGORY_BOTTOM			= 0x04,
  INDIC_MATRA_CATEGORY_RIGHT			= 0x08,

  /* We don't really care much about these since we decompose them
   * in the generic pre-shaping layer. */
  INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT		= INDIC_MATRA_CATEGORY_BOTTOM +
						  INDIC_MATRA_CATEGORY_RIGHT,
  INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT		= INDIC_MATRA_CATEGORY_LEFT +
						  INDIC_MATRA_CATEGORY_RIGHT,
  INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM		= INDIC_MATRA_CATEGORY_TOP +
						  INDIC_MATRA_CATEGORY_BOTTOM,
  INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT	= INDIC_MATRA_CATEGORY_TOP +
						  INDIC_MATRA_CATEGORY_BOTTOM +
						  INDIC_MATRA_CATEGORY_RIGHT,
  INDIC_MATRA_CATEGORY_TOP_AND_LEFT		= INDIC_MATRA_CATEGORY_TOP +
						  INDIC_MATRA_CATEGORY_LEFT,
  INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT	= INDIC_MATRA_CATEGORY_TOP +
						  INDIC_MATRA_CATEGORY_LEFT +
						  INDIC_MATRA_CATEGORY_RIGHT,
  INDIC_MATRA_CATEGORY_TOP_AND_RIGHT		= INDIC_MATRA_CATEGORY_TOP +
						  INDIC_MATRA_CATEGORY_RIGHT,

  INDIC_MATRA_CATEGORY_INVISIBLE		= INDIC_MATRA_CATEGORY_NOT_APPLICABLE,
  INDIC_MATRA_CATEGORY_OVERSTRUCK		= INDIC_MATRA_CATEGORY_NOT_APPLICABLE,
  INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT	= INDIC_MATRA_CATEGORY_NOT_APPLICABLE
B
Behdad Esfahbod 已提交
117 118
};

B
Behdad Esfahbod 已提交
119 120 121 122
#define INDIC_COMBINE_CATEGORIES(S,M) \
  (ASSERT_STATIC_EXPR (M == INDIC_MATRA_CATEGORY_NOT_APPLICABLE || (S == INDIC_SYLLABIC_CATEGORY_VIRAMA || S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT)), \
   ASSERT_STATIC_EXPR (S < 16 && M < 16), \
   (M << 4) | S)
B
Behdad Esfahbod 已提交
123 124 125

#include "hb-ot-shape-complex-indic-table.hh"

126 127 128 129 130

static const struct {
  hb_tag_t tag;
  hb_bool_t is_global;
} indic_basic_features[] =
B
Behdad Esfahbod 已提交
131
{
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
  {HB_TAG('n','u','k','t'), true},
  {HB_TAG('a','k','h','n'), false},
  {HB_TAG('r','p','h','f'), false},
  {HB_TAG('r','k','r','f'), false},
  {HB_TAG('p','r','e','f'), false},
  {HB_TAG('b','l','w','f'), false},
  {HB_TAG('h','a','l','f'), false},
  {HB_TAG('v','a','t','u'), true},
  {HB_TAG('p','s','t','f'), false},
  {HB_TAG('c','j','c','t'), true},
};

/* Same order as the indic_basic_features array */
enum {
  _NUKT,
  AKHN,
  RPHF,
  RKRF,
  PREF,
  BLWF,
  HALF,
  _VATU,
  PSTF,
  _CJCT,
B
Behdad Esfahbod 已提交
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
};

static const hb_tag_t indic_other_features[] =
{
  HB_TAG('p','r','e','s'),
  HB_TAG('a','b','v','s'),
  HB_TAG('b','l','w','s'),
  HB_TAG('p','s','t','s'),
  HB_TAG('h','a','l','n'),

  HB_TAG('d','i','s','t'),
  HB_TAG('a','b','v','m'),
  HB_TAG('b','l','w','m'),
};


void
173
_hb_ot_shape_complex_collect_features_indic (hb_ot_shape_planner_t *planner, const hb_segment_properties_t *props HB_UNUSED)
B
Behdad Esfahbod 已提交
174 175
{
  for (unsigned int i = 0; i < ARRAY_LENGTH (indic_basic_features); i++)
176
    planner->map.add_bool_feature (indic_basic_features[i].tag, indic_basic_features[i].is_global);
B
Behdad Esfahbod 已提交
177 178 179 180 181

  for (unsigned int i = 0; i < ARRAY_LENGTH (indic_other_features); i++)
    planner->map.add_bool_feature (indic_other_features[i], true);
}

182 183 184 185 186


#include "hb-ot-shape-complex-indic-machine.hh"


B
Behdad Esfahbod 已提交
187 188 189 190 191 192 193
void
_hb_ot_shape_complex_setup_masks_indic	(hb_ot_shape_context_t *c)
{
  unsigned int count = c->buffer->len;

  for (unsigned int i = 0; i < count; i++)
  {
194
    unsigned int type = get_indic_categories (c->buffer->info[i].codepoint);
B
Behdad Esfahbod 已提交
195

196 197
    c->buffer->info[i].indic_category() = type & 0x0F;
    c->buffer->info[i].indic_position() = type >> 4;
B
Behdad Esfahbod 已提交
198 199
  }

200 201
  find_syllables (c);

B
Behdad Esfahbod 已提交
202 203 204
  hb_mask_t mask_array[ARRAY_LENGTH (indic_basic_features)] = {0};
  unsigned int num_masks = ARRAY_LENGTH (indic_basic_features);
  for (unsigned int i = 0; i < num_masks; i++)
205
    mask_array[i] = c->plan->map.get_1_mask (indic_basic_features[i].tag);
B
Behdad Esfahbod 已提交
206 207 208 209
}


HB_END_DECLS