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 27027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod#define HB_SHAPER old 28027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod#define hb_old_shaper_face_data_t HB_FaceRec_ 29027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod#define hb_old_shaper_font_data_t HB_Font_ 30027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod#include "hb-shaper-impl-private.hh" 318fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 328fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#include <harfbuzz.h> 338fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 348fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 358fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#ifndef HB_DEBUG_OLD 368fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#define HB_DEBUG_OLD (HB_DEBUG+0) 378fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#endif 388fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 398fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 408fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic HB_Script 418fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_old_script_from_script (hb_script_t script) 428fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 438fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod switch ((hb_tag_t) script) 448fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod { 458fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod default: 468fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_COMMON: return HB_Script_Common; 478fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_GREEK: return HB_Script_Greek; 488fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_CYRILLIC: return HB_Script_Cyrillic; 498fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_ARMENIAN: return HB_Script_Armenian; 508fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_HEBREW: return HB_Script_Hebrew; 518fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_ARABIC: return HB_Script_Arabic; 528fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_SYRIAC: return HB_Script_Syriac; 538fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_THAANA: return HB_Script_Thaana; 548fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_DEVANAGARI: return HB_Script_Devanagari; 558fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_BENGALI: return HB_Script_Bengali; 568fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_GURMUKHI: return HB_Script_Gurmukhi; 578fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_GUJARATI: return HB_Script_Gujarati; 588fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_ORIYA: return HB_Script_Oriya; 598fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_TAMIL: return HB_Script_Tamil; 608fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_TELUGU: return HB_Script_Telugu; 618fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_KANNADA: return HB_Script_Kannada; 628fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_MALAYALAM: return HB_Script_Malayalam; 638fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_SINHALA: return HB_Script_Sinhala; 648fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_THAI: return HB_Script_Thai; 658fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_LAO: return HB_Script_Lao; 668fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_TIBETAN: return HB_Script_Tibetan; 678fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_MYANMAR: return HB_Script_Myanmar; 688fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_GEORGIAN: return HB_Script_Georgian; 698fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_HANGUL: return HB_Script_Hangul; 708fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_OGHAM: return HB_Script_Ogham; 718fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_RUNIC: return HB_Script_Runic; 728fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_KHMER: return HB_Script_Khmer; 738fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_NKO: return HB_Script_Nko; 748fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod case HB_SCRIPT_INHERITED: return HB_Script_Inherited; 758fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 768fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 778fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 788fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 798fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic HB_Bool 808fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_old_convertStringToGlyphIndices (HB_Font old_font, 818fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod const HB_UChar16 *string, 828fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_uint32 length, 838fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Glyph *glyphs, 848fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_uint32 *numGlyphs, 858fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Bool rightToLeft) 868fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 878fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_font_t *font = (hb_font_t *) old_font->userData; 888fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 898fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod for (unsigned int i = 0; i < length; i++) 908fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod { 918fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_codepoint_t u; 928fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 938fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod /* XXX Handle UTF-16. Ugh */ 948fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod u = string[i]; 958fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 968fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (rightToLeft) 97208f70f0553d73d2908b21b9552298029482a8b9Behdad Esfahbod u = hb_unicode_funcs_get_default ()->mirroring (u); 988fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 998fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod font->get_glyph (u, 0, &u); /* TODO Variation selectors */ 1008fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1018fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod glyphs[i] = u; 1028fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 1037d52e6601f0e695690cd168a288466746cf25300Behdad Esfahbod *numGlyphs = length; /* XXX */ 1048fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1058fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return true; 1068fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 1078fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1088fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic void 1098fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_old_getGlyphAdvances (HB_Font old_font, 1108fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod const HB_Glyph *glyphs, 1118fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_uint32 numGlyphs, 1128fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Fixed *advances, 1130beb66e3a61ae8bb1fa66e54b1ff1abb2f8711e9Behdad Esfahbod int flags /*HB_ShaperFlag*/ HB_UNUSED) 1148fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 1158fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_font_t *font = (hb_font_t *) old_font->userData; 1168fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1178fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod for (unsigned int i = 0; i < numGlyphs; i++) 1188fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod advances[i] = font->get_glyph_h_advance (glyphs[i]); 1198fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 1208fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1218fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic HB_Bool 1228fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_old_canRender (HB_Font old_font, 1238fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod const HB_UChar16 *string, 1248fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_uint32 length) 1258fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 1267d52e6601f0e695690cd168a288466746cf25300Behdad Esfahbod return true; /* TODO */ 1278fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 1288fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1298fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic HB_Error 1308fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_old_getPointInOutline (HB_Font old_font, 1318fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Glyph glyph, 1328fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod int flags /*HB_ShaperFlag*/, 1338fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_uint32 point, 1348fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Fixed *xpos, 1358fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Fixed *ypos, 1368fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_uint32 *nPoints) 1378fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 1387d52e6601f0e695690cd168a288466746cf25300Behdad Esfahbod return HB_Err_Ok; /* TODO */ 1398fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 1408fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1418fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic void 1428fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_old_getGlyphMetrics (HB_Font old_font, 1438fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_Glyph glyph, 1448fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_GlyphMetrics *metrics) 1458fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 146f0fc1df8fc949739b68d55948741016081b69c3aBehdad Esfahbod hb_font_t *font = (hb_font_t *) old_font->userData; 147f0fc1df8fc949739b68d55948741016081b69c3aBehdad Esfahbod 148f0fc1df8fc949739b68d55948741016081b69c3aBehdad Esfahbod hb_glyph_extents_t extents; 149f0fc1df8fc949739b68d55948741016081b69c3aBehdad Esfahbod 1508fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod font->get_glyph_extents (glyph, &extents); 151f0fc1df8fc949739b68d55948741016081b69c3aBehdad Esfahbod 1520834d952017a04c6f4599e574cb75ecf3ca27d3bBehdad Esfahbod metrics->x = extents.x_bearing; 1530834d952017a04c6f4599e574cb75ecf3ca27d3bBehdad Esfahbod metrics->y = extents.y_bearing; 154f0fc1df8fc949739b68d55948741016081b69c3aBehdad Esfahbod metrics->width = extents.width; 15521756934a15e31dc243e2b6d80adec5752477652Behdad Esfahbod metrics->height = extents.height; 1568fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod metrics->xOffset = font->get_glyph_h_advance (glyph); 1570834d952017a04c6f4599e574cb75ecf3ca27d3bBehdad Esfahbod metrics->yOffset = 0; 1588fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 1598fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1608fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic HB_Fixed 1618fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_old_getFontMetric (HB_Font old_font, 1628fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_FontMetric metric) 1638fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 1644ca743dfb8e09f9fa525061c7f1144d55f72effbBehdad Esfahbod hb_font_t *font = (hb_font_t *) old_font->userData; 1654ca743dfb8e09f9fa525061c7f1144d55f72effbBehdad Esfahbod 1664ca743dfb8e09f9fa525061c7f1144d55f72effbBehdad Esfahbod switch (metric) 1674ca743dfb8e09f9fa525061c7f1144d55f72effbBehdad Esfahbod { 1684ca743dfb8e09f9fa525061c7f1144d55f72effbBehdad Esfahbod case HB_FontAscent: 1694ca743dfb8e09f9fa525061c7f1144d55f72effbBehdad Esfahbod return font->y_scale; /* XXX We don't have ascent data yet. */ 1704ca743dfb8e09f9fa525061c7f1144d55f72effbBehdad Esfahbod 1714ca743dfb8e09f9fa525061c7f1144d55f72effbBehdad Esfahbod default: 1724ca743dfb8e09f9fa525061c7f1144d55f72effbBehdad Esfahbod return 0; 1734ca743dfb8e09f9fa525061c7f1144d55f72effbBehdad Esfahbod } 1748fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 1758fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1768fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic const HB_FontClass hb_old_font_class = { 1778fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_old_convertStringToGlyphIndices, 1788fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_old_getGlyphAdvances, 1798fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_old_canRender, 1808fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_old_getPointInOutline, 1818fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_old_getGlyphMetrics, 1828fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_old_getFontMetric 1838fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod}; 1848fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1858fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1868fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 1878fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodstatic HB_Error 1888fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodtable_func (void *font, HB_Tag tag, HB_Byte *buffer, HB_UInt *length) 1898fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 1908fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_face_t *face = (hb_face_t *) font; 1914c8ac4f47e95d2b266b2f64e75c55af8233b6b91Behdad Esfahbod hb_blob_t *blob = face->reference_table ((hb_tag_t) tag); 1928fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod unsigned int capacity = *length; 1938fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod *length = hb_blob_get_length (blob); 1948fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod memcpy (buffer, hb_blob_get_data (blob, NULL), MIN (capacity, *length)); 1958fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_blob_destroy (blob); 1968fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return HB_Err_Ok; 1978fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 1988fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 199027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 200027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod/* 201027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod * shaper face data 202027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod */ 203027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 204027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbodhb_old_shaper_face_data_t * 205027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod_hb_old_shaper_face_data_create (hb_face_t *face) 206027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod{ 207027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod return HB_NewFace (face, table_func); 208027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod} 209027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 210027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbodvoid 211027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod_hb_old_shaper_face_data_destroy (hb_old_shaper_face_data_t *data) 212027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod{ 213027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod HB_FreeFace (data); 214027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod} 215027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 216027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 217027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod/* 218027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod * shaper font data 219027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod */ 220027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 221027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbodhb_old_shaper_font_data_t * 222027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod_hb_old_shaper_font_data_create (hb_font_t *font) 223027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod{ 224027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod HB_FontRec *data = (HB_FontRec *) calloc (1, sizeof (HB_FontRec)); 225027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod if (unlikely (!data)) { 226027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod DEBUG_MSG (OLD, font, "malloc()ing HB_Font failed"); 227027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod return NULL; 228027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod } 229027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 230027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod data->klass = &hb_old_font_class; 231027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod data->x_ppem = font->x_ppem; 232027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod data->y_ppem = font->y_ppem; 2337d52e6601f0e695690cd168a288466746cf25300Behdad Esfahbod data->x_scale = font->x_scale; /* XXX */ 2347d52e6601f0e695690cd168a288466746cf25300Behdad Esfahbod data->y_scale = font->y_scale; /* XXX */ 235027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod data->userData = font; 236027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 237027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod return data; 238027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod} 239027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 240027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbodvoid 241027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod_hb_old_shaper_font_data_destroy (hb_old_shaper_font_data_t *data) 242027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod{ 243027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod free (data); 244027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod} 245027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 246027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 247027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod/* 248027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod * shaper shape_plan data 249027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod */ 250027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 251027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbodstruct hb_old_shaper_shape_plan_data_t {}; 252027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 253027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbodhb_old_shaper_shape_plan_data_t * 2540beb66e3a61ae8bb1fa66e54b1ff1abb2f8711e9Behdad Esfahbod_hb_old_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan HB_UNUSED, 2550beb66e3a61ae8bb1fa66e54b1ff1abb2f8711e9Behdad Esfahbod const hb_feature_t *user_features HB_UNUSED, 2560beb66e3a61ae8bb1fa66e54b1ff1abb2f8711e9Behdad Esfahbod unsigned int num_user_features HB_UNUSED) 257027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod{ 258027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod return (hb_old_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED; 259027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod} 260027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 261027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbodvoid 2620beb66e3a61ae8bb1fa66e54b1ff1abb2f8711e9Behdad Esfahbod_hb_old_shaper_shape_plan_data_destroy (hb_old_shaper_shape_plan_data_t *data HB_UNUSED) 263027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod{ 264027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod} 265027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 266027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 267027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod/* 268027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod * shaper 269027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod */ 270027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod 2718fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodhb_bool_t 2720beb66e3a61ae8bb1fa66e54b1ff1abb2f8711e9Behdad Esfahbod_hb_old_shape (hb_shape_plan_t *shape_plan HB_UNUSED, 273bd26b4d21f59312805d294f46f15182adbcc47daBehdad Esfahbod hb_font_t *font, 2748fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_buffer_t *buffer, 2758fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod const hb_feature_t *features, 2768fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod unsigned int num_features) 2778fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod{ 278b6b7ba1313bf686e6ed567183466104c90504a67Behdad Esfahbod hb_face_t *face = font->face; 279b6b7ba1313bf686e6ed567183466104c90504a67Behdad Esfahbod HB_Face old_face = HB_SHAPER_DATA_GET (face); 280b6b7ba1313bf686e6ed567183466104c90504a67Behdad Esfahbod HB_Font old_font = HB_SHAPER_DATA_GET (font); 2818fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 28291e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction); 28391e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod 2848fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbodretry: 2858fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2868fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod unsigned int scratch_size; 2878fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod char *scratch = (char *) buffer->get_scratch_buffer (&scratch_size); 2888fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 2898fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#define utf16_index() var1.u32 2908fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_UChar16 *pchars = (HB_UChar16 *) scratch; 2918fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod unsigned int chars_len = 0; 2928fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod for (unsigned int i = 0; i < buffer->len; i++) { 2938fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_codepoint_t c = buffer->info[i].codepoint; 2948fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod buffer->info[i].utf16_index() = chars_len; 2958fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (likely (c < 0x10000)) 2968fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod pchars[chars_len++] = c; 2978fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod else if (unlikely (c >= 0x110000)) 2988fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod pchars[chars_len++] = 0xFFFD; 2998fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod else { 3008fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod pchars[chars_len++] = 0xD800 + ((c - 0x10000) >> 10); 3018fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod pchars[chars_len++] = 0xDC00 + ((c - 0x10000) & ((1 << 10) - 1)); 3028fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 3038fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 3048fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3058fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3068fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod#define ALLOCATE_ARRAY(Type, name, len) \ 3078fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod name = (Type *) scratch; \ 30891e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod scratch += (len) * sizeof ((name)[0]); \ 30991e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod scratch_size -= (len) * sizeof ((name)[0]); 3108fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3118fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3128fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod HB_ShaperItem item = {0}; 3138fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3148fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod ALLOCATE_ARRAY (const HB_UChar16, item.string, chars_len); 31591e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod ALLOCATE_ARRAY (unsigned short, item.log_clusters, chars_len + 2); 3168fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.stringLength = chars_len; 3178fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.item.pos = 0; 3188fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.item.length = item.stringLength; 3198fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.item.script = hb_old_script_from_script (buffer->props.script); 32091e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod item.item.bidiLevel = backward ? 1 : 0; 3218fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3228fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.font = old_font; 3238fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.face = old_face; 3248fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.shaperFlags = 0; 3258fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3268fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.glyphIndicesPresent = false; 3278fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3288fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod /* TODO Alignment. */ 3298fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod unsigned int num_glyphs = scratch_size / (sizeof (HB_Glyph) + 3308fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod sizeof (HB_GlyphAttributes) + 3318fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod sizeof (HB_Fixed) + 3328fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod sizeof (HB_FixedPoint) + 33391e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod sizeof (uint32_t)); 3348fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3358fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod item.num_glyphs = num_glyphs; 3368fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod ALLOCATE_ARRAY (HB_Glyph, item.glyphs, num_glyphs); 3378fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod ALLOCATE_ARRAY (HB_GlyphAttributes, item.attributes, num_glyphs); 3388fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod ALLOCATE_ARRAY (HB_Fixed, item.advances, num_glyphs); 3398fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod ALLOCATE_ARRAY (HB_FixedPoint, item.offsets, num_glyphs); 3405d502443f5a07cbd0aa860dd71a0fa4ea8b6ff9fBehdad Esfahbod /* Apparently in some cases the offsets array will not be fully assigned to. 3415d502443f5a07cbd0aa860dd71a0fa4ea8b6ff9fBehdad Esfahbod * Clear it. */ 3425d502443f5a07cbd0aa860dd71a0fa4ea8b6ff9fBehdad Esfahbod memset (item.offsets, 0, num_glyphs * sizeof (item.offsets[0])); 34391e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod uint32_t *vis_clusters; 34491e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod ALLOCATE_ARRAY (uint32_t, vis_clusters, num_glyphs); 34591e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod 34691e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod#undef ALLOCATE_ARRAY 3478fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3488fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (!HB_ShapeItem (&item)) 3498fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod { 3509550a8c4e8b4e28be60d38c27d59253846ff9569Behdad Esfahbod if (unlikely (item.num_glyphs > num_glyphs)) 3519550a8c4e8b4e28be60d38c27d59253846ff9569Behdad Esfahbod { 3529550a8c4e8b4e28be60d38c27d59253846ff9569Behdad Esfahbod buffer->ensure (buffer->allocated * 2); 3539550a8c4e8b4e28be60d38c27d59253846ff9569Behdad Esfahbod if (buffer->in_error) 354b6b7ba1313bf686e6ed567183466104c90504a67Behdad Esfahbod return false; 3559550a8c4e8b4e28be60d38c27d59253846ff9569Behdad Esfahbod goto retry; 3569550a8c4e8b4e28be60d38c27d59253846ff9569Behdad Esfahbod } 3579550a8c4e8b4e28be60d38c27d59253846ff9569Behdad Esfahbod return false; 3588fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 3598fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod num_glyphs = item.num_glyphs; 3608fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 36191e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod /* Ok, we've got everything we need, now compose output buffer, 36291e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod * very, *very*, carefully! */ 36391e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod 36491e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod /* Calculate visual-clusters. That's what we ship. */ 36591e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod for (unsigned int i = 0; i < num_glyphs; i++) 36691e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod vis_clusters[i] = -1; 36791e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod for (unsigned int i = 0; i < buffer->len; i++) { 36891e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod uint32_t *p = &vis_clusters[item.log_clusters[buffer->info[i].utf16_index()]]; 36991e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod *p = MIN (*p, buffer->info[i].cluster); 37091e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod } 371a15b70a81a609f024083cb04f9819483f4d5cab7Behdad Esfahbod for (unsigned int i = 1; i < num_glyphs; i++) 3720beb66e3a61ae8bb1fa66e54b1ff1abb2f8711e9Behdad Esfahbod if (vis_clusters[i] == (uint32_t) -1) 373a15b70a81a609f024083cb04f9819483f4d5cab7Behdad Esfahbod vis_clusters[i] = vis_clusters[i - 1]; 37491e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod 37591e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod#undef utf16_index 3768fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 37791e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod buffer->ensure (num_glyphs); 37891e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod if (buffer->in_error) 379b6b7ba1313bf686e6ed567183466104c90504a67Behdad Esfahbod return false; 38091e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod 38191e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod 38291e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod buffer->len = num_glyphs; 3838fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_glyph_info_t *info = buffer->info; 3848fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod for (unsigned int i = 0; i < num_glyphs; i++) 3858fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod { 3868fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod info[i].codepoint = item.glyphs[i]; 38791e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod info[i].cluster = vis_clusters[i]; 3888fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3898fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod info[i].mask = item.advances[i]; 3908fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod info[i].var1.u32 = item.offsets[i].x; 3918fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod info[i].var2.u32 = item.offsets[i].y; 3928fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 3938fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 3948fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod buffer->clear_positions (); 3958fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 39691e721ea8693205f4f738bca97a5055ee75cf463Behdad Esfahbod for (unsigned int i = 0; i < num_glyphs; ++i) { 3978fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_glyph_info_t *info = &buffer->info[i]; 3988fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod hb_glyph_position_t *pos = &buffer->pos[i]; 3998fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 4008fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod /* TODO vertical */ 4018fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod pos->x_advance = info->mask; 4028fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod pos->x_offset = info->var1.u32; 4038fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod pos->y_offset = info->var2.u32; 4048fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod } 4058fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 4068fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod if (HB_DIRECTION_IS_BACKWARD (buffer->props.direction)) 4078fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod buffer->reverse (); 4088fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod 4098fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod return true; 4108fe4c7405b922cf0f936a46a9baedf4885b05254Behdad Esfahbod} 411