コード例 #1
0
        private bool PushRenderStates()
        {
            var clipped = !_activeGroup.Bound.IsEmpty;

            // Push clipping rect
            if (clipped)
            {
                var clipTransform = new Transform(_activeGroup.Transform);

                // Push clipping transform
                {
                    var transform = new System.Windows.Media.MatrixTransform(clipTransform.XX, clipTransform.XY,
                                                                             clipTransform.YX, clipTransform.YY,
                                                                             clipTransform.TX, clipTransform.TY);
                    _drawingContext.PushTransform(transform);
                }

                // Push clipping rect
                {
                    var geometry = new System.Windows.Media.RectangleGeometry(_activeGroup.Bound);
                    _drawingContext.PushClip(geometry);
                }

                // Push inverse clipping transform
                {
                    clipTransform.Invert();
                    var transform = new System.Windows.Media.MatrixTransform(clipTransform.XX, clipTransform.XY,
                                                                             clipTransform.YX, clipTransform.YY,
                                                                             clipTransform.TX, clipTransform.TY);
                    _drawingContext.PushTransform(transform);
                }
            }

            // Push current transform
            {
                var transform = new System.Windows.Media.MatrixTransform(_transform.XX, _transform.XY,
                                                                         _transform.YX, _transform.YY,
                                                                         _transform.TX, _transform.TY);
                _drawingContext.PushTransform(transform);
            }

            return(clipped);
        }
コード例 #2
0
        public void StartGroup(string id, float x, float y, float width, float height, bool clipContent)
        {
            if (clipContent)
            {
                // Save previous
                _groups.Add(id, _activeGroup);

                // Apply transform to clipping rect
                var rect      = new Rect(x, y, width, height);
                var transform = new System.Windows.Media.Matrix(_transform.XX, _transform.XY,
                                                                _transform.YX, _transform.YY,
                                                                _transform.TX, _transform.TY);
                rect = Rect.Transform(rect, transform);

                // Push clipping rect
                _activeGroup = new Group(rect, _transform);
                var geometry = new System.Windows.Media.RectangleGeometry(_activeGroup.Bound);
                _drawingContext.PushClip(geometry);
            }
        }
コード例 #3
0
            public override DocumentPage GetPage(int pageNumber)
            {
                // This is called starting at zero, but we are really starting at the given page.
                pageNumber += startingPage;

                if (showProgressDialog)
                {
                    if (outer.controller.UpdateProgressDialog(string.Format(MiscText.PrintingPage, pageNumber + 1, outer.totalPages), (double)pageNumber / (double)outer.totalPages))
                    {
                        throw new Exception(MiscText.CancelledByUser);
                    }
                }

                Margins   margins   = new Margins(this.margins.Left, this.margins.Right, this.margins.Top, this.margins.Bottom);
                bool      landscape = outer.pageSettings.Landscape;
                PaperSize paperSize = outer.pageSettings.PaperSize;
                bool      rotate;

                outer.ChangePageSettings(pageNumber, ref landscape, ref paperSize, margins);
                rotate        = (landscape != outer.pageSettings.Landscape);
                this.pageSize = new System.Windows.Size(HundrethsToPoints(paperSize.Width), HundrethsToPoints(paperSize.Height));
                if (outer.pageSettings.Landscape)
                {
                    this.pageSize = new System.Windows.Size(this.pageSize.Height, this.pageSize.Width);
                }

                // Get margins in terms of normal page orientation, in points.
                double leftMargin   = HundrethsToPoints(rotate ? margins.Bottom : margins.Left);
                double rightMargin  = HundrethsToPoints(rotate ? margins.Top : margins.Right);
                double topMargin    = HundrethsToPoints(rotate ? margins.Left : margins.Top);
                double bottomMargin = HundrethsToPoints(rotate ? margins.Right : margins.Bottom);

                System.Windows.Rect contentRect           = new System.Windows.Rect(leftMargin, topMargin, pageSize.Width - leftMargin - rightMargin, pageSize.Height - topMargin - bottomMargin);
                System.Windows.Rect boundingRect          = new System.Windows.Rect(0, 0, pageSize.Width - leftMargin - rightMargin, pageSize.Height - topMargin - bottomMargin);
                System.Windows.Media.DrawingVisual visual = new System.Windows.Media.DrawingVisual();

                using (System.Windows.Media.DrawingContext dc = visual.RenderOpen()) {
                    if (outer.printingToBitmaps)
                    {
                        // This is kind of hacky way to get the printing to bitmaps white, but much easier than the alternative.
                        dc.DrawRectangle(System.Windows.Media.Brushes.White, null, new System.Windows.Rect(-1, -1, pageSize.Width + 2, pageSize.Height + 2));
                    }

                    // Clip to the bounding rect within margins.
                    dc.PushClip(new System.Windows.Media.RectangleGeometry(boundingRect));

                    if (rotate)
                    {
                        // Rotate and translate to handle landscape mode.
                        dc.PushTransform(new System.Windows.Media.TranslateTransform(0, boundingRect.Height));
                        dc.PushTransform(new System.Windows.Media.RotateTransform(-90));
                    }

                    // Scale to hundreths of an inch instead of points (1/96 of inch).
                    dc.PushTransform(new System.Windows.Media.ScaleTransform(96.0 / 100.0, 96.0 / 100.0));

                    IGraphicsTarget graphicsTarget;
                    if (outer.colorModel == ColorModel.RGB)
                    {
                        graphicsTarget = new WPF_GraphicsTarget(dc);
                    }
                    else if (outer.colorModel == ColorModel.CMYK)
                    {
                        graphicsTarget = new WPF_GraphicsTarget(dc, new WPFSwopColorConverter());
                    }
                    else
                    {
                        throw new NotImplementedException();
                    }

                    using (graphicsTarget) {
                        outer.DrawPage(graphicsTarget, pageNumber, new SizeF((float)contentRect.Width, (float)contentRect.Height), dpi);
                    }
                    graphicsTarget = null;
                }

                return(new DocumentPage(visual, pageSize, contentRect, contentRect));
            }