/* * gdiplusimpl.h * * GDI+ Bitmap, CachedBitmap, CustomLineCap, Font, FontCollection, FontFamily, * Image, InstalledFontCollection, PrivateFontCollection, Region * implementation. Definitions of these classes are in gdiplusheaders.h. * * This file is part of the w32api package. * * Contributors: * Created by Markus Koenig * * THIS SOFTWARE IS NOT COPYRIGHTED * * This source code is offered for use in the public domain. You may * use, modify or distribute it freely. * * This code is distributed in the hope that it will be useful but * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY * DISCLAIMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * */ #ifndef __GDIPLUS_IMPL_H #define __GDIPLUS_IMPL_H #if __GNUC__ >=3 #pragma GCC system_header #endif #ifndef __cplusplus #error "A C++ compiler is required to include gdiplusimpl.h." #endif /* * FIXME: I called this file gdiplusimpl.h, but what should it really be called? * Or did Microsoft create separate files for each class implemented here? */ // Image __inline__ Image* Image::FromFile(const WCHAR *filename, BOOL useEmbeddedColorManagement) { return new Image(filename, useEmbeddedColorManagement); } __inline__ Image* Image::FromStream(IStream *stream, BOOL useEmbeddedColorManagement) { return new Image(stream, useEmbeddedColorManagement); } __inline__ Image::Image(const WCHAR *filename, BOOL useEmbeddedColorManagement): nativeImage(NULL), lastStatus(Ok) { if (useEmbeddedColorManagement) { lastStatus = DllExports::GdipLoadImageFromFileICM( filename, &nativeImage); } else { lastStatus = DllExports::GdipLoadImageFromFile( filename, &nativeImage); } } __inline__ Image::Image(IStream *stream, BOOL useEmbeddedColorManagement): nativeImage(NULL), lastStatus(Ok) { if (useEmbeddedColorManagement) { lastStatus = DllExports::GdipLoadImageFromStreamICM( stream, &nativeImage); } else { lastStatus = DllExports::GdipLoadImageFromStream( stream, &nativeImage); } } __inline__ Status Image::FindFirstItem(ImageItemData *item) { // FIXME: can't test GdipFindFirstImageItem b/c it isn't exported in 1.0 return updateStatus(DllExports::GdipFindFirstImageItem( nativeImage, item)); } __inline__ Status Image::FindNextItem(ImageItemData *item) { // FIXME: can't test GdipFindFirstImageItem b/c it isn't exported in 1.0 return updateStatus(DllExports::GdipFindNextImageItem( nativeImage, item)); } __inline__ Status Image::GetAllPropertyItems(UINT totalBufferSize, UINT numProperties, PropertyItem *allItems) { return updateStatus(DllExports::GdipGetAllPropertyItems( nativeImage, totalBufferSize, numProperties, allItems)); } __inline__ Status Image::GetBounds(RectF *srcRect, Unit *srcUnit) { return updateStatus(DllExports::GdipGetImageBounds( nativeImage, srcRect, srcUnit)); } __inline__ Status Image::GetEncoderParameterList(const CLSID *clsidEncoder, UINT size, EncoderParameters *buffer) { return updateStatus(DllExports::GdipGetEncoderParameterList( nativeImage, clsidEncoder, size, buffer)); } __inline__ UINT Image::GetEncoderParameterListSize(const CLSID *clsidEncoder) { UINT result = 0; updateStatus(DllExports::GdipGetEncoderParameterListSize( nativeImage, clsidEncoder, &result)); return result; } __inline__ UINT Image::GetFlags() { UINT result = 0; updateStatus(DllExports::GdipGetImageFlags(nativeImage, &result)); return result; } __inline__ UINT Image::GetFrameCount(const GUID *dimensionID) { UINT result = 0; updateStatus(DllExports::GdipImageGetFrameCount( nativeImage, dimensionID, &result)); return result; } __inline__ UINT Image::GetFrameDimensionsCount() { UINT result = 0; updateStatus(DllExports::GdipImageGetFrameDimensionsCount( nativeImage, &result)); return result; } __inline__ Status Image::GetFrameDimensionsList(GUID *dimensionIDs, UINT count) { return updateStatus(DllExports::GdipImageGetFrameDimensionsList( nativeImage, dimensionIDs, count)); } __inline__ UINT Image::GetHeight() { UINT result = 0; updateStatus(DllExports::GdipGetImageHeight(nativeImage, &result)); return result; } __inline__ REAL Image::GetHorizontalResolution() { REAL result = 0.0f; updateStatus(DllExports::GdipGetImageHorizontalResolution( nativeImage, &result)); return result; } __inline__ Status Image::GetItemData(ImageItemData *item) { // FIXME: can't test GdipGetImageItemData b/c it isn't exported in 1.0 return updateStatus(DllExports::GdipGetImageItemData( nativeImage, item)); } __inline__ Status Image::GetPalette(ColorPalette *palette, INT size) { return updateStatus(DllExports::GdipGetImagePalette( nativeImage, palette, size)); } __inline__ INT Image::GetPaletteSize() { INT result = 0; updateStatus(DllExports::GdipGetImagePaletteSize(nativeImage, &result)); return result; } __inline__ Status Image::GetPhysicalDimension(SizeF *size) { if (!size) return lastStatus = InvalidParameter; return updateStatus(DllExports::GdipGetImageDimension( nativeImage, &size->Width, &size->Height)); } __inline__ PixelFormat Image::GetPixelFormat() { PixelFormat result = (PixelFormat) 0; updateStatus(DllExports::GdipGetImagePixelFormat(nativeImage, &result)); return result; } __inline__ UINT Image::GetPropertyCount() { UINT result = 0; updateStatus(DllExports::GdipGetPropertyCount(nativeImage, &result)); return result; } __inline__ Status Image::GetPropertyIdList(UINT numOfProperty, PROPID *list) { return updateStatus(DllExports::GdipGetPropertyIdList( nativeImage, numOfProperty, list)); } __inline__ Status Image::GetPropertyItem(PROPID propId, UINT propSize, PropertyItem *buffer) { return updateStatus(DllExports::GdipGetPropertyItem( nativeImage, propId, propSize, buffer)); } __inline__ UINT Image::GetPropertyItemSize(PROPID propId) { UINT result = 0; updateStatus(DllExports::GdipGetPropertyItemSize( nativeImage, propId, &result)); return result; } __inline__ Status Image::GetPropertySize( UINT *totalBufferSize, UINT *numProperties) { return updateStatus(DllExports::GdipGetPropertySize( nativeImage, totalBufferSize, numProperties)); } __inline__ Status Image::GetRawFormat(GUID *format) { return updateStatus(DllExports::GdipGetImageRawFormat( nativeImage, format)); } __inline__ Image* Image::GetThumbnailImage(UINT thumbWidth, UINT thumbHeight, GetThumbnailImageAbort callback, VOID *callbackData) { GpImage *thumbImage = NULL; Status status = updateStatus(DllExports::GdipGetImageThumbnail( nativeImage, thumbWidth, thumbHeight, &thumbImage, callback, callbackData)); if (status == Ok) { Image *result = new Image(thumbImage, Ok); if (!result) { DllExports::GdipDisposeImage(thumbImage); lastStatus = OutOfMemory; } return result; } else { return NULL; } } __inline__ ImageType Image::GetType() const { ImageType result = ImageTypeUnknown; updateStatus(DllExports::GdipGetImageType(nativeImage, &result)); return result; } __inline__ REAL Image::GetVerticalResolution() { REAL result = 0.0f; updateStatus(DllExports::GdipGetImageVerticalResolution( nativeImage, &result)); return result; } __inline__ UINT Image::GetWidth() { UINT result = 0; updateStatus(DllExports::GdipGetImageWidth(nativeImage, &result)); return result; } __inline__ Status Image::RemovePropertyItem(PROPID propId) { return updateStatus(DllExports::GdipRemovePropertyItem( nativeImage, propId)); } __inline__ Status Image::RotateFlip(RotateFlipType rotateFlipType) { return updateStatus(DllExports::GdipImageRotateFlip( nativeImage, rotateFlipType)); } __inline__ Status Image::Save(const WCHAR *filename, const CLSID *clsidEncoder, const EncoderParameters *encoderParams) { return updateStatus(DllExports::GdipSaveImageToFile( nativeImage, filename, clsidEncoder, encoderParams)); } __inline__ Status Image::Save(IStream *stream, const CLSID *clsidEncoder, const EncoderParameters *encoderParams) { return updateStatus(DllExports::GdipSaveImageToStream( nativeImage, stream, clsidEncoder, encoderParams)); } __inline__ Status Image::SaveAdd(const EncoderParameters *encoderParams) { return updateStatus(DllExports::GdipSaveAdd( nativeImage, encoderParams)); } __inline__ Status Image::SaveAdd(Image *newImage, const EncoderParameters *encoderParams) { return updateStatus(DllExports::GdipSaveAddImage( nativeImage, newImage ? newImage->nativeImage : NULL, encoderParams)); } __inline__ Status Image::SelectActiveFrame( const GUID *dimensionID, UINT frameIndex) { return updateStatus(DllExports::GdipImageSelectActiveFrame( nativeImage, dimensionID, frameIndex)); } __inline__ Status Image::SetAbort(GdiplusAbort *pIAbort) { // FIXME: can't test GdipImageSetAbort because it isn't exported in 1.0 return updateStatus(DllExports::GdipImageSetAbort( nativeImage, pIAbort)); } __inline__ Status Image::SetPalette(const ColorPalette *palette) { return updateStatus(DllExports::GdipSetImagePalette( nativeImage, palette)); } __inline__ Status Image::SetPropertyItem(const PropertyItem *item) { return updateStatus(DllExports::GdipSetPropertyItem(nativeImage, item)); } // Bitmap __inline__ Bitmap* Bitmap::FromBITMAPINFO(const BITMAPINFO *gdiBitmapInfo, VOID *gdiBitmapData) { return new Bitmap(gdiBitmapInfo, gdiBitmapData); } __inline__ Bitmap* Bitmap::FromDirectDrawSurface7(IDirectDrawSurface7 *surface) { return new Bitmap(surface); } __inline__ Bitmap* Bitmap::FromFile(const WCHAR *filename, BOOL useEmbeddedColorManagement) { return new Bitmap(filename, useEmbeddedColorManagement); } __inline__ Bitmap* Bitmap::FromHBITMAP(HBITMAP hbm, HPALETTE hpal) { return new Bitmap(hbm, hpal); } __inline__ Bitmap* Bitmap::FromHICON(HICON icon) { return new Bitmap(icon); } __inline__ Bitmap* Bitmap::FromResource( HINSTANCE hInstance, const WCHAR *bitmapName) { return new Bitmap(hInstance, bitmapName); } __inline__ Bitmap* Bitmap::FromStream(IStream *stream, BOOL useEmbeddedColorManagement) { return new Bitmap(stream, useEmbeddedColorManagement); } //TODO: [GDI+ 1.1] Bitmap::ApplyEffect //__inline__ Status Bitmap::ApplyEffect(Bitmap **inputs, INT numInputs, // Effect *effect, RECT *ROI, RECT *outputRect, Bitmap **output) //{ // return NotImplemented; //} __inline__ Status Bitmap::InitializePalette(ColorPalette *palette, PaletteType paletteType, INT optimalColors, BOOL useTransparentColor, Bitmap *bitmap) { // FIXME: can't test GdipInitializePalette b/c it isn't exported in 1.0 return DllExports::GdipInitializePalette(palette, paletteType, optimalColors, useTransparentColor, bitmap ? (GpBitmap*) bitmap->nativeImage : NULL); } __inline__ Bitmap::Bitmap(const BITMAPINFO *gdiBitmapInfo, VOID *gdiBitmapData): Image(NULL, Ok) { GpBitmap *nativeBitmap = NULL; lastStatus = DllExports::GdipCreateBitmapFromGdiDib( gdiBitmapInfo, gdiBitmapData, &nativeBitmap); nativeImage = nativeBitmap; } __inline__ Bitmap::Bitmap(IDirectDrawSurface7 *surface): Image(NULL, Ok) { GpBitmap *nativeBitmap = NULL; lastStatus = DllExports::GdipCreateBitmapFromDirectDrawSurface( surface, &nativeBitmap); nativeImage = nativeBitmap; } __inline__ Bitmap::Bitmap(const WCHAR *filename, BOOL useEmbeddedColorManagement): Image(NULL, Ok) { GpBitmap *nativeBitmap = NULL; if (useEmbeddedColorManagement) { lastStatus = DllExports::GdipCreateBitmapFromFileICM( filename, &nativeBitmap); } else { lastStatus = DllExports::GdipCreateBitmapFromFile( filename, &nativeBitmap); } nativeImage = nativeBitmap; } __inline__ Bitmap::Bitmap(HBITMAP hbm, HPALETTE hpal): Image(NULL, Ok) { GpBitmap *nativeBitmap = NULL; lastStatus = DllExports::GdipCreateBitmapFromHBITMAP( hbm, hpal, &nativeBitmap); nativeImage = nativeBitmap; } __inline__ Bitmap::Bitmap(HICON hicon): Image(NULL, Ok) { GpBitmap *nativeBitmap = NULL; lastStatus = DllExports::GdipCreateBitmapFromHICON(hicon, &nativeBitmap); nativeImage = nativeBitmap; } __inline__ Bitmap::Bitmap(HINSTANCE hInstance, const WCHAR *bitmapName): Image(NULL, Ok) { GpBitmap *nativeBitmap = NULL; lastStatus = DllExports::GdipCreateBitmapFromResource( hInstance, bitmapName, &nativeBitmap); nativeImage = nativeBitmap; } __inline__ Bitmap::Bitmap(IStream *stream, BOOL useEmbeddedColorManagement): Image(NULL, Ok) { GpBitmap *nativeBitmap = NULL; if (useEmbeddedColorManagement) { lastStatus = DllExports::GdipCreateBitmapFromStreamICM( stream, &nativeBitmap); } else { lastStatus = DllExports::GdipCreateBitmapFromStream( stream, &nativeBitmap); } nativeImage = nativeBitmap; } __inline__ Bitmap::Bitmap(INT width, INT height, Graphics *target): Image(NULL, Ok) { GpBitmap *nativeBitmap = NULL; lastStatus = DllExports::GdipCreateBitmapFromGraphics( width, height, target ? target->nativeGraphics : NULL, &nativeBitmap); nativeImage = nativeBitmap; } __inline__ Bitmap::Bitmap(INT width, INT height, PixelFormat format): Image(NULL, Ok) { GpBitmap *nativeBitmap = NULL; lastStatus = DllExports::GdipCreateBitmapFromScan0( width, height, 0, format, NULL, &nativeBitmap); nativeImage = nativeBitmap; } __inline__ Bitmap::Bitmap(INT width, INT height, INT stride, PixelFormat format, BYTE *scan0): Image(NULL, Ok) { GpBitmap *nativeBitmap = NULL; lastStatus = DllExports::GdipCreateBitmapFromScan0( width, height, stride, format, scan0, &nativeBitmap); nativeImage = nativeBitmap; } __inline__ Bitmap* Bitmap::Clone(const RectF& rect, PixelFormat format) const { return Clone(rect.X, rect.Y, rect.Width, rect.Height, format); } __inline__ Bitmap* Bitmap::Clone(const Rect& rect, PixelFormat format) const { return Clone(rect.X, rect.Y, rect.Width, rect.Height, format); } __inline__ Bitmap* Bitmap::Clone(REAL x, REAL y, REAL width, REAL height, PixelFormat format) const { GpBitmap *cloneBitmap = NULL; Status status = updateStatus(DllExports::GdipCloneBitmapArea( x, y, width, height, format, (GpBitmap*) nativeImage, &cloneBitmap)); if (status == Ok) { Bitmap *result = new Bitmap(cloneBitmap, lastStatus); if (!result) { DllExports::GdipDisposeImage(cloneBitmap); lastStatus = OutOfMemory; } return result; } else { return NULL; } } __inline__ Bitmap* Bitmap::Clone(INT x, INT y, INT width, INT height, PixelFormat format) const { GpBitmap *cloneBitmap = NULL; Status status = updateStatus(DllExports::GdipCloneBitmapAreaI( x, y, width, height, format, (GpBitmap*) nativeImage, &cloneBitmap)); if (status == Ok) { Bitmap *result = new Bitmap(cloneBitmap, lastStatus); if (!result) { DllExports::GdipDisposeImage(cloneBitmap); lastStatus = OutOfMemory; } return result; } else { return NULL; } } //TODO: [GDI+ 1.1] Bitmap::ApplyEffect //__inline__ Status Bitmap::ApplyEffect(Effect *effect, RECT *ROI) //{ // return NotImplemented; //} __inline__ Status Bitmap::ConvertFormat(PixelFormat format, DitherType ditherType, PaletteType paletteType, ColorPalette *palette, REAL alphaThresholdPercent) { // FIXME: can't test GdipBitmapConvertFormat b/c it isn't exported in 1.0 return updateStatus(DllExports::GdipBitmapConvertFormat( (GpBitmap*) nativeImage, format, ditherType, paletteType, palette, alphaThresholdPercent)); } __inline__ Status Bitmap::GetHBITMAP( const Color& colorBackground, HBITMAP *hbmReturn) const { return updateStatus(DllExports::GdipCreateHBITMAPFromBitmap( (GpBitmap*) nativeImage, hbmReturn, colorBackground.GetValue())); } __inline__ Status Bitmap::GetHICON(HICON *icon) const { return updateStatus(DllExports::GdipCreateHICONFromBitmap( (GpBitmap*) nativeImage, icon)); } __inline__ Status Bitmap::GetHistogram(HistogramFormat format, UINT numberOfEntries, UINT *channel0, UINT *channel1, UINT *channel2, UINT *channel3) const { return updateStatus(DllExports::GdipBitmapGetHistogram( (GpBitmap*) nativeImage, format, numberOfEntries, channel0, channel1, channel2, channel3)); } __inline__ Status Bitmap::GetHistogramSize(HistogramFormat format, UINT *numberOfEntries) const { return updateStatus(DllExports::GdipBitmapGetHistogramSize( format, numberOfEntries)); } __inline__ Status Bitmap::GetPixel(INT x, INT y, Color *color) const { return updateStatus(DllExports::GdipBitmapGetPixel( (GpBitmap*) nativeImage, x, y, color ? &color->Value : NULL)); } __inline__ Status Bitmap::LockBits(const Rect *rect, UINT flags, PixelFormat format, BitmapData *lockedBitmapData) { return updateStatus(DllExports::GdipBitmapLockBits( (GpBitmap*) nativeImage, rect, flags, format, lockedBitmapData)); } __inline__ Status Bitmap::SetPixel(INT x, INT y, const Color& color) { return updateStatus(DllExports::GdipBitmapSetPixel( (GpBitmap*) nativeImage, x, y, color.GetValue())); } __inline__ Status Bitmap::SetResolution(REAL xdpi, REAL ydpi) { return updateStatus(DllExports::GdipBitmapSetResolution( (GpBitmap*) nativeImage, xdpi, ydpi)); } __inline__ Status Bitmap::UnlockBits(BitmapData *lockedBitmapData) { return updateStatus(DllExports::GdipBitmapUnlockBits( (GpBitmap*) nativeImage, lockedBitmapData)); } // CachedBitmap __inline__ CachedBitmap::CachedBitmap(Bitmap *bitmap, Graphics *graphics): nativeCachedBitmap(NULL), lastStatus(Ok) { lastStatus = DllExports::GdipCreateCachedBitmap( bitmap ? ((GpBitmap*) bitmap->nativeImage) : NULL, graphics ? graphics->nativeGraphics : NULL, &nativeCachedBitmap); } __inline__ CachedBitmap::~CachedBitmap() { DllExports::GdipDeleteCachedBitmap(nativeCachedBitmap); } // CustomLineCap __inline__ CustomLineCap::CustomLineCap( const GraphicsPath *fillPath, const GraphicsPath *strokePath, LineCap baseCap, REAL baseInset): nativeCustomLineCap(NULL), lastStatus(Ok) { lastStatus = DllExports::GdipCreateCustomLineCap( fillPath ? fillPath->nativePath : NULL, strokePath ? strokePath->nativePath : NULL, baseCap, baseInset, &nativeCustomLineCap); } __inline__ LineCap CustomLineCap::GetBaseCap() const { LineCap result = LineCapFlat; updateStatus(DllExports::GdipGetCustomLineCapBaseCap( nativeCustomLineCap, &result)); return result; } __inline__ REAL CustomLineCap::GetBaseInset() const { REAL result = 0.0f; updateStatus(DllExports::GdipGetCustomLineCapBaseInset( nativeCustomLineCap, &result)); return result; } __inline__ Status CustomLineCap::GetStrokeCaps(LineCap *startCap, LineCap *endCap) const { return updateStatus(DllExports::GdipGetCustomLineCapStrokeCaps( nativeCustomLineCap, startCap, endCap)); } __inline__ LineJoin CustomLineCap::GetStrokeJoin() const { LineJoin result = LineJoinMiter; updateStatus(DllExports::GdipGetCustomLineCapStrokeJoin( nativeCustomLineCap, &result)); return result; } __inline__ REAL CustomLineCap::GetWidthScale() const { REAL result = 0.0f; updateStatus(DllExports::GdipGetCustomLineCapWidthScale( nativeCustomLineCap, &result)); return result; } __inline__ Status CustomLineCap::SetBaseCap(LineCap baseCap) { return updateStatus(DllExports::GdipSetCustomLineCapBaseCap( nativeCustomLineCap, baseCap)); } __inline__ Status CustomLineCap::SetBaseInset(REAL inset) { return updateStatus(DllExports::GdipSetCustomLineCapBaseInset( nativeCustomLineCap, inset)); } __inline__ Status CustomLineCap::SetStrokeCap(LineCap strokeCap) { return updateStatus(DllExports::GdipSetCustomLineCapStrokeCaps( nativeCustomLineCap, strokeCap, strokeCap)); } __inline__ Status CustomLineCap::SetStrokeCaps(LineCap startCap, LineCap endCap) { return updateStatus(DllExports::GdipSetCustomLineCapStrokeCaps( nativeCustomLineCap, startCap, endCap)); } __inline__ Status CustomLineCap::SetStrokeJoin(LineJoin lineJoin) { return updateStatus(DllExports::GdipSetCustomLineCapStrokeJoin( nativeCustomLineCap, lineJoin)); } __inline__ Status CustomLineCap::SetWidthScale(REAL widthScale) { return updateStatus(DllExports::GdipSetCustomLineCapWidthScale( nativeCustomLineCap, widthScale)); } // Font __inline__ Font::Font(const FontFamily *family, REAL emSize, INT style, Unit unit): nativeFont(NULL), lastStatus(Ok) { lastStatus = DllExports::GdipCreateFont( family ? family->nativeFontFamily : NULL, emSize, style, unit, &nativeFont); } __inline__ Font::Font(HDC hdc, HFONT hfont): nativeFont(NULL), lastStatus(Ok) { LOGFONTA logfont; if (hfont && GetObjectA(hfont, sizeof logfont, &logfont)) { lastStatus = DllExports::GdipCreateFontFromLogfontA( hdc, &logfont, &nativeFont); } else { lastStatus = DllExports::GdipCreateFontFromDC( hdc, &nativeFont); } } __inline__ Font::Font(HDC hdc, const LOGFONTA *logfont): nativeFont(NULL), lastStatus(Ok) { lastStatus = DllExports::GdipCreateFontFromLogfontA( hdc, logfont, &nativeFont); } __inline__ Font::Font(HDC hdc, const LOGFONTW *logfont): nativeFont(NULL), lastStatus(Ok) { lastStatus = DllExports::GdipCreateFontFromLogfontW( hdc, logfont, &nativeFont); } __inline__ Font::Font(HDC hdc): nativeFont(NULL), lastStatus(Ok) { lastStatus = DllExports::GdipCreateFontFromDC(hdc, &nativeFont); } __inline__ Font::Font(const WCHAR *familyName, REAL emSize, INT style, Unit unit, const FontCollection *fontCollection): nativeFont(NULL), lastStatus(Ok) { GpFontFamily *nativeFamily = NULL; lastStatus = DllExports::GdipCreateFontFamilyFromName( familyName, fontCollection ? fontCollection->nativeFontCollection : NULL, &nativeFamily); if (nativeFamily) { lastStatus = DllExports::GdipCreateFont( nativeFamily, emSize, style, unit, &nativeFont); DllExports::GdipDeleteFontFamily(nativeFamily); } } __inline__ Font::~Font() { DllExports::GdipDeleteFont(nativeFont); } __inline__ Font* Font::Clone() const { GpFont *cloneFont = NULL; Status status = updateStatus(DllExports::GdipCloneFont( nativeFont, &cloneFont)); if (status == Ok) { Font *result = new Font(cloneFont, lastStatus); if (!result) { DllExports::GdipDeleteFont(cloneFont); lastStatus = OutOfMemory; } return result; } else { return NULL; } } __inline__ Status Font::GetFamily(FontFamily *family) const { if (!family) return lastStatus = InvalidParameter; // FIXME: do we need to call GdipDeleteFontFamily first? return family->lastStatus = updateStatus(DllExports::GdipGetFamily( nativeFont, &family->nativeFontFamily)); } __inline__ REAL Font::GetHeight(const Graphics *graphics) const { REAL result = 0.0f; updateStatus(DllExports::GdipGetFontHeight( nativeFont, graphics ? graphics->nativeGraphics : NULL, &result)); return result; } __inline__ REAL Font::GetHeight(REAL dpi) const { REAL result = 0.0f; updateStatus(DllExports::GdipGetFontHeightGivenDPI( nativeFont, dpi, &result)); return result; } __inline__ Status Font::GetLogFontA(const Graphics *graphics, LOGFONTA *logfontA) const { return updateStatus(DllExports::GdipGetLogFontA( nativeFont, graphics ? graphics->nativeGraphics : NULL, logfontA)); } __inline__ Status Font::GetLogFontW(const Graphics *graphics, LOGFONTW *logfontW) const { return updateStatus(DllExports::GdipGetLogFontW( nativeFont, graphics ? graphics->nativeGraphics : NULL, logfontW)); } __inline__ REAL Font::GetSize() const { REAL result = 0.0; updateStatus(DllExports::GdipGetFontSize(nativeFont, &result)); return result; } __inline__ INT Font::GetStyle() const { INT result = FontStyleRegular; updateStatus(DllExports::GdipGetFontStyle(nativeFont, &result)); return result; } __inline__ Unit Font::GetUnit() const { Unit result = UnitPoint; updateStatus(DllExports::GdipGetFontUnit(nativeFont, &result)); return result; } // FontCollection __inline__ FontCollection::FontCollection(): nativeFontCollection(NULL), lastStatus(Ok) { } __inline__ Status FontCollection::GetFamilies(INT numSought, FontFamily *families, INT *numFound) const { if (numSought <= 0 || !families || !numFound) return lastStatus = InvalidParameter; for (int i = 0; i < numSought; ++i) { families[i].nativeFontFamily = NULL; families[i].lastStatus = FontFamilyNotFound; } *numFound = 0; GpFontFamily **nativeFamilyArray = (GpFontFamily**) DllExports::GdipAlloc(numSought * sizeof (GpFontFamily*)); if (!nativeFamilyArray) return lastStatus = OutOfMemory; Status status = updateStatus(DllExports::GdipGetFontCollectionFamilyList( nativeFontCollection, numSought, nativeFamilyArray, numFound)); // FIXME: must the native GpFontFamily objects be cloned? Seems so. // (if this is not done, the "Creating a Private Font Collection" // example crashes on "delete[] pFontFamily") if (status == Ok) { for (int i = 0; i < *numFound; ++i) { families[i].lastStatus = updateStatus(DllExports::GdipCloneFontFamily( nativeFamilyArray[i], &families[i].nativeFontFamily)); } } DllExports::GdipFree(nativeFamilyArray); return status; } __inline__ INT FontCollection::GetFamilyCount() const { INT result = 0; updateStatus(DllExports::GdipGetFontCollectionFamilyCount( nativeFontCollection, &result)); return result; } // FontFamily // FIXME: do FontFamily::GenericMonospace() et al. need to be thread safe? // FIXME: maybe put parts of this in gdiplus.c extern "C" void *_GdipFontFamilyCachedGenericMonospace; extern "C" void *_GdipFontFamilyCachedGenericSansSerif; extern "C" void *_GdipFontFamilyCachedGenericSerif; __inline__ const FontFamily* FontFamily::GenericMonospace() { if (!_GdipFontFamilyCachedGenericMonospace) { GpFontFamily *nativeFontFamily = 0; Status status = DllExports::GdipGetGenericFontFamilyMonospace( &nativeFontFamily); if (status == Ok && nativeFontFamily) { _GdipFontFamilyCachedGenericMonospace = (void*) new FontFamily(nativeFontFamily, Ok); } } return (FontFamily*) _GdipFontFamilyCachedGenericMonospace; } __inline__ const FontFamily* FontFamily::GenericSansSerif() { if (!_GdipFontFamilyCachedGenericSansSerif) { GpFontFamily *nativeFontFamily = 0; Status status = DllExports::GdipGetGenericFontFamilySansSerif( &nativeFontFamily); if (status == Ok && nativeFontFamily) { _GdipFontFamilyCachedGenericSansSerif = (void*) new FontFamily(nativeFontFamily, Ok); } } return (FontFamily*) _GdipFontFamilyCachedGenericSansSerif; } __inline__ const FontFamily* FontFamily::GenericSerif() { if (!_GdipFontFamilyCachedGenericSerif) { GpFontFamily *nativeFontFamily = 0; Status status = DllExports::GdipGetGenericFontFamilySerif( &nativeFontFamily); if (status == Ok && nativeFontFamily) { _GdipFontFamilyCachedGenericSerif = (void*) new FontFamily(nativeFontFamily, Ok); } } return (FontFamily*) _GdipFontFamilyCachedGenericSerif; } __inline__ FontFamily::FontFamily(): nativeFontFamily(NULL), lastStatus(Ok) { } __inline__ FontFamily::FontFamily(const WCHAR *name, const FontCollection *fontCollection): nativeFontFamily(NULL), lastStatus(Ok) { lastStatus = DllExports::GdipCreateFontFamilyFromName(name, fontCollection ? fontCollection->nativeFontCollection : NULL, &nativeFontFamily); } __inline__ FontFamily::~FontFamily() { DllExports::GdipDeleteFontFamily(nativeFontFamily); } __inline__ FontFamily* FontFamily::Clone() const { GpFontFamily *cloneFontFamily = NULL; Status status = updateStatus(DllExports::GdipCloneFontFamily( nativeFontFamily, &cloneFontFamily)); if (status == Ok) { FontFamily *result = new FontFamily(cloneFontFamily, lastStatus); if (!result) { DllExports::GdipDeleteFontFamily(cloneFontFamily); lastStatus = OutOfMemory; } return result; } else { return NULL; } } __inline__ UINT16 FontFamily::GetCellAscent(INT style) const { UINT16 result = 0; updateStatus(DllExports::GdipGetCellAscent( nativeFontFamily, style, &result)); return result; } __inline__ UINT16 FontFamily::GetCellDescent(INT style) const { UINT16 result = 0; updateStatus(DllExports::GdipGetCellDescent( nativeFontFamily, style, &result)); return result; } __inline__ UINT16 FontFamily::GetEmHeight(INT style) const { UINT16 result = 0; updateStatus(DllExports::GdipGetEmHeight( nativeFontFamily, style, &result)); return result; } __inline__ Status FontFamily::GetFamilyName(WCHAR name[LF_FACESIZE], LANGID language) const { return updateStatus(DllExports::GdipGetFamilyName( nativeFontFamily, name, language)); } __inline__ UINT16 FontFamily::GetLineSpacing(INT style) const { UINT16 result = 0; updateStatus(DllExports::GdipGetLineSpacing( nativeFontFamily, style, &result)); return result; } __inline__ BOOL FontFamily::IsStyleAvailable(INT style) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsStyleAvailable( nativeFontFamily, style, &result)); return result; } // InstalledFontCollection __inline__ InstalledFontCollection::InstalledFontCollection() { lastStatus = DllExports::GdipNewInstalledFontCollection( &nativeFontCollection); } // PrivateFontCollection __inline__ PrivateFontCollection::PrivateFontCollection() { lastStatus = DllExports::GdipNewPrivateFontCollection( &nativeFontCollection); } __inline__ Status PrivateFontCollection::AddFontFile(const WCHAR *filename) { return updateStatus(DllExports::GdipPrivateAddFontFile( nativeFontCollection, filename)); } __inline__ Status PrivateFontCollection::AddMemoryFont( const VOID *memory, INT length) { return updateStatus(DllExports::GdipPrivateAddMemoryFont( nativeFontCollection, memory, length)); } // Region __inline__ Region* Region::FromHRGN(HRGN hrgn) { return new Region(hrgn); } __inline__ Region::Region(): nativeRegion(NULL), lastStatus(Ok) { lastStatus = DllExports::GdipCreateRegion(&nativeRegion); } __inline__ Region::Region(const RectF& rect): nativeRegion(NULL), lastStatus(Ok) { lastStatus = DllExports::GdipCreateRegionRect(&rect, &nativeRegion); } __inline__ Region::Region(const Rect& rect): nativeRegion(NULL), lastStatus(Ok) { lastStatus = DllExports::GdipCreateRegionRectI(&rect, &nativeRegion); } __inline__ Region::Region(const GraphicsPath *path): nativeRegion(NULL), lastStatus(Ok) { lastStatus = DllExports::GdipCreateRegionPath( path ? path->nativePath : NULL, &nativeRegion); } __inline__ Region::Region(const BYTE *regionData, INT size): nativeRegion(NULL), lastStatus(Ok) { lastStatus = DllExports::GdipCreateRegionRgnData( regionData, size, &nativeRegion); } __inline__ Region::Region(HRGN hrgn): nativeRegion(NULL), lastStatus(Ok) { lastStatus = DllExports::GdipCreateRegionHrgn(hrgn, &nativeRegion); } __inline__ Region::~Region() { DllExports::GdipDeleteRegion(nativeRegion); } __inline__ Region* Region::Clone() const { GpRegion *cloneRegion = NULL; Status status = updateStatus(DllExports::GdipCloneRegion( nativeRegion, &cloneRegion)); if (status == Ok) { Region *result = new Region(cloneRegion, lastStatus); if (!result) { DllExports::GdipDeleteRegion(cloneRegion); lastStatus = OutOfMemory; } return result; } else { return NULL; } } __inline__ Status Region::Complement(const RectF& rect) { return updateStatus(DllExports::GdipCombineRegionRect( nativeRegion, &rect, CombineModeComplement)); } __inline__ Status Region::Complement(const Rect& rect) { return updateStatus(DllExports::GdipCombineRegionRectI( nativeRegion, &rect, CombineModeComplement)); } __inline__ Status Region::Complement(const Region *region) { return updateStatus(DllExports::GdipCombineRegionRegion( nativeRegion, region ? region->nativeRegion : NULL, CombineModeComplement)); } __inline__ Status Region::Complement(const GraphicsPath *path) { return updateStatus(DllExports::GdipCombineRegionPath( nativeRegion, path ? path->nativePath : NULL, CombineModeComplement)); } __inline__ BOOL Region::Equals(const Region *region, const Graphics *graphics) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsEqualRegion( nativeRegion, region ? region->nativeRegion : NULL, graphics ? graphics->nativeGraphics : NULL, &result)); return result; } __inline__ Status Region::Exclude(const RectF& rect) { return updateStatus(DllExports::GdipCombineRegionRect( nativeRegion, &rect, CombineModeExclude)); } __inline__ Status Region::Exclude(const Rect& rect) { return updateStatus(DllExports::GdipCombineRegionRectI( nativeRegion, &rect, CombineModeExclude)); } __inline__ Status Region::Exclude(const Region *region) { return updateStatus(DllExports::GdipCombineRegionRegion( nativeRegion, region ? region->nativeRegion : NULL, CombineModeExclude)); } __inline__ Status Region::Exclude(const GraphicsPath *path) { return updateStatus(DllExports::GdipCombineRegionPath( nativeRegion, path ? path->nativePath : NULL, CombineModeExclude)); } __inline__ Status Region::GetBounds(RectF *rect, const Graphics *graphics) const { return updateStatus(DllExports::GdipGetRegionBounds(nativeRegion, graphics ? graphics->nativeGraphics : NULL, rect)); } __inline__ Status Region::GetBounds(Rect *rect, const Graphics *graphics) const { return updateStatus(DllExports::GdipGetRegionBoundsI(nativeRegion, graphics ? graphics->nativeGraphics : NULL, rect)); } __inline__ Status Region::GetData(BYTE *buffer, UINT bufferSize, UINT *sizeFilled) const { return updateStatus(DllExports::GdipGetRegionData( nativeRegion, buffer, bufferSize, sizeFilled)); } __inline__ UINT Region::GetDataSize() const { UINT result = 0; updateStatus(DllExports::GdipGetRegionDataSize(nativeRegion, &result)); return result; } __inline__ HRGN Region::GetHRGN(const Graphics *graphics) const { HRGN result = NULL; updateStatus(DllExports::GdipGetRegionHRgn(nativeRegion, graphics ? graphics->nativeGraphics : NULL, &result)); return result; } __inline__ Status Region::GetRegionScans(const Matrix *matrix, RectF *rects, INT *count) const { return updateStatus(DllExports::GdipGetRegionScans( nativeRegion, rects, count, matrix ? matrix->nativeMatrix : NULL)); } __inline__ Status Region::GetRegionScans(const Matrix *matrix, Rect *rects, INT *count) const { return updateStatus(DllExports::GdipGetRegionScansI( nativeRegion, rects, count, matrix ? matrix->nativeMatrix : NULL)); } __inline__ UINT Region::GetRegionScansCount(const Matrix *matrix) const { UINT result = 0; updateStatus(DllExports::GdipGetRegionScansCount( nativeRegion, &result, matrix ? matrix->nativeMatrix : NULL)); return result; } __inline__ Status Region::Intersect(const RectF& rect) { return updateStatus(DllExports::GdipCombineRegionRect( nativeRegion, &rect, CombineModeIntersect)); } __inline__ Status Region::Intersect(const Rect& rect) { return updateStatus(DllExports::GdipCombineRegionRectI( nativeRegion, &rect, CombineModeIntersect)); } __inline__ Status Region::Intersect(const Region *region) { return updateStatus(DllExports::GdipCombineRegionRegion( nativeRegion, region ? region->nativeRegion : NULL, CombineModeIntersect)); } __inline__ Status Region::Intersect(const GraphicsPath *path) { return updateStatus(DllExports::GdipCombineRegionPath( nativeRegion, path ? path->nativePath : NULL, CombineModeIntersect)); } __inline__ BOOL Region::IsEmpty(const Graphics *graphics) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsEmptyRegion(nativeRegion, graphics ? graphics->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL Region::IsInfinite(const Graphics *graphics) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsInfiniteRegion(nativeRegion, graphics ? graphics->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL Region::IsVisible(REAL x, REAL y, const Graphics *graphics) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsVisibleRegionPoint( nativeRegion, x, y, graphics ? graphics->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL Region::IsVisible(INT x, INT y, const Graphics *graphics) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsVisibleRegionPointI( nativeRegion, x, y, graphics ? graphics->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL Region::IsVisible(const PointF& point, const Graphics *graphics) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsVisibleRegionPoint( nativeRegion, point.X, point.Y, graphics ? graphics->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL Region::IsVisible(const Point& point, const Graphics *graphics) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsVisibleRegionPointI( nativeRegion, point.X, point.Y, graphics ? graphics->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL Region::IsVisible(REAL x, REAL y, REAL width, REAL height, const Graphics *graphics) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsVisibleRegionRect( nativeRegion, x, y, width, height, graphics ? graphics->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL Region::IsVisible(INT x, INT y, INT width, INT height, const Graphics *graphics) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsVisibleRegionRectI( nativeRegion, x, y, width, height, graphics ? graphics->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL Region::IsVisible(const RectF& rect, const Graphics *graphics) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsVisibleRegionRect( nativeRegion, rect.X, rect.Y, rect.Width, rect.Height, graphics ? graphics->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL Region::IsVisible(const Rect& rect, const Graphics *graphics) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsVisibleRegionRectI( nativeRegion, rect.X, rect.Y, rect.Width, rect.Height, graphics ? graphics->nativeGraphics : NULL, &result)); return result; } __inline__ Status Region::MakeEmpty() { return updateStatus(DllExports::GdipSetEmpty(nativeRegion)); } __inline__ Status Region::MakeInfinite() { return updateStatus(DllExports::GdipSetInfinite(nativeRegion)); } __inline__ Status Region::Transform(const Matrix *matrix) { return updateStatus(DllExports::GdipTransformRegion( nativeRegion, matrix ? matrix->nativeMatrix : NULL)); } __inline__ Status Region::Translate(REAL dx, REAL dy) { return updateStatus(DllExports::GdipTranslateRegion( nativeRegion, dx, dy)); } __inline__ Status Region::Translate(INT dx, INT dy) { return updateStatus(DllExports::GdipTranslateRegionI( nativeRegion, dx, dy)); } __inline__ Status Region::Union(const RectF& rect) { return updateStatus(DllExports::GdipCombineRegionRect( nativeRegion, &rect, CombineModeUnion)); } __inline__ Status Region::Union(const Rect& rect) { return updateStatus(DllExports::GdipCombineRegionRectI( nativeRegion, &rect, CombineModeUnion)); } __inline__ Status Region::Union(const Region *region) { return updateStatus(DllExports::GdipCombineRegionRegion( nativeRegion, region ? region->nativeRegion : NULL, CombineModeUnion)); } __inline__ Status Region::Union(const GraphicsPath *path) { return updateStatus(DllExports::GdipCombineRegionPath( nativeRegion, path ? path->nativePath : NULL, CombineModeUnion)); } __inline__ Status Region::Xor(const RectF& rect) { return updateStatus(DllExports::GdipCombineRegionRect( nativeRegion, &rect, CombineModeXor)); } __inline__ Status Region::Xor(const Rect& rect) { return updateStatus(DllExports::GdipCombineRegionRectI( nativeRegion, &rect, CombineModeXor)); } __inline__ Status Region::Xor(const Region *region) { return updateStatus(DllExports::GdipCombineRegionRegion( nativeRegion, region ? region->nativeRegion : NULL, CombineModeXor)); } __inline__ Status Region::Xor(const GraphicsPath *path) { return updateStatus(DllExports::GdipCombineRegionPath( nativeRegion, path ? path->nativePath : NULL, CombineModeXor)); } // GraphicsPath __inline__ BOOL GraphicsPath::IsOutlineVisible(REAL x, REAL y, const Pen *pen, const Graphics *g) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsOutlineVisiblePathPoint( nativePath, x, y, pen ? pen->nativePen : NULL, g ? g->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL GraphicsPath::IsOutlineVisible(INT x, INT y, const Pen *pen, const Graphics *g) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsOutlineVisiblePathPointI( nativePath, x, y, pen ? pen->nativePen : NULL, g ? g->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL GraphicsPath::IsOutlineVisible(const PointF& point, const Pen *pen, const Graphics *g) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsOutlineVisiblePathPoint( nativePath, point.X, point.Y, pen ? pen->nativePen : NULL, g ? g->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL GraphicsPath::IsOutlineVisible(const Point& point, const Pen *pen, const Graphics *g) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsOutlineVisiblePathPointI( nativePath, point.X, point.Y, pen ? pen->nativePen : NULL, g ? g->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL GraphicsPath::IsVisible(REAL x, REAL y, const Graphics *g) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsVisiblePathPoint( nativePath, x, y, g ? g->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL GraphicsPath::IsVisible(INT x, INT y, const Graphics *g) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsVisiblePathPointI( nativePath, x, y, g ? g->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL GraphicsPath::IsVisible(const PointF& point, const Graphics *g) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsVisiblePathPoint( nativePath, point.X, point.Y, g ? g->nativeGraphics : NULL, &result)); return result; } __inline__ BOOL GraphicsPath::IsVisible(const Point& point, const Graphics *g) const { BOOL result = FALSE; updateStatus(DllExports::GdipIsVisiblePathPointI( nativePath, point.X, point.Y, g ? g->nativeGraphics : NULL, &result)); return result; } // PathData __inline__ Status PathData::AllocateArrays(INT capacity) { if (capacity < 0) { return InvalidParameter; } else if (Count < capacity) { FreeArrays(); PointF *pointArray = (PointF*) DllExports::GdipAlloc(capacity * sizeof(PointF)); if (!pointArray) return OutOfMemory; BYTE *typeArray = (BYTE*) DllExports::GdipAlloc(capacity * sizeof(BYTE)); if (!typeArray) { DllExports::GdipFree(pointArray); return OutOfMemory; } Count = capacity; Points = pointArray; Types = typeArray; } return Ok; } __inline__ VOID PathData::FreeArrays() { if (Points) DllExports::GdipFree(Points); if (Types) DllExports::GdipFree(Types); Count = 0; Points = NULL; Types = NULL; } #endif /* __GDIPLUS_IMPL_H */