[old] Speed up Unicode properties access in hb-old shaper
Just to be sure it's not punishing the old shaper performance numbers. Doesn't seem to have a measurable effect.
This commit is contained in:
parent
36a661c0a0
commit
08677c2507
|
@ -237,13 +237,13 @@ static const unsigned char arabic_group[0x150] = {
|
||||||
ArabicNone, Zain, Kaph, Fe,
|
ArabicNone, Zain, Kaph, Fe,
|
||||||
};
|
};
|
||||||
|
|
||||||
static ArabicGroup arabicGroup(unsigned short uc)
|
static ArabicGroup arabicGroup(hb_unicode_funcs_t *ufuncs, unsigned short uc)
|
||||||
{
|
{
|
||||||
if (uc >= 0x0600 && uc < 0x750)
|
if (uc >= 0x0600 && uc < 0x750)
|
||||||
return (ArabicGroup) arabic_group[uc-0x600];
|
return (ArabicGroup) arabic_group[uc-0x600];
|
||||||
else if (uc == 0x200d)
|
else if (uc == 0x200d)
|
||||||
return Center;
|
return Center;
|
||||||
else if (HB_GetUnicodeCharCategory(uc) == HB_Separator_Space)
|
else if (HB_GetUnicodeCharCategory(ufuncs, uc) == HB_Separator_Space)
|
||||||
return ArabicSpace;
|
return ArabicSpace;
|
||||||
else
|
else
|
||||||
return ArabicNone;
|
return ArabicNone;
|
||||||
|
@ -375,14 +375,14 @@ This seems to imply that we have at most one kashida point per arabic word.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void getArabicProperties(const unsigned short *chars, int len, HB_ArabicProperties *properties)
|
static void getArabicProperties(hb_unicode_funcs_t *ufuncs, const unsigned short *chars, int len, HB_ArabicProperties *properties)
|
||||||
{
|
{
|
||||||
/* qDebug("arabicSyriacOpenTypeShape: properties:"); */
|
/* qDebug("arabicSyriacOpenTypeShape: properties:"); */
|
||||||
int lastPos = 0;
|
int lastPos = 0;
|
||||||
int lastGroup = ArabicNone;
|
int lastGroup = ArabicNone;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
ArabicGroup group = arabicGroup(chars[0]);
|
ArabicGroup group = arabicGroup(ufuncs, chars[0]);
|
||||||
Joining j = joining_for_group[group];
|
Joining j = joining_for_group[group];
|
||||||
ArabicShape shape = joining_table[XIsolated][j].form2;
|
ArabicShape shape = joining_table[XIsolated][j].form2;
|
||||||
properties[0].justification = HB_NoJustification;
|
properties[0].justification = HB_NoJustification;
|
||||||
|
@ -391,7 +391,7 @@ static void getArabicProperties(const unsigned short *chars, int len, HB_ArabicP
|
||||||
/* #### fix handling for spaces and punktuation */
|
/* #### fix handling for spaces and punktuation */
|
||||||
properties[i].justification = HB_NoJustification;
|
properties[i].justification = HB_NoJustification;
|
||||||
|
|
||||||
group = arabicGroup(chars[i]);
|
group = arabicGroup(ufuncs, chars[i]);
|
||||||
j = joining_for_group[group];
|
j = joining_for_group[group];
|
||||||
|
|
||||||
if (j == JTransparent) {
|
if (j == JTransparent) {
|
||||||
|
@ -460,7 +460,7 @@ static void getArabicProperties(const unsigned short *chars, int len, HB_ArabicP
|
||||||
|
|
||||||
case Yeh:
|
case Yeh:
|
||||||
case Reh:
|
case Reh:
|
||||||
if (properties[lastPos].shape == XMedial && arabicGroup(chars[lastPos]) == Beh)
|
if (properties[lastPos].shape == XMedial && arabicGroup(ufuncs, chars[lastPos]) == Beh)
|
||||||
properties[lastPos-1].justification = HB_Arabic_BaRa;
|
properties[lastPos-1].justification = HB_Arabic_BaRa;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -504,7 +504,7 @@ static Joining getNkoJoining(unsigned short uc)
|
||||||
return JNone;
|
return JNone;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getNkoProperties(const unsigned short *chars, int len, HB_ArabicProperties *properties)
|
static void getNkoProperties(hb_unicode_funcs_t *ufuncs, const unsigned short *chars, int len, HB_ArabicProperties *properties)
|
||||||
{
|
{
|
||||||
int lastPos = 0;
|
int lastPos = 0;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
@ -514,7 +514,7 @@ static void getNkoProperties(const unsigned short *chars, int len, HB_ArabicProp
|
||||||
properties[0].justification = HB_NoJustification;
|
properties[0].justification = HB_NoJustification;
|
||||||
|
|
||||||
for (i = 1; i < len; ++i) {
|
for (i = 1; i < len; ++i) {
|
||||||
properties[i].justification = (HB_GetUnicodeCharCategory(chars[i]) == HB_Separator_Space) ?
|
properties[i].justification = (HB_GetUnicodeCharCategory(ufuncs, chars[i]) == HB_Separator_Space) ?
|
||||||
ArabicSpace : ArabicNone;
|
ArabicSpace : ArabicNone;
|
||||||
|
|
||||||
j = getNkoJoining(chars[i]);
|
j = getNkoJoining(chars[i]);
|
||||||
|
@ -854,13 +854,13 @@ static int getShape(hb_uint8 cell, int shape)
|
||||||
/*
|
/*
|
||||||
Two small helper functions for arabic shaping.
|
Two small helper functions for arabic shaping.
|
||||||
*/
|
*/
|
||||||
static HB_UChar16 prevChar(const HB_UChar16 *str, int pos)
|
static HB_UChar16 prevChar(hb_unicode_funcs_t *ufuncs, const HB_UChar16 *str, int pos)
|
||||||
{
|
{
|
||||||
/*qDebug("leftChar: pos=%d", pos); */
|
/*qDebug("leftChar: pos=%d", pos); */
|
||||||
const HB_UChar16 *ch = str + pos - 1;
|
const HB_UChar16 *ch = str + pos - 1;
|
||||||
pos--;
|
pos--;
|
||||||
while(pos > -1) {
|
while(pos > -1) {
|
||||||
if(HB_GetUnicodeCharCategory(*ch) != HB_Mark_NonSpacing)
|
if(HB_GetUnicodeCharCategory(ufuncs, *ch) != HB_Mark_NonSpacing)
|
||||||
return *ch;
|
return *ch;
|
||||||
pos--;
|
pos--;
|
||||||
ch--;
|
ch--;
|
||||||
|
@ -868,13 +868,13 @@ static HB_UChar16 prevChar(const HB_UChar16 *str, int pos)
|
||||||
return ReplacementCharacter;
|
return ReplacementCharacter;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HB_UChar16 nextChar(const HB_UChar16 *str, hb_uint32 len, hb_uint32 pos)
|
static HB_UChar16 nextChar(hb_unicode_funcs_t *ufuncs, const HB_UChar16 *str, hb_uint32 len, hb_uint32 pos)
|
||||||
{
|
{
|
||||||
const HB_UChar16 *ch = str + pos + 1;
|
const HB_UChar16 *ch = str + pos + 1;
|
||||||
pos++;
|
pos++;
|
||||||
while(pos < len) {
|
while(pos < len) {
|
||||||
/*qDebug("rightChar: %d isLetter=%d, joining=%d", pos, ch.isLetter(), ch.joining()); */
|
/*qDebug("rightChar: %d isLetter=%d, joining=%d", pos, ch.isLetter(), ch.joining()); */
|
||||||
if(HB_GetUnicodeCharCategory(*ch) != HB_Mark_NonSpacing)
|
if(HB_GetUnicodeCharCategory(ufuncs, *ch) != HB_Mark_NonSpacing)
|
||||||
return *ch;
|
return *ch;
|
||||||
/* assume it's a transparent char, this might not be 100% correct */
|
/* assume it's a transparent char, this might not be 100% correct */
|
||||||
pos++;
|
pos++;
|
||||||
|
@ -883,7 +883,7 @@ static HB_UChar16 nextChar(const HB_UChar16 *str, hb_uint32 len, hb_uint32 pos)
|
||||||
return ReplacementCharacter;
|
return ReplacementCharacter;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shapedString(const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32 from, hb_uint32 len, HB_UChar16 *shapeBuffer, int *shapedLength,
|
static void shapedString(hb_unicode_funcs_t *ufuncs, const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32 from, hb_uint32 len, HB_UChar16 *shapeBuffer, int *shapedLength,
|
||||||
HB_Bool reverse, HB_GlyphAttributes *attributes, unsigned short *logClusters)
|
HB_Bool reverse, HB_GlyphAttributes *attributes, unsigned short *logClusters)
|
||||||
{
|
{
|
||||||
HB_ArabicProperties *properties;
|
HB_ArabicProperties *properties;
|
||||||
|
@ -910,7 +910,7 @@ static void shapedString(const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32
|
||||||
}
|
}
|
||||||
if (f + l < stringLength)
|
if (f + l < stringLength)
|
||||||
++l;
|
++l;
|
||||||
getArabicProperties(uc+f, l, props);
|
getArabicProperties(ufuncs, uc+f, l, props);
|
||||||
|
|
||||||
ch = uc + from;
|
ch = uc + from;
|
||||||
data = shapeBuffer;
|
data = shapeBuffer;
|
||||||
|
@ -927,7 +927,7 @@ static void shapedString(const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32
|
||||||
goto skip;
|
goto skip;
|
||||||
}
|
}
|
||||||
if (reverse)
|
if (reverse)
|
||||||
*data = HB_GetMirroredChar(*ch);
|
*data = HB_GetMirroredChar(ufuncs, *ch);
|
||||||
else
|
else
|
||||||
*data = *ch;
|
*data = *ch;
|
||||||
} else {
|
} else {
|
||||||
|
@ -939,7 +939,7 @@ static void shapedString(const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32
|
||||||
hb_uint16 map;
|
hb_uint16 map;
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 0x44: { /* lam */
|
case 0x44: { /* lam */
|
||||||
const HB_UChar16 pch = nextChar(uc, stringLength, pos);
|
const HB_UChar16 pch = nextChar(ufuncs, uc, stringLength, pos);
|
||||||
if ((pch >> 8) == 0x06) {
|
if ((pch >> 8) == 0x06) {
|
||||||
switch (pch & 0xff) {
|
switch (pch & 0xff) {
|
||||||
case 0x22:
|
case 0x22:
|
||||||
|
@ -959,7 +959,7 @@ static void shapedString(const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32
|
||||||
case 0x23: /* alef with hamza above */
|
case 0x23: /* alef with hamza above */
|
||||||
case 0x25: /* alef with hamza below */
|
case 0x25: /* alef with hamza below */
|
||||||
case 0x27: /* alef */
|
case 0x27: /* alef */
|
||||||
if (prevChar(uc, pos) == 0x0644) {
|
if (prevChar(ufuncs, uc, pos) == 0x0644) {
|
||||||
/* have a lam alef ligature */
|
/* have a lam alef ligature */
|
||||||
/*qDebug(" alef of lam-alef ligature"); */
|
/*qDebug(" alef of lam-alef ligature"); */
|
||||||
goto skip;
|
goto skip;
|
||||||
|
@ -973,7 +973,7 @@ static void shapedString(const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32
|
||||||
}
|
}
|
||||||
/* ##### Fixme */
|
/* ##### Fixme */
|
||||||
/*glyphs[gpos].attributes.zeroWidth = zeroWidth; */
|
/*glyphs[gpos].attributes.zeroWidth = zeroWidth; */
|
||||||
if (HB_GetUnicodeCharCategory(*ch) == HB_Mark_NonSpacing) {
|
if (HB_GetUnicodeCharCategory(ufuncs, *ch) == HB_Mark_NonSpacing) {
|
||||||
attributes[gpos].mark = TRUE;
|
attributes[gpos].mark = TRUE;
|
||||||
/* qDebug("glyph %d (char %d) is mark!", gpos, i); */
|
/* qDebug("glyph %d (char %d) is mark!", gpos, i); */
|
||||||
} else {
|
} else {
|
||||||
|
@ -981,7 +981,7 @@ static void shapedString(const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32
|
||||||
clusterStart = data - shapeBuffer;
|
clusterStart = data - shapeBuffer;
|
||||||
}
|
}
|
||||||
attributes[gpos].clusterStart = !attributes[gpos].mark;
|
attributes[gpos].clusterStart = !attributes[gpos].mark;
|
||||||
attributes[gpos].combiningClass = HB_GetUnicodeCharCombiningClass(*ch);
|
attributes[gpos].combiningClass = HB_GetUnicodeCharCombiningClass(ufuncs, *ch);
|
||||||
attributes[gpos].justification = properties[i].justification;
|
attributes[gpos].justification = properties[i].justification;
|
||||||
/* qDebug("data[%d] = %x (from %x)", gpos, (uint)data->unicode(), ch->unicode());*/
|
/* qDebug("data[%d] = %x (from %x)", gpos, (uint)data->unicode(), ch->unicode());*/
|
||||||
data++;
|
data++;
|
||||||
|
@ -1063,9 +1063,9 @@ static HB_Bool arabicSyriacOpenTypeShape(HB_ShaperItem *item, HB_Bool *ot_ok)
|
||||||
++l;
|
++l;
|
||||||
}
|
}
|
||||||
if (item->item.script == HB_Script_Nko)
|
if (item->item.script == HB_Script_Nko)
|
||||||
getNkoProperties(uc+f, l, props);
|
getNkoProperties(item->ufuncs, uc+f, l, props);
|
||||||
else
|
else
|
||||||
getArabicProperties(uc+f, l, props);
|
getArabicProperties(item->ufuncs, uc+f, l, props);
|
||||||
|
|
||||||
for (i = 0; i < (int)item->num_glyphs; i++) {
|
for (i = 0; i < (int)item->num_glyphs; i++) {
|
||||||
apply[i] = 0;
|
apply[i] = 0;
|
||||||
|
@ -1128,7 +1128,7 @@ HB_Bool HB_ArabicShape(HB_ShaperItem *item)
|
||||||
return HB_BasicShape(item);
|
return HB_BasicShape(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
shapedString(item->string, item->stringLength, item->item.pos, item->item.length, shapedChars, &slen,
|
shapedString(item->ufuncs, item->string, item->stringLength, item->item.pos, item->item.length, shapedChars, &slen,
|
||||||
item->item.bidiLevel % 2,
|
item->item.bidiLevel % 2,
|
||||||
item->attributes, item->log_clusters);
|
item->attributes, item->log_clusters);
|
||||||
|
|
||||||
|
|
|
@ -78,27 +78,27 @@ typedef enum
|
||||||
} HB_CharCategory;
|
} HB_CharCategory;
|
||||||
|
|
||||||
|
|
||||||
static inline HB_CharCategory HB_GetUnicodeCharCategory(HB_UChar32 ch)
|
static inline HB_CharCategory HB_GetUnicodeCharCategory(hb_unicode_funcs_t *funcs, HB_UChar32 ch)
|
||||||
{
|
{
|
||||||
return (HB_CharCategory) hb_unicode_general_category (hb_unicode_funcs_get_default (), ch);
|
return (HB_CharCategory) hb_unicode_general_category (funcs, ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int HB_GetUnicodeCharCombiningClass(HB_UChar32 ch)
|
static inline int HB_GetUnicodeCharCombiningClass(hb_unicode_funcs_t *funcs, HB_UChar32 ch)
|
||||||
{
|
{
|
||||||
return hb_unicode_combining_class (hb_unicode_funcs_get_default (), ch);
|
return hb_unicode_combining_class (funcs, ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline HB_UChar16 HB_GetMirroredChar(HB_UChar16 ch)
|
static inline HB_UChar16 HB_GetMirroredChar(hb_unicode_funcs_t *funcs, HB_UChar16 ch)
|
||||||
{
|
{
|
||||||
return hb_unicode_mirroring (hb_unicode_funcs_get_default (), ch);
|
return hb_unicode_mirroring (funcs, ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void HB_GetUnicodeCharProperties(HB_UChar32 ch, HB_CharCategory *category, int *combiningClass)
|
static inline void HB_GetUnicodeCharProperties(hb_unicode_funcs_t *funcs, HB_UChar32 ch, HB_CharCategory *category, int *combiningClass)
|
||||||
{
|
{
|
||||||
if (category)
|
if (category)
|
||||||
*category = HB_GetUnicodeCharCategory (ch);
|
*category = HB_GetUnicodeCharCategory (funcs, ch);
|
||||||
if (combiningClass)
|
if (combiningClass)
|
||||||
*combiningClass = HB_GetUnicodeCharCombiningClass (ch);
|
*combiningClass = HB_GetUnicodeCharCombiningClass (funcs, ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
HB_END_HEADER
|
HB_END_HEADER
|
||||||
|
|
|
@ -406,7 +406,7 @@ HB_Bool HB_GreekShape(HB_ShaperItem *shaper_item)
|
||||||
HB_CharCategory category;
|
HB_CharCategory category;
|
||||||
int cmb;
|
int cmb;
|
||||||
shapedChars[slen] = uc[i];
|
shapedChars[slen] = uc[i];
|
||||||
HB_GetUnicodeCharProperties(uc[i], &category, &cmb);
|
HB_GetUnicodeCharProperties(shaper_item->ufuncs, uc[i], &category, &cmb);
|
||||||
if (category != HB_Mark_NonSpacing) {
|
if (category != HB_Mark_NonSpacing) {
|
||||||
attributes[slen].clusterStart = TRUE;
|
attributes[slen].clusterStart = TRUE;
|
||||||
attributes[slen].mark = FALSE;
|
attributes[slen].mark = FALSE;
|
||||||
|
|
|
@ -151,7 +151,7 @@ HB_Bool HB_HebrewShape(HB_ShaperItem *shaper_item)
|
||||||
HB_CharCategory category;
|
HB_CharCategory category;
|
||||||
int cmb;
|
int cmb;
|
||||||
shapedChars[slen] = uc[i];
|
shapedChars[slen] = uc[i];
|
||||||
HB_GetUnicodeCharProperties(uc[i], &category, &cmb);
|
HB_GetUnicodeCharProperties(shaper_item->ufuncs, uc[i], &category, &cmb);
|
||||||
if (category != HB_Mark_NonSpacing) {
|
if (category != HB_Mark_NonSpacing) {
|
||||||
attributes[slen].clusterStart = TRUE;
|
attributes[slen].clusterStart = TRUE;
|
||||||
attributes[slen].mark = FALSE;
|
attributes[slen].mark = FALSE;
|
||||||
|
|
|
@ -30,22 +30,22 @@
|
||||||
|
|
||||||
#define FLAG(x) (1 << (x))
|
#define FLAG(x) (1 << (x))
|
||||||
|
|
||||||
static HB_Bool isLetter(HB_UChar16 ucs)
|
static HB_Bool isLetter(hb_unicode_funcs_t *ufuncs, HB_UChar16 ucs)
|
||||||
{
|
{
|
||||||
const int test = FLAG(HB_Letter_Uppercase) |
|
const int test = FLAG(HB_Letter_Uppercase) |
|
||||||
FLAG(HB_Letter_Lowercase) |
|
FLAG(HB_Letter_Lowercase) |
|
||||||
FLAG(HB_Letter_Titlecase) |
|
FLAG(HB_Letter_Titlecase) |
|
||||||
FLAG(HB_Letter_Modifier) |
|
FLAG(HB_Letter_Modifier) |
|
||||||
FLAG(HB_Letter_Other);
|
FLAG(HB_Letter_Other);
|
||||||
return !!(FLAG(HB_GetUnicodeCharCategory(ucs)) & test);
|
return !!(FLAG(HB_GetUnicodeCharCategory(ufuncs, ucs)) & test);
|
||||||
}
|
}
|
||||||
|
|
||||||
static HB_Bool isMark(HB_UChar16 ucs)
|
static HB_Bool isMark(hb_unicode_funcs_t *ufuncs, HB_UChar16 ucs)
|
||||||
{
|
{
|
||||||
const int test = FLAG(HB_Mark_NonSpacing) |
|
const int test = FLAG(HB_Mark_NonSpacing) |
|
||||||
FLAG(HB_Mark_SpacingCombining) |
|
FLAG(HB_Mark_SpacingCombining) |
|
||||||
FLAG(HB_Mark_Enclosing);
|
FLAG(HB_Mark_Enclosing);
|
||||||
return !!(FLAG(HB_GetUnicodeCharCategory(ucs)) & test);
|
return !!(FLAG(HB_GetUnicodeCharCategory(ufuncs, ucs)) & test);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Form {
|
enum Form {
|
||||||
|
@ -1576,7 +1576,7 @@ static bool indic_shape_syllable(HB_Bool openType, HB_ShaperItem *item, bool inv
|
||||||
// Ccmp always applies
|
// Ccmp always applies
|
||||||
// Init
|
// Init
|
||||||
if (item->item.pos == 0
|
if (item->item.pos == 0
|
||||||
|| !(isLetter(item->string[item->item.pos-1]) || isMark(item->string[item->item.pos-1])))
|
|| !(isLetter(item->ufuncs, item->string[item->item.pos-1]) || isMark(item->ufuncs, item->string[item->item.pos-1])))
|
||||||
properties[0] &= ~InitProperty;
|
properties[0] &= ~InitProperty;
|
||||||
|
|
||||||
// Nukta always applies
|
// Nukta always applies
|
||||||
|
|
|
@ -262,7 +262,7 @@ void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item)
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
HB_CharCategory lastCat;
|
HB_CharCategory lastCat;
|
||||||
int dummy;
|
int dummy;
|
||||||
HB_GetUnicodeCharProperties(uc[0], &lastCat, &dummy);
|
HB_GetUnicodeCharProperties(item->ufuncs, uc[0], &lastCat, &dummy);
|
||||||
for (i = 1; i < length; ++i) {
|
for (i = 1; i < length; ++i) {
|
||||||
if (logClusters[i] == pos)
|
if (logClusters[i] == pos)
|
||||||
// same glyph
|
// same glyph
|
||||||
|
@ -277,7 +277,7 @@ void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item)
|
||||||
attributes[pos].dontPrint = true;
|
attributes[pos].dontPrint = true;
|
||||||
HB_CharCategory cat;
|
HB_CharCategory cat;
|
||||||
int cmb;
|
int cmb;
|
||||||
HB_GetUnicodeCharProperties(uc[i], &cat, &cmb);
|
HB_GetUnicodeCharProperties(item->ufuncs, uc[i], &cat, &cmb);
|
||||||
if (cat != HB_Mark_NonSpacing) {
|
if (cat != HB_Mark_NonSpacing) {
|
||||||
attributes[pos].mark = false;
|
attributes[pos].mark = false;
|
||||||
attributes[pos].clusterStart = true;
|
attributes[pos].clusterStart = true;
|
||||||
|
@ -988,6 +988,8 @@ HB_Bool HB_ShapeItem(HB_ShaperItem *shaper_item)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
assert(shaper_item->item.script < HB_ScriptCount);
|
assert(shaper_item->item.script < HB_ScriptCount);
|
||||||
|
if (!shaper_item->ufuncs)
|
||||||
|
shaper_item->ufuncs = hb_unicode_funcs_get_default ();
|
||||||
result = HB_ScriptEngines[shaper_item->item.script].shape(shaper_item);
|
result = HB_ScriptEngines[shaper_item->item.script].shape(shaper_item);
|
||||||
shaper_item->glyphIndicesPresent = false;
|
shaper_item->glyphIndicesPresent = false;
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -234,6 +234,7 @@ typedef struct HB_Font_ {
|
||||||
typedef struct HB_ShaperItem_ HB_ShaperItem;
|
typedef struct HB_ShaperItem_ HB_ShaperItem;
|
||||||
|
|
||||||
struct HB_ShaperItem_ {
|
struct HB_ShaperItem_ {
|
||||||
|
hb_unicode_funcs_t *ufuncs;
|
||||||
const HB_UChar16 *string; /* input: the Unicode UTF16 text to be shaped */
|
const HB_UChar16 *string; /* input: the Unicode UTF16 text to be shaped */
|
||||||
hb_uint32 stringLength; /* input: the length of the input in 16-bit words */
|
hb_uint32 stringLength; /* input: the length of the input in 16-bit words */
|
||||||
HB_ScriptItem item; /* input: the current run to be shaped: a run of text all in the same script that is a substring of <string> */
|
HB_ScriptItem item; /* input: the current run to be shaped: a run of text all in the same script that is a substring of <string> */
|
||||||
|
|
Loading…
Reference in New Issue