• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**************************************************************************\
2 *
3 * Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.
4 *
5 * Module Name:
6 *
7 *   GdiplusBitmap.h
8 *
9 * Abstract:
10 *
11 *   Bitmap related declarations
12 *
13 \**************************************************************************/
14 
15 #ifndef _GDIPLUSBITMAP_H
16 #define _GDIPLUSBITMAP_H
17 
18 // NOTE:
19 //  Our current choice for the public API is to use constructors
20 //  instead of static load functions to create image objects.
21 //
22 //  I've kept the static load functions here for now so that
23 //  existing test programs are not broken. But they should
24 //  eventually be taken out.
25 
26 #ifndef DCR_USE_NEW_140782
27 
28 inline
Image(IN const WCHAR * filename)29 Image::Image(
30     IN const WCHAR* filename
31     )
32 {
33     nativeImage = NULL;
34     lastResult = DllExports::GdipLoadImageFromFile(filename, &nativeImage);
35 }
36 
37 inline
Image(IN IStream * stream)38 Image::Image(
39     IN IStream* stream
40     )
41 {
42     nativeImage = NULL;
43     lastResult = DllExports::GdipLoadImageFromStream(stream, &nativeImage);
44 }
45 
46 inline Image*
FromFile(IN const WCHAR * filename)47 Image::FromFile(
48     IN const WCHAR* filename
49     )
50 {
51     return new Image(filename);
52 }
53 
54 inline Image*
FromStream(IN IStream * stream)55 Image::FromStream(
56     IN IStream* stream
57     )
58 {
59     return new Image(stream);
60 }
61 
62 #else
63 
64 inline
Image(IN const WCHAR * filename,IN BOOL useEmbeddedColorManagement)65 Image::Image(
66     IN const WCHAR* filename,
67     IN BOOL useEmbeddedColorManagement
68     )
69 {
70     nativeImage = NULL;
71     if(useEmbeddedColorManagement)
72     {
73         lastResult = DllExports::GdipLoadImageFromFileICM(
74             filename,
75             &nativeImage
76         );
77     }
78     else
79     {
80         lastResult = DllExports::GdipLoadImageFromFile(
81             filename,
82             &nativeImage
83         );
84     }
85 }
86 
87 inline
Image(IN IStream * stream,IN BOOL useEmbeddedColorManagement)88 Image::Image(
89     IN IStream* stream,
90     IN BOOL useEmbeddedColorManagement
91     )
92 {
93     nativeImage = NULL;
94     if(useEmbeddedColorManagement)
95     {
96         lastResult = DllExports::GdipLoadImageFromStreamICM(
97             stream,
98             &nativeImage
99         );
100     }
101     else
102     {
103         lastResult = DllExports::GdipLoadImageFromStream(
104             stream,
105             &nativeImage
106         );
107     }
108 }
109 
110 inline Image*
FromFile(IN const WCHAR * filename,IN BOOL useEmbeddedColorManagement)111 Image::FromFile(
112     IN const WCHAR* filename,
113     IN BOOL useEmbeddedColorManagement
114     )
115 {
116     return new Image(
117         filename,
118         useEmbeddedColorManagement
119     );
120 }
121 
122 inline Image*
FromStream(IN IStream * stream,IN BOOL useEmbeddedColorManagement)123 Image::FromStream(
124     IN IStream* stream,
125     IN BOOL useEmbeddedColorManagement
126     )
127 {
128     return new Image(
129         stream,
130         useEmbeddedColorManagement
131     );
132 }
133 
134 #endif
135 
136 inline
~Image()137 Image::~Image()
138 {
139     DllExports::GdipDisposeImage(nativeImage);
140 }
141 
142 inline Image*
Clone()143 Image::Clone()
144 {
145     GpImage *cloneimage = NULL;
146 
147     SetStatus(DllExports::GdipCloneImage(nativeImage, &cloneimage));
148 
149     return new Image(cloneimage, lastResult);
150 }
151 
152 // Encorder Parameter
153 
154 inline UINT
GetEncoderParameterListSize(IN const CLSID * clsidEncoder)155 Image::GetEncoderParameterListSize(
156     IN const CLSID* clsidEncoder
157     )
158 {
159     UINT size = 0;
160 
161     SetStatus(DllExports::GdipGetEncoderParameterListSize(nativeImage,
162                                                           clsidEncoder,
163                                                           &size));
164     return size;
165 }
166 
167 inline Status
GetEncoderParameterList(IN const CLSID * clsidEncoder,IN UINT size,OUT EncoderParameters * buffer)168 Image::GetEncoderParameterList(
169     IN const CLSID* clsidEncoder,
170     IN UINT size,
171     OUT EncoderParameters* buffer
172     )
173 {
174     return SetStatus(DllExports::GdipGetEncoderParameterList(nativeImage,
175                                                              clsidEncoder,
176                                                              size,
177                                                              buffer));
178 }
179 
180 // Save images
181 
182 inline Status
Save(IN const WCHAR * filename,IN const CLSID * clsidEncoder,IN const EncoderParameters * encoderParams)183 Image::Save(
184     IN const WCHAR* filename,
185     IN const CLSID* clsidEncoder,
186     IN const EncoderParameters *encoderParams
187     )
188 {
189     return SetStatus(DllExports::GdipSaveImageToFile(nativeImage,
190                                                      filename,
191                                                      clsidEncoder,
192                                                      encoderParams));
193 }
194 
195 inline Status
Save(IN IStream * stream,IN const CLSID * clsidEncoder,IN const EncoderParameters * encoderParams)196 Image::Save(
197     IN IStream* stream,
198     IN const CLSID* clsidEncoder,
199     IN const EncoderParameters *encoderParams
200     )
201 {
202     return SetStatus(DllExports::GdipSaveImageToStream(nativeImage,
203                                                        stream,
204                                                        clsidEncoder,
205                                                        encoderParams));
206 }
207 
208 inline Status
SaveAdd(IN const EncoderParameters * encoderParams)209 Image::SaveAdd(
210     IN const EncoderParameters *encoderParams
211     )
212 {
213     return SetStatus(DllExports::GdipSaveAdd(nativeImage,
214                                              encoderParams));
215 }
216 
217 inline Status
SaveAdd(IN Image * newImage,IN const EncoderParameters * encoderParams)218 Image::SaveAdd(
219     IN Image* newImage,
220     IN const EncoderParameters *encoderParams
221     )
222 {
223     if ( newImage == NULL )
224     {
225         return SetStatus(InvalidParameter);
226     }
227 
228     return SetStatus(DllExports::GdipSaveAddImage(nativeImage,
229                                                   newImage->nativeImage,
230                                                   encoderParams));
231 }
232 
233 // Get size and type information
234 inline ImageType
GetType()235 Image::GetType() const
236 {
237     ImageType type = ImageTypeUnknown;
238 
239     SetStatus(DllExports::GdipGetImageType(nativeImage, &type));
240 
241     return type;
242 }
243 
244 inline Status
GetPhysicalDimension(OUT SizeF * size)245 Image::GetPhysicalDimension(
246     OUT SizeF* size
247     )
248 {
249     if (size == NULL)
250     {
251         return SetStatus(InvalidParameter);
252     }
253 
254     REAL width, height;
255     Status status;
256 
257     status = SetStatus(DllExports::GdipGetImageDimension(nativeImage,
258                                                          &width, &height));
259 
260     size->Width  = width;
261     size->Height = height;
262 
263     return status;
264 }
265 
266 inline Status
GetBounds(OUT RectF * srcRect,OUT Unit * srcUnit)267 Image::GetBounds(
268     OUT RectF *srcRect,
269     OUT Unit *srcUnit
270     )
271 {
272     return SetStatus(DllExports::GdipGetImageBounds(nativeImage,
273                                                     srcRect, srcUnit));
274 }
275 
276 inline UINT
GetWidth()277 Image::GetWidth()
278 {
279     UINT width = 0;
280 
281     SetStatus(DllExports::GdipGetImageWidth(nativeImage, &width));
282 
283     return width;
284 }
285 
286 inline UINT
GetHeight()287 Image::GetHeight()
288 {
289     UINT height = 0;
290 
291     SetStatus(DllExports::GdipGetImageHeight(nativeImage, &height));
292 
293     return height;
294 }
295 
296 inline REAL
GetHorizontalResolution()297 Image::GetHorizontalResolution()
298 {
299     REAL resolution = 0.0f;
300 
301     SetStatus(DllExports::GdipGetImageHorizontalResolution(nativeImage, &resolution));
302 
303     return resolution;
304 }
305 
306 inline REAL
GetVerticalResolution()307 Image::GetVerticalResolution()
308 {
309     REAL resolution = 0.0f;
310 
311     SetStatus(DllExports::GdipGetImageVerticalResolution(nativeImage, &resolution));
312 
313     return resolution;
314 }
315 
316 inline UINT
GetFlags()317 Image::GetFlags()
318 {
319     UINT flags = 0;
320 
321     SetStatus(DllExports::GdipGetImageFlags(nativeImage, &flags));
322 
323     return flags;
324 }
325 
326 inline Status
GetRawFormat(OUT GUID * format)327 Image::GetRawFormat(OUT GUID *format)
328 {
329     return SetStatus(DllExports::GdipGetImageRawFormat(nativeImage, format));
330 }
331 
332 inline PixelFormat
GetPixelFormat()333 Image::GetPixelFormat()
334 {
335     PixelFormat format;
336 
337     SetStatus(DllExports::GdipGetImagePixelFormat(nativeImage, &format));
338 
339     return format;
340 }
341 
342 inline INT
GetPaletteSize()343 Image::GetPaletteSize()
344 {
345     INT size = 0;
346 
347     SetStatus(DllExports::GdipGetImagePaletteSize(nativeImage, &size));
348 
349     return size;
350 }
351 
352 inline Status
GetPalette(OUT ColorPalette * palette,IN INT size)353 Image::GetPalette(
354     OUT ColorPalette *palette,
355     IN INT size
356 )
357 {
358     return SetStatus(DllExports::GdipGetImagePalette(nativeImage, palette, size));
359 }
360 
361 inline Status
SetPalette(IN const ColorPalette * palette)362 Image::SetPalette(
363     IN const ColorPalette *palette
364     )
365 {
366     return SetStatus(DllExports::GdipSetImagePalette(nativeImage, palette));
367 }
368 
369 // Thumbnail support
370 
371 inline Image*
GetThumbnailImage(IN UINT thumbWidth,IN UINT thumbHeight,IN GetThumbnailImageAbort callback,IN VOID * callbackData)372 Image::GetThumbnailImage(
373     IN UINT thumbWidth,
374     IN UINT thumbHeight,
375     IN GetThumbnailImageAbort callback,
376     IN VOID* callbackData
377     )
378 {
379     GpImage *thumbimage = NULL;
380 
381     SetStatus(DllExports::GdipGetImageThumbnail(nativeImage,
382                                                 thumbWidth, thumbHeight,
383                                                 &thumbimage,
384                                                 callback, callbackData));
385 
386     Image *newImage = new Image(thumbimage, lastResult);
387 
388     if (newImage == NULL)
389     {
390         DllExports::GdipDisposeImage(thumbimage);
391     }
392 
393     return newImage;
394 }
395 
396 // Multi-frame support
397 inline UINT
GetFrameDimensionsCount()398 Image::GetFrameDimensionsCount()
399 {
400     UINT count = 0;
401 
402     SetStatus(DllExports::GdipImageGetFrameDimensionsCount(nativeImage,
403                                                                   &count));
404 
405     return count;
406 }
407 
408 inline Status
GetFrameDimensionsList(OUT GUID * dimensionIDs,IN UINT count)409 Image::GetFrameDimensionsList(
410     OUT GUID* dimensionIDs,
411     IN UINT count
412     )
413 {
414     return SetStatus(DllExports::GdipImageGetFrameDimensionsList(nativeImage,
415                                                                  dimensionIDs,
416                                                                  count));
417 }
418 
419 inline UINT
GetFrameCount(IN const GUID * dimensionID)420 Image::GetFrameCount(
421     IN const GUID* dimensionID
422     )
423 {
424     UINT count = 0;
425 
426     SetStatus(DllExports::GdipImageGetFrameCount(nativeImage,
427                                                         dimensionID,
428                                                         &count));
429     return count;
430 }
431 
432 inline Status
SelectActiveFrame(IN const GUID * dimensionID,IN UINT frameIndex)433 Image::SelectActiveFrame(
434     IN const GUID *dimensionID,
435     IN UINT frameIndex
436     )
437 {
438     return SetStatus(DllExports::GdipImageSelectActiveFrame(nativeImage,
439                                                             dimensionID,
440                                                             frameIndex));
441 }
442 
443 inline Status
RotateFlip(IN RotateFlipType rotateFlipType)444 Image::RotateFlip(
445     IN RotateFlipType rotateFlipType
446     )
447 {
448     return SetStatus(DllExports::GdipImageRotateFlip(nativeImage,
449                                                      rotateFlipType));
450 }
451 
452 // Image property related functions
453 
454 inline UINT
GetPropertyCount()455 Image::GetPropertyCount()
456 {
457     UINT numProperty = 0;
458 
459     SetStatus(DllExports::GdipGetPropertyCount(nativeImage,
460                                                &numProperty));
461 
462     return numProperty;
463 }
464 
465 inline Status
GetPropertyIdList(IN UINT numOfProperty,OUT PROPID * list)466 Image::GetPropertyIdList(
467     IN UINT numOfProperty,
468     OUT PROPID* list
469     )
470 {
471     return SetStatus(DllExports::GdipGetPropertyIdList(nativeImage,
472                                                        numOfProperty, list));
473 }
474 
475 inline UINT
GetPropertyItemSize(IN PROPID propId)476 Image::GetPropertyItemSize(
477     IN PROPID propId
478     )
479 {
480     UINT size = 0;
481 
482     SetStatus(DllExports::GdipGetPropertyItemSize(nativeImage,
483                                                   propId,
484                                                   &size));
485 
486     return size;
487 }
488 
489 inline Status
GetPropertyItem(IN PROPID propId,IN UINT propSize,OUT PropertyItem * buffer)490 Image::GetPropertyItem(
491     IN PROPID propId,
492     IN UINT propSize,
493     OUT PropertyItem* buffer
494     )
495 {
496     return SetStatus(DllExports::GdipGetPropertyItem(nativeImage,
497                                                      propId, propSize, buffer));
498 }
499 
500 inline Status
GetPropertySize(OUT UINT * totalBufferSize,OUT UINT * numProperties)501 Image::GetPropertySize(
502     OUT UINT* totalBufferSize,
503     OUT UINT* numProperties
504     )
505 {
506     return SetStatus(DllExports::GdipGetPropertySize(nativeImage,
507                                                      totalBufferSize,
508                                                      numProperties));
509 }
510 
511 inline Status
GetAllPropertyItems(IN UINT totalBufferSize,IN UINT numProperties,OUT PropertyItem * allItems)512 Image::GetAllPropertyItems(
513     IN UINT totalBufferSize,
514     IN UINT numProperties,
515     OUT PropertyItem* allItems
516     )
517 {
518     if (allItems == NULL)
519     {
520         return SetStatus(InvalidParameter);
521     }
522     return SetStatus(DllExports::GdipGetAllPropertyItems(nativeImage,
523                                                          totalBufferSize,
524                                                          numProperties,
525                                                          allItems));
526 }
527 
528 inline Status
RemovePropertyItem(IN PROPID propId)529 Image::RemovePropertyItem(
530     IN PROPID propId
531     )
532 {
533     return SetStatus(DllExports::GdipRemovePropertyItem(nativeImage, propId));
534 }
535 
536 inline Status
SetPropertyItem(IN const PropertyItem * item)537 Image::SetPropertyItem(
538     IN const PropertyItem* item
539     )
540 {
541     return SetStatus(DllExports::GdipSetPropertyItem(nativeImage, item));
542 }
543 
544 // Get/SetLayout
545 // Support for Middle East localization (right-to-left mirroring)
546 
547 inline ImageLayout
GetLayout()548 Image::GetLayout() const
549 {
550     ImageLayout layout;
551 
552     SetStatus(DllExports::GdipGetImageLayout(nativeImage, &layout));
553 
554     return layout;
555 }
556 
557 inline Status
SetLayout(IN const ImageLayout layout)558 Image::SetLayout(IN const ImageLayout layout)
559 {
560     return SetStatus(
561         DllExports::GdipSetImageLayout(nativeImage, layout)
562     );
563 }
564 
565 inline Status
GetLastStatus()566 Image::GetLastStatus() const
567 {
568     Status lastStatus = lastResult;
569     lastResult = Ok;
570 
571     return lastStatus;
572 }
573 
574 inline
Image(GpImage * nativeImage,Status status)575 Image::Image(GpImage *nativeImage, Status status)
576 {
577     SetNativeImage(nativeImage);
578     lastResult = status;
579 }
580 
581 inline VOID
SetNativeImage(GpImage * nativeImage)582 Image::SetNativeImage(GpImage *nativeImage)
583 {
584     this->nativeImage = nativeImage;
585 }
586 
587 inline
Bitmap(IN const WCHAR * filename,IN BOOL useEmbeddedColorManagement)588 Bitmap::Bitmap(
589     IN const WCHAR *filename,
590     IN BOOL useEmbeddedColorManagement
591     )
592 {
593     GpBitmap *bitmap = NULL;
594 
595     if(useEmbeddedColorManagement)
596     {
597         lastResult = DllExports::GdipCreateBitmapFromFileICM(filename, &bitmap);
598     }
599     else
600     {
601         lastResult = DllExports::GdipCreateBitmapFromFile(filename, &bitmap);
602     }
603 
604     SetNativeImage(bitmap);
605 }
606 
607 inline
Bitmap(IN IStream * stream,IN BOOL useEmbeddedColorManagement)608 Bitmap::Bitmap(
609     IN IStream *stream,
610     IN BOOL useEmbeddedColorManagement
611     )
612 {
613     GpBitmap *bitmap = NULL;
614 
615     if(useEmbeddedColorManagement)
616     {
617         lastResult = DllExports::GdipCreateBitmapFromStreamICM(stream, &bitmap);
618     }
619     else
620     {
621         lastResult = DllExports::GdipCreateBitmapFromStream(stream, &bitmap);
622     }
623 
624     SetNativeImage(bitmap);
625 }
626 
627 inline
Bitmap(IN INT width,IN INT height,IN INT stride,IN PixelFormat format,IN BYTE * scan0)628 Bitmap::Bitmap(
629     IN INT width,
630     IN INT height,
631     IN INT stride,
632     IN PixelFormat format,
633     IN BYTE *scan0
634     )
635 {
636     GpBitmap *bitmap = NULL;
637 
638     lastResult = DllExports::GdipCreateBitmapFromScan0(width,
639                                                        height,
640                                                        stride,
641                                                        format,
642                                                        scan0,
643                                                        &bitmap);
644 
645     SetNativeImage(bitmap);
646 }
647 
648 inline
Bitmap(IN INT width,IN INT height,IN PixelFormat format)649 Bitmap::Bitmap(
650     IN INT width,
651     IN INT height,
652     IN PixelFormat format
653     )
654 {
655     GpBitmap *bitmap = NULL;
656 
657     lastResult = DllExports::GdipCreateBitmapFromScan0(width,
658                                                        height,
659                                                        0,
660                                                        format,
661                                                        NULL,
662                                                        &bitmap);
663 
664     SetNativeImage(bitmap);
665 }
666 
667 inline
Bitmap(IN INT width,IN INT height,IN Graphics * target)668 Bitmap::Bitmap(
669     IN INT width,
670     IN INT height,
671     IN Graphics* target)
672 {
673     GpBitmap *bitmap = NULL;
674 
675     lastResult = DllExports::GdipCreateBitmapFromGraphics(width,
676                                                           height,
677                                                           target->nativeGraphics,
678                                                           &bitmap);
679 
680     SetNativeImage(bitmap);
681 }
682 
683 inline
Bitmap(IN IDirectDrawSurface7 * surface)684 Bitmap::Bitmap(
685     IN IDirectDrawSurface7 * surface
686     )
687 {
688     GpBitmap *bitmap = NULL;
689 
690     lastResult = DllExports::GdipCreateBitmapFromDirectDrawSurface(surface,
691                                                        &bitmap);
692 
693     SetNativeImage(bitmap);
694 }
695 
696 inline
Bitmap(IN const BITMAPINFO * gdiBitmapInfo,IN VOID * gdiBitmapData)697 Bitmap::Bitmap(
698     IN const BITMAPINFO* gdiBitmapInfo,
699     IN VOID* gdiBitmapData
700     )
701 {
702     GpBitmap *bitmap = NULL;
703 
704     lastResult = DllExports::GdipCreateBitmapFromGdiDib(gdiBitmapInfo,
705                                                         gdiBitmapData,
706                                                         &bitmap);
707 
708     SetNativeImage(bitmap);
709 }
710 
711 inline
Bitmap(IN HBITMAP hbm,IN HPALETTE hpal)712 Bitmap::Bitmap(
713     IN HBITMAP hbm,
714     IN HPALETTE hpal
715     )
716 {
717     GpBitmap *bitmap = NULL;
718 
719     lastResult = DllExports::GdipCreateBitmapFromHBITMAP(hbm, hpal, &bitmap);
720 
721     SetNativeImage(bitmap);
722 }
723 
724 inline
Bitmap(IN HICON hicon)725 Bitmap::Bitmap(
726     IN HICON hicon
727     )
728 {
729     GpBitmap *bitmap = NULL;
730 
731     lastResult = DllExports::GdipCreateBitmapFromHICON(hicon, &bitmap);
732 
733     SetNativeImage(bitmap);
734 }
735 
736 inline
Bitmap(IN HINSTANCE hInstance,IN const WCHAR * bitmapName)737 Bitmap::Bitmap(
738     IN HINSTANCE hInstance,
739     IN const WCHAR *bitmapName
740     )
741 {
742     GpBitmap *bitmap = NULL;
743 
744     lastResult = DllExports::GdipCreateBitmapFromResource(hInstance,
745                                                           bitmapName,
746                                                           &bitmap);
747 
748     SetNativeImage(bitmap);
749 }
750 
751 
752 inline Bitmap*
FromFile(IN const WCHAR * filename,IN BOOL useEmbeddedColorManagement)753 Bitmap::FromFile(
754     IN const WCHAR *filename,
755     IN BOOL useEmbeddedColorManagement
756     )
757 {
758     return new Bitmap(
759         filename,
760         useEmbeddedColorManagement
761     );
762 }
763 
764 inline Bitmap*
FromStream(IN IStream * stream,IN BOOL useEmbeddedColorManagement)765 Bitmap::FromStream(
766     IN IStream *stream,
767     IN BOOL useEmbeddedColorManagement
768     )
769 {
770     return new Bitmap(
771         stream,
772         useEmbeddedColorManagement
773     );
774 }
775 
776 inline Bitmap*
FromDirectDrawSurface7(IN IDirectDrawSurface7 * surface)777 Bitmap::FromDirectDrawSurface7(
778     IN IDirectDrawSurface7* surface
779     )
780 {
781     return new Bitmap(surface);
782 }
783 
784 inline Bitmap*
FromBITMAPINFO(IN const BITMAPINFO * gdiBitmapInfo,IN VOID * gdiBitmapData)785 Bitmap::FromBITMAPINFO(
786     IN const BITMAPINFO* gdiBitmapInfo,
787     IN VOID* gdiBitmapData)
788 {
789     return new Bitmap(gdiBitmapInfo, gdiBitmapData);
790 }
791 
792 inline Bitmap*
FromHBITMAP(IN HBITMAP hbm,IN HPALETTE hpal)793 Bitmap::FromHBITMAP(
794     IN HBITMAP hbm,
795     IN HPALETTE hpal
796     )
797 {
798     return new Bitmap(hbm, hpal);
799 }
800 
801 inline Bitmap*
FromHICON(IN HICON hicon)802 Bitmap::FromHICON(
803     IN HICON hicon
804     )
805 {
806     return new Bitmap(hicon);
807 }
808 
809 inline Bitmap*
FromResource(IN HINSTANCE hInstance,IN const WCHAR * bitmapName)810 Bitmap::FromResource(
811     IN HINSTANCE hInstance,
812     IN const WCHAR *bitmapName)
813 {
814     return new Bitmap(hInstance, bitmapName);
815 }
816 
817 inline Status
GetHBITMAP(IN const Color & colorBackground,OUT HBITMAP * hbmReturn)818 Bitmap::GetHBITMAP(
819     IN const Color& colorBackground,
820     OUT HBITMAP* hbmReturn
821     )
822 {
823     return SetStatus(DllExports::GdipCreateHBITMAPFromBitmap(
824                                         static_cast<GpBitmap*>(nativeImage),
825                                         hbmReturn,
826                                         colorBackground.GetValue()));
827 }
828 
829 inline Status
GetHICON(OUT HICON * hiconReturn)830 Bitmap::GetHICON(
831     OUT HICON* hiconReturn
832     )
833 {
834     return SetStatus(DllExports::GdipCreateHICONFromBitmap(
835                                         static_cast<GpBitmap*>(nativeImage),
836                                         hiconReturn));
837 }
838 
839 inline Bitmap*
Clone(IN const Rect & rect,IN PixelFormat format)840 Bitmap::Clone(
841     IN const Rect& rect,
842     IN PixelFormat format
843     )
844 {
845     return Clone(rect.X, rect.Y, rect.Width, rect.Height, format);
846 }
847 
848 inline Bitmap*
Clone(IN INT x,IN INT y,IN INT width,IN INT height,IN PixelFormat format)849 Bitmap::Clone(
850     IN INT x,
851     IN INT y,
852     IN INT width,
853     IN INT height,
854     IN PixelFormat format
855     )
856 {
857    GpBitmap* gpdstBitmap = NULL;
858    Bitmap* bitmap;
859 
860    lastResult = DllExports::GdipCloneBitmapAreaI(
861                                x,
862                                y,
863                                width,
864                                height,
865                                format,
866                                (GpBitmap *)nativeImage,
867                                &gpdstBitmap);
868 
869    if (lastResult == Ok)
870    {
871        bitmap = new Bitmap(gpdstBitmap);
872 
873        if (bitmap == NULL)
874        {
875            DllExports::GdipDisposeImage(gpdstBitmap);
876        }
877 
878        return bitmap;
879    }
880    else
881        return NULL;
882 }
883 
884 inline Bitmap*
Clone(IN const RectF & rect,IN PixelFormat format)885 Bitmap::Clone(
886     IN const RectF& rect,
887     IN PixelFormat format
888     )
889 {
890     return Clone(rect.X, rect.Y, rect.Width, rect.Height, format);
891 }
892 
893 inline Bitmap*
Clone(IN REAL x,IN REAL y,IN REAL width,IN REAL height,IN PixelFormat format)894 Bitmap::Clone(
895     IN REAL x,
896     IN REAL y,
897     IN REAL width,
898     IN REAL height,
899     IN PixelFormat format
900     )
901 {
902    GpBitmap* gpdstBitmap = NULL;
903    Bitmap* bitmap;
904 
905    SetStatus(DllExports::GdipCloneBitmapArea(
906                                x,
907                                y,
908                                width,
909                                height,
910                                format,
911                                (GpBitmap *)nativeImage,
912                                &gpdstBitmap));
913 
914    if (lastResult == Ok)
915    {
916        bitmap = new Bitmap(gpdstBitmap);
917 
918        if (bitmap == NULL)
919        {
920            DllExports::GdipDisposeImage(gpdstBitmap);
921        }
922 
923        return bitmap;
924    }
925    else
926        return NULL;
927 }
928 
Bitmap(GpBitmap * nativeBitmap)929 inline Bitmap::Bitmap(GpBitmap *nativeBitmap)
930 {
931     lastResult = Ok;
932 
933     SetNativeImage(nativeBitmap);
934 }
935 
936 inline Status
LockBits(IN const Rect & rect,IN UINT flags,IN PixelFormat format,OUT BitmapData * lockedBitmapData)937 Bitmap::LockBits(
938     IN const Rect& rect,
939     IN UINT flags,
940     IN PixelFormat format,
941     OUT BitmapData* lockedBitmapData
942 )
943 {
944     return SetStatus(DllExports::GdipBitmapLockBits(
945                                     static_cast<GpBitmap*>(nativeImage),
946                                     &rect,
947                                     flags,
948                                     format,
949                                     lockedBitmapData));
950 }
951 
952 inline Status
UnlockBits(IN BitmapData * lockedBitmapData)953 Bitmap::UnlockBits(
954     IN BitmapData* lockedBitmapData
955     )
956 {
957     return SetStatus(DllExports::GdipBitmapUnlockBits(
958                                     static_cast<GpBitmap*>(nativeImage),
959                                     lockedBitmapData));
960 }
961 
962 inline Status
GetPixel(IN INT x,IN INT y,OUT Color * color)963 Bitmap::GetPixel(
964     IN INT x,
965     IN INT y,
966     OUT Color *color)
967 {
968     ARGB argb;
969 
970     Status status = SetStatus(DllExports::GdipBitmapGetPixel(
971         static_cast<GpBitmap *>(nativeImage),
972         x, y,
973         &argb));
974 
975     if (status == Ok)
976     {
977         color->SetValue(argb);
978     }
979 
980     return  status;
981 }
982 
983 inline Status
SetPixel(IN INT x,IN INT y,IN const Color & color)984 Bitmap::SetPixel(
985     IN INT x,
986     IN INT y,
987     IN const Color& color)
988 {
989     return SetStatus(DllExports::GdipBitmapSetPixel(
990         static_cast<GpBitmap *>(nativeImage),
991         x, y,
992         color.GetValue()));
993 }
994 
995 inline Status
SetResolution(IN REAL xdpi,IN REAL ydpi)996 Bitmap::SetResolution(
997     IN REAL xdpi,
998     IN REAL ydpi)
999 {
1000     return SetStatus(DllExports::GdipBitmapSetResolution(
1001         static_cast<GpBitmap *>(nativeImage),
1002         xdpi, ydpi));
1003 }
1004 #endif
1005