From a85d7ead04aff81d2f9df9110316892dbbefe1c2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 14 Nov 2017 20:00:34 -0800 Subject: [PATCH] [ot] Move hb_ot_face_metrics_accelerator_t --- src/hb-ot-font.cc | 108 +--------------------------------------- src/hb-ot-hmtx-table.hh | 108 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 109 insertions(+), 107 deletions(-) diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index eb497e57..d1ae238e 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -37,113 +37,9 @@ #include "hb-ot-hhea-table.hh" #include "hb-ot-hmtx-table.hh" #include "hb-ot-kern-table.hh" -#include "hb-ot-os2-table.hh" #include "hb-ot-post-table.hh" -#include "hb-ot-var-hvar-table.hh" -struct hb_ot_face_metrics_accelerator_t -{ - unsigned int num_metrics; - unsigned int num_advances; - unsigned int default_advance; - unsigned short ascender; - unsigned short descender; - unsigned short line_gap; - bool has_font_extents; - - const OT::hmtxvmtx *table; - hb_blob_t *blob; - - const OT::HVARVVAR *var; - hb_blob_t *var_blob; - - inline void init (hb_face_t *face, - hb_tag_t _hea_tag, - hb_tag_t _mtx_tag, - hb_tag_t _var_tag, - hb_tag_t os2_tag, - unsigned int default_advance = 0) - { - this->default_advance = default_advance ? default_advance : face->get_upem (); - - bool got_font_extents = false; - if (os2_tag) - { - hb_blob_t *os2_blob = OT::Sanitizer::sanitize (face->reference_table (os2_tag)); - const OT::os2 *os2 = OT::Sanitizer::lock_instance (os2_blob); -#define USE_TYPO_METRICS (1u<<7) - if (0 != (os2->fsSelection & USE_TYPO_METRICS)) - { - this->ascender = os2->sTypoAscender; - this->descender = os2->sTypoDescender; - this->line_gap = os2->sTypoLineGap; - got_font_extents = (this->ascender | this->descender) != 0; - } - hb_blob_destroy (os2_blob); - } - - hb_blob_t *_hea_blob = OT::Sanitizer::sanitize (face->reference_table (_hea_tag)); - const OT::_hea *_hea = OT::Sanitizer::lock_instance (_hea_blob); - this->num_advances = _hea->numberOfLongMetrics; - if (!got_font_extents) - { - this->ascender = _hea->ascender; - this->descender = _hea->descender; - this->line_gap = _hea->lineGap; - got_font_extents = (this->ascender | this->descender) != 0; - } - hb_blob_destroy (_hea_blob); - - this->has_font_extents = got_font_extents; - - this->blob = OT::Sanitizer::sanitize (face->reference_table (_mtx_tag)); - - /* Cap num_metrics() and num_advances() based on table length. */ - unsigned int len = hb_blob_get_length (this->blob); - if (unlikely (this->num_advances * 4 > len)) - this->num_advances = len / 4; - this->num_metrics = this->num_advances + (len - 4 * this->num_advances) / 2; - - /* We MUST set num_metrics to zero if num_advances is zero. - * Our get_advance() depends on that. */ - if (unlikely (!this->num_advances)) - { - this->num_metrics = this->num_advances = 0; - hb_blob_destroy (this->blob); - this->blob = hb_blob_get_empty (); - } - this->table = OT::Sanitizer::lock_instance (this->blob); - - this->var_blob = OT::Sanitizer::sanitize (face->reference_table (_var_tag)); - this->var = OT::Sanitizer::lock_instance (this->var_blob); - } - - inline void fini (void) - { - hb_blob_destroy (this->blob); - hb_blob_destroy (this->var_blob); - } - - inline unsigned int get_advance (hb_codepoint_t glyph, - hb_font_t *font) const - { - if (unlikely (glyph >= this->num_metrics)) - { - /* If this->num_metrics is zero, it means we don't have the metrics table - * for this direction: return default advance. Otherwise, it means that the - * glyph index is out of bound: return zero. */ - if (this->num_metrics) - return 0; - else - return this->default_advance; - } - - return this->table->longMetric[MIN (glyph, (uint32_t) this->num_advances - 1)].advance - + this->var->get_advance_var (glyph, font->coords, font->num_coords); // TODO Optimize?! - } -}; - typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph); @@ -275,8 +171,8 @@ struct hb_ot_face_cmap_accelerator_t struct hb_ot_font_t { hb_ot_face_cmap_accelerator_t cmap; - hb_ot_face_metrics_accelerator_t h_metrics; - hb_ot_face_metrics_accelerator_t v_metrics; + OT::hmtxvmtx::accelerator_t h_metrics; + OT::hmtxvmtx::accelerator_t v_metrics; OT::hb_lazy_loader_t glyf; OT::hb_lazy_loader_t cbdt; OT::hb_lazy_loader_t post; diff --git a/src/hb-ot-hmtx-table.hh b/src/hb-ot-hmtx-table.hh index 30aa6253..3485a6d0 100644 --- a/src/hb-ot-hmtx-table.hh +++ b/src/hb-ot-hmtx-table.hh @@ -28,6 +28,8 @@ #define HB_OT_HMTX_TABLE_HH #include "hb-open-type-private.hh" +#include "hb-ot-os2-table.hh" +#include "hb-ot-var-hvar-table.hh" namespace OT { @@ -63,7 +65,111 @@ struct hmtxvmtx return_trace (true); } - public: + struct accelerator_t + { + const hmtxvmtx *table; + hb_blob_t *blob; + + const HVARVVAR *var; + hb_blob_t *var_blob; + + inline void init (hb_face_t *face, + hb_tag_t _hea_tag, + hb_tag_t _mtx_tag, + hb_tag_t _var_tag, + hb_tag_t os2_tag, + unsigned int default_advance = 0) + { + this->default_advance = default_advance ? default_advance : face->get_upem (); + + bool got_font_extents = false; + if (os2_tag) + { + hb_blob_t *os2_blob = Sanitizer::sanitize (face->reference_table (os2_tag)); + const os2 *os2_table = Sanitizer::lock_instance (os2_blob); +#define USE_TYPO_METRICS (1u<<7) + if (0 != (os2_table->fsSelection & USE_TYPO_METRICS)) + { + this->ascender = os2_table->sTypoAscender; + this->descender = os2_table->sTypoDescender; + this->line_gap = os2_table->sTypoLineGap; + got_font_extents = (this->ascender | this->descender) != 0; + } + hb_blob_destroy (os2_blob); + } + + hb_blob_t *_hea_blob = Sanitizer<_hea>::sanitize (face->reference_table (_hea_tag)); + const _hea *_hea_table = Sanitizer<_hea>::lock_instance (_hea_blob); + this->num_advances = _hea_table->numberOfLongMetrics; + if (!got_font_extents) + { + this->ascender = _hea_table->ascender; + this->descender = _hea_table->descender; + this->line_gap = _hea_table->lineGap; + got_font_extents = (this->ascender | this->descender) != 0; + } + hb_blob_destroy (_hea_blob); + + this->has_font_extents = got_font_extents; + + this->blob = Sanitizer::sanitize (face->reference_table (_mtx_tag)); + + /* Cap num_metrics() and num_advances() based on table length. */ + unsigned int len = hb_blob_get_length (this->blob); + if (unlikely (this->num_advances * 4 > len)) + this->num_advances = len / 4; + this->num_metrics = this->num_advances + (len - 4 * this->num_advances) / 2; + + /* We MUST set num_metrics to zero if num_advances is zero. + * Our get_advance() depends on that. */ + if (unlikely (!this->num_advances)) + { + this->num_metrics = this->num_advances = 0; + hb_blob_destroy (this->blob); + this->blob = hb_blob_get_empty (); + } + this->table = Sanitizer::lock_instance (this->blob); + + this->var_blob = Sanitizer::sanitize (face->reference_table (_var_tag)); + this->var = Sanitizer::lock_instance (this->var_blob); + } + + inline void fini (void) + { + hb_blob_destroy (this->blob); + hb_blob_destroy (this->var_blob); + } + + inline unsigned int get_advance (hb_codepoint_t glyph, + hb_font_t *font) const + { + if (unlikely (glyph >= this->num_metrics)) + { + /* If this->num_metrics is zero, it means we don't have the metrics table + * for this direction: return default advance. Otherwise, it means that the + * glyph index is out of bound: return zero. */ + if (this->num_metrics) + return 0; + else + return this->default_advance; + } + + return this->table->longMetric[MIN (glyph, (uint32_t) this->num_advances - 1)].advance + + this->var->get_advance_var (glyph, font->coords, font->num_coords); // TODO Optimize?! + } + + public: + bool has_font_extents; + unsigned short ascender; + unsigned short descender; + unsigned short line_gap; + private: + unsigned int num_metrics; + unsigned int num_advances; + unsigned int default_advance; + }; + + protected: LongMetric longMetric[VAR]; /* Paired advance width and leading * bearing values for each glyph. The * value numOfHMetrics comes from -- GitLab