/*
 * Copyright © 2020  Ebrahim Byagowi
 *
 *  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.
 */

#include "hb-test.h"
#include <math.h>

#include <hb.h>

typedef struct draw_data_t
{
  char *str;
  unsigned size;
  unsigned consumed;
} draw_data_t;

/* Our modified itoa, why not using libc's? it is going to be used
   in harfbuzzjs where libc isn't available */
static void _hb_reverse (char *buf, unsigned int len)
{
  unsigned start = 0, end = len - 1;
  while (start < end)
  {
    char c = buf[end];
    buf[end] = buf[start];
    buf[start] = c;
    start++; end--;
  }
}
static unsigned _hb_itoa (float fnum, char *buf)
{
  int32_t num = (int32_t) floorf (fnum + .5f);
  unsigned int i = 0;
  hb_bool_t is_negative = num < 0;
  if (is_negative) num = -num;
  do
  {
    buf[i++] = '0' + num % 10;
    num /= 10;
  } while (num);
  if (is_negative) buf[i++] = '-';
  _hb_reverse (buf, i);
  buf[i] = '\0';
  return i;
}

#define ITOA_BUF_SIZE 12 // 10 digits in int32, 1 for negative sign, 1 for \0

static void
test_itoa (void)
{
  char s[] = "12345";
  _hb_reverse (s, 5);
  g_assert_cmpmem (s, 5, "54321", 5);

  {
    unsigned num = 12345;
    char buf[ITOA_BUF_SIZE];
    unsigned len = _hb_itoa (num, buf);
    g_assert_cmpmem (buf, len, "12345", 5);
  }

  {
    unsigned num = 3152;
    char buf[ITOA_BUF_SIZE];
    unsigned len = _hb_itoa (num, buf);
    g_assert_cmpmem (buf, len, "3152", 4);
  }

  {
    int num = -6457;
    char buf[ITOA_BUF_SIZE];
    unsigned len = _hb_itoa (num, buf);
    g_assert_cmpmem (buf, len, "-6457", 5);
  }
}

static void
move_to (HB_UNUSED hb_draw_funcs_t *dfuncs, draw_data_t *draw_data,
	 HB_UNUSED hb_draw_state_t *st,
	 float to_x, float to_y,
	 HB_UNUSED void *user_data)
{
  /* 4 = command character space + comma + array starts with 0 index + nul character space */
  if (draw_data->consumed + 2 * ITOA_BUF_SIZE + 4 > draw_data->size) return;
  draw_data->str[draw_data->consumed++] = 'M';
  draw_data->consumed += _hb_itoa (to_x, draw_data->str + draw_data->consumed);
  draw_data->str[draw_data->consumed++] = ',';
  draw_data->consumed += _hb_itoa (to_y, draw_data->str + draw_data->consumed);
}

static void
line_to (HB_UNUSED hb_draw_funcs_t *dfuncs, draw_data_t *draw_data,
	 HB_UNUSED hb_draw_state_t *st,
	 float to_x, float to_y,
	 HB_UNUSED void *user_data)
{
  if (draw_data->consumed + 2 * ITOA_BUF_SIZE + 4 > draw_data->size) return;
  draw_data->str[draw_data->consumed++] = 'L';
  draw_data->consumed += _hb_itoa (to_x, draw_data->str + draw_data->consumed);
  draw_data->str[draw_data->consumed++] = ',';
  draw_data->consumed += _hb_itoa (to_y, draw_data->str + draw_data->consumed);
}

static void
quadratic_to (HB_UNUSED hb_draw_funcs_t *dfuncs, draw_data_t *draw_data,
	      HB_UNUSED hb_draw_state_t *st,
	      float control_x, float control_y,
	      float to_x, float to_y,
	      HB_UNUSED void *user_data)
{

  if (draw_data->consumed + 4 * ITOA_BUF_SIZE + 6 > draw_data->size) return;
  draw_data->str[draw_data->consumed++] = 'Q';
  draw_data->consumed += _hb_itoa (control_x, draw_data->str + draw_data->consumed);
  draw_data->str[draw_data->consumed++] = ',';
  draw_data->consumed += _hb_itoa (control_y, draw_data->str + draw_data->consumed);
  draw_data->str[draw_data->consumed++] = ' ';
  draw_data->consumed += _hb_itoa (to_x, draw_data->str + draw_data->consumed);
  draw_data->str[draw_data->consumed++] = ',';
  draw_data->consumed += _hb_itoa (to_y, draw_data->str + draw_data->consumed);
}

static void
cubic_to (HB_UNUSED hb_draw_funcs_t *dfuncs, draw_data_t *draw_data,
	  HB_UNUSED hb_draw_state_t *st,
	  float control1_x, float control1_y,
	  float control2_x, float control2_y,
	  float to_x, float to_y,
	  HB_UNUSED void *user_data)
{
  if (draw_data->consumed + 6 * ITOA_BUF_SIZE + 8 > draw_data->size) return;
  draw_data->str[draw_data->consumed++] = 'C';
  draw_data->consumed += _hb_itoa (control1_x, draw_data->str + draw_data->consumed);
  draw_data->str[draw_data->consumed++] = ',';
  draw_data->consumed += _hb_itoa (control1_y, draw_data->str + draw_data->consumed);
  draw_data->str[draw_data->consumed++] = ' ';
  draw_data->consumed += _hb_itoa (control2_x, draw_data->str + draw_data->consumed);
  draw_data->str[draw_data->consumed++] = ',';
  draw_data->consumed += _hb_itoa (control2_y, draw_data->str + draw_data->consumed);
  draw_data->str[draw_data->consumed++] = ' ';
  draw_data->consumed += _hb_itoa (to_x, draw_data->str + draw_data->consumed);
  draw_data->str[draw_data->consumed++] = ',';
  draw_data->consumed += _hb_itoa (to_y, draw_data->str + draw_data->consumed);
}

static void
close_path (HB_UNUSED hb_draw_funcs_t *dfuncs, draw_data_t *draw_data,
	    HB_UNUSED hb_draw_state_t *st,
	    HB_UNUSED void *user_data)
{
  if (draw_data->consumed + 2 > draw_data->size) return;
  draw_data->str[draw_data->consumed++] = 'Z';
}

static hb_draw_funcs_t *funcs;
static hb_draw_funcs_t *funcs2; /* this one translates quadratic calls to cubic ones */

static void
test_hb_draw_empty (void)
{
  hb_font_draw_glyph (hb_font_get_empty (), 3, funcs, NULL);
}

