[svg] Collapse SVGDocumentIndex into SVG
This commit is contained in:
parent
4ceabb8c21
commit
5cb1ce8681
|
@ -50,7 +50,7 @@ struct SVGDocumentIndexEntry
|
||||||
return b->cmp (*a);
|
return b->cmp (*a);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline hb_blob_t* create_blob (hb_blob_t *svg_blob, unsigned int index_offset) const
|
inline hb_blob_t* reference_blob (hb_blob_t *svg_blob, unsigned int index_offset) const
|
||||||
{
|
{
|
||||||
if (svgDocLength == 0) return hb_blob_get_empty ();
|
if (svgDocLength == 0) return hb_blob_get_empty ();
|
||||||
return hb_blob_create_sub_blob (svg_blob, (unsigned int) svgDoc + index_offset,
|
return hb_blob_create_sub_blob (svg_blob, (unsigned int) svgDoc + index_offset,
|
||||||
|
@ -77,35 +77,6 @@ struct SVGDocumentIndexEntry
|
||||||
DEFINE_SIZE_STATIC (12);
|
DEFINE_SIZE_STATIC (12);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SVGDocumentIndex
|
|
||||||
{
|
|
||||||
friend struct SVG;
|
|
||||||
|
|
||||||
inline const SVGDocumentIndexEntry &get_glyph_entry (hb_codepoint_t glyph_id) const
|
|
||||||
{
|
|
||||||
const SVGDocumentIndexEntry *rec;
|
|
||||||
rec = (SVGDocumentIndexEntry *) bsearch (&glyph_id,
|
|
||||||
&entries.arrayZ,
|
|
||||||
entries.len,
|
|
||||||
sizeof (SVGDocumentIndexEntry),
|
|
||||||
SVGDocumentIndexEntry::cmp);
|
|
||||||
return likely (rec) ? *rec : Null(SVGDocumentIndexEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
|
||||||
{
|
|
||||||
TRACE_SANITIZE (this);
|
|
||||||
return_trace (c->check_struct (this) &&
|
|
||||||
entries.sanitize_shallow (c));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
ArrayOf<SVGDocumentIndexEntry>
|
|
||||||
entries; /* Array of SVG Document Index Entries. */
|
|
||||||
public:
|
|
||||||
DEFINE_SIZE_ARRAY (2, entries);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SVG
|
struct SVG
|
||||||
{
|
{
|
||||||
static const hb_tag_t tableTag = HB_OT_TAG_SVG;
|
static const hb_tag_t tableTag = HB_OT_TAG_SVG;
|
||||||
|
@ -124,12 +95,11 @@ struct SVG
|
||||||
hb_blob_destroy (svg_blob);
|
hb_blob_destroy (svg_blob);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline hb_blob_t* create_blob_for_glyph (hb_codepoint_t glyph_id) const
|
inline hb_blob_t* reference_blob_for_glyph (hb_codepoint_t glyph_id) const
|
||||||
{
|
{
|
||||||
if (unlikely (svg_len == 0))
|
if (unlikely (svg_len == 0))
|
||||||
return hb_blob_get_empty ();
|
return hb_blob_get_empty ();
|
||||||
return (svg+svg->svgDocIndex).get_glyph_entry (glyph_id).create_blob (svg_blob,
|
return svg->get_glyph_entry (glyph_id).reference_blob (svg_blob, svg->svgDocEntries);
|
||||||
svg->svgDocIndex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool has_data () const
|
inline bool has_data () const
|
||||||
|
@ -142,18 +112,30 @@ struct SVG
|
||||||
unsigned int svg_len;
|
unsigned int svg_len;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline const SVGDocumentIndexEntry &get_glyph_entry (hb_codepoint_t glyph_id) const
|
||||||
|
{
|
||||||
|
const SVGDocumentIndexEntry *rec;
|
||||||
|
rec = (SVGDocumentIndexEntry *) bsearch (&glyph_id,
|
||||||
|
&(this+svgDocEntries).arrayZ,
|
||||||
|
(this+svgDocEntries).len,
|
||||||
|
sizeof (SVGDocumentIndexEntry),
|
||||||
|
SVGDocumentIndexEntry::cmp);
|
||||||
|
return likely (rec) ? *rec : Null(SVGDocumentIndexEntry);
|
||||||
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
return_trace (likely (c->check_struct (this) &&
|
return_trace (likely (c->check_struct (this) &&
|
||||||
(this+svgDocIndex).sanitize (c)));
|
(this+svgDocEntries).sanitize_shallow (c)));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
HBUINT16 version; /* Table version (starting at 0). */
|
HBUINT16 version; /* Table version (starting at 0). */
|
||||||
LOffsetTo<SVGDocumentIndex>
|
LOffsetTo<ArrayOf<SVGDocumentIndexEntry> >
|
||||||
svgDocIndex; /* Offset (relative to the start of the SVG table) to the
|
svgDocEntries; /* Offset (relative to the start of the SVG table) to the
|
||||||
* SVG Documents Index. Must be non-zero. */
|
* SVG Documents Index. Must be non-zero. */
|
||||||
|
/* Array of SVG Document Index Entries. */
|
||||||
HBUINT32 reserved; /* Set to 0. */
|
HBUINT32 reserved; /* Set to 0. */
|
||||||
public:
|
public:
|
||||||
DEFINE_SIZE_STATIC (10);
|
DEFINE_SIZE_STATIC (10);
|
||||||
|
|
|
@ -270,5 +270,5 @@ hb_ot_color_has_svg (hb_face_t *face)
|
||||||
hb_blob_t *
|
hb_blob_t *
|
||||||
hb_ot_color_glyph_svg_create_blob (hb_face_t *face, hb_codepoint_t glyph)
|
hb_ot_color_glyph_svg_create_blob (hb_face_t *face, hb_codepoint_t glyph)
|
||||||
{
|
{
|
||||||
return _get_svg (face).create_blob_for_glyph (glyph);
|
return _get_svg (face).reference_blob_for_glyph (glyph);
|
||||||
}
|
}
|
||||||
|
|
|
@ -388,7 +388,7 @@ test_hb_ot_color_svg (void)
|
||||||
g_assert (strncmp (data + 140, "</svg>", 5) == 0);
|
g_assert (strncmp (data + 140, "</svg>", 5) == 0);
|
||||||
hb_blob_destroy (blob);
|
hb_blob_destroy (blob);
|
||||||
|
|
||||||
blob = hb_ot_color_glyph_svg_create_blob (empty, 0, &start_glyph, &end_glyph);
|
blob = hb_ot_color_glyph_svg_create_blob (empty, 0);
|
||||||
g_assert (hb_blob_get_length (blob) == 0);
|
g_assert (hb_blob_get_length (blob) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue