/// <summary> /// See base docs. /// </summary> /// <param name="brush"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="width"></param> /// <param name="height"></param> public override void FillRectangle(VrsDrawing.IBrush brush, int x, int y, int width, int height) { GdiPlusLock.EnforceSingleThread(() => { if (brush is BrushWrapper brushWrapper) { NativeDrawingContext.FillRectangle(brushWrapper.NativeBrush, x, y, width, height); } }); }
/// <summary> /// See interface docs. /// </summary> /// <param name="red"></param> /// <param name="green"></param> /// <param name="blue"></param> /// <param name="alpha"></param> /// <param name="isCached"></param> /// <returns></returns> protected override VrsDrawing.IBrush CreateBrushWrapper(int red, int green, int blue, int alpha, bool isCached) { VrsDrawing.IBrush result = null; GdiPlusLock.EnforceSingleThread(() => { result = new BrushWrapper( new SolidBrush(Color.FromArgb(alpha, red, green, blue)), isCached ); }); return(result); }
/// <summary> /// See interface docs. /// </summary> /// <param name="pixelWidth"></param> /// <param name="pixelHeight"></param> /// <param name="backgroundBrush"></param> /// <returns></returns> public VrsDrawing.IImage Create(int pixelWidth, int pixelHeight, VrsDrawing.IBrush backgroundBrush) { var image = new Bitmap( pixelWidth, pixelHeight, PixelFormat.Format32bppArgb ); GdiPlusLock.EnforceSingleThread(() => { using (var drawing = new Drawing(Graphics.FromImage(image))) { drawing.FillRectangle(backgroundBrush, 0, 0, pixelWidth, pixelHeight); } }); return(new ImageWrapper(image)); }
/// <summary> /// See base docs. /// </summary> /// <param name="text"></param> /// <param name="font"></param> /// <param name="fillBrush"></param> /// <param name="outlinePen"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="alignment"></param> /// <param name="preferSpeedOverQuality"></param> public override void DrawText(string text, VrsDrawing.IFont font, VrsDrawing.IBrush fillBrush, VrsDrawing.IPen outlinePen, float x, float y, VrsDrawing.HorizontalAlignment alignment, bool preferSpeedOverQuality = true) { if (font is FontWrapper fontWrapper) { GdiPlusLock.EnforceSingleThread(() => { var location = new PointF(x, y); // Mono ignores these flags... var stringFormat = new StringFormat() { Alignment = Convert.ToSystemDrawingStringAlignment(alignment), LineAlignment = Convert.ToSystemDrawingStringAlignment(alignment), FormatFlags = StringFormatFlags.NoWrap, }; using (var graphicsPath = new GraphicsPath()) { graphicsPath.AddString( text, fontWrapper.NativeFont.FontFamily, (int)fontWrapper.NativeFont.Style, fontWrapper.NativeFont.Size, location, stringFormat ); NativeDrawingContext.SmoothingMode = SmoothingMode.AntiAlias; NativeDrawingContext.InterpolationMode = InterpolationMode.HighQualityBicubic; if (outlinePen is PenWrapper outlinePenWrapper) { NativeDrawingContext.DrawPath(outlinePenWrapper.NativePen, graphicsPath); } if (fillBrush is BrushWrapper fillBrushWrapper) { NativeDrawingContext.FillPath(fillBrushWrapper.NativeBrush, graphicsPath); } } }); } }
/// <summary> /// See base docs. /// </summary> /// <param name="width"></param> /// <param name="height"></param> /// <param name="mode"></param> /// <param name="zoomBackground"></param> /// <param name="preferSpeedOverQuality"></param> /// <returns></returns> public override VrsDrawing.IImage Resize(int width, int height, VrsDrawing.ResizeMode mode = VrsDrawing.ResizeMode.Normal, VrsDrawing.IBrush zoomBackground = null, bool preferSpeedOverQuality = true) { var result = new Bitmap(width, height, PixelFormat.Format32bppArgb); var zoomBackgroundBrushWrapper = zoomBackground as BrushWrapper; GdiPlusLock.EnforceSingleThread(() => { using (var graphics = Graphics.FromImage(result)) { graphics.SmoothingMode = SmoothingMode.AntiAlias; graphics.InterpolationMode = preferSpeedOverQuality ? InterpolationMode.Bicubic : InterpolationMode.HighQualityBicubic; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; var newWidth = width; var newHeight = height; var left = 0; var top = 0; if (mode != VrsDrawing.ResizeMode.Stretch) { var widthPercent = (double)newWidth / (double)NativeImage.Width; var heightPercent = (double)newHeight / (double)NativeImage.Height; switch (mode) { case VrsDrawing.ResizeMode.Zoom: // Resize the longest side by the smallest percentage graphics.FillRectangle(zoomBackgroundBrushWrapper.NativeBrush, 0, 0, result.Width, result.Height); if (widthPercent > heightPercent) { newWidth = Math.Min(newWidth, (int)(((double)NativeImage.Width * heightPercent) + 0.5)); } else if (heightPercent > widthPercent) { newHeight = Math.Min(newHeight, (int)(((double)NativeImage.Height * widthPercent) + 0.5)); } break; case VrsDrawing.ResizeMode.Normal: case VrsDrawing.ResizeMode.Centre: // Resize the smallest side by the largest percentage if (widthPercent > heightPercent) { newHeight = Math.Max(newHeight, (int)(((double)NativeImage.Height * widthPercent) + 0.5)); } else if (heightPercent > widthPercent) { newWidth = Math.Max(newWidth, (int)(((double)NativeImage.Width * heightPercent) + 0.5)); } break; } if (mode != VrsDrawing.ResizeMode.Normal) { left = (width - newWidth) / 2; top = (height - newHeight) / 2; } } graphics.DrawImage(NativeImage, left, top, newWidth, newHeight); } }); return(new ImageWrapper(result)); }
/// <summary> /// See interface docs. /// </summary> /// <param name="width"></param> /// <param name="height"></param> /// <param name="mode"></param> /// <param name="zoomBackground"></param> /// <param name="preferSpeedOverQuality"></param> /// <returns></returns> public abstract VrsDrawing.IImage Resize(int width, int height, VrsDrawing.ResizeMode mode = VrsDrawing.ResizeMode.Normal, VrsDrawing.IBrush zoomBackground = null, bool preferSpeedOverQuality = true);
/// <summary> /// Creates a new object. /// </summary> public CommonBrushFactory() { Transparent = CreateBrush(255, 255, 255, 0, useCache: true); }
/// <summary> /// See interface docs. /// </summary> /// <param name="text"></param> /// <param name="font"></param> /// <param name="fillBrush"></param> /// <param name="outlinePen"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="alignment"></param> /// <param name="preferSpeedOverQuality"></param> public abstract void DrawText(string text, VrsDrawing.IFont font, VrsDrawing.IBrush fillBrush, VrsDrawing.IPen outlinePen, float x, float y, VrsDrawing.HorizontalAlignment alignment, bool preferSpeedOverQuality = true);
/// <summary> /// See interface docs. /// </summary> /// <param name="brush"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="width"></param> /// <param name="height"></param> public abstract void FillRectangle(VrsDrawing.IBrush brush, int x, int y, int width, int height);