From f5ee53e69113f03c4c3aadb941e4e36b1170841e Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 2 Sep 2018 17:25:36 -0400 Subject: [PATCH] ... --- MagickCore/draw.c | 219 +++++++++++++++++++++++++++------------------- 1 file changed, 127 insertions(+), 92 deletions(-) diff --git a/MagickCore/draw.c b/MagickCore/draw.c index acf905de7..9eae09db7 100644 --- a/MagickCore/draw.c +++ b/MagickCore/draw.c @@ -192,15 +192,7 @@ static Image static MagickBooleanType DrawStrokePolygon(Image *,const DrawInfo *,const PrimitiveInfo *, ExceptionInfo *), - RenderMVGContent(Image *,const DrawInfo *,const size_t,ExceptionInfo *); - -static PrimitiveInfo - *TraceStrokePolygon(const Image *,const DrawInfo *,const PrimitiveInfo *); - -static size_t - TracePath(MVGInfo *,const char *,ExceptionInfo *); - -static void + RenderMVGContent(Image *,const DrawInfo *,const size_t,ExceptionInfo *), TraceArc(MVGInfo *,const PointInfo,const PointInfo,const PointInfo), TraceArcPath(MVGInfo *,const PointInfo,const PointInfo,const PointInfo, const double,const MagickBooleanType,const MagickBooleanType), @@ -211,6 +203,12 @@ static void TraceRectangle(PrimitiveInfo *,const PointInfo,const PointInfo), TraceRoundRectangle(MVGInfo *,const PointInfo,const PointInfo,PointInfo), TraceSquareLinecap(PrimitiveInfo *,const size_t,const double); + +static PrimitiveInfo + *TraceStrokePolygon(const Image *,const DrawInfo *,const PrimitiveInfo *); + +static size_t + TracePath(MVGInfo *,const char *,ExceptionInfo *); /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1421,7 +1419,7 @@ static MagickBooleanType DrawBoundingRectangles(Image *image, end.x=(double) (polygon_info->edges[i].bounds.x2+mid); end.y=(double) (polygon_info->edges[i].bounds.y2+mid); primitive_info[0].primitive=RectanglePrimitive; - TraceRectangle(primitive_info,start,end); + status&=TraceRectangle(primitive_info,start,end); primitive_info[0].method=ReplaceMethod; coordinates=(ssize_t) primitive_info[0].coordinates; primitive_info[coordinates].primitive=UndefinedPrimitive; @@ -1447,7 +1445,7 @@ static MagickBooleanType DrawBoundingRectangles(Image *image, end.x=(double) (bounds.x2+mid); end.y=(double) (bounds.y2+mid); primitive_info[0].primitive=RectanglePrimitive; - TraceRectangle(primitive_info,start,end); + status&=TraceRectangle(primitive_info,start,end); primitive_info[0].method=ReplaceMethod; coordinates=(ssize_t) primitive_info[0].coordinates; primitive_info[coordinates].primitive=UndefinedPrimitive; @@ -2242,15 +2240,20 @@ static MagickBooleanType CheckPrimitiveExtent(MVGInfo *mvg_info, /* Check if there is enough storage for drawing pimitives. */ - extent=(size_t) mvg_info->offset+pad+4096; - if (extent <= *mvg_info->extent) - return(MagickTrue); - *mvg_info->primitive_info=ResizeQuantumMemory(*mvg_info->primitive_info, - extent,sizeof(**mvg_info->primitive_info)); - if (*mvg_info->primitive_info != (PrimitiveInfo *) NULL) + extent=(size_t) mvg_info->offset; + if ((HeapOverflowSanityCheck(extent,pad) != MagickFalse) && + (HeapOverflowSanityCheck(extent+pad,4096) != MagickFalse)) { - *mvg_info->extent=extent; - return(MagickTrue); + extent+=pad+4096; + if (extent <= *mvg_info->extent) + return(MagickTrue); + *mvg_info->primitive_info=ResizeQuantumMemory(*mvg_info->primitive_info, + extent,sizeof(**mvg_info->primitive_info)); + if (*mvg_info->primitive_info != (PrimitiveInfo *) NULL) + { + *mvg_info->extent=extent; + return(MagickTrue); + } } /* Reallocation failed, allocate a primitive to facilitate unwinding. @@ -2363,15 +2366,17 @@ static inline MagickBooleanType IsPoint(const char *point) value; value=StringToDouble(point,&p); - return((fabs(value) < MagickEpsilon) && (p == point) ? MagickFalse : MagickTrue); + return((fabs(value) < MagickEpsilon) && (p == point) ? MagickFalse : + MagickTrue); } -static inline void TracePoint(PrimitiveInfo *primitive_info, +static inline MagickBooleanType TracePoint(PrimitiveInfo *primitive_info, const PointInfo point) { primitive_info->coordinates=1; primitive_info->closed_subpath=MagickFalse; primitive_info->point=point; + return(MagickTrue); } static MagickBooleanType RenderMVGContent(Image *image, @@ -4045,7 +4050,7 @@ static MagickBooleanType RenderMVGContent(Image *image, status=MagickFalse; break; } - TracePoint(primitive_info+j,primitive_info[j].point); + status&=TracePoint(primitive_info+j,primitive_info[j].point); i=(ssize_t) (j+primitive_info[j].coordinates); break; } @@ -4056,7 +4061,7 @@ static MagickBooleanType RenderMVGContent(Image *image, status=MagickFalse; break; } - TraceLine(primitive_info+j,primitive_info[j].point, + status&=TraceLine(primitive_info+j,primitive_info[j].point, primitive_info[j+1].point); i=(ssize_t) (j+primitive_info[j].coordinates); break; @@ -4068,7 +4073,7 @@ static MagickBooleanType RenderMVGContent(Image *image, status=MagickFalse; break; } - TraceRectangle(primitive_info+j,primitive_info[j].point, + status&=TraceRectangle(primitive_info+j,primitive_info[j].point, primitive_info[j+1].point); i=(ssize_t) (j+primitive_info[j].coordinates); break; @@ -4096,7 +4101,7 @@ static MagickBooleanType RenderMVGContent(Image *image, status=MagickFalse; break; } - TraceRoundRectangle(&mvg_info,primitive_info[j].point, + status&=TraceRoundRectangle(&mvg_info,primitive_info[j].point, primitive_info[j+1].point,primitive_info[j+2].point); i=(ssize_t) (j+primitive_info[j].coordinates); break; @@ -4108,8 +4113,8 @@ static MagickBooleanType RenderMVGContent(Image *image, primitive_type=UndefinedPrimitive; break; } - TraceArc(&mvg_info,primitive_info[j].point,primitive_info[j+1].point, - primitive_info[j+2].point); + status&=TraceArc(&mvg_info,primitive_info[j].point, + primitive_info[j+1].point,primitive_info[j+2].point); i=(ssize_t) (j+primitive_info[j].coordinates); break; } @@ -4126,7 +4131,7 @@ static MagickBooleanType RenderMVGContent(Image *image, status=MagickFalse; break; } - TraceEllipse(&mvg_info,primitive_info[j].point, + status&=TraceEllipse(&mvg_info,primitive_info[j].point, primitive_info[j+1].point,primitive_info[j+2].point); i=(ssize_t) (j+primitive_info[j].coordinates); break; @@ -4138,7 +4143,7 @@ static MagickBooleanType RenderMVGContent(Image *image, status=MagickFalse; break; } - TraceCircle(&mvg_info,primitive_info[j].point, + status&=TraceCircle(&mvg_info,primitive_info[j].point, primitive_info[j+1].point); i=(ssize_t) (j+primitive_info[j].coordinates); break; @@ -4173,7 +4178,7 @@ static MagickBooleanType RenderMVGContent(Image *image, status=MagickFalse; break; } - TraceBezier(&mvg_info,primitive_info[j].coordinates); + status&=TraceBezier(&mvg_info,primitive_info[j].coordinates); i=(ssize_t) (j+primitive_info[j].coordinates); break; } @@ -5870,7 +5875,7 @@ static inline double Permutate(const ssize_t n,const ssize_t k) % */ -static void TraceArc(MVGInfo *mvg_info,const PointInfo start, +static MagickBooleanType TraceArc(MVGInfo *mvg_info,const PointInfo start, const PointInfo end,const PointInfo degrees) { PointInfo @@ -5881,10 +5886,10 @@ static void TraceArc(MVGInfo *mvg_info,const PointInfo start, center.y=0.5*(end.y+start.y); radius.x=fabs(center.x-start.x); radius.y=fabs(center.y-start.y); - TraceEllipse(mvg_info,center,radius,degrees); + return(TraceEllipse(mvg_info,center,radius,degrees)); } -static void TraceArcPath(MVGInfo *mvg_info,const PointInfo start, +static MagickBooleanType TraceArcPath(MVGInfo *mvg_info,const PointInfo start, const PointInfo end,const PointInfo arc,const double angle, const MagickBooleanType large_arc,const MagickBooleanType sweep) { @@ -5896,6 +5901,9 @@ static void TraceArcPath(MVGInfo *mvg_info,const PointInfo start, gamma, theta; + MagickBooleanType + status; + PointInfo center, points[3], @@ -5925,17 +5933,11 @@ static void TraceArcPath(MVGInfo *mvg_info,const PointInfo start, primitive_info->coordinates=0; if ((fabs(start.x-end.x) < MagickEpsilon) && (fabs(start.y-end.y) < MagickEpsilon)) - { - TracePoint(primitive_info,end); - return; - } + return(TracePoint(primitive_info,end)); radii.x=fabs(arc.x); radii.y=fabs(arc.y); if ((fabs(radii.x) < MagickEpsilon) || (fabs(radii.y) < MagickEpsilon)) - { - TraceLine(primitive_info,start,end); - return; - } + return(TraceLine(primitive_info,start,end)); cosine=cos(DegreesToRadians(fmod((double) angle,360.0))); sine=sin(DegreesToRadians(fmod((double) angle,360.0))); center.x=(double) (cosine*(end.x-start.x)/2+sine*(end.y-start.y)/2); @@ -5943,10 +5945,7 @@ static void TraceArcPath(MVGInfo *mvg_info,const PointInfo start, delta=(center.x*center.x)/(radii.x*radii.x)+(center.y*center.y)/ (radii.y*radii.y); if (delta < MagickEpsilon) - { - TraceLine(primitive_info,start,end); - return; - } + return(TraceLine(primitive_info,start,end)); if (delta > 1.0) { radii.x*=sqrt((double) delta); @@ -5976,7 +5975,9 @@ static void TraceArcPath(MVGInfo *mvg_info,const PointInfo start, else if ((theta > 0.0) && (sweep == MagickFalse)) theta-=2.0*MagickPI; - arc_segments=(size_t) ceil(fabs((double) (theta/(0.5*MagickPI+MagickEpsilon)))); + arc_segments=(size_t) ceil(fabs((double) (theta/(0.5*MagickPI+ + MagickEpsilon)))); + status=MagickTrue; p=primitive_info; for (i=0; i < (ssize_t) arc_segments; i++) { @@ -6014,7 +6015,7 @@ static void TraceArcPath(MVGInfo *mvg_info,const PointInfo start, points[2].y); if (i == (ssize_t) (arc_segments-1)) (p+3)->point=end; - TraceBezier(mvg_info,4); + status&=TraceBezier(mvg_info,4); p=(*mvg_info->primitive_info)+mvg_info->offset; mvg_info->offset+=p->coordinates; p+=p->coordinates; @@ -6028,9 +6029,11 @@ static void TraceArcPath(MVGInfo *mvg_info,const PointInfo start, p->primitive=primitive_info->primitive; p--; } + return(status); } -static void TraceBezier(MVGInfo *mvg_info,const size_t number_coordinates) +static MagickBooleanType TraceBezier(MVGInfo *mvg_info, + const size_t number_coordinates) { double alpha, @@ -6077,7 +6080,7 @@ static void TraceBezier(MVGInfo *mvg_info,const size_t number_coordinates) (double) BezierQuantum); control_points=quantum*number_coordinates; if (CheckPrimitiveExtent(mvg_info,control_points+1) == MagickFalse) - return; + return(MagickFalse); primitive_info=(*mvg_info->primitive_info)+mvg_info->offset; coefficients=(double *) AcquireQuantumMemory((size_t) number_coordinates,sizeof(*coefficients)); @@ -6114,10 +6117,12 @@ static void TraceBezier(MVGInfo *mvg_info,const size_t number_coordinates) p=primitive_info; for (i=0; i < (ssize_t) control_points; i++) { - TracePoint(p,points[i]); + if (TracePoint(p,points[i]) == MagickFalse) + return(MagickFalse); p+=p->coordinates; } - TracePoint(p,end); + if (TracePoint(p,end) == MagickFalse) + return(MagickFalse); p+=p->coordinates; primitive_info->coordinates=(size_t) (p-primitive_info); primitive_info->closed_subpath=MagickFalse; @@ -6128,9 +6133,10 @@ static void TraceBezier(MVGInfo *mvg_info,const size_t number_coordinates) } points=(PointInfo *) RelinquishMagickMemory(points); coefficients=(double *) RelinquishMagickMemory(coefficients); + return(MagickTrue); } -static void TraceCircle(MVGInfo *mvg_info,const PointInfo start, +static MagickBooleanType TraceCircle(MVGInfo *mvg_info,const PointInfo start, const PointInfo end) { double @@ -6149,10 +6155,10 @@ static void TraceCircle(MVGInfo *mvg_info,const PointInfo start, offset.y=(double) radius; degrees.x=0.0; degrees.y=360.0; - TraceEllipse(mvg_info,start,offset,degrees); + return(TraceEllipse(mvg_info,start,offset,degrees)); } -static void TraceEllipse(MVGInfo *mvg_info,const PointInfo center, +static MagickBooleanType TraceEllipse(MVGInfo *mvg_info,const PointInfo center, const PointInfo radii,const PointInfo arc) { double @@ -6183,7 +6189,7 @@ static void TraceEllipse(MVGInfo *mvg_info,const PointInfo center, primitive_info=(*mvg_info->primitive_info)+mvg_info->offset; primitive_info->coordinates=0; if ((fabs(radii.x) < MagickEpsilon) || (fabs(radii.y) < MagickEpsilon)) - return; + return(MagickTrue); delta=2.0*PerceptibleReciprocal(MagickMax(radii.x,radii.y)); step=MagickPI/8.0; if ((delta >= 0.0) && (delta < (MagickPI/8.0))) @@ -6195,18 +6201,20 @@ static void TraceEllipse(MVGInfo *mvg_info,const PointInfo center, angle.y=DegreesToRadians(y); extent=(size_t) ceil((angle.y-angle.x)/step)+1; if (CheckPrimitiveExtent(mvg_info,extent) == MagickFalse) - return; + return(MagickFalse); primitive_info=(*mvg_info->primitive_info)+mvg_info->offset; for (p=primitive_info; angle.x < angle.y; angle.x+=step) { point.x=cos(fmod(angle.x,DegreesToRadians(360.0)))*radii.x+center.x; point.y=sin(fmod(angle.x,DegreesToRadians(360.0)))*radii.y+center.y; - TracePoint(p,point); + if (TracePoint(p,point) == MagickFalse) + return(MagickFalse); p+=p->coordinates; } point.x=cos(fmod(angle.y,DegreesToRadians(360.0)))*radii.x+center.x; point.y=sin(fmod(angle.y,DegreesToRadians(360.0)))*radii.y+center.y; - TracePoint(p,point); + if (TracePoint(p,point) == MagickFalse) + return(MagickFalse); p+=p->coordinates; primitive_info->coordinates=(size_t) (p-primitive_info); primitive_info->closed_subpath=MagickFalse; @@ -6221,23 +6229,27 @@ static void TraceEllipse(MVGInfo *mvg_info,const PointInfo center, p->primitive=primitive_info->primitive; p--; } + return(MagickTrue); } -static void TraceLine(PrimitiveInfo *primitive_info,const PointInfo start, - const PointInfo end) +static MagickBooleanType TraceLine(PrimitiveInfo *primitive_info, + const PointInfo start,const PointInfo end) { - TracePoint(primitive_info,start); + if (TracePoint(primitive_info,start) == MagickFalse) + return(MagickFalse); if ((fabs(start.x-end.x) < MagickEpsilon) && (fabs(start.y-end.y) < MagickEpsilon)) { primitive_info->primitive=PointPrimitive; primitive_info->coordinates=1; - return; + return(MagickTrue); } - TracePoint(primitive_info+1,end); + if (TracePoint(primitive_info+1,end) == MagickFalse) + return(MagickFalse); (primitive_info+1)->primitive=primitive_info->primitive; primitive_info->coordinates=2; primitive_info->closed_subpath=MagickFalse; + return(MagickTrue); } static size_t TracePath(MVGInfo *mvg_info,const char *path, @@ -6366,7 +6378,8 @@ static size_t TracePath(MVGInfo *mvg_info,const char *path, ThrowPointExpectedException(token,exception); end.x=(double) (attribute == (int) 'A' ? x : point.x+x); end.y=(double) (attribute == (int) 'A' ? y : point.y+y); - TraceArcPath(mvg_info,point,end,arc,angle,large_arc,sweep); + if (TraceArcPath(mvg_info,point,end,arc,angle,large_arc,sweep) == MagickFalse) + return(0); q=(*mvg_info->primitive_info)+mvg_info->offset; mvg_info->offset+=q->coordinates; q+=q->coordinates; @@ -6407,7 +6420,8 @@ static size_t TracePath(MVGInfo *mvg_info,const char *path, } for (i=0; i < 4; i++) (q+i)->point=points[i]; - TraceBezier(mvg_info,4); + if (TraceBezier(mvg_info,4) == MagickFalse) + return(0); q=(*mvg_info->primitive_info)+mvg_info->offset; mvg_info->offset+=q->coordinates; q+=q->coordinates; @@ -6434,7 +6448,8 @@ static size_t TracePath(MVGInfo *mvg_info,const char *path, if (CheckPrimitiveExtent(mvg_info,4096) == MagickFalse) return(0); q=(*mvg_info->primitive_info)+mvg_info->offset; - TracePoint(q,point); + if (TracePoint(q,point) == MagickFalse) + return(0); mvg_info->offset+=q->coordinates; q+=q->coordinates; while (isspace((int) ((unsigned char) *p)) != 0) @@ -6469,7 +6484,8 @@ static size_t TracePath(MVGInfo *mvg_info,const char *path, if (CheckPrimitiveExtent(mvg_info,4096) == MagickFalse) return(0); q=(*mvg_info->primitive_info)+mvg_info->offset; - TracePoint(q,point); + if (TracePoint(q,point) == MagickFalse) + return(0); mvg_info->offset+=q->coordinates; q+=q->coordinates; while (isspace((int) ((unsigned char) *p)) != 0) @@ -6516,7 +6532,8 @@ static size_t TracePath(MVGInfo *mvg_info,const char *path, if (CheckPrimitiveExtent(mvg_info,4096) == MagickFalse) return(0); q=(*mvg_info->primitive_info)+mvg_info->offset; - TracePoint(q,point); + if (TracePoint(q,point) == MagickFalse) + return(0); mvg_info->offset+=q->coordinates; q+=q->coordinates; while (isspace((int) ((unsigned char) *p)) != 0) @@ -6557,7 +6574,8 @@ static size_t TracePath(MVGInfo *mvg_info,const char *path, } for (i=0; i < 3; i++) (q+i)->point=points[i]; - TraceBezier(mvg_info,3); + if (TraceBezier(mvg_info,3) == MagickFalse) + return(0); q=(*mvg_info->primitive_info)+mvg_info->offset; mvg_info->offset+=q->coordinates; q+=q->coordinates; @@ -6607,7 +6625,8 @@ static size_t TracePath(MVGInfo *mvg_info,const char *path, } for (i=0; i < 4; i++) (q+i)->point=points[i]; - TraceBezier(mvg_info,4); + if (TraceBezier(mvg_info,4) == MagickFalse) + return(0); q=(*mvg_info->primitive_info)+mvg_info->offset; mvg_info->offset+=q->coordinates; q+=q->coordinates; @@ -6658,7 +6677,8 @@ static size_t TracePath(MVGInfo *mvg_info,const char *path, } for (i=0; i < 3; i++) (q+i)->point=points[i]; - TraceBezier(mvg_info,3); + if (TraceBezier(mvg_info,3) == MagickFalse) + return(0); q=(*mvg_info->primitive_info)+mvg_info->offset; mvg_info->offset+=q->coordinates; q+=q->coordinates; @@ -6689,7 +6709,8 @@ static size_t TracePath(MVGInfo *mvg_info,const char *path, if (CheckPrimitiveExtent(mvg_info,4096) == MagickFalse) return(0); q=(*mvg_info->primitive_info)+mvg_info->offset; - TracePoint(q,point); + if (TracePoint(q,point) == MagickFalse) + return(0); mvg_info->offset+=q->coordinates; q+=q->coordinates; while (isspace((int) ((unsigned char) *p)) != 0) @@ -6709,7 +6730,8 @@ static size_t TracePath(MVGInfo *mvg_info,const char *path, if (CheckPrimitiveExtent(mvg_info,4096) == MagickFalse) return(0); q=(*mvg_info->primitive_info)+mvg_info->offset; - TracePoint(q,point); + if (TracePoint(q,point) == MagickFalse) + return(0); mvg_info->offset+=q->coordinates; q+=q->coordinates; primitive_info=(*mvg_info->primitive_info)+subpath_offset; @@ -6744,8 +6766,8 @@ static size_t TracePath(MVGInfo *mvg_info,const char *path, return(number_coordinates); } -static void TraceRectangle(PrimitiveInfo *primitive_info,const PointInfo start, - const PointInfo end) +static MagickBooleanType TraceRectangle(PrimitiveInfo *primitive_info, + const PointInfo start,const PointInfo end) { PointInfo point; @@ -6760,22 +6782,27 @@ static void TraceRectangle(PrimitiveInfo *primitive_info,const PointInfo start, (fabs(start.y-end.y) < MagickEpsilon)) { primitive_info->coordinates=0; - return; + return(MagickTrue); } p=primitive_info; - TracePoint(p,start); + if (TracePoint(p,start) == MagickFalse) + return(MagickFalse); p+=p->coordinates; point.x=start.x; point.y=end.y; - TracePoint(p,point); + if (TracePoint(p,point) == MagickFalse) + return(MagickFalse); p+=p->coordinates; - TracePoint(p,end); + if (TracePoint(p,end) == MagickFalse) + return(MagickFalse); p+=p->coordinates; point.x=end.x; point.y=start.y; - TracePoint(p,point); + if (TracePoint(p,point) == MagickFalse) + return(MagickFalse); p+=p->coordinates; - TracePoint(p,start); + if (TracePoint(p,start) == MagickFalse) + return(MagickFalse); p+=p->coordinates; primitive_info->coordinates=(size_t) (p-primitive_info); primitive_info->closed_subpath=MagickTrue; @@ -6784,10 +6811,11 @@ static void TraceRectangle(PrimitiveInfo *primitive_info,const PointInfo start, p->primitive=primitive_info->primitive; p--; } + return(MagickTrue); } -static void TraceRoundRectangle(MVGInfo *mvg_info,const PointInfo start, - const PointInfo end,PointInfo arc) +static MagickBooleanType TraceRoundRectangle(MVGInfo *mvg_info, + const PointInfo start,const PointInfo end,PointInfo arc) { PointInfo degrees, @@ -6812,7 +6840,7 @@ static void TraceRoundRectangle(MVGInfo *mvg_info,const PointInfo start, if ((segment.x < MagickEpsilon) || (segment.y < MagickEpsilon)) { (*mvg_info->primitive_info+mvg_info->offset)->coordinates=0; - return; + return(MagickTrue); } if (arc.x > (0.5*segment.x)) arc.x=0.5*segment.x; @@ -6822,34 +6850,39 @@ static void TraceRoundRectangle(MVGInfo *mvg_info,const PointInfo start, point.y=start.y+arc.y; degrees.x=270.0; degrees.y=360.0; - TraceEllipse(mvg_info,point,arc,degrees); + if (TraceEllipse(mvg_info,point,arc,degrees) == MagickFalse) + return(MagickFalse); p=(*mvg_info->primitive_info)+mvg_info->offset; mvg_info->offset+=p->coordinates; point.x=start.x+segment.x-arc.x; point.y=start.y+segment.y-arc.y; degrees.x=0.0; degrees.y=90.0; - TraceEllipse(mvg_info,point,arc,degrees); + if (TraceEllipse(mvg_info,point,arc,degrees) == MagickFalse) + return(MagickFalse); p=(*mvg_info->primitive_info)+mvg_info->offset; mvg_info->offset+=p->coordinates; point.x=start.x+arc.x; point.y=start.y+segment.y-arc.y; degrees.x=90.0; degrees.y=180.0; - TraceEllipse(mvg_info,point,arc,degrees); + if (TraceEllipse(mvg_info,point,arc,degrees) == MagickFalse) + return(MagickFalse); p=(*mvg_info->primitive_info)+mvg_info->offset; mvg_info->offset+=p->coordinates; point.x=start.x+arc.x; point.y=start.y+arc.y; degrees.x=180.0; degrees.y=270.0; - TraceEllipse(mvg_info,point,arc,degrees); + if (TraceEllipse(mvg_info,point,arc,degrees) == MagickFalse) + return(MagickFalse); p=(*mvg_info->primitive_info)+mvg_info->offset; mvg_info->offset+=p->coordinates; if (CheckPrimitiveExtent(mvg_info,4096) == MagickFalse) - return; + return(MagickFalse); p=(*mvg_info->primitive_info)+mvg_info->offset; - TracePoint(p,(*mvg_info->primitive_info+offset)->point); + if (TracePoint(p,(*mvg_info->primitive_info+offset)->point) == MagickFalse) + return(MagickFalse); p+=p->coordinates; mvg_info->offset=offset; primitive_info=(*mvg_info->primitive_info)+offset; @@ -6860,9 +6893,10 @@ static void TraceRoundRectangle(MVGInfo *mvg_info,const PointInfo start, p->primitive=primitive_info->primitive; p--; } + return(MagickTrue); } -static void TraceSquareLinecap(PrimitiveInfo *primitive_info, +static MagickBooleanType TraceSquareLinecap(PrimitiveInfo *primitive_info, const size_t number_vertices,const double offset) { double @@ -6908,6 +6942,7 @@ static void TraceSquareLinecap(PrimitiveInfo *primitive_info, dx*(distance+offset)/distance); primitive_info[number_vertices-1].point.y=(double) (primitive_info[j].point.y+ dy*(distance+offset)/distance); + return(MagickTrue); } static PrimitiveInfo *TraceStrokePolygon(const Image *image, @@ -7080,7 +7115,7 @@ static PrimitiveInfo *TraceStrokePolygon(const Image *image, mid=ExpandAffine(&draw_info->affine)*SaneStrokeWidth(image,draw_info)/2.0; miterlimit=(double) (draw_info->miterlimit*draw_info->miterlimit*mid*mid); if ((draw_info->linecap == SquareCap) && (closed_path == MagickFalse)) - TraceSquareLinecap(polygon_primitive,number_vertices,mid); + (void) TraceSquareLinecap(polygon_primitive,number_vertices,mid); offset.x=sqrt((double) (mid*mid/(inverse_slope.p*inverse_slope.p+1.0))); offset.y=(double) (offset.x*inverse_slope.p); if ((dy.p*offset.x-dx.p*offset.y) > 0.0) -- 2.40.0