public static Surface CreateThumbnail(Surface sourceSurface, PdnGraphicsPath maskPath, Rectangle bounds, int thumbSideLength) { Size thumbSize = Utility.ComputeThumbnailSize(bounds.Size, thumbSideLength); Surface thumb = new Surface(Math.Max(5, thumbSize.Width + 4), Math.Max(5, thumbSize.Height + 4)); thumb.Clear(ColorBgra.Transparent); thumb.Clear(new Rectangle(1, 1, thumb.Width - 2, thumb.Height - 2), ColorBgra.Black); Rectangle insetRect = new Rectangle(2, 2, thumb.Width - 4, thumb.Height - 4); Surface thumbInset = thumb.CreateWindow(insetRect); thumbInset.Clear(ColorBgra.Transparent); float scaleX = (float)thumbInset.Width / (float)bounds.Width; float scaleY = (float)thumbInset.Height / (float)bounds.Height; Matrix scaleMatrix = new Matrix(); scaleMatrix.Translate(-bounds.X, -bounds.Y, System.Drawing.Drawing2D.MatrixOrder.Append); scaleMatrix.Scale(scaleX, scaleY, System.Drawing.Drawing2D.MatrixOrder.Append); thumbInset.SuperSamplingFitSurface(sourceSurface); Surface maskInset = new Surface(thumbInset.Size); maskInset.Clear(ColorBgra.Black); using (RenderArgs maskInsetRA = new RenderArgs(maskInset)) { maskInsetRA.Graphics.SmoothingMode = SmoothingMode.AntiAlias; maskInsetRA.Graphics.Transform = scaleMatrix; maskInsetRA.Graphics.FillPath(Brushes.White, maskPath); maskInsetRA.Graphics.DrawPath(Pens.White, maskPath); } scaleMatrix.Dispose(); scaleMatrix = null; IntensityMaskOp maskOp = new IntensityMaskOp(); maskOp.Apply(maskInset, thumbInset, maskInset); UserBlendOps.NormalBlendOp normalOp = new UserBlendOps.NormalBlendOp(); thumbInset.ClearWithCheckboardPattern(); normalOp.Apply(thumbInset, thumbInset, maskInset); maskInset.Dispose(); maskInset = null; thumbInset.Dispose(); thumbInset = null; using (RenderArgs thumbRA = new RenderArgs(thumb)) { Utility.DrawDropShadow1px(thumbRA.Graphics, thumb.Bounds); } return(thumb); }
public static Surface CreateThumbnail(Surface sourceSurface, PdnGraphicsPath maskPath, Rectangle bounds, int thumbSideLength) { Size thumbSize = Utility.ComputeThumbnailSize(bounds.Size, thumbSideLength); Surface thumb = new Surface(Math.Max(5, thumbSize.Width + 4), Math.Max(5, thumbSize.Height + 4)); thumb.Clear(ColorBgra.Transparent); thumb.Clear(new Rectangle(1, 1, thumb.Width - 2, thumb.Height - 2), ColorBgra.Black); Rectangle insetRect = new Rectangle(2, 2, thumb.Width - 4, thumb.Height - 4); Surface thumbInset = thumb.CreateWindow(insetRect); thumbInset.Clear(ColorBgra.Transparent); float scaleX = (float)thumbInset.Width / (float)bounds.Width; float scaleY = (float)thumbInset.Height / (float)bounds.Height; Matrix scaleMatrix = new Matrix(); scaleMatrix.Translate(-bounds.X, -bounds.Y, System.Drawing.Drawing2D.MatrixOrder.Append); scaleMatrix.Scale(scaleX, scaleY, System.Drawing.Drawing2D.MatrixOrder.Append); thumbInset.SuperSamplingFitSurface(sourceSurface); Surface maskInset = new Surface(thumbInset.Size); maskInset.Clear(ColorBgra.Black); using (RenderArgs maskInsetRA = new RenderArgs(maskInset)) { maskInsetRA.Graphics.SmoothingMode = SmoothingMode.AntiAlias; maskInsetRA.Graphics.Transform = scaleMatrix; maskInsetRA.Graphics.FillPath(Brushes.White, maskPath); maskInsetRA.Graphics.DrawPath(Pens.White, maskPath); } scaleMatrix.Dispose(); scaleMatrix = null; IntensityMaskOp maskOp = new IntensityMaskOp(); maskOp.Apply(maskInset, thumbInset, maskInset); UserBlendOps.NormalBlendOp normalOp = new UserBlendOps.NormalBlendOp(); thumbInset.ClearWithCheckboardPattern(); normalOp.Apply(thumbInset, thumbInset, maskInset); maskInset.Dispose(); maskInset = null; thumbInset.Dispose(); thumbInset = null; using (RenderArgs thumbRA = new RenderArgs(thumb)) { Utility.DrawDropShadow1px(thumbRA.Graphics, thumb.Bounds); } return thumb; }