Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
gdiplusimpl.h
00001 /* 00002 * gdiplusimpl.h 00003 * 00004 * GDI+ Bitmap, CachedBitmap, CustomLineCap, Font, FontCollection, FontFamily, 00005 * Image, InstalledFontCollection, PrivateFontCollection, Region 00006 * implementation. Definitions of these classes are in gdiplusheaders.h. 00007 * 00008 * This file is part of the w32api package. 00009 * 00010 * Contributors: 00011 * Created by Markus Koenig <markus@stber-koenig.de> 00012 * 00013 * THIS SOFTWARE IS NOT COPYRIGHTED 00014 * 00015 * This source code is offered for use in the public domain. You may 00016 * use, modify or distribute it freely. 00017 * 00018 * This code is distributed in the hope that it will be useful but 00019 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY 00020 * DISCLAIMED. This includes but is not limited to warranties of 00021 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00022 * 00023 */ 00024 00025 #ifndef __GDIPLUS_IMPL_H 00026 #define __GDIPLUS_IMPL_H 00027 #if __GNUC__ >=3 00028 #pragma GCC system_header 00029 #endif 00030 00031 #ifndef __cplusplus 00032 #error "A C++ compiler is required to include gdiplusimpl.h." 00033 #endif 00034 00035 /* 00036 * FIXME: I called this file gdiplusimpl.h, but what should it really be called? 00037 * Or did Microsoft create separate files for each class implemented here? 00038 */ 00039 00040 00041 // Image 00042 00043 __inline__ Image* Image::FromFile(const WCHAR *filename, 00044 BOOL useEmbeddedColorManagement) 00045 { 00046 return new Image(filename, useEmbeddedColorManagement); 00047 } 00048 00049 __inline__ Image* Image::FromStream(IStream *stream, 00050 BOOL useEmbeddedColorManagement) 00051 { 00052 return new Image(stream, useEmbeddedColorManagement); 00053 } 00054 00055 __inline__ Image::Image(const WCHAR *filename, BOOL useEmbeddedColorManagement): 00056 nativeImage(NULL), lastStatus(Ok) 00057 { 00058 if (useEmbeddedColorManagement) { 00059 lastStatus = DllExports::GdipLoadImageFromFileICM( 00060 filename, &nativeImage); 00061 } else { 00062 lastStatus = DllExports::GdipLoadImageFromFile( 00063 filename, &nativeImage); 00064 } 00065 } 00066 00067 __inline__ Image::Image(IStream *stream, BOOL useEmbeddedColorManagement): 00068 nativeImage(NULL), lastStatus(Ok) 00069 { 00070 if (useEmbeddedColorManagement) { 00071 lastStatus = DllExports::GdipLoadImageFromStreamICM( 00072 stream, &nativeImage); 00073 } else { 00074 lastStatus = DllExports::GdipLoadImageFromStream( 00075 stream, &nativeImage); 00076 } 00077 } 00078 00079 __inline__ Status Image::FindFirstItem(ImageItemData *item) 00080 { 00081 // FIXME: can't test GdipFindFirstImageItem b/c it isn't exported in 1.0 00082 return updateStatus(DllExports::GdipFindFirstImageItem( 00083 nativeImage, item)); 00084 } 00085 00086 __inline__ Status Image::FindNextItem(ImageItemData *item) 00087 { 00088 // FIXME: can't test GdipFindFirstImageItem b/c it isn't exported in 1.0 00089 return updateStatus(DllExports::GdipFindNextImageItem( 00090 nativeImage, item)); 00091 } 00092 00093 __inline__ Status Image::GetAllPropertyItems(UINT totalBufferSize, 00094 UINT numProperties, PropertyItem *allItems) 00095 { 00096 return updateStatus(DllExports::GdipGetAllPropertyItems( 00097 nativeImage, totalBufferSize, numProperties, allItems)); 00098 } 00099 00100 __inline__ Status Image::GetBounds(RectF *srcRect, Unit *srcUnit) 00101 { 00102 return updateStatus(DllExports::GdipGetImageBounds( 00103 nativeImage, srcRect, srcUnit)); 00104 } 00105 00106 __inline__ Status Image::GetEncoderParameterList(const CLSID *clsidEncoder, 00107 UINT size, EncoderParameters *buffer) 00108 { 00109 return updateStatus(DllExports::GdipGetEncoderParameterList( 00110 nativeImage, clsidEncoder, size, buffer)); 00111 } 00112 00113 __inline__ UINT Image::GetEncoderParameterListSize(const CLSID *clsidEncoder) 00114 { 00115 UINT result = 0; 00116 updateStatus(DllExports::GdipGetEncoderParameterListSize( 00117 nativeImage, clsidEncoder, &result)); 00118 return result; 00119 } 00120 00121 __inline__ UINT Image::GetFlags() 00122 { 00123 UINT result = 0; 00124 updateStatus(DllExports::GdipGetImageFlags(nativeImage, &result)); 00125 return result; 00126 } 00127 00128 __inline__ UINT Image::GetFrameCount(const GUID *dimensionID) 00129 { 00130 UINT result = 0; 00131 updateStatus(DllExports::GdipImageGetFrameCount( 00132 nativeImage, dimensionID, &result)); 00133 return result; 00134 } 00135 00136 __inline__ UINT Image::GetFrameDimensionsCount() 00137 { 00138 UINT result = 0; 00139 updateStatus(DllExports::GdipImageGetFrameDimensionsCount( 00140 nativeImage, &result)); 00141 return result; 00142 } 00143 00144 __inline__ Status Image::GetFrameDimensionsList(GUID *dimensionIDs, UINT count) 00145 { 00146 return updateStatus(DllExports::GdipImageGetFrameDimensionsList( 00147 nativeImage, dimensionIDs, count)); 00148 } 00149 00150 __inline__ UINT Image::GetHeight() 00151 { 00152 UINT result = 0; 00153 updateStatus(DllExports::GdipGetImageHeight(nativeImage, &result)); 00154 return result; 00155 } 00156 00157 __inline__ REAL Image::GetHorizontalResolution() 00158 { 00159 REAL result = 0.0f; 00160 updateStatus(DllExports::GdipGetImageHorizontalResolution( 00161 nativeImage, &result)); 00162 return result; 00163 } 00164 00165 __inline__ Status Image::GetItemData(ImageItemData *item) 00166 { 00167 // FIXME: can't test GdipGetImageItemData b/c it isn't exported in 1.0 00168 return updateStatus(DllExports::GdipGetImageItemData( 00169 nativeImage, item)); 00170 } 00171 00172 __inline__ Status Image::GetPalette(ColorPalette *palette, INT size) 00173 { 00174 return updateStatus(DllExports::GdipGetImagePalette( 00175 nativeImage, palette, size)); 00176 } 00177 00178 __inline__ INT Image::GetPaletteSize() 00179 { 00180 INT result = 0; 00181 updateStatus(DllExports::GdipGetImagePaletteSize(nativeImage, &result)); 00182 return result; 00183 } 00184 00185 __inline__ Status Image::GetPhysicalDimension(SizeF *size) 00186 { 00187 if (!size) return lastStatus = InvalidParameter; 00188 return updateStatus(DllExports::GdipGetImageDimension( 00189 nativeImage, &size->Width, &size->Height)); 00190 } 00191 00192 __inline__ PixelFormat Image::GetPixelFormat() 00193 { 00194 PixelFormat result = (PixelFormat) 0; 00195 updateStatus(DllExports::GdipGetImagePixelFormat(nativeImage, &result)); 00196 return result; 00197 } 00198 00199 __inline__ UINT Image::GetPropertyCount() 00200 { 00201 UINT result = 0; 00202 updateStatus(DllExports::GdipGetPropertyCount(nativeImage, &result)); 00203 return result; 00204 } 00205 00206 __inline__ Status Image::GetPropertyIdList(UINT numOfProperty, PROPID *list) 00207 { 00208 return updateStatus(DllExports::GdipGetPropertyIdList( 00209 nativeImage, numOfProperty, list)); 00210 } 00211 00212 __inline__ Status Image::GetPropertyItem(PROPID propId, UINT propSize, 00213 PropertyItem *buffer) 00214 { 00215 return updateStatus(DllExports::GdipGetPropertyItem( 00216 nativeImage, propId, propSize, buffer)); 00217 } 00218 00219 __inline__ UINT Image::GetPropertyItemSize(PROPID propId) 00220 { 00221 UINT result = 0; 00222 updateStatus(DllExports::GdipGetPropertyItemSize( 00223 nativeImage, propId, &result)); 00224 return result; 00225 } 00226 00227 __inline__ Status Image::GetPropertySize( 00228 UINT *totalBufferSize, UINT *numProperties) 00229 { 00230 return updateStatus(DllExports::GdipGetPropertySize( 00231 nativeImage, totalBufferSize, numProperties)); 00232 } 00233 00234 __inline__ Status Image::GetRawFormat(GUID *format) 00235 { 00236 return updateStatus(DllExports::GdipGetImageRawFormat( 00237 nativeImage, format)); 00238 } 00239 00240 __inline__ Image* Image::GetThumbnailImage(UINT thumbWidth, UINT thumbHeight, 00241 GetThumbnailImageAbort callback, VOID *callbackData) 00242 { 00243 GpImage *thumbImage = NULL; 00244 Status status = updateStatus(DllExports::GdipGetImageThumbnail( 00245 nativeImage, thumbWidth, thumbHeight, &thumbImage, 00246 callback, callbackData)); 00247 00248 if (status == Ok) { 00249 Image *result = new Image(thumbImage, Ok); 00250 if (!result) { 00251 DllExports::GdipDisposeImage(thumbImage); 00252 lastStatus = OutOfMemory; 00253 } 00254 return result; 00255 } else { 00256 return NULL; 00257 } 00258 } 00259 00260 __inline__ ImageType Image::GetType() const 00261 { 00262 ImageType result = ImageTypeUnknown; 00263 updateStatus(DllExports::GdipGetImageType(nativeImage, &result)); 00264 return result; 00265 } 00266 00267 __inline__ REAL Image::GetVerticalResolution() 00268 { 00269 REAL result = 0.0f; 00270 updateStatus(DllExports::GdipGetImageVerticalResolution( 00271 nativeImage, &result)); 00272 return result; 00273 } 00274 00275 __inline__ UINT Image::GetWidth() 00276 { 00277 UINT result = 0; 00278 updateStatus(DllExports::GdipGetImageWidth(nativeImage, &result)); 00279 return result; 00280 } 00281 00282 __inline__ Status Image::RemovePropertyItem(PROPID propId) 00283 { 00284 return updateStatus(DllExports::GdipRemovePropertyItem( 00285 nativeImage, propId)); 00286 } 00287 00288 __inline__ Status Image::RotateFlip(RotateFlipType rotateFlipType) 00289 { 00290 return updateStatus(DllExports::GdipImageRotateFlip( 00291 nativeImage, rotateFlipType)); 00292 } 00293 00294 __inline__ Status Image::Save(const WCHAR *filename, const CLSID *clsidEncoder, 00295 const EncoderParameters *encoderParams) 00296 { 00297 return updateStatus(DllExports::GdipSaveImageToFile( 00298 nativeImage, filename, clsidEncoder, encoderParams)); 00299 } 00300 00301 __inline__ Status Image::Save(IStream *stream, const CLSID *clsidEncoder, 00302 const EncoderParameters *encoderParams) 00303 { 00304 return updateStatus(DllExports::GdipSaveImageToStream( 00305 nativeImage, stream, clsidEncoder, encoderParams)); 00306 } 00307 00308 __inline__ Status Image::SaveAdd(const EncoderParameters *encoderParams) 00309 { 00310 return updateStatus(DllExports::GdipSaveAdd( 00311 nativeImage, encoderParams)); 00312 } 00313 00314 __inline__ Status Image::SaveAdd(Image *newImage, 00315 const EncoderParameters *encoderParams) 00316 { 00317 return updateStatus(DllExports::GdipSaveAddImage( 00318 nativeImage, 00319 newImage ? newImage->nativeImage : NULL, 00320 encoderParams)); 00321 } 00322 00323 __inline__ Status Image::SelectActiveFrame( 00324 const GUID *dimensionID, UINT frameIndex) 00325 { 00326 return updateStatus(DllExports::GdipImageSelectActiveFrame( 00327 nativeImage, dimensionID, frameIndex)); 00328 } 00329 00330 __inline__ Status Image::SetAbort(GdiplusAbort *pIAbort) 00331 { 00332 // FIXME: can't test GdipImageSetAbort because it isn't exported in 1.0 00333 return updateStatus(DllExports::GdipImageSetAbort( 00334 nativeImage, pIAbort)); 00335 } 00336 00337 __inline__ Status Image::SetPalette(const ColorPalette *palette) 00338 { 00339 return updateStatus(DllExports::GdipSetImagePalette( 00340 nativeImage, palette)); 00341 } 00342 00343 __inline__ Status Image::SetPropertyItem(const PropertyItem *item) 00344 { 00345 return updateStatus(DllExports::GdipSetPropertyItem(nativeImage, item)); 00346 } 00347 00348 00349 // Bitmap 00350 00351 __inline__ Bitmap* Bitmap::FromBITMAPINFO(const BITMAPINFO *gdiBitmapInfo, 00352 VOID *gdiBitmapData) 00353 { 00354 return new Bitmap(gdiBitmapInfo, gdiBitmapData); 00355 } 00356 00357 __inline__ Bitmap* Bitmap::FromDirectDrawSurface7(IDirectDrawSurface7 *surface) 00358 { 00359 return new Bitmap(surface); 00360 } 00361 00362 __inline__ Bitmap* Bitmap::FromFile(const WCHAR *filename, 00363 BOOL useEmbeddedColorManagement) 00364 { 00365 return new Bitmap(filename, useEmbeddedColorManagement); 00366 } 00367 00368 __inline__ Bitmap* Bitmap::FromHBITMAP(HBITMAP hbm, HPALETTE hpal) 00369 { 00370 return new Bitmap(hbm, hpal); 00371 } 00372 00373 __inline__ Bitmap* Bitmap::FromHICON(HICON icon) 00374 { 00375 return new Bitmap(icon); 00376 } 00377 00378 __inline__ Bitmap* Bitmap::FromResource( 00379 HINSTANCE hInstance, const WCHAR *bitmapName) 00380 { 00381 return new Bitmap(hInstance, bitmapName); 00382 } 00383 00384 __inline__ Bitmap* Bitmap::FromStream(IStream *stream, 00385 BOOL useEmbeddedColorManagement) 00386 { 00387 return new Bitmap(stream, useEmbeddedColorManagement); 00388 } 00389 00390 //TODO: [GDI+ 1.1] Bitmap::ApplyEffect 00391 //__inline__ Status Bitmap::ApplyEffect(Bitmap **inputs, INT numInputs, 00392 // Effect *effect, RECT *ROI, RECT *outputRect, Bitmap **output) 00393 //{ 00394 // return NotImplemented; 00395 //} 00396 00397 __inline__ Status Bitmap::InitializePalette(ColorPalette *palette, 00398 PaletteType paletteType, INT optimalColors, 00399 BOOL useTransparentColor, Bitmap *bitmap) 00400 { 00401 // FIXME: can't test GdipInitializePalette b/c it isn't exported in 1.0 00402 return DllExports::GdipInitializePalette(palette, paletteType, 00403 optimalColors, useTransparentColor, 00404 bitmap ? (GpBitmap*) bitmap->nativeImage : NULL); 00405 } 00406 00407 __inline__ Bitmap::Bitmap(const BITMAPINFO *gdiBitmapInfo, VOID *gdiBitmapData): 00408 Image(NULL, Ok) 00409 { 00410 GpBitmap *nativeBitmap = NULL; 00411 lastStatus = DllExports::GdipCreateBitmapFromGdiDib( 00412 gdiBitmapInfo, gdiBitmapData, &nativeBitmap); 00413 nativeImage = nativeBitmap; 00414 } 00415 00416 __inline__ Bitmap::Bitmap(IDirectDrawSurface7 *surface): Image(NULL, Ok) 00417 { 00418 GpBitmap *nativeBitmap = NULL; 00419 lastStatus = DllExports::GdipCreateBitmapFromDirectDrawSurface( 00420 surface, &nativeBitmap); 00421 nativeImage = nativeBitmap; 00422 } 00423 00424 __inline__ Bitmap::Bitmap(const WCHAR *filename, 00425 BOOL useEmbeddedColorManagement): Image(NULL, Ok) 00426 { 00427 GpBitmap *nativeBitmap = NULL; 00428 if (useEmbeddedColorManagement) { 00429 lastStatus = DllExports::GdipCreateBitmapFromFileICM( 00430 filename, &nativeBitmap); 00431 } else { 00432 lastStatus = DllExports::GdipCreateBitmapFromFile( 00433 filename, &nativeBitmap); 00434 } 00435 nativeImage = nativeBitmap; 00436 } 00437 00438 __inline__ Bitmap::Bitmap(HBITMAP hbm, HPALETTE hpal): 00439 Image(NULL, Ok) 00440 { 00441 GpBitmap *nativeBitmap = NULL; 00442 lastStatus = DllExports::GdipCreateBitmapFromHBITMAP( 00443 hbm, hpal, &nativeBitmap); 00444 nativeImage = nativeBitmap; 00445 } 00446 00447 __inline__ Bitmap::Bitmap(HICON hicon): 00448 Image(NULL, Ok) 00449 { 00450 GpBitmap *nativeBitmap = NULL; 00451 lastStatus = DllExports::GdipCreateBitmapFromHICON(hicon, &nativeBitmap); 00452 nativeImage = nativeBitmap; 00453 } 00454 00455 __inline__ Bitmap::Bitmap(HINSTANCE hInstance, const WCHAR *bitmapName): 00456 Image(NULL, Ok) 00457 { 00458 GpBitmap *nativeBitmap = NULL; 00459 lastStatus = DllExports::GdipCreateBitmapFromResource( 00460 hInstance, bitmapName, &nativeBitmap); 00461 nativeImage = nativeBitmap; 00462 } 00463 00464 __inline__ Bitmap::Bitmap(IStream *stream, BOOL useEmbeddedColorManagement): 00465 Image(NULL, Ok) 00466 { 00467 GpBitmap *nativeBitmap = NULL; 00468 if (useEmbeddedColorManagement) { 00469 lastStatus = DllExports::GdipCreateBitmapFromStreamICM( 00470 stream, &nativeBitmap); 00471 } else { 00472 lastStatus = DllExports::GdipCreateBitmapFromStream( 00473 stream, &nativeBitmap); 00474 } 00475 nativeImage = nativeBitmap; 00476 } 00477 00478 __inline__ Bitmap::Bitmap(INT width, INT height, Graphics *target): 00479 Image(NULL, Ok) 00480 { 00481 GpBitmap *nativeBitmap = NULL; 00482 lastStatus = DllExports::GdipCreateBitmapFromGraphics( 00483 width, height, target ? target->nativeGraphics : NULL, 00484 &nativeBitmap); 00485 nativeImage = nativeBitmap; 00486 } 00487 00488 __inline__ Bitmap::Bitmap(INT width, INT height, PixelFormat format): 00489 Image(NULL, Ok) 00490 { 00491 GpBitmap *nativeBitmap = NULL; 00492 lastStatus = DllExports::GdipCreateBitmapFromScan0( 00493 width, height, 0, format, NULL, &nativeBitmap); 00494 nativeImage = nativeBitmap; 00495 } 00496 00497 __inline__ Bitmap::Bitmap(INT width, INT height, INT stride, 00498 PixelFormat format, BYTE *scan0): Image(NULL, Ok) 00499 { 00500 GpBitmap *nativeBitmap = NULL; 00501 lastStatus = DllExports::GdipCreateBitmapFromScan0( 00502 width, height, stride, format, scan0, &nativeBitmap); 00503 nativeImage = nativeBitmap; 00504 } 00505 00506 __inline__ Bitmap* Bitmap::Clone(const RectF& rect, PixelFormat format) const 00507 { 00508 return Clone(rect.X, rect.Y, rect.Width, rect.Height, format); 00509 } 00510 00511 __inline__ Bitmap* Bitmap::Clone(const Rect& rect, PixelFormat format) const 00512 { 00513 return Clone(rect.X, rect.Y, rect.Width, rect.Height, format); 00514 } 00515 00516 __inline__ Bitmap* Bitmap::Clone(REAL x, REAL y, REAL width, REAL height, 00517 PixelFormat format) const 00518 { 00519 GpBitmap *cloneBitmap = NULL; 00520 Status status = updateStatus(DllExports::GdipCloneBitmapArea( 00521 x, y, width, height, format, 00522 (GpBitmap*) nativeImage, &cloneBitmap)); 00523 if (status == Ok) { 00524 Bitmap *result = new Bitmap(cloneBitmap, lastStatus); 00525 if (!result) { 00526 DllExports::GdipDisposeImage(cloneBitmap); 00527 lastStatus = OutOfMemory; 00528 } 00529 return result; 00530 } else { 00531 return NULL; 00532 } 00533 } 00534 00535 __inline__ Bitmap* Bitmap::Clone(INT x, INT y, INT width, INT height, 00536 PixelFormat format) const 00537 { 00538 GpBitmap *cloneBitmap = NULL; 00539 Status status = updateStatus(DllExports::GdipCloneBitmapAreaI( 00540 x, y, width, height, format, 00541 (GpBitmap*) nativeImage, &cloneBitmap)); 00542 if (status == Ok) { 00543 Bitmap *result = new Bitmap(cloneBitmap, lastStatus); 00544 if (!result) { 00545 DllExports::GdipDisposeImage(cloneBitmap); 00546 lastStatus = OutOfMemory; 00547 } 00548 return result; 00549 } else { 00550 return NULL; 00551 } 00552 } 00553 00554 //TODO: [GDI+ 1.1] Bitmap::ApplyEffect 00555 //__inline__ Status Bitmap::ApplyEffect(Effect *effect, RECT *ROI) 00556 //{ 00557 // return NotImplemented; 00558 //} 00559 00560 __inline__ Status Bitmap::ConvertFormat(PixelFormat format, 00561 DitherType ditherType, PaletteType paletteType, 00562 ColorPalette *palette, REAL alphaThresholdPercent) 00563 { 00564 // FIXME: can't test GdipBitmapConvertFormat b/c it isn't exported in 1.0 00565 return updateStatus(DllExports::GdipBitmapConvertFormat( 00566 (GpBitmap*) nativeImage, format, ditherType, 00567 paletteType, palette, alphaThresholdPercent)); 00568 } 00569 00570 __inline__ Status Bitmap::GetHBITMAP( 00571 const Color& colorBackground, HBITMAP *hbmReturn) const 00572 { 00573 return updateStatus(DllExports::GdipCreateHBITMAPFromBitmap( 00574 (GpBitmap*) nativeImage, hbmReturn, 00575 colorBackground.GetValue())); 00576 } 00577 00578 __inline__ Status Bitmap::GetHICON(HICON *icon) const 00579 { 00580 return updateStatus(DllExports::GdipCreateHICONFromBitmap( 00581 (GpBitmap*) nativeImage, icon)); 00582 } 00583 00584 __inline__ Status Bitmap::GetHistogram(HistogramFormat format, 00585 UINT numberOfEntries, 00586 UINT *channel0, UINT *channel1, 00587 UINT *channel2, UINT *channel3) const 00588 { 00589 return updateStatus(DllExports::GdipBitmapGetHistogram( 00590 (GpBitmap*) nativeImage, format, numberOfEntries, 00591 channel0, channel1, channel2, channel3)); 00592 } 00593 00594 __inline__ Status Bitmap::GetHistogramSize(HistogramFormat format, 00595 UINT *numberOfEntries) const 00596 { 00597 return updateStatus(DllExports::GdipBitmapGetHistogramSize( 00598 format, numberOfEntries)); 00599 } 00600 00601 __inline__ Status Bitmap::GetPixel(INT x, INT y, Color *color) const 00602 { 00603 return updateStatus(DllExports::GdipBitmapGetPixel( 00604 (GpBitmap*) nativeImage, x, y, 00605 color ? &color->Value : NULL)); 00606 } 00607 00608 __inline__ Status Bitmap::LockBits(const Rect *rect, UINT flags, 00609 PixelFormat format, BitmapData *lockedBitmapData) 00610 { 00611 return updateStatus(DllExports::GdipBitmapLockBits( 00612 (GpBitmap*) nativeImage, rect, flags, format, 00613 lockedBitmapData)); 00614 } 00615 00616 __inline__ Status Bitmap::SetPixel(INT x, INT y, const Color& color) 00617 { 00618 return updateStatus(DllExports::GdipBitmapSetPixel( 00619 (GpBitmap*) nativeImage, x, y, color.GetValue())); 00620 } 00621 00622 __inline__ Status Bitmap::SetResolution(REAL xdpi, REAL ydpi) 00623 { 00624 return updateStatus(DllExports::GdipBitmapSetResolution( 00625 (GpBitmap*) nativeImage, xdpi, ydpi)); 00626 } 00627 00628 __inline__ Status Bitmap::UnlockBits(BitmapData *lockedBitmapData) 00629 { 00630 return updateStatus(DllExports::GdipBitmapUnlockBits( 00631 (GpBitmap*) nativeImage, lockedBitmapData)); 00632 } 00633 00634 00635 // CachedBitmap 00636 00637 __inline__ CachedBitmap::CachedBitmap(Bitmap *bitmap, Graphics *graphics): 00638 nativeCachedBitmap(NULL), lastStatus(Ok) 00639 { 00640 lastStatus = DllExports::GdipCreateCachedBitmap( 00641 bitmap ? ((GpBitmap*) bitmap->nativeImage) : NULL, 00642 graphics ? graphics->nativeGraphics : NULL, 00643 &nativeCachedBitmap); 00644 } 00645 00646 __inline__ CachedBitmap::~CachedBitmap() 00647 { 00648 DllExports::GdipDeleteCachedBitmap(nativeCachedBitmap); 00649 } 00650 00651 00652 // CustomLineCap 00653 00654 __inline__ CustomLineCap::CustomLineCap( 00655 const GraphicsPath *fillPath, 00656 const GraphicsPath *strokePath, 00657 LineCap baseCap, REAL baseInset): 00658 nativeCustomLineCap(NULL), lastStatus(Ok) 00659 { 00660 lastStatus = DllExports::GdipCreateCustomLineCap( 00661 fillPath ? fillPath->nativePath : NULL, 00662 strokePath ? strokePath->nativePath : NULL, 00663 baseCap, baseInset, &nativeCustomLineCap); 00664 } 00665 00666 __inline__ LineCap CustomLineCap::GetBaseCap() const 00667 { 00668 LineCap result = LineCapFlat; 00669 updateStatus(DllExports::GdipGetCustomLineCapBaseCap( 00670 nativeCustomLineCap, &result)); 00671 return result; 00672 } 00673 00674 __inline__ REAL CustomLineCap::GetBaseInset() const 00675 { 00676 REAL result = 0.0f; 00677 updateStatus(DllExports::GdipGetCustomLineCapBaseInset( 00678 nativeCustomLineCap, &result)); 00679 return result; 00680 } 00681 00682 __inline__ Status CustomLineCap::GetStrokeCaps(LineCap *startCap, 00683 LineCap *endCap) const 00684 { 00685 return updateStatus(DllExports::GdipGetCustomLineCapStrokeCaps( 00686 nativeCustomLineCap, startCap, endCap)); 00687 } 00688 00689 __inline__ LineJoin CustomLineCap::GetStrokeJoin() const 00690 { 00691 LineJoin result = LineJoinMiter; 00692 updateStatus(DllExports::GdipGetCustomLineCapStrokeJoin( 00693 nativeCustomLineCap, &result)); 00694 return result; 00695 } 00696 00697 __inline__ REAL CustomLineCap::GetWidthScale() const 00698 { 00699 REAL result = 0.0f; 00700 updateStatus(DllExports::GdipGetCustomLineCapWidthScale( 00701 nativeCustomLineCap, &result)); 00702 return result; 00703 } 00704 00705 __inline__ Status CustomLineCap::SetBaseCap(LineCap baseCap) 00706 { 00707 return updateStatus(DllExports::GdipSetCustomLineCapBaseCap( 00708 nativeCustomLineCap, baseCap)); 00709 } 00710 00711 __inline__ Status CustomLineCap::SetBaseInset(REAL inset) 00712 { 00713 return updateStatus(DllExports::GdipSetCustomLineCapBaseInset( 00714 nativeCustomLineCap, inset)); 00715 } 00716 00717 __inline__ Status CustomLineCap::SetStrokeCap(LineCap strokeCap) 00718 { 00719 return updateStatus(DllExports::GdipSetCustomLineCapStrokeCaps( 00720 nativeCustomLineCap, strokeCap, strokeCap)); 00721 } 00722 00723 __inline__ Status CustomLineCap::SetStrokeCaps(LineCap startCap, LineCap endCap) 00724 { 00725 return updateStatus(DllExports::GdipSetCustomLineCapStrokeCaps( 00726 nativeCustomLineCap, startCap, endCap)); 00727 } 00728 00729 __inline__ Status CustomLineCap::SetStrokeJoin(LineJoin lineJoin) 00730 { 00731 return updateStatus(DllExports::GdipSetCustomLineCapStrokeJoin( 00732 nativeCustomLineCap, lineJoin)); 00733 } 00734 00735 __inline__ Status CustomLineCap::SetWidthScale(REAL widthScale) 00736 { 00737 return updateStatus(DllExports::GdipSetCustomLineCapWidthScale( 00738 nativeCustomLineCap, widthScale)); 00739 } 00740 00741 00742 // Font 00743 00744 __inline__ Font::Font(const FontFamily *family, 00745 REAL emSize, INT style, Unit unit): 00746 nativeFont(NULL), lastStatus(Ok) 00747 { 00748 lastStatus = DllExports::GdipCreateFont( 00749 family ? family->nativeFontFamily : NULL, 00750 emSize, style, unit, &nativeFont); 00751 } 00752 00753 __inline__ Font::Font(HDC hdc, HFONT hfont): 00754 nativeFont(NULL), lastStatus(Ok) 00755 { 00756 LOGFONTW logfont; 00757 if (GetObject(hfont, sizeof logfont, &logfont)) { 00758 lastStatus = DllExports::GdipCreateFontFromLogfontW( 00759 hdc, &logfont, &nativeFont); 00760 } else { 00761 lastStatus = DllExports::GdipCreateFontFromDC( 00762 hdc, &nativeFont); 00763 } 00764 } 00765 00766 __inline__ Font::Font(HDC hdc, const LOGFONTA *logfont): 00767 nativeFont(NULL), lastStatus(Ok) 00768 { 00769 lastStatus = DllExports::GdipCreateFontFromLogfontA( 00770 hdc, logfont, &nativeFont); 00771 } 00772 00773 __inline__ Font::Font(HDC hdc, const LOGFONTW *logfont): 00774 nativeFont(NULL), lastStatus(Ok) 00775 { 00776 lastStatus = DllExports::GdipCreateFontFromLogfontW( 00777 hdc, logfont, &nativeFont); 00778 } 00779 00780 __inline__ Font::Font(HDC hdc): 00781 nativeFont(NULL), lastStatus(Ok) 00782 { 00783 lastStatus = DllExports::GdipCreateFontFromDC(hdc, &nativeFont); 00784 } 00785 00786 __inline__ Font::Font(const WCHAR *familyName, REAL emSize, INT style, 00787 Unit unit, const FontCollection *fontCollection): 00788 nativeFont(NULL), lastStatus(Ok) 00789 { 00790 GpFontFamily *nativeFamily = NULL; 00791 lastStatus = DllExports::GdipCreateFontFamilyFromName( 00792 familyName, 00793 fontCollection ? fontCollection->nativeFontCollection : NULL, 00794 &nativeFamily); 00795 00796 if (nativeFamily) { 00797 lastStatus = DllExports::GdipCreateFont( 00798 nativeFamily, emSize, style, unit, &nativeFont); 00799 DllExports::GdipDeleteFontFamily(nativeFamily); 00800 } 00801 } 00802 00803 __inline__ Font::~Font() 00804 { 00805 DllExports::GdipDeleteFont(nativeFont); 00806 } 00807 00808 __inline__ Font* Font::Clone() const 00809 { 00810 GpFont *cloneFont = NULL; 00811 Status status = updateStatus(DllExports::GdipCloneFont( 00812 nativeFont, &cloneFont)); 00813 if (status == Ok) { 00814 Font *result = new Font(cloneFont, lastStatus); 00815 if (!result) { 00816 DllExports::GdipDeleteFont(cloneFont); 00817 lastStatus = OutOfMemory; 00818 } 00819 return result; 00820 } else { 00821 return NULL; 00822 } 00823 } 00824 00825 __inline__ Status Font::GetFamily(FontFamily *family) const 00826 { 00827 if (!family) return lastStatus = InvalidParameter; 00828 // FIXME: do we need to call GdipDeleteFontFamily first? 00829 return family->lastStatus = updateStatus(DllExports::GdipGetFamily( 00830 nativeFont, &family->nativeFontFamily)); 00831 } 00832 00833 __inline__ REAL Font::GetHeight(const Graphics *graphics) const 00834 { 00835 REAL result = 0.0f; 00836 updateStatus(DllExports::GdipGetFontHeight( 00837 nativeFont, graphics ? graphics->nativeGraphics : NULL, 00838 &result)); 00839 return result; 00840 } 00841 00842 __inline__ REAL Font::GetHeight(REAL dpi) const 00843 { 00844 REAL result = 0.0f; 00845 updateStatus(DllExports::GdipGetFontHeightGivenDPI( 00846 nativeFont, dpi, &result)); 00847 return result; 00848 } 00849 00850 __inline__ Status Font::GetLogFontA(const Graphics *graphics, LOGFONTA *logfontA) 00851 const 00852 { 00853 return updateStatus(DllExports::GdipGetLogFontA( 00854 nativeFont, graphics ? graphics->nativeGraphics : NULL, 00855 logfontA)); 00856 } 00857 00858 __inline__ Status Font::GetLogFontW(const Graphics *graphics, LOGFONTW *logfontW) 00859 const 00860 { 00861 return updateStatus(DllExports::GdipGetLogFontW( 00862 nativeFont, graphics ? graphics->nativeGraphics : NULL, 00863 logfontW)); 00864 } 00865 00866 __inline__ REAL Font::GetSize() const 00867 { 00868 REAL result = 0.0; 00869 updateStatus(DllExports::GdipGetFontSize(nativeFont, &result)); 00870 return result; 00871 } 00872 00873 __inline__ INT Font::GetStyle() const 00874 { 00875 INT result = FontStyleRegular; 00876 updateStatus(DllExports::GdipGetFontStyle(nativeFont, &result)); 00877 return result; 00878 } 00879 00880 __inline__ Unit Font::GetUnit() const 00881 { 00882 Unit result = UnitPoint; 00883 updateStatus(DllExports::GdipGetFontUnit(nativeFont, &result)); 00884 return result; 00885 } 00886 00887 00888 // FontCollection 00889 00890 __inline__ FontCollection::FontCollection(): 00891 nativeFontCollection(NULL), lastStatus(Ok) 00892 { 00893 } 00894 00895 __inline__ Status FontCollection::GetFamilies(INT numSought, 00896 FontFamily *families, INT *numFound) const 00897 { 00898 if (numSought <= 0 || !families || !numFound) 00899 return lastStatus = InvalidParameter; 00900 00901 for (int i = 0; i < numSought; ++i) { 00902 families[i].nativeFontFamily = NULL; 00903 families[i].lastStatus = FontFamilyNotFound; 00904 } 00905 *numFound = 0; 00906 00907 GpFontFamily **nativeFamilyArray = (GpFontFamily**) 00908 DllExports::GdipAlloc(numSought * sizeof (GpFontFamily*)); 00909 if (!nativeFamilyArray) 00910 return lastStatus = OutOfMemory; 00911 00912 Status status = updateStatus(DllExports::GdipGetFontCollectionFamilyList( 00913 nativeFontCollection, numSought, nativeFamilyArray, 00914 numFound)); 00915 00916 // FIXME: must the native GpFontFamily objects be cloned? Seems so. 00917 // (if this is not done, the "Creating a Private Font Collection" 00918 // example crashes on "delete[] pFontFamily") 00919 00920 if (status == Ok) { 00921 for (int i = 0; i < *numFound; ++i) { 00922 families[i].lastStatus = 00923 updateStatus(DllExports::GdipCloneFontFamily( 00924 nativeFamilyArray[i], 00925 &families[i].nativeFontFamily)); 00926 } 00927 } 00928 00929 DllExports::GdipFree(nativeFamilyArray); 00930 return status; 00931 } 00932 00933 __inline__ INT FontCollection::GetFamilyCount() const 00934 { 00935 INT result = 0; 00936 updateStatus(DllExports::GdipGetFontCollectionFamilyCount( 00937 nativeFontCollection, &result)); 00938 return result; 00939 } 00940 00941 00942 // FontFamily 00943 00944 // FIXME: do FontFamily::GenericMonospace() et al. need to be thread safe? 00945 // FIXME: maybe put parts of this in gdiplus.c 00946 00947 extern "C" void *_GdipFontFamilyCachedGenericMonospace; 00948 extern "C" void *_GdipFontFamilyCachedGenericSansSerif; 00949 extern "C" void *_GdipFontFamilyCachedGenericSerif; 00950 00951 __inline__ const FontFamily* FontFamily::GenericMonospace() 00952 { 00953 if (!_GdipFontFamilyCachedGenericMonospace) { 00954 GpFontFamily *nativeFontFamily = 0; 00955 Status status = DllExports::GdipGetGenericFontFamilyMonospace( 00956 &nativeFontFamily); 00957 if (status == Ok && nativeFontFamily) { 00958 _GdipFontFamilyCachedGenericMonospace = (void*) 00959 new FontFamily(nativeFontFamily, Ok); 00960 } 00961 } 00962 return (FontFamily*) _GdipFontFamilyCachedGenericMonospace; 00963 } 00964 00965 __inline__ const FontFamily* FontFamily::GenericSansSerif() 00966 { 00967 if (!_GdipFontFamilyCachedGenericSansSerif) { 00968 GpFontFamily *nativeFontFamily = 0; 00969 Status status = DllExports::GdipGetGenericFontFamilySansSerif( 00970 &nativeFontFamily); 00971 if (status == Ok && nativeFontFamily) { 00972 _GdipFontFamilyCachedGenericSansSerif = (void*) 00973 new FontFamily(nativeFontFamily, Ok); 00974 } 00975 } 00976 return (FontFamily*) _GdipFontFamilyCachedGenericSansSerif; 00977 } 00978 00979 __inline__ const FontFamily* FontFamily::GenericSerif() 00980 { 00981 if (!_GdipFontFamilyCachedGenericSerif) { 00982 GpFontFamily *nativeFontFamily = 0; 00983 Status status = DllExports::GdipGetGenericFontFamilySerif( 00984 &nativeFontFamily); 00985 if (status == Ok && nativeFontFamily) { 00986 _GdipFontFamilyCachedGenericSerif = (void*) 00987 new FontFamily(nativeFontFamily, Ok); 00988 } 00989 } 00990 return (FontFamily*) _GdipFontFamilyCachedGenericSerif; 00991 } 00992 00993 __inline__ FontFamily::FontFamily(): 00994 nativeFontFamily(NULL), lastStatus(Ok) 00995 { 00996 } 00997 00998 __inline__ FontFamily::FontFamily(const WCHAR *name, 00999 const FontCollection *fontCollection): 01000 nativeFontFamily(NULL), lastStatus(Ok) 01001 { 01002 lastStatus = DllExports::GdipCreateFontFamilyFromName(name, 01003 fontCollection ? fontCollection->nativeFontCollection : NULL, 01004 &nativeFontFamily); 01005 } 01006 01007 __inline__ FontFamily::~FontFamily() 01008 { 01009 DllExports::GdipDeleteFontFamily(nativeFontFamily); 01010 } 01011 01012 __inline__ FontFamily* FontFamily::Clone() const 01013 { 01014 GpFontFamily *cloneFontFamily = NULL; 01015 Status status = updateStatus(DllExports::GdipCloneFontFamily( 01016 nativeFontFamily, &cloneFontFamily)); 01017 if (status == Ok) { 01018 FontFamily *result = new FontFamily(cloneFontFamily, lastStatus); 01019 if (!result) { 01020 DllExports::GdipDeleteFontFamily(cloneFontFamily); 01021 lastStatus = OutOfMemory; 01022 } 01023 return result; 01024 } else { 01025 return NULL; 01026 } 01027 } 01028 01029 __inline__ UINT16 FontFamily::GetCellAscent(INT style) const 01030 { 01031 UINT16 result = 0; 01032 updateStatus(DllExports::GdipGetCellAscent( 01033 nativeFontFamily, style, &result)); 01034 return result; 01035 } 01036 01037 __inline__ UINT16 FontFamily::GetCellDescent(INT style) const 01038 { 01039 UINT16 result = 0; 01040 updateStatus(DllExports::GdipGetCellDescent( 01041 nativeFontFamily, style, &result)); 01042 return result; 01043 } 01044 01045 __inline__ UINT16 FontFamily::GetEmHeight(INT style) const 01046 { 01047 UINT16 result = 0; 01048 updateStatus(DllExports::GdipGetEmHeight( 01049 nativeFontFamily, style, &result)); 01050 return result; 01051 } 01052 01053 __inline__ Status FontFamily::GetFamilyName(WCHAR name[LF_FACESIZE], 01054 LANGID language) const 01055 { 01056 return updateStatus(DllExports::GdipGetFamilyName( 01057 nativeFontFamily, name, language)); 01058 } 01059 01060 __inline__ UINT16 FontFamily::GetLineSpacing(INT style) const 01061 { 01062 UINT16 result = 0; 01063 updateStatus(DllExports::GdipGetLineSpacing( 01064 nativeFontFamily, style, &result)); 01065 return result; 01066 } 01067 01068 __inline__ BOOL FontFamily::IsStyleAvailable(INT style) const 01069 { 01070 BOOL result = FALSE; 01071 updateStatus(DllExports::GdipIsStyleAvailable( 01072 nativeFontFamily, style, &result)); 01073 return result; 01074 } 01075 01076 01077 // InstalledFontCollection 01078 01079 __inline__ InstalledFontCollection::InstalledFontCollection() 01080 { 01081 lastStatus = DllExports::GdipNewInstalledFontCollection( 01082 &nativeFontCollection); 01083 } 01084 01085 01086 // PrivateFontCollection 01087 01088 __inline__ PrivateFontCollection::PrivateFontCollection() 01089 { 01090 lastStatus = DllExports::GdipNewPrivateFontCollection( 01091 &nativeFontCollection); 01092 } 01093 01094 __inline__ Status PrivateFontCollection::AddFontFile(const WCHAR *filename) 01095 { 01096 return updateStatus(DllExports::GdipPrivateAddFontFile( 01097 nativeFontCollection, filename)); 01098 } 01099 01100 __inline__ Status PrivateFontCollection::AddMemoryFont( 01101 const VOID *memory, INT length) 01102 { 01103 return updateStatus(DllExports::GdipPrivateAddMemoryFont( 01104 nativeFontCollection, memory, length)); 01105 } 01106 01107 01108 // Region 01109 01110 __inline__ Region* Region::FromHRGN(HRGN hrgn) 01111 { 01112 return new Region(hrgn); 01113 } 01114 01115 __inline__ Region::Region(): nativeRegion(NULL), lastStatus(Ok) 01116 { 01117 lastStatus = DllExports::GdipCreateRegion(&nativeRegion); 01118 } 01119 01120 __inline__ Region::Region(const RectF& rect): nativeRegion(NULL), lastStatus(Ok) 01121 { 01122 lastStatus = DllExports::GdipCreateRegionRect(&rect, &nativeRegion); 01123 } 01124 01125 __inline__ Region::Region(const Rect& rect): nativeRegion(NULL), lastStatus(Ok) 01126 { 01127 lastStatus = DllExports::GdipCreateRegionRectI(&rect, &nativeRegion); 01128 } 01129 01130 __inline__ Region::Region(const GraphicsPath *path): 01131 nativeRegion(NULL), lastStatus(Ok) 01132 { 01133 lastStatus = DllExports::GdipCreateRegionPath( 01134 path ? path->nativePath : NULL, &nativeRegion); 01135 } 01136 01137 __inline__ Region::Region(const BYTE *regionData, INT size): 01138 nativeRegion(NULL), lastStatus(Ok) 01139 { 01140 lastStatus = DllExports::GdipCreateRegionRgnData( 01141 regionData, size, &nativeRegion); 01142 } 01143 01144 __inline__ Region::Region(HRGN hrgn): nativeRegion(NULL), lastStatus(Ok) 01145 { 01146 lastStatus = DllExports::GdipCreateRegionHrgn(hrgn, &nativeRegion); 01147 } 01148 01149 __inline__ Region::~Region() 01150 { 01151 DllExports::GdipDeleteRegion(nativeRegion); 01152 } 01153 01154 __inline__ Region* Region::Clone() const 01155 { 01156 GpRegion *cloneRegion = NULL; 01157 Status status = updateStatus(DllExports::GdipCloneRegion( 01158 nativeRegion, &cloneRegion)); 01159 if (status == Ok) { 01160 Region *result = new Region(cloneRegion, lastStatus); 01161 if (!result) { 01162 DllExports::GdipDeleteRegion(cloneRegion); 01163 lastStatus = OutOfMemory; 01164 } 01165 return result; 01166 } else { 01167 return NULL; 01168 } 01169 } 01170 01171 __inline__ Status Region::Complement(const RectF& rect) 01172 { 01173 return updateStatus(DllExports::GdipCombineRegionRect( 01174 nativeRegion, &rect, CombineModeComplement)); 01175 } 01176 01177 __inline__ Status Region::Complement(const Rect& rect) 01178 { 01179 return updateStatus(DllExports::GdipCombineRegionRectI( 01180 nativeRegion, &rect, CombineModeComplement)); 01181 } 01182 01183 __inline__ Status Region::Complement(const Region *region) 01184 { 01185 return updateStatus(DllExports::GdipCombineRegionRegion( 01186 nativeRegion, region ? region->nativeRegion : NULL, 01187 CombineModeComplement)); 01188 } 01189 01190 __inline__ Status Region::Complement(const GraphicsPath *path) 01191 { 01192 return updateStatus(DllExports::GdipCombineRegionPath( 01193 nativeRegion, path ? path->nativePath : NULL, 01194 CombineModeComplement)); 01195 } 01196 01197 __inline__ BOOL Region::Equals(const Region *region, const Graphics *graphics) 01198 const 01199 { 01200 BOOL result = FALSE; 01201 updateStatus(DllExports::GdipIsEqualRegion( 01202 nativeRegion, region ? region->nativeRegion : NULL, 01203 graphics ? graphics->nativeGraphics : NULL, &result)); 01204 return result; 01205 } 01206 01207 __inline__ Status Region::Exclude(const RectF& rect) 01208 { 01209 return updateStatus(DllExports::GdipCombineRegionRect( 01210 nativeRegion, &rect, CombineModeExclude)); 01211 } 01212 01213 __inline__ Status Region::Exclude(const Rect& rect) 01214 { 01215 return updateStatus(DllExports::GdipCombineRegionRectI( 01216 nativeRegion, &rect, CombineModeExclude)); 01217 } 01218 01219 __inline__ Status Region::Exclude(const Region *region) 01220 { 01221 return updateStatus(DllExports::GdipCombineRegionRegion( 01222 nativeRegion, region ? region->nativeRegion : NULL, 01223 CombineModeExclude)); 01224 } 01225 01226 __inline__ Status Region::Exclude(const GraphicsPath *path) 01227 { 01228 return updateStatus(DllExports::GdipCombineRegionPath( 01229 nativeRegion, path ? path->nativePath : NULL, 01230 CombineModeExclude)); 01231 } 01232 01233 __inline__ Status Region::GetBounds(RectF *rect, const Graphics *graphics) const 01234 { 01235 return updateStatus(DllExports::GdipGetRegionBounds(nativeRegion, 01236 graphics ? graphics->nativeGraphics : NULL, rect)); 01237 } 01238 01239 __inline__ Status Region::GetBounds(Rect *rect, const Graphics *graphics) const 01240 { 01241 return updateStatus(DllExports::GdipGetRegionBoundsI(nativeRegion, 01242 graphics ? graphics->nativeGraphics : NULL, rect)); 01243 } 01244 01245 __inline__ Status Region::GetData(BYTE *buffer, UINT bufferSize, 01246 UINT *sizeFilled) const 01247 { 01248 return updateStatus(DllExports::GdipGetRegionData( 01249 nativeRegion, buffer, bufferSize, sizeFilled)); 01250 } 01251 01252 __inline__ UINT Region::GetDataSize() const 01253 { 01254 UINT result = 0; 01255 updateStatus(DllExports::GdipGetRegionDataSize(nativeRegion, &result)); 01256 return result; 01257 } 01258 01259 __inline__ HRGN Region::GetHRGN(const Graphics *graphics) const 01260 { 01261 HRGN result = NULL; 01262 updateStatus(DllExports::GdipGetRegionHRgn(nativeRegion, 01263 graphics ? graphics->nativeGraphics : NULL, &result)); 01264 return result; 01265 } 01266 01267 __inline__ Status Region::GetRegionScans(const Matrix *matrix, 01268 RectF *rects, INT *count) const 01269 { 01270 return updateStatus(DllExports::GdipGetRegionScans( 01271 nativeRegion, rects, count, 01272 matrix ? matrix->nativeMatrix : NULL)); 01273 } 01274 01275 __inline__ Status Region::GetRegionScans(const Matrix *matrix, 01276 Rect *rects, INT *count) const 01277 { 01278 return updateStatus(DllExports::GdipGetRegionScansI( 01279 nativeRegion, rects, count, 01280 matrix ? matrix->nativeMatrix : NULL)); 01281 } 01282 01283 __inline__ UINT Region::GetRegionScansCount(const Matrix *matrix) const 01284 { 01285 UINT result = 0; 01286 updateStatus(DllExports::GdipGetRegionScansCount( 01287 nativeRegion, &result, 01288 matrix ? matrix->nativeMatrix : NULL)); 01289 return result; 01290 } 01291 01292 __inline__ Status Region::Intersect(const RectF& rect) 01293 { 01294 return updateStatus(DllExports::GdipCombineRegionRect( 01295 nativeRegion, &rect, CombineModeIntersect)); 01296 } 01297 01298 __inline__ Status Region::Intersect(const Rect& rect) 01299 { 01300 return updateStatus(DllExports::GdipCombineRegionRectI( 01301 nativeRegion, &rect, CombineModeIntersect)); 01302 } 01303 01304 __inline__ Status Region::Intersect(const Region *region) 01305 { 01306 return updateStatus(DllExports::GdipCombineRegionRegion( 01307 nativeRegion, region ? region->nativeRegion : NULL, 01308 CombineModeIntersect)); 01309 } 01310 01311 __inline__ Status Region::Intersect(const GraphicsPath *path) 01312 { 01313 return updateStatus(DllExports::GdipCombineRegionPath( 01314 nativeRegion, path ? path->nativePath : NULL, 01315 CombineModeIntersect)); 01316 } 01317 01318 __inline__ BOOL Region::IsEmpty(const Graphics *graphics) const 01319 { 01320 BOOL result = FALSE; 01321 updateStatus(DllExports::GdipIsEmptyRegion(nativeRegion, 01322 graphics ? graphics->nativeGraphics : NULL, &result)); 01323 return result; 01324 } 01325 01326 __inline__ BOOL Region::IsInfinite(const Graphics *graphics) const 01327 { 01328 BOOL result = FALSE; 01329 updateStatus(DllExports::GdipIsInfiniteRegion(nativeRegion, 01330 graphics ? graphics->nativeGraphics : NULL, &result)); 01331 return result; 01332 } 01333 01334 __inline__ BOOL Region::IsVisible(REAL x, REAL y, 01335 const Graphics *graphics) const 01336 { 01337 BOOL result = FALSE; 01338 updateStatus(DllExports::GdipIsVisibleRegionPoint( 01339 nativeRegion, x, y, 01340 graphics ? graphics->nativeGraphics : NULL, &result)); 01341 return result; 01342 } 01343 01344 __inline__ BOOL Region::IsVisible(INT x, INT y, 01345 const Graphics *graphics) const 01346 { 01347 BOOL result = FALSE; 01348 updateStatus(DllExports::GdipIsVisibleRegionPointI( 01349 nativeRegion, x, y, 01350 graphics ? graphics->nativeGraphics : NULL, &result)); 01351 return result; 01352 } 01353 01354 __inline__ BOOL Region::IsVisible(const PointF& point, 01355 const Graphics *graphics) const 01356 { 01357 BOOL result = FALSE; 01358 updateStatus(DllExports::GdipIsVisibleRegionPoint( 01359 nativeRegion, point.X, point.Y, 01360 graphics ? graphics->nativeGraphics : NULL, &result)); 01361 return result; 01362 } 01363 01364 __inline__ BOOL Region::IsVisible(const Point& point, 01365 const Graphics *graphics) const 01366 { 01367 BOOL result = FALSE; 01368 updateStatus(DllExports::GdipIsVisibleRegionPointI( 01369 nativeRegion, point.X, point.Y, 01370 graphics ? graphics->nativeGraphics : NULL, &result)); 01371 return result; 01372 } 01373 01374 __inline__ BOOL Region::IsVisible(REAL x, REAL y, REAL width, REAL height, 01375 const Graphics *graphics) const 01376 { 01377 BOOL result = FALSE; 01378 updateStatus(DllExports::GdipIsVisibleRegionRect( 01379 nativeRegion, x, y, width, height, 01380 graphics ? graphics->nativeGraphics : NULL, &result)); 01381 return result; 01382 } 01383 01384 __inline__ BOOL Region::IsVisible(INT x, INT y, INT width, INT height, 01385 const Graphics *graphics) const 01386 { 01387 BOOL result = FALSE; 01388 updateStatus(DllExports::GdipIsVisibleRegionRectI( 01389 nativeRegion, x, y, width, height, 01390 graphics ? graphics->nativeGraphics : NULL, &result)); 01391 return result; 01392 } 01393 01394 __inline__ BOOL Region::IsVisible(const RectF& rect, 01395 const Graphics *graphics) const 01396 { 01397 BOOL result = FALSE; 01398 updateStatus(DllExports::GdipIsVisibleRegionRect( 01399 nativeRegion, rect.X, rect.Y, rect.Width, rect.Height, 01400 graphics ? graphics->nativeGraphics : NULL, &result)); 01401 return result; 01402 } 01403 01404 __inline__ BOOL Region::IsVisible(const Rect& rect, 01405 const Graphics *graphics) const 01406 { 01407 BOOL result = FALSE; 01408 updateStatus(DllExports::GdipIsVisibleRegionRectI( 01409 nativeRegion, rect.X, rect.Y, rect.Width, rect.Height, 01410 graphics ? graphics->nativeGraphics : NULL, &result)); 01411 return result; 01412 } 01413 01414 __inline__ Status Region::MakeEmpty() 01415 { 01416 return updateStatus(DllExports::GdipSetEmpty(nativeRegion)); 01417 } 01418 01419 __inline__ Status Region::MakeInfinite() 01420 { 01421 return updateStatus(DllExports::GdipSetInfinite(nativeRegion)); 01422 } 01423 01424 __inline__ Status Region::Transform(const Matrix *matrix) 01425 { 01426 return updateStatus(DllExports::GdipTransformRegion( 01427 nativeRegion, matrix ? matrix->nativeMatrix : NULL)); 01428 } 01429 01430 __inline__ Status Region::Translate(REAL dx, REAL dy) 01431 { 01432 return updateStatus(DllExports::GdipTranslateRegion( 01433 nativeRegion, dx, dy)); 01434 } 01435 01436 __inline__ Status Region::Translate(INT dx, INT dy) 01437 { 01438 return updateStatus(DllExports::GdipTranslateRegionI( 01439 nativeRegion, dx, dy)); 01440 } 01441 01442 __inline__ Status Region::Union(const RectF& rect) 01443 { 01444 return updateStatus(DllExports::GdipCombineRegionRect( 01445 nativeRegion, &rect, CombineModeUnion)); 01446 } 01447 01448 __inline__ Status Region::Union(const Rect& rect) 01449 { 01450 return updateStatus(DllExports::GdipCombineRegionRectI( 01451 nativeRegion, &rect, CombineModeUnion)); 01452 } 01453 01454 __inline__ Status Region::Union(const Region *region) 01455 { 01456 return updateStatus(DllExports::GdipCombineRegionRegion( 01457 nativeRegion, region ? region->nativeRegion : NULL, 01458 CombineModeUnion)); 01459 } 01460 01461 __inline__ Status Region::Union(const GraphicsPath *path) 01462 { 01463 return updateStatus(DllExports::GdipCombineRegionPath( 01464 nativeRegion, path ? path->nativePath : NULL, 01465 CombineModeUnion)); 01466 } 01467 01468 __inline__ Status Region::Xor(const RectF& rect) 01469 { 01470 return updateStatus(DllExports::GdipCombineRegionRect( 01471 nativeRegion, &rect, CombineModeXor)); 01472 } 01473 01474 __inline__ Status Region::Xor(const Rect& rect) 01475 { 01476 return updateStatus(DllExports::GdipCombineRegionRectI( 01477 nativeRegion, &rect, CombineModeXor)); 01478 } 01479 01480 __inline__ Status Region::Xor(const Region *region) 01481 { 01482 return updateStatus(DllExports::GdipCombineRegionRegion( 01483 nativeRegion, region ? region->nativeRegion : NULL, 01484 CombineModeXor)); 01485 } 01486 01487 __inline__ Status Region::Xor(const GraphicsPath *path) 01488 { 01489 return updateStatus(DllExports::GdipCombineRegionPath( 01490 nativeRegion, path ? path->nativePath : NULL, 01491 CombineModeXor)); 01492 } 01493 01494 01495 // GraphicsPath 01496 01497 __inline__ BOOL GraphicsPath::IsOutlineVisible(REAL x, REAL y, const Pen *pen, 01498 const Graphics *g) const 01499 { 01500 BOOL result = FALSE; 01501 updateStatus(DllExports::GdipIsOutlineVisiblePathPoint( 01502 nativePath, x, y, pen ? pen->nativePen : NULL, 01503 g ? g->nativeGraphics : NULL, &result)); 01504 return result; 01505 } 01506 01507 __inline__ BOOL GraphicsPath::IsOutlineVisible(INT x, INT y, const Pen *pen, 01508 const Graphics *g) const 01509 { 01510 BOOL result = FALSE; 01511 updateStatus(DllExports::GdipIsOutlineVisiblePathPointI( 01512 nativePath, x, y, pen ? pen->nativePen : NULL, 01513 g ? g->nativeGraphics : NULL, &result)); 01514 return result; 01515 } 01516 01517 __inline__ BOOL GraphicsPath::IsOutlineVisible(const PointF& point, const Pen *pen, 01518 const Graphics *g) const 01519 { 01520 BOOL result = FALSE; 01521 updateStatus(DllExports::GdipIsOutlineVisiblePathPoint( 01522 nativePath, point.X, point.Y, 01523 pen ? pen->nativePen : NULL, 01524 g ? g->nativeGraphics : NULL, &result)); 01525 return result; 01526 } 01527 01528 __inline__ BOOL GraphicsPath::IsOutlineVisible(const Point& point, const Pen *pen, 01529 const Graphics *g) const 01530 { 01531 BOOL result = FALSE; 01532 updateStatus(DllExports::GdipIsOutlineVisiblePathPointI( 01533 nativePath, point.X, point.Y, 01534 pen ? pen->nativePen : NULL, 01535 g ? g->nativeGraphics : NULL, &result)); 01536 return result; 01537 } 01538 01539 __inline__ BOOL GraphicsPath::IsVisible(REAL x, REAL y, const Graphics *g) const 01540 { 01541 BOOL result = FALSE; 01542 updateStatus(DllExports::GdipIsVisiblePathPoint( 01543 nativePath, x, y, 01544 g ? g->nativeGraphics : NULL, &result)); 01545 return result; 01546 } 01547 __inline__ BOOL GraphicsPath::IsVisible(INT x, INT y, const Graphics *g) const 01548 { 01549 BOOL result = FALSE; 01550 updateStatus(DllExports::GdipIsVisiblePathPointI( 01551 nativePath, x, y, 01552 g ? g->nativeGraphics : NULL, &result)); 01553 return result; 01554 } 01555 01556 __inline__ BOOL GraphicsPath::IsVisible(const PointF& point, 01557 const Graphics *g) const 01558 { 01559 BOOL result = FALSE; 01560 updateStatus(DllExports::GdipIsVisiblePathPoint( 01561 nativePath, point.X, point.Y, 01562 g ? g->nativeGraphics : NULL, &result)); 01563 return result; 01564 } 01565 01566 __inline__ BOOL GraphicsPath::IsVisible(const Point& point, const Graphics *g) const 01567 { 01568 BOOL result = FALSE; 01569 updateStatus(DllExports::GdipIsVisiblePathPointI( 01570 nativePath, point.X, point.Y, 01571 g ? g->nativeGraphics : NULL, &result)); 01572 return result; 01573 } 01574 01575 01576 // PathData 01577 01578 __inline__ Status PathData::AllocateArrays(INT capacity) 01579 { 01580 if (capacity < 0) { 01581 return InvalidParameter; 01582 } else if (Count < capacity) { 01583 FreeArrays(); 01584 01585 PointF *pointArray = (PointF*) 01586 DllExports::GdipAlloc(capacity * sizeof(PointF)); 01587 if (!pointArray) 01588 return OutOfMemory; 01589 01590 BYTE *typeArray = (BYTE*) 01591 DllExports::GdipAlloc(capacity * sizeof(BYTE)); 01592 if (!typeArray) { 01593 DllExports::GdipFree(pointArray); 01594 return OutOfMemory; 01595 } 01596 01597 Count = capacity; 01598 Points = pointArray; 01599 Types = typeArray; 01600 } 01601 return Ok; 01602 } 01603 01604 __inline__ VOID PathData::FreeArrays() 01605 { 01606 if (Points) DllExports::GdipFree(Points); 01607 if (Types) DllExports::GdipFree(Types); 01608 Count = 0; 01609 Points = NULL; 01610 Types = NULL; 01611 } 01612 01613 #endif /* __GDIPLUS_IMPL_H */
Generated on Tue Jul 12 2022 19:59:54 by
