1da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod/*
2da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * Copyright © 2011  Google, Inc.
3da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod *
4da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod *  This is part of HarfBuzz, a text shaping library.
5da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod *
6da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * Permission is hereby granted, without written agreement and without
7da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this
8da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * software and its documentation for any purpose, provided that the
9da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * above copyright notice and the following two paragraphs appear in
10da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * all copies of this software.
11da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod *
12da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * DAMAGE.
17da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod *
18da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod *
24da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod * Google Author(s): Behdad Esfahbod
25da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod */
26da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod
27da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod#include "hb-test.h"
28da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod
29da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod/* Unit tests for hb-font.h */
30da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod
31da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod
322ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbodstatic const char test_data[] = "test\0data";
332ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
342ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
35da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbodstatic void
36da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbodtest_face_empty (void)
37da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod{
38da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod  g_assert (hb_face_get_empty ());
39da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod  g_assert (hb_face_get_empty () == hb_face_create (hb_blob_get_empty (), 0));
40da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod  g_assert (hb_face_get_empty () == hb_face_create (NULL, 0));
4174d9fa3d9ac226ed72702884e721ef94ecc48e22Behdad Esfahbod
422ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  g_assert (hb_face_reference_table (hb_face_get_empty (), HB_TAG ('h','e','a','d')) == hb_blob_get_empty ());
432ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
442ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  g_assert_cmpint (hb_face_get_upem (hb_face_get_empty ()), ==, 1000);
45da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod}
46da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod
47da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbodstatic void
482ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbodtest_face_create (void)
492ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod{
502ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  hb_face_t *face;
512ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  hb_blob_t *blob;
522ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
532ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  blob = hb_blob_create (test_data, sizeof (test_data), HB_MEMORY_MODE_READONLY, NULL, NULL);
542ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  face = hb_face_create (blob, 0);
552ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  hb_blob_destroy (blob);
562ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
572ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  g_assert (hb_face_reference_table (face, HB_TAG ('h','e','a','d')) == hb_blob_get_empty ());
582ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
592ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  g_assert_cmpint (hb_face_get_upem (face), ==, 1000);
602ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
612ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  hb_face_destroy (face);
622ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod}
632ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
642ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
652ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbodstatic void
66ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbodfree_up (void *user_data)
67ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod{
68ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod  int *freed = (int *) user_data;
69ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod
70ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod  g_assert (!*freed);
71ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod
72ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod  (*freed)++;
73ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod}
74ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod
75ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbodstatic hb_blob_t *
767033518f756490e9cf00b96387fee6f2f7fae785Behdad Esfahbodget_table (hb_face_t *face, hb_tag_t tag, void *user_data)
77ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod{
782ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  if (tag == HB_TAG ('a','b','c','d'))
792ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod    return hb_blob_create (test_data, sizeof (test_data), HB_MEMORY_MODE_READONLY, NULL, NULL);
802ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
81ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod  return hb_blob_get_empty ();
82ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod}
83ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod
84ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbodstatic void
852ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbodtest_face_createfortables (void)
86ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod{
87ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod  hb_face_t *face;
882ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  hb_blob_t *blob;
892ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  const char *data;
902ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  unsigned int len;
91ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod  int freed = 0;
92ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod
93ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod  face = hb_face_create_for_tables (get_table, &freed, free_up);
94ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod  g_assert (!freed);
95ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod
962ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  g_assert (hb_face_reference_table (face, HB_TAG ('h','e','a','d')) == hb_blob_get_empty ());
972ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
982ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  blob = hb_face_reference_table (face, HB_TAG ('a','b','c','d'));
992ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  g_assert (blob != hb_blob_get_empty ());
1002ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
1012ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  data = hb_blob_get_data (blob, &len);
1022ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  g_assert_cmpint (len, ==, sizeof (test_data));
1032ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  g_assert (0 == memcmp (data, test_data, sizeof (test_data)));
1042ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  hb_blob_destroy (blob);
1052ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
1062ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  g_assert_cmpint (hb_face_get_upem (face), ==, 1000);
1072ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
108ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod  hb_face_destroy (face);
109ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod  g_assert (freed);
110ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod}
111ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod
11214f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbodstatic void
11314f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod_test_font_nil_funcs (hb_font_t *font)
11414f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod{
1150fd8c2f1be693616f19f2f1526369874763d6cf6Behdad Esfahbod  hb_codepoint_t glyph;
11614f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  hb_position_t x, y;
11714f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  hb_glyph_extents_t extents;
11814f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
11914f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  x = y = 13;
120d31691296f7d3051fcd345bf1325d17835484b50Behdad Esfahbod  g_assert (!hb_font_get_glyph_contour_point (font, 17, 2, &x, &y));
12114f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  g_assert_cmpint (x, ==, 0);
12214f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  g_assert_cmpint (y, ==, 0);
12314f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
1242d8ebcb9d089c2cfbefac71ca6350e2703ab13e3Behdad Esfahbod  x = hb_font_get_glyph_h_advance (font, 17);
12514f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  g_assert_cmpint (x, ==, 0);
12614f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
12714f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  extents.x_bearing = extents.y_bearing = 13;
12814f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  extents.width = extents.height = 15;
129d31691296f7d3051fcd345bf1325d17835484b50Behdad Esfahbod  hb_font_get_glyph_extents (font, 17, &extents);
13014f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  g_assert_cmpint (extents.x_bearing, ==, 0);
13114f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  g_assert_cmpint (extents.y_bearing, ==, 0);
13214f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  g_assert_cmpint (extents.width, ==, 0);
13314f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  g_assert_cmpint (extents.height, ==, 0);
13414f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
1350fd8c2f1be693616f19f2f1526369874763d6cf6Behdad Esfahbod  glyph = 3;
1360fd8c2f1be693616f19f2f1526369874763d6cf6Behdad Esfahbod  g_assert (!hb_font_get_glyph (font, 17, 2, &glyph));
1370fd8c2f1be693616f19f2f1526369874763d6cf6Behdad Esfahbod  g_assert_cmpint (glyph, ==, 0);
13814f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
1392d8ebcb9d089c2cfbefac71ca6350e2703ab13e3Behdad Esfahbod  x = hb_font_get_glyph_h_kerning (font, 17, 19);
14014f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  g_assert_cmpint (x, ==, 0);
14114f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod}
14214f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
14314f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbodstatic void
14414f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod_test_fontfuncs_nil (hb_font_funcs_t *ffuncs)
14514f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod{
14614f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  hb_blob_t *blob;
14714f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  hb_face_t *face;
14814f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  hb_font_t *font;
14914f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  hb_font_t *subfont;
15014f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  int freed = 0;
15114f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
15214f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  blob = hb_blob_create (test_data, sizeof (test_data), HB_MEMORY_MODE_READONLY, NULL, NULL);
15314f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  face = hb_face_create (blob, 0);
15414f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  hb_blob_destroy (blob);
1557fc5a30cb4fbe9a4633ab842b0a8cbbcc6f6bd1bBehdad Esfahbod  g_assert (!hb_face_is_immutable (face));
15614f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  font = hb_font_create (face);
157744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod  g_assert (font);
1587fc5a30cb4fbe9a4633ab842b0a8cbbcc6f6bd1bBehdad Esfahbod  g_assert (hb_face_is_immutable (face));
15914f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  hb_face_destroy (face);
16014f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
16114f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
16214f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  hb_font_set_funcs (font, ffuncs, &freed, free_up);
16314f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  g_assert_cmpint (freed, ==, 0);
16414f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
16514f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  _test_font_nil_funcs (font);
16614f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
16714f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  subfont = hb_font_create_sub_font (font);
168744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod  g_assert (subfont);
16914f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
17014f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  g_assert_cmpint (freed, ==, 0);
17114f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  hb_font_destroy (font);
17214f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  g_assert_cmpint (freed, ==, 0);
17314f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
17414f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  _test_font_nil_funcs (subfont);
17514f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
17614f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  hb_font_destroy (subfont);
17714f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  g_assert_cmpint (freed, ==, 1);
17814f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod}
179ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod
180ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbodstatic void
181ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbodtest_fontfuncs_empty (void)
182da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod{
183da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod  g_assert (hb_font_funcs_get_empty ());
184da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod  g_assert (hb_font_funcs_is_immutable (hb_font_funcs_get_empty ()));
18514f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  _test_fontfuncs_nil (hb_font_funcs_get_empty ());
186da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod}
187da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod
188da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbodstatic void
189f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbodtest_fontfuncs_nil (void)
1902ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod{
19114f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  hb_font_funcs_t *ffuncs;
19214f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
19314f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  ffuncs = hb_font_funcs_create ();
19414f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
19514f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  g_assert (!hb_font_funcs_is_immutable (ffuncs));
19614f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  _test_fontfuncs_nil (hb_font_funcs_get_empty ());
19714f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod
19814f1e81b77971204e9325e2a8b6f8b690fac20a7Behdad Esfahbod  hb_font_funcs_destroy (ffuncs);
1992ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod}
2002ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
201f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbodstatic hb_bool_t
202f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbodcontour_point_func1 (hb_font_t *font, void *font_data,
203f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod		     hb_codepoint_t glyph, unsigned int point_index,
204f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod		     hb_position_t *x, hb_position_t *y,
205f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod		     void *user_data)
206f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod{
207f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  if (glyph == 1) {
208f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod    *x = 2;
209f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod    *y = 3;
210f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod    return TRUE;
211f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  }
212f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  if (glyph == 2) {
213f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod    *x = 4;
214f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod    *y = 5;
215f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod    return TRUE;
216f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  }
217f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
218f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  return FALSE;
219f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod}
220f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
221f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbodstatic hb_bool_t
222f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbodcontour_point_func2 (hb_font_t *font, void *font_data,
223f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod		     hb_codepoint_t glyph, unsigned int point_index,
224f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod		     hb_position_t *x, hb_position_t *y,
225f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod		     void *user_data)
226f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod{
227f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  if (glyph == 1) {
228f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod    *x = 6;
229f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod    *y = 7;
230f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod    return TRUE;
231f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  }
232f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
233d31691296f7d3051fcd345bf1325d17835484b50Behdad Esfahbod  return hb_font_get_glyph_contour_point (hb_font_get_parent (font),
234d31691296f7d3051fcd345bf1325d17835484b50Behdad Esfahbod					  glyph, point_index, x, y);
235f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod}
236f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
2372d8ebcb9d089c2cfbefac71ca6350e2703ab13e3Behdad Esfahbodstatic hb_position_t
238744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbodglyph_h_advance_func1 (hb_font_t *font, void *font_data,
239744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod		       hb_codepoint_t glyph,
240744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod		       void *user_data)
241f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod{
2422d8ebcb9d089c2cfbefac71ca6350e2703ab13e3Behdad Esfahbod  if (glyph == 1)
2432d8ebcb9d089c2cfbefac71ca6350e2703ab13e3Behdad Esfahbod    return 8;
2442d8ebcb9d089c2cfbefac71ca6350e2703ab13e3Behdad Esfahbod
2452d8ebcb9d089c2cfbefac71ca6350e2703ab13e3Behdad Esfahbod  return 0;
246f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod}
247f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
248f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbodstatic void
249f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbodtest_fontfuncs_subclassing (void)
250f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod{
251f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_blob_t *blob;
252f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_face_t *face;
253f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
254f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_font_funcs_t *ffuncs1;
255f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_font_funcs_t *ffuncs2;
256f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
257f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_font_t *font1;
258f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_font_t *font2;
259f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_font_t *font3;
260f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
261f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_position_t x;
262f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_position_t y;
263f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
264f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  blob = hb_blob_create (test_data, sizeof (test_data), HB_MEMORY_MODE_READONLY, NULL, NULL);
265f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  face = hb_face_create (blob, 0);
266f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_blob_destroy (blob);
267f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  font1 = hb_font_create (face);
268f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_face_destroy (face);
269f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_font_set_scale (font1, 10, 10);
270f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
271f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  /* setup font1 */
272f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  ffuncs1 = hb_font_funcs_create ();
273d31691296f7d3051fcd345bf1325d17835484b50Behdad Esfahbod  hb_font_funcs_set_glyph_contour_point_func (ffuncs1, contour_point_func1, NULL, NULL);
274744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod  hb_font_funcs_set_glyph_h_advance_func (ffuncs1, glyph_h_advance_func1, NULL, NULL);
275f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_font_set_funcs (font1, ffuncs1, NULL, NULL);
276f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_font_funcs_destroy (ffuncs1);
277f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
278f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  x = y = 1;
279d31691296f7d3051fcd345bf1325d17835484b50Behdad Esfahbod  g_assert (hb_font_get_glyph_contour_point_for_origin (font1, 1, 2, HB_DIRECTION_LTR, &x, &y));
280f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (x, ==, 2);
281f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (y, ==, 3);
282d31691296f7d3051fcd345bf1325d17835484b50Behdad Esfahbod  g_assert (hb_font_get_glyph_contour_point_for_origin (font1, 2, 5, HB_DIRECTION_LTR, &x, &y));
283f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (x, ==, 4);
284f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (y, ==, 5);
285d31691296f7d3051fcd345bf1325d17835484b50Behdad Esfahbod  g_assert (!hb_font_get_glyph_contour_point_for_origin (font1, 3, 7, HB_DIRECTION_RTL, &x, &y));
286f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (x, ==, 0);
287f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (y, ==, 0);
2882d8ebcb9d089c2cfbefac71ca6350e2703ab13e3Behdad Esfahbod  x = hb_font_get_glyph_h_advance (font1, 1);
289f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (x, ==, 8);
2902d8ebcb9d089c2cfbefac71ca6350e2703ab13e3Behdad Esfahbod  x = hb_font_get_glyph_h_advance (font1, 2);
291f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (x, ==, 0);
292f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
293f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
294f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  font2 = hb_font_create_sub_font (font1);
295f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert (hb_font_is_immutable (font1));
296f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_font_destroy (font1);
297f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
298f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  /* setup font2 to override some funcs */
299f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  ffuncs2 = hb_font_funcs_create ();
300d31691296f7d3051fcd345bf1325d17835484b50Behdad Esfahbod  hb_font_funcs_set_glyph_contour_point_func (ffuncs2, contour_point_func2, NULL, NULL);
301f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_font_set_funcs (font2, ffuncs2, NULL, NULL);
302f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_font_funcs_destroy (ffuncs2);
303f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
304f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  x = y = 1;
305d31691296f7d3051fcd345bf1325d17835484b50Behdad Esfahbod  g_assert (hb_font_get_glyph_contour_point_for_origin (font2, 1, 2, HB_DIRECTION_LTR, &x, &y));
306f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (x, ==, 6);
307f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (y, ==, 7);
308d31691296f7d3051fcd345bf1325d17835484b50Behdad Esfahbod  g_assert (hb_font_get_glyph_contour_point_for_origin (font2, 2, 5, HB_DIRECTION_RTL, &x, &y));
309f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (x, ==, 4);
310f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (y, ==, 5);
311d31691296f7d3051fcd345bf1325d17835484b50Behdad Esfahbod  g_assert (!hb_font_get_glyph_contour_point_for_origin (font2, 3, 7, HB_DIRECTION_LTR, &x, &y));
312f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (x, ==, 0);
313f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (y, ==, 0);
3142d8ebcb9d089c2cfbefac71ca6350e2703ab13e3Behdad Esfahbod  x = hb_font_get_glyph_h_advance (font2, 1);
315f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (x, ==, 8);
3162d8ebcb9d089c2cfbefac71ca6350e2703ab13e3Behdad Esfahbod  x = hb_font_get_glyph_h_advance (font2, 2);
317f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (x, ==, 0);
318f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
319f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
320f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  font3 = hb_font_create_sub_font (font2);
321f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert (hb_font_is_immutable (font2));
322f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_font_destroy (font2);
323f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
324f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  /* setup font3 to override scale */
325f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_font_set_scale (font3, 20, 30);
326f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
327f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  x = y = 1;
328d31691296f7d3051fcd345bf1325d17835484b50Behdad Esfahbod  g_assert (hb_font_get_glyph_contour_point_for_origin (font3, 1, 2, HB_DIRECTION_RTL, &x, &y));
329f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (x, ==, 6*2);
330f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (y, ==, 7*3);
331d31691296f7d3051fcd345bf1325d17835484b50Behdad Esfahbod  g_assert (hb_font_get_glyph_contour_point_for_origin (font3, 2, 5, HB_DIRECTION_LTR, &x, &y));
332f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (x, ==, 4*2);
333f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (y, ==, 5*3);
334d31691296f7d3051fcd345bf1325d17835484b50Behdad Esfahbod  g_assert (!hb_font_get_glyph_contour_point_for_origin (font3, 3, 7, HB_DIRECTION_LTR, &x, &y));
335f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (x, ==, 0*2);
336f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (y, ==, 0*3);
3372d8ebcb9d089c2cfbefac71ca6350e2703ab13e3Behdad Esfahbod  x = hb_font_get_glyph_h_advance (font3, 1);
338f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (x, ==, 8*2);
3392d8ebcb9d089c2cfbefac71ca6350e2703ab13e3Behdad Esfahbod  x = hb_font_get_glyph_h_advance (font3, 2);
340f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  g_assert_cmpint (x, ==, 0*2);
341f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
342f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
343f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_font_destroy (font3);
344f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod}
345f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod
3462ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod
3472ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbodstatic void
348da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbodtest_font_empty (void)
349da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod{
350da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod  g_assert (hb_font_get_empty ());
351da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod  g_assert (hb_font_get_empty () == hb_font_create (hb_face_get_empty ()));
352da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod  g_assert (hb_font_get_empty () == hb_font_create (NULL));
353da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod  g_assert (hb_font_get_empty () == hb_font_create_sub_font (NULL));
354da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod  g_assert (hb_font_is_immutable (hb_font_get_empty ()));
35574d9fa3d9ac226ed72702884e721ef94ecc48e22Behdad Esfahbod
35674d9fa3d9ac226ed72702884e721ef94ecc48e22Behdad Esfahbod  g_assert (hb_font_get_face (hb_font_get_empty ()) == hb_face_get_empty ());
35774d9fa3d9ac226ed72702884e721ef94ecc48e22Behdad Esfahbod  g_assert (hb_font_get_parent (hb_font_get_empty ()) == NULL);
358da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod}
359da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod
360606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbodstatic void
361606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbodtest_font_properties (void)
362606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod{
363606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_blob_t *blob;
364606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_face_t *face;
365606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_t *font;
366cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  hb_font_t *subfont;
367606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  int x_scale, y_scale;
368606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  unsigned int x_ppem, y_ppem;
369606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
370606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  blob = hb_blob_create (test_data, sizeof (test_data), HB_MEMORY_MODE_READONLY, NULL, NULL);
371606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  face = hb_face_create (blob, 0);
372606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_blob_destroy (blob);
373606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  font = hb_font_create (face);
374606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_face_destroy (face);
375606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
376606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
377db9f4eb4e004fadae9d540522d1d21c3bbe659b0Behdad Esfahbod  g_assert (hb_font_get_face (font) == face);
378db9f4eb4e004fadae9d540522d1d21c3bbe659b0Behdad Esfahbod  g_assert (hb_font_get_parent (font) == NULL);
379db9f4eb4e004fadae9d540522d1d21c3bbe659b0Behdad Esfahbod
380db9f4eb4e004fadae9d540522d1d21c3bbe659b0Behdad Esfahbod
381606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  /* Check scale */
382606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
383606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_get_scale (font, NULL, NULL);
384606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  x_scale = y_scale = 13;
385606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_get_scale (font, &x_scale, NULL);
386606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (x_scale, ==, 0);
387606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  x_scale = y_scale = 13;
388606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_get_scale (font, NULL, &y_scale);
389606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (y_scale, ==, 0);
390606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  x_scale = y_scale = 13;
391606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_get_scale (font, &x_scale, &y_scale);
392606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (x_scale, ==, 0);
393606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (y_scale, ==, 0);
394606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
395606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_set_scale (font, 17, 19);
396606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
397606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  x_scale = y_scale = 13;
398606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_get_scale (font, &x_scale, &y_scale);
399606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (x_scale, ==, 17);
400606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (y_scale, ==, 19);
401606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
402606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
403606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  /* Check ppem */
404606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
405606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_get_ppem (font, NULL, NULL);
406606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  x_ppem = y_ppem = 13;
407606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_get_ppem (font, &x_ppem, NULL);
408606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (x_ppem, ==, 0);
409606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  x_ppem = y_ppem = 13;
410606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_get_ppem (font, NULL, &y_ppem);
411606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (y_ppem, ==, 0);
412606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  x_ppem = y_ppem = 13;
413606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_get_ppem (font, &x_ppem, &y_ppem);
414606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (x_ppem, ==, 0);
415606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (y_ppem, ==, 0);
416606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
417606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_set_ppem (font, 17, 19);
418606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
419606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  x_ppem = y_ppem = 13;
420606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_get_ppem (font, &x_ppem, &y_ppem);
421606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (x_ppem, ==, 17);
422606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (y_ppem, ==, 19);
423606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
424606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
425606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  /* Check immutable */
426606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
427606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert (!hb_font_is_immutable (font));
428606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_make_immutable (font);
429606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert (hb_font_is_immutable (font));
430606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
431606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_set_scale (font, 10, 12);
432606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  x_scale = y_scale = 13;
433606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_get_scale (font, &x_scale, &y_scale);
434606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (x_scale, ==, 17);
435606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (y_scale, ==, 19);
436606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
437606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_set_ppem (font, 10, 12);
438606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  x_ppem = y_ppem = 13;
439606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_get_ppem (font, &x_ppem, &y_ppem);
440606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (x_ppem, ==, 17);
441606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  g_assert_cmpint (y_ppem, ==, 19);
442606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
443606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
444cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  /* sub_font now */
445cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  subfont = hb_font_create_sub_font (font);
446606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_font_destroy (font);
447cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod
448cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  g_assert (hb_font_get_parent (subfont) == font);
449cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  g_assert (hb_font_get_face (subfont) == face);
450cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod
451cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  /* scale */
452cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  x_scale = y_scale = 13;
453cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  hb_font_get_scale (subfont, &x_scale, &y_scale);
454cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  g_assert_cmpint (x_scale, ==, 17);
455cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  g_assert_cmpint (y_scale, ==, 19);
456cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  hb_font_set_scale (subfont, 10, 12);
457cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  x_scale = y_scale = 13;
458cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  hb_font_get_scale (subfont, &x_scale, &y_scale);
459cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  g_assert_cmpint (x_scale, ==, 10);
460cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  g_assert_cmpint (y_scale, ==, 12);
461cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  x_scale = y_scale = 13;
462cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  hb_font_get_scale (font, &x_scale, &y_scale);
463cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  g_assert_cmpint (x_scale, ==, 17);
464cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  g_assert_cmpint (y_scale, ==, 19);
465cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod
466cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  /* ppem */
467cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  x_ppem = y_ppem = 13;
468cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  hb_font_get_ppem (subfont, &x_ppem, &y_ppem);
469cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  g_assert_cmpint (x_ppem, ==, 17);
470cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  g_assert_cmpint (y_ppem, ==, 19);
471cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  hb_font_set_ppem (subfont, 10, 12);
472cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  x_ppem = y_ppem = 13;
473cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  hb_font_get_ppem (subfont, &x_ppem, &y_ppem);
474cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  g_assert_cmpint (x_ppem, ==, 10);
475cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  g_assert_cmpint (y_ppem, ==, 12);
476cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  x_ppem = y_ppem = 13;
477cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  hb_font_get_ppem (font, &x_ppem, &y_ppem);
478cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  g_assert_cmpint (x_ppem, ==, 17);
479cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  g_assert_cmpint (y_ppem, ==, 19);
480cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod
481cdb153175f8a1521cde112c65b173f548ca6ee5cBehdad Esfahbod  hb_font_destroy (subfont);
482606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod}
483606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod
484da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbodint
485da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbodmain (int argc, char **argv)
486da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod{
487da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod  hb_test_init (&argc, &argv);
488da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod
489da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod  hb_test_add (test_face_empty);
4902ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  hb_test_add (test_face_create);
4912ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4Behdad Esfahbod  hb_test_add (test_face_createfortables);
492da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod
493ea93e7b27ca04a1655d62bd1d18a32805994af44Behdad Esfahbod  hb_test_add (test_fontfuncs_empty);
494f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_test_add (test_fontfuncs_nil);
495f2c1dd4f746c36a44cf33d0257a3cd800107c286Behdad Esfahbod  hb_test_add (test_fontfuncs_subclassing);
496da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod
497da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod  hb_test_add (test_font_empty);
498606923bb4304d5b9cf164745d657cba58949a80aBehdad Esfahbod  hb_test_add (test_font_properties);
499da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod
500da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod  return hb_test_run();
501da603e80386b41b360acb070a862b6ed87da57b8Behdad Esfahbod}
502