2016-09-26 20:12:48 +00:00
|
|
|
/*
|
|
|
|
* Copyright © 2016 Igalia S.L.
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
* Igalia Author(s): Frédéric Wang
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#include "hb-test.h"
|
|
|
|
|
|
|
|
#include "hb-ft.h"
|
|
|
|
#include "hb-ot.h"
|
|
|
|
|
|
|
|
/* Unit tests for hb-ot-math.h - OpenType MATH table */
|
|
|
|
|
|
|
|
static FT_Library ft_library;
|
|
|
|
static FT_Face ft_face;
|
|
|
|
static hb_font_t *hb_font;
|
|
|
|
static hb_face_t *hb_face;
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
initFreeType (void)
|
|
|
|
{
|
|
|
|
FT_Error ft_error;
|
|
|
|
if ((ft_error = FT_Init_FreeType (&ft_library)))
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
cleanupFreeType (void)
|
|
|
|
{
|
|
|
|
FT_Done_FreeType (ft_library);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
openFont(const char* fontFile)
|
|
|
|
{
|
Support building with older glib versions
It is desirable to be able to build against older versions of glib.
fd7a245 changed the configure check to require glib > 2.38 for
G_TEST_DIST. Before that, version 2.16 was required, but in fact,
since aafe395, G_PASTE is being used, which was introduced in 2.19.1.
And since 0ef179e2, hb-glib uses GBytes, which were introduced in
2.31.10.
2.19.1 is rather old, but 2.38 is rather new. For Firefox, building
against 2.22 is still supported, although we could probably get away
with bumping that to 2.28. Either way, GBytes is not available.
Arguably, if you build against a glib that doesn't support GBytes,
you're not going to use the hb_glib_blob_create function, so we hide
the function when building against such a glib.
As for G_TEST_DIST, when building against versions of glib that don't
support it, we can fallback to the previous behavior, which, AIUI, was
just making the test not work when building in a separate directory.
2016-09-30 09:15:37 +00:00
|
|
|
#if GLIB_CHECK_VERSION(2,37,2)
|
2016-09-26 20:12:48 +00:00
|
|
|
gchar* path = g_test_build_filename(G_TEST_DIST, fontFile, NULL);
|
Support building with older glib versions
It is desirable to be able to build against older versions of glib.
fd7a245 changed the configure check to require glib > 2.38 for
G_TEST_DIST. Before that, version 2.16 was required, but in fact,
since aafe395, G_PASTE is being used, which was introduced in 2.19.1.
And since 0ef179e2, hb-glib uses GBytes, which were introduced in
2.31.10.
2.19.1 is rather old, but 2.38 is rather new. For Firefox, building
against 2.22 is still supported, although we could probably get away
with bumping that to 2.28. Either way, GBytes is not available.
Arguably, if you build against a glib that doesn't support GBytes,
you're not going to use the hb_glib_blob_create function, so we hide
the function when building against such a glib.
As for G_TEST_DIST, when building against versions of glib that don't
support it, we can fallback to the previous behavior, which, AIUI, was
just making the test not work when building in a separate directory.
2016-09-30 09:15:37 +00:00
|
|
|
#else
|
|
|
|
gchar* path = g_strdup(fontFile);
|
|
|
|
#endif
|
2016-09-26 20:12:48 +00:00
|
|
|
|
|
|
|
FT_Error ft_error;
|
|
|
|
if ((ft_error = FT_New_Face (ft_library, path, 0, &ft_face))) {
|
|
|
|
g_free(path);
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
g_free(path);
|
|
|
|
|
2016-09-27 09:02:08 +00:00
|
|
|
if ((ft_error = FT_Set_Char_Size (ft_face, 2000, 1000, 0, 0)))
|
2016-09-26 20:12:48 +00:00
|
|
|
abort();
|
|
|
|
hb_font = hb_ft_font_create (ft_face, NULL);
|
2017-01-20 00:48:01 +00:00
|
|
|
hb_face = hb_face_reference (hb_font_get_face (hb_font));
|
2016-09-26 20:12:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
closeFont (void)
|
|
|
|
{
|
2017-01-20 00:48:01 +00:00
|
|
|
hb_face_destroy (hb_face);
|
2016-09-26 20:12:48 +00:00
|
|
|
hb_font_destroy (hb_font);
|
|
|
|
FT_Done_Face (ft_face);
|
2017-01-20 00:51:36 +00:00
|
|
|
hb_face = NULL;
|
|
|
|
hb_font = NULL;
|
|
|
|
ft_face = NULL;
|
2016-09-26 20:12:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
test_has_data (void)
|
|
|
|
{
|
|
|
|
initFreeType();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontNone.otf");
|
|
|
|
g_assert(!hb_ot_math_has_data (hb_face)); // MATH table not available
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontEmpty.otf");
|
|
|
|
g_assert(hb_ot_math_has_data (hb_face)); // MATH table available
|
|
|
|
closeFont();
|
|
|
|
|
2017-01-20 00:55:04 +00:00
|
|
|
hb_face = hb_face_get_empty ();
|
|
|
|
hb_font = hb_font_create (hb_face);
|
|
|
|
g_assert(!hb_ot_math_has_data (hb_face)); // MATH table not available
|
2018-09-22 13:35:52 +00:00
|
|
|
hb_font_destroy (hb_font);
|
|
|
|
hb_face_destroy (hb_face);
|
2017-01-20 00:55:04 +00:00
|
|
|
|
|
|
|
hb_font = hb_font_get_empty ();
|
|
|
|
hb_face = hb_font_get_face (hb_font);
|
|
|
|
g_assert(!hb_ot_math_has_data (hb_face)); // MATH table not available
|
2018-09-22 13:35:52 +00:00
|
|
|
hb_font_destroy (hb_font);
|
|
|
|
hb_face_destroy (hb_face);
|
2017-01-20 00:55:04 +00:00
|
|
|
|
2016-09-26 20:12:48 +00:00
|
|
|
cleanupFreeType();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
test_get_constant (void)
|
|
|
|
{
|
|
|
|
initFreeType();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontEmpty.otf");
|
|
|
|
g_assert_cmpint(hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT), ==, 0); // MathConstants not available
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontFull.otf");
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT)), ==, 100);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT)), ==, 200);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_MATH_LEADING)), ==, 300);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_AXIS_HEIGHT)), ==, 400);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_ACCENT_BASE_HEIGHT)), ==, 500);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FLATTENED_ACCENT_BASE_HEIGHT)), ==, 600);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUBSCRIPT_SHIFT_DOWN)), ==, 700);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUBSCRIPT_TOP_MAX)), ==, 800);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUBSCRIPT_BASELINE_DROP_MIN)), ==, 900);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP)), ==, 1100);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP_CRAMPED)), ==, 1200);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MIN)), ==, 1300);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUPERSCRIPT_BASELINE_DROP_MAX)), ==, 1400);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUB_SUPERSCRIPT_GAP_MIN)), ==, 1500);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MAX_WITH_SUBSCRIPT)), ==, 1600);
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SPACE_AFTER_SCRIPT)), ==, 3400);
|
2016-09-26 20:12:48 +00:00
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_UPPER_LIMIT_GAP_MIN)), ==, 1800);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_UPPER_LIMIT_BASELINE_RISE_MIN)), ==, 1900);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_LOWER_LIMIT_GAP_MIN)), ==, 2200);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_LOWER_LIMIT_BASELINE_DROP_MIN)), ==, 2300);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STACK_TOP_SHIFT_UP)), ==, 2400);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STACK_TOP_DISPLAY_STYLE_SHIFT_UP)), ==, 2500);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STACK_BOTTOM_SHIFT_DOWN)), ==, 2600);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STACK_BOTTOM_DISPLAY_STYLE_SHIFT_DOWN)), ==, 2700);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STACK_GAP_MIN)), ==, 2800);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STACK_DISPLAY_STYLE_GAP_MIN)), ==, 2900);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STRETCH_STACK_TOP_SHIFT_UP)), ==, 3000);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STRETCH_STACK_BOTTOM_SHIFT_DOWN)), ==, 3100);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_ABOVE_MIN)), ==, 3200);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_BELOW_MIN)), ==, 3300);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_SHIFT_UP)), ==, 3400);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_DISPLAY_STYLE_SHIFT_UP)), ==, 3500);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_SHIFT_DOWN)), ==, 3600);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_DISPLAY_STYLE_SHIFT_DOWN)), ==, 3700);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_GAP_MIN)), ==, 3800);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_NUM_DISPLAY_STYLE_GAP_MIN)), ==, 3900);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_RULE_THICKNESS)), ==, 4000);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_GAP_MIN)), ==, 4100);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_DENOM_DISPLAY_STYLE_GAP_MIN)), ==, 4200);
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SKEWED_FRACTION_HORIZONTAL_GAP)), ==, 8600);
|
2016-09-26 20:12:48 +00:00
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SKEWED_FRACTION_VERTICAL_GAP)), ==, 4400);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_OVERBAR_VERTICAL_GAP)), ==, 4500);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_OVERBAR_RULE_THICKNESS)), ==, 4600);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_OVERBAR_EXTRA_ASCENDER)), ==, 4700);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_UNDERBAR_VERTICAL_GAP)), ==, 4800);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_UNDERBAR_RULE_THICKNESS)), ==, 4900);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_UNDERBAR_EXTRA_DESCENDER)), ==, 5000);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_RADICAL_VERTICAL_GAP)), ==, 5100);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_RADICAL_DISPLAY_STYLE_VERTICAL_GAP)), ==, 5200);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_RADICAL_RULE_THICKNESS)), ==, 5300);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_RADICAL_EXTRA_ASCENDER)), ==, 5400);
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_RADICAL_KERN_BEFORE_DEGREE)), ==, 11000);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_RADICAL_KERN_AFTER_DEGREE)), ==, 11200);
|
2016-09-26 20:12:48 +00:00
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN)), ==, 87);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN)), ==, 76);
|
|
|
|
g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_RADICAL_DEGREE_BOTTOM_RAISE_PERCENT)), ==, 65);
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
cleanupFreeType();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
test_get_glyph_italics_correction (void)
|
|
|
|
{
|
|
|
|
hb_codepoint_t glyph;
|
|
|
|
initFreeType();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontEmpty.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_italics_correction (hb_font, glyph), ==, 0); // MathGlyphInfo not available
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial1.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_italics_correction (hb_font, glyph), ==, 0); // MathGlyphInfo empty
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial2.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_italics_correction (hb_font, glyph), ==, 0); // MathItalicsCorrectionInfo empty
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontFull.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_italics_correction (hb_font, glyph), ==, 0); // Glyph without italic correction.
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "A", -1, &glyph));
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_italics_correction (hb_font, glyph), ==, 394);
|
2016-09-26 20:12:48 +00:00
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "B", -1, &glyph));
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_italics_correction (hb_font, glyph), ==, 300);
|
2016-09-26 20:12:48 +00:00
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "C", -1, &glyph));
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_italics_correction (hb_font, glyph), ==, 904);
|
2016-09-26 20:12:48 +00:00
|
|
|
closeFont();
|
|
|
|
|
|
|
|
cleanupFreeType();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
test_get_glyph_top_accent_attachment (void)
|
|
|
|
{
|
|
|
|
hb_codepoint_t glyph;
|
|
|
|
initFreeType();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontEmpty.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_top_accent_attachment (hb_font, glyph), ==, 1000); // MathGlyphInfo not available
|
2016-09-26 20:12:48 +00:00
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial1.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_top_accent_attachment (hb_font, glyph), ==, 1000); // MathGlyphInfo empty
|
2016-09-26 20:12:48 +00:00
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial2.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_top_accent_attachment (hb_font, glyph), ==, 1000); // MathTopAccentAttachment empty
|
2016-09-26 20:12:48 +00:00
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontFull.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_top_accent_attachment (hb_font, glyph), ==, 1000); // Glyph without top accent attachment.
|
2016-09-26 20:12:48 +00:00
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "D", -1, &glyph));
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_top_accent_attachment (hb_font, glyph), ==, 748);
|
2016-09-26 20:12:48 +00:00
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "E", -1, &glyph));
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_top_accent_attachment (hb_font, glyph), ==, 692);
|
2016-09-26 20:12:48 +00:00
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "F", -1, &glyph));
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_top_accent_attachment (hb_font, glyph), ==, 636);
|
2016-09-26 20:12:48 +00:00
|
|
|
closeFont();
|
|
|
|
|
|
|
|
cleanupFreeType();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
test_is_glyph_extended_shape (void)
|
|
|
|
{
|
|
|
|
hb_codepoint_t glyph;
|
|
|
|
initFreeType();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontEmpty.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert(!hb_ot_math_is_glyph_extended_shape (hb_face, glyph)); // MathGlyphInfo not available
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial1.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert(!hb_ot_math_is_glyph_extended_shape (hb_face, glyph)); // MathGlyphInfo empty
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontFull.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "G", -1, &glyph));
|
|
|
|
g_assert(!hb_ot_math_is_glyph_extended_shape (hb_face, glyph));
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "H", -1, &glyph));
|
|
|
|
g_assert(hb_ot_math_is_glyph_extended_shape (hb_face, glyph));
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
cleanupFreeType();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
test_get_glyph_kerning (void)
|
|
|
|
{
|
|
|
|
hb_codepoint_t glyph;
|
|
|
|
initFreeType();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontEmpty.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0), ==, 0); // MathGlyphInfo not available
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0), ==, 0); // MathGlyphInfo not available
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0), ==, 0); // MathGlyphInfo not available
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 0), ==, 0); // MathGlyphInfo not available
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial2.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0), ==, 0); // MathKernInfo empty
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0), ==, 0); // MathKernInfo empty
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0), ==, 0); // MathKernInfo empty
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 0), ==, 0); // MathKernInfo empty
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial3.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0), ==, 0); // MathKernInfoRecords empty
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0), ==, 0); // MathKernInfoRecords empty
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0), ==, 0); // MathKernInfoRecords empty
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 0), ==, 0); // MathKernInfoRecords empty
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontFull.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "I", -1, &glyph));
|
|
|
|
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 7), ==, 62); // lower than min heigth
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 14), ==, 62); // equal to min height
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 20), ==, 104);
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 23), ==, 104);
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 31), ==, 146);
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 32), ==, 146);
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 86), ==, 398); // equal to max height
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 91), ==, 440); // larger than max height
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 96), ==, 440); // larger than max height
|
|
|
|
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 39), ==, 188); // top right
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 39), ==, 110); // top left
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 39), ==, 44); // bottom right
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 39), ==, 100); // bottom left
|
2016-09-26 20:12:48 +00:00
|
|
|
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
cleanupFreeType();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-09-26 20:18:41 +00:00
|
|
|
static hb_position_t
|
|
|
|
get_glyph_assembly_italics_correction (hb_font_t *font,
|
|
|
|
hb_codepoint_t glyph,
|
|
|
|
hb_bool_t horizontal)
|
|
|
|
{
|
|
|
|
hb_position_t corr;
|
|
|
|
hb_ot_math_get_glyph_assembly (font, glyph,
|
|
|
|
horizontal ? HB_DIRECTION_LTR : HB_DIRECTION_TTB,
|
2016-09-27 09:30:44 +00:00
|
|
|
0, NULL, NULL,
|
2016-09-26 20:18:41 +00:00
|
|
|
&corr);
|
|
|
|
return corr;
|
|
|
|
}
|
|
|
|
|
2016-09-27 11:18:00 +00:00
|
|
|
static void
|
2016-09-26 20:18:41 +00:00
|
|
|
test_get_glyph_assembly_italics_correction (void)
|
2016-09-26 20:12:48 +00:00
|
|
|
{
|
|
|
|
hb_codepoint_t glyph;
|
|
|
|
initFreeType();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontEmpty.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
2016-09-26 20:18:41 +00:00
|
|
|
g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, TRUE), ==, 0); // MathVariants not available
|
|
|
|
g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, FALSE), ==, 0); // MathVariants not available
|
2016-09-26 20:12:48 +00:00
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial1.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
2016-09-26 20:18:41 +00:00
|
|
|
g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, TRUE), ==, 0); // VertGlyphCoverage and HorizGlyphCoverage absent
|
|
|
|
g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, FALSE), ==, 0); // VertGlyphCoverage and HorizGlyphCoverage absent
|
2016-09-26 20:12:48 +00:00
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial2.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
2016-09-26 20:18:41 +00:00
|
|
|
g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, TRUE), ==, 0); // VertGlyphCoverage and HorizGlyphCoverage empty
|
|
|
|
g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, FALSE), ==, 0); // VertGlyphCoverage and HorizGlyphCoverage empty
|
2016-09-26 20:12:48 +00:00
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial3.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
2016-09-26 20:18:41 +00:00
|
|
|
g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, TRUE), ==, 0); // HorizGlyphConstruction and VertGlyphConstruction empty
|
|
|
|
g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, FALSE), ==, 0); // HorizGlyphConstruction and VertGlyphConstruction empty
|
2016-09-26 20:12:48 +00:00
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial4.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
2016-09-26 20:18:41 +00:00
|
|
|
g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, TRUE), ==, 0);
|
|
|
|
g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, FALSE), ==, 0);
|
2016-09-26 20:12:48 +00:00
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontFull.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "arrowleft", -1, &glyph));
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, TRUE), ==, 248);
|
2016-09-26 20:18:41 +00:00
|
|
|
g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, FALSE), ==, 0);
|
2016-09-26 20:12:48 +00:00
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "arrowup", -1, &glyph));
|
2016-09-26 20:18:41 +00:00
|
|
|
g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, TRUE), ==, 0);
|
2016-09-27 09:02:08 +00:00
|
|
|
g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, FALSE), ==, 662);
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
cleanupFreeType();
|
|
|
|
}
|
|
|
|
|
2016-09-27 11:18:00 +00:00
|
|
|
static void
|
2016-09-27 09:02:08 +00:00
|
|
|
test_get_min_connector_overlap (void)
|
|
|
|
{
|
|
|
|
initFreeType();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontEmpty.otf");
|
2018-07-11 14:44:21 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_min_connector_overlap(hb_font, HB_DIRECTION_LTR), ==, 0); // MathVariants not available
|
|
|
|
g_assert_cmpint(hb_ot_math_get_min_connector_overlap(hb_font, HB_DIRECTION_TTB), ==, 0); // MathVariants not available
|
2016-09-27 09:02:08 +00:00
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial1.otf");
|
|
|
|
g_assert_cmpint(hb_ot_math_get_min_connector_overlap(hb_font, HB_DIRECTION_LTR), ==, 108);
|
|
|
|
g_assert_cmpint(hb_ot_math_get_min_connector_overlap(hb_font, HB_DIRECTION_TTB), ==, 54);
|
2016-09-26 20:12:48 +00:00
|
|
|
closeFont();
|
|
|
|
|
|
|
|
cleanupFreeType();
|
|
|
|
}
|
|
|
|
|
2016-09-27 11:18:00 +00:00
|
|
|
static void
|
|
|
|
test_get_glyph_variants (void)
|
|
|
|
{
|
|
|
|
hb_codepoint_t glyph;
|
2017-01-20 00:50:29 +00:00
|
|
|
hb_ot_math_glyph_variant_t variants[20];
|
|
|
|
unsigned variantsSize = sizeof (variants) / sizeof (variants[0]);
|
|
|
|
unsigned int count;
|
|
|
|
unsigned int offset = 0;
|
|
|
|
|
2016-09-27 11:18:00 +00:00
|
|
|
initFreeType();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontEmpty.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL), ==, 0);
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL), ==, 0);
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial1.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL), ==, 0);
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL), ==, 0);
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial2.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL), ==, 0);
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL), ==, 0);
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial3.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL), ==, 0);
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL), ==, 0);
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial4.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL), ==, 0);
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL), ==, 0);
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontFull.otf");
|
|
|
|
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "arrowleft", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font,
|
2019-08-24 13:27:14 +00:00
|
|
|
glyph,
|
|
|
|
HB_DIRECTION_BTT,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
NULL), ==, 0);
|
2016-09-27 11:18:00 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font,
|
2019-08-24 13:27:14 +00:00
|
|
|
glyph,
|
|
|
|
HB_DIRECTION_RTL,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
NULL), ==, 3);
|
2016-09-27 11:18:00 +00:00
|
|
|
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "arrowup", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font,
|
2019-08-24 13:27:14 +00:00
|
|
|
glyph,
|
|
|
|
HB_DIRECTION_BTT,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
NULL), ==, 4);
|
2016-09-27 11:18:00 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font,
|
2019-08-24 13:27:14 +00:00
|
|
|
glyph,
|
|
|
|
HB_DIRECTION_RTL,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
NULL), ==, 0);
|
2016-09-27 11:18:00 +00:00
|
|
|
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "arrowleft", -1, &glyph));
|
|
|
|
do {
|
|
|
|
count = variantsSize;
|
|
|
|
hb_ot_math_get_glyph_variants (hb_font,
|
2019-08-24 13:27:14 +00:00
|
|
|
glyph,
|
|
|
|
HB_DIRECTION_RTL,
|
|
|
|
offset,
|
|
|
|
&count,
|
|
|
|
variants);
|
2016-09-27 11:18:00 +00:00
|
|
|
offset += count;
|
|
|
|
} while (count == variantsSize);
|
|
|
|
g_assert_cmpint(offset, ==, 3);
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "uni2190_size2", -1, &glyph));
|
|
|
|
g_assert_cmpint(variants[0].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(variants[0].advance, ==, 4302);
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "uni2190_size3", -1, &glyph));
|
|
|
|
g_assert_cmpint(variants[1].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(variants[1].advance, ==, 4802);
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "uni2190_size4", -1, &glyph));
|
|
|
|
g_assert_cmpint(variants[2].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(variants[2].advance, ==, 5802);
|
|
|
|
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "arrowup", -1, &glyph));
|
|
|
|
offset = 0;
|
|
|
|
do {
|
|
|
|
count = variantsSize;
|
|
|
|
hb_ot_math_get_glyph_variants (hb_font,
|
2019-08-24 13:27:14 +00:00
|
|
|
glyph,
|
|
|
|
HB_DIRECTION_BTT,
|
|
|
|
offset,
|
|
|
|
&count,
|
|
|
|
variants);
|
2016-09-27 11:18:00 +00:00
|
|
|
offset += count;
|
|
|
|
} while (count == variantsSize);
|
|
|
|
g_assert_cmpint(offset, ==, 4);
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "uni2191_size2", -1, &glyph));
|
|
|
|
g_assert_cmpint(variants[0].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(variants[0].advance, ==, 2251);
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "uni2191_size3", -1, &glyph));
|
|
|
|
g_assert_cmpint(variants[1].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(variants[1].advance, ==, 2501);
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "uni2191_size4", -1, &glyph));
|
|
|
|
g_assert_cmpint(variants[2].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(variants[2].advance, ==, 3001);
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "uni2191_size5", -1, &glyph));
|
|
|
|
g_assert_cmpint(variants[3].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(variants[3].advance, ==, 3751);
|
|
|
|
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
cleanupFreeType();
|
|
|
|
}
|
|
|
|
|
2016-09-27 11:53:34 +00:00
|
|
|
static void
|
|
|
|
test_get_glyph_assembly (void)
|
|
|
|
{
|
|
|
|
hb_codepoint_t glyph;
|
2017-01-20 00:50:29 +00:00
|
|
|
hb_ot_math_glyph_part_t parts[20];
|
|
|
|
unsigned partsSize = sizeof (parts) / sizeof (parts[0]);
|
|
|
|
unsigned int count;
|
|
|
|
unsigned int offset = 0;
|
|
|
|
|
2016-09-27 11:53:34 +00:00
|
|
|
initFreeType();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontEmpty.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL, NULL), ==, 0);
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL, NULL), ==, 0);
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial1.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL, NULL), ==, 0);
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL, NULL), ==, 0);
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial2.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL, NULL), ==, 0);
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL, NULL), ==, 0);
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial3.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL, NULL), ==, 0);
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL, NULL), ==, 0);
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontPartial4.otf");
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL, NULL), ==, 0);
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL, NULL), ==, 0);
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
openFont("fonts/MathTestFontFull.otf");
|
|
|
|
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "arrowright", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font,
|
2019-08-24 13:27:14 +00:00
|
|
|
glyph,
|
|
|
|
HB_DIRECTION_BTT,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL), ==, 0);
|
2016-09-27 11:53:34 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font,
|
2019-08-24 13:27:14 +00:00
|
|
|
glyph,
|
|
|
|
HB_DIRECTION_RTL,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL), ==, 3);
|
2016-09-27 11:53:34 +00:00
|
|
|
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "arrowdown", -1, &glyph));
|
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font,
|
2019-08-24 13:27:14 +00:00
|
|
|
glyph,
|
|
|
|
HB_DIRECTION_BTT,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL), ==, 5);
|
2016-09-27 11:53:34 +00:00
|
|
|
g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font,
|
2019-08-24 13:27:14 +00:00
|
|
|
glyph,
|
|
|
|
HB_DIRECTION_RTL,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL), ==, 0);
|
2016-09-27 11:53:34 +00:00
|
|
|
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "arrowright", -1, &glyph));
|
|
|
|
do {
|
|
|
|
count = partsSize;
|
|
|
|
hb_ot_math_get_glyph_assembly (hb_font,
|
2019-08-24 13:27:14 +00:00
|
|
|
glyph,
|
|
|
|
HB_DIRECTION_RTL,
|
|
|
|
offset,
|
|
|
|
&count,
|
|
|
|
parts,
|
|
|
|
NULL);
|
2016-09-27 11:53:34 +00:00
|
|
|
offset += count;
|
|
|
|
} while (count == partsSize);
|
|
|
|
g_assert_cmpint(offset, ==, 3);
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "left", -1, &glyph));
|
|
|
|
g_assert_cmpint(parts[0].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(parts[0].start_connector_length, ==, 800);
|
|
|
|
g_assert_cmpint(parts[0].end_connector_length, ==, 384);
|
|
|
|
g_assert_cmpint(parts[0].full_advance, ==, 2000);
|
2019-05-30 15:26:17 +00:00
|
|
|
g_assert(!(parts[0].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER));
|
2016-09-27 11:53:34 +00:00
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "horizontal", -1, &glyph));
|
|
|
|
g_assert_cmpint(parts[1].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(parts[1].start_connector_length, ==, 524);
|
|
|
|
g_assert_cmpint(parts[1].end_connector_length, ==, 800);
|
|
|
|
g_assert_cmpint(parts[1].full_advance, ==, 2000);
|
2019-05-30 15:26:17 +00:00
|
|
|
g_assert(parts[1].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER);
|
2016-09-27 11:53:34 +00:00
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "right", -1, &glyph));
|
|
|
|
g_assert_cmpint(parts[2].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(parts[2].start_connector_length, ==, 316);
|
|
|
|
g_assert_cmpint(parts[2].end_connector_length, ==, 454);
|
|
|
|
g_assert_cmpint(parts[2].full_advance, ==, 2000);
|
2019-05-30 15:26:17 +00:00
|
|
|
g_assert(!(parts[2].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER));
|
2016-09-27 11:53:34 +00:00
|
|
|
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "arrowdown", -1, &glyph));
|
|
|
|
offset = 0;
|
|
|
|
do {
|
|
|
|
count = partsSize;
|
|
|
|
hb_ot_math_get_glyph_assembly (hb_font,
|
2019-08-24 13:27:14 +00:00
|
|
|
glyph,
|
|
|
|
HB_DIRECTION_BTT,
|
|
|
|
offset,
|
|
|
|
&count,
|
|
|
|
parts,
|
|
|
|
NULL);
|
2016-09-27 11:53:34 +00:00
|
|
|
offset += count;
|
|
|
|
} while (count == partsSize);
|
|
|
|
g_assert_cmpint(offset, ==, 5);
|
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "bottom", -1, &glyph));
|
|
|
|
g_assert_cmpint(parts[0].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(parts[0].start_connector_length, ==, 365);
|
|
|
|
g_assert_cmpint(parts[0].end_connector_length, ==, 158);
|
|
|
|
g_assert_cmpint(parts[0].full_advance, ==, 1000);
|
2019-05-30 15:26:17 +00:00
|
|
|
g_assert(!(parts[0].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER));
|
2016-09-27 11:53:34 +00:00
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "vertical", -1, &glyph));
|
|
|
|
g_assert_cmpint(parts[1].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(parts[1].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(parts[1].start_connector_length, ==, 227);
|
|
|
|
g_assert_cmpint(parts[1].end_connector_length, ==, 365);
|
|
|
|
g_assert_cmpint(parts[1].full_advance, ==, 1000);
|
2019-05-30 15:26:17 +00:00
|
|
|
g_assert(parts[1].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER);
|
2016-09-27 11:53:34 +00:00
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "center", -1, &glyph));
|
|
|
|
g_assert_cmpint(parts[2].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(parts[2].start_connector_length, ==, 54);
|
|
|
|
g_assert_cmpint(parts[2].end_connector_length, ==, 158);
|
|
|
|
g_assert_cmpint(parts[2].full_advance, ==, 1000);
|
2019-05-30 15:26:17 +00:00
|
|
|
g_assert(!(parts[2].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER));
|
2016-09-27 11:53:34 +00:00
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "vertical", -1, &glyph));
|
|
|
|
g_assert_cmpint(parts[3].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(parts[3].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(parts[3].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(parts[3].start_connector_length, ==, 400);
|
|
|
|
g_assert_cmpint(parts[3].end_connector_length, ==, 296);
|
|
|
|
g_assert_cmpint(parts[3].full_advance, ==, 1000);
|
2019-05-30 15:26:17 +00:00
|
|
|
g_assert(parts[1].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER);
|
2016-09-27 11:53:34 +00:00
|
|
|
g_assert(hb_font_get_glyph_from_name (hb_font, "top", -1, &glyph));
|
|
|
|
g_assert_cmpint(parts[4].glyph, ==, glyph);
|
|
|
|
g_assert_cmpint(parts[4].start_connector_length, ==, 123);
|
|
|
|
g_assert_cmpint(parts[4].end_connector_length, ==, 192);
|
|
|
|
g_assert_cmpint(parts[4].full_advance, ==, 1000);
|
2019-05-30 15:26:17 +00:00
|
|
|
g_assert(!(parts[4].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER));
|
2016-09-27 11:53:34 +00:00
|
|
|
|
|
|
|
closeFont();
|
|
|
|
|
|
|
|
cleanupFreeType();
|
|
|
|
}
|
|
|
|
|
2016-09-26 20:12:48 +00:00
|
|
|
int
|
|
|
|
main (int argc, char **argv)
|
|
|
|
{
|
|
|
|
hb_test_init (&argc, &argv);
|
|
|
|
|
|
|
|
hb_test_add (test_has_data);
|
|
|
|
hb_test_add (test_get_constant);
|
|
|
|
hb_test_add (test_get_glyph_italics_correction);
|
|
|
|
hb_test_add (test_get_glyph_top_accent_attachment);
|
|
|
|
hb_test_add (test_is_glyph_extended_shape);
|
|
|
|
hb_test_add (test_get_glyph_kerning);
|
2016-09-26 20:18:41 +00:00
|
|
|
hb_test_add (test_get_glyph_assembly_italics_correction);
|
2016-09-27 09:02:08 +00:00
|
|
|
hb_test_add (test_get_min_connector_overlap);
|
2016-09-27 11:18:00 +00:00
|
|
|
hb_test_add (test_get_glyph_variants);
|
2016-09-27 11:53:34 +00:00
|
|
|
hb_test_add (test_get_glyph_assembly);
|
2016-09-26 20:12:48 +00:00
|
|
|
|
|
|
|
return hb_test_run();
|
|
|
|
}
|