From c379fe50574e5b5dd6e17f15d8473c5713d1b823 Mon Sep 17 00:00:00 2001 From: Thomas Loimer Date: Wed, 11 Dec 2019 21:36:46 +0100 Subject: [PATCH 4/8] Convert polygons with too few points to polylines As a side effect, this also fixes ticket #56. --- CHANGES | 1 + fig2dev/read.c | 16 ++++++++++++++++ fig2dev/tests/read.at | 11 +++++++++++ 3 files changed, 28 insertions(+) diff --git a/CHANGES b/CHANGES index 964dc84..b2f7006 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ Patchlevel Xx (Xxx 20xx) BUGS FIXED: Ticket numbers refer to https://sourceforge.net/p/mcj/tickets/#. + o Convert polygons having too few points to polylines. Ticket #56. o Reject huge arrow types causing integer overflow. Ticket #57. o Allow Fig v2 text strings ending with multiple ^A. Ticket #55. o Embed images in pdfs with their original compression type, i.e., leave diff --git a/fig2dev/read.c b/fig2dev/read.c index 09bd17d..9500091 100644 --- a/fig2dev/read.c +++ b/fig2dev/read.c @@ -793,8 +793,10 @@ read_ellipseobject(void) /* * Sanitize line objects. Return 0 on success, -1 otherwise. * On error, call free_linestorage(l) after sanitize_lineobject(). + * * polylines: remove fill, if less than 3 points * remove arrows, if only one point + * polygons: convert to polyline if less than 3 unique points * rectangles, polygons: last point must coincide with first point * rectangle: convert to polygon, if not 5 points * rectangle with rounded corners: error, if not 5 points @@ -854,6 +856,20 @@ sanitize_lineobject( q->y = l->points->y; } + if (l->type == T_POLYGON) { + int npts; + + q = l->points; + for (npts = 1; q->next && npts < 4; q = q->next) + ++npts; + if (npts < 4 ) { + put_msg("A polygon with %d points at line %d - convert to a polyline.", + npts, line_no); + l->type = T_POLYLINE; + return 0; + } + } + if (l->type == T_BOX || l->type == T_ARC_BOX || l->type == T_PIC_BOX) { int npts = 1; for (q = l->points; q->next; q = q->next) diff --git a/fig2dev/tests/read.at b/fig2dev/tests/read.at index e9a71a3..4ef8747 100644 --- a/fig2dev/tests/read.at +++ b/fig2dev/tests/read.at @@ -147,6 +147,17 @@ EOF ]) AT_CLEANUP +AT_SETUP([convert short polygon to polyline, ticket #56]) +AT_KEYWORDS(read.c polygon) +AT_CHECK([fig2dev -L ptk <