summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDr.Smile <vabnick@gmail.com>2017-04-08 21:15:48 +0300
committerDr.Smile <vabnick@gmail.com>2017-07-31 06:27:24 +0300
commit71fb459728b9805f30706eb91c02d7faeaa0b1c7 (patch)
tree0e4db1e16c711e6be64702598882f63231806ecb
parentc1e2e40cc9461d35340967e2c0d0aadd73dae999 (diff)
downloadlibass-71fb459728b9805f30706eb91c02d7faeaa0b1c7.tar.bz2
libass-71fb459728b9805f30706eb91c02d7faeaa0b1c7.tar.xz
stroker: skip degenerate 2-point contours from broken fonts
-rw-r--r--libass/ass_outline.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/libass/ass_outline.c b/libass/ass_outline.c
index e8c5e53..d681bef 100644
--- a/libass/ass_outline.c
+++ b/libass/ass_outline.c
@@ -59,12 +59,20 @@ bool outline_convert(ASS_Outline *outline, const FT_Outline *source)
if (!outline_alloc(outline, source->n_points, source->n_contours))
return false;
- for (int i = 0; i < source->n_contours; i++)
- outline->contours[i] = source->contours[i];
- memcpy(outline->points, source->points, sizeof(FT_Vector) * source->n_points);
- memcpy(outline->tags, source->tags, source->n_points);
- outline->n_contours = source->n_contours;
- outline->n_points = source->n_points;
+ short start = 0;
+ outline->n_contours = outline->n_points = 0;
+ for (int i = 0; i < source->n_contours; i++) {
+ size_t n = source->contours[i] - start + 1;
+ // skip degenerate 2-point contours from broken fonts
+ if (n >= 3) {
+ memcpy(outline->points + outline->n_points, source->points + start, sizeof(FT_Vector) * n);
+ memcpy(outline->tags + outline->n_points, source->tags + start, n);
+
+ outline->n_points += n;
+ outline->contours[outline->n_contours++] = outline->n_points - 1;
+ }
+ start = source->contours[i] + 1;
+ }
return true;
}