Author: dchapyshev Date: Sat Feb 14 02:14:34 2009 New Revision: 39601
URL: http://svn.reactos.org/svn/reactos?rev=39601&view=rev Log: - Sync gdiplus with Wine head
Modified: trunk/reactos/dll/win32/gdiplus/font.c trunk/reactos/dll/win32/gdiplus/gdiplus.spec trunk/reactos/dll/win32/gdiplus/graphics.c trunk/reactos/dll/win32/gdiplus/graphicspath.c trunk/reactos/dll/win32/gdiplus/image.c trunk/reactos/dll/win32/gdiplus/region.c trunk/reactos/dll/win32/gdiplus/stringformat.c trunk/reactos/include/psdk/gdiplusflat.h
Modified: trunk/reactos/dll/win32/gdiplus/font.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/font.c?re... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/font.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/font.c [iso-8859-1] Sat Feb 14 02:14:34 2009 @@ -374,6 +374,29 @@ }
/******************************************************************************* + * GdipGetLogFontA [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipGetLogFontA(GpFont *font, GpGraphics *graphics, + LOGFONTA *lfa) +{ + GpStatus status; + LOGFONTW lfw; + + TRACE("(%p, %p, %p)\n", font, graphics, lfa); + + status = GdipGetLogFontW(font, graphics, &lfw); + if(status != Ok) + return status; + + memcpy(lfa, &lfw, FIELD_OFFSET(LOGFONTA,lfFaceName) ); + + if(!MultiByteToWideChar(CP_ACP, 0, lfa->lfFaceName, -1, lfw.lfFaceName, LF_FACESIZE)) + return GenericError; + + return Ok; +} + +/******************************************************************************* * GdipGetLogFontW [GDIPLUS.@] */ GpStatus WINGDIPAPI GdipGetLogFontW(GpFont *font, GpGraphics *graphics,
Modified: trunk/reactos/dll/win32/gdiplus/gdiplus.spec URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/gdiplus.s... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/gdiplus.spec [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/gdiplus.spec [iso-8859-1] Sat Feb 14 02:14:34 2009 @@ -76,7 +76,7 @@ @ stdcall GdipCreateBitmapFromGdiDib(ptr ptr ptr) @ stdcall GdipCreateBitmapFromGraphics(long long ptr ptr) @ stdcall GdipCreateBitmapFromHBITMAP(long long ptr) -@ stub GdipCreateBitmapFromHICON +@ stdcall GdipCreateBitmapFromHICON(long ptr) @ stdcall GdipCreateBitmapFromResource(long wstr ptr) @ stdcall GdipCreateBitmapFromScan0(long long long long ptr ptr) @ stdcall GdipCreateBitmapFromStream(ptr ptr) @@ -245,8 +245,8 @@ @ stdcall GdipGetCellAscent(ptr long ptr) @ stdcall GdipGetCellDescent(ptr long ptr) @ stdcall GdipGetClip(ptr ptr) -@ stub GdipGetClipBounds -@ stub GdipGetClipBoundsI +@ stdcall GdipGetClipBounds(ptr ptr) +@ stdcall GdipGetClipBoundsI(ptr ptr) @ stdcall GdipGetCompositingMode(ptr ptr) @ stdcall GdipGetCompositingQuality(ptr ptr) @ stdcall GdipGetCustomLineCapBaseCap(ptr ptr) @@ -311,7 +311,7 @@ @ stdcall GdipGetLineSpacing(ptr long ptr) @ stub GdipGetLineTransform @ stdcall GdipGetLineWrapMode(ptr ptr) -@ stub GdipGetLogFontA +@ stdcall GdipGetLogFontA(ptr ptr ptr) @ stdcall GdipGetLogFontW(ptr ptr ptr) @ stdcall GdipGetMatrixElements(ptr ptr) @ stub GdipGetMetafileDownLevelRasterizationLimit @@ -507,7 +507,7 @@ @ stdcall GdipSetAdjustableArrowCapMiddleInset(ptr long) @ stdcall GdipSetAdjustableArrowCapWidth(ptr long) @ stdcall GdipSetClipGraphics(ptr ptr long) -@ stub GdipSetClipHrgn +@ stdcall GdipSetClipHrgn(ptr long long) @ stdcall GdipSetClipPath(ptr ptr long) @ stdcall GdipSetClipRect(ptr long long long long long) @ stdcall GdipSetClipRectI(ptr long long long long long) @@ -609,8 +609,8 @@ @ stdcall GdipTransformPoints(ptr long long ptr long) @ stdcall GdipTransformPointsI(ptr long long ptr long) @ stdcall GdipTransformRegion(ptr ptr) -@ stub GdipTranslateClip -@ stub GdipTranslateClipI +@ stdcall GdipTranslateClip(ptr long long) +@ stdcall GdipTranslateClipI(ptr long long) @ stdcall GdipTranslateLineTransform(ptr long long long) @ stdcall GdipTranslateMatrix(ptr long long long) @ stub GdipTranslatePathGradientTransform
Modified: trunk/reactos/dll/win32/gdiplus/graphics.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/graphics.... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/graphics.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/graphics.c [iso-8859-1] Sat Feb 14 02:14:34 2009 @@ -2375,18 +2375,39 @@ return ret; }
+/***************************************************************************** + * GdipFillRegion [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipFillRegion(GpGraphics* graphics, GpBrush* brush, GpRegion* region) { + INT save_state; + GpStatus status; + HRGN hrgn; + + TRACE("(%p, %p, %p)\n", graphics, brush, region); + if (!(graphics && brush && region)) return InvalidParameter;
if(graphics->busy) return ObjectBusy;
- FIXME("(%p, %p, %p): stub\n", graphics, brush, region); - - return NotImplemented; + status = GdipGetRegionHRgn(region, graphics, &hrgn); + if(status != Ok) + return status; + + save_state = SaveDC(graphics->hdc); + EndPath(graphics->hdc); + SelectObject(graphics->hdc, GetStockObject(NULL_PEN)); + + FillRgn(graphics->hdc, hrgn, brush->gdibrush); + + RestoreDC(graphics->hdc, save_state); + + DeleteObject(hrgn); + + return Ok; }
GpStatus WINGDIPAPI GdipFlush(GpGraphics *graphics, GpFlushIntention intention) @@ -2403,6 +2424,38 @@ FIXME("not implemented\n");
return NotImplemented; +} + +/***************************************************************************** + * GdipGetClipBounds [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipGetClipBounds(GpGraphics *graphics, GpRectF *rect) +{ + TRACE("(%p, %p)\n", graphics, rect); + + if(!graphics) + return InvalidParameter; + + if(graphics->busy) + return ObjectBusy; + + return GdipGetRegionBounds(graphics->clip, graphics, rect); +} + +/***************************************************************************** + * GdipGetClipBoundsI [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipGetClipBoundsI(GpGraphics *graphics, GpRect *rect) +{ + TRACE("(%p, %p)\n", graphics, rect); + + if(!graphics) + return InvalidParameter; + + if(graphics->busy) + return ObjectBusy; + + return GdipGetRegionBoundsI(graphics->clip, graphics, rect); }
/* FIXME: Compositing mode is not used anywhere except the getter/setter. */ @@ -3057,6 +3110,29 @@ return GdipTranslateMatrix(graphics->worldtrans, dx, dy, order); }
+/***************************************************************************** + * GdipSetClipHrgn [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipSetClipHrgn(GpGraphics *graphics, HRGN hrgn, CombineMode mode) +{ + GpRegion *region; + GpStatus status; + + TRACE("(%p, %p, %d)\n", graphics, hrgn, mode); + + if(!graphics) + return InvalidParameter; + + status = GdipCreateRegionHrgn(hrgn, ®ion); + if(status != Ok) + return status; + + status = GdipSetClipRegion(graphics, region, mode); + + GdipDeleteRegion(region); + return status; +} + GpStatus WINGDIPAPI GdipSetClipPath(GpGraphics *graphics, GpPath *path, CombineMode mode) { TRACE("(%p, %p, %d)\n", graphics, path, mode); @@ -3318,3 +3394,35 @@
return NULL; } + +/***************************************************************************** + * GdipTranslateClip [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipTranslateClip(GpGraphics *graphics, REAL dx, REAL dy) +{ + TRACE("(%p, %.2f, %.2f)\n", graphics, dx, dy); + + if(!graphics) + return InvalidParameter; + + if(graphics->busy) + return ObjectBusy; + + return GdipTranslateRegion(graphics->clip, dx, dy); +} + +/***************************************************************************** + * GdipTranslateClipI [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipTranslateClipI(GpGraphics *graphics, INT dx, INT dy) +{ + TRACE("(%p, %d, %d)\n", graphics, dx, dy); + + if(!graphics) + return InvalidParameter; + + if(graphics->busy) + return ObjectBusy; + + return GdipTranslateRegion(graphics->clip, (REAL)dx, (REAL)dy); +}
Modified: trunk/reactos/dll/win32/gdiplus/graphicspath.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/graphicsp... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/graphicspath.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/graphicspath.c [iso-8859-1] Sat Feb 14 02:14:34 2009 @@ -723,6 +723,17 @@ if(!path) return InvalidParameter;
+ /* on zero width/height only start point added */ + if(width <= 1e-7 || height <= 1e-7){ + if(!lengthen_path(path, 1)) + return OutOfMemory; + path->pathdata.Points[0].X = x + width / 2.0; + path->pathdata.Points[0].Y = y + height / 2.0; + path->pathdata.Types[0] = PathPointTypeStart | PathPointTypeCloseSubpath; + path->pathdata.Count = 1; + return InvalidParameter; + } + count = arc2polybezier(NULL, x, y, width, height, startAngle, sweepAngle);
if(count == 0)
Modified: trunk/reactos/dll/win32/gdiplus/image.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/image.c?r... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/image.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/image.c [iso-8859-1] Sat Feb 14 02:14:34 2009 @@ -18,6 +18,8 @@
#include <stdarg.h>
+#define NONAMELESSUNION + #include "windef.h" #include "winbase.h" #include "winuser.h" @@ -427,6 +429,50 @@ NULL, bitmap);
return ret; +} + +GpStatus WINGDIPAPI GdipCreateBitmapFromHICON(HICON hicon, GpBitmap** bitmap) +{ + HICON icon_copy; + ICONINFO iinfo; + PICTDESC desc; + + TRACE("%p, %p\n", hicon, bitmap); + + if(!bitmap || !GetIconInfo(hicon, &iinfo)) + return InvalidParameter; + + *bitmap = GdipAlloc(sizeof(GpBitmap)); + if(!*bitmap) return OutOfMemory; + + icon_copy = CreateIconIndirect(&iinfo); + + if(!icon_copy){ + GdipFree(*bitmap); + return InvalidParameter; + } + + desc.cbSizeofstruct = sizeof(PICTDESC); + desc.picType = PICTYPE_ICON; + desc.u.icon.hicon = icon_copy; + + if(OleCreatePictureIndirect(&desc, &IID_IPicture, TRUE, + (LPVOID*) &((*bitmap)->image.picture)) != S_OK){ + DestroyIcon(icon_copy); + GdipFree(*bitmap); + return GenericError; + } + + (*bitmap)->format = PixelFormat32bppARGB; + (*bitmap)->image.type = ImageTypeBitmap; + (*bitmap)->image.flags = ImageFlagsNone; + (*bitmap)->width = ipicture_pixel_width((*bitmap)->image.picture); + (*bitmap)->height = ipicture_pixel_height((*bitmap)->image.picture); + + DeleteObject(iinfo.hbmColor); + DeleteObject(iinfo.hbmMask); + + return Ok; }
GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
Modified: trunk/reactos/dll/win32/gdiplus/region.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/region.c?... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/region.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/region.c [iso-8859-1] Sat Feb 14 02:14:34 2009 @@ -567,15 +567,58 @@ return NotImplemented; }
+ +/****************************************************************************** + * GdipCreateRegionHrgn [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipCreateRegionHrgn(HRGN hrgn, GpRegion **region) { - FIXME("(%p, %p): stub\n", hrgn, region); - - if(!hrgn || !region) - return InvalidParameter; - - *region = NULL; - return NotImplemented; + union { + RGNDATA data; + char buf[sizeof(RGNDATAHEADER) + sizeof(RECT)]; + } rdata; + DWORD size; + GpRectF rectf; + GpPath *path; + GpStatus stat; + + TRACE("(%p, %p)\n", hrgn, region); + + if(!region || !(size = GetRegionData(hrgn, 0, NULL))) + return InvalidParameter; + + if(size > sizeof(RGNDATAHEADER) + sizeof(RECT)){ + FIXME("Only simple rect regions supported.\n"); + *region = NULL; + return NotImplemented; + } + + if(!GetRegionData(hrgn, sizeof(rdata), &rdata.data)) + return GenericError; + + /* return empty region */ + if(IsRectEmpty(&rdata.data.rdh.rcBound)){ + stat = GdipCreateRegion(region); + if(stat == Ok) + GdipSetEmpty(*region); + return stat; + } + + rectf.X = (REAL)rdata.data.rdh.rcBound.left; + rectf.Y = (REAL)rdata.data.rdh.rcBound.top; + rectf.Width = (REAL)rdata.data.rdh.rcBound.right - rectf.X; + rectf.Height = (REAL)rdata.data.rdh.rcBound.bottom - rectf.Y; + + stat = GdipCreatePath(FillModeAlternate, &path); + if(stat != Ok) + return stat; + + GdipAddPathRectangle(path, rectf.X, rectf.Y, rectf.Width, rectf.Height); + + stat = GdipCreateRegionPath(path, region); + GdipDeletePath(path); + + return stat; }
GpStatus WINGDIPAPI GdipDeleteRegion(GpRegion *region) @@ -591,18 +634,66 @@ return Ok; }
+/***************************************************************************** + * GdipGetRegionBounds [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipGetRegionBounds(GpRegion *region, GpGraphics *graphics, GpRectF *rect) { - FIXME("(%p, %p, %p): stub\n", region, graphics, rect); - - return NotImplemented; -} - + HRGN hrgn; + RECT r; + GpStatus status; + + TRACE("(%p, %p, %p)\n", region, graphics, rect); + + if(!region || !graphics || !rect) + return InvalidParameter; + + status = GdipGetRegionHRgn(region, graphics, &hrgn); + if(status != Ok) + return status; + + /* infinite */ + if(!hrgn){ + rect->X = rect->Y = -(REAL)(1 << 22); + rect->Width = rect->Height = (REAL)(1 << 23); + return Ok; + } + + if(!GetRgnBox(hrgn, &r)){ + DeleteObject(hrgn); + return GenericError; + } + + rect->X = r.left; + rect->Y = r.top; + rect->Width = r.right - r.left; + rect->Height = r.bottom - r.top; + + return Ok; +} + +/***************************************************************************** + * GdipGetRegionBoundsI [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipGetRegionBoundsI(GpRegion *region, GpGraphics *graphics, GpRect *rect) { - FIXME("(%p, %p, %p): stub\n", region, graphics, rect); - - return NotImplemented; + GpRectF rectf; + GpStatus status; + + TRACE("(%p, %p, %p)\n", region, graphics, rect); + + if(!rect) + return InvalidParameter; + + status = GdipGetRegionBounds(region, graphics, &rectf); + if(status == Ok){ + rect->X = roundr(rectf.X); + rect->Y = roundr(rectf.X); + rect->Width = roundr(rectf.Width); + rect->Height = roundr(rectf.Height); + } + + return status; }
static inline void write_dword(DWORD* location, INT* offset, const DWORD write) @@ -963,12 +1054,39 @@ return Ok; }
+/***************************************************************************** + * GdipIsEqualRegion [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipIsEqualRegion(GpRegion *region, GpRegion *region2, GpGraphics *graphics, BOOL *res) { - FIXME("(%p, %p, %p, %p): stub\n", region, region2, graphics, res); - - return NotImplemented; + HRGN hrgn1, hrgn2; + GpStatus stat; + + TRACE("(%p, %p, %p, %p)\n", region, region2, graphics, res); + + if(!region || !region2 || !graphics || !res) + return InvalidParameter; + + stat = GdipGetRegionHRgn(region, graphics, &hrgn1); + if(stat != Ok) + return stat; + stat = GdipGetRegionHRgn(region2, graphics, &hrgn2); + if(stat != Ok){ + DeleteObject(hrgn1); + return stat; + } + + *res = EqualRgn(hrgn1, hrgn2); + + /* one of GpRegions is infinite */ + if(*res == ERROR) + *res = (!hrgn1 && !hrgn2); + + DeleteObject(hrgn1); + DeleteObject(hrgn2); + + return Ok; }
/***************************************************************************** @@ -1027,16 +1145,54 @@ return NotImplemented; }
+/* Translates GpRegion elements with specified offsets */ +static void translate_region_element(region_element* element, REAL dx, REAL dy) +{ + INT i; + + switch(element->type) + { + case RegionDataEmptyRect: + case RegionDataInfiniteRect: + return; + case RegionDataRect: + element->elementdata.rect.X += dx; + element->elementdata.rect.Y += dy; + return; + case RegionDataPath: + for(i = 0; i < element->elementdata.pathdata.path->pathdata.Count; i++){ + element->elementdata.pathdata.path->pathdata.Points[i].X += dx; + element->elementdata.pathdata.path->pathdata.Points[i].Y += dy; + } + return; + default: + translate_region_element(element->elementdata.combine.left, dx, dy); + translate_region_element(element->elementdata.combine.right, dx, dy); + return; + } +} + +/***************************************************************************** + * GdipTranslateRegion [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipTranslateRegion(GpRegion *region, REAL dx, REAL dy) { - FIXME("(%p, %f, %f): stub\n", region, dx, dy); - - return NotImplemented; -} - + TRACE("(%p, %f, %f)\n", region, dx, dy); + + if(!region) + return InvalidParameter; + + translate_region_element(®ion->node, dx, dy); + + return Ok; +} + +/***************************************************************************** + * GdipTranslateRegionI [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipTranslateRegionI(GpRegion *region, INT dx, INT dy) { - FIXME("(%p, %d, %d): stub\n", region, dx, dy); - - return NotImplemented; -} + TRACE("(%p, %d, %d)\n", region, dx, dy); + + return GdipTranslateRegion(region, (REAL)dx, (REAL)dy); +}
Modified: trunk/reactos/dll/win32/gdiplus/stringformat.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/stringfor... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/stringformat.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/stringformat.c [iso-8859-1] Sat Feb 14 02:14:34 2009 @@ -284,9 +284,12 @@ return Ok; }
-GpStatus WINGDIPAPI GdipSetStringFormatFlags(GDIPCONST GpStringFormat *format, INT flags) -{ - FIXME("format (%p) flags (%d)\n", format, flags); +GpStatus WINGDIPAPI GdipSetStringFormatFlags(GpStringFormat *format, INT flags) +{ + if(!format) + return InvalidParameter; + + format->attr = flags;
return Ok; }
Modified: trunk/reactos/include/psdk/gdiplusflat.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/psdk/gdiplusflat.h?... ============================================================================== --- trunk/reactos/include/psdk/gdiplusflat.h [iso-8859-1] (original) +++ trunk/reactos/include/psdk/gdiplusflat.h [iso-8859-1] Sat Feb 14 02:14:34 2009 @@ -49,6 +49,7 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromGdiDib(GDIPCONST BITMAPINFO*,VOID*,GpBitmap**); GpStatus WINGDIPAPI GdipCreateBitmapFromGraphics(INT,INT,GpGraphics*,GpBitmap**); GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP, HPALETTE, GpBitmap**); +GpStatus WINGDIPAPI GdipCreateBitmapFromHICON(HICON, GpBitmap**); GpStatus WINGDIPAPI GdipCreateBitmapFromResource(HINSTANCE,GDIPCONST WCHAR*,GpBitmap**); GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT,INT,INT,PixelFormat,BYTE*, GpBitmap**); @@ -189,6 +190,8 @@ GpStatus WINGDIPAPI GdipFillRectanglesI(GpGraphics*,GpBrush*,GDIPCONST GpRect*,INT); GpStatus WINGDIPAPI GdipFillRegion(GpGraphics*,GpBrush*,GpRegion*); GpStatus WINGDIPAPI GdipGetClip(GpGraphics*,GpRegion*); +GpStatus WINGDIPAPI GdipGetClipBounds(GpGraphics*,GpRectF*); +GpStatus WINGDIPAPI GdipGetClipBoundsI(GpGraphics*,GpRect*); GpStatus WINGDIPAPI GdipGetCompositingMode(GpGraphics*,CompositingMode*); GpStatus WINGDIPAPI GdipGetCompositingQuality(GpGraphics*,CompositingQuality*); GpStatus WINGDIPAPI GdipGetDC(GpGraphics*,HDC*); @@ -221,6 +224,7 @@ GpStatus WINGDIPAPI GdipRotateWorldTransform(GpGraphics*,REAL,GpMatrixOrder); GpStatus WINGDIPAPI GdipSaveGraphics(GpGraphics*,GraphicsState*); GpStatus WINGDIPAPI GdipScaleWorldTransform(GpGraphics*,REAL,REAL,GpMatrixOrder); +GpStatus WINGDIPAPI GdipSetClipHrgn(GpGraphics*,HRGN,CombineMode); GpStatus WINGDIPAPI GdipSetClipPath(GpGraphics*,GpPath*,CombineMode); GpStatus WINGDIPAPI GdipSetClipRect(GpGraphics*,REAL,REAL,REAL,REAL,CombineMode); GpStatus WINGDIPAPI GdipSetClipRectI(GpGraphics*,INT,INT,INT,INT,CombineMode); @@ -239,6 +243,8 @@ GpPointF *, INT); GpStatus WINGDIPAPI GdipTransformPointsI(GpGraphics*, GpCoordinateSpace, GpCoordinateSpace, GpPoint *, INT); +GpStatus WINGDIPAPI GdipTranslateClip(GpGraphics*,REAL,REAL); +GpStatus WINGDIPAPI GdipTranslateClipI(GpGraphics*,INT,INT); GpStatus WINGDIPAPI GdipTranslateWorldTransform(GpGraphics*,REAL,REAL,GpMatrixOrder);
/* GraphicsPath */ @@ -561,6 +567,7 @@ GpStringFormat*, INT, GDIPCONST CharacterRange*); GpStatus WINGDIPAPI GdipSetStringFormatTabStops(GpStringFormat*,REAL,INT,GDIPCONST REAL*); GpStatus WINGDIPAPI GdipSetStringFormatTrimming(GpStringFormat*,StringTrimming); +GpStatus WINGDIPAPI GdipSetStringFormatFlags(GpStringFormat*, INT); GpStatus WINGDIPAPI GdipStringFormatGetGenericDefault(GpStringFormat **); GpStatus WINGDIPAPI GdipStringFormatGetGenericTypographic(GpStringFormat **);