PdfTilingPattern BuildPattern(ImageBrush 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));
}
// HACK by [email protected]
// Avoid extra thin lines at the right and at the bottom of original image
double xStep = brush.Viewport.Width + 1;
double yStep = brush.Viewport.Height + 1;
PdfTilingPattern pattern = Context.PdfDocument.Internals.CreateIndirectObject <PdfTilingPattern>();
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);
}