1001 lines
21 KiB
C
1001 lines
21 KiB
C
|
/**************************************************************************\
|
||
|
*
|
||
|
* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
|
||
|
*
|
||
|
* Module Name:
|
||
|
*
|
||
|
* Bitmap.hpp
|
||
|
*
|
||
|
* Abstract:
|
||
|
*
|
||
|
* Bitmap related declarations
|
||
|
*
|
||
|
* Revision History:
|
||
|
*
|
||
|
* 4/26/2000 ericvan
|
||
|
* Update header files.
|
||
|
*
|
||
|
* 12/09/1998 davidx
|
||
|
* Created it.
|
||
|
*
|
||
|
\**************************************************************************/
|
||
|
|
||
|
#ifndef _GDIPLUSBITMAP_H
|
||
|
#define _GDIPLUSBITMAP_H
|
||
|
|
||
|
// NOTE:
|
||
|
// Our current choice for the public API is to use constructors
|
||
|
// instead of static load functions to create image objects.
|
||
|
//
|
||
|
// I've kept the static load functions here for now so that
|
||
|
// existing test programs are not broken. But they should
|
||
|
// eventually be taken out.
|
||
|
|
||
|
#ifndef DCR_USE_NEW_140782
|
||
|
|
||
|
inline
|
||
|
Image::Image(
|
||
|
IN const WCHAR* filename
|
||
|
)
|
||
|
{
|
||
|
nativeImage = NULL;
|
||
|
lastResult = DllExports::GdipLoadImageFromFile(filename, &nativeImage);
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
Image::Image(
|
||
|
IN IStream* stream
|
||
|
)
|
||
|
{
|
||
|
nativeImage = NULL;
|
||
|
lastResult = DllExports::GdipLoadImageFromStream(stream, &nativeImage);
|
||
|
}
|
||
|
|
||
|
inline Image*
|
||
|
Image::FromFile(
|
||
|
IN const WCHAR* filename
|
||
|
)
|
||
|
{
|
||
|
return new Image(filename);
|
||
|
}
|
||
|
|
||
|
inline Image*
|
||
|
Image::FromStream(
|
||
|
IN IStream* stream
|
||
|
)
|
||
|
{
|
||
|
return new Image(stream);
|
||
|
}
|
||
|
|
||
|
#else
|
||
|
|
||
|
inline
|
||
|
Image::Image(
|
||
|
IN const WCHAR* filename,
|
||
|
IN BOOL useEmbeddedColorManagement
|
||
|
)
|
||
|
{
|
||
|
nativeImage = NULL;
|
||
|
if(useEmbeddedColorManagement)
|
||
|
{
|
||
|
lastResult = DllExports::GdipLoadImageFromFileICM(
|
||
|
filename,
|
||
|
&nativeImage
|
||
|
);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
lastResult = DllExports::GdipLoadImageFromFile(
|
||
|
filename,
|
||
|
&nativeImage
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
Image::Image(
|
||
|
IN IStream* stream,
|
||
|
IN BOOL useEmbeddedColorManagement
|
||
|
)
|
||
|
{
|
||
|
nativeImage = NULL;
|
||
|
if(useEmbeddedColorManagement)
|
||
|
{
|
||
|
lastResult = DllExports::GdipLoadImageFromStreamICM(
|
||
|
stream,
|
||
|
&nativeImage
|
||
|
);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
lastResult = DllExports::GdipLoadImageFromStream(
|
||
|
stream,
|
||
|
&nativeImage
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
inline Image*
|
||
|
Image::FromFile(
|
||
|
IN const WCHAR* filename,
|
||
|
IN BOOL useEmbeddedColorManagement
|
||
|
)
|
||
|
{
|
||
|
return new Image(
|
||
|
filename,
|
||
|
useEmbeddedColorManagement
|
||
|
);
|
||
|
}
|
||
|
|
||
|
inline Image*
|
||
|
Image::FromStream(
|
||
|
IN IStream* stream,
|
||
|
IN BOOL useEmbeddedColorManagement
|
||
|
)
|
||
|
{
|
||
|
return new Image(
|
||
|
stream,
|
||
|
useEmbeddedColorManagement
|
||
|
);
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
inline
|
||
|
Image::~Image()
|
||
|
{
|
||
|
DllExports::GdipDisposeImage(nativeImage);
|
||
|
}
|
||
|
|
||
|
inline Image*
|
||
|
Image::Clone()
|
||
|
{
|
||
|
GpImage *cloneimage = NULL;
|
||
|
|
||
|
SetStatus(DllExports::GdipCloneImage(nativeImage, &cloneimage));
|
||
|
|
||
|
return new Image(cloneimage, lastResult);
|
||
|
}
|
||
|
|
||
|
// Encorder Parameter
|
||
|
|
||
|
inline UINT
|
||
|
Image::GetEncoderParameterListSize(
|
||
|
IN const CLSID* clsidEncoder
|
||
|
)
|
||
|
{
|
||
|
UINT size = 0;
|
||
|
|
||
|
SetStatus(DllExports::GdipGetEncoderParameterListSize(nativeImage,
|
||
|
clsidEncoder,
|
||
|
&size));
|
||
|
return size;
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::GetEncoderParameterList(
|
||
|
IN const CLSID* clsidEncoder,
|
||
|
IN UINT size,
|
||
|
OUT EncoderParameters* buffer
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipGetEncoderParameterList(nativeImage,
|
||
|
clsidEncoder,
|
||
|
size,
|
||
|
buffer));
|
||
|
}
|
||
|
|
||
|
// Save images
|
||
|
|
||
|
inline Status
|
||
|
Image::Save(
|
||
|
IN const WCHAR* filename,
|
||
|
IN const CLSID* clsidEncoder,
|
||
|
IN const EncoderParameters *encoderParams
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipSaveImageToFile(nativeImage,
|
||
|
filename,
|
||
|
clsidEncoder,
|
||
|
encoderParams));
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::Save(
|
||
|
IN IStream* stream,
|
||
|
IN const CLSID* clsidEncoder,
|
||
|
IN const EncoderParameters *encoderParams
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipSaveImageToStream(nativeImage,
|
||
|
stream,
|
||
|
clsidEncoder,
|
||
|
encoderParams));
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::SaveAdd(
|
||
|
IN const EncoderParameters *encoderParams
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipSaveAdd(nativeImage,
|
||
|
encoderParams));
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::SaveAdd(
|
||
|
IN Image* newImage,
|
||
|
IN const EncoderParameters *encoderParams
|
||
|
)
|
||
|
{
|
||
|
if ( newImage == NULL )
|
||
|
{
|
||
|
return SetStatus(InvalidParameter);
|
||
|
}
|
||
|
|
||
|
return SetStatus(DllExports::GdipSaveAddImage(nativeImage,
|
||
|
newImage->nativeImage,
|
||
|
encoderParams));
|
||
|
}
|
||
|
|
||
|
// Get size and type information
|
||
|
inline ImageType
|
||
|
Image::GetType() const
|
||
|
{
|
||
|
ImageType type = ImageTypeUnknown;
|
||
|
|
||
|
SetStatus(DllExports::GdipGetImageType(nativeImage, &type));
|
||
|
|
||
|
return type;
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::GetPhysicalDimension(
|
||
|
OUT SizeF* size
|
||
|
)
|
||
|
{
|
||
|
if (size == NULL)
|
||
|
{
|
||
|
return SetStatus(InvalidParameter);
|
||
|
}
|
||
|
|
||
|
REAL width, height;
|
||
|
Status status;
|
||
|
|
||
|
status = SetStatus(DllExports::GdipGetImageDimension(nativeImage,
|
||
|
&width, &height));
|
||
|
|
||
|
size->Width = width;
|
||
|
size->Height = height;
|
||
|
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::GetBounds(
|
||
|
OUT RectF *srcRect,
|
||
|
OUT Unit *srcUnit
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipGetImageBounds(nativeImage,
|
||
|
srcRect, srcUnit));
|
||
|
}
|
||
|
|
||
|
inline UINT
|
||
|
Image::GetWidth()
|
||
|
{
|
||
|
UINT width = 0;
|
||
|
|
||
|
SetStatus(DllExports::GdipGetImageWidth(nativeImage, &width));
|
||
|
|
||
|
return width;
|
||
|
}
|
||
|
|
||
|
inline UINT
|
||
|
Image::GetHeight()
|
||
|
{
|
||
|
UINT height = 0;
|
||
|
|
||
|
SetStatus(DllExports::GdipGetImageHeight(nativeImage, &height));
|
||
|
|
||
|
return height;
|
||
|
}
|
||
|
|
||
|
inline REAL
|
||
|
Image::GetHorizontalResolution()
|
||
|
{
|
||
|
REAL resolution = 0.0f;
|
||
|
|
||
|
SetStatus(DllExports::GdipGetImageHorizontalResolution(nativeImage, &resolution));
|
||
|
|
||
|
return resolution;
|
||
|
}
|
||
|
|
||
|
inline REAL
|
||
|
Image::GetVerticalResolution()
|
||
|
{
|
||
|
REAL resolution = 0.0f;
|
||
|
|
||
|
SetStatus(DllExports::GdipGetImageVerticalResolution(nativeImage, &resolution));
|
||
|
|
||
|
return resolution;
|
||
|
}
|
||
|
|
||
|
inline UINT
|
||
|
Image::GetFlags()
|
||
|
{
|
||
|
UINT flags = 0;
|
||
|
|
||
|
SetStatus(DllExports::GdipGetImageFlags(nativeImage, &flags));
|
||
|
|
||
|
return flags;
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::GetRawFormat(OUT GUID *format)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipGetImageRawFormat(nativeImage, format));
|
||
|
}
|
||
|
|
||
|
inline PixelFormat
|
||
|
Image::GetPixelFormat()
|
||
|
{
|
||
|
PixelFormat format;
|
||
|
|
||
|
SetStatus(DllExports::GdipGetImagePixelFormat(nativeImage, &format));
|
||
|
|
||
|
return format;
|
||
|
}
|
||
|
|
||
|
inline INT
|
||
|
Image::GetPaletteSize()
|
||
|
{
|
||
|
INT size = 0;
|
||
|
|
||
|
SetStatus(DllExports::GdipGetImagePaletteSize(nativeImage, &size));
|
||
|
|
||
|
return size;
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::GetPalette(
|
||
|
OUT ColorPalette *palette,
|
||
|
IN INT size
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipGetImagePalette(nativeImage, palette, size));
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::SetPalette(
|
||
|
IN const ColorPalette *palette
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipSetImagePalette(nativeImage, palette));
|
||
|
}
|
||
|
|
||
|
// Thumbnail support
|
||
|
|
||
|
inline Image*
|
||
|
Image::GetThumbnailImage(
|
||
|
IN UINT thumbWidth,
|
||
|
IN UINT thumbHeight,
|
||
|
IN GetThumbnailImageAbort callback,
|
||
|
IN VOID* callbackData
|
||
|
)
|
||
|
{
|
||
|
GpImage *thumbimage = NULL;
|
||
|
|
||
|
SetStatus(DllExports::GdipGetImageThumbnail(nativeImage,
|
||
|
thumbWidth, thumbHeight,
|
||
|
&thumbimage,
|
||
|
callback, callbackData));
|
||
|
|
||
|
Image *newImage = new Image(thumbimage, lastResult);
|
||
|
|
||
|
if (newImage == NULL)
|
||
|
{
|
||
|
DllExports::GdipDisposeImage(thumbimage);
|
||
|
}
|
||
|
|
||
|
return newImage;
|
||
|
}
|
||
|
|
||
|
// Multi-frame support
|
||
|
inline UINT
|
||
|
Image::GetFrameDimensionsCount()
|
||
|
{
|
||
|
UINT count = 0;
|
||
|
|
||
|
SetStatus(DllExports::GdipImageGetFrameDimensionsCount(nativeImage,
|
||
|
&count));
|
||
|
|
||
|
return count;
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::GetFrameDimensionsList(
|
||
|
OUT GUID* dimensionIDs,
|
||
|
IN UINT count
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipImageGetFrameDimensionsList(nativeImage,
|
||
|
dimensionIDs,
|
||
|
count));
|
||
|
}
|
||
|
|
||
|
inline UINT
|
||
|
Image::GetFrameCount(
|
||
|
IN const GUID* dimensionID
|
||
|
)
|
||
|
{
|
||
|
UINT count = 0;
|
||
|
|
||
|
SetStatus(DllExports::GdipImageGetFrameCount(nativeImage,
|
||
|
dimensionID,
|
||
|
&count));
|
||
|
return count;
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::SelectActiveFrame(
|
||
|
IN const GUID *dimensionID,
|
||
|
IN UINT frameIndex
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipImageSelectActiveFrame(nativeImage,
|
||
|
dimensionID,
|
||
|
frameIndex));
|
||
|
}
|
||
|
|
||
|
// Image property related functions
|
||
|
|
||
|
inline UINT
|
||
|
Image::GetPropertyCount()
|
||
|
{
|
||
|
UINT numProperty = 0;
|
||
|
|
||
|
SetStatus(DllExports::GdipGetPropertyCount(nativeImage,
|
||
|
&numProperty));
|
||
|
|
||
|
return numProperty;
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::GetPropertyIdList(
|
||
|
IN UINT numOfProperty,
|
||
|
OUT PROPID* list
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipGetPropertyIdList(nativeImage,
|
||
|
numOfProperty, list));
|
||
|
}
|
||
|
|
||
|
inline UINT
|
||
|
Image::GetPropertyItemSize(
|
||
|
IN PROPID propId
|
||
|
)
|
||
|
{
|
||
|
UINT size = 0;
|
||
|
|
||
|
SetStatus(DllExports::GdipGetPropertyItemSize(nativeImage,
|
||
|
propId,
|
||
|
&size));
|
||
|
|
||
|
return size;
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::GetPropertyItem(
|
||
|
IN PROPID propId,
|
||
|
IN UINT propSize,
|
||
|
OUT PropertyItem* buffer
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipGetPropertyItem(nativeImage,
|
||
|
propId, propSize, buffer));
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::GetPropertySize(
|
||
|
OUT UINT* totalBufferSize,
|
||
|
OUT UINT* numProperties
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipGetPropertySize(nativeImage,
|
||
|
totalBufferSize,
|
||
|
numProperties));
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::GetAllPropertyItems(
|
||
|
IN UINT totalBufferSize,
|
||
|
IN UINT numProperties,
|
||
|
OUT PropertyItem* allItems
|
||
|
)
|
||
|
{
|
||
|
if (allItems == NULL)
|
||
|
{
|
||
|
return SetStatus(InvalidParameter);
|
||
|
}
|
||
|
return SetStatus(DllExports::GdipGetAllPropertyItems(nativeImage,
|
||
|
totalBufferSize,
|
||
|
numProperties,
|
||
|
allItems));
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::RemovePropertyItem(
|
||
|
IN PROPID propId
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipRemovePropertyItem(nativeImage, propId));
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::SetPropertyItem(
|
||
|
IN const PropertyItem* item
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipSetPropertyItem(nativeImage, item));
|
||
|
}
|
||
|
|
||
|
// Get/SetLayout
|
||
|
// Support for Middle East localization (right-to-left mirroring)
|
||
|
|
||
|
inline ImageLayout
|
||
|
Image::GetLayout() const
|
||
|
{
|
||
|
ImageLayout layout;
|
||
|
|
||
|
SetStatus(DllExports::GdipGetImageLayout(nativeImage, &layout));
|
||
|
|
||
|
return layout;
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::SetLayout(IN const ImageLayout layout)
|
||
|
{
|
||
|
SetStatus(DllExports::GdipSetImageLayout(nativeImage, layout));
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Image::GetLastStatus() const
|
||
|
{
|
||
|
Status lastStatus = lastResult;
|
||
|
lastResult = Ok;
|
||
|
|
||
|
return lastStatus;
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
Image::Image(GpImage *nativeImage, Status status)
|
||
|
{
|
||
|
SetNativeImage(nativeImage);
|
||
|
lastResult = status;
|
||
|
}
|
||
|
|
||
|
inline VOID
|
||
|
Image::SetNativeImage(GpImage *nativeImage)
|
||
|
{
|
||
|
this->nativeImage = nativeImage;
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
Bitmap::Bitmap(
|
||
|
IN const WCHAR *filename,
|
||
|
IN BOOL useEmbeddedColorManagement
|
||
|
)
|
||
|
{
|
||
|
GpBitmap *bitmap = NULL;
|
||
|
|
||
|
if(useEmbeddedColorManagement)
|
||
|
{
|
||
|
lastResult = DllExports::GdipCreateBitmapFromFileICM(filename, &bitmap);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
lastResult = DllExports::GdipCreateBitmapFromFile(filename, &bitmap);
|
||
|
}
|
||
|
|
||
|
SetNativeImage(bitmap);
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
Bitmap::Bitmap(
|
||
|
IN IStream *stream,
|
||
|
IN BOOL useEmbeddedColorManagement
|
||
|
)
|
||
|
{
|
||
|
GpBitmap *bitmap = NULL;
|
||
|
|
||
|
if(useEmbeddedColorManagement)
|
||
|
{
|
||
|
lastResult = DllExports::GdipCreateBitmapFromStreamICM(stream, &bitmap);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
lastResult = DllExports::GdipCreateBitmapFromStream(stream, &bitmap);
|
||
|
}
|
||
|
|
||
|
SetNativeImage(bitmap);
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
Bitmap::Bitmap(
|
||
|
IN INT width,
|
||
|
IN INT height,
|
||
|
IN INT stride,
|
||
|
IN PixelFormat format,
|
||
|
IN BYTE *scan0
|
||
|
)
|
||
|
{
|
||
|
GpBitmap *bitmap = NULL;
|
||
|
|
||
|
lastResult = DllExports::GdipCreateBitmapFromScan0(width,
|
||
|
height,
|
||
|
stride,
|
||
|
format,
|
||
|
scan0,
|
||
|
&bitmap);
|
||
|
|
||
|
SetNativeImage(bitmap);
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
Bitmap::Bitmap(
|
||
|
IN INT width,
|
||
|
IN INT height,
|
||
|
IN PixelFormat format
|
||
|
)
|
||
|
{
|
||
|
GpBitmap *bitmap = NULL;
|
||
|
|
||
|
lastResult = DllExports::GdipCreateBitmapFromScan0(width,
|
||
|
height,
|
||
|
0,
|
||
|
format,
|
||
|
NULL,
|
||
|
&bitmap);
|
||
|
|
||
|
SetNativeImage(bitmap);
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
Bitmap::Bitmap(
|
||
|
IN INT width,
|
||
|
IN INT height,
|
||
|
IN Graphics* target)
|
||
|
{
|
||
|
GpBitmap *bitmap = NULL;
|
||
|
|
||
|
lastResult = DllExports::GdipCreateBitmapFromGraphics(width,
|
||
|
height,
|
||
|
target->nativeGraphics,
|
||
|
&bitmap);
|
||
|
|
||
|
SetNativeImage(bitmap);
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
Bitmap::Bitmap(
|
||
|
IN IDirectDrawSurface7 * surface
|
||
|
)
|
||
|
{
|
||
|
GpBitmap *bitmap = NULL;
|
||
|
|
||
|
lastResult = DllExports::GdipCreateBitmapFromDirectDrawSurface(surface,
|
||
|
&bitmap);
|
||
|
|
||
|
SetNativeImage(bitmap);
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
Bitmap::Bitmap(
|
||
|
IN const BITMAPINFO* gdiBitmapInfo,
|
||
|
IN VOID* gdiBitmapData
|
||
|
)
|
||
|
{
|
||
|
GpBitmap *bitmap = NULL;
|
||
|
|
||
|
lastResult = DllExports::GdipCreateBitmapFromGdiDib(gdiBitmapInfo,
|
||
|
gdiBitmapData,
|
||
|
&bitmap);
|
||
|
|
||
|
SetNativeImage(bitmap);
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
Bitmap::Bitmap(
|
||
|
IN HBITMAP hbm,
|
||
|
IN HPALETTE hpal
|
||
|
)
|
||
|
{
|
||
|
GpBitmap *bitmap = NULL;
|
||
|
|
||
|
lastResult = DllExports::GdipCreateBitmapFromHBITMAP(hbm, hpal, &bitmap);
|
||
|
|
||
|
SetNativeImage(bitmap);
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
Bitmap::Bitmap(
|
||
|
IN HICON hicon
|
||
|
)
|
||
|
{
|
||
|
GpBitmap *bitmap = NULL;
|
||
|
|
||
|
lastResult = DllExports::GdipCreateBitmapFromHICON(hicon, &bitmap);
|
||
|
|
||
|
SetNativeImage(bitmap);
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
Bitmap::Bitmap(
|
||
|
IN HINSTANCE hInstance,
|
||
|
IN const WCHAR *bitmapName
|
||
|
)
|
||
|
{
|
||
|
GpBitmap *bitmap = NULL;
|
||
|
|
||
|
lastResult = DllExports::GdipCreateBitmapFromResource(hInstance,
|
||
|
bitmapName,
|
||
|
&bitmap);
|
||
|
|
||
|
SetNativeImage(bitmap);
|
||
|
}
|
||
|
|
||
|
|
||
|
inline Bitmap*
|
||
|
Bitmap::FromFile(
|
||
|
IN const WCHAR *filename,
|
||
|
IN BOOL useEmbeddedColorManagement
|
||
|
)
|
||
|
{
|
||
|
return new Bitmap(
|
||
|
filename,
|
||
|
useEmbeddedColorManagement
|
||
|
);
|
||
|
}
|
||
|
|
||
|
inline Bitmap*
|
||
|
Bitmap::FromStream(
|
||
|
IN IStream *stream,
|
||
|
IN BOOL useEmbeddedColorManagement
|
||
|
)
|
||
|
{
|
||
|
return new Bitmap(
|
||
|
stream,
|
||
|
useEmbeddedColorManagement
|
||
|
);
|
||
|
}
|
||
|
|
||
|
inline Bitmap*
|
||
|
Bitmap::FromDirectDrawSurface7(
|
||
|
IN IDirectDrawSurface7* surface
|
||
|
)
|
||
|
{
|
||
|
return new Bitmap(surface);
|
||
|
}
|
||
|
|
||
|
inline Bitmap*
|
||
|
Bitmap::FromBITMAPINFO(
|
||
|
IN const BITMAPINFO* gdiBitmapInfo,
|
||
|
IN VOID* gdiBitmapData)
|
||
|
{
|
||
|
return new Bitmap(gdiBitmapInfo, gdiBitmapData);
|
||
|
}
|
||
|
|
||
|
inline Bitmap*
|
||
|
Bitmap::FromHBITMAP(
|
||
|
IN HBITMAP hbm,
|
||
|
IN HPALETTE hpal
|
||
|
)
|
||
|
{
|
||
|
return new Bitmap(hbm, hpal);
|
||
|
}
|
||
|
|
||
|
inline Bitmap*
|
||
|
Bitmap::FromHICON(
|
||
|
IN HICON hicon
|
||
|
)
|
||
|
{
|
||
|
return new Bitmap(hicon);
|
||
|
}
|
||
|
|
||
|
inline Bitmap*
|
||
|
Bitmap::FromResource(
|
||
|
IN HINSTANCE hInstance,
|
||
|
IN const WCHAR *bitmapName)
|
||
|
{
|
||
|
return new Bitmap(hInstance, bitmapName);
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Bitmap::GetHBITMAP(
|
||
|
IN const Color& colorBackground,
|
||
|
OUT HBITMAP* hbmReturn
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipCreateHBITMAPFromBitmap(
|
||
|
static_cast<GpBitmap*>(nativeImage),
|
||
|
hbmReturn,
|
||
|
colorBackground.GetValue()));
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Bitmap::GetHICON(
|
||
|
OUT HICON* hiconReturn
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipCreateHICONFromBitmap(
|
||
|
static_cast<GpBitmap*>(nativeImage),
|
||
|
hiconReturn));
|
||
|
}
|
||
|
|
||
|
inline Bitmap*
|
||
|
Bitmap::Clone(
|
||
|
IN const Rect& rect,
|
||
|
IN PixelFormat format
|
||
|
)
|
||
|
{
|
||
|
return Clone(rect.X, rect.Y, rect.Width, rect.Height, format);
|
||
|
}
|
||
|
|
||
|
inline Bitmap*
|
||
|
Bitmap::Clone(
|
||
|
IN INT x,
|
||
|
IN INT y,
|
||
|
IN INT width,
|
||
|
IN INT height,
|
||
|
IN PixelFormat format
|
||
|
)
|
||
|
{
|
||
|
GpBitmap* gpdstBitmap = NULL;
|
||
|
Bitmap* bitmap;
|
||
|
|
||
|
lastResult = DllExports::GdipCloneBitmapAreaI(
|
||
|
x,
|
||
|
y,
|
||
|
width,
|
||
|
height,
|
||
|
format,
|
||
|
(GpBitmap *)nativeImage,
|
||
|
&gpdstBitmap);
|
||
|
|
||
|
if (lastResult == Ok)
|
||
|
{
|
||
|
bitmap = new Bitmap(gpdstBitmap);
|
||
|
|
||
|
if (bitmap == NULL)
|
||
|
{
|
||
|
DllExports::GdipDisposeImage(gpdstBitmap);
|
||
|
}
|
||
|
|
||
|
return bitmap;
|
||
|
}
|
||
|
else
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
inline Bitmap*
|
||
|
Bitmap::Clone(
|
||
|
IN const RectF& rect,
|
||
|
IN PixelFormat format
|
||
|
)
|
||
|
{
|
||
|
return Clone(rect.X, rect.Y, rect.Width, rect.Height, format);
|
||
|
}
|
||
|
|
||
|
inline Bitmap*
|
||
|
Bitmap::Clone(
|
||
|
IN REAL x,
|
||
|
IN REAL y,
|
||
|
IN REAL width,
|
||
|
IN REAL height,
|
||
|
IN PixelFormat format
|
||
|
)
|
||
|
{
|
||
|
GpBitmap* gpdstBitmap = NULL;
|
||
|
Bitmap* bitmap;
|
||
|
|
||
|
SetStatus(DllExports::GdipCloneBitmapArea(
|
||
|
x,
|
||
|
y,
|
||
|
width,
|
||
|
height,
|
||
|
format,
|
||
|
(GpBitmap *)nativeImage,
|
||
|
&gpdstBitmap));
|
||
|
|
||
|
if (lastResult == Ok)
|
||
|
{
|
||
|
bitmap = new Bitmap(gpdstBitmap);
|
||
|
|
||
|
if (bitmap == NULL)
|
||
|
{
|
||
|
DllExports::GdipDisposeImage(gpdstBitmap);
|
||
|
}
|
||
|
|
||
|
return bitmap;
|
||
|
}
|
||
|
else
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
inline Bitmap::Bitmap(GpBitmap *nativeBitmap)
|
||
|
{
|
||
|
SetNativeImage(nativeBitmap);
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Bitmap::LockBits(
|
||
|
IN const Rect& rect,
|
||
|
IN UINT flags,
|
||
|
IN PixelFormat format,
|
||
|
OUT BitmapData* lockedBitmapData
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipBitmapLockBits(
|
||
|
static_cast<GpBitmap*>(nativeImage),
|
||
|
&rect,
|
||
|
flags,
|
||
|
format,
|
||
|
lockedBitmapData));
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Bitmap::UnlockBits(
|
||
|
IN BitmapData* lockedBitmapData
|
||
|
)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipBitmapUnlockBits(
|
||
|
static_cast<GpBitmap*>(nativeImage),
|
||
|
lockedBitmapData));
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Bitmap::GetPixel(
|
||
|
IN INT x,
|
||
|
IN INT y,
|
||
|
OUT Color *color)
|
||
|
{
|
||
|
ARGB argb;
|
||
|
|
||
|
Status status = SetStatus(DllExports::GdipBitmapGetPixel(
|
||
|
static_cast<GpBitmap *>(nativeImage),
|
||
|
x, y,
|
||
|
&argb));
|
||
|
|
||
|
if (status == Ok)
|
||
|
{
|
||
|
color->SetValue(argb);
|
||
|
}
|
||
|
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Bitmap::SetPixel(
|
||
|
IN INT x,
|
||
|
IN INT y,
|
||
|
IN const Color& color)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipBitmapSetPixel(
|
||
|
static_cast<GpBitmap *>(nativeImage),
|
||
|
x, y,
|
||
|
color.GetValue()));
|
||
|
}
|
||
|
|
||
|
inline Status
|
||
|
Bitmap::SetResolution(
|
||
|
IN REAL xdpi,
|
||
|
IN REAL ydpi)
|
||
|
{
|
||
|
return SetStatus(DllExports::GdipBitmapSetResolution(
|
||
|
static_cast<GpBitmap *>(nativeImage),
|
||
|
xdpi, ydpi));
|
||
|
}
|
||
|
|
||
|
#endif
|