[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,