[ot] Move hb_ot_face_metrics_accelerator_t
This commit is contained in:
parent
f00a94e1ec
commit
a85d7ead04
|
@ -37,113 +37,9 @@
|
||||||
#include "hb-ot-hhea-table.hh"
|
#include "hb-ot-hhea-table.hh"
|
||||||
#include "hb-ot-hmtx-table.hh"
|
#include "hb-ot-hmtx-table.hh"
|
||||||
#include "hb-ot-kern-table.hh"
|
#include "hb-ot-kern-table.hh"
|
||||||
#include "hb-ot-os2-table.hh"
|
|
||||||
#include "hb-ot-post-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<OT::os2>::sanitize (face->reference_table (os2_tag));
|
|
||||||
const OT::os2 *os2 = OT::Sanitizer<OT::os2>::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<OT::_hea>::sanitize (face->reference_table (_hea_tag));
|
|
||||||
const OT::_hea *_hea = OT::Sanitizer<OT::_hea>::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<OT::hmtxvmtx>::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<OT::hmtxvmtx>::lock_instance (this->blob);
|
|
||||||
|
|
||||||
this->var_blob = OT::Sanitizer<OT::HVARVVAR>::sanitize (face->reference_table (_var_tag));
|
|
||||||
this->var = OT::Sanitizer<OT::HVARVVAR>::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,
|
typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj,
|
||||||
hb_codepoint_t codepoint,
|
hb_codepoint_t codepoint,
|
||||||
hb_codepoint_t *glyph);
|
hb_codepoint_t *glyph);
|
||||||
|
@ -275,8 +171,8 @@ struct hb_ot_face_cmap_accelerator_t
|
||||||
struct hb_ot_font_t
|
struct hb_ot_font_t
|
||||||
{
|
{
|
||||||
hb_ot_face_cmap_accelerator_t cmap;
|
hb_ot_face_cmap_accelerator_t cmap;
|
||||||
hb_ot_face_metrics_accelerator_t h_metrics;
|
OT::hmtxvmtx::accelerator_t h_metrics;
|
||||||
hb_ot_face_metrics_accelerator_t v_metrics;
|
OT::hmtxvmtx::accelerator_t v_metrics;
|
||||||
OT::hb_lazy_loader_t<OT::glyf::accelerator_t> glyf;
|
OT::hb_lazy_loader_t<OT::glyf::accelerator_t> glyf;
|
||||||
OT::hb_lazy_loader_t<OT::CBDT::accelerator_t> cbdt;
|
OT::hb_lazy_loader_t<OT::CBDT::accelerator_t> cbdt;
|
||||||
OT::hb_lazy_loader_t<OT::post::accelerator_t> post;
|
OT::hb_lazy_loader_t<OT::post::accelerator_t> post;
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
#define HB_OT_HMTX_TABLE_HH
|
#define HB_OT_HMTX_TABLE_HH
|
||||||
|
|
||||||
#include "hb-open-type-private.hh"
|
#include "hb-open-type-private.hh"
|
||||||
|
#include "hb-ot-os2-table.hh"
|
||||||
|
#include "hb-ot-var-hvar-table.hh"
|
||||||
|
|
||||||
|
|
||||||
namespace OT {
|
namespace OT {
|
||||||
|
@ -63,7 +65,111 @@ struct hmtxvmtx
|
||||||
return_trace (true);
|
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<os2>::sanitize (face->reference_table (os2_tag));
|
||||||
|
const os2 *os2_table = Sanitizer<os2>::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<hmtxvmtx>::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<hmtxvmtx>::lock_instance (this->blob);
|
||||||
|
|
||||||
|
this->var_blob = Sanitizer<HVARVVAR>::sanitize (face->reference_table (_var_tag));
|
||||||
|
this->var = Sanitizer<HVARVVAR>::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
|
LongMetric longMetric[VAR]; /* Paired advance width and leading
|
||||||
* bearing values for each glyph. The
|
* bearing values for each glyph. The
|
||||||
* value numOfHMetrics comes from
|
* value numOfHMetrics comes from
|
||||||
|
|
Loading…
Reference in New Issue