using System;
using System.Drawing;
using System.Reflection;
namespace Microsoft.Drawing
{
///
/// BufferedGraphicsEx辅助类
///
public static class BufferedGraphicsEx
{
private static readonly FieldInfo FiTargetLoc; //BufferedGraphics.targetLoc字段信息
private static readonly FieldInfo FiVirtulSize; //BufferedGraphics.virtualSize字段信息
///
/// 静态构造
///
static BufferedGraphicsEx()
{
Type type = typeof(BufferedGraphics);
BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
FiTargetLoc = type.GetField("targetLoc", flags);
FiVirtulSize = type.GetField("virtualSize", flags);
}
///
/// 获取缓冲区的目标坐标。
///
/// 缓冲区。
/// 缓冲区的目标坐标
public static Point GetTargetLoc(BufferedGraphics bg)
{
if (bg == null)
throw new ArgumentNullException("bg");
return (Point)FiTargetLoc.GetValue(bg);
}
///
/// 获取缓冲区的虚拟尺寸大小。
///
/// 缓冲区。
/// 缓冲区的虚拟尺寸大小。
public static Size GetVirtualSize(BufferedGraphics bg)
{
if (bg == null)
throw new ArgumentNullException("bg");
return (Size)FiVirtulSize.GetValue(bg);
}
///
/// 将图形缓冲区的内容写入指定的 System.Drawing.Graphics 对象。
///
/// 图形缓冲区,要混合的源。
/// 一个 System.Drawing.Graphics 对象,要向其中写入图形缓冲区的内容。
/// 目标矩形。
public static void Render(BufferedGraphics bgSrc, Graphics gDest, Rectangle rcDest)
{
//验证
if (bgSrc == null || gDest == null || !RectangleEx.IsVisible(rcDest))
return;
//反射获取私有字段
Point targetLoc = (Point)FiTargetLoc.GetValue(bgSrc);
targetLoc.Offset(rcDest.X, rcDest.Y);
Size virtualSize = rcDest.Size;
Point sourceLoc = rcDest.Location;
//混合渲染
GraphicsEx.Render(bgSrc.Graphics, gDest, targetLoc, sourceLoc, virtualSize);
}
///
/// 将图形缓冲区的内容与指定的 System.Drawing.Graphics 对象混合。(支持缓冲区Alpha通道)
///
///
/// 一个 System.Drawing.Graphics 对象,图形缓冲区要混合的目标。
public static void BlendRender(BufferedGraphics bgSrc, Graphics gDest)
{
//验证
if (bgSrc == null || gDest == null)
return;
//反射获取私有字段
Point targetLoc = (Point)FiTargetLoc.GetValue(bgSrc);
Size virtualSize = (Size)FiVirtulSize.GetValue(bgSrc);
//混合渲染
GraphicsEx.BlendRender(bgSrc.Graphics, gDest, targetLoc, Point.Empty, virtualSize);
}
///
/// 将图形缓冲区的内容与指定的 System.Drawing.Graphics 对象混合。(支持缓冲区Alpha通道)
///
/// 图形缓冲区,要混合的源。
/// 一个 System.Drawing.Graphics 对象,图形缓冲区要混合的目标。
/// 目标矩形。
public static void BlendRender(BufferedGraphics bgSrc, Graphics gDest, Rectangle rcDest)
{
//验证
if (bgSrc == null || gDest == null || !RectangleEx.IsVisible(rcDest))
return;
//反射获取私有字段
Point targetLoc = (Point)FiTargetLoc.GetValue(bgSrc);
targetLoc.Offset(rcDest.X, rcDest.Y);
Size virtualSize = rcDest.Size;
Point sourceLoc = rcDest.Location;
//混合渲染
GraphicsEx.BlendRender(bgSrc.Graphics, gDest, targetLoc, sourceLoc, virtualSize);
}
}
}