static void
test_hb_draw_glyf (void)
{
  hb_face_t *face = hb_test_open_font_file ("fonts/SourceSerifVariable-Roman-VVAR.abc.ttf");
  hb_font_t *font = hb_font_create (face);
  hb_face_destroy (face);

  char str[1024];
  draw_data_t draw_data = {
    .str = str,
    .size = sizeof (str),
    .consumed = 0
  };

  draw_data.consumed = 0;
  hb_font_draw_glyph (font, 4, funcs, &draw_data);

  draw_data.consumed = 0;
  hb_font_draw_glyph (font, 3, funcs, &draw_data);
  char expected[] = "M275,442Q232,442 198,420Q164,397 145,353Q126,309 126,245"
		    "Q126,182 147,139Q167,95 204,73Q240,50 287,50Q330,50 367,70"
		    "Q404,90 427,128L451,116Q431,54 384,21Q336,-13 266,-13"
		    "Q198,-13 148,18Q97,48 70,104Q43,160 43,236Q43,314 76,371"
		    "Q108,427 160,457Q212,487 272,487Q316,487 354,470Q392,453 417,424"
		    "Q442,395 448,358Q441,321 403,321Q378,321 367,334"
		    "Q355,347 350,366L325,454L371,417Q346,430 321,436Q296,442 275,442Z";
  g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

  /* Test translating quadratic calls to cubic by a _draw_funcs_t that doesn't set the callback */
  draw_data.consumed = 0;
  hb_font_draw_glyph (font, 3, funcs2, &draw_data);
  char expected2[] = "M275,442C246,442 221,435 198,420C175,405 158,382 145,353"
		     "C132,324 126,288 126,245C126,203 133,168 147,139C160,110 179,88 204,73"
		     "C228,58 256,50 287,50C316,50 342,57 367,70C392,83 412,103 427,128"
		     "L451,116C438,75 415,43 384,21C352,-2 313,-13 266,-13C221,-13 181,-3 148,18"
		     "C114,38 88,67 70,104C52,141 43,185 43,236C43,288 54,333 76,371"
		     "C97,408 125,437 160,457C195,477 232,487 272,487C301,487 329,481 354,470"
		     "C379,459 400,443 417,424C434,405 444,383 448,358C443,333 428,321 403,321"
		     "C386,321 374,325 367,334C359,343 353,353 350,366L325,454L371,417"
		     "C354,426 338,432 321,436C304,440 289,442 275,442Z";
  g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);

  hb_variation_t var;
  var.tag = HB_TAG ('w','g','h','t');
  var.value = 800;
  hb_font_set_variations (font, &var, 1);

  draw_data.consumed = 0;
  hb_font_draw_glyph (font, 3, funcs, &draw_data);
  char expected3[] = "M323,448Q297,448 271,430Q244,412 226,371Q209,330 209,261"
		     "Q209,204 225,166Q242,127 272,107Q303,86 344,86Q378,86 404,101"
		     "Q430,115 451,137L488,103Q458,42 404,13Q350,-16 279,-16"
		     "Q211,-16 153,13Q95,41 60,98Q25,156 25,241Q25,323 62,382"
		     "Q99,440 163,470Q226,501 303,501Q357,501 399,480Q440,460 464,426"
		     "Q488,392 492,352Q475,297 420,297Q390,297 366,319Q342,342 339,401"
		     "L333,469L411,427Q387,438 367,443Q348,448 323,448Z";
  g_assert_cmpmem (str, draw_data.consumed, expected3, sizeof (expected3) - 1);

  hb_font_destroy (font);
}

static void
test_hb_draw_cff1 (void)
{
  hb_face_t *face = hb_test_open_font_file ("fonts/cff1_seac.otf");
  hb_font_t *font = hb_font_create (face);
  hb_face_destroy (face);

  char str[1024];
  draw_data_t draw_data = {
    .str = str,
    .size = sizeof (str),
    .consumed = 0
  };
  hb_font_draw_glyph (font, 3, funcs, &draw_data);
  char expected[] = "M203,367C227,440 248,512 268,588L272,588C293,512 314,440 338,367L369,267L172,267L203,367Z"
		    "M3,0L88,0L151,200L390,200L452,0L541,0L319,656L225,656L3,0Z"
		    "M300,653L342,694L201,861L143,806L300,653Z";
  g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

  hb_font_destroy (font);
}

static void
test_hb_draw_cff1_rline (void)
{
  /* https://github.com/harfbuzz/harfbuzz/pull/2053 */
  hb_face_t *face = hb_test_open_font_file ("fonts/RanaKufi-Regular.subset.otf");
  hb_font_t *font = hb_font_create (face);
  hb_face_destroy (face);

  char str[1024];
  draw_data_t draw_data = {
    .str = str,
    .size = sizeof (str),
    .consumed = 0
  };
  hb_font_draw_glyph (font, 1, funcs, &draw_data);
  char expected[] = "M775,400C705,400 650,343 650,274L650,250L391,250L713,572L392,893"
		    "L287,1000C311,942 296,869 250,823C250,823 286,858 321,823L571,572"
		    "L150,150L750,150L750,276C750,289 761,300 775,300C789,300 800,289 800,276"
		    "L800,100L150,100C100,100 100,150 100,150C100,85 58,23 0,0L900,0L900,274"
		    "C900,343 844,400 775,400Z";
  g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

  hb_font_destroy (font);
}

static void
test_hb_draw_cff2 (void)
{
  hb_face_t *face = hb_test_open_font_file ("fonts/AdobeVFPrototype.abc.otf");
  hb_font_t *font = hb_font_create (face);
  hb_face_destroy (face);

  char str[1024];
  draw_data_t draw_data = {
    .str = str,
    .size = sizeof (str)
  };

  draw_data.consumed = 0;
  hb_font_draw_glyph (font, 3, funcs, &draw_data);
  char expected[] = "M275,442C303,442 337,435 371,417L325,454L350,366"
		    "C357,341 370,321 403,321C428,321 443,333 448,358"
		    "C435,432 361,487 272,487C153,487 43,393 43,236"
		    "C43,83 129,-13 266,-13C360,-13 424,33 451,116L427,128"
		    "C396,78 345,50 287,50C193,50 126,119 126,245C126,373 188,442 275,442Z";
  g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

  hb_variation_t var;
  var.tag = HB_TAG ('w','g','h','t');
  var.value = 800;
  hb_font_set_variations (font, &var, 1);

  draw_data.consumed = 0;
  hb_font_draw_glyph (font, 3, funcs, &draw_data);
  char expected2[] = "M323,448C356,448 380,441 411,427L333,469L339,401"
		     "C343,322 379,297 420,297C458,297 480,314 492,352"
		     "C486,433 412,501 303,501C148,501 25,406 25,241"
		     "C25,70 143,-16 279,-16C374,-16 447,22 488,103L451,137"
		     "C423,107 390,86 344,86C262,86 209,148 209,261C209,398 271,448 323,448Z";
  g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);

  hb_font_destroy (font);
}

