master
   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@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
  33class 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
  42public:
  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
1526private:
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 */