From 98ff85693371845f857f4f3de85477ef89ae47f8 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Sat, 14 Feb 2009 08:14:34 +0000 Subject: [PATCH] - Sync gdiplus with Wine head svn path=/trunk/; revision=39601 --- reactos/dll/win32/gdiplus/font.c | 23 +++ reactos/dll/win32/gdiplus/gdiplus.spec | 14 +- reactos/dll/win32/gdiplus/graphics.c | 112 +++++++++++++- reactos/dll/win32/gdiplus/graphicspath.c | 11 ++ reactos/dll/win32/gdiplus/image.c | 46 ++++++ reactos/dll/win32/gdiplus/region.c | 184 +++++++++++++++++++++-- reactos/dll/win32/gdiplus/stringformat.c | 7 +- reactos/include/psdk/gdiplusflat.h | 7 + 8 files changed, 379 insertions(+), 25 deletions(-) diff --git a/reactos/dll/win32/gdiplus/font.c b/reactos/dll/win32/gdiplus/font.c index 22fd3936949..94c93814597 100644 --- a/reactos/dll/win32/gdiplus/font.c +++ b/reactos/dll/win32/gdiplus/font.c @@ -373,6 +373,29 @@ GpStatus WINGDIPAPI GdipGetFontUnit(GpFont *font, Unit *unit) return Ok; } +/******************************************************************************* + * 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.@] */ diff --git a/reactos/dll/win32/gdiplus/gdiplus.spec b/reactos/dll/win32/gdiplus/gdiplus.spec index 3716207834f..0037a74182f 100644 --- a/reactos/dll/win32/gdiplus/gdiplus.spec +++ b/reactos/dll/win32/gdiplus/gdiplus.spec @@ -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 diff --git a/reactos/dll/win32/gdiplus/graphics.c b/reactos/dll/win32/gdiplus/graphics.c index e8921836899..128e04d361e 100644 --- a/reactos/dll/win32/gdiplus/graphics.c +++ b/reactos/dll/win32/gdiplus/graphics.c @@ -2375,18 +2375,39 @@ GpStatus WINGDIPAPI GdipFillRectanglesI(GpGraphics *graphics, GpBrush *brush, GD 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); + status = GdipGetRegionHRgn(region, graphics, &hrgn); + if(status != Ok) + return status; - return NotImplemented; + 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) @@ -2405,6 +2426,38 @@ GpStatus WINGDIPAPI GdipFlush(GpGraphics *graphics, GpFlushIntention intention) 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. */ GpStatus WINGDIPAPI GdipGetCompositingMode(GpGraphics *graphics, CompositingMode *mode) @@ -3057,6 +3110,29 @@ GpStatus WINGDIPAPI GdipTranslateWorldTransform(GpGraphics *graphics, REAL dx, 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 @@ HPALETTE WINGDIPAPI GdipCreateHalftonePalette(void) 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); +} diff --git a/reactos/dll/win32/gdiplus/graphicspath.c b/reactos/dll/win32/gdiplus/graphicspath.c index 874550fb3b1..c0f6584f8c7 100644 --- a/reactos/dll/win32/gdiplus/graphicspath.c +++ b/reactos/dll/win32/gdiplus/graphicspath.c @@ -723,6 +723,17 @@ GpStatus WINGDIPAPI GdipAddPathPie(GpPath *path, REAL x, REAL y, REAL width, REA 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) diff --git a/reactos/dll/win32/gdiplus/image.c b/reactos/dll/win32/gdiplus/image.c index 02f8f5a5655..9944322b371 100644 --- a/reactos/dll/win32/gdiplus/image.c +++ b/reactos/dll/win32/gdiplus/image.c @@ -18,6 +18,8 @@ #include +#define NONAMELESSUNION + #include "windef.h" #include "winbase.h" #include "winuser.h" @@ -429,6 +431,50 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromGraphics(INT width, INT height, 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, PixelFormat format, BYTE* scan0, GpBitmap** bitmap) { diff --git a/reactos/dll/win32/gdiplus/region.c b/reactos/dll/win32/gdiplus/region.c index 89b107f99a9..e42c5cd12ab 100644 --- a/reactos/dll/win32/gdiplus/region.c +++ b/reactos/dll/win32/gdiplus/region.c @@ -567,15 +567,58 @@ GpStatus WINGDIPAPI GdipCreateRegionRgnData(GDIPCONST BYTE *data, INT size, GpRe return NotImplemented; } + +/****************************************************************************** + * GdipCreateRegionHrgn [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipCreateRegionHrgn(HRGN hrgn, GpRegion **region) { - FIXME("(%p, %p): stub\n", hrgn, region); + union { + RGNDATA data; + char buf[sizeof(RGNDATAHEADER) + sizeof(RECT)]; + } rdata; + DWORD size; + GpRectF rectf; + GpPath *path; + GpStatus stat; - if(!hrgn || !region) + TRACE("(%p, %p)\n", hrgn, region); + + if(!region || !(size = GetRegionData(hrgn, 0, NULL))) return InvalidParameter; - *region = NULL; - return NotImplemented; + 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 @@ GpStatus WINGDIPAPI GdipDeleteRegion(GpRegion *region) return Ok; } +/***************************************************************************** + * GdipGetRegionBounds [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipGetRegionBounds(GpRegion *region, GpGraphics *graphics, GpRectF *rect) { - FIXME("(%p, %p, %p): stub\n", region, graphics, rect); + HRGN hrgn; + RECT r; + GpStatus status; - return NotImplemented; + 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); + GpRectF rectf; + GpStatus status; - return NotImplemented; + 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 @@ GpStatus WINGDIPAPI GdipIsEmptyRegion(GpRegion *region, GpGraphics *graphics, BO 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); + HRGN hrgn1, hrgn2; + GpStatus stat; - return NotImplemented; + 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 @@ GpStatus WINGDIPAPI GdipTransformRegion(GpRegion *region, GpMatrix *matrix) 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); + TRACE("(%p, %f, %f)\n", region, dx, dy); - return NotImplemented; + 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); + TRACE("(%p, %d, %d)\n", region, dx, dy); - return NotImplemented; + return GdipTranslateRegion(region, (REAL)dx, (REAL)dy); } diff --git a/reactos/dll/win32/gdiplus/stringformat.c b/reactos/dll/win32/gdiplus/stringformat.c index 201201a866f..21053b78e46 100644 --- a/reactos/dll/win32/gdiplus/stringformat.c +++ b/reactos/dll/win32/gdiplus/stringformat.c @@ -284,9 +284,12 @@ GpStatus WINGDIPAPI GdipSetStringFormatTrimming(GpStringFormat *format, return Ok; } -GpStatus WINGDIPAPI GdipSetStringFormatFlags(GDIPCONST GpStringFormat *format, INT flags) +GpStatus WINGDIPAPI GdipSetStringFormatFlags(GpStringFormat *format, INT flags) { - FIXME("format (%p) flags (%d)\n", format, flags); + if(!format) + return InvalidParameter; + + format->attr = flags; return Ok; } diff --git a/reactos/include/psdk/gdiplusflat.h b/reactos/include/psdk/gdiplusflat.h index 1a39dee4055..56540cda22d 100644 --- a/reactos/include/psdk/gdiplusflat.h +++ b/reactos/include/psdk/gdiplusflat.h @@ -49,6 +49,7 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromFileICM(GDIPCONST WCHAR*,GpBitmap**); 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 GdipFillRectangles(GpGraphics*,GpBrush*,GDIPCONST GpRectF*,I 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 GdipRestoreGraphics(GpGraphics*,GraphicsState); 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 @@ GpStatus WINGDIPAPI GdipTransformPoints(GpGraphics*, GpCoordinateSpace, GpCoordi 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 @@ GpStatus WINGDIPAPI GdipSetStringFormatMeasurableCharacterRanges( 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 **);