48 HB_SCRIPT_CANADIAN_SYLLABICS,
79 HB_SCRIPT_NEW_TAI_LUE,
82 HB_SCRIPT_SYLOTI_NAGRI,
83 HB_SCRIPT_OLD_PERSIAN,
110 HB_SCRIPT_EGYPTIAN_HIEROGLYPHS,
115 HB_SCRIPT_MEETEI_MAYEK,
116 HB_SCRIPT_IMPERIAL_ARAMAIC,
117 HB_SCRIPT_OLD_SOUTH_ARABIAN,
118 HB_SCRIPT_INSCRIPTIONAL_PARTHIAN,
119 HB_SCRIPT_INSCRIPTIONAL_PAHLAVI,
120 HB_SCRIPT_OLD_TURKIC,
130 HB_SCRIPT_MEROITIC_CURSIVE,
131 HB_SCRIPT_MEROITIC_HIEROGLYPHS,
134 HB_SCRIPT_SORA_SOMPENG,
138 HB_SCRIPT_CAUCASIAN_ALBANIAN,
143 HB_SCRIPT_PAHAWH_HMONG,
147 HB_SCRIPT_MANICHAEAN,
148 HB_SCRIPT_MENDE_KIKAKUI,
151 HB_SCRIPT_OLD_NORTH_ARABIAN,
154 HB_SCRIPT_PAU_CIN_HAU,
155 HB_SCRIPT_OLD_PERMIC,
156 HB_SCRIPT_PSALTER_PAHLAVI,
160 HB_SCRIPT_WARANG_CITI,
164 HB_SCRIPT_ANATOLIAN_HIEROGLYPHS,
167 HB_SCRIPT_OLD_HUNGARIAN,
168 HB_SCRIPT_SIGNWRITING,
179 HB_SCRIPT_MASARAM_GONDI,
182 HB_SCRIPT_ZANABAZAR_SQUARE,
186 HB_SCRIPT_GUNJALA_GONDI,
187 HB_SCRIPT_HANIFI_ROHINGYA,
189 HB_SCRIPT_MEDEFAIDRIN,
190 HB_SCRIPT_OLD_SOGDIAN,
195 HB_SCRIPT_NANDINAGARI,
196 HB_SCRIPT_NYIAKENG_PUACHUE_HMONG,
200#if !HB_VERSION_ATLEAST(2
, 6
, 7
)
201 hb_script_t(HB_TAG(
'C',
'h',
'r',
's')),
202 hb_script_t(HB_TAG(
'D',
'i',
'a',
'k')),
203 hb_script_t(HB_TAG(
'K',
'i',
't',
's')),
204 hb_script_t(HB_TAG(
'Y',
'e',
'z',
'i')),
206 HB_SCRIPT_CHORASMIAN,
207 HB_SCRIPT_DIVES_AKURU,
208 HB_SCRIPT_KHITAN_SMALL_SCRIPT,
212#if !HB_VERSION_ATLEAST(3
, 0
, 0
)
213 hb_script_t(HB_TAG(
'C',
'p',
'm',
'n')),
214 hb_script_t(HB_TAG(
'O',
'u',
'g',
'r')),
215 hb_script_t(HB_TAG(
'T',
'n',
's',
'a')),
216 hb_script_t(HB_TAG(
'T',
'o',
't',
'o')),
217 hb_script_t(HB_TAG(
'V',
'i',
't',
'h')),
219 HB_SCRIPT_CYPRO_MINOAN,
220 HB_SCRIPT_OLD_UYGHUR,
226#if !HB_VERSION_ATLEAST(5
, 2
, 0
)
227 hb_script_t(HB_TAG(
'K',
'a',
'w',
'i')),
228 hb_script_t(HB_TAG(
'N',
'a',
'g',
'm')),
231 HB_SCRIPT_NAG_MUNDARI,
235#if !HB_VERSION_ATLEAST(9
, 1
, 0
)
236 hb_script_t(HB_TAG(
'G',
'a',
'r',
'a')),
237 hb_script_t(HB_TAG(
'G',
'u',
'k',
'h')),
238 hb_script_t(HB_TAG(
'K',
'r',
'a',
'i')),
239 hb_script_t(HB_TAG(
'O',
'n',
'a',
'o')),
240 hb_script_t(HB_TAG(
'S',
'u',
'n',
'u')),
241 hb_script_t(HB_TAG(
'T',
'o',
'd',
'r')),
242 hb_script_t(HB_TAG(
'T',
'u',
't',
'g')),
245 HB_SCRIPT_GURUNG_KHEMA,
250 HB_SCRIPT_TULU_TIGALARI,
278 HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK,
279 HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK,
280 HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK,
282 HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER,
283 HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER,
284 HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER,
286 HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR,
287 HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR,
288 HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR,
290 HB_UNICODE_GENERAL_CATEGORY_CONTROL,
291 HB_UNICODE_GENERAL_CATEGORY_FORMAT,
292 HB_UNICODE_GENERAL_CATEGORY_SURROGATE,
293 HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE,
294 HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED,
296 HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER,
297 HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER,
298 HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER,
299 HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER,
300 HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER,
302 HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION,
303 HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION,
304 HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION,
305 HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION,
306 HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION,
307 HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION,
308 HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION,
310 HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL,
311 HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL,
312 HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL,
313 HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL
363 hb_codepoint_t *a, hb_codepoint_t *b,
367 if (QChar::decompositionTag(ab) != QChar::Canonical)
370 QString normalized = QChar::decomposition(ab);
371 if (normalized.isEmpty())
374 QStringIterator it(normalized);
375 Q_ASSERT(it.hasNext());
389 const QString recomposed = normalized.normalized(QString::NormalizationForm_C);
390 QStringIterator jt(recomposed);
391 Q_ASSERT(jt.hasNext());
392 const hb_codepoint_t c = jt.next();
393 if (c != *a && c != ab) {
405 }
while (it.hasNext());
406 normalized.chop(QChar::requiresSurrogates(*b) ? 2 : 1);
407 const QString recomposed = normalized.normalized(QString::NormalizationForm_C);
408 QStringIterator jt(recomposed);
409 Q_ASSERT(jt.hasNext());
446_hb_qt_get_font_h_extents(hb_font_t * ,
void *font_data,
447 hb_font_extents_t *metrics,
450 QFontEngine *fe =
static_cast<QFontEngine *>(font_data);
453 metrics->ascender = fe->ascent().value();
454 metrics->descender = fe->descent().value();
455 metrics->line_gap = fe->leading().value();
475_hb_qt_font_get_variation_glyph(hb_font_t * ,
void *font_data,
476 hb_codepoint_t unicode, hb_codepoint_t ,
477 hb_codepoint_t *glyph,
480 QFontEngine *fe =
static_cast<QFontEngine *>(font_data);
484 *glyph = fe->glyphIndex(unicode);
510_hb_qt_font_get_glyph_h_kerning(hb_font_t *font,
void *font_data,
511 hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
514 QFontEngine *fe =
static_cast<QFontEngine *>(font_data);
517 glyph_t glyphs[2] = { first_glyph, second_glyph };
523 g.advances = &advance;
525 fe->doKerning(&g, QFontEngine::ShaperFlags(hb_qt_font_get_use_design_metrics(font)));
527 return advance.value();
531_hb_qt_font_get_glyph_extents(hb_font_t * ,
void *font_data,
532 hb_codepoint_t glyph,
533 hb_glyph_extents_t *extents,
536 QFontEngine *fe =
static_cast<QFontEngine *>(font_data);
539 glyph_metrics_t gm = fe->boundingBox(glyph);
541 extents->x_bearing = gm.x.value();
542 extents->y_bearing = gm.y.value();
543 extents->width = gm.width.value();
544 extents->height = gm.height.value();
550_hb_qt_font_get_glyph_contour_point(hb_font_t * ,
void *font_data,
551 hb_codepoint_t glyph,
552 unsigned int point_index, hb_position_t *x, hb_position_t *y,
555 QFontEngine *fe =
static_cast<QFontEngine *>(font_data);
559 quint32 numPoints = 1;
560 if (Q_LIKELY(fe->getPointInOutline(glyph, 0, point_index, &xpos, &ypos, &numPoints) == 0)) {
613 QFontEngine::FaceData *data =
static_cast<QFontEngine::FaceData *>(user_data);
617 Q_ASSERT(get_font_table);
620 if (Q_UNLIKELY(!get_font_table(data->user_data, tag, 0, &length)))
621 return hb_blob_get_empty();
623 char *buffer =
static_cast<
char *>(malloc(length));
624 if (q_check_ptr(buffer) ==
nullptr)
627 if (Q_UNLIKELY(!get_font_table(data->user_data, tag,
reinterpret_cast<uchar *>(buffer), &length)))
630 return hb_blob_create(
const_cast<
const char *>(buffer), length,
631 HB_MEMORY_MODE_WRITABLE,
638 QFontEngine::FaceData *data =
static_cast<QFontEngine::FaceData *>(malloc(
sizeof(QFontEngine::FaceData)));
640 data->user_data = fe->faceData.user_data;
641 data->get_font_table = fe->faceData.get_font_table;
643 hb_face_t *face = hb_face_create_for_tables(_hb_qt_reference_table, (
void *)data, free);
645 hb_face_set_index(face, fe->faceId().index);
646 hb_face_set_upem(face, fe->emSquareSize().truncate());
673 hb_font_t *font = hb_font_create(face);
675 const qreal y_ppem = fe->fontDef.pixelSize;
676 const qreal x_ppem = (fe->fontDef.pixelSize * fe->fontDef.stretch) / 100.0;
678 hb_font_set_funcs(font, qt_ffuncs()->funcs, fe,
nullptr);
679 hb_font_set_scale(font, QFixed::fromReal(x_ppem).value(), -QFixed::fromReal(y_ppem).value());
680 hb_font_set_ppem(font,
int(x_ppem),
int(y_ppem));
682 hb_font_set_ptem(font, fe->fontDef.pointSize);