Naveen Neel / shedskin
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers gdiplusheaders.h Source File

gdiplusheaders.h

00001 /*
00002  * gdiplusheaders.h
00003  *
00004  * GDI+ Bitmap, CachedBitmap, CustomLineCap, Font, FontCollection,
00005  *      FontFamily, Image, InstalledFontCollection, PrivateFontCollection,
00006  *      Region class definitions.
00007  *      Implementation of these classes is in gdiplusimpl.h.
00008  *
00009  * This file is part of the w32api package.
00010  *
00011  * Contributors:
00012  *   Created by Markus Koenig <markus@stber-koenig.de>
00013  *
00014  * THIS SOFTWARE IS NOT COPYRIGHTED
00015  *
00016  * This source code is offered for use in the public domain. You may
00017  * use, modify or distribute it freely.
00018  *
00019  * This code is distributed in the hope that it will be useful but
00020  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
00021  * DISCLAIMED. This includes but is not limited to warranties of
00022  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00023  *
00024  */
00025 
00026 #ifndef __GDIPLUS_HEADERS_H
00027 #define __GDIPLUS_HEADERS_H
00028 #if __GNUC__ >=3
00029 #pragma GCC system_header
00030 #endif
00031 
00032 #ifndef __cplusplus
00033 #error "A C++ compiler is required to include gdiplusheaders.h."
00034 #endif
00035 
00036 /*
00037  * Note: Virtual inline functions (dtors, Clone()) are implemented here: If
00038  * these were defined outside class scope, the compiler would always generate
00039  * code for them (and the vtable), even if these classes were never used.
00040  */
00041 
00042 class Bitmap;
00043 class Effect;
00044 class FontCollection;
00045 class FontFamily;
00046 class Graphics;
00047 class GraphicsPath;
00048 class Matrix;
00049 class Pen;
00050 
00051 class Image: public GdiplusBase
00052 {
00053     friend class Bitmap;
00054     friend class Metafile;
00055     friend class CachedBitmap;
00056     friend class Graphics;
00057     friend class TextureBrush;
00058 
00059 public:
00060     static Image* FromFile(const WCHAR *filename,
00061             BOOL useEmbeddedColorManagement = FALSE);
00062     static Image* FromStream(IStream *stream,
00063             BOOL useEmbeddedColorManagement = FALSE);
00064 
00065     Image(const WCHAR *filename, BOOL useEmbeddedColorManagement = FALSE);
00066     Image(IStream *stream, BOOL useEmbeddedColorManagement = FALSE);
00067 
00068     virtual ~Image()
00069     {
00070         DllExports::GdipDisposeImage(nativeImage);
00071     }
00072     virtual Image* Clone() const
00073     {
00074         GpImage *cloneImage = NULL;
00075         Status status = updateStatus(DllExports::GdipCloneImage(
00076                 nativeImage, &cloneImage));
00077         if (status == Ok) {
00078             Image *result = new Image(cloneImage, lastStatus);
00079             if (!result) {
00080                 DllExports::GdipDisposeImage(cloneImage);
00081                 lastStatus = OutOfMemory;
00082             }
00083             return result;
00084         } else {
00085             return NULL;
00086         }
00087     }
00088 
00089     Status FindFirstItem(ImageItemData *item);
00090     Status FindNextItem(ImageItemData *item);
00091     Status GetAllPropertyItems(UINT totalBufferSize,
00092             UINT numProperties, PropertyItem *allItems);
00093     Status GetBounds(RectF *srcRect, Unit *srcUnit);
00094     Status GetEncoderParameterList(const CLSID *clsidEncoder,
00095             UINT size, EncoderParameters *buffer);
00096     UINT GetEncoderParameterListSize(const CLSID *clsidEncoder);
00097     UINT GetFlags();
00098     UINT GetFrameCount(const GUID *dimensionID);
00099     UINT GetFrameDimensionsCount();
00100     Status GetFrameDimensionsList(GUID *dimensionIDs, UINT count);
00101     UINT GetHeight();
00102     REAL GetHorizontalResolution();
00103     Status GetItemData(ImageItemData *item);
00104     Status GetPalette(ColorPalette *palette, INT size);
00105     INT GetPaletteSize();
00106     Status GetPhysicalDimension(SizeF *size);
00107     PixelFormat GetPixelFormat();
00108     UINT GetPropertyCount();
00109     Status GetPropertyIdList(UINT numOfProperty, PROPID *list);
00110     Status GetPropertyItem(PROPID propId, UINT propSize,
00111             PropertyItem *buffer);
00112     UINT GetPropertyItemSize(PROPID propId);
00113     Status GetPropertySize(UINT *totalBufferSize, UINT *numProperties);
00114     Status GetRawFormat(GUID *format);
00115     Image* GetThumbnailImage(UINT thumbWidth, UINT thumbHeight,
00116             GetThumbnailImageAbort callback, VOID *callbackData);
00117     ImageType GetType() const;
00118     REAL GetVerticalResolution();
00119     UINT GetWidth();
00120     Status RemovePropertyItem(PROPID propId);
00121     Status RotateFlip(RotateFlipType rotateFlipType);
00122     Status Save(IStream *stream, const CLSID *clsidEncoder,
00123             const EncoderParameters *encoderParams);
00124     Status Save(const WCHAR *filename, const CLSID *clsidEncoder,
00125             const EncoderParameters *encoderParams);
00126     Status SaveAdd(const EncoderParameters *encoderParams);
00127     Status SaveAdd(Image *newImage, const EncoderParameters *encoderParams);
00128     Status SelectActiveFrame(const GUID *dimensionID, UINT frameIndex);
00129     Status SetAbort(GdiplusAbort *pIAbort);
00130     Status SetPalette(const ColorPalette *palette);
00131     Status SetPropertyItem(const PropertyItem *item);
00132 
00133     Status GetLastStatus() const
00134     {
00135         Status result = lastStatus;
00136         lastStatus = Ok;
00137         return result;
00138     }
00139 
00140 private:
00141     Image(GpImage *image, Status status):
00142         nativeImage(image), lastStatus(status) {}
00143     Image(const Image&);
00144     Image& operator=(const Image&);
00145 
00146     Status updateStatus(Status newStatus) const
00147     {
00148         if (newStatus != Ok) lastStatus = newStatus;
00149         return newStatus;
00150     }
00151 
00152     GpImage *nativeImage;
00153     mutable Status lastStatus;
00154 };
00155 
00156 class Bitmap: public Image
00157 {
00158 public:
00159     static Bitmap* FromBITMAPINFO(const BITMAPINFO *gdiBitmapInfo,
00160             VOID *gdiBitmapData);
00161     static Bitmap* FromDirectDrawSurface7(IDirectDrawSurface7 *surface);
00162     static Bitmap* FromFile(const WCHAR *filename,
00163             BOOL useEmbeddedColorManagement = FALSE);
00164     static Bitmap* FromHBITMAP(HBITMAP hbm, HPALETTE hpal);
00165     static Bitmap* FromHICON(HICON icon);
00166     static Bitmap* FromResource(HINSTANCE hInstance,
00167             const WCHAR *bitmapName);
00168     static Bitmap* FromStream(IStream *stream,
00169             BOOL useEmbeddedColorManagement = FALSE);
00170     static Status ApplyEffect(Bitmap **inputs, INT numInputs,
00171             Effect *effect, RECT *ROI,
00172             RECT *outputRect, Bitmap **output);
00173     static Status InitializePalette(ColorPalette *palette,
00174             PaletteType paletteType, INT optimalColors,
00175             BOOL useTransparentColor, Bitmap *bitmap);
00176 
00177     Bitmap(const BITMAPINFO *gdiBitmapInfo, VOID *gdiBitmapData);
00178     Bitmap(IDirectDrawSurface7 *surface);
00179     Bitmap(const WCHAR *filename, BOOL useEmbeddedColorManagement = FALSE);
00180     Bitmap(HBITMAP hbm, HPALETTE hpal);
00181     Bitmap(HICON hicon);
00182     Bitmap(HINSTANCE hInstance, const WCHAR *bitmapName);
00183     Bitmap(IStream *stream, BOOL useEmbeddedColorManagement = FALSE);
00184     Bitmap(INT width, INT height, Graphics *target);
00185     Bitmap(INT width, INT height, PixelFormat format = PixelFormat32bppARGB);
00186     Bitmap(INT width, INT height, INT stride, PixelFormat format, BYTE *scan0);
00187 
00188     virtual ~Bitmap()
00189     {
00190     }
00191     virtual Bitmap* Clone() const
00192     {
00193         GpImage *cloneImage = NULL;
00194         Status status = updateStatus(DllExports::GdipCloneImage(
00195                 nativeImage, &cloneImage));
00196         if (status == Ok) {
00197             Bitmap *result = new Bitmap(cloneImage, lastStatus);
00198             if (!result) {
00199                 DllExports::GdipDisposeImage(cloneImage);
00200                 lastStatus = OutOfMemory;
00201             }
00202             return result;
00203         } else {
00204             return NULL;
00205         }
00206     }
00207 
00208     Bitmap* Clone(const RectF& rect, PixelFormat format) const;
00209     Bitmap* Clone(const Rect& rect, PixelFormat format) const;
00210     Bitmap* Clone(REAL x, REAL y, REAL width, REAL height,
00211             PixelFormat format) const;
00212     Bitmap* Clone(INT x, INT y, INT width, INT height,
00213             PixelFormat format) const;
00214 
00215     Status ApplyEffect(Effect *effect, RECT *ROI);
00216     Status ConvertFormat(PixelFormat format, DitherType ditherType,
00217             PaletteType paletteType, ColorPalette *palette,
00218             REAL alphaThresholdPercent);
00219     Status GetHBITMAP(const Color& colorBackground, HBITMAP *hbmReturn) const;
00220     Status GetHICON(HICON *icon) const;
00221     Status GetHistogram(HistogramFormat format, UINT numberOfEntries,
00222             UINT *channel0, UINT *channel1,
00223             UINT *channel2, UINT *channel3) const;
00224     Status GetHistogramSize(HistogramFormat format,
00225             UINT *numberOfEntries) const;
00226     Status GetPixel(INT x, INT y, Color *color) const;
00227     Status LockBits(const Rect *rect, UINT flags, PixelFormat format,
00228             BitmapData *lockedBitmapData);
00229     Status SetPixel(INT x, INT y, const Color& color);
00230     Status SetResolution(REAL xdpi, REAL ydpi);
00231     Status UnlockBits(BitmapData *lcokedBitmapData);
00232 
00233 private:
00234     Bitmap(GpImage *image, Status status): Image(image, status) {}
00235     Bitmap(const Bitmap&);
00236     Bitmap& operator=(const Bitmap&);
00237 };
00238 
00239 class CachedBitmap: public GdiplusBase
00240 {
00241     friend class Graphics;
00242 
00243 public:
00244     CachedBitmap(Bitmap *bitmap, Graphics *graphics);
00245     ~CachedBitmap();
00246 
00247     Status GetLastStatus() const
00248     {
00249         return lastStatus;
00250     }
00251 
00252 private:
00253     CachedBitmap(const CachedBitmap&);
00254     CachedBitmap& operator=(const CachedBitmap&);
00255 
00256     GpCachedBitmap *nativeCachedBitmap;
00257     Status lastStatus;
00258 };
00259 
00260 class CustomLineCap: public GdiplusBase
00261 {
00262     friend class AdjustableArrowCap;
00263     friend class Pen;
00264 
00265 public:
00266     CustomLineCap(const GraphicsPath *fillPath,
00267             const GraphicsPath *strokePath,
00268             LineCap baseCap = LineCapFlat,
00269             REAL baseInset = 0.0f);
00270 
00271     virtual ~CustomLineCap()
00272     {
00273         DllExports::GdipDeleteCustomLineCap(nativeCustomLineCap);
00274     }
00275     virtual CustomLineCap* Clone() const
00276     {
00277         GpCustomLineCap *cloneCustomLineCap = NULL;
00278         Status status = updateStatus(DllExports::GdipCloneCustomLineCap(
00279                 nativeCustomLineCap, &cloneCustomLineCap));
00280         if (status == Ok) {
00281             CustomLineCap *result = new CustomLineCap(
00282                     cloneCustomLineCap, lastStatus);
00283             if (!result) {
00284                 DllExports::GdipDeleteCustomLineCap(cloneCustomLineCap);
00285                 lastStatus = OutOfMemory;
00286             }
00287             return result;
00288         } else {
00289             return NULL;
00290         }
00291     }
00292 
00293     LineCap GetBaseCap() const;
00294     REAL GetBaseInset() const;
00295     Status GetStrokeCaps(LineCap *startCap, LineCap *endCap) const;
00296     LineJoin GetStrokeJoin() const;
00297     REAL GetWidthScale() const;
00298     Status SetBaseCap(LineCap baseCap);
00299     Status SetBaseInset(REAL inset);
00300     Status SetStrokeCap(LineCap strokeCap);
00301     Status SetStrokeCaps(LineCap startCap, LineCap endCap);
00302     Status SetStrokeJoin(LineJoin lineJoin);
00303     Status SetWidthScale(REAL widthScale);
00304 
00305     Status GetLastStatus() const
00306     {
00307         Status result = lastStatus;
00308         lastStatus = Ok;
00309         return result;
00310     }
00311 
00312 private:
00313     CustomLineCap(GpCustomLineCap *customLineCap, Status status):
00314         nativeCustomLineCap(customLineCap), lastStatus(status) {}
00315     CustomLineCap(const CustomLineCap&);
00316     CustomLineCap& operator=(const CustomLineCap&);
00317 
00318     Status updateStatus(Status newStatus) const
00319     {
00320         if (newStatus != Ok) lastStatus = newStatus;
00321         return newStatus;
00322     }
00323 
00324     GpCustomLineCap *nativeCustomLineCap;
00325     mutable Status lastStatus;
00326 };
00327 
00328 class Font: public GdiplusBase
00329 {
00330     friend class Graphics;
00331 
00332 public:
00333     Font(const FontFamily *family, REAL emSize,
00334             INT style = FontStyleRegular,
00335             Unit unit = UnitPoint);
00336     Font(HDC hdc, HFONT hfont);
00337     Font(HDC hdc, const LOGFONTA *logfont);
00338     Font(HDC hdc, const LOGFONTW *logfont);
00339     Font(HDC hdc);
00340     Font(const WCHAR *familyName, REAL emSize,
00341             INT style = FontStyleRegular,
00342             Unit unit = UnitPoint,
00343             const FontCollection *fontCollection = NULL);
00344     ~Font();
00345     Font* Clone() const;
00346 
00347     Status GetFamily(FontFamily *family) const;
00348     REAL GetHeight(const Graphics *graphics) const;
00349     REAL GetHeight(REAL dpi) const;
00350     Status GetLogFontA(const Graphics *graphics, LOGFONTA *logfontA) const;
00351     Status GetLogFontW(const Graphics *graphics, LOGFONTW *logfontW) const;
00352     REAL GetSize() const;
00353     INT GetStyle() const;
00354     Unit GetUnit() const;
00355 
00356     Status GetLastStatus() const
00357     {
00358         return lastStatus;
00359     }
00360     BOOL IsAvailable() const
00361     {
00362         return nativeFont != NULL;
00363     }
00364 
00365 private:
00366     Font(GpFont *font, Status status):
00367         nativeFont(font), lastStatus(status) {}
00368     Font(const Font&);
00369     Font& operator=(const Font&);
00370 
00371     Status updateStatus(Status newStatus) const
00372     {
00373         if (newStatus != Ok) lastStatus = newStatus;
00374         return newStatus;
00375     }
00376 
00377     GpFont *nativeFont;
00378     mutable Status lastStatus;
00379 };
00380 
00381 class FontCollection: public GdiplusBase
00382 {
00383     friend class InstalledFontCollection;
00384     friend class PrivateFontCollection;
00385     friend class Font;
00386     friend class FontFamily;
00387 
00388 public:
00389     FontCollection();
00390     virtual ~FontCollection() {}
00391 
00392     Status GetFamilies(INT numSought, FontFamily *families,
00393             INT *numFound) const;
00394     INT GetFamilyCount() const;
00395 
00396     Status GetLastStatus() const
00397     {
00398         return lastStatus;
00399     }
00400 
00401 private:
00402     FontCollection(const FontCollection&);
00403     FontCollection& operator=(const FontCollection&);
00404 
00405     Status updateStatus(Status newStatus) const
00406     {
00407         return lastStatus = newStatus;
00408     }
00409 
00410     GpFontCollection *nativeFontCollection;
00411     mutable Status lastStatus;
00412 };
00413 
00414 class FontFamily: public GdiplusBase
00415 {
00416     friend class Font;
00417     friend class FontCollection;
00418     friend class GraphicsPath;
00419 
00420 public:
00421     static const FontFamily* GenericMonospace();
00422     static const FontFamily* GenericSansSerif();
00423     static const FontFamily* GenericSerif();
00424 
00425     FontFamily();
00426     FontFamily(const WCHAR *name,
00427             const FontCollection *fontCollection = NULL);
00428     ~FontFamily();
00429     FontFamily* Clone() const;
00430 
00431     UINT16 GetCellAscent(INT style) const;
00432     UINT16 GetCellDescent(INT style) const;
00433     UINT16 GetEmHeight(INT style) const;
00434     Status GetFamilyName(WCHAR name[LF_FACESIZE],
00435             LANGID language = LANG_NEUTRAL) const;
00436     UINT16 GetLineSpacing(INT style) const;
00437     BOOL IsStyleAvailable(INT style) const;
00438 
00439     Status GetLastStatus() const
00440     {
00441         Status result = lastStatus;
00442         lastStatus = Ok;
00443         return result;
00444     }
00445     BOOL IsAvailable() const
00446     {
00447         return nativeFontFamily != NULL;
00448     }
00449 
00450 private:
00451     FontFamily(GpFontFamily *fontFamily, Status status):
00452         nativeFontFamily(fontFamily), lastStatus(status) {}
00453     FontFamily(const FontFamily&);
00454     FontFamily& operator=(const FontFamily&);
00455 
00456     Status updateStatus(Status newStatus) const
00457     {
00458         if (newStatus != Ok) lastStatus = newStatus;
00459         return newStatus;
00460     }
00461 
00462     GpFontFamily *nativeFontFamily;
00463     mutable Status lastStatus;
00464 };
00465 
00466 class InstalledFontCollection: public FontCollection
00467 {
00468 public:
00469     InstalledFontCollection();
00470     virtual ~InstalledFontCollection() {}
00471 };
00472 
00473 class PrivateFontCollection: public FontCollection
00474 {
00475 public:
00476     PrivateFontCollection();
00477 
00478     virtual ~PrivateFontCollection()
00479     {
00480         DllExports::GdipDeletePrivateFontCollection(&nativeFontCollection);
00481     }
00482 
00483     Status AddFontFile(const WCHAR *filename);
00484     Status AddMemoryFont(const VOID *memory, INT length);
00485 };
00486 
00487 class Region: public GdiplusBase
00488 {
00489     friend class Graphics;
00490 
00491 public:
00492     static Region* FromHRGN(HRGN hrgn);
00493 
00494     Region();
00495     Region(const RectF& rect);
00496     Region(const Rect& rect);
00497     Region(const GraphicsPath *path);
00498     Region(const BYTE *regionData, INT size);
00499     Region(HRGN hrgn);
00500     ~Region();
00501     Region* Clone() const;
00502 
00503     Status Complement(const RectF& rect);
00504     Status Complement(const Rect& rect);
00505     Status Complement(const Region *region);
00506     Status Complement(const GraphicsPath *path);
00507     BOOL Equals(const Region *region, const Graphics *graphics) const;
00508     Status Exclude(const RectF& rect);
00509     Status Exclude(const Rect& rect);
00510     Status Exclude(const Region *region);
00511     Status Exclude(const GraphicsPath *path);
00512     Status GetBounds(RectF *rect, const Graphics *graphics) const;
00513     Status GetBounds(Rect *rect, const Graphics *graphics) const;
00514     Status GetData(BYTE *buffer, UINT bufferSize, UINT *sizeFilled) const;
00515     UINT GetDataSize() const;
00516     HRGN GetHRGN(const Graphics *graphics) const;
00517     Status GetRegionScans(const Matrix *matrix,
00518             RectF *rects, INT *count) const;
00519     Status GetRegionScans(const Matrix *matrix,
00520             Rect *rects, INT *count) const;
00521     UINT GetRegionScansCount(const Matrix *matrix) const;
00522     Status Intersect(const RectF& rect);
00523     Status Intersect(const Rect& rect);
00524     Status Intersect(const Region *region);
00525     Status Intersect(const GraphicsPath *path);
00526     BOOL IsEmpty(const Graphics *graphics) const;
00527     BOOL IsInfinite(const Graphics *graphics) const;
00528     BOOL IsVisible(REAL x, REAL y,
00529             const Graphics *graphics = NULL) const;
00530     BOOL IsVisible(INT x, INT y,
00531             const Graphics *graphics = NULL) const;
00532     BOOL IsVisible(const PointF& point,
00533             const Graphics *graphics = NULL) const;
00534     BOOL IsVisible(const Point& point,
00535             const Graphics *graphics = NULL) const;
00536     BOOL IsVisible(REAL x, REAL y, REAL width, REAL height,
00537             const Graphics *graphics = NULL) const;
00538     BOOL IsVisible(INT x, INT y, INT width, INT height,
00539             const Graphics *graphics = NULL) const;
00540     BOOL IsVisible(const RectF& rect,
00541             const Graphics *graphics = NULL) const;
00542     BOOL IsVisible(const Rect& rect,
00543             const Graphics *graphics = NULL) const;
00544     Status MakeEmpty();
00545     Status MakeInfinite();
00546     Status Transform(const Matrix *matrix);
00547     Status Translate(REAL dx, REAL dy);
00548     Status Translate(INT dx, INT dy);
00549     Status Union(const RectF& rect);
00550     Status Union(const Rect& rect);
00551     Status Union(const Region *region);
00552     Status Union(const GraphicsPath *path);
00553     Status Xor(const RectF& rect);
00554     Status Xor(const Rect& rect);
00555     Status Xor(const Region *region);
00556     Status Xor(const GraphicsPath *path);
00557 
00558     Status GetLastStatus() const
00559     {
00560         Status result = lastStatus;
00561         lastStatus = Ok;
00562         return result;
00563     }
00564 
00565 private:
00566     Region(GpRegion *region, Status status):
00567         nativeRegion(region), lastStatus(status) {}
00568     Region(const Region&);
00569     Region& operator=(const Region&);
00570 
00571     Status updateStatus(Status newStatus) const
00572     {
00573         if (newStatus != Ok) lastStatus = newStatus;
00574         return newStatus;
00575     }
00576 
00577     GpRegion *nativeRegion;
00578     mutable Status lastStatus;
00579 };
00580 
00581 #endif /* __GDIPLUS_HEADERS_H */