hb-old.cc revision 91e721ea8693205f4f738bca97a5055ee75cf463
18fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod/* 28fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * Copyright © 2012 Google, Inc. 38fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * 48fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * This is part of HarfBuzz, a text shaping library. 58fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * 68fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * Permission is hereby granted, without written agreement and without 78fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this 88fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * software and its documentation for any purpose, provided that the 98fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * above copyright notice and the following two paragraphs appear in 108fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * all copies of this software. 118fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * 128fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 138fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 148fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 158fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 168fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * DAMAGE. 178fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * 188fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 198fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 208fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 218fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 228fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 238fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * 248fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod * Google Author(s): Behdad Esfahbod 258fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod */ 268fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 278fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#include "hb-private.hh" 288fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 298fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#include "hb-old-private.hh" 308fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 318fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#include "hb-font-private.hh" 328fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#include "hb-buffer-private.hh" 338fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 348fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#include <harfbuzz.h> 358fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 368fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 378fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#ifndef HB_DEBUG_OLD 388fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#define HB_DEBUG_OLD (HB_DEBUG+0) 398fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#endif 408fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 418fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 428fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic HB_Script 438fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_old_script_from_script (hb_script_t script) 448fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 458fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod switch ((hb_tag_t) script) 468fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod { 478fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod default: 488fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_COMMON: return HB_Script_Common; 498fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_GREEK: return HB_Script_Greek; 508fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_CYRILLIC: return HB_Script_Cyrillic; 518fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_ARMENIAN: return HB_Script_Armenian; 528fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_HEBREW: return HB_Script_Hebrew; 538fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_ARABIC: return HB_Script_Arabic; 548fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_SYRIAC: return HB_Script_Syriac; 558fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_THAANA: return HB_Script_Thaana; 568fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_DEVANAGARI: return HB_Script_Devanagari; 578fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_BENGALI: return HB_Script_Bengali; 588fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_GURMUKHI: return HB_Script_Gurmukhi; 598fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_GUJARATI: return HB_Script_Gujarati; 608fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_ORIYA: return HB_Script_Oriya; 618fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_TAMIL: return HB_Script_Tamil; 628fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_TELUGU: return HB_Script_Telugu; 638fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_KANNADA: return HB_Script_Kannada; 648fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_MALAYALAM: return HB_Script_Malayalam; 658fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_SINHALA: return HB_Script_Sinhala; 668fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_THAI: return HB_Script_Thai; 678fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_LAO: return HB_Script_Lao; 688fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_TIBETAN: return HB_Script_Tibetan; 698fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_MYANMAR: return HB_Script_Myanmar; 708fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_GEORGIAN: return HB_Script_Georgian; 718fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_HANGUL: return HB_Script_Hangul; 728fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_OGHAM: return HB_Script_Ogham; 738fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_RUNIC: return HB_Script_Runic; 748fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_KHMER: return HB_Script_Khmer; 758fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_NKO: return HB_Script_Nko; 768fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_INHERITED: return HB_Script_Inherited; 778fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 788fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 798fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 808fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 818fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic HB_Bool 828fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_old_convertStringToGlyphIndices (HB_Font old_font, 838fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod const HB_UChar16 *string, 848fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_uint32 length, 858fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Glyph *glyphs, 868fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_uint32 *numGlyphs, 878fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Bool rightToLeft) 888fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 898fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_font_t *font = (hb_font_t *) old_font->userData; 908fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 918fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod for (unsigned int i = 0; i < length; i++) 928fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod { 938fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_codepoint_t u; 948fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 958fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod /* TODO Handle UTF-16. Ugh */ 968fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod u = string[i]; 978fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 988fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (rightToLeft) 998fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod u = hb_unicode_mirroring (hb_unicode_funcs_get_default (), u); 1008fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1018fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_font_get_glyph (font, u, 0, &u); /* TODO Variation selectors */ 1028fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1038fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod glyphs[i] = u; 1048fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 1058fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod *numGlyphs = length; // XXX 1068fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1078fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return true; 1088fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 1098fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1108fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic void 1118fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_old_getGlyphAdvances (HB_Font old_font, 1128fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod const HB_Glyph *glyphs, 1138fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_uint32 numGlyphs, 1148fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Fixed *advances, 1158fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod int flags /*HB_ShaperFlag*/) 1168fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 1178fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_font_t *font = (hb_font_t *) old_font->userData; 1188fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1198fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod for (unsigned int i = 0; i < numGlyphs; i++) 1208fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod advances[i] = hb_font_get_glyph_h_advance (font, glyphs[i]); 1218fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 1228fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1238fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic HB_Bool 1248fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_old_canRender (HB_Font old_font, 1258fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod const HB_UChar16 *string, 1268fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_uint32 length) 1278fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 1288fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return true; // TODO 1298fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 1308fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1318fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic HB_Error 1328fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_old_getPointInOutline (HB_Font old_font, 1338fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Glyph glyph, 1348fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod int flags /*HB_ShaperFlag*/, 1358fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_uint32 point, 1368fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Fixed *xpos, 1378fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Fixed *ypos, 1388fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_uint32 *nPoints) 1398fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 1408fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return HB_Err_Ok; // TODO 1418fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 1428fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1438fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic void 1448fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_old_getGlyphMetrics (HB_Font old_font, 1458fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Glyph glyph, 1468fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_GlyphMetrics *metrics) 1478fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 1488fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod // TODO 1498fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 1508fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1518fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic HB_Fixed 1528fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_old_getFontMetric (HB_Font old_font, 1538fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_FontMetric metric) 1548fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 1558fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return 0; // TODO 1568fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 1578fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1588fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic const HB_FontClass hb_old_font_class = { 1598fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_old_convertStringToGlyphIndices, 1608fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_old_getGlyphAdvances, 1618fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_old_canRender, 1628fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_old_getPointInOutline, 1638fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_old_getGlyphMetrics, 1648fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_old_getFontMetric 1658fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod}; 1668fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1678fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1688fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1698fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic hb_user_data_key_t hb_old_data_key; 1708fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1718fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic HB_Error 1728fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodtable_func (void *font, HB_Tag tag, HB_Byte *buffer, HB_UInt *length) 1738fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 1748fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_face_t *face = (hb_face_t *) font; 1758fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_blob_t *blob = hb_face_reference_table (face, (hb_tag_t) tag); 1768fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod unsigned int capacity = *length; 1778fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod *length = hb_blob_get_length (blob); 1788fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod memcpy (buffer, hb_blob_get_data (blob, NULL), MIN (capacity, *length)); 1798fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_blob_destroy (blob); 1808fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return HB_Err_Ok; 1818fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 1828fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1838fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic HB_Face 1848fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod_hb_old_face_get (hb_face_t *face) 1858fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 1868fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Face data = (HB_Face) hb_face_get_user_data (face, &hb_old_data_key); 1878fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (likely (data)) return data; 1888fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1898fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod data = HB_NewFace (face, table_func); 1908fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1918fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (unlikely (!data)) { 1928fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod DEBUG_MSG (OLD, face, "HB_NewFace failed"); 1938fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return NULL; 1948fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 1958fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1968fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (unlikely (!hb_face_set_user_data (face, &hb_old_data_key, data, 1978fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod (hb_destroy_func_t) HB_FreeFace, 1988fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod false))) 1998fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod { 2008fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_FreeFace (data); 2018fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod data = (HB_Face) hb_face_get_user_data (face, &hb_old_data_key); 2028fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (data) 2038fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return data; 2048fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod else 2058fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return NULL; 2068fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 2078fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2088fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return data; 2098fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 2108fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2118fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2128fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic HB_Font 2138fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod_hb_old_font_get (hb_font_t *font) 2148fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 2158fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Font data = (HB_Font) calloc (1, sizeof (HB_FontRec)); 2168fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (unlikely (!data)) { 2178fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod DEBUG_MSG (OLD, font, "malloc()ing HB_Font failed"); 2188fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return NULL; 2198fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 2208fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2218fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod data->klass = &hb_old_font_class; 2228fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod data->x_ppem = font->x_ppem; 2238fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod data->y_ppem = font->y_ppem; 2248fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod data->x_scale = font->x_scale; // XXX 2258fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod data->y_scale = font->y_scale; // XXX 2268fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod data->userData = font; 2278fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2288fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (unlikely (!hb_font_set_user_data (font, &hb_old_data_key, data, 2298fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod (hb_destroy_func_t) free, 2308fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod false))) 2318fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod { 2328fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod free (data); 2338fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod data = (HB_Font) hb_font_get_user_data (font, &hb_old_data_key); 2348fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (data) 2358fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return data; 2368fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod else 2378fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return NULL; 2388fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 2398fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2408fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return data; 2418fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 2428fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2438fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_bool_t 2448fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod_hb_old_shape (hb_font_t *font, 2458fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_buffer_t *buffer, 2468fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod const hb_feature_t *features, 2478fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod unsigned int num_features) 2488fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 2498fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (unlikely (!buffer->len)) 2508fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return true; 2518fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2528fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod buffer->guess_properties (); 2538fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 25491e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction); 25591e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod 2568fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#define FAIL(...) \ 2578fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_STMT_START { \ 2588fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod DEBUG_MSG (OLD, NULL, __VA_ARGS__); \ 2598fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return false; \ 2608fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } HB_STMT_END; 2618fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2628fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Face old_face = _hb_old_face_get (font->face); 2638fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (unlikely (!old_face)) 2648fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod FAIL ("Couldn't get old face"); 2658fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2668fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Font old_font = _hb_old_font_get (font); 2678fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (unlikely (!old_font)) 2688fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod FAIL ("Couldn't get old font"); 2698fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2708fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodretry: 2718fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2728fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod unsigned int scratch_size; 2738fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod char *scratch = (char *) buffer->get_scratch_buffer (&scratch_size); 2748fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2758fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#define utf16_index() var1.u32 2768fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_UChar16 *pchars = (HB_UChar16 *) scratch; 2778fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod unsigned int chars_len = 0; 2788fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod for (unsigned int i = 0; i < buffer->len; i++) { 2798fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_codepoint_t c = buffer->info[i].codepoint; 2808fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod buffer->info[i].utf16_index() = chars_len; 2818fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (likely (c < 0x10000)) 2828fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod pchars[chars_len++] = c; 2838fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod else if (unlikely (c >= 0x110000)) 2848fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod pchars[chars_len++] = 0xFFFD; 2858fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod else { 2868fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod pchars[chars_len++] = 0xD800 + ((c - 0x10000) >> 10); 2878fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod pchars[chars_len++] = 0xDC00 + ((c - 0x10000) & ((1 << 10) - 1)); 2888fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 2898fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 2908fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2918fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2928fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#define ALLOCATE_ARRAY(Type, name, len) \ 2938fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod name = (Type *) scratch; \ 29491e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod scratch += (len) * sizeof ((name)[0]); \ 29591e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod scratch_size -= (len) * sizeof ((name)[0]); 2968fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2978fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2988fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_ShaperItem item = {0}; 2998fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3008fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod ALLOCATE_ARRAY (const HB_UChar16, item.string, chars_len); 30191e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod ALLOCATE_ARRAY (unsigned short, item.log_clusters, chars_len + 2); 3028fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.stringLength = chars_len; 3038fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.item.pos = 0; 3048fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.item.length = item.stringLength; 3058fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.item.script = hb_old_script_from_script (buffer->props.script); 30691e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod item.item.bidiLevel = backward ? 1 : 0; 3078fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3088fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.font = old_font; 3098fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.face = old_face; 3108fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.shaperFlags = 0; 3118fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3128fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.glyphIndicesPresent = false; 3138fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3148fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod /* TODO Alignment. */ 3158fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod unsigned int num_glyphs = scratch_size / (sizeof (HB_Glyph) + 3168fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod sizeof (HB_GlyphAttributes) + 3178fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod sizeof (HB_Fixed) + 3188fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod sizeof (HB_FixedPoint) + 31991e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod sizeof (uint32_t)); 3208fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3218fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.num_glyphs = num_glyphs; 3228fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod ALLOCATE_ARRAY (HB_Glyph, item.glyphs, num_glyphs); 3238fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod ALLOCATE_ARRAY (HB_GlyphAttributes, item.attributes, num_glyphs); 3248fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod ALLOCATE_ARRAY (HB_Fixed, item.advances, num_glyphs); 3258fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod ALLOCATE_ARRAY (HB_FixedPoint, item.offsets, num_glyphs); 32691e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod uint32_t *vis_clusters; 32791e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod ALLOCATE_ARRAY (uint32_t, vis_clusters, num_glyphs); 32891e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod 32991e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod#undef ALLOCATE_ARRAY 3308fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3318fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (!HB_ShapeItem (&item)) 3328fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return false; 3338fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3348fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (unlikely (item.num_glyphs > num_glyphs)) 3358fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod { 3368fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod buffer->ensure (buffer->allocated * 2); 3378fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (buffer->in_error) 3388fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod FAIL ("Buffer resize failed"); 3398fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod goto retry; 3408fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 3418fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod num_glyphs = item.num_glyphs; 3428fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 34391e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod /* Ok, we've got everything we need, now compose output buffer, 34491e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod * very, *very*, carefully! */ 34591e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod 34691e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod /* Calculate visual-clusters. That's what we ship. */ 34791e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod for (unsigned int i = 0; i < num_glyphs; i++) 34891e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod vis_clusters[i] = -1; 34991e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod for (unsigned int i = 0; i < buffer->len; i++) { 35091e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod uint32_t *p = &vis_clusters[item.log_clusters[buffer->info[i].utf16_index()]]; 35191e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod *p = MIN (*p, buffer->info[i].cluster); 35291e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod } 35391e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod if (!backward) { 35491e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod for (unsigned int i = 1; i < num_glyphs; i++) 35591e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod if (vis_clusters[i] == -1) 35691e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod vis_clusters[i] = vis_clusters[i - 1]; 35791e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod } else { 35891e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod for (int i = num_glyphs - 2; i >= 0; i--) 35991e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod if (vis_clusters[i] == -1) 36091e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod vis_clusters[i] = vis_clusters[i + 1]; 36191e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod } 36291e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod 36391e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod#undef utf16_index 3648fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 36591e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod buffer->ensure (num_glyphs); 36691e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod if (buffer->in_error) 36791e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod FAIL ("Buffer in error"); 36891e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod 36991e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod 37091e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod buffer->len = num_glyphs; 3718fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_glyph_info_t *info = buffer->info; 3728fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod for (unsigned int i = 0; i < num_glyphs; i++) 3738fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod { 3748fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod info[i].codepoint = item.glyphs[i]; 37591e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod info[i].cluster = vis_clusters[i]; 3768fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3778fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod info[i].mask = item.advances[i]; 3788fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod info[i].var1.u32 = item.offsets[i].x; 3798fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod info[i].var2.u32 = item.offsets[i].y; 3808fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 3818fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3828fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod buffer->clear_positions (); 3838fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 38491e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod for (unsigned int i = 0; i < num_glyphs; ++i) { 3858fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_glyph_info_t *info = &buffer->info[i]; 3868fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_glyph_position_t *pos = &buffer->pos[i]; 3878fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3888fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod /* TODO vertical */ 3898fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod pos->x_advance = info->mask; 3908fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod pos->x_offset = info->var1.u32; 3918fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod pos->y_offset = info->var2.u32; 3928fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 3938fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3948fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (HB_DIRECTION_IS_BACKWARD (buffer->props.direction)) 3958fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod buffer->reverse (); 3968fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3978fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return true; 3988fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 399