| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | |
| 3 * | |
| 4 * This is part of HarfBuzz, an OpenType Layout engine library. | |
| 5 * | |
| 6 * Permission is hereby granted, without written agreement and without | |
| 7 * license or royalty fees, to use, copy, modify, and distribute this | |
| 8 * software and its documentation for any purpose, provided that the | |
| 9 * above copyright notice and the following two paragraphs appear in | |
| 10 * all copies of this software. | |
| 11 * | |
| 12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR | |
| 13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES | |
| 14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN | |
| 15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH | |
| 16 * DAMAGE. | |
| 17 * | |
| 18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, | |
| 19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | |
| 20 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS | |
| 21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO | |
| 22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. | |
| 23 */ | |
| 24 | |
| 25 #ifndef HARFBUZZ_SHAPER_H | |
| 26 #define HARFBUZZ_SHAPER_H | |
| 27 | |
| 28 #include "harfbuzz-global.h" | |
| 29 #include "harfbuzz-gdef.h" | |
| 30 #include "harfbuzz-gpos.h" | |
| 31 #include "harfbuzz-gsub.h" | |
| 32 #include "harfbuzz-external.h" | |
| 33 #include "harfbuzz-stream-private.h" | |
| 34 | |
| 35 HB_BEGIN_HEADER | |
| 36 | |
| 37 #ifdef HB_USE_PACKED_STRUCTS | |
| 38 #pragma pack(push, 1) | |
| 39 #endif | |
| 40 | |
| 41 /* | |
| 42 using anything else than signed or unsigned for bitfields in C is non standar
d, | |
| 43 but accepted by almost all compilers. And it gives a significant reduction in | |
| 44 memory consumption as HB_CharAttributes and HB_GlyphAttributes will not have | |
| 45 a 4 byte alignment | |
| 46 */ | |
| 47 #ifdef __xlC__ | |
| 48 typedef unsigned hb_bitfield; | |
| 49 #else | |
| 50 typedef hb_uint8 hb_bitfield; | |
| 51 #endif | |
| 52 | |
| 53 typedef enum { | |
| 54 HB_Script_Common, | |
| 55 HB_Script_Greek, | |
| 56 HB_Script_Cyrillic, | |
| 57 HB_Script_Armenian, | |
| 58 HB_Script_Hebrew, | |
| 59 HB_Script_Arabic, | |
| 60 HB_Script_Syriac, | |
| 61 HB_Script_Thaana, | |
| 62 HB_Script_Devanagari, | |
| 63 HB_Script_Bengali, | |
| 64 HB_Script_Gurmukhi, | |
| 65 HB_Script_Gujarati, | |
| 66 HB_Script_Oriya, | |
| 67 HB_Script_Tamil, | |
| 68 HB_Script_Telugu, | |
| 69 HB_Script_Kannada, | |
| 70 HB_Script_Malayalam, | |
| 71 HB_Script_Sinhala, | |
| 72 HB_Script_Thai, | |
| 73 HB_Script_Lao, | |
| 74 HB_Script_Tibetan, | |
| 75 HB_Script_Myanmar, | |
| 76 HB_Script_Georgian, | |
| 77 HB_Script_Hangul, | |
| 78 HB_Script_Ogham, | |
| 79 HB_Script_Runic, | |
| 80 HB_Script_Khmer, | |
| 81 HB_Script_Nko, | |
| 82 HB_Script_Inherited, | |
| 83 HB_ScriptCount = HB_Script_Inherited | |
| 84 /* | |
| 85 HB_Script_Latin = Common, | |
| 86 HB_Script_Ethiopic = Common, | |
| 87 HB_Script_Cherokee = Common, | |
| 88 HB_Script_CanadianAboriginal = Common, | |
| 89 HB_Script_Mongolian = Common, | |
| 90 HB_Script_Hiragana = Common, | |
| 91 HB_Script_Katakana = Common, | |
| 92 HB_Script_Bopomofo = Common, | |
| 93 HB_Script_Han = Common, | |
| 94 HB_Script_Yi = Common, | |
| 95 HB_Script_OldItalic = Common, | |
| 96 HB_Script_Gothic = Common, | |
| 97 HB_Script_Deseret = Common, | |
| 98 HB_Script_Tagalog = Common, | |
| 99 HB_Script_Hanunoo = Common, | |
| 100 HB_Script_Buhid = Common, | |
| 101 HB_Script_Tagbanwa = Common, | |
| 102 HB_Script_Limbu = Common, | |
| 103 HB_Script_TaiLe = Common, | |
| 104 HB_Script_LinearB = Common, | |
| 105 HB_Script_Ugaritic = Common, | |
| 106 HB_Script_Shavian = Common, | |
| 107 HB_Script_Osmanya = Common, | |
| 108 HB_Script_Cypriot = Common, | |
| 109 HB_Script_Braille = Common, | |
| 110 HB_Script_Buginese = Common, | |
| 111 HB_Script_Coptic = Common, | |
| 112 HB_Script_NewTaiLue = Common, | |
| 113 HB_Script_Glagolitic = Common, | |
| 114 HB_Script_Tifinagh = Common, | |
| 115 HB_Script_SylotiNagri = Common, | |
| 116 HB_Script_OldPersian = Common, | |
| 117 HB_Script_Kharoshthi = Common, | |
| 118 HB_Script_Balinese = Common, | |
| 119 HB_Script_Cuneiform = Common, | |
| 120 HB_Script_Phoenician = Common, | |
| 121 HB_Script_PhagsPa = Common, | |
| 122 */ | |
| 123 } HB_Script; | |
| 124 | |
| 125 typedef struct | |
| 126 { | |
| 127 hb_uint32 pos; | |
| 128 hb_uint32 length; | |
| 129 HB_Script script; | |
| 130 hb_uint8 bidiLevel; | |
| 131 } HB_ScriptItem; | |
| 132 | |
| 133 typedef enum { | |
| 134 HB_NoBreak, | |
| 135 HB_SoftHyphen, | |
| 136 HB_Break, | |
| 137 HB_ForcedBreak | |
| 138 } HB_LineBreakType; | |
| 139 | |
| 140 | |
| 141 typedef struct { | |
| 142 /*HB_LineBreakType*/ hb_bitfield lineBreakType :2; | |
| 143 /*HB_Bool*/ hb_bitfield whiteSpace :1; /* A unicode whitesp
ace character, except NBSP, ZWNBSP */ | |
| 144 /*HB_Bool*/ hb_bitfield charStop :1; /* Valid cursor posi
tion (for left/right arrow) */ | |
| 145 /*HB_Bool*/ hb_bitfield wordBoundary :1; | |
| 146 /*HB_Bool*/ hb_bitfield sentenceBoundary :1; | |
| 147 hb_bitfield unused :2; | |
| 148 } HB_CharAttributes; | |
| 149 | |
| 150 void HB_GetCharAttributes(const HB_UChar16 *string, hb_uint32 stringLength, | |
| 151 const HB_ScriptItem *items, hb_uint32 numItems, | |
| 152 HB_CharAttributes *attributes); | |
| 153 | |
| 154 /* requires HB_GetCharAttributes to be called before */ | |
| 155 void HB_GetWordBoundaries(const HB_UChar16 *string, hb_uint32 stringLength, | |
| 156 const HB_ScriptItem *items, hb_uint32 numItems, | |
| 157 HB_CharAttributes *attributes); | |
| 158 | |
| 159 /* requires HB_GetCharAttributes to be called before */ | |
| 160 void HB_GetSentenceBoundaries(const HB_UChar16 *string, hb_uint32 stringLength, | |
| 161 const HB_ScriptItem *items, hb_uint32 numItems, | |
| 162 HB_CharAttributes *attributes); | |
| 163 | |
| 164 | |
| 165 typedef enum { | |
| 166 HB_LeftToRight = 0, | |
| 167 HB_RightToLeft = 1 | |
| 168 } HB_StringToGlyphsFlags; | |
| 169 | |
| 170 typedef enum { | |
| 171 HB_ShaperFlag_Default = 0, | |
| 172 HB_ShaperFlag_NoKerning = 1, | |
| 173 HB_ShaperFlag_UseDesignMetrics = 1 << 1, | |
| 174 /* Arabic vowels in some fonts (Times New Roman, at least) have | |
| 175 non-zero advances, when they should be zero. Setting this shaper | |
| 176 flag causes us to zero out the advances for mark glyphs. */ | |
| 177 HB_ShaperFlag_ForceMarksToZeroWidth = 1 << 2 | |
| 178 } HB_ShaperFlag; | |
| 179 | |
| 180 /* | |
| 181 highest value means highest priority for justification. Justification is done
by first inserting kashidas | |
| 182 starting with the highest priority positions, then stretching spaces, afterwa
rds extending inter char | |
| 183 spacing, and last spacing between arabic words. | |
| 184 NoJustification is for example set for arabic where no Kashida can be inserte
d or for diacritics. | |
| 185 */ | |
| 186 typedef enum { | |
| 187 HB_NoJustification= 0, /* Justification can't be applied after this glyph
*/ | |
| 188 HB_Arabic_Space = 1, /* This glyph represents a space inside arabic text
*/ | |
| 189 HB_Character = 2, /* Inter-character justification point follows this
glyph */ | |
| 190 HB_Space = 4, /* This glyph represents a blank outside an Arabic
run */ | |
| 191 HB_Arabic_Normal = 7, /* Normal Middle-Of-Word glyph that connects to the
right (begin) */ | |
| 192 HB_Arabic_Waw = 8, /* Next character is final form of Waw/Ain/Qaf/Fa *
/ | |
| 193 HB_Arabic_BaRa = 9, /* Next two chars are Ba + Ra/Ya/AlefMaksura */ | |
| 194 HB_Arabic_Alef = 10, /* Next character is final form of Alef/Tah/Lam/Kaf
/Gaf */ | |
| 195 HB_Arabic_HaaDal = 11, /* Next character is final form of Haa/Dal/Taa Marb
utah */ | |
| 196 HB_Arabic_Seen = 12, /* Initial or Medial form Of Seen/Sad */ | |
| 197 HB_Arabic_Kashida = 13 /* Kashida(U+640) in middle of word */ | |
| 198 } HB_JustificationClass; | |
| 199 | |
| 200 /* This structure is binary compatible with Uniscribe's SCRIPT_VISATTR. Would be
nice to keep | |
| 201 * it like that. If this is a problem please tell Trolltech :) | |
| 202 */ | |
| 203 typedef struct { | |
| 204 hb_bitfield justification :4; /* Justification class */ | |
| 205 hb_bitfield clusterStart :1; /* First glyph of representation of cluster
*/ | |
| 206 hb_bitfield mark :1; /* needs to be positioned around base char
*/ | |
| 207 hb_bitfield zeroWidth :1; /* ZWJ, ZWNJ etc, with no width */ | |
| 208 hb_bitfield dontPrint :1; | |
| 209 hb_bitfield combiningClass :8; | |
| 210 } HB_GlyphAttributes; | |
| 211 | |
| 212 typedef struct HB_FaceRec_ { | |
| 213 HB_Bool isSymbolFont; | |
| 214 | |
| 215 HB_GDEF gdef; | |
| 216 HB_GSUB gsub; | |
| 217 HB_GPOS gpos; | |
| 218 HB_Bool supported_scripts[HB_ScriptCount]; | |
| 219 HB_Buffer buffer; | |
| 220 HB_Script current_script; | |
| 221 int current_flags; /* HB_ShaperFlags */ | |
| 222 HB_Bool has_opentype_kerning; | |
| 223 HB_Bool glyphs_substituted; | |
| 224 HB_GlyphAttributes *tmpAttributes; | |
| 225 unsigned int *tmpLogClusters; | |
| 226 int length; | |
| 227 int orig_nglyphs; | |
| 228 } HB_FaceRec; | |
| 229 | |
| 230 typedef HB_Error (*HB_GetFontTableFunc)(void *font, HB_Tag tag, HB_Byte *buffer,
HB_UInt *length); | |
| 231 | |
| 232 HB_Face HB_NewFace(void *font, HB_GetFontTableFunc tableFunc); | |
| 233 void HB_FreeFace(HB_Face face); | |
| 234 | |
| 235 typedef struct { | |
| 236 HB_Fixed x, y; | |
| 237 HB_Fixed width, height; | |
| 238 HB_Fixed xOffset, yOffset; | |
| 239 } HB_GlyphMetrics; | |
| 240 | |
| 241 typedef enum { | |
| 242 HB_FontAscent | |
| 243 } HB_FontMetric; | |
| 244 | |
| 245 typedef struct { | |
| 246 HB_Bool (*convertStringToGlyphIndices)(HB_Font font, const HB_UChar16 *stri
ng, hb_uint32 length, HB_Glyph *glyphs, hb_uint32 *numGlyphs, HB_Bool rightToLef
t); | |
| 247 void (*getGlyphAdvances)(HB_Font font, const HB_Glyph *glyphs, hb_uint32
numGlyphs, HB_Fixed *advances, int flags /*HB_ShaperFlag*/); | |
| 248 HB_Bool (*canRender)(HB_Font font, const HB_UChar16 *string, hb_uint32 leng
th); | |
| 249 /* implementation needs to make sure to load a scaled glyph, so /no/ FT_LOAD
_NO_SCALE */ | |
| 250 HB_Error (*getPointInOutline)(HB_Font font, HB_Glyph glyph, int flags /*HB_S
haperFlag*/, hb_uint32 point, HB_Fixed *xpos, HB_Fixed *ypos, hb_uint32 *nPoints
); | |
| 251 void (*getGlyphMetrics)(HB_Font font, HB_Glyph glyph, HB_GlyphMetrics *m
etrics); | |
| 252 HB_Fixed (*getFontMetric)(HB_Font font, HB_FontMetric metric); | |
| 253 } HB_FontClass; | |
| 254 | |
| 255 typedef struct HB_Font_ { | |
| 256 const HB_FontClass *klass; | |
| 257 | |
| 258 /* Metrics */ | |
| 259 HB_UShort x_ppem, y_ppem; | |
| 260 HB_16Dot16 x_scale, y_scale; | |
| 261 | |
| 262 void *userData; | |
| 263 } HB_FontRec; | |
| 264 | |
| 265 #ifdef HB_USE_PACKED_STRUCTS | |
| 266 #pragma pack(pop) | |
| 267 #endif | |
| 268 | |
| 269 typedef struct HB_ShaperItem_ HB_ShaperItem; | |
| 270 | |
| 271 struct HB_ShaperItem_ { | |
| 272 const HB_UChar16 *string; /* input: the Unicode UTF16 text to
be shaped */ | |
| 273 hb_uint32 stringLength; /* input: the length of the input in
16-bit words */ | |
| 274 HB_ScriptItem item; /* input: the current run to be shap
ed: a run of text all in the same script that is a substring of <string> */ | |
| 275 HB_Font font; /* input: the font: scale, units and
function pointers supplying glyph indices and metrics */ | |
| 276 HB_Face face; /* input: the shaper state; current
script, access to the OpenType tables , etc. */ | |
| 277 int shaperFlags; /* input (unused) should be set to 0
; intended to support flags defined in HB_ShaperFlag */ | |
| 278 HB_Bool glyphIndicesPresent; /* input: true if the <glyphs> array
contains glyph indices ready to be shaped */ | |
| 279 hb_uint32 initialGlyphCount; /* input: if glyphIndicesPresent is
true, the number of glyph indices in the <glyphs> array */ | |
| 280 | |
| 281 hb_uint32 num_glyphs; /* input: capacity of output arrays
<glyphs>, <attributes>, <advances>, <offsets>, and <log_clusters>; */ | |
| 282 /* output: required capacity (may be
larger than actual capacity) */ | |
| 283 | |
| 284 HB_Glyph *glyphs; /* output: <num_glyphs> indices of s
haped glyphs */ | |
| 285 HB_GlyphAttributes *attributes; /* output: <num_glyphs> glyph attrib
utes */ | |
| 286 HB_Fixed *advances; /* output: <num_glyphs> advances */ | |
| 287 HB_FixedPoint *offsets; /* output: <num_glyphs> offsets */ | |
| 288 unsigned short *log_clusters; /* output: for each output glyph, th
e index in the input of the start of its logical cluster */ | |
| 289 | |
| 290 /* internal */ | |
| 291 HB_Bool kerning_applied; /* output: true if kerning was appli
ed by the shaper */ | |
| 292 }; | |
| 293 | |
| 294 HB_Bool HB_ShapeItem(HB_ShaperItem *item); | |
| 295 | |
| 296 HB_END_HEADER | |
| 297 | |
| 298 #endif | |
| OLD | NEW |