www.pudn.com > GDIPlusCF.zip > BrushPlus.cs
using System;
using System.Collections.Generic;
using System.Text;
using Color = System.Drawing.Color;
namespace OpenNETCF.GDIPlus
{
public class BrushPlus: IDisposable
{
~BrushPlus()
{
Dispose(true);
}
internal virtual BrushPlus Clone()
{
GpBrush brush = new GpBrush();
SetStatus(NativeMethods.GdipCloneBrush(nativeBrush, out brush));
BrushPlus newBrush = new BrushPlus(brush, lastResult);
if (newBrush == null)
{
NativeMethods.GdipDeleteBrush(brush);
}
return newBrush;
}
BrushType GetType()
{
BrushType type = (BrushType)(-1);
SetStatus(NativeMethods.GdipGetBrushType(nativeBrush, out type));
return type;
}
public GpStatus GetLastStatus()
{
GpStatus lastStatus = lastResult;
lastResult = GpStatus.Ok;
return lastStatus;
}
public BrushPlus()
{
SetStatus(GpStatus.NotImplemented);
}
public BrushPlus(GpBrush nativeBrush, GpStatus status)
{
lastResult = status;
SetNativeBrush(nativeBrush);
}
public void SetNativeBrush(GpBrush nativeBrush)
{
this.nativeBrush = nativeBrush;
}
protected GpStatus SetStatus(GpStatus status)
{
if (status != GpStatus.Ok)
return (lastResult = status);
else
return status;
}
internal GpBrush nativeBrush;
protected GpStatus lastResult;
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
}
// free native resources if there are any.
if ((IntPtr)nativeBrush != IntPtr.Zero)
{
NativeMethods.GdipDeleteBrush(nativeBrush);
nativeBrush = new GpBrush();
}
}
#region IDisposable Members
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
}
public class SolidBrushPlus : BrushPlus
{
public SolidBrushPlus()
{
}
public SolidBrushPlus(Color color)
{
GpSolidFill brush;
lastResult = NativeMethods.GdipCreateSolidFill(color.ToArgb(), out brush);
SetNativeBrush(brush);
}
GpStatus GetColor(out Color color)
{
int argb;
SetStatus(NativeMethods.GdipGetSolidFillColor((GpSolidFill)nativeBrush,
out argb));
color = Color.FromArgb(argb);
return lastResult;
}
GpStatus SetColor(Color color)
{
return SetStatus(NativeMethods.GdipSetSolidFillColor((GpSolidFill)nativeBrush,
color.ToArgb()));
}
}
public class TextureBrushPlus : BrushPlus
{
public TextureBrushPlus() { }
public TextureBrushPlus(ImagePlus image,
WrapMode wrapMode)
{
GpTexture texture;
GpRectF rc; Unit unit;
image.GetBounds(out rc, out unit);
lastResult = NativeMethods.GdipCreateTextureIA(
image.nativeImage,
new GpImageAttributes(),
rc.X,
rc.Y,
rc.Width,
rc.Height,
out texture);
SetNativeBrush(texture);
}
// When creating a texture brush from a metafile image, the dstRect
// is used to specify the size that the metafile image should be
// rendered at in the device units of the destination graphics.
// It is NOT used to crop the metafile image, so only the width
// and height values matter for metafiles.
TextureBrushPlus(ImagePlus image,
WrapMode wrapMode,
GpRectF dstRect)
{
GpTexture texture;
lastResult = NativeMethods.GdipCreateTexture2(
image.nativeImage,
wrapMode,
dstRect.X,
dstRect.Y,
dstRect.Width,
dstRect.Height,
out texture);
SetNativeBrush(texture);
}
public TextureBrushPlus(ImagePlus image,
GpRectF dstRect,
ImageAttributesPlus imageAttributes)
{
GpTexture texture;
lastResult = NativeMethods.GdipCreateTextureIA(
image.nativeImage,
(imageAttributes != null) ? imageAttributes.nativeImageAttr : new GpImageAttributes(),
dstRect.X,
dstRect.Y,
dstRect.Width,
dstRect.Height,
out texture
);
SetNativeBrush(texture);
}
TextureBrushPlus(ImagePlus image,
GpRect dstRect,
ImageAttributesPlus imageAttributes)
{
GpTexture texture;
lastResult = NativeMethods.GdipCreateTextureIAI(
image.nativeImage,
(imageAttributes != null) ? imageAttributes.nativeImageAttr : new GpImageAttributes(),
dstRect.X,
dstRect.Y,
dstRect.Width,
dstRect.Height,
out texture
);
SetNativeBrush(texture);
}
TextureBrushPlus(
ImagePlus image,
WrapMode wrapMode,
GpRect dstRect
)
{
GpTexture texture;
lastResult = NativeMethods.GdipCreateTexture2I(
image.nativeImage,
wrapMode,
dstRect.X,
dstRect.Y,
dstRect.Width,
dstRect.Height,
out texture);
SetNativeBrush(texture);
}
TextureBrushPlus(ImagePlus image,
WrapMode wrapMode,
float dstX,
float dstY,
float dstWidth,
float dstHeight)
{
GpTexture texture;
lastResult = NativeMethods.GdipCreateTexture2(
image.nativeImage,
wrapMode,
dstX,
dstY,
dstWidth,
dstHeight,
out texture);
SetNativeBrush(texture);
}
TextureBrushPlus(ImagePlus image,
WrapMode wrapMode,
int dstX,
int dstY,
int dstWidth,
int dstHeight)
{
GpTexture texture;
lastResult = NativeMethods.GdipCreateTexture2I(
image.nativeImage,
wrapMode,
dstX,
dstY,
dstWidth,
dstHeight,
out texture);
SetNativeBrush(texture);
}
GpStatus SetWrapMode(WrapMode wrapMode)
{
return SetStatus(NativeMethods.GdipSetTextureWrapMode((GpTexture)nativeBrush,
wrapMode));
}
WrapMode GetWrapMode()
{
WrapMode wrapMode;
SetStatus(NativeMethods.GdipGetTextureWrapMode((GpTexture)nativeBrush,
out wrapMode));
return wrapMode;
}
ImagePlus GetImage()
{
GpImage image;
SetStatus(NativeMethods.GdipGetTextureImage((GpTexture)nativeBrush,
out image));
ImagePlus retimage = new ImagePlus(image, lastResult);
return retimage;
}
}
public class LinearGradientBrush : BrushPlus
{
public LinearGradientBrush() { }
public LinearGradientBrush(GpPointF point1,
GpPointF point2,
Color color1,
Color color2)
{
GpLineGradient brush;
lastResult = NativeMethods.GdipCreateLineBrush(ref point1,
ref point2,
color1.ToArgb(),
color2.ToArgb(),
WrapMode.WrapModeTile,
out brush);
SetNativeBrush(brush);
}
LinearGradientBrush(GpPoint point1,
GpPoint point2,
Color color1,
Color color2)
{
GpLineGradient brush;
lastResult = NativeMethods.GdipCreateLineBrushI(ref point1,
ref point2,
color1.ToArgb(),
color2.ToArgb(),
WrapMode.WrapModeTile,
out brush);
SetNativeBrush(brush);
}
public LinearGradientBrush(GpRectF rect,
Color color1,
Color color2,
LinearGradientMode mode)
{
GpLineGradient brush;
lastResult = NativeMethods.GdipCreateLineBrushFromRect(ref rect,
color1.ToArgb(),
color2.ToArgb(),
mode,
WrapMode.WrapModeTile,
out brush);
SetNativeBrush(brush);
}
LinearGradientBrush(GpRect rect,
Color color1,
Color color2,
LinearGradientMode mode)
{
GpLineGradient brush;
lastResult = NativeMethods.GdipCreateLineBrushFromRectI(ref rect,
color1.ToArgb(),
color2.ToArgb(),
mode,
WrapMode.WrapModeTile,
out brush);
SetNativeBrush(brush);
}
LinearGradientBrush(GpRectF rect,
Color color1,
Color color2,
float angle,
bool isAngleScalable)
{
GpLineGradient brush;
lastResult = NativeMethods.GdipCreateLineBrushFromRectWithAngle(ref rect,
color1.ToArgb(),
color2.ToArgb(),
angle,
isAngleScalable,
WrapMode.WrapModeTile,
out brush);
SetNativeBrush(brush);
}
LinearGradientBrush(GpRect rect,
Color color1,
Color color2,
float angle,
bool isAngleScalable)
{
GpLineGradient brush = new GpLineGradient();
lastResult = NativeMethods.GdipCreateLineBrushFromRectWithAngleI(ref rect,
color1.ToArgb(),
color2.ToArgb(),
angle,
isAngleScalable,
WrapMode.WrapModeTile,
out brush);
SetNativeBrush(brush);
}
GpStatus SetLinearColors(Color color1,
Color color2)
{
return SetStatus(NativeMethods.GdipSetLineColors((GpLineGradient)nativeBrush,
color1.ToArgb(),
color2.ToArgb()));
}
GpStatus GetLinearColors(Color[] colors)
{
int[] argb = new int[2];
GpStatus status = SetStatus(NativeMethods.GdipGetLineColors((GpLineGradient)nativeBrush, argb));
if (status == GpStatus.Ok)
{
// use bitwise copy operator for Color copy
colors[0] = Color.FromArgb(argb[0]);
colors[1] = Color.FromArgb(argb[1]);
}
return status;
}
GpStatus GetRectangle(out GpRectF rect)
{
return SetStatus(NativeMethods.GdipGetLineRect((GpLineGradient)nativeBrush, out rect));
}
GpStatus GetRectangle(out GpRect rect)
{
return SetStatus(NativeMethods.GdipGetLineRectI((GpLineGradient)nativeBrush, out rect));
}
GpStatus SetGammaCorrection(bool useGammaCorrection)
{
return SetStatus(NativeMethods.GdipSetLineGammaCorrection((GpLineGradient)nativeBrush,
useGammaCorrection));
}
bool GetGammaCorrection()
{
bool useGammaCorrection;
SetStatus(NativeMethods.GdipGetLineGammaCorrection((GpLineGradient)nativeBrush,
out useGammaCorrection));
return useGammaCorrection;
}
int GetBlendCount()
{
int count = 0;
SetStatus(NativeMethods.GdipGetLineBlendCount((GpLineGradient)
nativeBrush,
out count));
return count;
}
GpStatus SetBlend(float[] blendFactors,
float[] blendPositions)
{
return SetStatus(NativeMethods.GdipSetLineBlend((GpLineGradient)
nativeBrush,
blendFactors,
blendPositions,
blendFactors.Length));
}
GpStatus GetBlend(float[] blendFactors,
float[] blendPositions)
{
return SetStatus(NativeMethods.GdipGetLineBlend((GpLineGradient)nativeBrush,
blendFactors,
blendPositions,
blendFactors.Length));
}
int GetInterpolationColorCount()
{
int count = 0;
SetStatus(NativeMethods.GdipGetLinePresetBlendCount((GpLineGradient)
nativeBrush,
out count));
return count;
}
GpStatus SetInterpolationColors(Color[] presetColors,
float[] blendPositions)
{
int count = presetColors.Length;
int[] argbs = new int[count];
for (int i = 0; i < count; i++)
{
argbs[i] = presetColors[i].ToArgb();
}
GpStatus status = SetStatus(NativeMethods.GdipSetLinePresetBlend(
(GpLineGradient)nativeBrush,
argbs,
blendPositions,
argbs.Length));
return status;
}
GpStatus GetInterpolationColors(Color[] presetColors,
float[] blendPositions)
{
int count = presetColors.Length;
int[] argbs = new int[count];
GpStatus status = SetStatus(NativeMethods.GdipGetLinePresetBlend((GpLineGradient)nativeBrush,
argbs,
blendPositions,
argbs.Length));
if (status == GpStatus.Ok)
{
for (int i = 0; i < count; i++)
{
presetColors[i] = Color.FromArgb(argbs[i]);
}
}
return status;
}
GpStatus SetBlendBellShape(float focus,
float scale)
{
return SetStatus(NativeMethods.GdipSetLineSigmaBlend((GpLineGradient)nativeBrush, focus, scale));
}
GpStatus SetBlendTriangularShape(
float focus,
float scale)
{
return SetStatus(NativeMethods.GdipSetLineLinearBlend((GpLineGradient)nativeBrush, focus, scale));
}
GpStatus SetWrapMode(WrapMode wrapMode)
{
return SetStatus(NativeMethods.GdipSetLineWrapMode((GpLineGradient)nativeBrush,
wrapMode));
}
WrapMode GetWrapMode()
{
WrapMode wrapMode;
SetStatus(NativeMethods.GdipGetLineWrapMode((GpLineGradient)
nativeBrush,
out wrapMode));
return wrapMode;
}
}
public class HatchBrush : BrushPlus
{
public HatchBrush(HatchStyle hatchStyle,
Color foreColor,
Color backColor)
{
GpHatch brush = new GpHatch();
lastResult = NativeMethods.GdipCreateHatchBrush(hatchStyle,
foreColor.ToArgb(),
backColor.ToArgb(),
out brush);
SetNativeBrush(brush);
}
HatchStyle GetHatchStyle()
{
HatchStyle hatchStyle;
SetStatus(NativeMethods.GdipGetHatchStyle((GpHatch)nativeBrush,
out hatchStyle));
return hatchStyle;
}
GpStatus GetForegroundColor(out Color color)
{
int argb;
GpStatus status = SetStatus(NativeMethods.GdipGetHatchForegroundColor(
(GpHatch)nativeBrush,
out argb));
color = Color.FromArgb(argb);
return status;
}
GpStatus GetBackgroundColor(out Color color)
{
int argb;
GpStatus status = SetStatus(NativeMethods.GdipGetHatchBackgroundColor(
(GpHatch)nativeBrush,
out argb));
color = Color.FromArgb(argb);
return status;
}
}
public class PathGradientBrush : BrushPlus
{
public PathGradientBrush(
GpPointF[] points,
WrapMode wrapMode)
{
GpPathGradient brush = new GpPathGradient();
lastResult = NativeMethods.GdipCreatePathGradient(
points, points.Length,
wrapMode, out brush);
SetNativeBrush(brush);
}
public PathGradientBrush(
GpPoint[] points,
WrapMode wrapMode)
{
GpPathGradient brush = new GpPathGradient();
lastResult = NativeMethods.GdipCreatePathGradientI(
points, points.Length,
wrapMode, out brush);
SetNativeBrush(brush);
}
public PathGradientBrush(
GraphicsPath path
)
{
GpPathGradient brush = new GpPathGradient();
lastResult = NativeMethods.GdipCreatePathGradientFromPath(
path.nativePath, out brush);
SetNativeBrush(brush);
}
public GpStatus GetCenterColor(out Color color)
{
int argb;
SetStatus(NativeMethods.GdipGetPathGradientCenterColor(
(GpPathGradient)nativeBrush, out argb));
color = Color.FromArgb(argb);
return lastResult;
}
public GpStatus SetCenterColor(Color color)
{
SetStatus(NativeMethods.GdipSetPathGradientCenterColor(
(GpPathGradient)nativeBrush,
color.ToArgb()));
return lastResult;
}
public int GetPointCount()
{
int count;
SetStatus(NativeMethods.GdipGetPathGradientPointCount(
(GpPathGradient)nativeBrush, out count));
return count;
}
public int GetSurroundColorCount()
{
int count;
SetStatus(NativeMethods.GdipGetPathGradientSurroundColorCount(
(GpPathGradient)nativeBrush, out count));
return count;
}
public GpStatus GetSurroundColors(Color[] colors, ref int count)
{
int count1;
SetStatus(NativeMethods.GdipGetPathGradientSurroundColorCount(
(GpPathGradient)nativeBrush, out count1));
if (lastResult != GpStatus.Ok)
return lastResult;
if ((count < count1) || (count1 <= 0))
return SetStatus(GpStatus.InsufficientBuffer);
int[] argbs = new int[count1];
SetStatus(NativeMethods.GdipGetPathGradientSurroundColorsWithCount(
(GpPathGradient)nativeBrush, argbs, out count1));
if (lastResult == GpStatus.Ok)
{
for (int i = 0; i < count1; i++)
{
colors[i] = Color.FromArgb(argbs[i]);
}
count = count1;
}
return lastResult;
}
public GpStatus SetSurroundColors(Color[] colors,
ref int count)
{
int count1 = GetPointCount();
if ((count > count1) || (count1 <= 0))
return SetStatus(GpStatus.InvalidParameter);
count1 = count;
int[] argbs = new int[count1];
for (int i = 0; i < count1; i++)
argbs[i] = colors[i].ToArgb();
SetStatus(NativeMethods.GdipSetPathGradientSurroundColorsWithCount(
(GpPathGradient)nativeBrush, argbs, ref count1));
if (lastResult == GpStatus.Ok)
count = count1;
return lastResult;
}
public GpStatus GetGraphicsPath(out GraphicsPath path)
{
path = new GraphicsPath();
return SetStatus(NativeMethods.GdipGetPathGradientPath(
(GpPathGradient)nativeBrush, out path.nativePath));
}
public GpStatus SetGraphicsPath(GraphicsPath path)
{
if (path == null)
return SetStatus(GpStatus.InvalidParameter);
return SetStatus(NativeMethods.GdipSetPathGradientPath(
(GpPathGradient)nativeBrush, path.nativePath));
}
public GpStatus GetCenterPoint(out GpPointF point)
{
return SetStatus(NativeMethods.GdipGetPathGradientCenterPoint(
(GpPathGradient)nativeBrush,
out point));
}
public GpStatus GetCenterPoint(out GpPoint point)
{
return SetStatus(NativeMethods.GdipGetPathGradientCenterPointI(
(GpPathGradient)nativeBrush,
out point));
}
public GpStatus SetCenterPoint(GpPointF point)
{
return SetStatus(NativeMethods.GdipSetPathGradientCenterPoint(
(GpPathGradient)nativeBrush,
ref point));
}
public GpStatus SetCenterPoint(GpPoint point)
{
return SetStatus(NativeMethods.GdipSetPathGradientCenterPointI(
(GpPathGradient)nativeBrush,
ref point));
}
public GpStatus GetRectangle(out GpRectF rect)
{
rect = new GpRectF();
return SetStatus(NativeMethods.GdipGetPathGradientRect(
(GpPathGradient)nativeBrush, out rect));
}
public GpStatus GetRectangle(out GpRect rect)
{
rect = new GpRect();
return SetStatus(NativeMethods.GdipGetPathGradientRectI(
(GpPathGradient)nativeBrush, out rect));
}
public GpStatus SetGammaCorrection(bool useGammaCorrection)
{
return SetStatus(NativeMethods.GdipSetPathGradientGammaCorrection(
(GpPathGradient)nativeBrush, useGammaCorrection));
}
public bool GetGammaCorrection()
{
bool useGammaCorrection;
SetStatus(NativeMethods.GdipGetPathGradientGammaCorrection(
(GpPathGradient)nativeBrush, out useGammaCorrection));
return useGammaCorrection;
}
public int GetBlendCount()
{
int count = 0;
SetStatus(NativeMethods.GdipGetPathGradientBlendCount(
(GpPathGradient)nativeBrush, out count));
return count;
}
public GpStatus GetBlend(float[] blendFactors,
float[] blendPositions)
{
return SetStatus(NativeMethods.GdipGetPathGradientBlend(
(GpPathGradient)nativeBrush,
blendFactors, blendPositions, blendFactors.Length));
}
public GpStatus SetBlend(float[] blendFactors,
float[] blendPositions)
{
return SetStatus(NativeMethods.GdipSetPathGradientBlend(
(GpPathGradient)nativeBrush,
blendFactors, blendPositions, blendFactors.Length));
}
public int GetInterpolationColorCount()
{
int count = 0;
SetStatus(NativeMethods.GdipGetPathGradientPresetBlendCount(
(GpPathGradient)nativeBrush, out count));
return count;
}
public GpStatus SetInterpolationColors(Color[] presetColors,
float[] blendPositions)
{
int[] argbs = new int[presetColors.Length];
for (int i = 0; i < argbs.Length; i++)
{
argbs[i] = presetColors[i].ToArgb();
}
GpStatus status = SetStatus(NativeMethods.
GdipSetPathGradientPresetBlend(
(GpPathGradient)nativeBrush,
argbs,
blendPositions,
argbs.Length));
return status;
}
public GpStatus GetInterpolationColors(Color[] presetColors,
float[] blendPositions)
{
int[] argbs = new int[presetColors.Length];
GpStatus status = SetStatus(NativeMethods.GdipGetPathGradientPresetBlend(
(GpPathGradient)nativeBrush,
argbs,
blendPositions,
argbs.Length));
for (int i = 0; i < presetColors.Length; i++)
{
presetColors[i] = Color.FromArgb(argbs[i]);
}
return status;
}
public GpStatus SetBlendBellShape(float focus,
float scale)
{
return SetStatus(NativeMethods.GdipSetPathGradientSigmaBlend(
(GpPathGradient)nativeBrush, focus, scale));
}
public GpStatus SetBlendTriangularShape(
float focus,
float scale
)
{
return SetStatus(NativeMethods.GdipSetPathGradientLinearBlend(
(GpPathGradient)nativeBrush, focus, scale));
}
//GpStatus GetFocusScales(OUT float* xScale,
// OUT float* yScale)
//{
// return SetStatus(NativeMethods.GdipGetPathGradientFocusScales(
// (GpPathGradient ) nativeBrush, xScale, yScale));
//}
//GpStatus SetFocusScales(float xScale,
// float yScale)
//{
// return SetStatus(NativeMethods.GdipSetPathGradientFocusScales(
// (GpPathGradient ) nativeBrush, xScale, yScale));
//}
public WrapMode GetWrapMode()
{
WrapMode wrapMode;
SetStatus(NativeMethods.GdipGetPathGradientWrapMode(
(GpPathGradient)nativeBrush, out wrapMode));
return wrapMode;
}
public GpStatus SetWrapMode(WrapMode wrapMode)
{
return SetStatus(NativeMethods.GdipSetPathGradientWrapMode(
(GpPathGradient)nativeBrush, wrapMode));
}
public PathGradientBrush()
{
}
}
}