Merge branch 'main' into main
This commit is contained in:
commit
892e309042
|
@ -49,7 +49,7 @@ struct Coverage
|
||||||
HBUINT16 format; /* Format identifier */
|
HBUINT16 format; /* Format identifier */
|
||||||
CoverageFormat1_3<SmallTypes> format1;
|
CoverageFormat1_3<SmallTypes> format1;
|
||||||
CoverageFormat2_4<SmallTypes> format2;
|
CoverageFormat2_4<SmallTypes> format2;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
CoverageFormat1_3<MediumTypes>format3;
|
CoverageFormat1_3<MediumTypes>format3;
|
||||||
CoverageFormat2_4<MediumTypes>format4;
|
CoverageFormat2_4<MediumTypes>format4;
|
||||||
#endif
|
#endif
|
||||||
|
@ -65,7 +65,7 @@ struct Coverage
|
||||||
{
|
{
|
||||||
case 1: return_trace (u.format1.sanitize (c));
|
case 1: return_trace (u.format1.sanitize (c));
|
||||||
case 2: return_trace (u.format2.sanitize (c));
|
case 2: return_trace (u.format2.sanitize (c));
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: return_trace (u.format3.sanitize (c));
|
case 3: return_trace (u.format3.sanitize (c));
|
||||||
case 4: return_trace (u.format4.sanitize (c));
|
case 4: return_trace (u.format4.sanitize (c));
|
||||||
#endif
|
#endif
|
||||||
|
@ -87,7 +87,7 @@ struct Coverage
|
||||||
switch (u.format) {
|
switch (u.format) {
|
||||||
case 1: return u.format1.get_coverage (glyph_id);
|
case 1: return u.format1.get_coverage (glyph_id);
|
||||||
case 2: return u.format2.get_coverage (glyph_id);
|
case 2: return u.format2.get_coverage (glyph_id);
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: return u.format3.get_coverage (glyph_id);
|
case 3: return u.format3.get_coverage (glyph_id);
|
||||||
case 4: return u.format4.get_coverage (glyph_id);
|
case 4: return u.format4.get_coverage (glyph_id);
|
||||||
#endif
|
#endif
|
||||||
|
@ -100,7 +100,7 @@ struct Coverage
|
||||||
switch (u.format) {
|
switch (u.format) {
|
||||||
case 1: return u.format1.get_population ();
|
case 1: return u.format1.get_population ();
|
||||||
case 2: return u.format2.get_population ();
|
case 2: return u.format2.get_population ();
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: return u.format3.get_population ();
|
case 3: return u.format3.get_population ();
|
||||||
case 4: return u.format4.get_population ();
|
case 4: return u.format4.get_population ();
|
||||||
#endif
|
#endif
|
||||||
|
@ -127,7 +127,7 @@ struct Coverage
|
||||||
}
|
}
|
||||||
u.format = count <= num_ranges * 3 ? 1 : 2;
|
u.format = count <= num_ranges * 3 ? 1 : 2;
|
||||||
|
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
if (count && last > 0xFFFFu)
|
if (count && last > 0xFFFFu)
|
||||||
u.format += 2;
|
u.format += 2;
|
||||||
#endif
|
#endif
|
||||||
|
@ -136,7 +136,7 @@ struct Coverage
|
||||||
{
|
{
|
||||||
case 1: return_trace (u.format1.serialize (c, glyphs));
|
case 1: return_trace (u.format1.serialize (c, glyphs));
|
||||||
case 2: return_trace (u.format2.serialize (c, glyphs));
|
case 2: return_trace (u.format2.serialize (c, glyphs));
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: return_trace (u.format3.serialize (c, glyphs));
|
case 3: return_trace (u.format3.serialize (c, glyphs));
|
||||||
case 4: return_trace (u.format4.serialize (c, glyphs));
|
case 4: return_trace (u.format4.serialize (c, glyphs));
|
||||||
#endif
|
#endif
|
||||||
|
@ -166,7 +166,7 @@ struct Coverage
|
||||||
{
|
{
|
||||||
case 1: return u.format1.intersects (glyphs);
|
case 1: return u.format1.intersects (glyphs);
|
||||||
case 2: return u.format2.intersects (glyphs);
|
case 2: return u.format2.intersects (glyphs);
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: return u.format3.intersects (glyphs);
|
case 3: return u.format3.intersects (glyphs);
|
||||||
case 4: return u.format4.intersects (glyphs);
|
case 4: return u.format4.intersects (glyphs);
|
||||||
#endif
|
#endif
|
||||||
|
@ -179,7 +179,7 @@ struct Coverage
|
||||||
{
|
{
|
||||||
case 1: return u.format1.intersects_coverage (glyphs, index);
|
case 1: return u.format1.intersects_coverage (glyphs, index);
|
||||||
case 2: return u.format2.intersects_coverage (glyphs, index);
|
case 2: return u.format2.intersects_coverage (glyphs, index);
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: return u.format3.intersects_coverage (glyphs, index);
|
case 3: return u.format3.intersects_coverage (glyphs, index);
|
||||||
case 4: return u.format4.intersects_coverage (glyphs, index);
|
case 4: return u.format4.intersects_coverage (glyphs, index);
|
||||||
#endif
|
#endif
|
||||||
|
@ -196,7 +196,7 @@ struct Coverage
|
||||||
{
|
{
|
||||||
case 1: return u.format1.collect_coverage (glyphs);
|
case 1: return u.format1.collect_coverage (glyphs);
|
||||||
case 2: return u.format2.collect_coverage (glyphs);
|
case 2: return u.format2.collect_coverage (glyphs);
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: return u.format3.collect_coverage (glyphs);
|
case 3: return u.format3.collect_coverage (glyphs);
|
||||||
case 4: return u.format4.collect_coverage (glyphs);
|
case 4: return u.format4.collect_coverage (glyphs);
|
||||||
#endif
|
#endif
|
||||||
|
@ -212,7 +212,7 @@ struct Coverage
|
||||||
{
|
{
|
||||||
case 1: return u.format1.intersect_set (glyphs, intersect_glyphs);
|
case 1: return u.format1.intersect_set (glyphs, intersect_glyphs);
|
||||||
case 2: return u.format2.intersect_set (glyphs, intersect_glyphs);
|
case 2: return u.format2.intersect_set (glyphs, intersect_glyphs);
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: return u.format3.intersect_set (glyphs, intersect_glyphs);
|
case 3: return u.format3.intersect_set (glyphs, intersect_glyphs);
|
||||||
case 4: return u.format4.intersect_set (glyphs, intersect_glyphs);
|
case 4: return u.format4.intersect_set (glyphs, intersect_glyphs);
|
||||||
#endif
|
#endif
|
||||||
|
@ -231,7 +231,7 @@ struct Coverage
|
||||||
{
|
{
|
||||||
case 1: u.format1.init (c_.u.format1); return;
|
case 1: u.format1.init (c_.u.format1); return;
|
||||||
case 2: u.format2.init (c_.u.format2); return;
|
case 2: u.format2.init (c_.u.format2); return;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: u.format3.init (c_.u.format3); return;
|
case 3: u.format3.init (c_.u.format3); return;
|
||||||
case 4: u.format4.init (c_.u.format4); return;
|
case 4: u.format4.init (c_.u.format4); return;
|
||||||
#endif
|
#endif
|
||||||
|
@ -244,7 +244,7 @@ struct Coverage
|
||||||
{
|
{
|
||||||
case 1: return u.format1.__more__ ();
|
case 1: return u.format1.__more__ ();
|
||||||
case 2: return u.format2.__more__ ();
|
case 2: return u.format2.__more__ ();
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: return u.format3.__more__ ();
|
case 3: return u.format3.__more__ ();
|
||||||
case 4: return u.format4.__more__ ();
|
case 4: return u.format4.__more__ ();
|
||||||
#endif
|
#endif
|
||||||
|
@ -257,7 +257,7 @@ struct Coverage
|
||||||
{
|
{
|
||||||
case 1: u.format1.__next__ (); break;
|
case 1: u.format1.__next__ (); break;
|
||||||
case 2: u.format2.__next__ (); break;
|
case 2: u.format2.__next__ (); break;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: u.format3.__next__ (); break;
|
case 3: u.format3.__next__ (); break;
|
||||||
case 4: u.format4.__next__ (); break;
|
case 4: u.format4.__next__ (); break;
|
||||||
#endif
|
#endif
|
||||||
|
@ -273,7 +273,7 @@ struct Coverage
|
||||||
{
|
{
|
||||||
case 1: return u.format1.get_glyph ();
|
case 1: return u.format1.get_glyph ();
|
||||||
case 2: return u.format2.get_glyph ();
|
case 2: return u.format2.get_glyph ();
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: return u.format3.get_glyph ();
|
case 3: return u.format3.get_glyph ();
|
||||||
case 4: return u.format4.get_glyph ();
|
case 4: return u.format4.get_glyph ();
|
||||||
#endif
|
#endif
|
||||||
|
@ -287,7 +287,7 @@ struct Coverage
|
||||||
{
|
{
|
||||||
case 1: return u.format1 != o.u.format1;
|
case 1: return u.format1 != o.u.format1;
|
||||||
case 2: return u.format2 != o.u.format2;
|
case 2: return u.format2 != o.u.format2;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: return u.format3 != o.u.format3;
|
case 3: return u.format3 != o.u.format3;
|
||||||
case 4: return u.format4 != o.u.format4;
|
case 4: return u.format4 != o.u.format4;
|
||||||
#endif
|
#endif
|
||||||
|
@ -302,7 +302,7 @@ struct Coverage
|
||||||
{
|
{
|
||||||
case 1: it.u.format1 = u.format1.__end__ (); break;
|
case 1: it.u.format1 = u.format1.__end__ (); break;
|
||||||
case 2: it.u.format2 = u.format2.__end__ (); break;
|
case 2: it.u.format2 = u.format2.__end__ (); break;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: it.u.format3 = u.format3.__end__ (); break;
|
case 3: it.u.format3 = u.format3.__end__ (); break;
|
||||||
case 4: it.u.format4 = u.format4.__end__ (); break;
|
case 4: it.u.format4 = u.format4.__end__ (); break;
|
||||||
#endif
|
#endif
|
||||||
|
@ -314,7 +314,7 @@ struct Coverage
|
||||||
private:
|
private:
|
||||||
unsigned int format;
|
unsigned int format;
|
||||||
union {
|
union {
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
CoverageFormat2_4<MediumTypes>::iter_t format4; /* Put this one first since it's larger; helps shut up compiler. */
|
CoverageFormat2_4<MediumTypes>::iter_t format4; /* Put this one first since it's larger; helps shut up compiler. */
|
||||||
CoverageFormat1_3<MediumTypes>::iter_t format3;
|
CoverageFormat1_3<MediumTypes>::iter_t format3;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -13,7 +13,7 @@ struct MarkBasePos
|
||||||
union {
|
union {
|
||||||
HBUINT16 format; /* Format identifier */
|
HBUINT16 format; /* Format identifier */
|
||||||
MarkBasePosFormat1_2<SmallTypes> format1;
|
MarkBasePosFormat1_2<SmallTypes> format1;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
MarkBasePosFormat1_2<MediumTypes> format2;
|
MarkBasePosFormat1_2<MediumTypes> format2;
|
||||||
#endif
|
#endif
|
||||||
} u;
|
} u;
|
||||||
|
@ -26,7 +26,7 @@ struct MarkBasePos
|
||||||
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
|
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
|
||||||
switch (u.format) {
|
switch (u.format) {
|
||||||
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
||||||
#endif
|
#endif
|
||||||
default:return_trace (c->default_return_value ());
|
default:return_trace (c->default_return_value ());
|
||||||
|
|
|
@ -13,7 +13,7 @@ struct MarkLigPos
|
||||||
union {
|
union {
|
||||||
HBUINT16 format; /* Format identifier */
|
HBUINT16 format; /* Format identifier */
|
||||||
MarkLigPosFormat1_2<SmallTypes> format1;
|
MarkLigPosFormat1_2<SmallTypes> format1;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
MarkLigPosFormat1_2<MediumTypes> format2;
|
MarkLigPosFormat1_2<MediumTypes> format2;
|
||||||
#endif
|
#endif
|
||||||
} u;
|
} u;
|
||||||
|
@ -26,7 +26,7 @@ struct MarkLigPos
|
||||||
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
|
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
|
||||||
switch (u.format) {
|
switch (u.format) {
|
||||||
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
||||||
#endif
|
#endif
|
||||||
default:return_trace (c->default_return_value ());
|
default:return_trace (c->default_return_value ());
|
||||||
|
|
|
@ -13,7 +13,7 @@ struct MarkMarkPos
|
||||||
union {
|
union {
|
||||||
HBUINT16 format; /* Format identifier */
|
HBUINT16 format; /* Format identifier */
|
||||||
MarkMarkPosFormat1_2<SmallTypes> format1;
|
MarkMarkPosFormat1_2<SmallTypes> format1;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
MarkMarkPosFormat1_2<MediumTypes> format2;
|
MarkMarkPosFormat1_2<MediumTypes> format2;
|
||||||
#endif
|
#endif
|
||||||
} u;
|
} u;
|
||||||
|
@ -26,7 +26,7 @@ struct MarkMarkPos
|
||||||
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
|
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
|
||||||
switch (u.format) {
|
switch (u.format) {
|
||||||
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
||||||
#endif
|
#endif
|
||||||
default:return_trace (c->default_return_value ());
|
default:return_trace (c->default_return_value ());
|
||||||
|
|
|
@ -15,7 +15,7 @@ struct PairPos
|
||||||
HBUINT16 format; /* Format identifier */
|
HBUINT16 format; /* Format identifier */
|
||||||
PairPosFormat1_3<SmallTypes> format1;
|
PairPosFormat1_3<SmallTypes> format1;
|
||||||
PairPosFormat2_4<SmallTypes> format2;
|
PairPosFormat2_4<SmallTypes> format2;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
PairPosFormat1_3<MediumTypes> format3;
|
PairPosFormat1_3<MediumTypes> format3;
|
||||||
PairPosFormat2_4<MediumTypes> format4;
|
PairPosFormat2_4<MediumTypes> format4;
|
||||||
#endif
|
#endif
|
||||||
|
@ -30,7 +30,7 @@ struct PairPos
|
||||||
switch (u.format) {
|
switch (u.format) {
|
||||||
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
||||||
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
|
case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
|
||||||
case 4: return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...));
|
case 4: return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...));
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -14,7 +14,7 @@ struct AlternateSubst
|
||||||
union {
|
union {
|
||||||
HBUINT16 format; /* Format identifier */
|
HBUINT16 format; /* Format identifier */
|
||||||
AlternateSubstFormat1_2<SmallTypes> format1;
|
AlternateSubstFormat1_2<SmallTypes> format1;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
AlternateSubstFormat1_2<MediumTypes> format2;
|
AlternateSubstFormat1_2<MediumTypes> format2;
|
||||||
#endif
|
#endif
|
||||||
} u;
|
} u;
|
||||||
|
@ -27,7 +27,7 @@ struct AlternateSubst
|
||||||
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
|
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
|
||||||
switch (u.format) {
|
switch (u.format) {
|
||||||
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
||||||
#endif
|
#endif
|
||||||
default:return_trace (c->default_return_value ());
|
default:return_trace (c->default_return_value ());
|
||||||
|
|
|
@ -118,7 +118,7 @@ struct Ligature
|
||||||
match_positions[i] += delta;
|
match_positions[i] += delta;
|
||||||
if (i)
|
if (i)
|
||||||
*p++ = ',';
|
*p++ = ',';
|
||||||
snprintf (p, sizeof(buf), "%u", match_positions[i]);
|
snprintf (p, sizeof(buf) - (p - buf), "%u", match_positions[i]);
|
||||||
p += strlen(p);
|
p += strlen(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ struct LigatureSubst
|
||||||
union {
|
union {
|
||||||
HBUINT16 format; /* Format identifier */
|
HBUINT16 format; /* Format identifier */
|
||||||
LigatureSubstFormat1_2<SmallTypes> format1;
|
LigatureSubstFormat1_2<SmallTypes> format1;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
LigatureSubstFormat1_2<MediumTypes> format2;
|
LigatureSubstFormat1_2<MediumTypes> format2;
|
||||||
#endif
|
#endif
|
||||||
} u;
|
} u;
|
||||||
|
@ -27,7 +27,7 @@ struct LigatureSubst
|
||||||
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
|
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
|
||||||
switch (u.format) {
|
switch (u.format) {
|
||||||
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
||||||
#endif
|
#endif
|
||||||
default:return_trace (c->default_return_value ());
|
default:return_trace (c->default_return_value ());
|
||||||
|
|
|
@ -14,7 +14,7 @@ struct MultipleSubst
|
||||||
union {
|
union {
|
||||||
HBUINT16 format; /* Format identifier */
|
HBUINT16 format; /* Format identifier */
|
||||||
MultipleSubstFormat1_2<SmallTypes> format1;
|
MultipleSubstFormat1_2<SmallTypes> format1;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
MultipleSubstFormat1_2<MediumTypes> format2;
|
MultipleSubstFormat1_2<MediumTypes> format2;
|
||||||
#endif
|
#endif
|
||||||
} u;
|
} u;
|
||||||
|
@ -28,7 +28,7 @@ struct MultipleSubst
|
||||||
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
|
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
|
||||||
switch (u.format) {
|
switch (u.format) {
|
||||||
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
||||||
#endif
|
#endif
|
||||||
default:return_trace (c->default_return_value ());
|
default:return_trace (c->default_return_value ());
|
||||||
|
|
|
@ -117,7 +117,7 @@ struct Sequence
|
||||||
{
|
{
|
||||||
if (buf < p)
|
if (buf < p)
|
||||||
*p++ = ',';
|
*p++ = ',';
|
||||||
snprintf (p, sizeof(buf), "%u", i);
|
snprintf (p, sizeof(buf) - (p - buf), "%u", i);
|
||||||
p += strlen(p);
|
p += strlen(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ struct SingleSubst
|
||||||
HBUINT16 format; /* Format identifier */
|
HBUINT16 format; /* Format identifier */
|
||||||
SingleSubstFormat1_3<SmallTypes> format1;
|
SingleSubstFormat1_3<SmallTypes> format1;
|
||||||
SingleSubstFormat2_4<SmallTypes> format2;
|
SingleSubstFormat2_4<SmallTypes> format2;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
SingleSubstFormat1_3<MediumTypes> format3;
|
SingleSubstFormat1_3<MediumTypes> format3;
|
||||||
SingleSubstFormat2_4<MediumTypes> format4;
|
SingleSubstFormat2_4<MediumTypes> format4;
|
||||||
#endif
|
#endif
|
||||||
|
@ -32,7 +32,7 @@ struct SingleSubst
|
||||||
switch (u.format) {
|
switch (u.format) {
|
||||||
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
|
||||||
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
|
case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
|
||||||
case 4: return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...));
|
case 4: return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...));
|
||||||
#endif
|
#endif
|
||||||
|
@ -55,7 +55,7 @@ struct SingleSubst
|
||||||
format = 1;
|
format = 1;
|
||||||
hb_codepoint_t mask = 0xFFFFu;
|
hb_codepoint_t mask = 0xFFFFu;
|
||||||
|
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
if (+ glyphs
|
if (+ glyphs
|
||||||
| hb_map_retains_sorting (hb_first)
|
| hb_map_retains_sorting (hb_first)
|
||||||
| hb_filter ([] (hb_codepoint_t gid) { return gid > 0xFFFFu; }))
|
| hb_filter ([] (hb_codepoint_t gid) { return gid > 0xFFFFu; }))
|
||||||
|
@ -78,7 +78,7 @@ struct SingleSubst
|
||||||
| hb_map_retains_sorting (hb_first),
|
| hb_map_retains_sorting (hb_first),
|
||||||
delta));
|
delta));
|
||||||
case 2: return_trace (u.format2.serialize (c, glyphs));
|
case 2: return_trace (u.format2.serialize (c, glyphs));
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: return_trace (u.format3.serialize (c,
|
case 3: return_trace (u.format3.serialize (c,
|
||||||
+ glyphs
|
+ glyphs
|
||||||
| hb_map_retains_sorting (hb_first),
|
| hb_map_retains_sorting (hb_first),
|
||||||
|
|
|
@ -112,7 +112,7 @@ struct ClassDef : public OT::ClassDef
|
||||||
{
|
{
|
||||||
case 1: return ((ClassDefFormat1*)this)->sanitize (vertex);
|
case 1: return ((ClassDefFormat1*)this)->sanitize (vertex);
|
||||||
case 2: return ((ClassDefFormat2*)this)->sanitize (vertex);
|
case 2: return ((ClassDefFormat2*)this)->sanitize (vertex);
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
// Not currently supported
|
// Not currently supported
|
||||||
case 3:
|
case 3:
|
||||||
case 4:
|
case 4:
|
||||||
|
|
|
@ -136,7 +136,7 @@ struct Coverage : public OT::Layout::Common::Coverage
|
||||||
{
|
{
|
||||||
case 1: return ((CoverageFormat1*)this)->sanitize (vertex);
|
case 1: return ((CoverageFormat1*)this)->sanitize (vertex);
|
||||||
case 2: return ((CoverageFormat2*)this)->sanitize (vertex);
|
case 2: return ((CoverageFormat2*)this)->sanitize (vertex);
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
// Not currently supported
|
// Not currently supported
|
||||||
case 3:
|
case 3:
|
||||||
case 4:
|
case 4:
|
||||||
|
|
|
@ -355,7 +355,7 @@ struct GSTAR : public OT::GSUBGPOS
|
||||||
{
|
{
|
||||||
switch (u.version.major) {
|
switch (u.version.major) {
|
||||||
case 1: return u.version1.get_lookup_list_offset ();
|
case 1: return u.version1.get_lookup_list_offset ();
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 2: return u.version2.get_lookup_list_offset ();
|
case 2: return u.version2.get_lookup_list_offset ();
|
||||||
#endif
|
#endif
|
||||||
default: return 0;
|
default: return 0;
|
||||||
|
@ -374,7 +374,7 @@ struct GSTAR : public OT::GSUBGPOS
|
||||||
{
|
{
|
||||||
switch (u.version.major) {
|
switch (u.version.major) {
|
||||||
case 1: find_lookups<SmallTypes> (graph, lookups); break;
|
case 1: find_lookups<SmallTypes> (graph, lookups); break;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 2: find_lookups<MediumTypes> (graph, lookups); break;
|
case 2: find_lookups<MediumTypes> (graph, lookups); break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -477,7 +477,7 @@ struct MarkBasePos : public OT::Layout::GPOS_impl::MarkBasePos
|
||||||
switch (u.format) {
|
switch (u.format) {
|
||||||
case 1:
|
case 1:
|
||||||
return ((MarkBasePosFormat1*)(&u.format1))->split_subtables (c, parent_index, this_index);
|
return ((MarkBasePosFormat1*)(&u.format1))->split_subtables (c, parent_index, this_index);
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 2: HB_FALLTHROUGH;
|
case 2: HB_FALLTHROUGH;
|
||||||
// Don't split 24bit PairPos's.
|
// Don't split 24bit PairPos's.
|
||||||
#endif
|
#endif
|
||||||
|
@ -494,7 +494,7 @@ struct MarkBasePos : public OT::Layout::GPOS_impl::MarkBasePos
|
||||||
switch (u.format) {
|
switch (u.format) {
|
||||||
case 1:
|
case 1:
|
||||||
return ((MarkBasePosFormat1*)(&u.format1))->sanitize (vertex);
|
return ((MarkBasePosFormat1*)(&u.format1))->sanitize (vertex);
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 2: HB_FALLTHROUGH;
|
case 2: HB_FALLTHROUGH;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -611,7 +611,7 @@ struct PairPos : public OT::Layout::GPOS_impl::PairPos
|
||||||
return ((PairPosFormat1*)(&u.format1))->split_subtables (c, parent_index, this_index);
|
return ((PairPosFormat1*)(&u.format1))->split_subtables (c, parent_index, this_index);
|
||||||
case 2:
|
case 2:
|
||||||
return ((PairPosFormat2*)(&u.format2))->split_subtables (c, parent_index, this_index);
|
return ((PairPosFormat2*)(&u.format2))->split_subtables (c, parent_index, this_index);
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: HB_FALLTHROUGH;
|
case 3: HB_FALLTHROUGH;
|
||||||
case 4: HB_FALLTHROUGH;
|
case 4: HB_FALLTHROUGH;
|
||||||
// Don't split 24bit PairPos's.
|
// Don't split 24bit PairPos's.
|
||||||
|
@ -631,7 +631,7 @@ struct PairPos : public OT::Layout::GPOS_impl::PairPos
|
||||||
return ((PairPosFormat1*)(&u.format1))->sanitize (vertex);
|
return ((PairPosFormat1*)(&u.format1))->sanitize (vertex);
|
||||||
case 2:
|
case 2:
|
||||||
return ((PairPosFormat2*)(&u.format2))->sanitize (vertex);
|
return ((PairPosFormat2*)(&u.format2))->sanitize (vertex);
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BEYOND_64K
|
||||||
case 3: HB_FALLTHROUGH;
|
case 3: HB_FALLTHROUGH;
|
||||||
case 4: HB_FALLTHROUGH;
|
case 4: HB_FALLTHROUGH;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1136,7 +1136,7 @@ get_C_locale ()
|
||||||
/**
|
/**
|
||||||
* hb_variation_to_string:
|
* hb_variation_to_string:
|
||||||
* @variation: an #hb_variation_t to convert
|
* @variation: an #hb_variation_t to convert
|
||||||
* @buf: (array length=size) (out): output string
|
* @buf: (array length=size) (out caller-allocates): output string
|
||||||
* @size: the allocated size of @buf
|
* @size: the allocated size of @buf
|
||||||
*
|
*
|
||||||
* Converts an #hb_variation_t into a `NULL`-terminated string in the format
|
* Converts an #hb_variation_t into a `NULL`-terminated string in the format
|
||||||
|
|
|
@ -35,8 +35,8 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HB_BORING_EXPANSION
|
#ifndef HB_EXPERIMENTAL
|
||||||
#define HB_NO_BORING_EXPANSION
|
#define HB_NO_BEYOND_64K
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HB_TINY
|
#ifdef HB_TINY
|
||||||
|
@ -104,7 +104,7 @@
|
||||||
|
|
||||||
#ifdef HB_NO_BORING_EXPANSION
|
#ifdef HB_NO_BORING_EXPANSION
|
||||||
#define HB_NO_BEYOND_64K
|
#define HB_NO_BEYOND_64K
|
||||||
#define HB_NO_VARIATIONS2
|
#define HB_NO_AVAR2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HB_DISABLE_DEPRECATED
|
#ifdef HB_DISABLE_DEPRECATED
|
||||||
|
|
30
src/hb-ft.cc
30
src/hb-ft.cc
|
@ -732,16 +732,18 @@ hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED,
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_hb_ft_move_to (const FT_Vector *to,
|
_hb_ft_move_to (const FT_Vector *to,
|
||||||
hb_draw_session_t *drawing)
|
void *arg)
|
||||||
{
|
{
|
||||||
|
hb_draw_session_t *drawing = (hb_draw_session_t *) arg;
|
||||||
drawing->move_to (to->x, to->y);
|
drawing->move_to (to->x, to->y);
|
||||||
return FT_Err_Ok;
|
return FT_Err_Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_hb_ft_line_to (const FT_Vector *to,
|
_hb_ft_line_to (const FT_Vector *to,
|
||||||
hb_draw_session_t *drawing)
|
void *arg)
|
||||||
{
|
{
|
||||||
|
hb_draw_session_t *drawing = (hb_draw_session_t *) arg;
|
||||||
drawing->line_to (to->x, to->y);
|
drawing->line_to (to->x, to->y);
|
||||||
return FT_Err_Ok;
|
return FT_Err_Ok;
|
||||||
}
|
}
|
||||||
|
@ -749,8 +751,9 @@ _hb_ft_line_to (const FT_Vector *to,
|
||||||
static int
|
static int
|
||||||
_hb_ft_conic_to (const FT_Vector *control,
|
_hb_ft_conic_to (const FT_Vector *control,
|
||||||
const FT_Vector *to,
|
const FT_Vector *to,
|
||||||
hb_draw_session_t *drawing)
|
void *arg)
|
||||||
{
|
{
|
||||||
|
hb_draw_session_t *drawing = (hb_draw_session_t *) arg;
|
||||||
drawing->quadratic_to (control->x, control->y,
|
drawing->quadratic_to (control->x, control->y,
|
||||||
to->x, to->y);
|
to->x, to->y);
|
||||||
return FT_Err_Ok;
|
return FT_Err_Ok;
|
||||||
|
@ -760,8 +763,9 @@ static int
|
||||||
_hb_ft_cubic_to (const FT_Vector *control1,
|
_hb_ft_cubic_to (const FT_Vector *control1,
|
||||||
const FT_Vector *control2,
|
const FT_Vector *control2,
|
||||||
const FT_Vector *to,
|
const FT_Vector *to,
|
||||||
hb_draw_session_t *drawing)
|
void *arg)
|
||||||
{
|
{
|
||||||
|
hb_draw_session_t *drawing = (hb_draw_session_t *) arg;
|
||||||
drawing->cubic_to (control1->x, control1->y,
|
drawing->cubic_to (control1->x, control1->y,
|
||||||
control2->x, control2->y,
|
control2->x, control2->y,
|
||||||
to->x, to->y);
|
to->x, to->y);
|
||||||
|
@ -787,10 +791,10 @@ hb_ft_get_glyph_shape (hb_font_t *font HB_UNUSED,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const FT_Outline_Funcs outline_funcs = {
|
const FT_Outline_Funcs outline_funcs = {
|
||||||
(FT_Outline_MoveToFunc) _hb_ft_move_to,
|
_hb_ft_move_to,
|
||||||
(FT_Outline_LineToFunc) _hb_ft_line_to,
|
_hb_ft_line_to,
|
||||||
(FT_Outline_ConicToFunc) _hb_ft_conic_to,
|
_hb_ft_conic_to,
|
||||||
(FT_Outline_CubicToFunc) _hb_ft_cubic_to,
|
_hb_ft_cubic_to,
|
||||||
0, /* shift */
|
0, /* shift */
|
||||||
0, /* delta */
|
0, /* delta */
|
||||||
};
|
};
|
||||||
|
@ -975,8 +979,9 @@ hb_ft_face_create_referenced (FT_Face ft_face)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
hb_ft_face_finalize (FT_Face ft_face)
|
hb_ft_face_finalize (void *arg)
|
||||||
{
|
{
|
||||||
|
FT_Face ft_face = (FT_Face) arg;
|
||||||
hb_face_destroy ((hb_face_t *) ft_face->generic.data);
|
hb_face_destroy ((hb_face_t *) ft_face->generic.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1008,7 +1013,7 @@ hb_ft_face_create_cached (FT_Face ft_face)
|
||||||
ft_face->generic.finalizer (ft_face);
|
ft_face->generic.finalizer (ft_face);
|
||||||
|
|
||||||
ft_face->generic.data = hb_ft_face_create (ft_face, nullptr);
|
ft_face->generic.data = hb_ft_face_create (ft_face, nullptr);
|
||||||
ft_face->generic.finalizer = (FT_Generic_Finalizer) hb_ft_face_finalize;
|
ft_face->generic.finalizer = hb_ft_face_finalize;
|
||||||
}
|
}
|
||||||
|
|
||||||
return hb_face_reference ((hb_face_t *) ft_face->generic.data);
|
return hb_face_reference ((hb_face_t *) ft_face->generic.data);
|
||||||
|
@ -1217,8 +1222,9 @@ get_ft_library ()
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_release_blob (FT_Face ft_face)
|
_release_blob (void *arg)
|
||||||
{
|
{
|
||||||
|
FT_Face ft_face = (FT_Face) arg;
|
||||||
hb_blob_destroy ((hb_blob_t *) ft_face->generic.data);
|
hb_blob_destroy ((hb_blob_t *) ft_face->generic.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1271,7 +1277,7 @@ hb_ft_font_set_funcs (hb_font_t *font)
|
||||||
|
|
||||||
|
|
||||||
ft_face->generic.data = blob;
|
ft_face->generic.data = blob;
|
||||||
ft_face->generic.finalizer = (FT_Generic_Finalizer) _release_blob;
|
ft_face->generic.finalizer = _release_blob;
|
||||||
|
|
||||||
_hb_ft_font_set_funcs (font, ft_face, true);
|
_hb_ft_font_set_funcs (font, ft_face, true);
|
||||||
hb_ft_font_set_load_flags (font, FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING);
|
hb_ft_font_set_load_flags (font, FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING);
|
||||||
|
|
|
@ -221,7 +221,7 @@ struct hb_hashmap_t
|
||||||
unsigned int i = bucket_for (key);
|
unsigned int i = bucket_for (key);
|
||||||
if (items[i].is_real () && items[i] == key)
|
if (items[i].is_real () && items[i] == key)
|
||||||
{
|
{
|
||||||
if (vp) *vp = &items[i].value;
|
if (vp) *vp = std::addressof (items[i].value);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -82,7 +82,7 @@ hb_ot_name_convert_utf (hb_bytes_t bytes,
|
||||||
|
|
||||||
if (text_size && *text_size)
|
if (text_size && *text_size)
|
||||||
{
|
{
|
||||||
(*text_size)--; /* Same room for NUL-termination. */
|
(*text_size)--; /* Save room for NUL-termination. */
|
||||||
const typename out_utf_t::codepoint_t *dst_end = text + *text_size;
|
const typename out_utf_t::codepoint_t *dst_end = text + *text_size;
|
||||||
|
|
||||||
while (src < src_end && dst < dst_end)
|
while (src < src_end && dst < dst_end)
|
||||||
|
|
|
@ -212,17 +212,6 @@ struct OS2
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
OS2 *os2_prime = c->serializer->embed (this);
|
OS2 *os2_prime = c->serializer->embed (this);
|
||||||
if (unlikely (!os2_prime)) return_trace (false);
|
if (unlikely (!os2_prime)) return_trace (false);
|
||||||
if (c->plan->flags & HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES)
|
|
||||||
return_trace (true);
|
|
||||||
|
|
||||||
/* when --gids option is not used, no need to do collect_mapping that is
|
|
||||||
* iterating all codepoints in each subtable, which is not efficient */
|
|
||||||
uint16_t min_cp, max_cp;
|
|
||||||
find_min_and_max_codepoint (c->plan->unicodes, &min_cp, &max_cp);
|
|
||||||
os2_prime->usFirstCharIndex = min_cp;
|
|
||||||
os2_prime->usLastCharIndex = max_cp;
|
|
||||||
|
|
||||||
_update_unicode_ranges (c->plan->unicodes, os2_prime->ulUnicodeRange);
|
|
||||||
|
|
||||||
if (c->plan->user_axes_location->has (HB_TAG ('w','g','h','t')) &&
|
if (c->plan->user_axes_location->has (HB_TAG ('w','g','h','t')) &&
|
||||||
!c->plan->pinned_at_default)
|
!c->plan->pinned_at_default)
|
||||||
|
@ -244,6 +233,18 @@ struct OS2
|
||||||
return_trace (false);
|
return_trace (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (c->plan->flags & HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES)
|
||||||
|
return_trace (true);
|
||||||
|
|
||||||
|
/* when --gids option is not used, no need to do collect_mapping that is
|
||||||
|
* iterating all codepoints in each subtable, which is not efficient */
|
||||||
|
uint16_t min_cp, max_cp;
|
||||||
|
find_min_and_max_codepoint (c->plan->unicodes, &min_cp, &max_cp);
|
||||||
|
os2_prime->usFirstCharIndex = min_cp;
|
||||||
|
os2_prime->usLastCharIndex = max_cp;
|
||||||
|
|
||||||
|
_update_unicode_ranges (c->plan->unicodes, os2_prime->ulUnicodeRange);
|
||||||
|
|
||||||
return_trace (true);
|
return_trace (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -742,14 +742,40 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
|
||||||
|
|
||||||
/* Sit tight, rock 'n roll! */
|
/* Sit tight, rock 'n roll! */
|
||||||
hb_stable_sort (info + start, end - start, compare_indic_order);
|
hb_stable_sort (info + start, end - start, compare_indic_order);
|
||||||
/* Find base again */
|
|
||||||
|
/* Find base again; also flip left-matra sequence. */
|
||||||
|
unsigned first_left_matra = end;
|
||||||
|
unsigned last_left_matra = end;
|
||||||
base = end;
|
base = end;
|
||||||
for (unsigned int i = start; i < end; i++)
|
for (unsigned int i = start; i < end; i++)
|
||||||
|
{
|
||||||
if (info[i].indic_position() == POS_BASE_C)
|
if (info[i].indic_position() == POS_BASE_C)
|
||||||
{
|
{
|
||||||
base = i;
|
base = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
else if (info[i].indic_position() == POS_PRE_M)
|
||||||
|
{
|
||||||
|
if (first_left_matra == end)
|
||||||
|
first_left_matra = i;
|
||||||
|
last_left_matra = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* https://github.com/harfbuzz/harfbuzz/issues/3863 */
|
||||||
|
if (first_left_matra < last_left_matra)
|
||||||
|
{
|
||||||
|
/* No need to merge clusters, handled later. */
|
||||||
|
buffer->reverse_range (first_left_matra, last_left_matra + 1);
|
||||||
|
/* Reverse back nuktas, etc. */
|
||||||
|
unsigned i = first_left_matra;
|
||||||
|
for (unsigned j = i; j <= last_left_matra; j++)
|
||||||
|
if (info[j].indic_category() == I_Cat(M))
|
||||||
|
{
|
||||||
|
buffer->reverse_range (i, j + 1);
|
||||||
|
i = j + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Things are out-of-control for post base positions, they may shuffle
|
/* Things are out-of-control for post base positions, they may shuffle
|
||||||
* around like crazy. In old-spec mode, we move halants around, so in
|
* around like crazy. In old-spec mode, we move halants around, so in
|
||||||
* that case merge all clusters after base. Otherwise, check the sort
|
* that case merge all clusters after base. Otherwise, check the sort
|
||||||
|
|
|
@ -270,6 +270,33 @@ initial_reordering_consonant_syllable (hb_buffer_t *buffer,
|
||||||
|
|
||||||
/* Sit tight, rock 'n roll! */
|
/* Sit tight, rock 'n roll! */
|
||||||
buffer->sort (start, end, compare_myanmar_order);
|
buffer->sort (start, end, compare_myanmar_order);
|
||||||
|
|
||||||
|
/* Flip left-matra sequence. */
|
||||||
|
unsigned first_left_matra = end;
|
||||||
|
unsigned last_left_matra = end;
|
||||||
|
for (unsigned int i = start; i < end; i++)
|
||||||
|
{
|
||||||
|
if (info[i].myanmar_position() == POS_PRE_M)
|
||||||
|
{
|
||||||
|
if (first_left_matra == end)
|
||||||
|
first_left_matra = i;
|
||||||
|
last_left_matra = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* https://github.com/harfbuzz/harfbuzz/issues/3863 */
|
||||||
|
if (first_left_matra < last_left_matra)
|
||||||
|
{
|
||||||
|
/* No need to merge clusters, done already? */
|
||||||
|
buffer->reverse_range (first_left_matra, last_left_matra + 1);
|
||||||
|
/* Reverse back VS, etc. */
|
||||||
|
unsigned i = first_left_matra;
|
||||||
|
for (unsigned j = i; j <= last_left_matra; j++)
|
||||||
|
if (info[j].myanmar_category() == M_Cat(VPre))
|
||||||
|
{
|
||||||
|
buffer->reverse_range (i, j + 1);
|
||||||
|
i = j + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -143,7 +143,7 @@ struct avar
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
if (!(version.sanitize (c) &&
|
if (!(version.sanitize (c) &&
|
||||||
(version.major == 1
|
(version.major == 1
|
||||||
#ifndef HB_NO_VARIATIONS2
|
#ifndef HB_NO_AVAR2
|
||||||
|| version.major == 2
|
|| version.major == 2
|
||||||
#endif
|
#endif
|
||||||
) &&
|
) &&
|
||||||
|
@ -159,7 +159,7 @@ struct avar
|
||||||
map = &StructAfter<SegmentMaps> (*map);
|
map = &StructAfter<SegmentMaps> (*map);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef HB_NO_VARIATIONS2
|
#ifndef HB_NO_AVAR2
|
||||||
if (version.major < 2)
|
if (version.major < 2)
|
||||||
return_trace (true);
|
return_trace (true);
|
||||||
|
|
||||||
|
@ -182,7 +182,7 @@ struct avar
|
||||||
map = &StructAfter<SegmentMaps> (*map);
|
map = &StructAfter<SegmentMaps> (*map);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef HB_NO_VARIATIONS2
|
#ifndef HB_NO_AVAR2
|
||||||
if (version.major < 2)
|
if (version.major < 2)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -126,6 +126,7 @@
|
||||||
/* Ignored intentionally. */
|
/* Ignored intentionally. */
|
||||||
#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED
|
#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED
|
||||||
#pragma GCC diagnostic ignored "-Wclass-memaccess"
|
#pragma GCC diagnostic ignored "-Wclass-memaccess"
|
||||||
|
#pragma GCC diagnostic ignored "-Wcast-function-type-strict" // https://github.com/harfbuzz/harfbuzz/pull/3859#issuecomment-1295409126
|
||||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||||
#pragma GCC diagnostic ignored "-Wformat-zero-length"
|
#pragma GCC diagnostic ignored "-Wformat-zero-length"
|
||||||
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
|
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
|
||||||
|
|
|
@ -240,5 +240,15 @@ main (int argc, char **argv)
|
||||||
m1->set (2,4);
|
m1->set (2,4);
|
||||||
assert (!m.has (p2));
|
assert (!m.has (p2));
|
||||||
}
|
}
|
||||||
|
/* Test value type with hb_bytes_t. */
|
||||||
|
{
|
||||||
|
hb_hashmap_t<int, hb_bytes_t> m;
|
||||||
|
char c_str[] = "Test";
|
||||||
|
hb_bytes_t bytes (c_str, 4);
|
||||||
|
|
||||||
|
m.set (1, bytes);
|
||||||
|
assert (m.has (1));
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -2,3 +2,5 @@
|
||||||
../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf;;U+0CB0,U+200D,U+0CCD,U+0C95;[gid2=0+1334|gid6=0+358]
|
../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf;;U+0CB0,U+200D,U+0CCD,U+0C95;[gid2=0+1334|gid6=0+358]
|
||||||
../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf;;U+0CB0,U+0CCD,U+200D,U+0C95;[gid2=0+1334|gid6=0+358]
|
../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf;;U+0CB0,U+0CCD,U+200D,U+0C95;[gid2=0+1334|gid6=0+358]
|
||||||
../fonts/e716f6bd00a108d186b7e9f47b4515565f784f36.ttf;;U+0C1A,U+0C3F,U+0C32,U+0C4D,U+0C15,U+0C42,U+0C30,U+0C4D;[civoweltelu=0+766|latelu=2+709|uuvowelsigntelu=2+661|kasubscripttelu=2+483|rahalanttelu=6+593]
|
../fonts/e716f6bd00a108d186b7e9f47b4515565f784f36.ttf;;U+0C1A,U+0C3F,U+0C32,U+0C4D,U+0C15,U+0C42,U+0C30,U+0C4D;[civoweltelu=0+766|latelu=2+709|uuvowelsigntelu=2+661|kasubscripttelu=2+483|rahalanttelu=6+593]
|
||||||
|
../fonts/9d8c53cb64b8747abdd2b70755cce2ee0eb42ef7.ttf;;U+0915,U+093F,U+094E,U+093C;[uni094E=0+273|uni093C=0+0|ivowelsign03deva=0+259|uni0915=0+762]
|
||||||
|
../fonts/9d8c53cb64b8747abdd2b70755cce2ee0eb42ef7.ttf;;U+0915,U+093F,U+093C,U+094E;[uni094E=0+273|ivowelsign00deva=0+259|uni093C=0+0|uni0915=0+762]
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
../fonts/065b01e54f35f0d849fd43bd5b936212739a50cb.ttf;;U+101A,U+1035;[ya_e_above=0+1000]
|
../fonts/065b01e54f35f0d849fd43bd5b936212739a50cb.ttf;;U+101A,U+1035;[ya_e_above=0+1000]
|
||||||
|
../fonts/a232bb734d4c6c898a44506547d19768f0eba6a6.ttf;;U+1000,U+1031,U+1084;[e_shn=0+592|_e=0+618|ka=0+1124]
|
||||||
|
|
|
@ -7,6 +7,7 @@ SUBDIRS = repack_tests
|
||||||
|
|
||||||
EXTRA_DIST += \
|
EXTRA_DIST += \
|
||||||
$(TESTS) \
|
$(TESTS) \
|
||||||
|
$(DISABLED_TESTS) \
|
||||||
expected/32bit_var_store \
|
expected/32bit_var_store \
|
||||||
expected/basics \
|
expected/basics \
|
||||||
expected/full-font \
|
expected/full-font \
|
||||||
|
@ -55,6 +56,10 @@ EXTRA_DIST += \
|
||||||
expected/math \
|
expected/math \
|
||||||
expected/math_coverage_offset \
|
expected/math_coverage_offset \
|
||||||
expected/post \
|
expected/post \
|
||||||
|
expected/full_instance \
|
||||||
|
expected/instance_feature_variations \
|
||||||
|
expected/instantiate_glyf \
|
||||||
|
expected/pin_all_at_default \
|
||||||
fonts \
|
fonts \
|
||||||
profiles \
|
profiles \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
|
@ -57,5 +57,10 @@ TESTS = \
|
||||||
XFAIL_TESTS = \
|
XFAIL_TESTS = \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
|
# Disabled because instancing is only available w/ experimental API on.
|
||||||
DISABLED_TESTS = \
|
DISABLED_TESTS = \
|
||||||
|
tests/full_instance.tests \
|
||||||
|
tests/instance_feature_variations.tests \
|
||||||
|
tests/instantiate_glyf.tests \
|
||||||
|
tests/pin_all_at_default.tests \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -3,6 +3,7 @@ Roboto-Variable.ttf
|
||||||
|
|
||||||
PROFILES:
|
PROFILES:
|
||||||
default.txt
|
default.txt
|
||||||
|
no-prune-unicode-ranges.txt
|
||||||
|
|
||||||
SUBSETS:
|
SUBSETS:
|
||||||
*
|
*
|
||||||
|
|
|
@ -40,8 +40,8 @@ tests = [
|
||||||
'colr_glyphs',
|
'colr_glyphs',
|
||||||
'math',
|
'math',
|
||||||
'math_coverage_offset',
|
'math_coverage_offset',
|
||||||
# TODO: re-enable once colrv1 subsetting is stabilized.
|
# TODO: re-enable once colrv1 subsetting is stabilized.
|
||||||
# 'colrv1.notoemoji',
|
# 'colrv1.notoemoji',
|
||||||
'colrv1',
|
'colrv1',
|
||||||
'colr_with_components',
|
'colr_with_components',
|
||||||
'cbdt',
|
'cbdt',
|
||||||
|
@ -49,13 +49,18 @@ tests = [
|
||||||
'glyph_names',
|
'glyph_names',
|
||||||
'post',
|
'post',
|
||||||
'32bit_var_store',
|
'32bit_var_store',
|
||||||
# instacing tests, enable when --instance is not experimental
|
|
||||||
# 'pin_all_at_default',
|
|
||||||
# 'instantiate_glyf',
|
|
||||||
# 'full_instance',
|
|
||||||
# 'instance_feature_variations',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if get_option('experimental_api')
|
||||||
|
# instacing tests, only supported in experimental api
|
||||||
|
tests += [
|
||||||
|
'pin_all_at_default',
|
||||||
|
'instantiate_glyf',
|
||||||
|
'full_instance',
|
||||||
|
'instance_feature_variations',
|
||||||
|
]
|
||||||
|
endif
|
||||||
|
|
||||||
repack_tests = [
|
repack_tests = [
|
||||||
'basic',
|
'basic',
|
||||||
'prioritization',
|
'prioritization',
|
||||||
|
|
|
@ -71,7 +71,17 @@ helper_cairo_use_hb_draw (const font_options_t *font_opts)
|
||||||
{
|
{
|
||||||
const char *env = getenv ("HB_DRAW");
|
const char *env = getenv ("HB_DRAW");
|
||||||
if (!env)
|
if (!env)
|
||||||
|
#if 1
|
||||||
|
/* Following branch disabled because we prefer our
|
||||||
|
* OpenType extensions working, ie going through hb-draw,
|
||||||
|
* over avoiding the obscure cairo bug. */
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
/* Older cairo had a bug in rendering COLRv0 fonts in
|
||||||
|
* right-to-left direction. */
|
||||||
return cairo_version () >= CAIRO_VERSION_ENCODE (1, 17, 5);
|
return cairo_version () >= CAIRO_VERSION_ENCODE (1, 17, 5);
|
||||||
|
#endif
|
||||||
|
|
||||||
return atoi (env);
|
return atoi (env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue