summaryrefslogtreecommitdiff
path: root/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.hh
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.hh')
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.hh215
1 files changed, 119 insertions, 96 deletions
diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.hh
index 3a887d3d0ca..31d9d879dcc 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.hh
@@ -161,21 +161,8 @@ struct CFF1SuppEncData {
DEFINE_SIZE_ARRAY_SIZED (1, supps);
};
-struct Encoding {
- bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
-
- if (unlikely (!c->check_struct (this)))
- return_trace (false);
- unsigned int fmt = format & 0x7F;
- if (unlikely (fmt > 1))
- return_trace (false);
- if (unlikely (!((fmt == 0)? u.format0.sanitize (c): u.format1.sanitize (c))))
- return_trace (false);
- return_trace (((format & 0x80) == 0) || suppEncData ().sanitize (c));
- }
-
+struct Encoding
+{
/* serialize a fullset Encoding */
bool serialize (hb_serialize_context_t *c, const Encoding &src)
{
@@ -197,11 +184,12 @@ struct Encoding {
TRACE_SERIALIZE (this);
Encoding *dest = c->extend_min (*this);
if (unlikely (dest == nullptr)) return_trace (false);
- dest->format = format | ((supp_codes.length > 0)? 0x80: 0);
- if (format == 0)
+ dest->format = format | ((supp_codes.length > 0) ? 0x80 : 0);
+ switch (format) {
+ case 0:
{
Encoding0 *fmt0 = c->allocate_size<Encoding0> (Encoding0::min_size + HBUINT8::static_size * enc_count);
- if (unlikely (fmt0 == nullptr)) return_trace (false);
+ if (unlikely (fmt0 == nullptr)) return_trace (false);
fmt0->nCodes () = enc_count;
unsigned int glyph = 0;
for (unsigned int i = 0; i < code_ranges.length; i++)
@@ -213,7 +201,9 @@ struct Encoding {
return_trace (false);
}
}
- else
+ break;
+
+ case 1:
{
Encoding1 *fmt1 = c->allocate_size<Encoding1> (Encoding1::min_size + Encoding1_Range::static_size * code_ranges.length);
if (unlikely (fmt1 == nullptr)) return_trace (false);
@@ -226,7 +216,11 @@ struct Encoding {
fmt1->ranges[i].nLeft = code_ranges[i].glyph;
}
}
- if (supp_codes.length > 0)
+ break;
+
+ }
+
+ if (supp_codes.length)
{
CFF1SuppEncData *suppData = c->allocate_size<CFF1SuppEncData> (CFF1SuppEncData::min_size + SuppEncoding::static_size * supp_codes.length);
if (unlikely (suppData == nullptr)) return_trace (false);
@@ -237,6 +231,7 @@ struct Encoding {
suppData->supps[i].glyph = supp_codes[i].glyph; /* actually SID */
}
}
+
return_trace (true);
}
@@ -245,11 +240,13 @@ struct Encoding {
unsigned int enc_count,
unsigned int supp_count)
{
- unsigned int size = min_size;
- if (format == 0)
- size += Encoding0::min_size + HBUINT8::static_size * enc_count;
- else
- size += Encoding1::min_size + Encoding1_Range::static_size * enc_count;
+ unsigned int size = min_size;
+ switch (format)
+ {
+ case 0: size += Encoding0::min_size + HBUINT8::static_size * enc_count; break;
+ case 1: size += Encoding1::min_size + Encoding1_Range::static_size * enc_count; break;
+ default:return 0;
+ }
if (supp_count > 0)
size += CFF1SuppEncData::min_size + SuppEncoding::static_size * supp_count;
return size;
@@ -258,10 +255,11 @@ struct Encoding {
unsigned int get_size () const
{
unsigned int size = min_size;
- if (table_format () == 0)
- size += u.format0.get_size ();
- else
- size += u.format1.get_size ();
+ switch (table_format ())
+ {
+ case 0: size += u.format0.get_size (); break;
+ case 1: size += u.format1.get_size (); break;
+ }
if (has_supplement ())
size += suppEncData ().get_size ();
return size;
@@ -269,14 +267,16 @@ struct Encoding {
hb_codepoint_t get_code (hb_codepoint_t glyph) const
{
- if (table_format () == 0)
- return u.format0.get_code (glyph);
- else
- return u.format1.get_code (glyph);
+ switch (table_format ())
+ {
+ case 0: return u.format0.get_code (glyph);
+ case 1: return u.format1.get_code (glyph);
+ default:return 0;
+ }
}
- uint8_t table_format () const { return (format & 0x7F); }
- bool has_supplement () const { return (format & 0x80) != 0; }
+ uint8_t table_format () const { return format & 0x7F; }
+ bool has_supplement () const { return format & 0x80; }
void get_supplement_codes (hb_codepoint_t sid, hb_vector_t<hb_codepoint_t> &codes) const
{
@@ -285,21 +285,37 @@ struct Encoding {
suppEncData().get_codes (sid, codes);
}
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this)))
+ return_trace (false);
+
+ switch (table_format ())
+ {
+ case 0: if (unlikely (!u.format0.sanitize (c))) { return_trace (false); } break;
+ case 1: if (unlikely (!u.format1.sanitize (c))) { return_trace (false); } break;
+ default:return_trace (false);
+ }
+ return_trace (likely (!has_supplement () || suppEncData ().sanitize (c)));
+ }
+
protected:
const CFF1SuppEncData &suppEncData () const
{
- if ((format & 0x7F) == 0)
- return StructAfter<CFF1SuppEncData> (u.format0.codes[u.format0.nCodes ()-1]);
- else
- return StructAfter<CFF1SuppEncData> (u.format1.ranges[u.format1.nRanges ()-1]);
+ switch (table_format ())
+ {
+ case 0: return StructAfter<CFF1SuppEncData> (u.format0.codes[u.format0.nCodes ()-1]);
+ case 1: return StructAfter<CFF1SuppEncData> (u.format1.ranges[u.format1.nRanges ()-1]);
+ default:return Null (CFF1SuppEncData);
+ }
}
public:
- HBUINT8 format;
-
+ HBUINT8 format;
union {
- Encoding0 format0;
- Encoding1 format1;
+ Encoding0 format0;
+ Encoding1 format1;
} u;
/* CFF1SuppEncData suppEncData; */
@@ -433,23 +449,8 @@ typedef Charset1_2<HBUINT16> Charset2;
typedef Charset_Range<HBUINT8> Charset1_Range;
typedef Charset_Range<HBUINT16> Charset2_Range;
-struct Charset {
- bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
-
- if (unlikely (!c->check_struct (this)))
- return_trace (false);
- if (format == 0)
- return_trace (u.format0.sanitize (c, c->get_num_glyphs ()));
- else if (format == 1)
- return_trace (u.format1.sanitize (c, c->get_num_glyphs ()));
- else if (likely (format == 2))
- return_trace (u.format2.sanitize (c, c->get_num_glyphs ()));
- else
- return_trace (false);
- }
-
+struct Charset
+{
/* serialize a fullset Charset */
bool serialize (hb_serialize_context_t *c, const Charset &src, unsigned int num_glyphs)
{
@@ -471,10 +472,12 @@ struct Charset {
Charset *dest = c->extend_min (*this);
if (unlikely (dest == nullptr)) return_trace (false);
dest->format = format;
- if (format == 0)
+ switch (format)
+ {
+ case 0:
{
Charset0 *fmt0 = c->allocate_size<Charset0> (Charset0::min_size + HBUINT16::static_size * (num_glyphs - 1));
- if (unlikely (fmt0 == nullptr)) return_trace (false);
+ if (unlikely (fmt0 == nullptr)) return_trace (false);
unsigned int glyph = 0;
for (unsigned int i = 0; i < sid_ranges.length; i++)
{
@@ -483,7 +486,9 @@ struct Charset {
fmt0->sids[glyph++] = sid++;
}
}
- else if (format == 1)
+ break;
+
+ case 1:
{
Charset1 *fmt1 = c->allocate_size<Charset1> (Charset1::min_size + Charset1_Range::static_size * sid_ranges.length);
if (unlikely (fmt1 == nullptr)) return_trace (false);
@@ -495,7 +500,9 @@ struct Charset {
fmt1->ranges[i].nLeft = sid_ranges[i].glyph;
}
}
- else /* format 2 */
+ break;
+
+ case 2:
{
Charset2 *fmt2 = c->allocate_size<Charset2> (Charset2::min_size + Charset2_Range::static_size * sid_ranges.length);
if (unlikely (fmt2 == nullptr)) return_trace (false);
@@ -507,55 +514,71 @@ struct Charset {
fmt2->ranges[i].nLeft = sid_ranges[i].glyph;
}
}
+ break;
+
+ }
return_trace (true);
}
/* parallel to above: calculate the size of a subset Charset */
- static unsigned int calculate_serialized_size (
- uint8_t format,
- unsigned int count)
+ static unsigned int calculate_serialized_size (uint8_t format,
+ unsigned int count)
{
- unsigned int size = min_size;
- if (format == 0)
- size += Charset0::min_size + HBUINT16::static_size * (count - 1);
- else if (format == 1)
- size += Charset1::min_size + Charset1_Range::static_size * count;
- else
- size += Charset2::min_size + Charset2_Range::static_size * count;
-
- return size;
+ switch (format)
+ {
+ case 0: return min_size + Charset0::min_size + HBUINT16::static_size * (count - 1);
+ case 1: return min_size + Charset1::min_size + Charset1_Range::static_size * count;
+ case 2: return min_size + Charset2::min_size + Charset2_Range::static_size * count;
+ default:return 0;
+ }
}
unsigned int get_size (unsigned int num_glyphs) const
{
- unsigned int size = min_size;
- if (format == 0)
- size += u.format0.get_size (num_glyphs);
- else if (format == 1)
- size += u.format1.get_size (num_glyphs);
- else
- size += u.format2.get_size (num_glyphs);
- return size;
+ switch (format)
+ {
+ case 0: return min_size + u.format0.get_size (num_glyphs);
+ case 1: return min_size + u.format1.get_size (num_glyphs);
+ case 2: return min_size + u.format2.get_size (num_glyphs);
+ default:return 0;
+ }
}
hb_codepoint_t get_sid (hb_codepoint_t glyph) const
{
- if (format == 0)
- return u.format0.get_sid (glyph);
- else if (format == 1)
- return u.format1.get_sid (glyph);
- else
- return u.format2.get_sid (glyph);
+ switch (format)
+ {
+ case 0: return u.format0.get_sid (glyph);
+ case 1: return u.format1.get_sid (glyph);
+ case 2: return u.format2.get_sid (glyph);
+ default:return 0;
+ }
}
hb_codepoint_t get_glyph (hb_codepoint_t sid, unsigned int num_glyphs) const
{
- if (format == 0)
- return u.format0.get_glyph (sid, num_glyphs);
- else if (format == 1)
- return u.format1.get_glyph (sid, num_glyphs);
- else
- return u.format2.get_glyph (sid, num_glyphs);
+ switch (format)
+ {
+ case 0: return u.format0.get_glyph (sid, num_glyphs);
+ case 1: return u.format1.get_glyph (sid, num_glyphs);
+ case 2: return u.format2.get_glyph (sid, num_glyphs);
+ default:return 0;
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this)))
+ return_trace (false);
+
+ switch (format)
+ {
+ case 0: return_trace (u.format0.sanitize (c, c->get_num_glyphs ()));
+ case 1: return_trace (u.format1.sanitize (c, c->get_num_glyphs ()));
+ case 2: return_trace (u.format2.sanitize (c, c->get_num_glyphs ()));
+ default:return_trace (false);
+ }
}
HBUINT8 format;