emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/android 60270d8ee3 2/5: Fix IUP for contours which start past en


From: Po Lu
Subject: feature/android 60270d8ee3 2/5: Fix IUP for contours which start past end
Date: Fri, 10 Feb 2023 06:16:09 -0500 (EST)

branch: feature/android
commit 60270d8ee30ee15b5ed74ac211b7cb35c58ad3f3
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Fix IUP for contours which start past end
    
    Found with Droid Sans Mono hinted with ttfautohint 1.8.4.
    
    * src/sfnt.c (IUP_SINGLE_PAIR): If i is initially more than end,
    make it start.
    (sfnt_verbose): Handle cases where interpreter->glyph_zone is
    NULL.
    (main): Update tests.
---
 src/sfnt.c | 86 +++++++++++++++++++++++++++++++++++++-------------------------
 1 file changed, 51 insertions(+), 35 deletions(-)

diff --git a/src/sfnt.c b/src/sfnt.c
index bf6ea3761e..cf36f38881 100644
--- a/src/sfnt.c
+++ b/src/sfnt.c
@@ -9375,6 +9375,11 @@ sfnt_interpret_shp (struct sfnt_interpreter *interpreter,
                                                                        \
   i = touch_start + 1;                                                 \
                                                                        \
+  /* touch_start might be the last point in the contour.  */           \
+                                                                       \
+  if (i > end)                                                         \
+    i = start;                                                         \
+                                                                       \
   while (i != touch_end)                                               \
     {                                                                  \
       /* Movement is always relative to the original position of       \
@@ -15309,31 +15314,35 @@ sfnt_verbose (struct sfnt_interpreter *interpreter)
 
   /* Build a temporary outline containing the values of the
      interpreter's glyph zone.  */
-  temp.num_points = interpreter->glyph_zone->num_points;
-  temp.num_contours = interpreter->glyph_zone->num_contours;
-  temp.contour_end_points = interpreter->glyph_zone->contour_end_points;
-  temp.x_points = interpreter->glyph_zone->x_current;
-  temp.y_points = interpreter->glyph_zone->y_current;
-  temp.flags = interpreter->glyph_zone->flags;
 
-  outline = sfnt_build_instructed_outline (&temp);
+  if (interpreter->glyph_zone)
+    {
+      temp.num_points = interpreter->glyph_zone->num_points;
+      temp.num_contours = interpreter->glyph_zone->num_contours;
+      temp.contour_end_points = interpreter->glyph_zone->contour_end_points;
+      temp.x_points = interpreter->glyph_zone->x_current;
+      temp.y_points = interpreter->glyph_zone->y_current;
+      temp.flags = interpreter->glyph_zone->flags;
 
-  if (!outline)
-    return;
+      outline = sfnt_build_instructed_outline (&temp);
 
-  printf ("outline bounds: %g %g, %g %g\n",
-         sfnt_coerce_fixed (outline->xmin),
-         sfnt_coerce_fixed (outline->ymin),
-         sfnt_coerce_fixed (outline->xmax),
-         sfnt_coerce_fixed (outline->ymax));
+      if (!outline)
+       return;
 
-  raster = sfnt_raster_glyph_outline (outline);
+      printf ("outline bounds: %g %g, %g %g\n",
+             sfnt_coerce_fixed (outline->xmin),
+             sfnt_coerce_fixed (outline->ymin),
+             sfnt_coerce_fixed (outline->xmax),
+             sfnt_coerce_fixed (outline->ymax));
 
-  if (raster)
-    sfnt_test_raster (raster, NULL, 0);
+      raster = sfnt_raster_glyph_outline (outline);
 
-  xfree (outline);
-  xfree (raster);
+      if (raster)
+       sfnt_test_raster (raster, NULL, 0);
+
+      xfree (outline);
+      xfree (raster);
+    }
 
   opcode = interpreter->instructions[interpreter->IP];
   printf ("opcode, number of instructions: %s %u\n",
@@ -15351,6 +15360,12 @@ sfnt_verbose (struct sfnt_interpreter *interpreter)
     name = "Any";
 
   printf ("projection function: %s\n", name);
+
+  printf ("proj and free vecs: %d %d %d %d\n",
+         interpreter->state.projection_vector.x,
+         interpreter->state.projection_vector.y,
+         interpreter->state.freedom_vector.x,
+         interpreter->state.freedom_vector.y);
 }
 
 static void
@@ -15534,8 +15549,8 @@ main (int argc, char **argv)
                 data[i]->format);
     }
 
-#define FANCY_PPEM 40
-#define EASY_PPEM  40
+#define FANCY_PPEM 12
+#define EASY_PPEM  12
 
   interpreter = NULL;
   head = sfnt_read_head_table (fd, font);
@@ -15694,6 +15709,7 @@ main (int argc, char **argv)
        {
          fprintf (stderr, "interpreting the font program, with"
                   " %zu instructions\n", fpgm->num_instructions);
+
          trap = sfnt_interpret_font_program (interpreter, fpgm);
 
          if (trap)
@@ -15704,6 +15720,7 @@ main (int argc, char **argv)
        {
          fprintf (stderr, "interpreting the control value program, with"
                   " %zu instructions\n", prep->num_instructions);
+
          trap = sfnt_interpret_control_value_program (interpreter, prep,
                                                       &state);
 
@@ -15878,20 +15895,19 @@ main (int argc, char **argv)
                  sfnt_test_max = outline->ymax - outline->ymin;
 
                  for (i = 0; i < outline->outline_used; i++)
-                   {
-                     printf ("ctx.%s (%g, %g) /* %g, %g */\n",
-                             (outline->outline[i].flags & 
SFNT_GLYPH_OUTLINE_LINETO
-                              ? "lineTo" : "moveTo"),
-                             sfnt_coerce_fixed (outline->outline[i].x
-                                                - outline->xmin),
-                             sfnt_coerce_fixed (sfnt_test_max
-                                                - (outline->outline[i].y
-                                                   - outline->ymin)),
-                             sfnt_coerce_fixed (outline->outline[i].x
-                                                - outline->xmin),
-                             sfnt_coerce_fixed (outline->outline[i].y
-                                                - outline->ymin));
-                   }
+                   printf ("ctx.%s (%g, %g) /* %g, %g */\n",
+                           ((outline->outline[i].flags
+                             & SFNT_GLYPH_OUTLINE_LINETO)
+                            ? "lineTo" : "moveTo"),
+                           sfnt_coerce_fixed (outline->outline[i].x
+                                              - outline->xmin),
+                           sfnt_coerce_fixed (sfnt_test_max
+                                              - (outline->outline[i].y
+                                                 - outline->ymin)),
+                           sfnt_coerce_fixed (outline->outline[i].x
+                                              - outline->xmin),
+                           sfnt_coerce_fixed (outline->outline[i].y
+                                              - outline->ymin));
 
                  clock_gettime (CLOCK_THREAD_CPUTIME_ID, &start);
                  sfnt_build_outline_edges (outline, sfnt_test_edge_ignore,



reply via email to

[Prev in Thread] Current Thread [Next in Thread]