Home | History | Annotate | Download | only in gdiplus
      1 /*
      2  * gdiplusgraphics.h
      3  *
      4  * GDI+ Graphics class
      5  *
      6  * This file is part of the w32api package.
      7  *
      8  * Contributors:
      9  *   Created by Markus Koenig <markus (at) stber-koenig.de>
     10  *
     11  * THIS SOFTWARE IS NOT COPYRIGHTED
     12  *
     13  * This source code is offered for use in the public domain. You may
     14  * use, modify or distribute it freely.
     15  *
     16  * This code is distributed in the hope that it will be useful but
     17  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
     18  * DISCLAIMED. This includes but is not limited to warranties of
     19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     20  *
     21  */
     22 
     23 #ifndef __GDIPLUS_GRAPHICS_H
     24 #define __GDIPLUS_GRAPHICS_H
     25 #if __GNUC__ >=3
     26 #pragma GCC system_header
     27 #endif
     28 
     29 #ifndef __cplusplus
     30 #error "A C++ compiler is required to include gdiplusgraphics.h."
     31 #endif
     32 
     33 class Graphics: public GdiplusBase
     34 {
     35 	friend class Bitmap;
     36 	friend class CachedBitmap;
     37 	friend class Font;
     38 	friend class GraphicsPath;
     39 	friend class Metafile;
     40 	friend class Region;
     41 
     42 public:
     43 	static Graphics* FromHDC(HDC hdc)
     44 	{
     45 		return new Graphics(hdc);
     46 	}
     47 	static Graphics* FromHDC(HDC hdc, HANDLE hdevice)
     48 	{
     49 		return new Graphics(hdc, hdevice);
     50 	}
     51 	static Graphics* FromHWND(HWND hwnd, BOOL icm = FALSE)
     52 	{
     53 		return new Graphics(hwnd, icm);
     54 	}
     55 	static Graphics* FromImage(Image *image)
     56 	{
     57 		return new Graphics(image);
     58 	}
     59 	static HPALETTE GetHalftonePalette()
     60 	{
     61 		return DllExports::GdipCreateHalftonePalette();
     62 	}
     63 
     64 	Graphics(Image *image): nativeGraphics(NULL), lastStatus(Ok)
     65 	{
     66 		lastStatus = DllExports::GdipGetImageGraphicsContext(
     67 				image ? image->nativeImage : NULL,
     68 				&nativeGraphics);
     69 	}
     70 	Graphics(HDC hdc): nativeGraphics(NULL), lastStatus(Ok)
     71 	{
     72 		lastStatus = DllExports::GdipCreateFromHDC(
     73 				hdc, &nativeGraphics);
     74 	}
     75 	Graphics(HDC hdc, HANDLE hdevice): nativeGraphics(NULL), lastStatus(Ok)
     76 	{
     77 		lastStatus = DllExports::GdipCreateFromHDC2(
     78 				hdc, hdevice, &nativeGraphics);
     79 	}
     80 	Graphics(HWND hwnd, BOOL icm = FALSE):
     81 		nativeGraphics(NULL), lastStatus(Ok)
     82 	{
     83 		if (icm) {
     84 			lastStatus = DllExports::GdipCreateFromHWNDICM(
     85 					hwnd, &nativeGraphics);
     86 		} else {
     87 			lastStatus = DllExports::GdipCreateFromHWND(
     88 					hwnd, &nativeGraphics);
     89 		}
     90 	}
     91 	~Graphics()
     92 	{
     93 		DllExports::GdipDeleteGraphics(nativeGraphics);
     94 	}
     95 
     96 	Status AddMetafileComment(const BYTE *data, UINT sizeData)
     97 	{
     98 		return updateStatus(DllExports::GdipComment(
     99 				nativeGraphics, sizeData, data));
    100 	}
    101 	GraphicsContainer BeginContainer()
    102 	{
    103 		GraphicsContainer result = 0;
    104 		updateStatus(DllExports::GdipBeginContainer2(
    105 				nativeGraphics, &result));
    106 		return result;
    107 	}
    108 	GraphicsContainer BeginContainer(const RectF& dstrect,
    109 			const RectF& srcrect, Unit unit)
    110 	{
    111 		GraphicsContainer result = 0;
    112 		updateStatus(DllExports::GdipBeginContainer(
    113 				nativeGraphics, &dstrect, &srcrect, unit,
    114 				&result));
    115 		return result;
    116 	}
    117 	GraphicsContainer BeginContainer(const Rect& dstrect,
    118 			const Rect& srcrect, Unit unit)
    119 	{
    120 		GraphicsContainer result = 0;
    121 		updateStatus(DllExports::GdipBeginContainerI(
    122 				nativeGraphics, &dstrect, &srcrect, unit,
    123 				&result));
    124 		return result;
    125 	}
    126 	Status Clear(const Color& color)
    127 	{
    128 		return updateStatus(DllExports::GdipGraphicsClear(
    129 				nativeGraphics, color.GetValue()));
    130 	}
    131 	Status DrawArc(const Pen *pen, REAL x, REAL y, REAL width, REAL height,
    132 			REAL startAngle, REAL sweepAngle)
    133 	{
    134 		return updateStatus(DllExports::GdipDrawArc(
    135 				nativeGraphics, pen ? pen->nativePen : NULL,
    136 				x, y, width, height, startAngle, sweepAngle));
    137 	}
    138 	Status DrawArc(const Pen *pen, INT x, INT y, INT width, INT height,
    139 			REAL startAngle, REAL sweepAngle)
    140 	{
    141 		return updateStatus(DllExports::GdipDrawArcI(
    142 				nativeGraphics, pen ? pen->nativePen : NULL,
    143 				x, y, width, height, startAngle, sweepAngle));
    144 	}
    145 	Status DrawArc(const Pen *pen, const RectF& rect,
    146 			REAL startAngle, REAL sweepAngle)
    147 	{
    148 		return updateStatus(DllExports::GdipDrawArc(
    149 				nativeGraphics, pen ? pen->nativePen : NULL,
    150 				rect.X, rect.Y, rect.Width, rect.Height,
    151 				startAngle, sweepAngle));
    152 	}
    153 	Status DrawArc(const Pen *pen, const Rect& rect,
    154 			REAL startAngle, REAL sweepAngle)
    155 	{
    156 		return updateStatus(DllExports::GdipDrawArcI(
    157 				nativeGraphics, pen ? pen->nativePen : NULL,
    158 				rect.X, rect.Y, rect.Width, rect.Height,
    159 				startAngle, sweepAngle));
    160 	}
    161 	Status DrawBezier(const Pen *pen,
    162 			REAL x1, REAL y1, REAL x2, REAL y2,
    163 			REAL x3, REAL y3, REAL x4, REAL y4)
    164 	{
    165 		return updateStatus(DllExports::GdipDrawBezier(
    166 				nativeGraphics, pen ? pen->nativePen : NULL,
    167 				x1, y1, x2, y2, x3, y3, x4, y4));
    168 	}
    169 	Status DrawBezier(const Pen *pen,
    170 			INT x1, INT y1, INT x2, INT y2,
    171 			INT x3, INT y3, INT x4, INT y4)
    172 	{
    173 		return updateStatus(DllExports::GdipDrawBezierI(
    174 				nativeGraphics, pen ? pen->nativePen : NULL,
    175 				x1, y1, x2, y2, x3, y3, x4, y4));
    176 	}
    177 	Status DrawBezier(const Pen *pen,
    178 			const PointF& pt1, const PointF& pt2,
    179 			const PointF& pt3, const PointF& pt4)
    180 	{
    181 		return updateStatus(DllExports::GdipDrawBezier(
    182 				nativeGraphics, pen ? pen->nativePen : NULL,
    183 				pt1.X, pt1.Y, pt2.X, pt2.Y,
    184 				pt3.X, pt3.Y, pt4.X, pt4.Y));
    185 	}
    186 	Status DrawBezier(const Pen *pen,
    187 			const Point& pt1, const Point& pt2,
    188 			const Point& pt3, const Point& pt4)
    189 	{
    190 		return updateStatus(DllExports::GdipDrawBezierI(
    191 				nativeGraphics, pen ? pen->nativePen : NULL,
    192 				pt1.X, pt1.Y, pt2.X, pt2.Y,
    193 				pt3.X, pt3.Y, pt4.X, pt4.Y));
    194 	}
    195 	Status DrawBeziers(const Pen *pen, const PointF *points, INT count)
    196 	{
    197 		return updateStatus(DllExports::GdipDrawBeziers(
    198 				nativeGraphics, pen ? pen->nativePen : NULL,
    199 				points, count));
    200 	}
    201 	Status DrawBeziers(const Pen *pen, const Point *points, INT count)
    202 	{
    203 		return updateStatus(DllExports::GdipDrawBeziersI(
    204 				nativeGraphics, pen ? pen->nativePen : NULL,
    205 				points, count));
    206 	}
    207 	Status DrawCachedBitmap(CachedBitmap *cb, INT x, INT y)
    208 	{
    209 		return updateStatus(DllExports::GdipDrawCachedBitmap(
    210 				nativeGraphics,
    211 				cb ? cb->nativeCachedBitmap : NULL,
    212 				x, y));
    213 	}
    214 	Status DrawClosedCurve(const Pen *pen, const PointF *points, INT count)
    215 	{
    216 		return updateStatus(DllExports::GdipDrawClosedCurve(
    217 				nativeGraphics, pen ? pen->nativePen : NULL,
    218 				points, count));
    219 	}
    220 	Status DrawClosedCurve(const Pen *pen, const Point *points, INT count)
    221 	{
    222 		return updateStatus(DllExports::GdipDrawClosedCurveI(
    223 				nativeGraphics, pen ? pen->nativePen : NULL,
    224 				points, count));
    225 	}
    226 	Status DrawClosedCurve(const Pen *pen, const PointF *points, INT count,
    227 			REAL tension)
    228 	{
    229 		return updateStatus(DllExports::GdipDrawClosedCurve2(
    230 				nativeGraphics, pen ? pen->nativePen : NULL,
    231 				points, count, tension));
    232 	}
    233 	Status DrawClosedCurve(const Pen *pen, const Point *points, INT count,
    234 			REAL tension)
    235 	{
    236 		return updateStatus(DllExports::GdipDrawClosedCurve2I(
    237 				nativeGraphics, pen ? pen->nativePen : NULL,
    238 				points, count, tension));
    239 	}
    240 	Status DrawCurve(const Pen *pen, const PointF *points, INT count)
    241 	{
    242 		return updateStatus(DllExports::GdipDrawCurve(
    243 				nativeGraphics, pen ? pen->nativePen : NULL,
    244 				points, count));
    245 	}
    246 	Status DrawCurve(const Pen *pen, const Point *points, INT count)
    247 	{
    248 		return updateStatus(DllExports::GdipDrawCurveI(
    249 				nativeGraphics, pen ? pen->nativePen : NULL,
    250 				points, count));
    251 	}
    252 	Status DrawCurve(const Pen *pen, const PointF *points, INT count,
    253 			REAL tension)
    254 	{
    255 		return updateStatus(DllExports::GdipDrawCurve2(
    256 				nativeGraphics, pen ? pen->nativePen : NULL,
    257 				points, count, tension));
    258 	}
    259 	Status DrawCurve(const Pen *pen, const Point *points, INT count,
    260 			REAL tension)
    261 	{
    262 		return updateStatus(DllExports::GdipDrawCurve2I(
    263 				nativeGraphics, pen ? pen->nativePen : NULL,
    264 				points, count, tension));
    265 	}
    266 	Status DrawCurve(const Pen *pen, const PointF *points, INT count,
    267 			INT offset, INT numberOfSegments, REAL tension)
    268 	{
    269 		return updateStatus(DllExports::GdipDrawCurve3(
    270 				nativeGraphics, pen ? pen->nativePen : NULL,
    271 				points, count, offset,
    272 				numberOfSegments, tension));
    273 	}
    274 	Status DrawCurve(const Pen *pen, const Point *points, INT count,
    275 			INT offset, INT numberOfSegments, REAL tension)
    276 	{
    277 		return updateStatus(DllExports::GdipDrawCurve3I(
    278 				nativeGraphics, pen ? pen->nativePen : NULL,
    279 				points, count, offset,
    280 				numberOfSegments, tension));
    281 	}
    282 	Status DrawDriverString(const UINT16 *text, INT length,
    283 			const Font *font, const Brush *brush,
    284 			const PointF *positions, INT flags,
    285 			const Matrix *matrix)
    286 	{
    287 		return updateStatus(DllExports::GdipDrawDriverString(
    288 				nativeGraphics, text, length,
    289 				font ? font->nativeFont : NULL,
    290 				brush ? brush->nativeBrush : NULL,
    291 				positions, flags,
    292 				matrix ? matrix->nativeMatrix : NULL));
    293 	}
    294 	Status DrawEllipse(const Pen *pen,
    295 			REAL x, REAL y, REAL width, REAL height)
    296 	{
    297 		return updateStatus(DllExports::GdipDrawEllipse(
    298 				nativeGraphics, pen ? pen->nativePen : NULL,
    299 				x, y, width, height));
    300 	}
    301 	Status DrawEllipse(const Pen *pen, INT x, INT y, INT width, INT height)
    302 	{
    303 		return updateStatus(DllExports::GdipDrawEllipseI(
    304 				nativeGraphics, pen ? pen->nativePen : NULL,
    305 				x, y, width, height));
    306 	}
    307 	Status DrawEllipse(const Pen *pen, const RectF& rect)
    308 	{
    309 		return updateStatus(DllExports::GdipDrawEllipse(
    310 				nativeGraphics, pen ? pen->nativePen : NULL,
    311 				rect.X, rect.Y, rect.Width, rect.Height));
    312 	}
    313 	Status DrawEllipse(const Pen *pen, const Rect& rect)
    314 	{
    315 		return updateStatus(DllExports::GdipDrawEllipseI(
    316 				nativeGraphics, pen ? pen->nativePen : NULL,
    317 				rect.X, rect.Y, rect.Width, rect.Height));
    318 	}
    319 	Status DrawImage(Image *image, REAL x, REAL y)
    320 	{
    321 		return updateStatus(DllExports::GdipDrawImage(
    322 				nativeGraphics,
    323 				image ? image->nativeImage : NULL,
    324 				x, y));
    325 	}
    326 	Status DrawImage(Image *image, INT x, INT y)
    327 	{
    328 		return updateStatus(DllExports::GdipDrawImageI(
    329 				nativeGraphics,
    330 				image ? image->nativeImage : NULL,
    331 				x, y));
    332 	}
    333 	Status DrawImage(Image *image, const PointF& point)
    334 	{
    335 		return updateStatus(DllExports::GdipDrawImage(
    336 				nativeGraphics,
    337 				image ? image->nativeImage : NULL,
    338 				point.X, point.Y));
    339 	}
    340 	Status DrawImage(Image *image, const Point& point)
    341 	{
    342 		return updateStatus(DllExports::GdipDrawImageI(
    343 				nativeGraphics,
    344 				image ? image->nativeImage : NULL,
    345 				point.X, point.Y));
    346 	}
    347 	Status DrawImage(Image *image, REAL x, REAL y, REAL width, REAL height)
    348 	{
    349 		return updateStatus(DllExports::GdipDrawImageRect(
    350 				nativeGraphics,
    351 				image ? image->nativeImage : NULL,
    352 				x, y, width, height));
    353 	}
    354 	Status DrawImage(Image *image, INT x, INT y, INT width, INT height)
    355 	{
    356 		return updateStatus(DllExports::GdipDrawImageRectI(
    357 				nativeGraphics,
    358 				image ? image->nativeImage : NULL,
    359 				x, y, width, height));
    360 	}
    361 	Status DrawImage(Image *image, const RectF& rect)
    362 	{
    363 		return updateStatus(DllExports::GdipDrawImageRect(
    364 				nativeGraphics,
    365 				image ? image->nativeImage : NULL,
    366 				rect.X, rect.Y, rect.Width, rect.Height));
    367 	}
    368 	Status DrawImage(Image *image, const Rect& rect)
    369 	{
    370 		return updateStatus(DllExports::GdipDrawImageRectI(
    371 				nativeGraphics,
    372 				image ? image->nativeImage : NULL,
    373 				rect.X, rect.Y, rect.Width, rect.Height));
    374 	}
    375 	Status DrawImage(Image *image, const PointF *destPoints, INT count)
    376 	{
    377 		return updateStatus(DllExports::GdipDrawImagePoints(
    378 				nativeGraphics,
    379 				image ? image->nativeImage : NULL,
    380 				destPoints, count));
    381 	}
    382 	Status DrawImage(Image *image, const Point *destPoints, INT count)
    383 	{
    384 		return updateStatus(DllExports::GdipDrawImagePointsI(
    385 				nativeGraphics,
    386 				image ? image->nativeImage : NULL,
    387 				destPoints, count));
    388 	}
    389 	Status DrawImage(Image *image, REAL x, REAL y, REAL srcx, REAL srcy,
    390 			REAL srcwidth, REAL srcheight, Unit srcUnit)
    391 	{
    392 		return updateStatus(DllExports::GdipDrawImagePointRect(
    393 				nativeGraphics,
    394 				image ? image->nativeImage : NULL,
    395 				x, y, srcx, srcy, srcwidth, srcheight,
    396 				srcUnit));
    397 	}
    398 	Status DrawImage(Image *image, INT x, INT y, INT srcx, INT srcy,
    399 			INT srcwidth, INT srcheight, Unit srcUnit)
    400 	{
    401 		return updateStatus(DllExports::GdipDrawImagePointRectI(
    402 				nativeGraphics,
    403 				image ? image->nativeImage : NULL,
    404 				x, y, srcx, srcy, srcwidth, srcheight,
    405 				srcUnit));
    406 	}
    407 	Status DrawImage(Image *image, const RectF& destRect,
    408 			REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight,
    409 			Unit srcUnit,
    410 			const ImageAttributes *imageAttributes = NULL,
    411 			DrawImageAbort callback = NULL,
    412 			VOID *callbackData = NULL)
    413 	{
    414 		return updateStatus(DllExports::GdipDrawImageRectRect(
    415 				nativeGraphics,
    416 				image ? image->nativeImage : NULL,
    417 				destRect.X, destRect.Y,
    418 				destRect.Width, destRect.Height,
    419 				srcx, srcy, srcwidth, srcheight, srcUnit,
    420 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL,
    421 				callback, callbackData));
    422 	}
    423 	Status DrawImage(Image *image, const Rect& destRect,
    424 			INT srcx, INT srcy, INT srcwidth, INT srcheight,
    425 			Unit srcUnit,
    426 			const ImageAttributes *imageAttributes = NULL,
    427 			DrawImageAbort callback = NULL,
    428 			VOID *callbackData = NULL)
    429 	{
    430 		return updateStatus(DllExports::GdipDrawImageRectRectI(
    431 				nativeGraphics,
    432 				image ? image->nativeImage : NULL,
    433 				destRect.X, destRect.Y,
    434 				destRect.Width, destRect.Height,
    435 				srcx, srcy, srcwidth, srcheight, srcUnit,
    436 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL,
    437 				callback, callbackData));
    438 	}
    439 	Status DrawImage(Image *image, const RectF& destRect,
    440 			const RectF& sourceRect, Unit srcUnit,
    441 			const ImageAttributes *imageAttributes = NULL)
    442 	{
    443 		return updateStatus(DllExports::GdipDrawImageRectRectI(
    444 				nativeGraphics,
    445 				image ? image->nativeImage : NULL,
    446 				destRect.X, destRect.Y,
    447 				destRect.Width, destRect.Height,
    448 				sourceRect.X, sourceRect.Y,
    449 				sourceRect.Width, sourceRect.Height, srcUnit,
    450 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL,
    451 				NULL, NULL));
    452 	}
    453 	Status DrawImage(Image *image, const PointF *destPoints, INT count,
    454 			REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight,
    455 			Unit srcUnit,
    456 			const ImageAttributes *imageAttributes = NULL,
    457 			DrawImageAbort callback = NULL,
    458 			VOID *callbackData = NULL)
    459 	{
    460 		return updateStatus(DllExports::GdipDrawImagePointsRect(
    461 				nativeGraphics,
    462 				image ? image->nativeImage : NULL,
    463 				destPoints, count,
    464 				srcx, srcy, srcwidth, srcheight, srcUnit,
    465 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL,
    466 				callback, callbackData));
    467 	}
    468 	Status DrawImage(Image *image, const Point *destPoints, INT count,
    469 			INT srcx, INT srcy, INT srcwidth, INT srcheight,
    470 			Unit srcUnit,
    471 			const ImageAttributes *imageAttributes = NULL,
    472 			DrawImageAbort callback = NULL,
    473 			VOID *callbackData = NULL)
    474 	{
    475 		return updateStatus(DllExports::GdipDrawImagePointsRectI(
    476 				nativeGraphics,
    477 				image ? image->nativeImage : NULL,
    478 				destPoints, count,
    479 				srcx, srcy, srcwidth, srcheight, srcUnit,
    480 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL,
    481 				callback, callbackData));
    482 	}
    483 	// TODO: [GDI+ 1.1] Graphics::DrawImage(..Effect..)
    484 	//Status DrawImage(Image *image, RectF *sourceRect, Matrix *matrix,
    485 	//		Effect *effect, ImageAttributes *imageAttributes,
    486 	//		Unit srcUnit)
    487 	//{
    488 	//	return updateStatus(DllExports::GdipDrawImageFX(
    489 	//			nativeGraphics,
    490 	//			image ? image->nativeImage : NULL,
    491 	//			sourceRect,
    492 	//			matrix ? matrix->nativeMatrix : NULL,
    493 	//			effect ? effect->nativeEffect : NULL,
    494 	//			imageAttributes ? imageAttributes->nativeImageAttributes : NULL,
    495 	//			srcUnit));
    496 	//}
    497 	Status DrawLine(const Pen *pen, REAL x1, REAL y1, REAL x2, REAL y2)
    498 	{
    499 		return updateStatus(DllExports::GdipDrawLine(
    500 				nativeGraphics, pen ? pen->nativePen : NULL,
    501 				x1, y1, x2, y2));
    502 	}
    503 	Status DrawLine(const Pen *pen, INT x1, INT y1, INT x2, INT y2)
    504 	{
    505 		return updateStatus(DllExports::GdipDrawLineI(
    506 				nativeGraphics, pen ? pen->nativePen : NULL,
    507 				x1, y1, x2, y2));
    508 	}
    509 	Status DrawLine(const Pen *pen, const PointF& pt1, const PointF& pt2)
    510 	{
    511 		return updateStatus(DllExports::GdipDrawLine(
    512 				nativeGraphics, pen ? pen->nativePen : NULL,
    513 				pt1.X, pt1.Y, pt2.X, pt2.Y));
    514 	}
    515 	Status DrawLine(const Pen *pen, const Point& pt1, const Point& pt2)
    516 	{
    517 		return updateStatus(DllExports::GdipDrawLineI(
    518 				nativeGraphics, pen ? pen->nativePen : NULL,
    519 				pt1.X, pt1.Y, pt2.X, pt2.Y));
    520 	}
    521 	Status DrawLines(const Pen *pen, const PointF *points, INT count)
    522 	{
    523 		return updateStatus(DllExports::GdipDrawLines(
    524 				nativeGraphics, pen ? pen->nativePen : NULL,
    525 				points, count));
    526 	}
    527 	Status DrawLines(const Pen *pen, const Point *points, INT count)
    528 	{
    529 		return updateStatus(DllExports::GdipDrawLinesI(
    530 				nativeGraphics, pen ? pen->nativePen : NULL,
    531 				points, count));
    532 	}
    533 	Status DrawPath(const Pen *pen, const GraphicsPath *path)
    534 	{
    535 		return updateStatus(DllExports::GdipDrawPath(
    536 				nativeGraphics, pen ? pen->nativePen : NULL,
    537 				path ? path->nativePath : NULL));
    538 	}
    539 	Status DrawPie(const Pen *pen, REAL x, REAL y, REAL width, REAL height,
    540 			REAL startAngle, REAL sweepAngle)
    541 	{
    542 		return updateStatus(DllExports::GdipDrawPie(
    543 				nativeGraphics, pen ? pen->nativePen : NULL,
    544 				x, y, width, height, startAngle, sweepAngle));
    545 	}
    546 	Status DrawPie(const Pen *pen, INT x, INT y, INT width, INT height,
    547 			REAL startAngle, REAL sweepAngle)
    548 	{
    549 		return updateStatus(DllExports::GdipDrawPieI(
    550 				nativeGraphics, pen ? pen->nativePen : NULL,
    551 				x, y, width, height, startAngle, sweepAngle));
    552 	}
    553 	Status DrawPie(const Pen *pen, const RectF& rect,
    554 			REAL startAngle, REAL sweepAngle)
    555 	{
    556 		return updateStatus(DllExports::GdipDrawPie(
    557 				nativeGraphics, pen ? pen->nativePen : NULL,
    558 				rect.X, rect.Y, rect.Width, rect.Height,
    559 				startAngle, sweepAngle));
    560 	}
    561 	Status DrawPie(const Pen *pen, const Rect& rect,
    562 			REAL startAngle, REAL sweepAngle)
    563 	{
    564 		return updateStatus(DllExports::GdipDrawPieI(
    565 				nativeGraphics, pen ? pen->nativePen : NULL,
    566 				rect.X, rect.Y, rect.Width, rect.Height,
    567 				startAngle, sweepAngle));
    568 	}
    569 	Status DrawPolygon(const Pen *pen, const PointF *points, INT count)
    570 	{
    571 		return updateStatus(DllExports::GdipDrawPolygon(
    572 				nativeGraphics, pen ? pen->nativePen : NULL,
    573 				points, count));
    574 	}
    575 	Status DrawPolygon(const Pen *pen, const Point *points, INT count)
    576 	{
    577 		return updateStatus(DllExports::GdipDrawPolygonI(
    578 				nativeGraphics, pen ? pen->nativePen : NULL,
    579 				points, count));
    580 	}
    581 	Status DrawRectangle(const Pen *pen,
    582 			REAL x, REAL y, REAL width, REAL height)
    583 	{
    584 		return updateStatus(DllExports::GdipDrawRectangle(
    585 				nativeGraphics, pen ? pen->nativePen : NULL,
    586 				x, y, width, height));
    587 	}
    588 	Status DrawRectangle(const Pen *pen,
    589 			INT x, INT y, INT width, INT height)
    590 	{
    591 		return updateStatus(DllExports::GdipDrawRectangleI(
    592 				nativeGraphics, pen ? pen->nativePen : NULL,
    593 				x, y, width, height));
    594 	}
    595 	Status DrawRectangle(const Pen *pen, const RectF& rect)
    596 	{
    597 		return updateStatus(DllExports::GdipDrawRectangle(
    598 				nativeGraphics, pen ? pen->nativePen : NULL,
    599 				rect.X, rect.Y, rect.Width, rect.Height));
    600 	}
    601 	Status DrawRectangle(const Pen *pen, const Rect& rect)
    602 	{
    603 		return updateStatus(DllExports::GdipDrawRectangleI(
    604 				nativeGraphics, pen ? pen->nativePen : NULL,
    605 				rect.X, rect.Y, rect.Width, rect.Height));
    606 	}
    607 	Status DrawRectangles(const Pen *pen, const RectF *rects, INT count)
    608 	{
    609 		return updateStatus(DllExports::GdipDrawRectangles(
    610 				nativeGraphics, pen ? pen->nativePen : NULL,
    611 				rects, count));
    612 	}
    613 	Status DrawRectangles(const Pen *pen, const Rect *rects, INT count)
    614 	{
    615 		return updateStatus(DllExports::GdipDrawRectanglesI(
    616 				nativeGraphics, pen ? pen->nativePen : NULL,
    617 				rects, count));
    618 	}
    619 	Status DrawString(const WCHAR *string, INT length, const Font *font,
    620 			const PointF& origin, const Brush *brush)
    621 	{
    622 		RectF layoutRect(origin.X, origin.Y, 0.0f, 0.0f);
    623 		return updateStatus(DllExports::GdipDrawString(
    624 				nativeGraphics, string, length,
    625 				font ? font->nativeFont : NULL,
    626 				&layoutRect, NULL,
    627 				brush ? brush->nativeBrush : NULL));
    628 	}
    629 	Status DrawString(const WCHAR *string, INT length,
    630 			const Font *font, const PointF& origin,
    631 			const StringFormat *stringFormat, const Brush *brush)
    632 	{
    633 		RectF layoutRect(origin.X, origin.Y, 0.0f, 0.0f);
    634 		return updateStatus(DllExports::GdipDrawString(
    635 				nativeGraphics, string, length,
    636 				font ? font->nativeFont : NULL,
    637 				&layoutRect,
    638 				stringFormat ? stringFormat->nativeStringFormat : NULL,
    639 				brush ? brush->nativeBrush : NULL));
    640 	}
    641 	Status DrawString(const WCHAR *string, INT length,
    642 			const Font *font, const RectF& layoutRect,
    643 			const StringFormat *stringFormat, const Brush *brush)
    644 	{
    645 		return updateStatus(DllExports::GdipDrawString(
    646 				nativeGraphics, string, length,
    647 				font ? font->nativeFont : NULL,
    648 				&layoutRect,
    649 				stringFormat ? stringFormat->nativeStringFormat : NULL,
    650 				brush ? brush->nativeBrush : NULL));
    651 	}
    652 	Status EndContainer(GraphicsContainer state)
    653 	{
    654 		return updateStatus(DllExports::GdipEndContainer(
    655 				nativeGraphics, state));
    656 	}
    657 	Status EnumerateMetafile(const Metafile *metafile,
    658 			const PointF& destPoint,
    659 			EnumerateMetafileProc callback,
    660 			VOID *callbackData = NULL,
    661 			ImageAttributes *imageAttributes = NULL)
    662 	{
    663 		return updateStatus(DllExports::GdipEnumerateMetafileDestPoint(
    664 				nativeGraphics,
    665 				metafile ? ((GpMetafile*) metafile->nativeImage) : NULL,
    666 				destPoint, callback, callbackData,
    667 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL));
    668 	}
    669 	Status EnumerateMetafile(const Metafile *metafile,
    670 			const Point& destPoint,
    671 			EnumerateMetafileProc callback,
    672 			VOID *callbackData = NULL,
    673 			ImageAttributes *imageAttributes = NULL)
    674 	{
    675 		return updateStatus(DllExports::GdipEnumerateMetafileDestPointI(
    676 				nativeGraphics,
    677 				metafile ? ((GpMetafile*) metafile->nativeImage) : NULL,
    678 				destPoint, callback, callbackData,
    679 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL));
    680 	}
    681 	Status EnumerateMetafile(const Metafile *metafile,
    682 			const RectF& destRect,
    683 			EnumerateMetafileProc callback,
    684 			VOID *callbackData = NULL,
    685 			ImageAttributes *imageAttributes = NULL)
    686 	{
    687 		return updateStatus(DllExports::GdipEnumerateMetafileDestRect(
    688 				nativeGraphics,
    689 				metafile ? ((GpMetafile*) metafile->nativeImage) : NULL,
    690 				destRect, callback, callbackData,
    691 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL));
    692 	}
    693 	Status EnumerateMetafile(const Metafile *metafile,
    694 			const Rect& destRect,
    695 			EnumerateMetafileProc callback,
    696 			VOID *callbackData = NULL,
    697 			ImageAttributes *imageAttributes = NULL)
    698 	{
    699 		return updateStatus(DllExports::GdipEnumerateMetafileDestRectI(
    700 				nativeGraphics,
    701 				metafile ? ((GpMetafile*) metafile->nativeImage) : NULL,
    702 				destRect, callback, callbackData,
    703 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL));
    704 	}
    705 	Status EnumerateMetafile(const Metafile *metafile,
    706 			const PointF *destPoints, INT count,
    707 			EnumerateMetafileProc callback,
    708 			VOID *callbackData = NULL,
    709 			ImageAttributes *imageAttributes = NULL)
    710 	{
    711 		return updateStatus(DllExports::GdipEnumerateMetafileDestPoints(
    712 				nativeGraphics,
    713 				metafile ? ((GpMetafile*) metafile->nativeImage) : NULL,
    714 				destPoints, count, callback, callbackData,
    715 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL));
    716 	}
    717 	Status EnumerateMetafile(const Metafile *metafile,
    718 			const Point *destPoints, INT count,
    719 			EnumerateMetafileProc callback,
    720 			VOID *callbackData = NULL,
    721 			ImageAttributes *imageAttributes = NULL)
    722 	{
    723 		return updateStatus(DllExports::GdipEnumerateMetafileDestPointsI(
    724 				nativeGraphics,
    725 				metafile ? ((GpMetafile*) metafile->nativeImage) : NULL,
    726 				destPoints, count, callback, callbackData,
    727 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL));
    728 	}
    729 	Status EnumerateMetafile(const Metafile *metafile,
    730 			const PointF& destPoint,
    731 			const RectF& srcRect, Unit srcUnit,
    732 			EnumerateMetafileProc callback,
    733 			VOID *callbackData = NULL,
    734 			ImageAttributes *imageAttributes = NULL)
    735 	{
    736 		return updateStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoint(
    737 				nativeGraphics,
    738 				metafile ? ((GpMetafile*) metafile->nativeImage) : NULL,
    739 				destPoint, srcRect, srcUnit,
    740 				callback, callbackData,
    741 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL));
    742 	}
    743 	Status EnumerateMetafile(const Metafile *metafile,
    744 			const Point& destPoint,
    745 			const Rect& srcRect, Unit srcUnit,
    746 			EnumerateMetafileProc callback,
    747 			VOID *callbackData = NULL,
    748 			ImageAttributes *imageAttributes = NULL)
    749 	{
    750 		return updateStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointI(
    751 				nativeGraphics,
    752 				metafile ? ((GpMetafile*) metafile->nativeImage) : NULL,
    753 				destPoint, srcRect, srcUnit,
    754 				callback, callbackData,
    755 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL));
    756 	}
    757 	Status EnumerateMetafile(const Metafile *metafile,
    758 			const RectF& destRect,
    759 			const RectF& srcRect, Unit srcUnit,
    760 			EnumerateMetafileProc callback,
    761 			VOID *callbackData = NULL,
    762 			ImageAttributes *imageAttributes = NULL)
    763 	{
    764 		return updateStatus(DllExports::GdipEnumerateMetafileSrcRectDestRect(
    765 				nativeGraphics,
    766 				metafile ? ((GpMetafile*) metafile->nativeImage) : NULL,
    767 				destRect, srcRect, srcUnit,
    768 				callback, callbackData,
    769 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL));
    770 	}
    771 	Status EnumerateMetafile(const Metafile *metafile,
    772 			const Rect& destRect,
    773 			const Rect& srcRect, Unit srcUnit,
    774 			EnumerateMetafileProc callback,
    775 			VOID *callbackData = NULL,
    776 			ImageAttributes *imageAttributes = NULL)
    777 	{
    778 		return updateStatus(DllExports::GdipEnumerateMetafileSrcRectDestRectI(
    779 				nativeGraphics,
    780 				metafile ? ((GpMetafile*) metafile->nativeImage) : NULL,
    781 				destRect, srcRect, srcUnit,
    782 				callback, callbackData,
    783 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL));
    784 	}
    785 	Status EnumerateMetafile(const Metafile *metafile,
    786 			const PointF* destPoints, INT count,
    787 			const RectF& srcRect, Unit srcUnit,
    788 			EnumerateMetafileProc callback,
    789 			VOID *callbackData = NULL,
    790 			ImageAttributes *imageAttributes = NULL)
    791 	{
    792 		return updateStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoints(
    793 				nativeGraphics,
    794 				metafile ? ((GpMetafile*) metafile->nativeImage) : NULL,
    795 				destPoints, count, srcRect, srcUnit,
    796 				callback, callbackData,
    797 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL));
    798 	}
    799 	Status EnumerateMetafile(const Metafile *metafile,
    800 			const Point* destPoints, INT count,
    801 			const Rect& srcRect, Unit srcUnit,
    802 			EnumerateMetafileProc callback,
    803 			VOID *callbackData = NULL,
    804 			ImageAttributes *imageAttributes = NULL)
    805 	{
    806 		return updateStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointsI(
    807 				nativeGraphics,
    808 				metafile ? ((GpMetafile*) metafile->nativeImage) : NULL,
    809 				destPoints, count, srcRect, srcUnit,
    810 				callback, callbackData,
    811 				imageAttributes ? imageAttributes->nativeImageAttributes : NULL));
    812 	}
    813 	Status ExcludeClip(const RectF& rect)
    814 	{
    815 		return updateStatus(DllExports::GdipSetClipRect(
    816 				nativeGraphics,
    817 				rect.X, rect.Y, rect.Width, rect.Height,
    818 				CombineModeExclude));
    819 	}
    820 	Status ExcludeClip(const Rect& rect)
    821 	{
    822 		return updateStatus(DllExports::GdipSetClipRectI(
    823 				nativeGraphics,
    824 				rect.X, rect.Y, rect.Width, rect.Height,
    825 				CombineModeExclude));
    826 	}
    827 	Status ExcludeClip(const Region *region)
    828 	{
    829 		return updateStatus(DllExports::GdipSetClipRegion(
    830 				nativeGraphics,
    831 				region ? region->nativeRegion : NULL,
    832 				CombineModeExclude));
    833 	}
    834 	Status FillClosedCurve(const Brush *brush,
    835 			const PointF *points, INT count)
    836 	{
    837 		return updateStatus(DllExports::GdipFillClosedCurve(
    838 				nativeGraphics,
    839 				brush ? brush->nativeBrush : NULL,
    840 				points, count));
    841 	}
    842 	Status FillClosedCurve(const Brush *brush,
    843 			const Point *points, INT count)
    844 	{
    845 		return updateStatus(DllExports::GdipFillClosedCurveI(
    846 				nativeGraphics,
    847 				brush ? brush->nativeBrush : NULL,
    848 				points, count));
    849 	}
    850 	Status FillClosedCurve(const Brush *brush,
    851 			const PointF *points, INT count,
    852 			FillMode fillMode, REAL tension = 0.5f)
    853 	{
    854 		return updateStatus(DllExports::GdipFillClosedCurve2(
    855 				nativeGraphics,
    856 				brush ? brush->nativeBrush : NULL,
    857 				points, count, tension, fillMode));
    858 	}
    859 	Status FillClosedCurve(const Brush *brush,
    860 			const Point *points, INT count,
    861 			FillMode fillMode, REAL tension = 0.5f)
    862 	{
    863 		return updateStatus(DllExports::GdipFillClosedCurve2I(
    864 				nativeGraphics,
    865 				brush ? brush->nativeBrush : NULL,
    866 				points, count, tension, fillMode));
    867 	}
    868 	Status FillEllipse(const Brush *brush,
    869 			REAL x, REAL y, REAL width, REAL height)
    870 	{
    871 		return updateStatus(DllExports::GdipFillEllipse(
    872 				nativeGraphics,
    873 				brush ? brush->nativeBrush : NULL,
    874 				x, y, width, height));
    875 	}
    876 	Status FillEllipse(const Brush *brush,
    877 			INT x, INT y, INT width, INT height)
    878 	{
    879 		return updateStatus(DllExports::GdipFillEllipseI(
    880 				nativeGraphics,
    881 				brush ? brush->nativeBrush : NULL,
    882 				x, y, width, height));
    883 	}
    884 	Status FillEllipse(const Brush *brush, const RectF& rect)
    885 	{
    886 		return updateStatus(DllExports::GdipFillEllipse(
    887 				nativeGraphics,
    888 				brush ? brush->nativeBrush : NULL,
    889 				rect.X, rect.Y, rect.Width, rect.Height));
    890 	}
    891 	Status FillEllipse(const Brush *brush, const Rect& rect)
    892 	{
    893 		return updateStatus(DllExports::GdipFillEllipseI(
    894 				nativeGraphics,
    895 				brush ? brush->nativeBrush : NULL,
    896 				rect.X, rect.Y, rect.Width, rect.Height));
    897 	}
    898 	Status FillPath(const Brush *brush, const GraphicsPath *path)
    899 	{
    900 		return updateStatus(DllExports::GdipFillPath(
    901 				nativeGraphics,
    902 				brush ? brush->nativeBrush : NULL,
    903 				path ? path->nativePath : NULL));
    904 	}
    905 	Status FillPie(const Brush *brush,
    906 			REAL x, REAL y, REAL width, REAL height,
    907 			REAL startAngle, REAL sweepAngle)
    908 	{
    909 		return updateStatus(DllExports::GdipFillPie(
    910 				nativeGraphics,
    911 				brush ? brush->nativeBrush : NULL,
    912 				x, y, width, height, startAngle, sweepAngle));
    913 	}
    914 	Status FillPie(const Brush *brush, INT x, INT y, INT width, INT height,
    915 			REAL startAngle, REAL sweepAngle)
    916 	{
    917 		return updateStatus(DllExports::GdipFillPieI(
    918 				nativeGraphics,
    919 				brush ? brush->nativeBrush : NULL,
    920 				x, y, width, height, startAngle, sweepAngle));
    921 	}
    922 	Status FillPie(const Brush *brush, const RectF& rect,
    923 			REAL startAngle, REAL sweepAngle)
    924 	{
    925 		return updateStatus(DllExports::GdipFillPie(
    926 				nativeGraphics,
    927 				brush ? brush->nativeBrush : NULL,
    928 				rect.X, rect.Y, rect.Width, rect.Height,
    929 				startAngle, sweepAngle));
    930 	}
    931 	Status FillPie(const Brush *brush, const Rect& rect,
    932 			REAL startAngle, REAL sweepAngle)
    933 	{
    934 		return updateStatus(DllExports::GdipFillPieI(
    935 				nativeGraphics,
    936 				brush ? brush->nativeBrush : NULL,
    937 				rect.X, rect.Y, rect.Width, rect.Height,
    938 				startAngle, sweepAngle));
    939 	}
    940 	Status FillPolygon(const Brush *brush, const PointF *points, INT count)
    941 	{
    942 		return updateStatus(DllExports::GdipFillPolygon(
    943 				nativeGraphics,
    944 				brush ? brush->nativeBrush : NULL,
    945 				points, count, FillModeAlternate));
    946 	}
    947 	Status FillPolygon(const Brush *brush, const Point *points, INT count)
    948 	{
    949 		return updateStatus(DllExports::GdipFillPolygonI(
    950 				nativeGraphics,
    951 				brush ? brush->nativeBrush : NULL,
    952 				points, count, FillModeAlternate));
    953 	}
    954 	Status FillPolygon(const Brush *brush, const PointF *points, INT count,
    955 			FillMode fillMode)
    956 	{
    957 		return updateStatus(DllExports::GdipFillPolygon(
    958 				nativeGraphics,
    959 				brush ? brush->nativeBrush : NULL,
    960 				points, count, fillMode));
    961 	}
    962 	Status FillPolygon(const Brush *brush, const Point *points, INT count,
    963 			FillMode fillMode)
    964 	{
    965 		return updateStatus(DllExports::GdipFillPolygonI(
    966 				nativeGraphics,
    967 				brush ? brush->nativeBrush : NULL,
    968 				points, count, fillMode));
    969 	}
    970 	Status FillRectangle(const Brush *brush,
    971 			REAL x, REAL y, REAL width, REAL height)
    972 	{
    973 		return updateStatus(DllExports::GdipFillRectangle(
    974 				nativeGraphics,
    975 				brush ? brush->nativeBrush : NULL,
    976 				x, y, width, height));
    977 	}
    978 	Status FillRectangle(const Brush *brush,
    979 			INT x, INT y, INT width, INT height)
    980 	{
    981 		return updateStatus(DllExports::GdipFillRectangleI(
    982 				nativeGraphics,
    983 				brush ? brush->nativeBrush : NULL,
    984 				x, y, width, height));
    985 	}
    986 	Status FillRectangle(const Brush *brush, const RectF& rect)
    987 	{
    988 		return updateStatus(DllExports::GdipFillRectangle(
    989 				nativeGraphics,
    990 				brush ? brush->nativeBrush : NULL,
    991 				rect.X, rect.Y, rect.Width, rect.Height));
    992 	}
    993 	Status FillRectangle(const Brush *brush, const Rect& rect)
    994 	{
    995 		return updateStatus(DllExports::GdipFillRectangleI(
    996 				nativeGraphics,
    997 				brush ? brush->nativeBrush : NULL,
    998 				rect.X, rect.Y, rect.Width, rect.Height));
    999 	}
   1000 	Status FillRectangles(const Brush *brush, const RectF *rects, INT count)
   1001 	{
   1002 		return updateStatus(DllExports::GdipFillRectangles(
   1003 				nativeGraphics,
   1004 				brush ? brush->nativeBrush : NULL,
   1005 				rects, count));
   1006 	}
   1007 	Status FillRectangles(const Brush *brush, const Rect *rects, INT count)
   1008 	{
   1009 		return updateStatus(DllExports::GdipFillRectanglesI(
   1010 				nativeGraphics,
   1011 				brush ? brush->nativeBrush : NULL,
   1012 				rects, count));
   1013 	}
   1014 	Status FillRegion(const Brush *brush, const Region *region)
   1015 	{
   1016 		return updateStatus(DllExports::GdipFillRegion(
   1017 				nativeGraphics,
   1018 				brush ? brush->nativeBrush : NULL,
   1019 				region ? region->nativeRegion : NULL));
   1020 	}
   1021 	VOID Flush(FlushIntention intention = FlushIntentionFlush)
   1022 	{
   1023 		updateStatus(DllExports::GdipFlush(nativeGraphics, intention));
   1024 	}
   1025 	Status GetClip(Region *region) const
   1026 	{
   1027 		return updateStatus(DllExports::GdipGetClip(
   1028 				nativeGraphics,
   1029 				region ? region->nativeRegion : NULL));
   1030 	}
   1031 	Status GetClipBounds(RectF *rect) const
   1032 	{
   1033 		return updateStatus(DllExports::GdipGetClipBounds(
   1034 				nativeGraphics, rect));
   1035 	}
   1036 	Status GetClipBounds(Rect *rect) const
   1037 	{
   1038 		return updateStatus(DllExports::GdipGetClipBoundsI(
   1039 				nativeGraphics, rect));
   1040 	}
   1041 	CompositingMode GetCompositingMode() const
   1042 	{
   1043 		CompositingMode result = CompositingModeSourceOver;
   1044 		updateStatus(DllExports::GdipGetCompositingMode(
   1045 				nativeGraphics, &result));
   1046 		return result;
   1047 	}
   1048 	CompositingQuality GetCompositingQuality() const
   1049 	{
   1050 		CompositingQuality result = CompositingQualityDefault;
   1051 		updateStatus(DllExports::GdipGetCompositingQuality(
   1052 				nativeGraphics, &result));
   1053 		return result;
   1054 	}
   1055 	REAL GetDpiX() const
   1056 	{
   1057 		REAL result = 0.0f;
   1058 		updateStatus(DllExports::GdipGetDpiX(nativeGraphics, &result));
   1059 		return result;
   1060 	}
   1061 	REAL GetDpiY() const
   1062 	{
   1063 		REAL result = 0.0f;
   1064 		updateStatus(DllExports::GdipGetDpiY(nativeGraphics, &result));
   1065 		return result;
   1066 	}
   1067 	HDC GetHDC()
   1068 	{
   1069 		HDC result = NULL;
   1070 		updateStatus(DllExports::GdipGetDC(nativeGraphics, &result));
   1071 		return result;
   1072 	}
   1073 	InterpolationMode GetInterpolationMode() const
   1074 	{
   1075 		InterpolationMode result = InterpolationModeDefault;
   1076 		updateStatus(DllExports::GdipGetInterpolationMode(
   1077 				nativeGraphics, &result));
   1078 		return result;
   1079 	}
   1080 	Status GetLastStatus() const
   1081 	{
   1082 		Status result = lastStatus;
   1083 		lastStatus = Ok;
   1084 		return result;
   1085 	}
   1086 	Status GetNearestColor(Color *color) const
   1087 	{
   1088 		return updateStatus(DllExports::GdipGetNearestColor(
   1089 				nativeGraphics, color ? &color->Value : NULL));
   1090 	}
   1091 	REAL GetPageScale() const
   1092 	{
   1093 		REAL result = 0.0f;
   1094 		updateStatus(DllExports::GdipGetPageScale(
   1095 				nativeGraphics, &result));
   1096 		return result;
   1097 	}
   1098 	Unit GetPageUnit() const
   1099 	{
   1100 		Unit result = UnitWorld;
   1101 		updateStatus(DllExports::GdipGetPageUnit(
   1102 				nativeGraphics, &result));
   1103 		return result;
   1104 	}
   1105 	PixelOffsetMode GetPixelOffsetMode() const
   1106 	{
   1107 		PixelOffsetMode result = PixelOffsetModeDefault;
   1108 		updateStatus(DllExports::GdipGetPixelOffsetMode(
   1109 				nativeGraphics, &result));
   1110 		return result;
   1111 	}
   1112 	Status GetRenderingOrigin(INT *x, INT *y) const
   1113 	{
   1114 		return updateStatus(DllExports::GdipGetRenderingOrigin(
   1115 				nativeGraphics, x, y));
   1116 	}
   1117 	SmoothingMode GetSmoothingMode() const
   1118 	{
   1119 		SmoothingMode result = SmoothingModeDefault;
   1120 		updateStatus(DllExports::GdipGetSmoothingMode(
   1121 				nativeGraphics, &result));
   1122 		return result;
   1123 	}
   1124 	UINT GetTextContrast() const
   1125 	{
   1126 		UINT result = 0;
   1127 		updateStatus(DllExports::GdipGetTextContrast(
   1128 				nativeGraphics, &result));
   1129 		return result;
   1130 	}
   1131 	TextRenderingHint GetTextRenderingHint() const
   1132 	{
   1133 		TextRenderingHint result = TextRenderingHintSystemDefault;
   1134 		updateStatus(DllExports::GdipGetTextRenderingHint(
   1135 				nativeGraphics, &result));
   1136 		return result;
   1137 	}
   1138 	Status GetTransform(Matrix *matrix) const
   1139 	{
   1140 		return updateStatus(DllExports::GdipGetWorldTransform(
   1141 				nativeGraphics,
   1142 				matrix ? matrix->nativeMatrix : NULL));
   1143 	}
   1144 	Status GetVisibleClipBounds(RectF *rect) const
   1145 	{
   1146 		return updateStatus(DllExports::GdipGetVisibleClipBounds(
   1147 				nativeGraphics, rect));
   1148 	}
   1149 	Status GetVisibleClipBounds(Rect *rect) const
   1150 	{
   1151 		return updateStatus(DllExports::GdipGetVisibleClipBoundsI(
   1152 				nativeGraphics, rect));
   1153 	}
   1154 	Status IntersectClip(const RectF& rect)
   1155 	{
   1156 		return updateStatus(DllExports::GdipSetClipRect(
   1157 				nativeGraphics,
   1158 				rect.X, rect.Y, rect.Width, rect.Height,
   1159 				CombineModeIntersect));
   1160 	}
   1161 	Status IntersectClip(const Rect& rect)
   1162 	{
   1163 		return updateStatus(DllExports::GdipSetClipRectI(
   1164 				nativeGraphics,
   1165 				rect.X, rect.Y, rect.Width, rect.Height,
   1166 				CombineModeIntersect));
   1167 	}
   1168 	Status IntersectClip(const Region *region)
   1169 	{
   1170 		return updateStatus(DllExports::GdipSetClipRegion(
   1171 				nativeGraphics,
   1172 				region ? region->nativeRegion : NULL,
   1173 				CombineModeIntersect));
   1174 	}
   1175 	BOOL IsClipEmpty() const
   1176 	{
   1177 		BOOL result = FALSE;
   1178 		updateStatus(DllExports::GdipIsClipEmpty(
   1179 				nativeGraphics, &result));
   1180 		return result;
   1181 	}
   1182 	BOOL IsVisible(REAL x, REAL y) const
   1183 	{
   1184 		BOOL result = FALSE;
   1185 		updateStatus(DllExports::GdipIsVisiblePoint(
   1186 				nativeGraphics, x, y, &result));
   1187 		return result;
   1188 	}
   1189 	BOOL IsVisible(INT x, INT y) const
   1190 	{
   1191 		BOOL result = FALSE;
   1192 		updateStatus(DllExports::GdipIsVisiblePointI(
   1193 				nativeGraphics, x, y, &result));
   1194 		return result;
   1195 	}
   1196 	BOOL IsVisible(const PointF& point) const
   1197 	{
   1198 		BOOL result = FALSE;
   1199 		updateStatus(DllExports::GdipIsVisiblePoint(
   1200 				nativeGraphics, point.X, point.Y, &result));
   1201 		return result;
   1202 	}
   1203 	BOOL IsVisible(const Point& point) const
   1204 	{
   1205 		BOOL result = FALSE;
   1206 		updateStatus(DllExports::GdipIsVisiblePointI(
   1207 				nativeGraphics, point.X, point.Y, &result));
   1208 		return result;
   1209 	}
   1210 	BOOL IsVisible(REAL x, REAL y, REAL width, REAL height) const
   1211 	{
   1212 		BOOL result = FALSE;
   1213 		updateStatus(DllExports::GdipIsVisibleRect(
   1214 				nativeGraphics, x, y, width, height, &result));
   1215 		return result;
   1216 	}
   1217 	BOOL IsVisible(INT x, INT y, INT width, INT height) const
   1218 	{
   1219 		BOOL result = FALSE;
   1220 		updateStatus(DllExports::GdipIsVisibleRectI(
   1221 				nativeGraphics, x, y, width, height, &result));
   1222 		return result;
   1223 	}
   1224 	BOOL IsVisible(const RectF& rect) const
   1225 	{
   1226 		BOOL result = FALSE;
   1227 		updateStatus(DllExports::GdipIsVisibleRect(
   1228 				nativeGraphics, rect.X, rect.Y,
   1229 				rect.Width, rect.Height, &result));
   1230 		return result;
   1231 	}
   1232 	BOOL IsVisible(const Rect& rect) const
   1233 	{
   1234 		BOOL result = FALSE;
   1235 		updateStatus(DllExports::GdipIsVisibleRectI(
   1236 				nativeGraphics, rect.X, rect.Y,
   1237 				rect.Width, rect.Height, &result));
   1238 		return result;
   1239 	}
   1240 	BOOL IsVisibleClipEmpty() const
   1241 	{
   1242 		BOOL result = FALSE;
   1243 		updateStatus(DllExports::GdipIsVisibleClipEmpty(
   1244 				nativeGraphics, &result));
   1245 		return result;
   1246 	}
   1247 	Status MeasureCharacterRanges(const WCHAR *string, INT length,
   1248 			const Font *font, const RectF& layoutRect,
   1249 			const StringFormat *stringFormat,
   1250 			INT regionCount, Region *regions) const
   1251 	{
   1252 		if (regionCount <= 0 || !regions)
   1253 			return lastStatus = InvalidParameter;
   1254 
   1255 		GpRegion **nativeRegionArray = (GpRegion**)
   1256 			DllExports::GdipAlloc(regionCount * sizeof(GpRegion*));
   1257 		if (!nativeRegionArray)
   1258 			return lastStatus = OutOfMemory;
   1259 		for (int i = 0; i < regionCount; ++i) {
   1260 			nativeRegionArray[i] = regions[i].nativeRegion;
   1261 		}
   1262 		Status status = updateStatus(DllExports::GdipMeasureCharacterRanges(
   1263 				nativeGraphics, string, length,
   1264 				font ? font->nativeFont : NULL,
   1265 				layoutRect,
   1266 				stringFormat ? stringFormat->nativeStringFormat : NULL,
   1267 				regionCount, nativeRegionArray));
   1268 		DllExports::GdipFree(nativeRegionArray);
   1269 		return status;
   1270 	}
   1271 	Status MeasureDriverString(const UINT16 *text, INT length,
   1272 			const Font *font, const PointF *positions, INT flags,
   1273 			const Matrix *matrix, RectF *boundingBox) const
   1274 	{
   1275 		return updateStatus(DllExports::GdipMeasureDriverString(
   1276 				nativeGraphics, text, length,
   1277 				font ? font->nativeFont : NULL,
   1278 				positions, flags,
   1279 				matrix ? matrix->nativeMatrix : NULL,
   1280 				boundingBox));
   1281 	}
   1282 	Status MeasureString(const WCHAR *string, INT length,
   1283 			const Font *font, const RectF& layoutRect,
   1284 			RectF *boundingBox) const
   1285 	{
   1286 		return updateStatus(DllExports::GdipMeasureString(
   1287 				nativeGraphics, string, length,
   1288 				font ? font->nativeFont : NULL,
   1289 				&layoutRect, NULL, boundingBox, NULL, NULL));
   1290 	}
   1291 	Status MeasureString(const WCHAR *string, INT length,
   1292 			const Font *font, const RectF& layoutRect,
   1293 			const StringFormat *stringFormat, RectF *boundingBox,
   1294 			INT *codepointsFitted = NULL,
   1295 			INT *linesFitted = NULL) const
   1296 	{
   1297 		return updateStatus(DllExports::GdipMeasureString(
   1298 				nativeGraphics, string, length,
   1299 				font ? font->nativeFont : NULL,
   1300 				&layoutRect,
   1301 				stringFormat ? stringFormat->nativeStringFormat : NULL,
   1302 				boundingBox, codepointsFitted, linesFitted));
   1303 	}
   1304 	Status MeasureString(const WCHAR *string, INT length,
   1305 			const Font *font, const SizeF& layoutRectSize,
   1306 			const StringFormat *stringFormat, SizeF *size,
   1307 			INT *codepointsFitted = NULL,
   1308 			INT *linesFitted = NULL) const
   1309 	{
   1310 		if (!size) return lastStatus = InvalidParameter;
   1311 		RectF layoutRect(PointF(0.0f, 0.0f), layoutRectSize);
   1312 		RectF boundingBox;
   1313 		Status status = updateStatus(DllExports::GdipMeasureString(
   1314 				nativeGraphics, string, length,
   1315 				font ? font->nativeFont : NULL,
   1316 				&layoutRect,
   1317 				stringFormat ? stringFormat->nativeStringFormat : NULL,
   1318 				&boundingBox, codepointsFitted, linesFitted));
   1319 		boundingBox.GetSize(size);
   1320 		return status;
   1321 	}
   1322 	Status MeasureString(const WCHAR *string, INT length,
   1323 			const Font *font, const PointF& origin,
   1324 			RectF *boundingBox) const
   1325 	{
   1326 		RectF layoutRect(origin, SizeF(0.0f, 0.0f));
   1327 		return updateStatus(DllExports::GdipMeasureString(
   1328 				nativeGraphics, string, length,
   1329 				font ? font->nativeFont : NULL,
   1330 				&layoutRect, NULL, boundingBox, NULL, NULL));
   1331 	}
   1332 	Status MeasureString(const WCHAR *string, INT length,
   1333 			const Font *font, const PointF& origin,
   1334 			const StringFormat *stringFormat,
   1335 			RectF *boundingBox) const
   1336 	{
   1337 		RectF layoutRect(origin, SizeF(0.0f, 0.0f));
   1338 		return updateStatus(DllExports::GdipMeasureString(
   1339 				nativeGraphics, string, length,
   1340 				font ? font->nativeFont : NULL,
   1341 				&layoutRect,
   1342 				stringFormat ? stringFormat->nativeStringFormat : NULL,
   1343 				boundingBox, NULL, NULL));
   1344 	}
   1345 	Status MultiplyTransform(const Matrix *matrix,
   1346 			MatrixOrder order = MatrixOrderPrepend)
   1347 	{
   1348 		return updateStatus(DllExports::GdipMultiplyWorldTransform(
   1349 				nativeGraphics,
   1350 				matrix ? matrix->nativeMatrix : NULL, order));
   1351 	}
   1352 	VOID ReleaseHDC(HDC hdc)
   1353 	{
   1354 		updateStatus(DllExports::GdipReleaseDC(nativeGraphics, hdc));
   1355 	}
   1356 	Status ResetClip()
   1357 	{
   1358 		return updateStatus(DllExports::GdipResetClip(nativeGraphics));
   1359 	}
   1360 	Status ResetTransform()
   1361 	{
   1362 		return updateStatus(DllExports::GdipResetWorldTransform(
   1363 				nativeGraphics));
   1364 	}
   1365 	Status Restore(GraphicsState state)
   1366 	{
   1367 		return updateStatus(DllExports::GdipRestoreGraphics(
   1368 				nativeGraphics, state));
   1369 	}
   1370 	Status RotateTransform(REAL angle,
   1371 			MatrixOrder order = MatrixOrderPrepend)
   1372 	{
   1373 		return updateStatus(DllExports::GdipRotateWorldTransform(
   1374 				nativeGraphics, angle, order));
   1375 	}
   1376 	GraphicsState Save() const
   1377 	{
   1378 		GraphicsState result = 0;
   1379 		updateStatus(DllExports::GdipSaveGraphics(
   1380 				nativeGraphics, &result));
   1381 		return result;
   1382 	}
   1383 	Status ScaleTransform(REAL sx, REAL sy,
   1384 			MatrixOrder order = MatrixOrderPrepend)
   1385 	{
   1386 		return updateStatus(DllExports::GdipScaleWorldTransform(
   1387 				nativeGraphics, sx, sy, order));
   1388 	}
   1389 	VOID SetAbort()
   1390 	{
   1391 		updateStatus(NotImplemented);
   1392 	}
   1393 	Status SetClip(const Graphics *g,
   1394 			CombineMode combineMode = CombineModeReplace)
   1395 	{
   1396 		return updateStatus(DllExports::GdipSetClipGraphics(
   1397 				nativeGraphics, g ? g->nativeGraphics : NULL,
   1398 				combineMode));
   1399 	}
   1400 	Status SetClip(const RectF& rect,
   1401 			CombineMode combineMode = CombineModeReplace)
   1402 	{
   1403 		return updateStatus(DllExports::GdipSetClipRect(
   1404 				nativeGraphics,
   1405 				rect.X, rect.Y, rect.Width, rect.Height,
   1406 				combineMode));
   1407 	}
   1408 	Status SetClip(const Rect& rect,
   1409 			CombineMode combineMode = CombineModeReplace)
   1410 	{
   1411 		return updateStatus(DllExports::GdipSetClipRectI(
   1412 				nativeGraphics,
   1413 				rect.X, rect.Y, rect.Width, rect.Height,
   1414 				combineMode));
   1415 	}
   1416 	Status SetClip(const GraphicsPath *path,
   1417 			CombineMode combineMode = CombineModeReplace)
   1418 	{
   1419 		return updateStatus(DllExports::GdipSetClipPath(
   1420 				nativeGraphics,
   1421 				path ? path->nativePath : NULL,
   1422 				combineMode));
   1423 	}
   1424 	Status SetClip(const Region *region,
   1425 			CombineMode combineMode = CombineModeReplace)
   1426 	{
   1427 		return updateStatus(DllExports::GdipSetClipRegion(
   1428 				nativeGraphics,
   1429 				region ? region->nativeRegion : NULL,
   1430 				combineMode));
   1431 	}
   1432 	Status SetClip(HRGN hRgn, CombineMode combineMode = CombineModeReplace)
   1433 	{
   1434 		return updateStatus(DllExports::GdipSetClipHrgn(
   1435 				nativeGraphics, hRgn, combineMode));
   1436 	}
   1437 	Status SetCompositingMode(CompositingMode compositingMode)
   1438 	{
   1439 		return updateStatus(DllExports::GdipSetCompositingMode(
   1440 				nativeGraphics, compositingMode));
   1441 	}
   1442 	Status SetCompositingQuality(CompositingQuality compositingQuality)
   1443 	{
   1444 		return updateStatus(DllExports::GdipSetCompositingQuality(
   1445 				nativeGraphics, compositingQuality));
   1446 	}
   1447 	Status SetInterpolationMode(InterpolationMode interpolationMode)
   1448 	{
   1449 		return updateStatus(DllExports::GdipSetInterpolationMode(
   1450 				nativeGraphics, interpolationMode));
   1451 	}
   1452 	Status SetPageScale(REAL scale)
   1453 	{
   1454 		return updateStatus(DllExports::GdipSetPageScale(
   1455 				nativeGraphics, scale));
   1456 	}
   1457 	Status SetPageUnit(Unit unit)
   1458 	{
   1459 		return updateStatus(DllExports::GdipSetPageUnit(
   1460 				nativeGraphics, unit));
   1461 	}
   1462 	Status SetPixelOffsetMode(PixelOffsetMode pixelOffsetMode)
   1463 	{
   1464 		return updateStatus(DllExports::GdipSetPixelOffsetMode(
   1465 				nativeGraphics, pixelOffsetMode));
   1466 	}
   1467 	Status SetRenderingOrigin(INT x, INT y)
   1468 	{
   1469 		return updateStatus(DllExports::GdipSetRenderingOrigin(
   1470 				nativeGraphics, x, y));
   1471 	}
   1472 	Status SetSmoothingMode(SmoothingMode smoothingMode)
   1473 	{
   1474 		return updateStatus(DllExports::GdipSetSmoothingMode(
   1475 				nativeGraphics, smoothingMode));
   1476 	}
   1477 	Status SetTextContrast(UINT contrast)
   1478 	{
   1479 		return updateStatus(DllExports::GdipSetTextContrast(
   1480 				nativeGraphics, contrast));
   1481 	}
   1482 	Status SetTextRenderingHint(TextRenderingHint textRenderingHint)
   1483 	{
   1484 		return updateStatus(DllExports::GdipSetTextRenderingHint(
   1485 				nativeGraphics, textRenderingHint));
   1486 	}
   1487 	Status SetTransform(const Matrix *matrix)
   1488 	{
   1489 		return updateStatus(DllExports::GdipSetWorldTransform(
   1490 				nativeGraphics,
   1491 				matrix ? matrix->nativeMatrix : NULL));
   1492 	}
   1493 	Status TransformPoints(CoordinateSpace destSpace,
   1494 			CoordinateSpace srcSpace,
   1495 			PointF *pts, INT count) const
   1496 	{
   1497 		return updateStatus(DllExports::GdipTransformPoints(
   1498 				nativeGraphics, destSpace, srcSpace,
   1499 				pts, count));
   1500 	}
   1501 	Status TransformPoints(CoordinateSpace destSpace,
   1502 			CoordinateSpace srcSpace,
   1503 			Point *pts, INT count) const
   1504 	{
   1505 		return updateStatus(DllExports::GdipTransformPointsI(
   1506 				nativeGraphics, destSpace, srcSpace,
   1507 				pts, count));
   1508 	}
   1509 	Status TranslateClip(REAL dx, REAL dy)
   1510 	{
   1511 		return updateStatus(DllExports::GdipTranslateClip(
   1512 				nativeGraphics, dx, dy));
   1513 	}
   1514 	Status TranslateClip(INT dx, INT dy)
   1515 	{
   1516 		return updateStatus(DllExports::GdipTranslateClipI(
   1517 				nativeGraphics, dx, dy));
   1518 	}
   1519 	Status TranslateTransform(REAL dx, REAL dy,
   1520 			MatrixOrder order = MatrixOrderPrepend)
   1521 	{
   1522 		return updateStatus(DllExports::GdipTranslateWorldTransform(
   1523 				nativeGraphics, dx, dy, order));
   1524 	}
   1525 
   1526 private:
   1527 	Graphics(const Graphics&);
   1528 	Graphics& operator=(const Graphics&);
   1529 
   1530 	Status updateStatus(Status newStatus) const
   1531 	{
   1532 		if (newStatus != Ok) lastStatus = newStatus;
   1533 		return newStatus;
   1534 	}
   1535 
   1536 	GpGraphics *nativeGraphics;
   1537 	mutable Status lastStatus;
   1538 };
   1539 
   1540 #endif /* __GDIPLUS_GRAPHICS_H */
   1541