1 /* 2 * GdiPlusPath.h 3 * 4 * Windows GDI+ 5 * 6 * This file is part of the w32api package. 7 * 8 * THIS SOFTWARE IS NOT COPYRIGHTED 9 * 10 * This source code is offered for use in the public domain. You may 11 * use, modify or distribute it freely. 12 * 13 * This code is distributed in the hope that it will be useful but 14 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY 15 * DISCLAIMED. This includes but is not limited to warranties of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 */ 18 19 #ifndef _GDIPLUSPATH_H 20 #define _GDIPLUSPATH_H 21 22 class GraphicsPath : public GdiplusBase 23 { 24 friend class Region; 25 friend class CustomLineCap; 26 friend class Graphics; 27 28 public: 29 GraphicsPath(const Point *points, const BYTE *types, INT count, FillMode fillMode) : nativePath(NULL) 30 { 31 lastStatus = DllExports::GdipCreatePath2I(points, types, count, fillMode, &nativePath); 32 } 33 34 GraphicsPath(FillMode fillMode = FillModeAlternate) : nativePath(NULL) 35 { 36 lastStatus = DllExports::GdipCreatePath(fillMode, &nativePath); 37 } 38 39 GraphicsPath(const PointF *points, const BYTE *types, INT count, FillMode fillMode = FillModeAlternate) 40 : nativePath(NULL) 41 { 42 lastStatus = DllExports::GdipCreatePath2(points, types, count, fillMode, &nativePath); 43 } 44 45 ~GraphicsPath() 46 { 47 DllExports::GdipDeletePath(nativePath); 48 } 49 50 Status 51 AddArc(const Rect &rect, REAL startAngle, REAL sweepAngle) 52 { 53 return AddArc(rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle); 54 } 55 56 Status 57 AddArc(const RectF &rect, REAL startAngle, REAL sweepAngle) 58 { 59 return AddArc(rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle); 60 } 61 62 Status 63 AddArc(INT x, INT y, INT width, INT height, REAL startAngle, REAL sweepAngle) 64 { 65 return SetStatus(DllExports::GdipAddPathArcI(nativePath, x, y, width, height, startAngle, sweepAngle)); 66 } 67 68 Status 69 AddArc(REAL x, REAL y, REAL width, REAL height, REAL startAngle, REAL sweepAngle) 70 { 71 return SetStatus(DllExports::GdipAddPathArc(nativePath, x, y, width, height, startAngle, sweepAngle)); 72 } 73 74 Status 75 AddBezier(const Point &pt1, const Point &pt2, const Point &pt3, const Point &pt4) 76 { 77 return AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, pt4.Y); 78 } 79 80 Status 81 AddBezier(REAL x1, REAL y1, REAL x2, REAL y2, REAL x3, REAL y3, REAL x4, REAL y4) 82 { 83 return SetStatus(DllExports::GdipAddPathBezier(nativePath, x1, y1, x2, y2, x3, y3, x4, y4)); 84 } 85 86 Status 87 AddBezier(const PointF &pt1, const PointF &pt2, const PointF &pt3, const PointF &pt4) 88 { 89 return AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, pt4.Y); 90 } 91 92 Status 93 AddBezier(INT x1, INT y1, INT x2, INT y2, INT x3, INT y3, INT x4, INT y4) 94 { 95 return SetStatus(DllExports::GdipAddPathBezierI(nativePath, x1, y1, x2, y2, x3, y3, x4, y4)); 96 } 97 98 Status 99 AddBeziers(const Point *points, INT count) 100 { 101 return SetStatus(DllExports::GdipAddPathBeziersI(nativePath, points, count)); 102 } 103 104 Status 105 AddBeziers(const PointF *points, INT count) 106 { 107 return SetStatus(DllExports::GdipAddPathBeziers(nativePath, points, count)); 108 } 109 110 Status 111 AddClosedCurve(const Point *points, INT count) 112 { 113 return SetStatus(DllExports::GdipAddPathClosedCurveI(nativePath, points, count)); 114 } 115 116 Status 117 AddClosedCurve(const Point *points, INT count, REAL tension) 118 { 119 return SetStatus(DllExports::GdipAddPathClosedCurve2I(nativePath, points, count, tension)); 120 } 121 122 Status 123 AddClosedCurve(const PointF *points, INT count, REAL tension) 124 { 125 return SetStatus(DllExports::GdipAddPathClosedCurve2(nativePath, points, count, tension)); 126 } 127 128 Status 129 AddClosedCurve(const PointF *points, INT count) 130 { 131 return SetStatus(DllExports::GdipAddPathClosedCurve(nativePath, points, count)); 132 } 133 134 Status 135 AddCurve(const Point *points, INT count) 136 { 137 return SetStatus(DllExports::GdipAddPathCurveI(nativePath, points, count)); 138 } 139 140 Status 141 AddCurve(const PointF *points, INT count, REAL tension) 142 { 143 return SetStatus(DllExports::GdipAddPathCurve2(nativePath, points, count, tension)); 144 } 145 146 Status 147 AddCurve(const PointF *points, INT count) 148 { 149 return SetStatus(DllExports::GdipAddPathCurve(nativePath, points, count)); 150 } 151 152 Status 153 AddCurve(const Point *points, INT count, INT offset, INT numberOfSegments, REAL tension) 154 { 155 return SetStatus(DllExports::GdipAddPathCurve3I(nativePath, points, count, offset, numberOfSegments, tension)); 156 } 157 158 Status 159 AddCurve(const Point *points, INT count, REAL tension) 160 { 161 return SetStatus(DllExports::GdipAddPathCurve2I(nativePath, points, count, tension)); 162 } 163 164 Status 165 AddCurve(const PointF *points, INT count, INT offset, INT numberOfSegments, REAL tension) 166 { 167 return SetStatus(DllExports::GdipAddPathCurve3(nativePath, points, count, offset, numberOfSegments, tension)); 168 } 169 170 Status 171 AddEllipse(const Rect &rect) 172 { 173 return AddEllipse(rect.X, rect.Y, rect.Width, rect.Height); 174 } 175 176 Status 177 AddEllipse(const RectF &rect) 178 { 179 return AddEllipse(rect.X, rect.Y, rect.Width, rect.Height); 180 } 181 182 Status 183 AddEllipse(INT x, INT y, INT width, INT height) 184 { 185 return SetStatus(DllExports::GdipAddPathEllipseI(nativePath, x, y, width, height)); 186 } 187 188 Status 189 AddEllipse(REAL x, REAL y, REAL width, REAL height) 190 { 191 return SetStatus(DllExports::GdipAddPathEllipse(nativePath, x, y, width, height)); 192 } 193 194 Status 195 AddLine(const Point &pt1, const Point &pt2) 196 { 197 return AddLine(pt1.X, pt1.Y, pt2.X, pt2.Y); 198 } 199 200 Status 201 AddLine(const PointF &pt1, const PointF &pt2) 202 { 203 return AddLine(pt1.X, pt1.Y, pt2.X, pt2.Y); 204 } 205 206 Status 207 AddLine(REAL x1, REAL y1, REAL x2, REAL y2) 208 { 209 return SetStatus(DllExports::GdipAddPathLine(nativePath, x1, y1, x2, y2)); 210 } 211 212 Status 213 AddLine(INT x1, INT y1, INT x2, INT y2) 214 { 215 return SetStatus(DllExports::GdipAddPathLineI(nativePath, x1, y1, x2, y2)); 216 } 217 218 Status 219 AddLines(const Point *points, INT count) 220 { 221 return SetStatus(DllExports::GdipAddPathLine2I(nativePath, points, count)); 222 } 223 224 Status 225 AddLines(const PointF *points, INT count) 226 { 227 return SetStatus(DllExports::GdipAddPathLine2(nativePath, points, count)); 228 } 229 230 Status 231 AddPath(const GraphicsPath *addingPath, BOOL connect) 232 { 233 GpPath *nativePath2 = addingPath ? getNat(addingPath) : NULL; 234 return SetStatus(DllExports::GdipAddPathPath(nativePath, nativePath2, connect)); 235 } 236 237 Status 238 AddPie(const Rect &rect, REAL startAngle, REAL sweepAngle) 239 { 240 return AddPie(rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle); 241 } 242 243 Status 244 AddPie(INT x, INT y, INT width, INT height, REAL startAngle, REAL sweepAngle) 245 { 246 return SetStatus(DllExports::GdipAddPathPieI(nativePath, x, y, width, height, startAngle, sweepAngle)); 247 } 248 249 Status 250 AddPie(REAL x, REAL y, REAL width, REAL height, REAL startAngle, REAL sweepAngle) 251 { 252 return SetStatus(DllExports::GdipAddPathPie(nativePath, x, y, width, height, startAngle, sweepAngle)); 253 } 254 255 Status 256 AddPie(const RectF &rect, REAL startAngle, REAL sweepAngle) 257 { 258 return AddPie(rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle); 259 } 260 261 Status 262 AddPolygon(const Point *points, INT count) 263 { 264 return SetStatus(DllExports::GdipAddPathPolygonI(nativePath, points, count)); 265 } 266 267 Status 268 AddPolygon(const PointF *points, INT count) 269 { 270 return SetStatus(DllExports::GdipAddPathPolygon(nativePath, points, count)); 271 } 272 273 Status 274 AddRectangle(const Rect &rect) 275 { 276 return SetStatus(DllExports::GdipAddPathRectangleI(nativePath, rect.X, rect.Y, rect.Width, rect.Height)); 277 } 278 279 Status 280 AddRectangle(const RectF &rect) 281 { 282 return SetStatus(DllExports::GdipAddPathRectangle(nativePath, rect.X, rect.Y, rect.Width, rect.Height)); 283 } 284 285 Status 286 AddRectangles(const Rect *rects, INT count) 287 { 288 return SetStatus(DllExports::GdipAddPathRectanglesI(nativePath, rects, count)); 289 } 290 291 Status 292 AddRectangles(const RectF *rects, INT count) 293 { 294 return SetStatus(DllExports::GdipAddPathRectangles(nativePath, rects, count)); 295 } 296 297 Status 298 AddString( 299 const WCHAR *string, 300 INT length, 301 const FontFamily *family, 302 INT style, 303 REAL emSize, 304 const Rect &layoutRect, 305 const StringFormat *format) 306 { 307 return SetStatus(DllExports::GdipAddPathStringI( 308 nativePath, string, length, family ? getNat(family) : NULL, style, emSize, &layoutRect, 309 format ? getNat(format) : NULL)); 310 } 311 312 Status 313 AddString( 314 const WCHAR *string, 315 INT length, 316 const FontFamily *family, 317 INT style, 318 REAL emSize, 319 const PointF &origin, 320 const StringFormat *format) 321 { 322 RectF rect(origin.X, origin.Y, 0.0f, 0.0f); 323 return SetStatus(DllExports::GdipAddPathString( 324 nativePath, string, length, family ? getNat(family) : NULL, style, emSize, &rect, 325 format ? getNat(format) : NULL)); 326 } 327 328 Status 329 AddString( 330 const WCHAR *string, 331 INT length, 332 const FontFamily *family, 333 INT style, 334 REAL emSize, 335 const Point &origin, 336 const StringFormat *format) 337 { 338 Rect rect(origin.X, origin.Y, 0, 0); 339 return SetStatus(DllExports::GdipAddPathStringI( 340 nativePath, string, length, family ? getNat(family) : NULL, style, emSize, &rect, 341 format ? getNat(format) : NULL)); 342 } 343 344 Status 345 AddString( 346 const WCHAR *string, 347 INT length, 348 const FontFamily *family, 349 INT style, 350 REAL emSize, 351 const RectF &layoutRect, 352 const StringFormat *format) 353 { 354 return SetStatus(DllExports::GdipAddPathString( 355 nativePath, string, length, family ? getNat(family) : NULL, style, emSize, &layoutRect, 356 format ? getNat(format) : NULL)); 357 } 358 359 Status 360 ClearMarkers() 361 { 362 return SetStatus(DllExports::GdipClearPathMarkers(nativePath)); 363 } 364 365 GraphicsPath * 366 Clone() 367 { 368 GpPath *clonepath = NULL; 369 SetStatus(DllExports::GdipClonePath(nativePath, &clonepath)); 370 if (lastStatus != Ok) 371 return NULL; 372 return new GraphicsPath(clonepath); 373 } 374 375 Status 376 CloseAllFigures() 377 { 378 return SetStatus(DllExports::GdipClosePathFigures(nativePath)); 379 } 380 381 Status 382 CloseFigure() 383 { 384 return SetStatus(DllExports::GdipClosePathFigure(nativePath)); 385 } 386 387 Status 388 Flatten(const Matrix *matrix, REAL flatness) 389 { 390 GpMatrix *nativeMatrix = matrix ? getNat(matrix) : NULL; 391 return SetStatus(DllExports::GdipFlattenPath(nativePath, nativeMatrix, flatness)); 392 } 393 394 Status 395 GetBounds(Rect *bounds, const Matrix *matrix, const Pen *pen) 396 { 397 return SetStatus(NotImplemented); 398 } 399 400 Status 401 GetBounds(RectF *bounds, const Matrix *matrix, const Pen *pen) 402 { 403 return SetStatus(NotImplemented); 404 } 405 406 FillMode 407 GetFillMode() 408 { 409 FillMode fillmode = FillModeAlternate; 410 SetStatus(DllExports::GdipGetPathFillMode(nativePath, &fillmode)); 411 return fillmode; 412 } 413 414 Status 415 GetLastPoint(PointF *lastPoint) const 416 { 417 return SetStatus(DllExports::GdipGetPathLastPoint(nativePath, lastPoint)); 418 } 419 420 Status 421 GetLastStatus() const 422 { 423 return lastStatus; 424 } 425 426 Status 427 GetPathData(PathData *pathData) 428 { 429 return NotImplemented; 430 } 431 432 Status 433 GetPathPoints(Point *points, INT count) const 434 { 435 return SetStatus(DllExports::GdipGetPathPointsI(nativePath, points, count)); 436 } 437 438 Status 439 GetPathPoints(PointF *points, INT count) const 440 { 441 return SetStatus(DllExports::GdipGetPathPoints(nativePath, points, count)); 442 } 443 444 Status 445 GetPathTypes(BYTE *types, INT count) const 446 { 447 return SetStatus(DllExports::GdipGetPathTypes(nativePath, types, count)); 448 } 449 450 INT 451 GetPointCount() const 452 { 453 INT count = 0; 454 SetStatus(DllExports::GdipGetPointCount(nativePath, &count)); 455 return count; 456 } 457 458 BOOL 459 IsOutlineVisible(const Point &point, const Pen *pen, const Graphics *g) const 460 { 461 return IsOutlineVisible(point.X, point.Y, pen, g); 462 } 463 464 BOOL 465 IsOutlineVisible(REAL x, REAL y, const Pen *pen, const Graphics *g) const 466 { 467 GpGraphics *nativeGraphics = g ? getNat(g) : NULL; 468 GpPen *nativePen = pen ? getNat(pen) : NULL; 469 BOOL flag = FALSE; 470 SetStatus(DllExports::GdipIsOutlineVisiblePathPoint(nativePath, x, y, nativePen, nativeGraphics, &flag)); 471 return flag; 472 } 473 474 BOOL 475 IsOutlineVisible(INT x, INT y, const Pen *pen, const Graphics *g) const 476 { 477 GpGraphics *nativeGraphics = g ? getNat(g) : NULL; 478 GpPen *nativePen = pen ? getNat(pen) : NULL; 479 BOOL flag = FALSE; 480 SetStatus(DllExports::GdipIsOutlineVisiblePathPointI(nativePath, x, y, nativePen, nativeGraphics, &flag)); 481 return flag; 482 } 483 484 BOOL 485 IsOutlineVisible(const PointF &point, const Pen *pen, const Graphics *g) const 486 { 487 return IsOutlineVisible(point.X, point.Y, pen, g); 488 } 489 490 BOOL 491 IsVisible(REAL x, REAL y, const Graphics *g) const 492 { 493 GpGraphics *nativeGraphics = g ? getNat(g) : NULL; 494 BOOL flag = FALSE; 495 SetStatus(DllExports::GdipIsVisiblePathPoint(nativePath, x, y, nativeGraphics, &flag)); 496 return flag; 497 } 498 499 BOOL 500 IsVisible(const PointF &point, const Graphics *g) const 501 { 502 return IsVisible(point.X, point.Y, g); 503 } 504 505 BOOL 506 IsVisible(INT x, INT y, const Graphics *g) const 507 { 508 GpGraphics *nativeGraphics = g ? getNat(g) : NULL; 509 BOOL flag = FALSE; 510 SetStatus(DllExports::GdipIsVisiblePathPointI(nativePath, x, y, nativeGraphics, &flag)); 511 return flag; 512 } 513 514 BOOL 515 IsVisible(const Point &point, const Graphics *g) const 516 { 517 return IsVisible(point.X, point.Y, g); 518 } 519 520 Status 521 Outline(const Matrix *matrix, REAL flatness) 522 { 523 GpMatrix *nativeMatrix = matrix ? getNat(matrix) : NULL; 524 return SetStatus(DllExports::GdipWindingModeOutline(nativePath, nativeMatrix, flatness)); 525 } 526 527 Status 528 Reset() 529 { 530 return SetStatus(DllExports::GdipResetPath(nativePath)); 531 } 532 533 Status 534 Reverse() 535 { 536 return SetStatus(DllExports::GdipReversePath(nativePath)); 537 } 538 539 Status 540 SetFillMode(FillMode fillmode) 541 { 542 return SetStatus(DllExports::GdipSetPathFillMode(nativePath, fillmode)); 543 } 544 545 Status 546 SetMarker() 547 { 548 return SetStatus(DllExports::GdipSetPathMarker(nativePath)); 549 } 550 551 Status 552 StartFigure() 553 { 554 return SetStatus(DllExports::GdipStartPathFigure(nativePath)); 555 } 556 557 Status 558 Transform(const Matrix *matrix) 559 { 560 if (!matrix) 561 return Ok; 562 return SetStatus(DllExports::GdipTransformPath(nativePath, matrix->nativeMatrix)); 563 } 564 565 Status 566 Warp( 567 const PointF *destPoints, 568 INT count, 569 const RectF &srcRect, 570 const Matrix *matrix, 571 WarpMode warpMode, 572 REAL flatness) 573 { 574 GpMatrix *nativeMatrix = matrix ? getNat(matrix) : NULL; 575 return SetStatus(DllExports::GdipWarpPath( 576 nativePath, nativeMatrix, destPoints, count, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, warpMode, 577 flatness)); 578 } 579 580 Status 581 Widen(const Pen *pen, const Matrix *matrix, REAL flatness) 582 { 583 return SetStatus(NotImplemented); 584 } 585 586 protected: 587 GpPath *nativePath; 588 mutable Status lastStatus; 589 590 GraphicsPath() 591 { 592 } 593 594 GraphicsPath(GpPath *path) : nativePath(path), lastStatus(Ok) 595 { 596 } 597 598 Status 599 SetStatus(Status status) const 600 { 601 if (status != Ok) 602 lastStatus = status; 603 return status; 604 } 605 606 void 607 SetNativePath(GpPath *path) 608 { 609 nativePath = path; 610 } 611 612 private: 613 // GraphicsPath is not copyable 614 GraphicsPath(const GraphicsPath &); 615 GraphicsPath & 616 operator=(const GraphicsPath &); 617 618 // get native 619 friend inline GpPath *& 620 getNat(const GraphicsPath *path) 621 { 622 return const_cast<GraphicsPath *>(path)->nativePath; 623 } 624 }; 625 626 class GraphicsPathIterator : public GdiplusBase 627 { 628 public: 629 GraphicsPathIterator(GraphicsPath *path) 630 { 631 GpPathIterator *it = NULL; 632 GpPath *nativePath = path ? getNat(path) : NULL; 633 lastStatus = DllExports::GdipCreatePathIter(&it, nativePath); 634 nativeIterator = it; 635 } 636 637 ~GraphicsPathIterator() 638 { 639 DllExports::GdipDeletePathIter(nativeIterator); 640 } 641 642 INT 643 CopyData(PointF *points, BYTE *types, INT startIndex, INT endIndex) 644 { 645 INT resultCount; 646 SetStatus(DllExports::GdipPathIterCopyData(nativeIterator, &resultCount, points, types, startIndex, endIndex)); 647 return resultCount; 648 } 649 650 INT 651 Enumerate(PointF *points, BYTE *types, INT count) 652 { 653 INT resultCount; 654 SetStatus(DllExports::GdipPathIterEnumerate(nativeIterator, &resultCount, points, types, count)); 655 return resultCount; 656 } 657 658 INT 659 GetCount() const 660 { 661 INT resultCount; 662 SetStatus(DllExports::GdipPathIterGetCount(nativeIterator, &resultCount)); 663 return resultCount; 664 } 665 666 Status 667 GetLastStatus() const 668 { 669 return lastStatus; 670 } 671 672 INT 673 GetSubpathCount() const 674 { 675 INT resultCount; 676 SetStatus(DllExports::GdipPathIterGetSubpathCount(nativeIterator, &resultCount)); 677 return resultCount; 678 } 679 680 BOOL 681 HasCurve() const 682 { 683 BOOL hasCurve; 684 SetStatus(DllExports::GdipPathIterHasCurve(nativeIterator, &hasCurve)); 685 return hasCurve; 686 } 687 688 INT 689 NextMarker(GraphicsPath *path) 690 { 691 INT resultCount; 692 GpPath *nativePath = path ? getNat(path) : NULL; 693 SetStatus(DllExports::GdipPathIterNextMarkerPath(nativeIterator, &resultCount, nativePath)); 694 return resultCount; 695 } 696 697 INT 698 NextMarker(INT *startIndex, INT *endIndex) 699 { 700 INT resultCount; 701 SetStatus(DllExports::GdipPathIterNextMarker(nativeIterator, &resultCount, startIndex, endIndex)); 702 return resultCount; 703 } 704 705 INT 706 NextPathType(BYTE *pathType, INT *startIndex, INT *endIndex) 707 { 708 INT resultCount; 709 SetStatus(DllExports::GdipPathIterNextPathType(nativeIterator, &resultCount, pathType, startIndex, endIndex)); 710 return resultCount; 711 } 712 713 INT 714 NextSubpath(GraphicsPath *path, BOOL *isClosed) 715 { 716 GpPath *nativePath = path ? getNat(path) : NULL; 717 INT resultCount; 718 SetStatus(DllExports::GdipPathIterNextSubpathPath(nativeIterator, &resultCount, nativePath, isClosed)); 719 return resultCount; 720 } 721 722 INT 723 NextSubpath(INT *startIndex, INT *endIndex, BOOL *isClosed) 724 { 725 INT resultCount; 726 SetStatus(DllExports::GdipPathIterNextSubpath(nativeIterator, &resultCount, startIndex, endIndex, isClosed)); 727 return resultCount; 728 } 729 730 VOID 731 Rewind() 732 { 733 SetStatus(DllExports::GdipPathIterRewind(nativeIterator)); 734 } 735 736 protected: 737 GpPathIterator *nativeIterator; 738 mutable Status lastStatus; 739 740 Status 741 SetStatus(Status status) const 742 { 743 if (status != Ok) 744 lastStatus = status; 745 return status; 746 } 747 }; 748 749 class PathGradientBrush : public Brush 750 { 751 public: 752 friend class Pen; 753 754 PathGradientBrush(const Point *points, INT count, WrapMode wrapMode = WrapModeClamp) 755 { 756 GpPathGradient *brush = NULL; 757 lastStatus = DllExports::GdipCreatePathGradientI(points, count, wrapMode, &brush); 758 SetNativeBrush(brush); 759 } 760 761 PathGradientBrush(const PointF *points, INT count, WrapMode wrapMode = WrapModeClamp) 762 { 763 GpPathGradient *brush = NULL; 764 lastStatus = DllExports::GdipCreatePathGradient(points, count, wrapMode, &brush); 765 SetNativeBrush(brush); 766 } 767 768 PathGradientBrush(const GraphicsPath *path) 769 { 770 GpPathGradient *brush = NULL; 771 lastStatus = DllExports::GdipCreatePathGradientFromPath(getNat(path), &brush); 772 SetNativeBrush(brush); 773 } 774 775 INT 776 GetBlendCount() const 777 { 778 INT count = 0; 779 SetStatus(DllExports::GdipGetPathGradientBlendCount(GetNativeGradient(), &count)); 780 return count; 781 } 782 783 Status 784 GetBlend(REAL *blendFactors, REAL *blendPositions, INT count) const 785 { 786 return SetStatus( 787 DllExports::GdipGetPathGradientBlend(GetNativeGradient(), blendFactors, blendPositions, count)); 788 } 789 790 Status 791 GetCenterColor(Color *color) const 792 { 793 if (color != NULL) 794 return SetStatus(InvalidParameter); 795 796 ARGB argb; 797 SetStatus(DllExports::GdipGetPathGradientCenterColor(GetNativeGradient(), &argb)); 798 color->SetValue(argb); 799 return GetLastStatus(); 800 } 801 802 Status 803 GetCenterPoint(Point *point) const 804 { 805 return SetStatus(DllExports::GdipGetPathGradientCenterPointI(GetNativeGradient(), point)); 806 } 807 808 Status 809 GetCenterPoint(PointF *point) const 810 { 811 return SetStatus(DllExports::GdipGetPathGradientCenterPoint(GetNativeGradient(), point)); 812 } 813 814 Status 815 GetFocusScales(REAL *xScale, REAL *yScale) const 816 { 817 return SetStatus(DllExports::GdipGetPathGradientFocusScales(GetNativeGradient(), xScale, yScale)); 818 } 819 820 BOOL 821 GetGammaCorrection() const 822 { 823 BOOL useGammaCorrection; 824 SetStatus(DllExports::GdipGetPathGradientGammaCorrection(GetNativeGradient(), &useGammaCorrection)); 825 return useGammaCorrection; 826 } 827 828 Status 829 GetGraphicsPath(GraphicsPath *path) const 830 { 831 if (!path) 832 return SetStatus(InvalidParameter); 833 834 return SetStatus(DllExports::GdipGetPathGradientPath(GetNativeGradient(), getNat(path))); 835 } 836 837 INT 838 GetInterpolationColorCount() const 839 { 840 INT count = 0; 841 SetStatus(DllExports::GdipGetPathGradientPresetBlendCount(GetNativeGradient(), &count)); 842 return count; 843 } 844 845 Status 846 GetInterpolationColors(Color *presetColors, REAL *blendPositions, INT count) const 847 { 848 return NotImplemented; 849 } 850 851 INT 852 GetPointCount() const 853 { 854 INT count; 855 SetStatus(DllExports::GdipGetPathGradientPointCount(GetNativeGradient(), &count)); 856 return count; 857 } 858 859 Status 860 GetRectangle(RectF *rect) const 861 { 862 return SetStatus(DllExports::GdipGetPathGradientRect(GetNativeGradient(), rect)); 863 } 864 865 Status 866 GetRectangle(Rect *rect) const 867 { 868 return SetStatus(DllExports::GdipGetPathGradientRectI(GetNativeGradient(), rect)); 869 } 870 871 INT 872 GetSurroundColorCount() const 873 { 874 INT count; 875 SetStatus(DllExports::GdipGetPathGradientSurroundColorCount(GetNativeGradient(), &count)); 876 return count; 877 } 878 879 Status 880 GetSurroundColors(Color *colors, INT *count) const 881 { 882 return NotImplemented; 883 } 884 885 Status 886 GetTransform(Matrix *matrix) const 887 { 888 return SetStatus(DllExports::GdipGetPathGradientTransform(GetNativeGradient(), getNat(matrix))); 889 } 890 891 WrapMode 892 GetWrapMode() const 893 { 894 WrapMode wrapMode; 895 SetStatus(DllExports::GdipGetPathGradientWrapMode(GetNativeGradient(), &wrapMode)); 896 return wrapMode; 897 } 898 899 Status 900 MultiplyTransform(Matrix *matrix, MatrixOrder order = MatrixOrderPrepend) 901 { 902 return SetStatus(DllExports::GdipMultiplyPathGradientTransform(GetNativeGradient(), getNat(matrix), order)); 903 } 904 905 Status 906 ResetTransform() 907 { 908 return SetStatus(DllExports::GdipResetPathGradientTransform(GetNativeGradient())); 909 } 910 911 Status 912 RotateTransform(REAL angle, MatrixOrder order = MatrixOrderPrepend) 913 { 914 return SetStatus(DllExports::GdipRotatePathGradientTransform(GetNativeGradient(), angle, order)); 915 } 916 917 Status 918 ScaleTransform(REAL sx, REAL sy, MatrixOrder order = MatrixOrderPrepend) 919 { 920 return SetStatus(DllExports::GdipScalePathGradientTransform(GetNativeGradient(), sx, sy, order)); 921 } 922 923 Status 924 SetBlend(REAL *blendFactors, REAL *blendPositions, INT count) 925 { 926 return SetStatus( 927 DllExports::GdipSetPathGradientBlend(GetNativeGradient(), blendFactors, blendPositions, count)); 928 } 929 930 Status 931 SetBlendBellShape(REAL focus, REAL scale) 932 { 933 return SetStatus(DllExports::GdipSetPathGradientSigmaBlend(GetNativeGradient(), focus, scale)); 934 } 935 936 Status 937 SetBlendTriangularShape(REAL focus, REAL scale = 1.0f) 938 { 939 return SetStatus(DllExports::GdipSetPathGradientLinearBlend(GetNativeGradient(), focus, scale)); 940 } 941 942 Status 943 SetCenterColor(const Color &color) 944 { 945 return SetStatus(DllExports::GdipSetPathGradientCenterColor(GetNativeGradient(), color.GetValue())); 946 } 947 948 Status 949 SetCenterPoint(const Point &point) 950 { 951 return SetStatus(DllExports::GdipSetPathGradientCenterPointI(GetNativeGradient(), const_cast<Point *>(&point))); 952 } 953 954 Status 955 SetCenterPoint(const PointF &point) 956 { 957 return SetStatus(DllExports::GdipSetPathGradientCenterPoint(GetNativeGradient(), const_cast<PointF *>(&point))); 958 } 959 960 Status 961 SetFocusScales(REAL xScale, REAL yScale) 962 { 963 return SetStatus(DllExports::GdipSetPathGradientFocusScales(GetNativeGradient(), xScale, yScale)); 964 } 965 966 Status 967 SetGammaCorrection(BOOL useGammaCorrection) 968 { 969 return SetStatus(DllExports::GdipSetPathGradientGammaCorrection(GetNativeGradient(), useGammaCorrection)); 970 } 971 972 Status 973 SetGraphicsPath(const GraphicsPath *path) 974 { 975 if (!path) 976 return SetStatus(InvalidParameter); 977 return SetStatus(DllExports::GdipSetPathGradientPath(GetNativeGradient(), getNat(path))); 978 } 979 980 Status 981 SetInterpolationColors(const Color *presetColors, REAL *blendPositions, INT count) 982 { 983 return NotImplemented; 984 } 985 986 Status 987 SetSurroundColors(const Color *colors, INT *count) 988 { 989 return NotImplemented; 990 } 991 992 Status 993 SetTransform(const Matrix *matrix) 994 { 995 return SetStatus(DllExports::GdipSetPathGradientTransform(GetNativeGradient(), getNat(matrix))); 996 } 997 998 Status 999 SetWrapMode(WrapMode wrapMode) 1000 { 1001 return SetStatus(DllExports::GdipSetPathGradientWrapMode(GetNativeGradient(), wrapMode)); 1002 } 1003 1004 Status 1005 TranslateTransform(REAL dx, REAL dy, MatrixOrder order = MatrixOrderPrepend) 1006 { 1007 return SetStatus(DllExports::GdipTranslatePathGradientTransform(GetNativeGradient(), dx, dy, order)); 1008 } 1009 1010 protected: 1011 GpPathGradient * 1012 GetNativeGradient() const 1013 { 1014 return static_cast<GpPathGradient *>(nativeBrush); 1015 } 1016 1017 PathGradientBrush() 1018 { 1019 } 1020 }; 1021 1022 #endif /* _GDIPLUSPATH_H */ 1023