static void
test_hb_draw_ttf_parser_tests (void)
{
  /* https://github.com/RazrFalcon/ttf-parser/blob/337e7d1c/tests/tests.rs#L50-L133 */
  char str[1024];
  draw_data_t draw_data = {
    .str = str,
    .size = sizeof (str)
  };
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/glyphs.ttf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);
    {
      draw_data.consumed = 0;
      hb_font_draw_glyph (font, 0, funcs, &draw_data);
      char expected[] = "M50,0L50,750L450,750L450,0L50,0Z";
      g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
    }
    {
      draw_data.consumed = 0;
      hb_font_draw_glyph (font, 1, funcs, &draw_data);
      char expected[] = "M56,416L56,487L514,487L514,416L56,416ZM56,217L56,288L514,288L514,217L56,217Z";
      g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
    }
    {
      draw_data.consumed = 0;
      hb_font_draw_glyph (font, 4, funcs, &draw_data);
      char expected[] = "M332,468L197,468L197,0L109,0L109,468L15,468L15,509L109,539"
			"L109,570Q109,674 155,720Q201,765 283,765Q315,765 342,760"
			"Q368,754 387,747L364,678Q348,683 327,688Q306,693 284,693"
			"Q240,693 219,664Q197,634 197,571L197,536L332,536L332,468Z"
			"M474,737Q494,737 510,724Q525,710 525,681Q525,653 510,639"
			"Q494,625 474,625Q452,625 437,639Q422,653 422,681"
			"Q422,710 437,724Q452,737 474,737ZM517,536L517,0L429,0L429,536L517,536Z";
      g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
    }
    {
      draw_data.consumed = 0;
      hb_font_draw_glyph (font, 5, funcs, &draw_data);
      char expected[] = "M15,0Q15,0 15,0Z";
      g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
    }
    {
      draw_data.consumed = 0;
      hb_font_draw_glyph (font, 6, funcs, &draw_data);
      char expected[] = "M346,468L211,468L211,0L123,0L123,468L29,468L29,509L123,539"
			"L123,570Q123,674 169,720Q215,765 297,765Q329,765 356,760"
			"Q382,754 401,747L378,678Q362,683 341,688Q320,693 298,693"
			"Q254,693 233,664Q211,634 211,571L211,536L346,536L346,468Z"
			"M15,0Q15,0 15,0Z";
      g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
    }

    hb_font_destroy (font);
  }
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/cff1_flex.otf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 1, funcs, &draw_data);
    char expected[] = "M0,0C100,0 150,-20 250,-20C350,-20 400,0 500,0C500,100 520,150 520,250"
		      "C520,350 500,400 500,500C400,500 350,520 250,520C150,520 100,500 0,500"
		      "C0,400 -20,350 -20,250C-20,150 0,100 0,0ZM50,50C50,130 34,170 34,250"
		      "C34,330 50,370 50,450C130,450 170,466 250,466C330,466 370,450 450,450"
		      "C450,370 466,330 466,250C466,170 450,130 450,50C370,50 330,34 250,34"
		      "C170,34 130,50 50,50Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

    hb_font_destroy (font);
  }
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/cff1_dotsect.nohints.otf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 1, funcs, &draw_data);
    char expected[] = "M82,0L164,0L164,486L82,486L82,0Z"
		      "M124,586C156,586 181,608 181,639C181,671 156,692 124,692"
		      "C92,692 67,671 67,639C67,608 92,586 124,586Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

    hb_font_destroy (font);
  }
}

static void
test_hb_draw_font_kit_glyphs_tests (void)
{
  /* https://github.com/foliojs/fontkit/blob/master/test/glyphs.js */
  char str[2048];
  draw_data_t draw_data = {
    .str = str,
    .size = sizeof (str)
  };
  /* truetype glyphs */
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/OpenSans-Regular.ttf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);

    /* should get a path for the glyph */
    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 37, funcs, &draw_data);
    char expected[] = "M201,1462L614,1462Q905,1462 1035,1375Q1165,1288 1165,1100"
		      "Q1165,970 1093,886Q1020,801 881,776L881,766Q1214,709 1214,416"
		      "Q1214,220 1082,110Q949,0 711,0L201,0L201,1462ZM371,836L651,836"
		      "Q831,836 910,893Q989,949 989,1083Q989,1206 901,1261"
		      "Q813,1315 621,1315L371,1315L371,836ZM371,692L371,145L676,145"
		      "Q853,145 943,214Q1032,282 1032,428Q1032,564 941,628Q849,692 662,692L371,692Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

    /* should get a path for the glyph */
    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 171, funcs, &draw_data);
    char expected2[] = "M639,-20Q396,-20 256,128Q115,276 115,539Q115,804 246,960Q376,1116 596,1116"
		       "Q802,1116 922,981Q1042,845 1042,623L1042,518L287,518Q292,325 385,225"
		       "Q477,125 645,125Q822,125 995,199L995,51Q907,13 829,-3Q750,-20 639,-20Z"
		       "M594,977Q462,977 384,891Q305,805 291,653L864,653Q864,810 794,894"
		       "Q724,977 594,977ZM471,1266Q519,1328 575,1416Q630,1504 662,1569"
		       "L864,1569L864,1548Q820,1483 733,1388Q646,1293 582,1241L471,1241L471,1266Z";
    g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);

    hb_font_destroy (font);
  }
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/Mada-VF.ttf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);

    hb_buffer_t *buffer = hb_buffer_create ();
    hb_codepoint_t codepoint = 1610; /* ي */
    hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
    hb_buffer_set_direction (buffer, HB_DIRECTION_RTL);
    hb_shape (font, buffer, NULL, 0);
    codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
    hb_buffer_destroy (buffer);

    /* should resolve composite glyphs recursively */
    draw_data.consumed = 0;
    hb_font_draw_glyph (font, codepoint, funcs, &draw_data);
    char expected[] = "M581,274L443,274Q409,274 384,259Q359,243 348,219Q336,194 340,166"
		      "Q343,138 365,111L468,-13Q470,-10 473,-6Q475,-3 477,0L253,0Q225,0 203,8"
		      "Q180,15 168,32Q155,48 155,73L155,269L50,269L50,73Q50,24 69,-10"
		      "Q88,-44 118,-64Q147,-85 181,-94Q214,-104 243,-104L473,-104"
		      "Q501,-104 525,-91Q549,-78 564,-56Q578,-34 578,-8Q578,18 557,43"
		      "L442,182Q439,179 437,176Q435,173 432,170L581,170L581,274ZM184,-194"
		      "Q184,-216 199,-231Q214,-246 236,-246Q258,-246 273,-231Q288,-216 288,-194"
		      "Q288,-172 273,-157Q258,-142 236,-142Q214,-142 199,-157Q184,-172 184,-194Z"
		      "M360,-194Q360,-216 375,-231Q390,-246 412,-246Q434,-246 449,-231"
		      "Q464,-216 464,-194Q464,-172 449,-157Q434,-142 412,-142"
		      "Q390,-142 375,-157Q360,-172 360,-194Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

    /* should transform points of a composite glyph */
    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 2, funcs, &draw_data); /* 2 == arAlef.fina */
    char expected2[] = "M155,624L155,84Q150,90 146,95Q141,99 136,105"
		       "L292,105L292,0L156,0Q128,0 104,14Q79,27 65,51"
		       "Q50,74 50,104L50,624L155,624ZM282,105L312,105"
		       "L312,0L282,0L282,105Z";
    g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);

    hb_font_destroy (font);
  }
  /* CFF glyphs, should get a path for the glyph */
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/SourceSansPro-Regular.otf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 5, funcs, &draw_data);
    char expected[] = "M90,0L258,0C456,0 564,122 564,331C564,539 456,656 254,656L90,656L90,0Z"
		      "M173,68L173,588L248,588C401,588 478,496 478,331C478,165 401,68 248,68L173,68Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

    hb_font_destroy (font);
  }
  /* CFF glyphs (CID font) */
  {
    /* replaced with a subset as the original one was 15MB */
    hb_face_t *face = hb_test_open_font_file ("fonts/NotoSansCJKkr-Regular-subset-colon.ttf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 1, funcs, &draw_data);
    char expected[] = "M139,390C175,390 205,419 205,459C205,501 175,530 139,530C103,530 73,501 73,459"
		      "C73,419 103,390 139,390ZM139,-13C175,-13 205,15 205,56C205,97 175,127 139,127"
		      "C103,127 73,97 73,56C73,15 103,-13 139,-13Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

    hb_font_destroy (font);
  }
  /* Skip SBIX glyphs (empty path), COLR glyphs (empty path), WOFF ttf glyphs, WOFF2 ttf glyph */
}

