www.pudn.com > GDIPlusCF.zip > RegionPlus.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace OpenNETCF.GDIPlus
{
public class RegionPlus
{
RegionPlus()
{
GpRegion region = new GpRegion();
lastResult = NativeMethods.GdipCreateRegion(out region);
SetNativeRegion(region);
}
RegionPlus(GpRectF rect)
{
GpRegion region = new GpRegion();
lastResult = NativeMethods.GdipCreateRegionRect(ref rect, out region);
SetNativeRegion(region);
}
RegionPlus(GpRect rect)
{
GpRegion region = new GpRegion();
lastResult = NativeMethods.GdipCreateRegionRectI(ref rect, out region);
SetNativeRegion(region);
}
RegionPlus(GraphicsPath path)
{
GpRegion region = new GpRegion();
lastResult = NativeMethods.GdipCreateRegionPath(path.nativePath, out region);
SetNativeRegion(region);
}
RegionPlus(byte[] regionData)
{
GpRegion region = new GpRegion();
lastResult = NativeMethods.GdipCreateRegionRgnData(regionData, regionData.Length,
out region);
SetNativeRegion(region);
}
RegionPlus(HRGN hRgn)
{
GpRegion region = new GpRegion();
lastResult = NativeMethods.GdipCreateRegionHrgn(hRgn, out region);
SetNativeRegion(region);
}
RegionPlus FromHRGN(HRGN hRgn)
{
GpRegion region = new GpRegion();
if (NativeMethods.GdipCreateRegionHrgn(hRgn, out region) == GpStatus.Ok)
{
RegionPlus newRegion = new RegionPlus(region);
if (newRegion == null)
{
NativeMethods.GdipDeleteRegion(region);
}
return newRegion;
}
else
return null;
}
~RegionPlus()
{
NativeMethods.GdipDeleteRegion(nativeRegion);
}
RegionPlus
Clone()
{
GpRegion region = new GpRegion();
SetStatus(NativeMethods.GdipCloneRegion(nativeRegion, out region));
return new RegionPlus(region);
}
GpStatus
MakeInfinite()
{
return SetStatus(NativeMethods.GdipSetInfinite(nativeRegion));
}
GpStatus
MakeEmpty()
{
return SetStatus(NativeMethods.GdipSetEmpty(nativeRegion));
}
GpStatus
Intersect(GpRectF rect)
{
return SetStatus(NativeMethods.GdipCombineRegionRect(nativeRegion, ref rect,
CombineMode.CombineModeIntersect));
}
GpStatus
Intersect(GpRect rect)
{
return SetStatus(NativeMethods.GdipCombineRegionRectI(nativeRegion, ref rect,
CombineMode.CombineModeIntersect));
}
GpStatus
Intersect(GraphicsPath path)
{
return SetStatus(NativeMethods.GdipCombineRegionPath(nativeRegion,
path.nativePath,
CombineMode.CombineModeIntersect));
}
GpStatus
Intersect(RegionPlus region)
{
return SetStatus(NativeMethods.GdipCombineRegionRegion(nativeRegion,
region.nativeRegion,
CombineMode.CombineModeIntersect));
}
GpStatus
Union(GpRectF rect)
{
return SetStatus(NativeMethods.GdipCombineRegionRect(nativeRegion, ref rect,
CombineMode.CombineModeUnion));
}
GpStatus
Union(GpRect rect)
{
return SetStatus(NativeMethods.GdipCombineRegionRectI(nativeRegion, ref rect,
CombineMode.CombineModeUnion));
}
GpStatus
Union(GraphicsPath path)
{
return SetStatus(NativeMethods.GdipCombineRegionPath(nativeRegion,
path.nativePath,
CombineMode.CombineModeUnion));
}
GpStatus
Union(RegionPlus region)
{
return SetStatus(NativeMethods.GdipCombineRegionRegion(nativeRegion,
region.nativeRegion,
CombineMode.CombineModeUnion));
}
GpStatus
Xor(GpRectF rect)
{
return SetStatus(NativeMethods.GdipCombineRegionRect(nativeRegion, ref rect,
CombineMode.CombineModeXor));
}
GpStatus
Xor(GpRect rect)
{
return SetStatus(NativeMethods.GdipCombineRegionRectI(nativeRegion, ref rect,
CombineMode.CombineModeXor));
}
GpStatus
Xor(GraphicsPath path)
{
return SetStatus(NativeMethods.GdipCombineRegionPath(nativeRegion,
path.nativePath,
CombineMode.CombineModeXor));
}
GpStatus
Xor(RegionPlus region)
{
return SetStatus(NativeMethods.GdipCombineRegionRegion(nativeRegion,
region.nativeRegion,
CombineMode.CombineModeXor));
}
GpStatus
Exclude(GpRectF rect)
{
return SetStatus(NativeMethods.GdipCombineRegionRect(nativeRegion, ref rect,
CombineMode.CombineModeExclude));
}
GpStatus
Exclude(GpRect rect)
{
return SetStatus(NativeMethods.GdipCombineRegionRectI(nativeRegion, ref rect,
CombineMode.CombineModeExclude));
}
GpStatus
Exclude(GraphicsPath path)
{
return SetStatus(NativeMethods.GdipCombineRegionPath(nativeRegion,
path.nativePath,
CombineMode.CombineModeExclude));
}
GpStatus
Exclude(RegionPlus region)
{
return SetStatus(NativeMethods.GdipCombineRegionRegion(nativeRegion,
region.nativeRegion,
CombineMode.CombineModeExclude));
}
GpStatus
Complement(GpRectF rect)
{
return SetStatus(NativeMethods.GdipCombineRegionRect(nativeRegion, ref rect,
CombineMode.CombineModeComplement));
}
GpStatus
Complement(GpRect rect)
{
return SetStatus(NativeMethods.GdipCombineRegionRectI(nativeRegion, ref rect,
CombineMode.CombineModeComplement));
}
GpStatus
Complement(GraphicsPath path)
{
return SetStatus(NativeMethods.GdipCombineRegionPath(nativeRegion,
path.nativePath,
CombineMode.CombineModeComplement));
}
GpStatus
Complement(RegionPlus region)
{
return SetStatus(NativeMethods.GdipCombineRegionRegion(nativeRegion,
region.nativeRegion,
CombineMode.CombineModeComplement));
}
GpStatus
Translate(float dx, float dy)
{
return SetStatus(NativeMethods.GdipTranslateRegion(nativeRegion, dx, dy));
}
GpStatus
Translate(int dx,
int dy)
{
return SetStatus(NativeMethods.GdipTranslateRegionI(nativeRegion, dx, dy));
}
GpStatus
GetBounds(out GpRectF rect,
GraphicsPlus g)
{
return SetStatus(NativeMethods.GdipGetRegionBounds(nativeRegion,
g.nativeGraphics,
out rect));
}
GpStatus
GetBounds(out GpRect rect,
GraphicsPlus g)
{
return SetStatus(NativeMethods.GdipGetRegionBoundsI(nativeRegion,
g.nativeGraphics,
out rect));
}
HRGN
GetHRGN(GraphicsPlus g)
{
HRGN hrgn;
SetStatus(NativeMethods.GdipGetRegionHRgn(nativeRegion,
g.nativeGraphics,
out hrgn));
return hrgn;
}
bool
IsEmpty(GraphicsPlus g)
{
bool booln = false;
SetStatus(NativeMethods.GdipIsEmptyRegion(nativeRegion,
g.nativeGraphics,
out booln));
return booln;
}
bool
IsInfinite(GraphicsPlus g)
{
bool booln = false;
SetStatus(NativeMethods.GdipIsInfiniteRegion(nativeRegion,
g.nativeGraphics,
out booln));
return booln;
}
bool
Equals(RegionPlus region,
GraphicsPlus g)
{
bool booln = false;
SetStatus(NativeMethods.GdipIsEqualRegion(nativeRegion,
region.nativeRegion,
g.nativeGraphics,
out booln));
return booln;
}
// Get the size of the buffer needed for the GetData method
uint
GetDataSize()
{
uint bufferSize = 0;
SetStatus(NativeMethods.GdipGetRegionDataSize(nativeRegion, out 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.
GpStatus
GetData(byte[] buffer, out uint sizeFilled)
{
return SetStatus(NativeMethods.GdipGetRegionData(nativeRegion, buffer,
(uint)buffer.Length, out sizeFilled));
}
/**
* Hit testing operations
*/
bool
IsVisible(GpPointF point,
GraphicsPlus g)
{
bool booln = false;
SetStatus(NativeMethods.GdipIsVisibleRegionPoint(nativeRegion,
point.X, point.Y,
(g == null) ? new GpGraphics() : g.nativeGraphics,
out booln));
return booln;
}
bool
IsVisible(GpRectF rect,
GraphicsPlus g)
{
bool booln = false;
SetStatus(NativeMethods.GdipIsVisibleRegionRect(nativeRegion, rect.X,
rect.Y, rect.Width,
rect.Height,
(g == null) ?
new GpGraphics() : g.nativeGraphics,
out booln));
return booln;
}
bool
IsVisible(GpPoint point,
GraphicsPlus g)
{
bool booln = false;
SetStatus(NativeMethods.GdipIsVisibleRegionPointI(nativeRegion,
point.X,
point.Y,
(g == null)
? new GpGraphics() : g.nativeGraphics,
out booln));
return booln;
}
bool
IsVisible(GpRect rect,
GraphicsPlus g)
{
bool booln = false;
SetStatus(NativeMethods.GdipIsVisibleRegionRectI(nativeRegion,
rect.X,
rect.Y,
rect.Width,
rect.Height,
(g == null)
? new GpGraphics() : g.nativeGraphics,
out booln));
return booln;
}
uint
GetRegionScansCount(Matrix matrix)
{
uint count = 0;
SetStatus(NativeMethods.GdipGetRegionScansCount(nativeRegion,
out count,
matrix.nativeMatrix));
return count;
}
// 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.
GpStatus
GetRegionScans(
Matrix matrix,
GpRectF[] rects,
out int count)
{
count = rects.Length;
return SetStatus(NativeMethods.GdipGetRegionScans(nativeRegion,
rects,
ref count,
matrix.nativeMatrix));
}
GpStatus
GetRegionScans(
Matrix matrix,
GpRect[] rects,
out int count)
{
count = rects.Length;
return SetStatus(NativeMethods.GdipGetRegionScansI(nativeRegion,
rects,
ref count,
matrix.nativeMatrix));
}
RegionPlus(GpRegion nativeRegion)
{
SetNativeRegion(nativeRegion);
}
void SetNativeRegion(GpRegion nativeRegion)
{
this.nativeRegion = nativeRegion;
}
GpStatus SetStatus(GpStatus stat)
{
lastResult = stat;
return stat;
}
GpStatus GetLastStatus()
{
GpStatus lastStatus = lastResult;
lastResult = GpStatus.Ok;
return lastStatus;
}
internal GpRegion nativeRegion;
GpStatus lastResult;
}
}