1 /**************************************************************************\ 2 * 3 * Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved. 4 * 5 * Module Name: 6 * 7 * GdiplusHeaders.h 8 * 9 * Abstract: 10 * 11 * GDI+ Native C++ public header file 12 * 13 \**************************************************************************/ 14 15 #ifndef _GDIPLUSHEADERS_H 16 #define _GDIPLUSHEADERS_H 17 18 //-------------------------------------------------------------------------- 19 // Abstract base class for regions 20 //-------------------------------------------------------------------------- 21 22 // Include the class declarations here and have inline class implementation 23 // in separate file to avoid circular references. 24 25 class Region : public GdiplusBase 26 { 27 public: 28 friend class Graphics; 29 30 Region(); 31 Region(IN const RectF& rect); 32 Region(IN const Rect& rect); 33 Region(IN const GraphicsPath* path); 34 Region(IN const BYTE* regionData, IN INT size); 35 Region(IN HRGN hRgn); 36 static Region* FromHRGN(IN HRGN hRgn); 37 38 ~Region(); 39 Region* Clone() const; 40 41 Status MakeInfinite(); 42 Status MakeEmpty(); 43 44 // Get the size of the buffer needed for the GetData method 45 UINT GetDataSize() const; 46 47 // buffer - where to put the data 48 // bufferSize - how big the buffer is (should be at least as big as GetDataSize()) 49 // sizeFilled - if not NULL, this is an OUT param that says how many bytes 50 // of data were written to the buffer. 51 Status GetData(OUT BYTE* buffer, 52 IN UINT bufferSize, 53 OUT UINT* sizeFilled = NULL) const; 54 55 Status Intersect(IN const Rect& rect); 56 Status Intersect(IN const RectF& rect); 57 Status Intersect(IN const GraphicsPath* path); 58 Status Intersect(IN const Region* region); 59 Status Union(IN const Rect& rect); 60 Status Union(IN const RectF& rect); 61 Status Union(IN const GraphicsPath* path); 62 Status Union(IN const Region* region); 63 Status Xor(IN const Rect& rect); 64 Status Xor(IN const RectF& rect); 65 Status Xor(IN const GraphicsPath* path); 66 Status Xor(IN const Region* region); 67 Status Exclude(IN const Rect& rect); 68 Status Exclude(IN const RectF& rect); 69 Status Exclude(IN const GraphicsPath* path); 70 Status Exclude(IN const Region* region); 71 Status Complement(IN const Rect& rect); 72 Status Complement(IN const RectF& rect); 73 Status Complement(IN const GraphicsPath* path); 74 Status Complement(IN const Region* region); 75 Status Translate(IN REAL dx, 76 IN REAL dy); 77 Status Translate(IN INT dx, 78 IN INT dy); 79 Status Transform(IN const Matrix* matrix); 80 81 Status GetBounds(OUT Rect* rect, 82 IN const Graphics* g) const; 83 84 Status GetBounds(OUT RectF* rect, 85 IN const Graphics* g) const; 86 87 HRGN GetHRGN (IN const Graphics * g) const; 88 89 BOOL IsEmpty(IN const Graphics *g) const; 90 BOOL IsInfinite(IN const Graphics *g) const; 91 92 BOOL IsVisible(IN INT x, 93 IN INT y, 94 IN const Graphics* g = NULL) const 95 { 96 return IsVisible(Point(x, y), g); 97 } 98 99 BOOL IsVisible(IN const Point& point, 100 IN const Graphics* g = NULL) const; 101 102 BOOL IsVisible(IN REAL x, 103 IN REAL y, 104 IN const Graphics* g = NULL) const 105 { 106 return IsVisible(PointF(x, y), g); 107 } 108 109 BOOL IsVisible(IN const PointF& point, 110 IN const Graphics* g = NULL) const; 111 112 BOOL IsVisible(IN INT x, 113 IN INT y, 114 IN INT width, 115 IN INT height, 116 IN const Graphics* g) const 117 { 118 return IsVisible(Rect(x, y, width, height), g); 119 } 120 121 BOOL IsVisible(IN const Rect& rect, 122 IN const Graphics* g = NULL) const; 123 124 BOOL IsVisible(IN REAL x, 125 IN REAL y, 126 IN REAL width, 127 IN REAL height, 128 IN const Graphics* g = NULL) const 129 { 130 return IsVisible(RectF(x, y, width, height), g); 131 } 132 133 BOOL IsVisible(IN const RectF& rect, 134 IN const Graphics* g = NULL) const; 135 136 BOOL Equals(IN const Region* region, 137 IN const Graphics* g) const; 138 139 UINT GetRegionScansCount(IN const Matrix* matrix) const; 140 Status GetRegionScans(IN const Matrix* matrix, 141 OUT RectF* rects, 142 OUT INT* count) const; 143 Status GetRegionScans(IN const Matrix* matrix, 144 OUT Rect* rects, 145 OUT INT* count) const; 146 Status GetLastStatus() const; 147 148 protected: 149 150 #ifdef DCR_USE_NEW_250932 151 152 private: 153 Region(const Region ®ion); 154 Region& operator=(const Region ®ion); 155 protected: 156 157 #else 158 Region(const Region ®ion) 159 { 160 region; // reference parameter 161 SetStatus(NotImplemented); 162 } 163 164 Region& operator=(const Region ®ion) 165 { 166 region; // reference parameter 167 SetStatus(NotImplemented); 168 return *this; 169 } 170 #endif 171 172 Status SetStatus(Status status) const 173 { 174 if (status != Ok) 175 return (lastResult = status); 176 else 177 return status; 178 } 179 180 Region(GpRegion* nativeRegion); 181 182 VOID SetNativeRegion(GpRegion* nativeRegion); 183 184 protected: 185 GpRegion* nativeRegion; 186 mutable Status lastResult; 187 }; 188 189 190 //-------------------------------------------------------------------------- 191 // Abstract base class for FontFamily 192 //-------------------------------------------------------------------------- 193 194 class FontFamily : public GdiplusBase 195 { 196 public: 197 friend class Font; 198 friend class Graphics; 199 friend class GraphicsPath; 200 friend class FontCollection; 201 202 FontFamily(); 203 204 FontFamily( 205 IN const WCHAR *name, 206 IN const FontCollection *fontCollection = NULL 207 ); 208 209 ~FontFamily(); 210 211 static const FontFamily *GenericSansSerif(); 212 static const FontFamily *GenericSerif(); 213 static const FontFamily *GenericMonospace(); 214 215 Status GetFamilyName( 216 OUT WCHAR name[LF_FACESIZE], 217 IN LANGID language = 0 218 ) const; 219 220 // Copy operator 221 FontFamily * Clone() const; 222 223 BOOL IsAvailable() const 224 { 225 return (nativeFamily != NULL); 226 }; 227 228 BOOL IsStyleAvailable(IN INT style) const; 229 230 UINT16 GetEmHeight (IN INT style) const; 231 UINT16 GetCellAscent (IN INT style) const; 232 UINT16 GetCellDescent (IN INT style) const; 233 UINT16 GetLineSpacing (IN INT style) const; 234 235 /////////////////////////////////////////////////////////// 236 237 Status GetLastStatus() const; 238 239 #ifdef DCR_USE_NEW_250932 240 241 private: 242 FontFamily(const FontFamily &); 243 FontFamily& operator=(const FontFamily &); 244 245 #endif 246 247 protected: 248 Status SetStatus(Status status) const; 249 250 // private constructor for copy 251 FontFamily(GpFontFamily * nativeFamily, Status status); 252 253 /////////////////////////////////////// 254 // Data members 255 protected: 256 257 GpFontFamily *nativeFamily; 258 mutable Status lastResult; 259 }; 260 261 static FontFamily *GenericSansSerifFontFamily = NULL; 262 static FontFamily *GenericSerifFontFamily = NULL; 263 static FontFamily *GenericMonospaceFontFamily = NULL; 264 265 static BYTE GenericSansSerifFontFamilyBuffer[sizeof(FontFamily)] = {0}; 266 static BYTE GenericSerifFontFamilyBuffer [sizeof(FontFamily)] = {0}; 267 static BYTE GenericMonospaceFontFamilyBuffer[sizeof(FontFamily)] = {0}; 268 269 270 //-------------------------------------------------------------------------- 271 // Abstract base class for fonts 272 //-------------------------------------------------------------------------- 273 274 class Font : public GdiplusBase 275 { 276 public: 277 friend class Graphics; 278 279 Font(IN HDC hdc); 280 Font(IN HDC hdc, 281 IN const LOGFONTA* logfont); 282 Font(IN HDC hdc, 283 IN const LOGFONTW* logfont); 284 #ifdef DCR_USE_NEW_127084 285 Font(IN HDC hdc, 286 IN const HFONT hfont); 287 #endif 288 Font( 289 IN const FontFamily * family, 290 IN REAL emSize, 291 IN INT style = FontStyleRegular, 292 IN Unit unit = UnitPoint 293 ); 294 295 Font( 296 IN const WCHAR * familyName, 297 IN REAL emSize, 298 IN INT style = FontStyleRegular, 299 IN Unit unit = UnitPoint, 300 IN const FontCollection * fontCollection = NULL 301 ); 302 303 Status GetLogFontA(IN const Graphics* g, 304 OUT LOGFONTA * logfontA) const; 305 Status GetLogFontW(IN const Graphics* g, 306 OUT LOGFONTW * logfontW) const; 307 308 Font* Clone() const; 309 ~Font(); 310 BOOL IsAvailable() const; 311 INT GetStyle() const; 312 REAL GetSize() const; 313 Unit GetUnit() const; 314 Status GetLastStatus() const; 315 REAL GetHeight(IN const Graphics *graphics = NULL) const; 316 #ifdef DCR_USE_NEW_125467 317 REAL GetHeight(IN REAL dpi) const; 318 #endif 319 320 Status GetFamily(OUT FontFamily *family) const; 321 322 #ifdef DCR_USE_NEW_250932 323 324 private: 325 Font(const Font &); 326 Font& operator=(const Font &); 327 328 #endif 329 330 protected: 331 Font(GpFont* font, Status status); 332 VOID SetNativeFont(GpFont *Font); 333 Status SetStatus(Status status) const; 334 335 protected: 336 /* 337 * handle to native line texture object 338 */ 339 340 GpFont* nativeFont; 341 mutable Status lastResult; 342 }; 343 344 //-------------------------------------------------------------------------- 345 // Abstract base classes for font collections 346 //-------------------------------------------------------------------------- 347 348 class FontCollection : public GdiplusBase 349 { 350 public: 351 friend class FontFamily; 352 353 FontCollection(); 354 virtual ~FontCollection(); 355 356 INT GetFamilyCount() const; // number of enumerable families in the collection 357 358 Status GetFamilies( // enumerate the fonts in a collection 359 IN INT numSought, 360 OUT FontFamily * gpfamilies, 361 OUT INT * numFound 362 ) const; 363 364 Status GetLastStatus() const; 365 366 #ifdef DCR_USE_NEW_250932 367 368 private: 369 FontCollection(const FontCollection &); 370 FontCollection& operator=(const FontCollection &); 371 372 #endif 373 374 protected: 375 Status SetStatus(Status status) const ; 376 377 GpFontCollection *nativeFontCollection; 378 mutable Status lastResult; 379 }; 380 381 382 class InstalledFontCollection : public FontCollection 383 { 384 public: 385 InstalledFontCollection(); 386 ~InstalledFontCollection(); 387 388 #ifdef DCR_USE_NEW_250932 389 390 private: 391 InstalledFontCollection(const InstalledFontCollection &); 392 InstalledFontCollection& operator=(const InstalledFontCollection &); 393 394 #endif 395 396 protected: 397 #ifndef DCR_USE_NEW_235072 398 Status InstallFontFile(IN const WCHAR* filename); 399 Status UninstallFontFile(IN const WCHAR* filename); 400 #endif 401 Status SetStatus(Status status) const ; 402 }; 403 404 405 class PrivateFontCollection : public FontCollection 406 { 407 public: 408 PrivateFontCollection(); 409 ~PrivateFontCollection(); 410 411 Status AddFontFile(IN const WCHAR* filename); 412 Status AddMemoryFont(IN const VOID* memory, 413 IN INT length); 414 415 #ifdef DCR_USE_NEW_250932 416 417 private: 418 PrivateFontCollection(const PrivateFontCollection &); 419 PrivateFontCollection& operator=(const PrivateFontCollection &); 420 421 #endif 422 }; 423 424 425 //-------------------------------------------------------------------------- 426 // Abstract base class for bitmap image and metafile 427 //-------------------------------------------------------------------------- 428 429 // !!! Note: 430 // Include the class declarations here and have the inline class 431 // implementation in a separate file. This is done to resolve a 432 // circular dependency since one of the Bitmap methods needs to 433 // access the private member nativeGraphics of the Graphics object. 434 435 class Image : public GdiplusBase 436 { 437 public: 438 friend class Brush; 439 friend class TextureBrush; 440 friend class Graphics; 441 442 #ifndef DCR_USE_NEW_140782 443 Image( 444 IN const WCHAR* filename 445 ); 446 447 Image( 448 IN IStream* stream 449 ); 450 451 static Image* FromFile( 452 IN const WCHAR* filename 453 ); 454 455 static Image* FromStream( 456 IN IStream* stream 457 ); 458 #else 459 Image( 460 IN const WCHAR* filename, 461 IN BOOL useEmbeddedColorManagement = FALSE 462 ); 463 464 Image( 465 IN IStream* stream, 466 IN BOOL useEmbeddedColorManagement = FALSE 467 ); 468 469 static Image* FromFile( 470 IN const WCHAR* filename, 471 IN BOOL useEmbeddedColorManagement = FALSE 472 ); 473 474 static Image* FromStream( 475 IN IStream* stream, 476 IN BOOL useEmbeddedColorManagement = FALSE 477 ); 478 #endif 479 480 virtual ~Image(); 481 virtual Image* Clone(); 482 483 Status Save(IN const WCHAR* filename, 484 IN const CLSID* clsidEncoder, 485 IN const EncoderParameters *encoderParams = NULL); 486 Status Save(IN IStream* stream, 487 IN const CLSID* clsidEncoder, 488 IN const EncoderParameters *encoderParams = NULL); 489 Status SaveAdd(IN const EncoderParameters* encoderParams); 490 Status SaveAdd(IN Image* newImage, 491 IN const EncoderParameters* encoderParams); 492 493 ImageType GetType() const; 494 Status GetPhysicalDimension(OUT SizeF* size); 495 Status GetBounds(OUT RectF* srcRect, 496 OUT Unit* srcUnit); 497 498 UINT GetWidth(); 499 UINT GetHeight(); 500 REAL GetHorizontalResolution(); 501 REAL GetVerticalResolution(); 502 UINT GetFlags(); 503 Status GetRawFormat(OUT GUID *format); 504 PixelFormat GetPixelFormat(); 505 506 INT GetPaletteSize(); 507 Status GetPalette(OUT ColorPalette* palette, 508 IN INT size); 509 Status SetPalette(IN const ColorPalette* palette); 510 511 Image* GetThumbnailImage(IN UINT thumbWidth, 512 IN UINT thumbHeight, 513 IN GetThumbnailImageAbort callback = NULL, 514 IN VOID* callbackData = NULL); 515 UINT GetFrameDimensionsCount(); 516 Status GetFrameDimensionsList(OUT GUID* dimensionIDs, 517 IN UINT count); 518 UINT GetFrameCount(IN const GUID* dimensionID); 519 Status SelectActiveFrame(IN const GUID* dimensionID, 520 IN UINT frameIndex); 521 Status RotateFlip(IN RotateFlipType rotateFlipType); 522 UINT GetPropertyCount(); 523 Status GetPropertyIdList(IN UINT numOfProperty, 524 OUT PROPID* list); 525 UINT GetPropertyItemSize(IN PROPID propId); 526 Status GetPropertyItem(IN PROPID propId, 527 IN UINT propSize, 528 OUT PropertyItem* buffer); 529 Status GetPropertySize(OUT UINT* totalBufferSize, 530 OUT UINT* numProperties); 531 Status GetAllPropertyItems(IN UINT totalBufferSize, 532 IN UINT numProperties, 533 OUT PropertyItem* allItems); 534 Status RemovePropertyItem(IN PROPID propId); 535 Status SetPropertyItem(IN const PropertyItem* item); 536 537 UINT GetEncoderParameterListSize(IN const CLSID* clsidEncoder); 538 Status GetEncoderParameterList(IN const CLSID* clsidEncoder, 539 IN UINT size, 540 OUT EncoderParameters* buffer); 541 542 // Support for Middle East localization (right-to-left mirroring) 543 ImageLayout GetLayout() const; 544 Status SetLayout(IN const ImageLayout layout); 545 546 Status GetLastStatus() const; 547 548 protected: 549 550 Image() {} 551 552 Image(GpImage *nativeImage, Status status); 553 554 VOID SetNativeImage(GpImage* nativeImage); 555 556 Status SetStatus(Status status) const 557 { 558 if (status != Ok) 559 return (lastResult = status); 560 else 561 return status; 562 } 563 564 GpImage* nativeImage; 565 mutable Status lastResult; 566 mutable Status loadStatus; 567 568 #ifdef DCR_USE_NEW_250932 569 570 private: 571 572 #else 573 574 protected: 575 576 #endif 577 578 // Disable copy constructor and assignment operator 579 580 Image(IN const Image& C); 581 Image& operator=(IN const Image& C); 582 }; 583 584 class Bitmap : public Image 585 { 586 public: 587 friend class Image; 588 friend class CachedBitmap; 589 590 Bitmap( 591 IN const WCHAR *filename, 592 IN BOOL useEmbeddedColorManagement = FALSE 593 ); 594 595 Bitmap( 596 IN IStream *stream, 597 IN BOOL useEmbeddedColorManagement = FALSE 598 ); 599 600 static Bitmap* FromFile( 601 IN const WCHAR *filename, 602 IN BOOL useEmbeddedColorManagement = FALSE 603 ); 604 605 static Bitmap* FromStream( 606 IN IStream *stream, 607 IN BOOL useEmbeddedColorManagement = FALSE 608 ); 609 610 Bitmap(IN INT width, 611 IN INT height, 612 IN INT stride, PixelFormat format, 613 IN BYTE* scan0); 614 Bitmap(IN INT width, 615 IN INT height, 616 IN PixelFormat format = PixelFormat32bppARGB); 617 Bitmap(IN INT width, 618 IN INT height, 619 IN Graphics* target); 620 621 Bitmap* Clone(IN const Rect& rect, 622 IN PixelFormat format); 623 Bitmap* Clone(IN INT x, 624 IN INT y, 625 IN INT width, 626 IN INT height, 627 IN PixelFormat format); 628 Bitmap* Clone(IN const RectF& rect, 629 IN PixelFormat format); 630 Bitmap* Clone(IN REAL x, 631 IN REAL y, 632 IN REAL width, 633 IN REAL height, 634 IN PixelFormat format); 635 636 Status LockBits(IN const Rect& rect, 637 IN UINT flags, 638 IN PixelFormat format, 639 OUT BitmapData* lockedBitmapData); 640 Status UnlockBits(IN BitmapData* lockedBitmapData); 641 Status GetPixel(IN INT x, 642 IN INT y, 643 OUT Color *color); 644 Status SetPixel(IN INT x, 645 IN INT y, 646 IN const Color &color); 647 Status SetResolution(IN REAL xdpi, 648 IN REAL ydpi); 649 650 // GDI interop: 651 652 Bitmap(IN IDirectDrawSurface7* surface); 653 Bitmap(IN const BITMAPINFO* gdiBitmapInfo, 654 IN VOID* gdiBitmapData); 655 Bitmap(IN HBITMAP hbm, 656 IN HPALETTE hpal); 657 Bitmap(IN HICON hicon); 658 Bitmap(IN HINSTANCE hInstance, 659 IN const WCHAR * bitmapName); 660 static Bitmap* FromDirectDrawSurface7(IN IDirectDrawSurface7* surface); 661 static Bitmap* FromBITMAPINFO(IN const BITMAPINFO* gdiBitmapInfo, 662 IN VOID* gdiBitmapData); 663 static Bitmap* FromHBITMAP(IN HBITMAP hbm, 664 IN HPALETTE hpal); 665 static Bitmap* FromHICON(IN HICON hicon); 666 static Bitmap* FromResource(IN HINSTANCE hInstance, 667 IN const WCHAR * bitmapName); 668 669 Status GetHBITMAP(IN const Color& colorBackground, 670 OUT HBITMAP *hbmReturn); 671 Status GetHICON(HICON *hicon); 672 673 #ifdef DCR_USE_NEW_250932 674 private: 675 Bitmap(const Bitmap &); 676 Bitmap& operator=(const Bitmap &); 677 #endif 678 679 protected: 680 Bitmap(GpBitmap *nativeBitmap); 681 }; 682 683 class CustomLineCap : public GdiplusBase 684 { 685 public: 686 friend class Pen; 687 688 CustomLineCap( 689 IN const GraphicsPath* fillPath, 690 IN const GraphicsPath* strokePath, 691 IN LineCap baseCap = LineCapFlat, 692 IN REAL baseInset = 0 693 ); 694 virtual ~CustomLineCap(); 695 696 CustomLineCap* Clone() const; 697 698 Status SetStrokeCap(IN LineCap strokeCap) 699 { 700 // This changes both start and and caps. 701 702 return SetStrokeCaps(strokeCap, strokeCap); 703 } 704 705 Status SetStrokeCaps(IN LineCap startCap, 706 IN LineCap endCap); 707 Status GetStrokeCaps(OUT LineCap* startCap, 708 OUT LineCap* endCap) const; 709 Status SetStrokeJoin(IN LineJoin lineJoin); 710 LineJoin GetStrokeJoin() const; 711 Status SetBaseCap(IN LineCap baseCap); 712 LineCap GetBaseCap() const; 713 Status SetBaseInset(IN REAL inset); 714 REAL GetBaseInset() const; 715 Status SetWidthScale(IN REAL widthScale); 716 REAL GetWidthScale() const; 717 718 protected: 719 CustomLineCap(); 720 721 #ifdef DCR_USE_NEW_250932 722 723 private: 724 CustomLineCap(const CustomLineCap &); 725 CustomLineCap& operator=(const CustomLineCap &); 726 protected: 727 728 #else 729 730 CustomLineCap(const CustomLineCap& customLineCap) 731 { 732 customLineCap; 733 SetStatus(NotImplemented); 734 } 735 736 CustomLineCap& operator=(const CustomLineCap& customLineCap) 737 { 738 customLineCap; 739 SetStatus(NotImplemented); 740 return *this; 741 } 742 743 #endif 744 745 CustomLineCap(GpCustomLineCap* nativeCap, Status status) 746 { 747 lastResult = status; 748 SetNativeCap(nativeCap); 749 } 750 751 VOID SetNativeCap(GpCustomLineCap* nativeCap) 752 { 753 this->nativeCap = nativeCap; 754 } 755 756 Status SetStatus(Status status) const 757 { 758 if (status != Ok) 759 return (lastResult = status); 760 else 761 return status; 762 } 763 764 protected: 765 GpCustomLineCap* nativeCap; 766 mutable Status lastResult; 767 }; 768 769 class CachedBitmap : public GdiplusBase 770 { 771 friend Graphics; 772 773 public: 774 CachedBitmap(IN Bitmap *bitmap, 775 IN Graphics *graphics); 776 virtual ~CachedBitmap(); 777 778 Status GetLastStatus() const; 779 780 #ifdef DCR_USE_NEW_250932 781 782 private: 783 CachedBitmap(const CachedBitmap &); 784 CachedBitmap& operator=(const CachedBitmap &); 785 786 #endif 787 788 protected: 789 GpCachedBitmap *nativeCachedBitmap; 790 mutable Status lastResult; 791 }; 792 793 #endif // !_GDIPLUSHEADERS.HPP 794