static void
test_hb_draw_font_kit_variations_tests (void)
{
  /* https://github.com/foliojs/fontkit/blob/b310db5/test/variations.js */
  char str[2048];
  draw_data_t draw_data = {
    .str = str,
    .size = sizeof (str)
  };
  /* Skia */
  {
    /* Skipping Skia tests for now even the fact we can actually do platform specific tests using our CIs */
  }
  /* truetype variations */
  /* should support sharing all points */
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/TestGVAROne.ttf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);

    hb_variation_t var;
    var.tag = HB_TAG ('w','g','h','t');
    var.value = 300;
    hb_font_set_variations (font, &var, 1);

    hb_buffer_t *buffer = hb_buffer_create ();
    hb_codepoint_t codepoint = 24396; /* 彌 */
    hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
    hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
    hb_shape (font, buffer, NULL, 0);
    codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
    hb_buffer_destroy (buffer);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, codepoint, funcs, &draw_data);
    char expected[] = "M371,-102L371,539L914,539L914,-27Q914,-102 840,-102"
		      "Q796,-102 755,-98L742,-59Q790,-66 836,-66Q871,-66 871,-31L871,504"
		      "L414,504L414,-102L371,-102ZM203,-94Q138,-94 86,-90L74,-52"
		      "Q137,-59 188,-59Q211,-59 222,-46Q233,-34 236,12Q238,58 240,135"
		      "Q242,211 242,262L74,262L94,527L242,527L242,719L63,719L63,754"
		      "L285,754L285,492L133,492L117,297L285,297Q285,241 284,185"
		      "Q284,104 281,46Q278,-20 269,-49Q260,-78 242,-86Q223,-94 203,-94Z"
		      "M461,12L434,43Q473,73 503,115Q478,150 441,188L469,211Q501,179 525,147"
		      "Q538,172 559,230L594,211Q571,152 551,117Q577,84 602,43L566,20"
		      "Q544,64 528,86Q500,44 461,12ZM465,258L438,285Q474,316 501,351"
		      "Q474,388 445,418L473,441Q500,414 523,381Q546,413 563,453L598,434"
		      "Q571,382 549,352Q576,320 598,285L563,262Q546,294 525,322Q491,280 465,258Z"
		      "M707,12L680,43Q717,68 753,115Q731,147 691,188L719,211Q739,190 754,172"
		      "Q769,154 774,147Q793,185 809,230L844,211Q822,155 801,117Q828,82 852,43"
		      "L820,20Q798,58 778,87Q747,43 707,12ZM621,-94L621,730L664,730L664,-94"
		      "L621,-94ZM348,570L324,605Q425,629 527,688L555,656Q491,621 439,601"
		      "Q386,581 348,570ZM715,258L688,285Q727,318 753,351Q733,378 695,418L723,441"
		      "Q754,410 775,381Q794,407 813,453L848,434Q826,387 801,352Q823,321 848,281"
		      "L813,262Q791,301 775,323Q749,288 715,258ZM348,719L348,754L941,754L941,719"
		      "L348,719ZM936,570Q870,602 817,622Q764,641 727,652L749,688Q852,655 957,605L936,570Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

    hb_font_destroy (font);
  }
  /* should support sharing enumerated points */
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/TestGVARTwo.ttf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);

    hb_variation_t var;
    var.tag = HB_TAG ('w','g','h','t');
    var.value = 300;
    hb_font_set_variations (font, &var, 1);

    hb_buffer_t *buffer = hb_buffer_create ();
    hb_codepoint_t codepoint = 24396; /* 彌 */
    hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
    hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
    hb_shape (font, buffer, NULL, 0);
    codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
    hb_buffer_destroy (buffer);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, codepoint, funcs, &draw_data);
    char expected[] = "M371,-102L371,539L914,539L914,-27Q914,-102 840,-102Q796,-102 755,-98"
		      "L742,-59Q790,-66 836,-66Q871,-66 871,-31L871,504L414,504L414,-102"
		      "L371,-102ZM203,-94Q138,-94 86,-90L74,-52Q137,-59 188,-59Q211,-59 222,-46"
		      "Q233,-34 236,12Q238,58 240,135Q242,211 242,262L74,262L94,527L242,527"
		      "L242,719L63,719L63,754L285,754L285,492L133,492L117,297L285,297"
		      "Q285,241 284,185Q284,104 281,46Q278,-20 269,-49Q260,-78 242,-86Q223,-94 203,-94Z"
		      "M461,12L434,43Q473,73 503,115Q478,150 441,188L469,211Q501,179 525,147"
		      "Q538,172 559,230L594,211Q571,152 551,117Q577,84 602,43L566,20"
		      "Q544,64 528,86Q500,44 461,12ZM465,258L438,285Q474,316 501,351"
		      "Q474,388 445,418L473,441Q500,414 523,381Q546,413 563,453L598,434"
		      "Q571,382 549,352Q576,320 598,285L563,262Q546,294 525,322Q491,280 465,258Z"
		      "M707,12L680,43Q717,68 753,115Q731,147 691,188L719,211Q739,190 754,172"
		      "Q769,154 774,147Q793,185 809,230L844,211Q822,155 801,117Q828,82 852,43L820,20"
		      "Q798,58 778,87Q747,43 707,12ZM621,-94L621,730L664,730L664,-94L621,-94ZM348,570"
		      "L324,605Q425,629 527,688L555,656Q491,621 439,601Q386,581 348,570ZM715,258L688,285"
		      "Q727,318 753,351Q733,378 695,418L723,441Q754,410 775,381Q794,407 813,453"
		      "L848,434Q826,387 801,352Q823,321 848,281L813,262Q791,301 775,323Q749,288 715,258Z"
		      "M348,719L348,754L941,754L941,719L348,719ZM936,570Q870,602 817,622"
		      "Q764,641 727,652L749,688Q852,655 957,605L936,570Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

    hb_font_destroy (font);
  }
  /* should support sharing no points */
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/TestGVARThree.ttf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);

    hb_variation_t var;
    var.tag = HB_TAG ('w','g','h','t');
    var.value = 300;
    hb_font_set_variations (font, &var, 1);

    hb_buffer_t *buffer = hb_buffer_create ();
    hb_codepoint_t codepoint = 24396; /* 彌 */
    hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
    hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
    hb_shape (font, buffer, NULL, 0);
    codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
    hb_buffer_destroy (buffer);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, codepoint, funcs, &draw_data);
    char expected[] = "M371,-102L371,539L914,539L914,-27Q914,-102 840,-102Q796,-102 755,-98"
		      "L742,-59Q790,-66 836,-66Q871,-66 871,-31L871,504L414,504L414,-102"
		      "L371,-102ZM203,-94Q138,-94 86,-90L74,-52Q137,-59 188,-59Q211,-59 222,-46"
		      "Q233,-34 236,12Q238,58 240,135Q242,211 242,262L74,262L94,527L242,527L242,719"
		      "L63,719L63,754L285,754L285,492L133,492L117,297L285,297Q285,241 284,185"
		      "Q284,104 281,46Q278,-20 269,-49Q260,-78 242,-86Q223,-94 203,-94ZM461,12"
		      "L434,43Q473,73 503,115Q478,150 441,188L469,211Q501,179 525,147"
		      "Q538,172 559,230L594,211Q571,152 551,117Q577,84 602,43L566,20Q544,64 528,86"
		      "Q500,44 461,12ZM465,258L438,285Q474,316 501,351Q474,388 445,418L473,441"
		      "Q500,414 523,381Q546,413 563,453L598,434Q571,382 549,352Q576,320 598,285"
		      "L563,262Q546,294 525,322Q491,280 465,258ZM707,12L680,43Q717,68 753,115"
		      "Q731,147 691,188L719,211Q739,190 754,172Q769,154 774,147Q793,185 809,230"
		      "L844,211Q822,155 801,117Q828,82 852,43L820,20Q798,58 778,87Q747,43 707,12Z"
		      "M621,-94L621,730L664,730L664,-94L621,-94ZM348,570L324,605Q425,629 527,688"
		      "L555,656Q491,621 439,601Q386,581 348,570ZM715,258L688,285Q727,318 753,351"
		      "Q733,378 695,418L723,441Q754,410 775,381Q794,407 813,453L848,434Q826,387 801,352"
		      "Q823,321 848,281L813,262Q791,301 775,323Q749,288 715,258ZM348,719L348,754"
		      "L941,754L941,719L348,719ZM936,570Q870,602 817,622"
		      "Q764,641 727,652L749,688Q852,655 957,605L936,570Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

    hb_font_destroy (font);
  }

  /* CFF2 variations */
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/AdobeVFPrototype-Subset.otf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);

    hb_variation_t var;
    var.tag = HB_TAG ('w','g','h','t');
    /* applies variations to CFF2 glyphs */
    {
      var.value = 100;
      hb_font_set_variations (font, &var, 1);

      hb_buffer_t *buffer = hb_buffer_create ();
      hb_codepoint_t codepoint = '$';
      hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
      hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
      hb_shape (font, buffer, NULL, 0);
      codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
      hb_buffer_destroy (buffer);

      draw_data.consumed = 0;
      hb_font_draw_glyph (font, codepoint, funcs, &draw_data);
      char expected[] = "M246,15C188,15 147,27 101,68L142,23L117,117C111,143 96,149 81,149"
		        "C65,149 56,141 52,126C71,40 137,-13 244,-13C348,-13 436,46 436,156"
		        "C436,229 405,295 271,349L247,359C160,393 119,439 119,506"
		        "C119,592 178,637 262,637C311,637 346,626 390,585L348,629L373,535"
		        "C380,510 394,503 408,503C424,503 434,510 437,526C418,614 348,665 259,665"
		        "C161,665 78,606 78,500C78,414 128,361 224,321L261,305C367,259 395,217 395,152"
		        "C395,65 334,15 246,15ZM267,331L267,759L240,759L240,331L267,331ZM240,-115"
		        "L267,-115L267,331L240,331L240,-115Z";
      g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
    }
    {
      var.value = 500;
      hb_font_set_variations (font, &var, 1);

      hb_buffer_t *buffer = hb_buffer_create ();
      hb_codepoint_t codepoint = '$';
      hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
      hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
      hb_shape (font, buffer, NULL, 0);
      codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
      hb_buffer_destroy (buffer);

      draw_data.consumed = 0;
      hb_font_draw_glyph (font, codepoint, funcs, &draw_data);
      char expected[] = "M251,36C206,36 165,42 118,61L176,21L161,99C151,152 129,167 101,167"
			"C78,167 61,155 51,131C54,43 133,-14 247,-14C388,-14 474,64 474,171"
			"C474,258 430,321 294,370L257,383C188,406 150,438 150,499"
			"C150,571 204,606 276,606C308,606 342,601 386,582L327,621"
			"L343,546C355,490 382,476 408,476C428,476 448,487 455,512"
			"C450,597 370,656 264,656C140,656 57,576 57,474C57,373 119,318 227,279"
			"L263,266C345,236 379,208 379,145C379,76 329,36 251,36ZM289,320"
			"L289,746L242,746L242,320L289,320ZM240,-115L286,-115L286,320L240,320L240,-115Z";
      g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
    }
    /* substitutes GSUB features depending on variations */
    {
      var.value = 900;
      hb_font_set_variations (font, &var, 1);

      hb_buffer_t *buffer = hb_buffer_create ();
      hb_codepoint_t codepoint = '$';
      hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
      hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
      hb_shape (font, buffer, NULL, 0);
      codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
      hb_buffer_destroy (buffer);

      draw_data.consumed = 0;
      hb_font_draw_glyph (font, codepoint, funcs, &draw_data);
      char expected[] = "M258,38C197,38 167,48 118,71L192,19L183,103C177,155 155,174 115,174"
			"C89,174 64,161 51,125C52,36 124,-16 258,-16C417,-16 513,67 513,175"
			"C513,278 457,328 322,388L289,403C232,429 203,452 203,500C203,562 244,589 301,589"
			"C342,589 370,585 420,562L341,607L352,539C363,468 398,454 434,454C459,454 486,468 492,506"
			"C491,590 408,643 290,643C141,643 57,563 57,460C57,357 122,307 233,256L265,241"
			"C334,209 363,186 363,130C363,77 320,38 258,38ZM318,616L318,734L252,734L252,616"
			"L318,616ZM253,-115L319,-115L319,14L253,14L253,-115Z";
      g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
    }

    hb_font_destroy (font);
  }
}

