/// <summary> /// Renders a page to the specified graphics object /// </summary> private void PrintPage(int pageX, int pageY, Graphics g) { var page = _pages.GetPageRectange(pageX, pageY); var list = GetElementsWithinPage(pageX, pageY); g.PageScale = 1f; g.PageUnit = GraphicsUnit.Display; foreach (var el in list.Reverse()) { var matrix = g.Transform; var r = el.Rectangle; var clip = RectangleHelper.GetIntersection(page, r); float offsetX = el is LayoutMap ? clip.X - page.X : r.X - page.X; float offsetY = el is LayoutMap ? clip.Y - page.Y : r.Y - page.Y; g.TranslateTransform(offsetX, offsetY); if (el is LayoutMap) { // origin is a beginning of map on this page var translatedClip = new RectangleF(0.0f, 0.0f, clip.Width + 1.0f, clip.Height + 1.0f); g.SetClip(translatedClip); // wait for the response from tilesLoaded and perform drawing (el as LayoutMap).Print(g, clip, false); } else { // origin is beginning of element (even if lies outside current page) if (_useElementClipping) { offsetX = offsetX > 0 ? 0f : -offsetX; offsetY = offsetY > 0 ? 0f : -offsetY; g.SetClip(new RectangleF(offsetX, offsetY, clip.Width, clip.Height)); } el.DrawElement(g, true, false); } g.Transform = matrix; g.ResetClip(); } _pages.GetPage(pageX, pageY).Printed = true; }