/**************************************************************************\ * * Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved. * * Module Name: * * GdiplusRegion.h * * Abstract: * * Region API related declarations * \**************************************************************************/ #ifndef _GDIPLUSREGION_H #define _GDIPLUSREGION_H /** * Construct a new region object */ inline Region::Region() { GpRegion *region = NULL; lastResult = DllExports::GdipCreateRegion(®ion); SetNativeRegion(region); } inline Region::Region(IN const RectF& rect) { GpRegion *region = NULL; lastResult = DllExports::GdipCreateRegionRect(&rect, ®ion); SetNativeRegion(region); } inline Region::Region(IN const Rect& rect) { GpRegion *region = NULL; lastResult = DllExports::GdipCreateRegionRectI(&rect, ®ion); SetNativeRegion(region); } inline Region::Region(IN const GraphicsPath* path) { GpRegion *region = NULL; lastResult = DllExports::GdipCreateRegionPath(path->nativePath, ®ion); SetNativeRegion(region); } inline Region::Region(IN const BYTE* regionData, IN INT size) { GpRegion *region = NULL; lastResult = DllExports::GdipCreateRegionRgnData(regionData, size, ®ion); SetNativeRegion(region); } inline Region::Region(IN HRGN hRgn) { GpRegion *region = NULL; lastResult = DllExports::GdipCreateRegionHrgn(hRgn, ®ion); SetNativeRegion(region); } inline Region* Region::FromHRGN(IN HRGN hRgn) { GpRegion *region = NULL; if (DllExports::GdipCreateRegionHrgn(hRgn, ®ion) == Ok) { Region* newRegion = new Region(region); if (newRegion == NULL) { DllExports::GdipDeleteRegion(region); } return newRegion; } else return NULL; } inline Region::~Region() { DllExports::GdipDeleteRegion(nativeRegion); } /** * Make a copy of the region object */ inline Region* Region::Clone() const { GpRegion *region = NULL; SetStatus(DllExports::GdipCloneRegion(nativeRegion, ®ion)); return new Region(region); } inline Status Region::MakeInfinite() { return SetStatus(DllExports::GdipSetInfinite(nativeRegion)); } inline Status Region::MakeEmpty() { return SetStatus(DllExports::GdipSetEmpty(nativeRegion)); } /** * Region operations */ inline Status Region::Intersect(IN const RectF& rect) { return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeIntersect)); } inline Status Region::Intersect(IN const Rect& rect) { return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeIntersect)); } inline Status Region::Intersect(IN const GraphicsPath* path) { return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeIntersect)); } inline Status Region::Intersect(IN const Region* region) { return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeIntersect)); } inline Status Region::Union(IN const RectF& rect) { return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeUnion)); } inline Status Region::Union(IN const Rect& rect) { return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeUnion)); } inline Status Region::Union(IN const GraphicsPath* path) { return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeUnion)); } inline Status Region::Union(IN const Region* region) { return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeUnion)); } inline Status Region::Xor(IN const RectF& rect) { return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeXor)); } inline Status Region::Xor(IN const Rect& rect) { return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeXor)); } inline Status Region::Xor(IN const GraphicsPath* path) { return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeXor)); } inline Status Region::Xor(IN const Region* region) { return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeXor)); } inline Status Region::Exclude(IN const RectF& rect) { return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeExclude)); } inline Status Region::Exclude(IN const Rect& rect) { return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeExclude)); } inline Status Region::Exclude(IN const GraphicsPath* path) { return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeExclude)); } inline Status Region::Exclude(IN const Region* region) { return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeExclude)); } inline Status Region::Complement(IN const RectF& rect) { return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeComplement)); } inline Status Region::Complement(IN const Rect& rect) { return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeComplement)); } inline Status Region::Complement(IN const GraphicsPath* path) { return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeComplement)); } inline Status Region::Complement(IN const Region* region) { return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeComplement)); } /** * Transform operations */ inline Status Region::Translate(IN REAL dx, IN REAL dy) { return SetStatus(DllExports::GdipTranslateRegion(nativeRegion, dx, dy)); } inline Status Region::Translate(IN INT dx, IN INT dy) { return SetStatus(DllExports::GdipTranslateRegionI(nativeRegion, dx, dy)); } inline Status Region::Transform(IN const Matrix* matrix) { return SetStatus(DllExports::GdipTransformRegion(nativeRegion, matrix->nativeMatrix)); } /** * Get region attributes */ inline Status Region::GetBounds(OUT RectF* rect, IN const Graphics* g) const { return SetStatus(DllExports::GdipGetRegionBounds(nativeRegion, g->nativeGraphics, rect)); } inline Status Region::GetBounds(OUT Rect* rect, IN const Graphics* g) const { return SetStatus(DllExports::GdipGetRegionBoundsI(nativeRegion, g->nativeGraphics, rect)); } inline HRGN Region::GetHRGN(IN const Graphics* g) const { HRGN hrgn; SetStatus(DllExports::GdipGetRegionHRgn(nativeRegion, g->nativeGraphics, &hrgn)); return hrgn; } inline BOOL Region::IsEmpty(IN const Graphics *g) const { BOOL booln = FALSE; SetStatus(DllExports::GdipIsEmptyRegion(nativeRegion, g->nativeGraphics, &booln)); return booln; } inline BOOL Region::IsInfinite(IN const Graphics *g) const { BOOL booln = FALSE; SetStatus(DllExports::GdipIsInfiniteRegion(nativeRegion, g->nativeGraphics, &booln)); return booln; } inline BOOL Region::Equals(IN const Region* region, IN const Graphics* g) const { BOOL booln = FALSE; SetStatus(DllExports::GdipIsEqualRegion(nativeRegion, region->nativeRegion, g->nativeGraphics, &booln)); return booln; } // Get the size of the buffer needed for the GetData method inline UINT Region::GetDataSize() const { UINT bufferSize = 0; SetStatus(DllExports::GdipGetRegionDataSize(nativeRegion, &bufferSize)); return bufferSize; } // buffer - where to put the data // bufferSize - how big the buffer is (should be at least as big as GetDataSize()) // sizeFilled - if not NULL, this is an OUT param that says how many bytes // of data were written to the buffer. inline Status Region::GetData(OUT BYTE* buffer, IN UINT bufferSize, OUT UINT* sizeFilled) const { return SetStatus(DllExports::GdipGetRegionData(nativeRegion, buffer, bufferSize, sizeFilled)); } /** * Hit testing operations */ inline BOOL Region::IsVisible(IN const PointF& point, IN const Graphics* g) const { BOOL booln = FALSE; SetStatus(DllExports::GdipIsVisibleRegionPoint(nativeRegion, point.X, point.Y, (g == NULL) ? NULL : g->nativeGraphics, &booln)); return booln; } inline BOOL Region::IsVisible(IN const RectF& rect, IN const Graphics* g) const { BOOL booln = FALSE; SetStatus(DllExports::GdipIsVisibleRegionRect(nativeRegion, rect.X, rect.Y, rect.Width, rect.Height, (g == NULL) ? NULL : g->nativeGraphics, &booln)); return booln; } inline BOOL Region::IsVisible(IN const Point& point, IN const Graphics* g) const { BOOL booln = FALSE; SetStatus(DllExports::GdipIsVisibleRegionPointI(nativeRegion, point.X, point.Y, (g == NULL) ? NULL : g->nativeGraphics, &booln)); return booln; } inline BOOL Region::IsVisible(IN const Rect& rect, IN const Graphics* g) const { BOOL booln = FALSE; SetStatus(DllExports::GdipIsVisibleRegionRectI(nativeRegion, rect.X, rect.Y, rect.Width, rect.Height, (g == NULL) ? NULL : g->nativeGraphics, &booln)); return booln; } inline UINT Region::GetRegionScansCount(IN const Matrix* matrix) const { UINT count = 0; SetStatus(DllExports::GdipGetRegionScansCount(nativeRegion, &count, matrix->nativeMatrix)); return count; } inline Status Region::GetRegionScans( IN const Matrix* matrix, OUT RectF* rects, IN OUT INT* count) const { return SetStatus(DllExports::GdipGetRegionScans(nativeRegion, rects, count, matrix->nativeMatrix)); } // If rects is NULL, return the count of rects in the region. // Otherwise, assume rects is big enough to hold all the region rects // and fill them in and return the number of rects filled in. // The rects are returned in the units specified by the matrix // (which is typically a world-to-device transform). // Note that the number of rects returned can vary, depending on the // matrix that is used. inline Status Region::GetRegionScans( IN const Matrix* matrix, OUT Rect* rects, // NULL to just get the count IN OUT INT* count) const { return SetStatus(DllExports::GdipGetRegionScansI(nativeRegion, rects, count, matrix->nativeMatrix)); } // protected method inline Region::Region(GpRegion* nativeRegion) { SetNativeRegion(nativeRegion); } // protected method inline VOID Region::SetNativeRegion(GpRegion* nativeRegion) { this->nativeRegion = nativeRegion; } inline Status Region::GetLastStatus() const { Status lastStatus = lastResult; lastResult = Ok; return lastStatus; } #endif // !_GDIPLUSREGION_H