static void
test_hb_draw_estedad_vf (void)
{
  /* https://github.com/harfbuzz/harfbuzz/issues/2215 */
  char str[2048];
  draw_data_t draw_data = {
    .str = str,
    .size = sizeof (str)
  };
  {
    /* See https://github.com/google/skia/blob/d38f00a1/gm/stroketext.cpp#L115-L124 */
    hb_face_t *face = hb_test_open_font_file ("fonts/Estedad-VF.ttf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);

    hb_variation_t var;
    hb_variation_from_string ("wght=100", -1, &var);
    hb_font_set_variations (font, &var, 1);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 156, funcs, &draw_data);
    /* Skip empty path where all the points of a path are equal */
    char expected[] = "M150,1158L182,1158Q256,1158 317,1170Q377,1182 421,1213L421,430L521,430"
		      "L521,1490L421,1490L421,1320Q393,1279 344,1262Q294,1244 182,1244L150,1244"
		      "L150,1158ZM1815,-122L1669,-122L1669,642L1552,642L1055,-117L1055,-206"
		      "L1569,-206L1569,-458L1669,-458L1669,-206L1815,-206L1815,-122ZM1569,-122"
		      "L1166,-122L1569,494L1569,-122ZM609,-79L1639,1288L1555,1334L525,-33L609,-79Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 180, funcs, &draw_data);
    /* Skip empty path where all the points of a path are equal */
    char expected2[] = "M120,693Q120,545 177,414Q233,282 333,182Q433,81 567,24"
		       "Q701,-33 856,-33Q1010,-33 1144,24Q1277,81 1377,182Q1477,282 1534,414"
		       "Q1590,545 1590,693Q1590,842 1534,973Q1477,1104 1377,1205"
		       "Q1277,1305 1144,1362Q1010,1419 856,1419Q701,1419 567,1362"
		       "Q433,1305 333,1205Q233,1104 177,973Q120,842 120,693Z"
		       "M220,693Q220,828 270,945Q320,1061 409,1148Q497,1235 612,1284"
		       "Q726,1333 855,1333Q984,1333 1099,1284Q1213,1235 1302,1148"
		       "Q1390,1061 1440,945Q1490,828 1490,693Q1490,558 1440,442"
		       "Q1390,325 1302,237Q1213,149 1099,100Q984,51 855,51"
		       "Q726,51 611,100Q497,149 408,237Q320,325 270,442"
		       "Q220,558 220,693ZM690,643L690,997L886,997Q970,997 1029,949"
		       "Q1087,901 1087,819Q1087,737 1028,690Q969,643 886,643L690,643Z"
		       "M1165,334L973,568Q1065,591 1126,658Q1187,725 1187,819"
		       "Q1187,896 1147,956Q1106,1015 1037,1049Q969,1083 886,1083"
		       "L590,1083L590,310L690,310L690,557L860,557L1083,286L1165,334Z";
    g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 262, funcs, &draw_data);
    /* Skip empty path where all the points of a path are equal */
    char expected3[] = "M422,598Q495,598 545,548Q595,498 595,426Q595,353 545,303Q494,252 422,252"
		       "Q350,252 300,303Q250,353 250,426Q250,499 300,549Q349,598 422,598ZM422,698"
		       "Q347,698 285,662Q223,625 187,564Q150,502 150,426Q150,351 187,289"
		       "Q223,226 285,189Q346,152 422,152Q498,152 560,189Q622,226 658,288"
		       "Q695,351 695,426Q695,502 658,563Q621,625 559,661Q498,698 422,698Z";
    g_assert_cmpmem (str, draw_data.consumed, expected3, sizeof (expected3) - 1);

    hb_font_destroy (font);
  }
}

