From 9690461a91df3a6bb467cc111e0dfe1da20a821e Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Tue, 26 Feb 2019 11:11:50 -0800 Subject: [PATCH] Added hb-ot-var-gvar-table.hh implemented sanitize() placeholder subset() some code cleanup --- src/hb-ot-gvar-table.hh | 211 ------------------------------------ src/hb-ot-var-gvar-table.hh | 12 +- 2 files changed, 6 insertions(+), 217 deletions(-) delete mode 100644 src/hb-ot-gvar-table.hh diff --git a/src/hb-ot-gvar-table.hh b/src/hb-ot-gvar-table.hh deleted file mode 100644 index f0077150b..000000000 --- a/src/hb-ot-gvar-table.hh +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright © 2018 Adobe Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Adobe Author(s): Michiharu Ariza - */ - -#ifndef HB_OT_GVAR_TABLE_HH -#define HB_OT_GVAR_TABLE_HH - -#include "hb-open-type.hh" - -/* - * gvar -- Glyph Variation Table - * https://docs.microsoft.com/en-us/typography/opentype/spec/gvar - */ -#define HB_OT_TAG_gvar HB_TAG('g','v','a','r') - -namespace OT { - -struct Tupple -{ - bool sanitize (hb_sanitize_context_t *c, unsigned int axis_count) const - { - TRACE_SANITIZE (this); - return_trace (coords.sanitize (c, axis_count, this));s - } - - protected: - UnsizedArrayOf - coords; - - public: - DEFINE_SIZE_ARRAY (0, coords); -}; - -struct TupleVarHeader -{ - HBUINT16 varDataSize; - HBUINT16 tupleIndex; - /* Tuple peakTuple */ - /* Tuple intermediateStartTuple */ - /* Tuple intermediateEndTuple */ -}; - -struct GlyphVarData -{ - HBUINT16 tupleVarCount; - OffsetTo - data; - UnsizedArrayOf - tupleVarHeaders; -}; - -struct gvar -{ - static constexpr hb_tag_t tableTag = HB_OT_TAG_gvar; - - bool has_data () const { return version.to_int (); } - - int get_y_origin (hb_codepoint_t glyph) const - { - unsigned int i; - if (!vertYOrigins.bfind (glyph, &i)) - return defaultVertOriginY; - return vertYOrigins[i].vertOriginY; - } - - bool _subset (const hb_subset_plan_t *plan HB_UNUSED, - const gvar *vorg_table, - const hb_vector_t &subset_metrics, - unsigned int dest_sz, - void *dest) const - { - hb_serialize_context_t c (dest, dest_sz); - - gvar *subset_table = c.start_serialize (); - if (unlikely (!c.extend_min (*subset_table))) - return false; - - subset_table->version.major.set (1); - subset_table->version.minor.set (0); - - subset_table->defaultVertOriginY.set (vorg_table->defaultVertOriginY); - subset_table->vertYOrigins.len.set (subset_metrics.length); - - bool success = true; - if (subset_metrics.length > 0) - { - unsigned int size = VertOriginMetric::static_size * subset_metrics.length; - VertOriginMetric *metrics = c.allocate_size (size); - if (likely (metrics != nullptr)) - memcpy (metrics, &subset_metrics[0], size); - else - success = false; - } - c.end_serialize (); - - return success; - } - - bool subset (hb_subset_plan_t *plan) const - { - hb_blob_t *vorg_blob = hb_sanitize_context_t().reference_table (plan->source); - const gvar *vorg_table = vorg_blob->as (); - - /* count the number of glyphs to be included in the subset table */ - hb_vector_t subset_metrics; - subset_metrics.init (); - - - hb_codepoint_t old_glyph = HB_SET_VALUE_INVALID; - unsigned int i = 0; - while (i < vertYOrigins.len - && plan->glyphset ()->next (&old_glyph)) - { - while (old_glyph > vertYOrigins[i].glyph) - { - i++; - if (i >= vertYOrigins.len) - break; - } - - if (old_glyph == vertYOrigins[i].glyph) - { - hb_codepoint_t new_glyph; - if (plan->new_gid_for_old_gid (old_glyph, &new_glyph)) - { - VertOriginMetric *metrics = subset_metrics.push (); - metrics->glyph.set (new_glyph); - metrics->vertOriginY.set (vertYOrigins[i].vertOriginY); - } - } - } - - /* alloc the new table */ - unsigned int dest_sz = gvar::min_size + VertOriginMetric::static_size * subset_metrics.length; - void *dest = (void *) malloc (dest_sz); - if (unlikely (!dest)) - { - subset_metrics.fini (); - hb_blob_destroy (vorg_blob); - return false; - } - - /* serialize the new table */ - if (!_subset (plan, vorg_table, subset_metrics, dest_sz, dest)) - { - subset_metrics.fini (); - free (dest); - hb_blob_destroy (vorg_blob); - return false; - } - - hb_blob_t *result = hb_blob_create ((const char *)dest, - dest_sz, - HB_MEMORY_MODE_READONLY, - dest, - free); - bool success = plan->add_table (HB_OT_TAG_gvar, result); - hb_blob_destroy (result); - subset_metrics.fini (); - hb_blob_destroy (vorg_blob); - return success; - } - - bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - version.major == 1 && - glyphVarDataArray.sanitize (c)); - } - - protected: - FixedVersion<> version; /* Version of gvar table. Set to 0x00010000u. */ - HBUINT16 axisCount; - HBUINT16 sharedTupleCount; - LOffsetTo sharedTuples; - HBUINT16 glyphCount; - HBUINT16 flags; - LOffsetTo - glyphVarDataArray; - /* OffsetTo glyphVariationDataOffsets */ - - public: - DEFINE_SIZE_ARRAY(8, vertYOrigins); -}; - -} /* namespace OT */ - -#endif /* HB_OT_GVAR_TABLE_HH */ diff --git a/src/hb-ot-var-gvar-table.hh b/src/hb-ot-var-gvar-table.hh index 5c157a1d5..f99f3b256 100644 --- a/src/hb-ot-var-gvar-table.hh +++ b/src/hb-ot-var-gvar-table.hh @@ -173,7 +173,7 @@ struct GlyphVarData current_tuple = &var_data->get_tuple_var_header (); data_offset = 0; } - + bool is_valid () const { return (index < var_data->tupleVarCount.get_count ()) && @@ -223,7 +223,7 @@ struct GlyphVarData TupleVarCount tupleVarCount; OffsetTo data; /* TupleVarHeader tupleVarHeaders[] */ - + public: DEFINE_SIZE_MIN (4); }; @@ -292,7 +292,7 @@ struct gvar ((HBUINT32 *)subset_offsets)[gid].set (glyph_offset); else ((HBUINT16 *)subset_offsets)[gid].set (glyph_offset / 2); - + if (length > 0) memcpy (subset_data, get_glyph_var_data (old_gid), length); subset_data += length; glyph_offset += length; @@ -380,7 +380,7 @@ struct gvar protected: typedef glyf::accelerator_t glyf_acc_t; - + static float infer_delta (float target_val, float pre_val, float fol_val, float pre_delta, float fol_delta) { @@ -395,7 +395,7 @@ struct gvar float r = (target_val - pre_val) / (fol_val - pre_val); return (1.f - r) * pre_delta + r * fol_delta; } - + bool apply_deltas_to_points (hb_codepoint_t glyph, const int *coords, unsigned int coord_count, const hb_array_t points, @@ -572,7 +572,7 @@ struct gvar { float advance = 0.f; if (coord_count != gvar_table->axisCount) return advance; - + hb_vector_t points; points.resize (glyf_acc_t::PHANTOM_COUNT);