gdiplus: Added GdipAddPathLine2.

This commit is contained in:
Evan Stade 2007-07-06 16:14:07 -07:00 committed by Alexandre Julliard
parent 5dc8dee76d
commit e4118c1847
5 changed files with 77 additions and 17 deletions

View File

@ -16,7 +16,7 @@
@ stub GdipAddPathCurveI
@ stub GdipAddPathEllipse
@ stub GdipAddPathEllipseI
@ stub GdipAddPathLine2
@ stdcall GdipAddPathLine2(ptr ptr long)
@ stub GdipAddPathLine2I
@ stub GdipAddPathLine
@ stub GdipAddPathLineI

View File

@ -52,9 +52,9 @@ struct GpSolidFill{
struct GpPath{
GpFillMode fill;
GpGraphics* graphics;
GpPathData pathdata;
BOOL newfigure; /* whether the next drawing action starts a new figure */
INT datalen; /* size of the arrays in pathdata */
};
#endif

View File

@ -30,11 +30,68 @@
WINE_DEFAULT_DEBUG_CHANNEL(gdiplus);
/* make sure path has enough space for len more points */
static BOOL lengthen_path(GpPath *path, INT len)
{
/* initial allocation */
if(path->datalen == 0){
path->datalen = len * 2;
path->pathdata.Points = GdipAlloc(path->datalen * sizeof(PointF));
if(!path->pathdata.Points) return FALSE;
path->pathdata.Types = GdipAlloc(path->datalen);
if(!path->pathdata.Types){
GdipFree(path->pathdata.Points);
return FALSE;
}
}
/* reallocation, double size of arrays */
else if(path->datalen - path->pathdata.Count < len){
while(path->datalen - path->pathdata.Count < len)
path->datalen *= 2;
path->pathdata.Points = HeapReAlloc(GetProcessHeap(), 0,
path->pathdata.Points, path->datalen * sizeof(PointF));
if(!path->pathdata.Points) return FALSE;
path->pathdata.Types = HeapReAlloc(GetProcessHeap(), 0,
path->pathdata.Types, path->datalen);
if(!path->pathdata.Types) return FALSE;
}
return TRUE;
}
GpStatus WINGDIPAPI GdipAddPathLine2(GpPath *path, GDIPCONST GpPointF *points,
INT count)
{
INT i, old_count = path->pathdata.Count;
if(!path || !points)
return InvalidParameter;
if(!lengthen_path(path, count + (path->newfigure ? 1 : 0)))
return OutOfMemory;
for(i = 0; i < count; i++){
path->pathdata.Points[old_count + i].X = points[i].X;
path->pathdata.Points[old_count + i].Y = points[i].Y;
path->pathdata.Types[old_count + i] = PathPointTypeLine;
}
if(path->newfigure){
path->pathdata.Types[old_count] = PathPointTypeStart;
path->newfigure = FALSE;
}
path->pathdata.Count += count;
return Ok;
}
GpStatus WINGDIPAPI GdipCreatePath(GpFillMode fill, GpPath **path)
{
HDC hdc;
GpStatus ret;
if(!path)
return InvalidParameter;
@ -44,24 +101,14 @@ GpStatus WINGDIPAPI GdipCreatePath(GpFillMode fill, GpPath **path)
(*path)->fill = fill;
(*path)->newfigure = TRUE;
hdc = GetDC(0);
ret = GdipCreateFromHDC(hdc, &((*path)->graphics));
if(ret != Ok){
ReleaseDC(0, hdc);
GdipFree(*path);
}
return ret;
return Ok;
}
GpStatus WINGDIPAPI GdipDeletePath(GpPath *path)
{
if(!path || !(path->graphics))
if(!path)
return InvalidParameter;
ReleaseDC(0, path->graphics->hdc);
GdipDeleteGraphics(path->graphics);
GdipFree(path);
return Ok;

View File

@ -62,12 +62,24 @@ enum LineCap
LineCapAnchorMask = 0xf0
};
enum PathPointType{
PathPointTypeStart = 0, /* start of a figure */
PathPointTypeLine = 1,
PathPointTypeBezier = 3,
PathPointTypePathTypeMask = 7,
PathPointTypePathDashMode = 16, /* not used */
PathPointTypePathMarker = 32,
PathPointTypeCloseSubpath = 128, /* end of a closed figure */
PathPointTypeBezier3 = 3
};
#ifndef __cplusplus
typedef enum Unit Unit;
typedef enum BrushType BrushType;
typedef enum FillMode FillMode;
typedef enum LineCap LineCap;
typedef enum PathPointType PathPointType;
#endif /* end of c typedefs */

View File

@ -48,6 +48,7 @@ GpStatus WINGDIPAPI GdipCreateSolidFill(ARGB,GpSolidFill**);
GpStatus WINGDIPAPI GdipGetBrushType(GpBrush*,GpBrushType*);
GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush*);
GpStatus WINGDIPAPI GdipAddPathLine2(GpPath*,GDIPCONST GpPointF*,INT);
GpStatus WINGDIPAPI GdipCreatePath(GpFillMode,GpPath**);
GpStatus WINGDIPAPI GdipDeletePath(GpPath*);