static void
test_hb_draw_stroking (void)
{
  /* https://skia-review.googlesource.com/c/skia/+/266945
     https://savannah.nongnu.org/bugs/index.php?57701 */
  char str[2048];
  draw_data_t draw_data = {
    .str = str,
    .size = sizeof (str)
  };
  {
    /* See https://github.com/google/skia/blob/d38f00a1/gm/stroketext.cpp#L115-L124 */
    hb_face_t *face = hb_test_open_font_file ("fonts/Stroking.ttf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 6, funcs, &draw_data);
    /* Skip empty path where all the points of a path are equal */
    char expected[] = "M436,1522Q436,1280 531,1060Q625,839 784,680Q943,521 1164,427Q1384,332 1626,332"
		      "Q1868,332 2089,427Q2309,521 2468,680Q2627,839 2722,1060Q2816,1280 2816,1522"
		      "Q2816,1764 2722,1985Q2627,2205 2468,2364Q2309,2523 2089,2618Q1868,2712 1626,2712"
		      "Q1384,2712 1164,2618Q943,2523 784,2364Q625,2205 531,1985Q436,1764 436,1522ZM256,1528"
		      "Q256,1714 306,1892Q355,2069 443,2220Q531,2370 658,2497Q784,2623 935,2711"
		      "Q1085,2799 1263,2849Q1440,2898 1626,2898Q1812,2898 1990,2849Q2167,2799 2318,2711"
		      "Q2468,2623 2595,2497Q2721,2370 2809,2220Q2897,2069 2947,1892Q2996,1714 2996,1528"
		      "Q2996,1342 2947,1165Q2897,987 2809,837Q2721,686 2595,560Q2468,433 2318,345"
		      "Q2167,257 1990,208Q1812,158 1626,158Q1440,158 1263,208Q1085,257 935,345"
		      "Q784,433 658,560Q531,686 443,837Q355,987 306,1165Q256,1342 256,1528Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 7, funcs, &draw_data);
    char expected2[] = "M436,1522Q436,1280 531,1060Q625,839 784,680Q943,521 1164,427"
		       "Q1384,332 1626,332Q1868,332 2089,427Q2309,521 2468,680"
		       "Q2627,839 2722,1060Q2816,1280 2816,1522Q2816,1764 2722,1985"
		       "Q2627,2205 2468,2364Q2309,2523 2089,2618Q1868,2712 1626,2712"
		       "Q1384,2712 1164,2618Q943,2523 784,2364Q625,2205 531,1985"
		       "Q436,1764 436,1522ZM256,1528Q256,1714 306,1892Q355,2069 443,2220"
		       "Q531,2370 658,2497Q784,2623 935,2711Q1085,2799 1263,2849"
		       "Q1440,2898 1626,2898Q1812,2898 1990,2849Q2167,2799 2318,2711"
		       "Q2468,2623 2595,2497Q2721,2370 2809,2220Q2897,2069 2947,1892"
		       "Q2996,1714 2996,1528Q2996,1342 2947,1165Q2897,987 2809,837"
		       "Q2721,686 2595,560Q2468,433 2318,345Q2167,257 1990,208"
		       "Q1812,158 1626,158Q1440,158 1263,208Q1085,257 935,345"
		       "Q784,433 658,560Q531,686 443,837Q355,987 306,1165"
		       "Q256,1342 256,1528Z";
    g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);

    hb_font_destroy (font);
  }
  {
    /* https://github.com/google/skia/blob/d38f00a1/gm/stroketext.cpp#L131-L138 */
    hb_face_t *face = hb_test_open_font_file ("fonts/Stroking.otf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 4, funcs, &draw_data);
    /* Skip empty path in CFF */
    char expected[] = "M106,372C106,532 237,662 397,662C557,662 688,532 688,372C688,212 557,81 397,81C237,81 106,212 106,372Z"
		      "M62,373C62,188 212,39 397,39C582,39 731,188 731,373C731,558 582,708 397,708C212,708 62,558 62,373Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 5, funcs, &draw_data);
    /* Fold consequent move-to commands */
    char expected2[] = "M106,372C106,532 237,662 397,662C557,662 688,532 688,372"
		       "C688,212 557,81 397,81C237,81 106,212 106,372ZM62,373"
		       "C62,188 212,39 397,39C582,39 731,188 731,373"
		       "C731,558 582,708 397,708C212,708 62,558 62,373Z";
    g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);

    hb_font_destroy (font);
  }
}

