Evan Stade : gdiplus: Added draw_polybezier error checking.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jul 12 08:32:36 CDT 2007


Module: wine
Branch: master
Commit: fa31217d6e831bf7b04f05d42e0c3dd58f496979
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=fa31217d6e831bf7b04f05d42e0c3dd58f496979

Author: Evan Stade <estade at gmail.com>
Date:   Wed Jul 11 18:07:39 2007 -0700

gdiplus: Added draw_polybezier error checking.

---

 dlls/gdiplus/graphics.c |   39 ++++++++++++++++++++++++++++++---------
 1 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index c16a744..2a3ea33 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -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
  * 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)
 {
-    POINT *pti = GdipAlloc(count * sizeof(POINT));
-    GpPointF *ptf = GdipAlloc(4 * sizeof(GpPointF));
+    POINT *pti;
+    GpPointF *ptf;
     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));
 
@@ -371,8 +383,14 @@ static void draw_polybezier(HDC hdc, GpPen *pen, GDIPCONST GpPointF * pt,
     }
 
     PolyBezier(hdc, pti, count);
+
+    status = Ok;
+
+end:
     GdipFree(pti);
     GdipFree(ptf);
+
+    return status;
 }
 
 /* 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;
     GpPointF points[MAX_ARC_PTS];
+    GpStatus retval;
 
     if(!graphics || !pen)
         return InvalidParameter;
@@ -544,11 +563,11 @@ GpStatus WINGDIPAPI GdipDrawArc(GpGraphics *graphics, GpPen *pen, REAL x,
     EndPath(graphics->hdc);
     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);
 
-    return Ok;
+    return retval;
 }
 
 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;
     GpPointF pt[4];
+    GpStatus retval;
 
     if(!graphics || !pen)
         return InvalidParameter;
@@ -573,11 +593,11 @@ GpStatus WINGDIPAPI GdipDrawBezier(GpGraphics *graphics, GpPen *pen, REAL x1,
     EndPath(graphics->hdc);
     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);
 
-    return Ok;
+    return retval;
 }
 
 /* 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;
     GpPointF *pt;
     REAL x1, x2, y1, y2;
+    GpStatus retval;
 
     if(!graphics || !pen)
         return InvalidParameter;
@@ -626,12 +647,12 @@ GpStatus WINGDIPAPI GdipDrawCurve2(GpGraphics *graphics, GpPen *pen,
     EndPath(graphics->hdc);
     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);
     RestoreDC(graphics->hdc, save_state);
 
-    return Ok;
+    return retval;
 }
 
 GpStatus WINGDIPAPI GdipDrawLineI(GpGraphics *graphics, GpPen *pen, INT x1,




More information about the wine-cvs mailing list