Home | History | Annotate | Download | only in include
      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
     29 Image::Image(
     30     IN const WCHAR* filename
     31     )
     32 {
     33     nativeImage = NULL;
     34     lastResult = DllExports::GdipLoadImageFromFile(filename, &nativeImage);
     35 }
     36 
     37 inline
     38 Image::Image(
     39     IN IStream* stream
     40     )
     41 {
     42     nativeImage = NULL;
     43     lastResult = DllExports::GdipLoadImageFromStream(stream, &nativeImage);
     44 }
     45 
     46 inline Image*
     47 Image::FromFile(
     48     IN const WCHAR* filename
     49     )
     50 {
     51     return new Image(filename);
     52 }
     53 
     54 inline Image*
     55 Image::FromStream(
     56     IN IStream* stream
     57     )
     58 {
     59     return new Image(stream);
     60 }
     61 
     62 #else
     63 
     64 inline
     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
     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*
    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*
    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
    137 Image::~Image()
    138 {
    139     DllExports::GdipDisposeImage(nativeImage);
    140 }
    141 
    142 inline Image*
    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
    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
    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
    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
    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
    209 Image::SaveAdd(
    210     IN const EncoderParameters *encoderParams
    211     )
    212 {
    213     return SetStatus(DllExports::GdipSaveAdd(nativeImage,
    214                                              encoderParams));
    215 }
    216 
    217 inline Status
    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
    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
    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
    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
    277 Image::GetWidth()
    278 {
    279     UINT width = 0;
    280 
    281     SetStatus(DllExports::GdipGetImageWidth(nativeImage, &width));
    282 
    283     return width;
    284 }
    285 
    286 inline UINT
    287 Image::GetHeight()
    288 {
    289     UINT height = 0;
    290 
    291     SetStatus(DllExports::GdipGetImageHeight(nativeImage, &height));
    292 
    293     return height;
    294 }
    295 
    296 inline REAL
    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
    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
    317 Image::GetFlags()
    318 {
    319     UINT flags = 0;
    320 
    321     SetStatus(DllExports::GdipGetImageFlags(nativeImage, &flags));
    322 
    323     return flags;
    324 }
    325 
    326 inline Status
    327 Image::GetRawFormat(OUT GUID *format)
    328 {
    329     return SetStatus(DllExports::GdipGetImageRawFormat(nativeImage, format));
    330 }
    331 
    332 inline PixelFormat
    333 Image::GetPixelFormat()
    334 {
    335     PixelFormat format;
    336 
    337     SetStatus(DllExports::GdipGetImagePixelFormat(nativeImage, &format));
    338 
    339     return format;
    340 }
    341 
    342 inline INT
    343 Image::GetPaletteSize()
    344 {
    345     INT size = 0;
    346 
    347     SetStatus(DllExports::GdipGetImagePaletteSize(nativeImage, &size));
    348 
    349     return size;
    350 }
    351 
    352 inline Status
    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
    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*
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    529 Image::RemovePropertyItem(
    530     IN PROPID propId
    531     )
    532 {
    533     return SetStatus(DllExports::GdipRemovePropertyItem(nativeImage, propId));
    534 }
    535 
    536 inline Status
    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
    548 Image::GetLayout() const
    549 {
    550     ImageLayout layout;
    551 
    552     SetStatus(DllExports::GdipGetImageLayout(nativeImage, &layout));
    553 
    554     return layout;
    555 }
    556 
    557 inline Status
    558 Image::SetLayout(IN const ImageLayout layout)
    559 {
    560     return SetStatus(
    561         DllExports::GdipSetImageLayout(nativeImage, layout)
    562     );
    563 }
    564 
    565 inline Status
    566 Image::GetLastStatus() const
    567 {
    568     Status lastStatus = lastResult;
    569     lastResult = Ok;
    570 
    571     return lastStatus;
    572 }
    573 
    574 inline
    575 Image::Image(GpImage *nativeImage, Status status)
    576 {
    577     SetNativeImage(nativeImage);
    578     lastResult = status;
    579 }
    580 
    581 inline VOID
    582 Image::SetNativeImage(GpImage *nativeImage)
    583 {
    584     this->nativeImage = nativeImage;
    585 }
    586 
    587 inline
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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*
    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*
    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*
    777 Bitmap::FromDirectDrawSurface7(
    778     IN IDirectDrawSurface7* surface
    779     )
    780 {
    781     return new Bitmap(surface);
    782 }
    783 
    784 inline Bitmap*
    785 Bitmap::FromBITMAPINFO(
    786     IN const BITMAPINFO* gdiBitmapInfo,
    787     IN VOID* gdiBitmapData)
    788 {
    789     return new Bitmap(gdiBitmapInfo, gdiBitmapData);
    790 }
    791 
    792 inline Bitmap*
    793 Bitmap::FromHBITMAP(
    794     IN HBITMAP hbm,
    795     IN HPALETTE hpal
    796     )
    797 {
    798     return new Bitmap(hbm, hpal);
    799 }
    800 
    801 inline Bitmap*
    802 Bitmap::FromHICON(
    803     IN HICON hicon
    804     )
    805 {
    806     return new Bitmap(hicon);
    807 }
    808 
    809 inline Bitmap*
    810 Bitmap::FromResource(
    811     IN HINSTANCE hInstance,
    812     IN const WCHAR *bitmapName)
    813 {
    814     return new Bitmap(hInstance, bitmapName);
    815 }
    816 
    817 inline Status
    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
    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*
    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*
    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*
    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*
    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 
    929 inline Bitmap::Bitmap(GpBitmap *nativeBitmap)
    930 {
    931     lastResult = Ok;
    932 
    933     SetNativeImage(nativeBitmap);
    934 }
    935 
    936 inline Status
    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
    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
    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
    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
    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