static void
test_hb_draw_drawing_funcs (void)
{
  char str[2048];
  draw_data_t draw_data = {
    .str = str,
    .size = sizeof (str)
  };

  {
    hb_draw_state_t st = HB_DRAW_STATE_DEFAULT;
    draw_data.consumed = 0;
    hb_draw_move_to (funcs, &draw_data, &st, 90.f, 0.f);
    hb_draw_line_to (funcs, &draw_data, &st, 258.f, 0.f);
    hb_draw_cubic_to (funcs, &draw_data, &st, 456.f, 0.f, 564.f, 122.f, 564.f, 331.f);
    hb_draw_cubic_to (funcs, &draw_data, &st, 564.f, 539.f, 456.f, 656.f, 254.f, 656.f);
    hb_draw_line_to (funcs, &draw_data, &st, 90.f, 656.f);
    hb_draw_line_to (funcs, &draw_data, &st, 90.f, 0.f);
    hb_draw_close_path (funcs, &draw_data, &st);

    char expected[] = "M90,0L258,0C456,0 564,122 564,331C564,539 456,656 254,656L90,656L90,0Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
  }

  {
    hb_draw_state_t st = HB_DRAW_STATE_DEFAULT;
    draw_data.consumed = 0;
    hb_draw_move_to (funcs, &draw_data, &st, 155.f, 624.f);
    hb_draw_line_to (funcs, &draw_data, &st, 155.f, 84.f);
    hb_draw_quadratic_to (funcs, &draw_data, &st, 150.f, 90.f, 146.f, 95.f);
    hb_draw_quadratic_to (funcs, &draw_data, &st, 141.f, 99.f, 136.f, 105.f);
    hb_draw_line_to (funcs, &draw_data, &st, 292.f, 105.f);
    hb_draw_line_to (funcs, &draw_data, &st, 292.f, 0.f);
    hb_draw_line_to (funcs, &draw_data, &st, 156.f, 0.f);
    hb_draw_quadratic_to (funcs, &draw_data, &st, 128.f, 0.f, 104.f, 14.f);
    hb_draw_quadratic_to (funcs, &draw_data, &st, 79.f, 27.f, 65.f, 51.f);
    hb_draw_quadratic_to (funcs, &draw_data, &st, 50.f, 74.f, 50.f, 104.f);
    hb_draw_line_to (funcs, &draw_data, &st, 50.f, 624.f);
    hb_draw_line_to (funcs, &draw_data, &st, 155.f, 624.f);
    hb_draw_close_path (funcs, &draw_data, &st);

    char expected[] = "M155,624L155,84Q150,90 146,95Q141,99 136,105"
		       "L292,105L292,0L156,0Q128,0 104,14Q79,27 65,51"
		       "Q50,74 50,104L50,624L155,624Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
  }
}

static void
test_hb_draw_synthetic_slant (void)
{
  char str[2048];
  draw_data_t draw_data = {
    .str = str,
    .size = sizeof (str)
  };
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/OpenSans-Regular.ttf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);
    hb_font_set_synthetic_slant (font, 0.2f);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 37, funcs, &draw_data);
    char expected[] = "M493,1462L906,1462Q1197,1462 1310,1375Q1423,1288 1385,1100"
		      "Q1359,970 1270,886Q1180,801 1036,776L1034,766Q1356,709 1297,416"
		      "Q1258,220 1104,110Q949,0 711,0L201,0L493,1462ZM538,836L818,836"
		      "Q998,836 1089,893Q1179,949 1206,1083Q1230,1206 1153,1261"
		      "Q1076,1315 884,1315L634,1315L538,836ZM509,692L400,145L705,145"
		      "Q882,145 985,214Q1088,282 1118,428Q1145,564 1066,628Q987,692 800,692L509,692Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

    hb_font_destroy (font);
  }
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/SourceSansPro-Regular.otf");
    hb_font_t *font = hb_font_create (face);
    hb_face_destroy (face);
    hb_font_set_synthetic_slant (font, 0.2f);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 5, funcs, &draw_data);
    char expected[] = "M90,0L258,0C456,0 588,122 630,331C672,539 587,656 385,656L221,656L90,0Z"
		      "M187,68L291,588L366,588C519,588 577,496 544,331C511,165 415,68 262,68L187,68Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

    hb_font_destroy (font);
  }
}

static void
test_hb_draw_subfont_scale (void)
{
  char str[2048];
  draw_data_t draw_data = {
    .str = str,
    .size = sizeof (str)
  };
  signed x, y;
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/OpenSans-Regular.ttf");
    hb_font_t *font1 = hb_font_create (face);
    hb_font_t *font2 = hb_font_create_sub_font (font1);

    hb_font_get_scale (font1, &x, &y);
    hb_font_set_scale (font2, x*2, y*2);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font1, 37, funcs, &draw_data);
    char expected1[] = "M201,1462L614,1462Q905,1462 1035,1375Q1165,1288 1165,1100"
		       "Q1165,970 1093,886Q1020,801 881,776L881,766Q1214,709 1214,416"
		       "Q1214,220 1082,110Q949,0 711,0L201,0L201,1462ZM371,836L651,836"
		       "Q831,836 910,893Q989,949 989,1083Q989,1206 901,1261"
		       "Q813,1315 621,1315L371,1315L371,836ZM371,692L371,145L676,145"
		       "Q853,145 943,214Q1032,282 1032,428Q1032,564 941,628Q849,692 662,692L371,692Z";
    g_assert_cmpmem (str, draw_data.consumed, expected1, sizeof (expected1) - 1);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font2, 37, funcs, &draw_data);
    char expected2[] = "M402,2924L1228,2924Q1810,2924 2070,2750Q2330,2576 2330,2200"
		       "Q2330,1940 2185,1771Q2040,1602 1762,1552L1762,1532Q2428,1418 2428,832"
		       "Q2428,440 2163,220Q1898,0 1422,0L402,0L402,2924ZM742,1672L1302,1672"
		       "Q1662,1672 1820,1785Q1978,1898 1978,2166Q1978,2412 1802,2521"
		       "Q1626,2630 1242,2630L742,2630L742,1672ZM742,1384L742,290L1352,290"
		       "Q1706,290 1885,427Q2064,564 2064,856Q2064,1128 1881,1256Q1698,1384 1324,1384L742,1384Z";
    g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);

    hb_font_destroy (font1);
    hb_font_destroy (font2);
    hb_face_destroy (face);
  }
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/SourceSansPro-Regular.otf");
    hb_font_t *font1 = hb_font_create (face);
    hb_font_t *font2 = hb_font_create_sub_font (font1);

    hb_font_get_scale (font1, &x, &y);
    hb_font_set_scale (font2, x*2, y*2);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font1, 5, funcs, &draw_data);
    char expected1[] = "M90,0L258,0C456,0 564,122 564,331C564,539 456,656 254,656L90,656L90,0Z"
		       "M173,68L173,588L248,588C401,588 478,496 478,331C478,165 401,68 248,68L173,68Z";
    g_assert_cmpmem (str, draw_data.consumed, expected1, sizeof (expected1) - 1);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font2, 5, funcs, &draw_data);
    char expected2[] = "M180,0L516,0C912,0 1128,244 1128,662C1128,1078 912,1312 508,1312L180,1312L180,0Z"
		       "M346,136L346,1176L496,1176C802,1176 956,992 956,662C956,330 802,136 496,136L346,136Z";
    g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);

    hb_font_destroy (font1);
    hb_font_destroy (font2);
    hb_face_destroy (face);
  }
}

