public void Render(Aurigma.GraphicsMill.Bitmap canvas, float zoom, System.Drawing.Rectangle viewport, System.Drawing.Rectangle renderingRegion) { if (viewport.Width < 1 || viewport.Height < 1 || renderingRegion.Width < 1 || renderingRegion.Height < 1) { return; } if (canvas == null) { throw new System.ArgumentNullException("canvas"); } if (canvas.IsEmpty) { throw new System.ArgumentException(StringResources.GetString("ExStrBitmapCannotBeEmpty"), "canvas"); } if (!viewport.Contains(renderingRegion)) { throw new System.ArgumentException(StringResources.GetString("ExStrRenderingRegionShouldBeInsideViewport"), "renderingRegion"); } System.Drawing.Rectangle viewportInvalidatedRect = CoordinateMapper.WorkspaceToControl(this.InvalidatedRegion, zoom, System.Drawing.Point.Empty, Aurigma.GraphicsMill.Unit.Point, _renderingResolution); if (renderingRegion.IntersectsWith(viewportInvalidatedRect) || !_viewportCache.IsEntirelyInCache(zoom, renderingRegion)) { BuildUpViewportImage(canvas, zoom, viewport, viewportInvalidatedRect); this.InvalidatedRegion = System.Drawing.RectangleF.Empty; _viewportCache.UpdateCache(canvas, zoom, viewport); } else { System.Diagnostics.Debug.Assert(_viewportCache.IsEntirelyInCache(zoom, renderingRegion), "At this point we should already have actual image in cache."); _viewportCache.DrawCached(canvas, zoom, viewport, renderingRegion); } }
public System.Drawing.Rectangle WorkspaceToControl(System.Drawing.RectangleF workspaceRect, Aurigma.GraphicsMill.Unit workspaceUnit) { return(CoordinateMapper.WorkspaceToControl(workspaceRect, _zoom, _viewport.Location, workspaceUnit, _resolution)); }
public void Render(Aurigma.GraphicsMill.Bitmap canvas, float zoom, System.Drawing.Rectangle viewport, System.Drawing.Rectangle renderingRegion) { if (!_layer.Visible || _layer.VObjects.Count < 1) { return; } CoordinateMapper coordinateMapper = new CoordinateMapper(); coordinateMapper.Viewport = viewport; coordinateMapper.Zoom = zoom; coordinateMapper.Resolution = _renderingResolution; renderingRegion.X -= viewport.X; renderingRegion.Y -= viewport.Y; System.IntPtr dc = System.IntPtr.Zero; System.IntPtr oldDc = System.IntPtr.Zero; System.Drawing.Graphics g = null; Aurigma.GraphicsMill.Drawing.Graphics gdiGraphics = null; try { // Read MSDN KB article "GDI & GDI+ interoperability". We should create System.Drawing.Graphics // from DC, not from Bitmap to avoid getting sentinel bitmap. Otherwise we will not be able to // blend images using Aurigma.GraphicsMill.Bitmap.Draw(System.Drawing.Graphics g, ...) method. // // The first branch is used when we render to the screen. In this case canvas has 24bppRgb format // and we just use its GDI graphics (most probably it has been already created by caching renderer) to // obtain HDC. Second branch is used when we render control content to 32bppArgb image - in such case // we cannot create GDI graphics and have to manually create DC and select canvas.Handle into it. if (canvas.PixelFormat == PixelFormat.Format24bppRgb) { gdiGraphics = canvas.GetGraphics(); g = System.Drawing.Graphics.FromHdc(gdiGraphics.GetDC()); } else { dc = NativeMethods.CreateCompatibleDC(System.IntPtr.Zero); if (dc == System.IntPtr.Zero) { throw new Aurigma.GraphicsMill.UnexpectedException(StringResources.GetString("Cannot create compatible DC.")); } g = System.Drawing.Graphics.FromHdc(dc); } g.SetClip(renderingRegion); for (int i = 0; i < _layer.VObjects.Count; i++) { System.Drawing.Rectangle bounds = coordinateMapper.WorkspaceToControl(_layer.VObjects[i].GetTransformedVObjectBounds(), Aurigma.GraphicsMill.Unit.Point); if (bounds.IntersectsWith(renderingRegion)) { _layer.VObjects[i].Draw(renderingRegion, g, coordinateMapper); } } } finally { if (g != null) { g.Dispose(); } if (gdiGraphics != null) { gdiGraphics.Dispose(); } if (dc != System.IntPtr.Zero) { NativeMethods.SelectObject(dc, oldDc); NativeMethods.DeleteDC(dc); } } }