gdiplus: Added draw_polybezier error checking.

This commit is contained in:
Evan Stade 2007-07-11 18:07:39 -07:00 committed by Alexandre Julliard
parent 9d5f568183
commit fa31217d6e
1 changed files with 30 additions and 9 deletions

View File

@ -344,12 +344,24 @@ static void shorten_bezier_amt(GpPointF * pt, REAL amt)
/* Draws bezier curves between given points, and if caps is true then draws an /* Draws bezier curves between given points, and if caps is true then draws an
* endcap at the end of the last line. FIXME: Startcaps not implemented. */ * endcap at the end of the last line. FIXME: Startcaps not implemented. */
static void draw_polybezier(HDC hdc, GpPen *pen, GDIPCONST GpPointF * pt, static GpStatus draw_polybezier(HDC hdc, GpPen *pen, GDIPCONST GpPointF * pt,
INT count, BOOL caps) INT count, BOOL caps)
{ {
POINT *pti = GdipAlloc(count * sizeof(POINT)); POINT *pti;
GpPointF *ptf = GdipAlloc(4 * sizeof(GpPointF)); GpPointF *ptf;
INT i; INT i;
GpStatus status = GenericError;
if(!count)
return Ok;
pti = GdipAlloc(count * sizeof(POINT));
ptf = GdipAlloc(4 * sizeof(GpPointF));
if(!pti || !ptf){
status = OutOfMemory;
goto end;
}
memcpy(ptf, &pt[count-4], 4 * sizeof(GpPointF)); memcpy(ptf, &pt[count-4], 4 * sizeof(GpPointF));
@ -371,8 +383,14 @@ static void draw_polybezier(HDC hdc, GpPen *pen, GDIPCONST GpPointF * pt,
} }
PolyBezier(hdc, pti, count); PolyBezier(hdc, pti, count);
status = Ok;
end:
GdipFree(pti); GdipFree(pti);
GdipFree(ptf); GdipFree(ptf);
return status;
} }
/* Converts from gdiplus path point type to gdi path point type. */ /* Converts from gdiplus path point type to gdi path point type. */
@ -534,6 +552,7 @@ GpStatus WINGDIPAPI GdipDrawArc(GpGraphics *graphics, GpPen *pen, REAL x,
{ {
INT save_state, num_pts; INT save_state, num_pts;
GpPointF points[MAX_ARC_PTS]; GpPointF points[MAX_ARC_PTS];
GpStatus retval;
if(!graphics || !pen) if(!graphics || !pen)
return InvalidParameter; return InvalidParameter;
@ -544,11 +563,11 @@ GpStatus WINGDIPAPI GdipDrawArc(GpGraphics *graphics, GpPen *pen, REAL x,
EndPath(graphics->hdc); EndPath(graphics->hdc);
SelectObject(graphics->hdc, pen->gdipen); SelectObject(graphics->hdc, pen->gdipen);
draw_polybezier(graphics->hdc, pen, points, num_pts, TRUE); retval = draw_polybezier(graphics->hdc, pen, points, num_pts, TRUE);
RestoreDC(graphics->hdc, save_state); RestoreDC(graphics->hdc, save_state);
return Ok; return retval;
} }
GpStatus WINGDIPAPI GdipDrawBezier(GpGraphics *graphics, GpPen *pen, REAL x1, GpStatus WINGDIPAPI GdipDrawBezier(GpGraphics *graphics, GpPen *pen, REAL x1,
@ -556,6 +575,7 @@ GpStatus WINGDIPAPI GdipDrawBezier(GpGraphics *graphics, GpPen *pen, REAL x1,
{ {
INT save_state; INT save_state;
GpPointF pt[4]; GpPointF pt[4];
GpStatus retval;
if(!graphics || !pen) if(!graphics || !pen)
return InvalidParameter; return InvalidParameter;
@ -573,11 +593,11 @@ GpStatus WINGDIPAPI GdipDrawBezier(GpGraphics *graphics, GpPen *pen, REAL x1,
EndPath(graphics->hdc); EndPath(graphics->hdc);
SelectObject(graphics->hdc, pen->gdipen); SelectObject(graphics->hdc, pen->gdipen);
draw_polybezier(graphics->hdc, pen, pt, 4, TRUE); retval = draw_polybezier(graphics->hdc, pen, pt, 4, TRUE);
RestoreDC(graphics->hdc, save_state); RestoreDC(graphics->hdc, save_state);
return Ok; return retval;
} }
/* Approximates cardinal spline with Bezier curves. */ /* Approximates cardinal spline with Bezier curves. */
@ -588,6 +608,7 @@ GpStatus WINGDIPAPI GdipDrawCurve2(GpGraphics *graphics, GpPen *pen,
INT i, len_pt = count*3-2, save_state; INT i, len_pt = count*3-2, save_state;
GpPointF *pt; GpPointF *pt;
REAL x1, x2, y1, y2; REAL x1, x2, y1, y2;
GpStatus retval;
if(!graphics || !pen) if(!graphics || !pen)
return InvalidParameter; return InvalidParameter;
@ -626,12 +647,12 @@ GpStatus WINGDIPAPI GdipDrawCurve2(GpGraphics *graphics, GpPen *pen,
EndPath(graphics->hdc); EndPath(graphics->hdc);
SelectObject(graphics->hdc, pen->gdipen); SelectObject(graphics->hdc, pen->gdipen);
draw_polybezier(graphics->hdc, pen, pt, len_pt, TRUE); retval = draw_polybezier(graphics->hdc, pen, pt, len_pt, TRUE);
GdipFree(pt); GdipFree(pt);
RestoreDC(graphics->hdc, save_state); RestoreDC(graphics->hdc, save_state);
return Ok; return retval;
} }
GpStatus WINGDIPAPI GdipDrawLineI(GpGraphics *graphics, GpPen *pen, INT x1, GpStatus WINGDIPAPI GdipDrawLineI(GpGraphics *graphics, GpPen *pen, INT x1,