void RealizeVisualBrush(VisualBrush brush, ref XForm xform) { //Debug.Assert(xform != null); xform = new XForm(this.writer.Owner, new XRect(brush.Viewbox.X * 3 / 4, brush.Viewbox.Y * 3 / 4, brush.Viewbox.Width * 3 / 4, brush.Viewbox.Height * 3 / 4)); Visual visual = brush.Visual; PdfContentWriter formWriter = new PdfContentWriter(this.writer.Context, xform, RenderMode.Default); //formWriter.Size = brush.Viewport.Size; formWriter.BeginContent(false); formWriter.WriteElement(visual); formWriter.EndContent(); }
/// <summary> /// Creates an XForm from a visual brush. /// </summary> public static XForm FromVisualBrush(DocumentRenderingContext context, VisualBrush brush) { //XPImage xpImage = ImageBuilder.FromImageBrush(context, brush); //XImage ximage = xpImage.XImage; double width = brush.Viewport.Width; double height = brush.Viewport.Height; // view box in point // XRect box = new XRect(brush.Viewbox.X * 0.75, brush.Viewbox.Y * 0.75, brush.Viewbox.Width * 0.75, brush.Viewbox.Height * 0.75); XRect box = new XRect(0, 0, width, height); XForm xform = new XForm(context.PdfDocument, box); PdfContentWriter formWriter = new PdfContentWriter(context, xform, RenderMode.Default); PdfFormXObject pdfForm = xform.PdfForm; pdfForm.Elements.SetMatrix(PdfFormXObject.Keys.Matrix, new XMatrix()); //formWriter.Size = brush.Viewport.Size; formWriter.BeginContent(false); formWriter.WriteElement(brush.Visual); formWriter.EndContent(); return xform; }
/// <summary> /// Parses a VisualBrush element. /// </summary> VisualBrush ParseVisualBrush() { bool isEmptyElement = this.reader.IsEmptyElement; VisualBrush brush = new VisualBrush(); while (MoveToNextAttribute()) { switch (this.reader.Name) { case "Opacity": brush.Opacity = ParseDouble(this.reader.Value); break; case "Transform": brush.Transform = ParseMatrixTransform(this.reader.Value); break; case "Viewbox": brush.Viewbox = Rect.Parse(this.reader.Value); break; case "Viewport": brush.Viewport = Rect.Parse(this.reader.Value); break; case "TileMode": brush.TileMode = ParseEnum<TileMode>(this.reader.Value); break; case "ViewboxUnits": brush.ViewboxUnits = ParseEnum<ViewUnits>(this.reader.Value); break; case "ViewportUnits": brush.ViewportUnits = ParseEnum<ViewUnits>(this.reader.Value); break; case "Visual": brush.Visual = ParseVisual(); break; case "x:Key": brush.Key = this.reader.Value; break; } } if (!isEmptyElement) { MoveToNextElement(); while (this.reader.IsStartElement()) { switch (this.reader.Name) { case "VisualBrush.Transform": MoveToNextElement(); brush.Transform = ParseMatrixTransform(); break; case "VisualBrush.GradientStops": MoveToNextElement(); //brush.GradientStops= ParseGradientStops(); break; case "VisualBrush.Visual": //MoveToNextElement(); brush.Visual = ParseVisual(); brush.Visual.Parent = brush; break; default: Debugger.Break(); break; } } } MoveToNextElement(); return brush; }
/// <summary> /// Builds a PdfTilingPattern pattern from a visual brush. /// </summary> public static PdfTilingPattern BuildFromVisualBrush(DocumentRenderingContext context, VisualBrush brush, XMatrix transform) { TilingPatternBuilder builder = new TilingPatternBuilder(context); PdfTilingPattern pdfPattern = builder.BuildPattern(brush, transform); return pdfPattern; }
PdfTilingPattern BuildPattern(VisualBrush brush, XMatrix transform) { // Bounding box lays always at (0,0) XRect bbox = new XRect(0, 0, brush.Viewport.Width, brush.Viewport.Height); XMatrix matrix = transform; matrix.Prepend(new XMatrix(1, 0, 0, 1, brush.Viewport.X, brush.Viewport.Y)); if (brush.Transform != null) { matrix.Prepend(new XMatrix(brush.Transform.Matrix.m11, brush.Transform.Matrix.m12, brush.Transform.Matrix.m21, brush.Transform.Matrix.m22, brush.Transform.Matrix.offsetX, brush.Transform.Matrix.offsetY)); } // Set X Step beyond the viewport if tilemode is set to none since // there is no other easy way to turn off tiling - NPJ double xStep = brush.Viewport.Width * (brush.TileMode == TileMode.None ? 2 : 1); double yStep = brush.Viewport.Height * (brush.TileMode == TileMode.None ? 2 : 1); // PdfTilingPattern //<< // /BBox [0 0 240 120] // /Length 74 // /Matrix [0.75 0 0 -0.75 0 480] // /PaintType 1 // /PatternType 1 // /Resources // << // /ExtGState // << // /GS0 10 0 R // >> // /XObject // << // /Fm0 17 0 R // >> // >> // /TilingType 3 // /Type /Pattern // /XStep 480 // /YStep 640 //>> //stream // q // 0 0 240 120 re // W n // q // 2.3999939 0 0 1.1999969 0 0 cm // /GS0 gs // /Fm0 Do // Q //Q //endstream PdfTilingPattern pattern = new PdfTilingPattern(Context.PdfDocument); Context.PdfDocument.Internals.AddObject(pattern); pattern.Elements.SetInteger(PdfTilingPattern.Keys.PatternType, 1); // Tiling pattern.Elements.SetInteger(PdfTilingPattern.Keys.PaintType, 1); // Color pattern.Elements.SetInteger(PdfTilingPattern.Keys.TilingType, 3); // Constant spacing and faster tiling pattern.Elements.SetMatrix(PdfTilingPattern.Keys.Matrix, matrix); pattern.Elements.SetRectangle(PdfTilingPattern.Keys.BBox, new PdfRectangle(bbox)); pattern.Elements.SetReal(PdfTilingPattern.Keys.XStep, xStep); pattern.Elements.SetReal(PdfTilingPattern.Keys.YStep, yStep); // Set extended graphic state like Acrobat do PdfExtGState pdfExtGState = Context.PdfDocument.Internals.CreateIndirectObject<PdfExtGState>(); pdfExtGState.SetDefault1(); PdfFormXObject pdfForm = BuildForm(brush); PdfContentWriter writer = new PdfContentWriter(Context, pattern); writer.BeginContentRaw(); // Acrobat 8 clips to bounding box, so do we //writer.WriteClip(bbox); XMatrix transformation = new XMatrix(); double dx = brush.Viewport.Width / brush.Viewbox.Width * 96 / pdfForm.DpiX; double dy = brush.Viewport.Height / brush.Viewbox.Height * 96 / pdfForm.DpiY; transformation = new XMatrix(dx, 0, 0, dy, 0, 0); writer.WriteMatrix(transformation); writer.WriteGraphicsState(pdfExtGState); string name = writer.Resources.AddForm(pdfForm); writer.WriteLiteral(name + " Do\n"); writer.EndContent(); return pattern; }
/// <summary> /// Builds a PdfFormXObject from the specified brush. /// </summary> PdfFormXObject BuildForm(VisualBrush brush) { //<< // /BBox [0 100 100 0] // /Length 65 // /Matrix [1 0 0 1 0 0] // /Resources // << // /ColorSpace // << // /CS0 15 0 R // >> // /ExtGState // << // /GS0 10 0 R // >> // /ProcSet [/PDF /ImageC /ImageI] // /XObject // << // /Im0 16 0 R // >> // >> // /Subtype /Form //>> //stream // q // 0 0 100 100 re // W n // q // /GS0 gs // 100 0 0 -100 0 100 cm // /Im0 Do // Q //Q //endstream PdfFormXObject pdfForm = Context.PdfDocument.Internals.CreateIndirectObject<PdfFormXObject>(); pdfForm.DpiX = 96; pdfForm.DpiY = 96; // view box var box = new PdfRectangle(brush.Viewbox.X, brush.Viewbox.Y + brush.Viewbox.Height - 1, brush.Viewbox.X + brush.Viewbox.Width - 1, brush.Viewbox.Y); pdfForm.Elements.SetRectangle(PdfFormXObject.Keys.BBox, box); pdfForm.Elements.SetMatrix(PdfFormXObject.Keys.Matrix, new XMatrix()); PdfContentWriter writer = new PdfContentWriter(Context, pdfForm); pdfForm.Elements.SetMatrix(PdfFormXObject.Keys.Matrix, new XMatrix()); writer.BeginContentRaw(); writer.WriteLiteral("-100 Tz\n"); writer.WriteLiteral("q\n"); writer.WriteVisual(brush.Visual); writer.WriteLiteral("Q\n"); #if DEBUG if (DevHelper.BorderPatterns) writer.WriteLiteral("1 1 1 rg 0 0 m {0:0.###} 0 l {0:0.###} {1:0.###} l 0 {1:0.###} l h s\n", brush.Viewbox.Width, brush.Viewbox.Height); #endif writer.EndContent(); return pdfForm; }