add api tests for subset gvar & HVAR; bug fixes
This commit is contained in:
parent
6e066464f0
commit
6ee71166b0
|
@ -1757,7 +1757,8 @@ struct VarData
|
||||||
shortCount.set (src->shortCount);
|
shortCount.set (src->shortCount);
|
||||||
|
|
||||||
unsigned int row_size = src->get_row_size ();
|
unsigned int row_size = src->get_row_size ();
|
||||||
if (unlikely (!c->allocate_size<HBUINT8> (src->regionIndices.get_size () + (row_size * remap.get_count ()))))
|
unsigned int size = src->regionIndices.get_size () - HBUINT16::static_size/*regionIndices.len*/ + (row_size * remap.get_count ());
|
||||||
|
if (unlikely (!c->allocate_size<HBUINT8> (size)))
|
||||||
return_trace (false);
|
return_trace (false);
|
||||||
|
|
||||||
memcpy (®ionIndices, &src->regionIndices, src->regionIndices.get_size ());
|
memcpy (®ionIndices, &src->regionIndices, src->regionIndices.get_size ());
|
||||||
|
|
|
@ -409,6 +409,18 @@ struct gvar
|
||||||
HBUINT8 *subset_offsets = c->serializer->allocate_size<HBUINT8> ((long_offset? 4: 2) * (num_glyphs+1));
|
HBUINT8 *subset_offsets = c->serializer->allocate_size<HBUINT8> ((long_offset? 4: 2) * (num_glyphs+1));
|
||||||
if (!subset_offsets) return_trace (false);
|
if (!subset_offsets) return_trace (false);
|
||||||
|
|
||||||
|
/* shared tuples */
|
||||||
|
if (!sharedTupleCount || !sharedTuples)
|
||||||
|
out->sharedTuples.set (0);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unsigned int shared_tuple_size = F2DOT14::static_size * axisCount * sharedTupleCount;
|
||||||
|
F2DOT14 *tuples = c->serializer->allocate_size<F2DOT14> (shared_tuple_size);
|
||||||
|
if (!tuples) return_trace (false);
|
||||||
|
out->sharedTuples.set ((char *)tuples - (char *)out);
|
||||||
|
memcpy (tuples, &(this+sharedTuples), shared_tuple_size);
|
||||||
|
}
|
||||||
|
|
||||||
char *subset_data = c->serializer->allocate_size<char>(subset_data_size);
|
char *subset_data = c->serializer->allocate_size<char>(subset_data_size);
|
||||||
if (!subset_data) return_trace (false);
|
if (!subset_data) return_trace (false);
|
||||||
out->dataZ.set (subset_data - (char *)out);
|
out->dataZ.set (subset_data - (char *)out);
|
||||||
|
@ -433,18 +445,6 @@ struct gvar
|
||||||
else
|
else
|
||||||
((HBUINT16 *)subset_offsets)[num_glyphs].set (glyph_offset / 2);
|
((HBUINT16 *)subset_offsets)[num_glyphs].set (glyph_offset / 2);
|
||||||
|
|
||||||
/* shared tuples */
|
|
||||||
if (!sharedTupleCount || !sharedTuples)
|
|
||||||
out->sharedTuples.set (0);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
unsigned int shared_tuple_size = F2DOT14::static_size * axisCount * sharedTupleCount;
|
|
||||||
F2DOT14 *tuples = c->serializer->allocate_size<F2DOT14> (shared_tuple_size);
|
|
||||||
if (!tuples) return_trace (false);
|
|
||||||
out->sharedTuples.set ((char *)tuples - (char *)out);
|
|
||||||
memcpy (tuples, &(this+sharedTuples), shared_tuple_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
return_trace (true);
|
return_trace (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -134,7 +134,14 @@ struct index_map_subset_plan_t
|
||||||
|
|
||||||
/* Identity map */
|
/* Identity map */
|
||||||
if (&index_map == &Null(DeltaSetIndexMap))
|
if (&index_map == &Null(DeltaSetIndexMap))
|
||||||
|
{
|
||||||
|
outer_remap.add (0);
|
||||||
|
hb_codepoint_t old_gid;
|
||||||
|
for (hb_codepoint_t gid = 0; gid < plan->num_output_glyphs (); gid++)
|
||||||
|
if (plan->old_gid_for_new_gid (gid, &old_gid))
|
||||||
|
inner_remaps[0].add (old_gid);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int last_val = (unsigned int)-1;
|
unsigned int last_val = (unsigned int)-1;
|
||||||
hb_codepoint_t last_gid = (hb_codepoint_t)-1;
|
hb_codepoint_t last_gid = (hb_codepoint_t)-1;
|
||||||
|
@ -189,6 +196,11 @@ struct index_map_subset_plan_t
|
||||||
const hb_bimap_t &outer_remap,
|
const hb_bimap_t &outer_remap,
|
||||||
const hb_vector_t<hb_bimap_t> &inner_remaps)
|
const hb_vector_t<hb_bimap_t> &inner_remaps)
|
||||||
{
|
{
|
||||||
|
/* Leave output_map empty for an identity map */
|
||||||
|
/* TODO: if retain_gids, convert identity to a customized map, or not subset varstore? */
|
||||||
|
if (input_map == &Null(DeltaSetIndexMap))
|
||||||
|
return;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < max_inners.length; i++)
|
for (unsigned int i = 0; i < max_inners.length; i++)
|
||||||
{
|
{
|
||||||
if (inner_remaps[i].get_count () == 0) continue;
|
if (inner_remaps[i].get_count () == 0) continue;
|
||||||
|
@ -214,6 +226,7 @@ struct index_map_subset_plan_t
|
||||||
unsigned int get_size () const
|
unsigned int get_size () const
|
||||||
{ return (map_count? (DeltaSetIndexMap::min_size + get_width () * map_count): 0); }
|
{ return (map_count? (DeltaSetIndexMap::min_size + get_width () * map_count): 0); }
|
||||||
|
|
||||||
|
bool is_identity () const { return get_output_map ().length == 0; }
|
||||||
hb_array_t<const unsigned int> get_output_map () const { return output_map.as_array (); }
|
hb_array_t<const unsigned int> get_output_map () const { return output_map.as_array (); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -311,15 +324,15 @@ struct HVARVVAR
|
||||||
const hb_array_t<index_map_subset_plan_t> &im_plans)
|
const hb_array_t<index_map_subset_plan_t> &im_plans)
|
||||||
{
|
{
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
if (!im_plans[ADV_INDEX].get_map_count ())
|
if (im_plans[ADV_INDEX].is_identity ())
|
||||||
advMap.set (0);
|
advMap.set (0);
|
||||||
else if (unlikely (!advMap.serialize (c, this).serialize (c, im_plans[ADV_INDEX])))
|
else if (unlikely (!advMap.serialize (c, this).serialize (c, im_plans[ADV_INDEX])))
|
||||||
return_trace (false);
|
return_trace (false);
|
||||||
if (!im_plans[LSB_INDEX].get_map_count ())
|
if (im_plans[LSB_INDEX].is_identity ())
|
||||||
lsbMap.set (0);
|
lsbMap.set (0);
|
||||||
else if (unlikely (!lsbMap.serialize (c, this).serialize (c, im_plans[LSB_INDEX])))
|
else if (unlikely (!lsbMap.serialize (c, this).serialize (c, im_plans[LSB_INDEX])))
|
||||||
return_trace (false);
|
return_trace (false);
|
||||||
if (!im_plans[RSB_INDEX].get_map_count ())
|
if (im_plans[RSB_INDEX].is_identity ())
|
||||||
rsbMap.set (0);
|
rsbMap.set (0);
|
||||||
else if (unlikely (!rsbMap.serialize (c, this).serialize (c, im_plans[RSB_INDEX])))
|
else if (unlikely (!rsbMap.serialize (c, this).serialize (c, im_plans[RSB_INDEX])))
|
||||||
return_trace (false);
|
return_trace (false);
|
||||||
|
|
|
@ -50,6 +50,8 @@ TEST_PROGS = \
|
||||||
test-subset-vmtx \
|
test-subset-vmtx \
|
||||||
test-subset-cff1 \
|
test-subset-cff1 \
|
||||||
test-subset-cff2 \
|
test-subset-cff2 \
|
||||||
|
test-subset-gvar \
|
||||||
|
test-subset-hvar \
|
||||||
test-unicode \
|
test-unicode \
|
||||||
test-version \
|
test-version \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Copyright © 2019 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hb-test.h"
|
||||||
|
#include "hb-subset-test.h"
|
||||||
|
|
||||||
|
/* Unit tests for gvar subsetting */
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_subset_gvar_noop (void)
|
||||||
|
{
|
||||||
|
hb_face_t *face_abc = hb_test_open_font_file("fonts/SourceSansVariable-Roman.abc.ttf");
|
||||||
|
|
||||||
|
hb_set_t *codepoints = hb_set_create ();
|
||||||
|
hb_face_t *face_abc_subset;
|
||||||
|
hb_set_add (codepoints, 'a');
|
||||||
|
hb_set_add (codepoints, 'b');
|
||||||
|
hb_set_add (codepoints, 'c');
|
||||||
|
face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
|
||||||
|
hb_set_destroy (codepoints);
|
||||||
|
|
||||||
|
hb_subset_test_check (face_abc, face_abc_subset, HB_TAG ('g','v','a','r'));
|
||||||
|
|
||||||
|
hb_face_destroy (face_abc_subset);
|
||||||
|
hb_face_destroy (face_abc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_subset_gvar (void)
|
||||||
|
{
|
||||||
|
hb_face_t *face_abc = hb_test_open_font_file ("fonts/SourceSansVariable-Roman.abc.ttf");
|
||||||
|
hb_face_t *face_ac = hb_test_open_font_file ("fonts/SourceSansVariable-Roman.ac.ttf");
|
||||||
|
|
||||||
|
hb_set_t *codepoints = hb_set_create ();
|
||||||
|
hb_face_t *face_abc_subset;
|
||||||
|
hb_set_add (codepoints, 'a');
|
||||||
|
hb_set_add (codepoints, 'c');
|
||||||
|
face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
|
||||||
|
hb_set_destroy (codepoints);
|
||||||
|
|
||||||
|
hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('g','v','a','r'));
|
||||||
|
|
||||||
|
hb_face_destroy (face_abc_subset);
|
||||||
|
hb_face_destroy (face_abc);
|
||||||
|
hb_face_destroy (face_ac);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
hb_test_init (&argc, &argv);
|
||||||
|
|
||||||
|
hb_test_add (test_subset_gvar_noop);
|
||||||
|
hb_test_add (test_subset_gvar);
|
||||||
|
|
||||||
|
return hb_test_run ();
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Copyright © 2019 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hb-test.h"
|
||||||
|
#include "hb-subset-test.h"
|
||||||
|
|
||||||
|
/* Unit tests for HVAR subsetting */
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_subset_HVAR_noop (void)
|
||||||
|
{
|
||||||
|
hb_face_t *face_abc = hb_test_open_font_file("fonts/SourceSansVariable-Roman.abc.ttf");
|
||||||
|
|
||||||
|
hb_set_t *codepoints = hb_set_create ();
|
||||||
|
hb_face_t *face_abc_subset;
|
||||||
|
hb_set_add (codepoints, 'a');
|
||||||
|
hb_set_add (codepoints, 'b');
|
||||||
|
hb_set_add (codepoints, 'c');
|
||||||
|
face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
|
||||||
|
hb_set_destroy (codepoints);
|
||||||
|
|
||||||
|
hb_subset_test_check (face_abc, face_abc_subset, HB_TAG ('H','V','A','R'));
|
||||||
|
|
||||||
|
hb_face_destroy (face_abc_subset);
|
||||||
|
hb_face_destroy (face_abc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_subset_HVAR (void)
|
||||||
|
{
|
||||||
|
hb_face_t *face_abc = hb_test_open_font_file ("fonts/SourceSansVariable-Roman.abc.ttf");
|
||||||
|
hb_face_t *face_ac = hb_test_open_font_file ("fonts/SourceSansVariable-Roman.ac.ttf");
|
||||||
|
|
||||||
|
hb_set_t *codepoints = hb_set_create ();
|
||||||
|
hb_face_t *face_abc_subset;
|
||||||
|
hb_set_add (codepoints, 'a');
|
||||||
|
hb_set_add (codepoints, 'c');
|
||||||
|
face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
|
||||||
|
hb_set_destroy (codepoints);
|
||||||
|
|
||||||
|
hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('H','V','A','R'));
|
||||||
|
|
||||||
|
hb_face_destroy (face_abc_subset);
|
||||||
|
hb_face_destroy (face_abc);
|
||||||
|
hb_face_destroy (face_ac);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
hb_test_init (&argc, &argv);
|
||||||
|
|
||||||
|
hb_test_add (test_subset_HVAR_noop);
|
||||||
|
hb_test_add (test_subset_HVAR);
|
||||||
|
|
||||||
|
return hb_test_run ();
|
||||||
|
}
|
Loading…
Reference in New Issue