static void
test_hb_draw_immutable (void)
{
  hb_draw_funcs_t *draw_funcs = hb_draw_funcs_create ();
  g_assert (!hb_draw_funcs_is_immutable (draw_funcs));
  hb_draw_funcs_make_immutable (draw_funcs);
  g_assert (hb_draw_funcs_is_immutable (draw_funcs));
  hb_draw_funcs_destroy (draw_funcs);
}

static void
test_hb_draw_funcs (const void* user_data)
{
  const char *font_funcs_name = user_data;
  char str[1024];
  draw_data_t draw_data = {
    .str = str,
    .size = sizeof (str)
  };
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/glyphs.ttf");
    hb_font_t *font = hb_font_create (face);
    hb_bool_t ret = hb_font_set_funcs_using (font, font_funcs_name);
    g_assert (ret);
    hb_face_destroy (face);
    {
      draw_data.consumed = 0;
      hb_font_draw_glyph (font, 0, funcs, &draw_data);
      char expected[] = "M50,0L50,750L450,750L450,0L50,0Z";
      g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
    }
    hb_font_destroy (font);
  }
  {
    hb_face_t *face = hb_test_open_font_file ("fonts/cff1_flex.otf");
    hb_font_t *font = hb_font_create (face);
    hb_bool_t ret = hb_font_set_funcs_using (font, font_funcs_name);
    g_assert (ret);
    hb_face_destroy (face);

    draw_data.consumed = 0;
    hb_font_draw_glyph (font, 1, funcs, &draw_data);
    char expected[] = "M0,0C100,0 150,-20 250,-20C350,-20 400,0 500,0C500,100 520,150 520,250"
		      "C520,350 500,400 500,500C400,500 350,520 250,520C150,520 100,500 0,500"
		      "C0,400 -20,350 -20,250C-20,150 0,100 0,0ZM50,50C50,130 34,170 34,250"
		      "C34,330 50,370 50,450C130,450 170,466 250,466C330,466 370,450 450,450"
		      "C450,370 466,330 466,250C466,170 450,130 450,50C370,50 330,34 250,34"
		      "C170,34 130,50 50,50Z";
    g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);

    hb_font_destroy (font);
  }
}

static void
test_hb_draw_compare_ot_funcs (const void *user_data)
{
  const char* font_funcs_name = user_data;
  char str[1024];
  draw_data_t draw_data = {
    .str = str,
    .size = sizeof (str),
    .consumed = 0
  };
  char str2[1024];
  draw_data_t draw_data2 = {
    .str = str2,
    .size = sizeof (str2),
    .consumed = 0
  };

  hb_face_t *face = hb_test_open_font_file ("fonts/cff1_flex.otf");
  hb_font_t *font = hb_font_create (face);

  hb_font_set_scale (font, 100, 100);

  hb_font_draw_glyph (font, 1, funcs, &draw_data);
  draw_data.str[draw_data.consumed] = '\0';

  hb_bool_t ret = hb_font_set_funcs_using (font, font_funcs_name);
  g_assert (ret);

  hb_font_draw_glyph (font, 1, funcs, &draw_data2);
  draw_data2.str[draw_data2.consumed] = '\0';

  g_assert_cmpstr (draw_data.str, ==, draw_data2.str);

  hb_font_destroy (font);
  hb_face_destroy (face);
}

int
main (int argc, char **argv)
{
  funcs = hb_draw_funcs_create ();
  hb_draw_funcs_set_move_to_func (funcs, (hb_draw_move_to_func_t) move_to, NULL, NULL);
  hb_draw_funcs_set_line_to_func (funcs, (hb_draw_line_to_func_t) line_to, NULL, NULL);
  hb_draw_funcs_set_quadratic_to_func (funcs, (hb_draw_quadratic_to_func_t) quadratic_to, NULL, NULL);
  hb_draw_funcs_set_cubic_to_func (funcs, (hb_draw_cubic_to_func_t) cubic_to, NULL, NULL);
  hb_draw_funcs_set_close_path_func (funcs, (hb_draw_close_path_func_t) close_path, NULL, NULL);
  hb_draw_funcs_make_immutable (funcs);

  funcs2 = hb_draw_funcs_create ();
  hb_draw_funcs_set_move_to_func (funcs2, (hb_draw_move_to_func_t) move_to, NULL, NULL);
  hb_draw_funcs_set_line_to_func (funcs2, (hb_draw_line_to_func_t) line_to, NULL, NULL);
  hb_draw_funcs_set_cubic_to_func (funcs2, (hb_draw_cubic_to_func_t) cubic_to, NULL, NULL);
  hb_draw_funcs_set_close_path_func (funcs2, (hb_draw_close_path_func_t) close_path, NULL, NULL);
  hb_draw_funcs_make_immutable (funcs2);

  hb_test_init (&argc, &argv);
  hb_test_add (test_itoa);
  hb_test_add (test_hb_draw_empty);
  hb_test_add (test_hb_draw_glyf);
  hb_test_add (test_hb_draw_cff1);
  hb_test_add (test_hb_draw_cff1_rline);
  hb_test_add (test_hb_draw_cff2);
  hb_test_add (test_hb_draw_ttf_parser_tests);
  hb_test_add (test_hb_draw_font_kit_glyphs_tests);
  hb_test_add (test_hb_draw_font_kit_variations_tests);
  hb_test_add (test_hb_draw_estedad_vf);
 if(0) hb_test_add (test_hb_draw_stroking);
  hb_test_add (test_hb_draw_drawing_funcs);
  hb_test_add (test_hb_draw_synthetic_slant);
  hb_test_add (test_hb_draw_subfont_scale);
  hb_test_add (test_hb_draw_immutable);

  const char **font_funcs = hb_font_list_funcs ();
  for (const char **font_funcs_name = font_funcs; *font_funcs_name; font_funcs_name++)
  {
    hb_test_add_flavor (*font_funcs_name, test_hb_draw_funcs);
    hb_test_add_flavor (*font_funcs_name, test_hb_draw_compare_ot_funcs);
  }

  unsigned result = hb_test_run ();

  hb_draw_funcs_destroy (funcs);
  hb_draw_funcs_destroy (funcs2);
  return result;
}
