本文整理汇总了C#中PdfSharp.Drawing.XMatrix.TranslatePrepend方法的典型用法代码示例。如果您正苦于以下问题:C# XMatrix.TranslatePrepend方法的具体用法?C# XMatrix.TranslatePrepend怎么用?C# XMatrix.TranslatePrepend使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类PdfSharp.Drawing.XMatrix
的用法示例。
在下文中一共展示了XMatrix.TranslatePrepend方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: FromImageBrush
/// <summary>
/// Creates an XForm from an image brush.
/// </summary>
public static XForm FromImageBrush(DocumentRenderingContext context, ImageBrush brush)
{
XPImage xpImage = ImageBuilder.FromImageBrush(context, brush);
XImage ximage = xpImage.XImage;
double width = ximage.PixelWidth;
double height = ximage.PixelHeight;
// 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);
Debug.Assert(ximage != null);
PdfFormXObject pdfForm = xform.PdfForm;
pdfForm.Elements.SetMatrix(PdfFormXObject.Keys.Matrix, new XMatrix());
//formWriter.Size = brush.Viewport.Size;
formWriter.BeginContentRaw();
string imageID = formWriter.Resources.AddImage(new PdfImage(context.PdfDocument, ximage));
XMatrix matrix = new XMatrix();
double scaleX = brush.Viewport.Width / brush.Viewbox.Width * 4 / 3 * ximage.PointWidth;
double scaleY = brush.Viewport.Height / brush.Viewbox.Height * 4 / 3 * ximage.PointHeight;
matrix.TranslatePrepend(-brush.Viewbox.X, -brush.Viewbox.Y);
matrix.ScalePrepend(scaleX, scaleY);
matrix.TranslatePrepend(brush.Viewport.X / scaleX, brush.Viewport.Y / scaleY);
matrix = new XMatrix(width, 0, 0, -height, 0, height);
formWriter.WriteLiteral("q\n");
// TODO:WriteClip(path.Data);
//formWriter.WriteLiteral("{0:0.###} 0 0 -{1:0.###} {2:0.###} {3:0.###} cm 100 Tz {4} Do Q\n",
// matrix.M11, matrix.M22, matrix.OffsetX, matrix.OffsetY + brush.Viewport.Height, imageID);
formWriter.WriteMatrix(matrix);
formWriter.WriteLiteral(imageID + " Do Q\n");
formWriter.EndContent();
return xform;
}
示例2: RenderTile
//.........这里部分代码省略.........
points[0] = new XPoint(px + -RenderUtil.HEX_EDGE, py + 0.5 + yOffset);
points[1] = new XPoint(px + RenderUtil.HEX_EDGE, py + 1.0 + yOffset);
points[2] = new XPoint(px + 1.0 - RenderUtil.HEX_EDGE, py + 1.0 + yOffset);
points[3] = new XPoint(px + 1.0 + RenderUtil.HEX_EDGE, py + 0.5 + yOffset);
ctx.graphics.DrawLines(pen, points);
}
}
break;
case HexStyle.None:
// none
break;
}
if (ctx.styles.numberAllHexes &&
ctx.styles.worldDetails.HasFlag(WorldDetails.Hex))
{
solidBrush.Color = ctx.styles.hexNumber.textColor;
for (int px = hx - parsecSlop; px < hx + hw + parsecSlop; px++)
{
double yOffset = ((px % 2) != 0) ? 0.0 : 0.5;
for (int py = hy - parsecSlop; py < hy + hh + parsecSlop; py++)
{
Location loc = Astrometrics.CoordinatesToLocation(px + 1, py + 1);
string hex;
switch (ctx.styles.hexCoordinateStyle)
{
default:
case Stylesheet.HexCoordinateStyle.Sector: hex = loc.HexString; break;
case Stylesheet.HexCoordinateStyle.Subsector: hex = loc.SubsectorHexString; break;
}
using (RenderUtil.SaveState(ctx.graphics))
{
XMatrix matrix = new XMatrix();
matrix.TranslatePrepend(px + 0.5f, py + yOffset);
matrix.ScalePrepend(ctx.styles.hexContentScale / Astrometrics.ParsecScaleX, ctx.styles.hexContentScale / Astrometrics.ParsecScaleY);
ctx.graphics.MultiplyTransform(matrix, XMatrixOrder.Prepend);
ctx.graphics.DrawString(hex, ctx.styles.hexNumber.Font, solidBrush, 0, 0, RenderUtil.StringFormatTopCenter);
}
}
}
}
}
#endregion
timers.Add(new Timer("parsec grid"));
//------------------------------------------------------------
// Subsector Names
//------------------------------------------------------------
#region subsector-names
if (ctx.styles.subsectorNames.visible)
{
solidBrush.Color = ctx.styles.subsectorNames.textColor;
foreach (Sector sector in ctx.selector.Sectors)
{
for (int i = 0; i < 16; i++)
{
int ssx = i % 4;
int ssy = i / 4;
Subsector ss = sector[i];
if (ss == null || String.IsNullOrEmpty(ss.Name))
continue;
Point center = sector.SubsectorCenter(i);
RenderUtil.DrawLabel(ctx.graphics, ss.Name, center, ctx.styles.subsectorNames.Font, solidBrush, ctx.styles.subsectorNames.textStyle);
示例3: BeginContent
// #region Realizing graphical state
/// <summary>
/// Initializes the default view transformation, i.e. the transformation from the user page
/// space to the PDF page space.
/// </summary>
public void BeginContent(bool hacks4softmask)
{
if (!this.contentInitialized)
{
//this.defaultViewMatrix = XMatrix.Identity;
//// Take TrimBox into account
double pageHeight = Size.Height;
//XPoint trimOffset = new XPoint();
//if (this.page != null && this.page.TrimMargins.AreSet)
//{
// pageHeight += this.page.TrimMargins.Top.Point + this.page.TrimMargins.Bottom.Point;
// trimOffset = new XPoint(this.page.TrimMargins.Left.Point, this.page.TrimMargins.Top.Point);
//}
//if (this.page != null && this.page.Elements.GetInteger("/Rotate") == 90) // HACK for InDesign flyer
//{
// defaultViewMatrix.RotatePrepend(90);
// defaultViewMatrix.ScalePrepend(1, -1);
//}
//else
//{
// // Recall that the value of Height depends on Orientation.
// Flip page horizontaly and mirror text.
XMatrix defaultViewMatrix = new XMatrix();
if (!hacks4softmask)
{
defaultViewMatrix.TranslatePrepend(0, pageHeight);
defaultViewMatrix.ScalePrepend(0.75, -0.75);
}
//if (!trimOffset.IsEmpty)
//{
// Debug.Assert(this.gfx.PageUnit == XGraphicsUnit.Point, "With TrimMargins set the page units must be Point. Ohter cases nyi.");
// defaultViewMatrix.TranslatePrepend(trimOffset.x, trimOffset.y);
//}
// Save initial graphic state
WriteSaveState("BeginContent", null);
// Set page transformation
WriteRenderTransform(defaultViewMatrix);
this.graphicsState.DefaultPageTransform = defaultViewMatrix;
MultiplyTransform(defaultViewMatrix);
if (!hacks4softmask)
WriteLiteral("-100 Tz\n");
this.contentInitialized = true;
}
}
示例4: Draw
/// <summary>
/// Draws the vertical Y axis.
/// </summary>
internal override void Draw()
{
AxisRendererInfo yari = ((ChartRendererInfo)this.rendererParms.RendererInfo).yAxisRendererInfo;
double yMin = yari.MinimumScale;
double yMax = yari.MaximumScale;
double yMajorTick = yari.MajorTick;
double yMinorTick = yari.MinorTick;
XMatrix matrix = new XMatrix(); //XMatrix.Identity;
matrix.TranslatePrepend(-yari.InnerRect.X, yMax);
matrix.Scale(1, yari.InnerRect.Height / (yMax - yMin), XMatrixOrder.Append);
matrix.ScalePrepend(1, -1); // mirror horizontal
matrix.Translate(yari.InnerRect.X, yari.InnerRect.Y, XMatrixOrder.Append);
// Draw axis.
// First draw tick marks, second draw axis.
double majorTickMarkStart = 0, majorTickMarkEnd = 0,
minorTickMarkStart = 0, minorTickMarkEnd = 0;
GetTickMarkPos(yari, ref majorTickMarkStart, ref majorTickMarkEnd, ref minorTickMarkStart, ref minorTickMarkEnd);
XGraphics gfx = this.rendererParms.Graphics;
LineFormatRenderer lineFormatRenderer = new LineFormatRenderer(gfx, yari.LineFormat);
LineFormatRenderer minorTickMarkLineFormat = new LineFormatRenderer(gfx, yari.MinorTickMarkLineFormat);
LineFormatRenderer majorTickMarkLineFormat = new LineFormatRenderer(gfx, yari.MajorTickMarkLineFormat);
XPoint[] points = new XPoint[2];
// Draw minor tick marks.
if (yari.MinorTickMark != TickMarkType.None)
{
for (double y = yMin + yMinorTick; y < yMax; y += yMinorTick)
{
points[0].X = minorTickMarkStart;
points[0].Y = y;
points[1].X = minorTickMarkEnd;
points[1].Y = y;
matrix.TransformPoints(points);
minorTickMarkLineFormat.DrawLine(points[0], points[1]);
}
}
double lineSpace = yari.TickLabelsFont.GetHeight(gfx);
int cellSpace = yari.TickLabelsFont.FontFamily.GetLineSpacing(yari.TickLabelsFont.Style);
double xHeight = yari.TickLabelsFont.Metrics.XHeight;
XSize labelSize = new XSize(0, 0);
labelSize.Height = lineSpace * xHeight / cellSpace;
int countTickLabels = (int)((yMax - yMin) / yMajorTick) + 1;
for (int i = 0; i < countTickLabels; ++i)
{
double y = yMin + yMajorTick * i;
string str = y.ToString(yari.TickLabelsFormat);
labelSize.Width = gfx.MeasureString(str, yari.TickLabelsFont).Width;
// Draw major tick marks.
if (yari.MajorTickMark != TickMarkType.None)
{
labelSize.Width += yari.MajorTickMarkWidth * 1.5;
points[0].X = majorTickMarkStart;
points[0].Y = y;
points[1].X = majorTickMarkEnd;
points[1].Y = y;
matrix.TransformPoints(points);
majorTickMarkLineFormat.DrawLine(points[0], points[1]);
}
else
labelSize.Width += SpaceBetweenLabelAndTickmark;
// Draw label text.
XPoint[] layoutText = new XPoint[1];
layoutText[0].X = yari.InnerRect.X + yari.InnerRect.Width - labelSize.Width;
layoutText[0].Y = y;
matrix.TransformPoints(layoutText);
layoutText[0].Y += labelSize.Height / 2; // Center text vertically.
gfx.DrawString(str, yari.TickLabelsFont, yari.TickLabelsBrush, layoutText[0]);
}
// Draw axis.
if (yari.LineFormat != null && yari.LineFormat.Width > 0)
{
points[0].X = yari.InnerRect.X + yari.InnerRect.Width;
points[0].Y = yMin;
points[1].X = yari.InnerRect.X + yari.InnerRect.Width;
points[1].Y = yMax;
matrix.TransformPoints(points);
if (yari.MajorTickMark != TickMarkType.None)
{
// yMax is at the upper side of the axis
points[1].Y -= yari.LineFormat.Width / 2;
points[0].Y += yari.LineFormat.Width / 2;
}
lineFormatRenderer.DrawLine(points[0], points[1]);
}
// Draw axis title
//.........这里部分代码省略.........
示例5: Fill
public void Fill(XGraphics graphics, RectangleF rect, Brush fillBrush)
{
if (graphics == null)
throw new ArgumentNullException("graphics");
RectangleF bounds = TransformedBounds;
if (bounds.IntersectsWith(rect))
{
XGraphicsPath path = Path;
using (RenderUtil.SaveState(graphics))
{
XMatrix matrix = new XMatrix();
matrix.ScalePrepend(ScaleX, ScaleY);
matrix.TranslatePrepend(-OriginX, -OriginY);
graphics.MultiplyTransform(matrix);
graphics.DrawPath(fillBrush, path);
}
}
}
示例6: DrawStars
private void DrawStars(World world)
{
using (RenderUtil.SaveState(graphics))
{
graphics.SmoothingMode = XSmoothingMode.AntiAlias;
PointF center = Astrometrics.HexToCenter(world.Coordinates);
XMatrix matrix = new XMatrix();
matrix.TranslatePrepend(center.X, center.Y);
matrix.ScalePrepend(styles.hexContentScale / Astrometrics.ParsecScaleX, styles.hexContentScale / Astrometrics.ParsecScaleY);
graphics.MultiplyTransform(matrix, XMatrixOrder.Prepend);
// TODO: Proper stellar parsing
List<string> ss = new List<string>();
foreach (Match m in STELLAR_REGEX.Matches(world.Stellar))
{
ss.Add(m.Value);
}
int i = 0;
foreach (var props in ss.Select(s => StellarRendering.star2props(s)).OrderByDescending(p => p.radius)) {
solidBrush.Color = props.color;
PointF offset = StellarRendering.Offset(i++);
const float offsetScale = 0.3f;
float r = 0.15f * props.radius;
graphics.DrawEllipse(solidBrush, offset.X * offsetScale - r, offset.Y * offsetScale - r, r*2, r*2);
}
}
}
示例7: Initialize
/// <summary>
/// Internal setup.
/// </summary>
void Initialize()
{
this.pageOrigin = new XPoint();
XMatrix matrix = new XMatrix(); //XMatrix.Identity;
double pageHeight = this.pageSize.height;
PdfPage targetPage = PdfPage;
XPoint trimOffset = new XPoint();
if (targetPage != null && targetPage.TrimMargins.AreSet)
{
pageHeight += targetPage.TrimMargins.Top.Point + targetPage.TrimMargins.Bottom.Point;
trimOffset = new XPoint(targetPage.TrimMargins.Left.Point, targetPage.TrimMargins.Top.Point);
}
#if GDI
if (this.targetContext == XGraphicTargetContext.GDI)
{
if (this.gfx != null)
matrix = (XMatrix)gfx.Transform;
if (this.pageUnit != XGraphicsUnit.Point)
{
switch (this.pageUnit)
{
case XGraphicsUnit.Inch:
matrix.ScalePrepend(XUnit.InchFactor);
break;
case XGraphicsUnit.Millimeter:
matrix.ScalePrepend(XUnit.MillimeterFactor);
break;
case XGraphicsUnit.Centimeter:
matrix.ScalePrepend(XUnit.CentimeterFactor);
break;
case XGraphicsUnit.Presentation:
matrix.ScalePrepend(XUnit.PresentationFactor);
break;
}
}
}
#endif
#if WPF
if (this.targetContext == XGraphicTargetContext.WPF)
{
if (this.pageUnit != XGraphicsUnit.Presentation)
{
switch (this.pageUnit)
{
case XGraphicsUnit.Point:
matrix.ScalePrepend(XUnit.PointFactorWpf);
break;
case XGraphicsUnit.Inch:
matrix.ScalePrepend(XUnit.InchFactorWpf);
break;
case XGraphicsUnit.Millimeter:
matrix.ScalePrepend(XUnit.MillimeterFactorWpf);
break;
case XGraphicsUnit.Centimeter:
matrix.ScalePrepend(XUnit.CentimeterFactorWpf);
break;
}
if (!matrix.IsIdentity)
{
#if !SILVERLIGHT
MatrixTransform transform = new MatrixTransform((System.Windows.Media.Matrix)matrix);
dc.PushTransform(transform);
#else
MatrixTransform transform2 = new MatrixTransform();
transform2.Matrix = (System.Windows.Media.Matrix)matrix;
dc.PushTransform(transform2);
#endif
}
}
}
#endif
if (this.pageDirection == XPageDirection.Upwards)
matrix.Prepend(new XMatrix(1, 0, 0, -1, 0, pageHeight));
if (trimOffset != new XPoint())
matrix.TranslatePrepend(trimOffset.x, trimOffset.y);
this.defaultViewMatrix = matrix;
this.transform = new XMatrix(); //XMatrix.Identity;
}
示例8: TranslateTransform
//public Region Clip { get; set; }
//public RectangleF ClipBounds { get; }
//public CompositingMode CompositingMode { get; set; }
//public CompositingQuality CompositingQuality { get; set; }
//public float DpiX { get; }
//public float DpiY { get; }
//public InterpolationMode InterpolationMode { get; set; }
//public bool IsClipEmpty { get; }
//public bool IsVisibleClipEmpty { get; }
//public float PageScale { get; set; }
//public GraphicsUnit PageUnit { get; set; }
//public PixelOffsetMode PixelOffsetMode { get; set; }
//public Point RenderingOrigin { get; set; }
//public SmoothingMode SmoothingMode { get; set; }
//public int TextContrast { get; set; }
//public TextRenderingHint TextRenderingHint { get; set; }
//public Matrix Transform { get; set; }
//public RectangleF VisibleClipBounds { get; }
#endregion
// --------------------------------------------------------------------------------------------
#region Transformation
/// <summary>
/// Applies the specified translation operation to the transformation matrix of this object by
/// prepending it to the object's transformation matrix.
/// </summary>
public void TranslateTransform(double dx, double dy)
{
XMatrix matrix = new XMatrix(); //XMatrix.Identity;
matrix.TranslatePrepend(dx, dy);
AddTransform(matrix, XMatrixOrder.Prepend);
}
示例9: PdfFormXObject
//.........这里部分代码省略.........
Debug.Assert(iref.Document == this.Owner);
// replace external object by the already clone counterpart
resources[idx] = iref.Value;
}
else
{
// External object was not imported ealier and must be cloned
PdfObject clone = obj.Clone();
Debug.Assert(clone.Reference == null);
clone.Document = this.Owner;
if (obj.Reference != null)
{
// add it to this (the importer) document
this.Owner.irefTable.Add(clone);
Debug.Assert(clone.Reference != null);
// save old object identifier
importedObjectTable.Add(obj.ObjectID, clone.Reference);
//Debug.WriteLine("Cloned: " + obj.ObjectID.ToString());
}
else
{
// The root object (the /Resources value) is not an indirect object
Debug.Assert(idx == 0);
// add it to this (the importer) document
this.Owner.irefTable.Add(clone);
Debug.Assert(clone.Reference != null);
}
// replace external object by its clone
resources[idx] = clone;
}
}
#if DEBUG_
for (int idx = 0; idx < count; idx++)
{
Debug.Assert(resources[idx].XRef != null);
Debug.Assert(resources[idx].XRef.Document != null);
Debug.Assert(resources[idx].Document != null);
if (resources[idx].ObjectID.ObjectNumber == 12)
GetType();
}
#endif
// 2nd step. Fix up indirect references that still refers to the import document.
for (int idx = 0; idx < count; idx++)
{
PdfObject obj = resources[idx];
Debug.Assert(obj.Owner != null);
FixUpObject(importedObjectTable, importedObjectTable.Owner, obj);
}
// Set resources key to the root of the clones
Elements["/Resources"] = resources[0].Reference;
#endif
}
// Take /Rotate into account
PdfRectangle rect = importPage.Elements.GetRectangle(PdfPage.Keys.MediaBox);
int rotate = importPage.Elements.GetInteger(PdfPage.Keys.Rotate);
//rotate = 0;
if (rotate == 0)
{
// Set bounding box to media box
this.Elements["/BBox"] = rect;
}
else
{
// TODO: Have to adjust bounding box? (I think not, but I'm not sure -> wait for problem)
this.Elements["/BBox"] = rect;
// Rotate the image such that it is upright
XMatrix matrix = new XMatrix(); //XMatrix.Identity;
double width = rect.Width;
double height = rect.Height;
matrix.RotateAtPrepend(-rotate, new XPoint(width / 2, height / 2));
// Translate the image such that its center lies on the center of the rotated bounding box
double offset = (height - width) / 2;
if (height > width)
matrix.TranslatePrepend(offset, offset);
else
matrix.TranslatePrepend(-offset, -offset);
//string item = "[" + PdfEncoders.ToString(matrix) + "]";
//Elements[Keys.Matrix] = new PdfLiteral(item);
Elements.SetMatrix(Keys.Matrix, matrix);
}
// Preserve filter because the content keeps unmodified
PdfContent content = importPage.Contents.CreateSingleContent();
#if !DEBUG
content.Compressed = true;
#endif
PdfItem filter = content.Elements["/Filter"];
if (filter != null)
this.Elements["/Filter"] = filter.Clone();
// (no cloning needed because the bytes keep untouched)
this.Stream = content.Stream; // new PdfStream(bytes, this);
Elements.SetInteger("/Length", content.Stream.Value.Length);
}
示例10: DrawParsecGrid
private void DrawParsecGrid()
{
const int parsecSlop = 1;
int hx = (int)Math.Floor(tileRect.Left);
int hw = (int)Math.Ceiling(tileRect.Width);
int hy = (int)Math.Floor(tileRect.Top);
int hh = (int)Math.Ceiling(tileRect.Height);
styles.parsecGrid.pen.Apply(ref pen);
switch (styles.hexStyle)
{
case HexStyle.Square:
for (int px = hx - parsecSlop; px < hx + hw + parsecSlop; px++)
{
float yOffset = ((px % 2) != 0) ? 0.0f : 0.5f;
for (int py = hy - parsecSlop; py < hy + hh + parsecSlop; py++)
{
// TODO: use RenderUtil.(Square|Hex)Edges(X|Y) arrays
const float inset = 0.1f;
graphics.DrawRectangle(pen, px + inset, py + inset + yOffset, 1 - inset * 2, 1 - inset * 2);
}
}
break;
case HexStyle.Hex:
XPoint[] points = new XPoint[4];
for (int px = hx - parsecSlop; px < hx + hw + parsecSlop; px++)
{
double yOffset = ((px % 2) != 0) ? 0.0 : 0.5;
for (int py = hy - parsecSlop; py < hy + hh + parsecSlop; py++)
{
points[0] = new XPoint(px + -RenderUtil.HEX_EDGE, py + 0.5 + yOffset);
points[1] = new XPoint(px + RenderUtil.HEX_EDGE, py + 1.0 + yOffset);
points[2] = new XPoint(px + 1.0 - RenderUtil.HEX_EDGE, py + 1.0 + yOffset);
points[3] = new XPoint(px + 1.0 + RenderUtil.HEX_EDGE, py + 0.5 + yOffset);
graphics.DrawLines(pen, points);
}
}
break;
case HexStyle.None:
// none
break;
}
if (styles.numberAllHexes &&
styles.worldDetails.HasFlag(WorldDetails.Hex))
{
solidBrush.Color = styles.hexNumber.textColor;
for (int px = hx - parsecSlop; px < hx + hw + parsecSlop; px++)
{
double yOffset = ((px % 2) != 0) ? 0.0 : 0.5;
for (int py = hy - parsecSlop; py < hy + hh + parsecSlop; py++)
{
Location loc = Astrometrics.CoordinatesToLocation(px + 1, py + 1);
string hex;
switch (styles.hexCoordinateStyle)
{
default:
case Stylesheet.HexCoordinateStyle.Sector: hex = loc.HexString; break;
case Stylesheet.HexCoordinateStyle.Subsector: hex = loc.SubsectorHexString; break;
}
using (RenderUtil.SaveState(graphics))
{
XMatrix matrix = new XMatrix();
matrix.TranslatePrepend(px + 0.5f, py + yOffset);
matrix.ScalePrepend(styles.hexContentScale / Astrometrics.ParsecScaleX, styles.hexContentScale / Astrometrics.ParsecScaleY);
graphics.MultiplyTransform(matrix, XMatrixOrder.Prepend);
graphics.DrawString(hex, styles.hexNumber.Font, solidBrush, 0, 0, RenderUtil.StringFormatTopCenter);
}
}
}
}
}
示例11: DrawMacroNames
private void DrawMacroNames()
{
foreach (var vec in borderFiles
.Select(file => resourceManager.GetXmlFileObject(file, typeof(VectorObject)))
.OfType<VectorObject>()
.Where(vec => (vec.MapOptions & options & MapOptions.NamesMask) != 0))
{
bool major = vec.MapOptions.HasFlag(MapOptions.NamesMajor);
LabelStyle labelStyle = new LabelStyle();
labelStyle.Uppercase = major;
XFont font = major ? styles.macroNames.Font : styles.macroNames.SmallFont;
solidBrush.Color = major ? styles.macroNames.textColor : styles.macroNames.textHighlightColor;
vec.DrawName(graphics, tileRect, font, solidBrush, labelStyle);
}
foreach (var vec in riftFiles
.Select(file => resourceManager.GetXmlFileObject(file, typeof(VectorObject)))
.OfType<VectorObject>()
.Where(vec => (vec.MapOptions & options & MapOptions.NamesMask) != 0))
{
bool major = vec.MapOptions.HasFlag(MapOptions.NamesMajor);
LabelStyle labelStyle = new LabelStyle();
labelStyle.Rotation = 35;
labelStyle.Uppercase = major;
XFont font = major ? styles.macroNames.Font : styles.macroNames.SmallFont;
solidBrush.Color = major ? styles.macroNames.textColor : styles.macroNames.textHighlightColor;
vec.DrawName(graphics, tileRect, font, solidBrush, labelStyle);
}
if (styles.macroRoutes.visible)
{
foreach (var vec in routeFiles
.Select(file => resourceManager.GetXmlFileObject(file, typeof(VectorObject)))
.OfType<VectorObject>()
.Where(vec => (vec.MapOptions & options & MapOptions.NamesMask) != 0))
{
bool major = vec.MapOptions.HasFlag(MapOptions.NamesMajor);
LabelStyle labelStyle = new LabelStyle();
labelStyle.Uppercase = major;
XFont font = major ? styles.macroNames.Font : styles.macroNames.SmallFont;
solidBrush.Color = major ? styles.macroRoutes.textColor : styles.macroRoutes.textHighlightColor;
vec.DrawName(graphics, tileRect, font, solidBrush, labelStyle);
}
}
if (options.HasFlag(MapOptions.NamesMinor))
{
XFont font = styles.macroNames.MediumFont;
solidBrush.Color = styles.macroRoutes.textHighlightColor;
foreach (var label in labels)
{
using (RenderUtil.SaveState(graphics))
{
XMatrix matrix = new XMatrix();
matrix.ScalePrepend(1.0f / Astrometrics.ParsecScaleX, 1.0f / Astrometrics.ParsecScaleY);
matrix.TranslatePrepend(label.position.X, label.position.Y);
graphics.MultiplyTransform(matrix, XMatrixOrder.Prepend);
XSize size = graphics.MeasureString(label.text, font);
graphics.TranslateTransform(-size.Width / 2, -size.Height / 2); // Center the text
RectangleF textBounds = new RectangleF(0, 0, (float)size.Width, (float)size.Height * 2); // *2 or it gets cut off at high sizes
XTextFormatter formatter = new XTextFormatter(graphics);
formatter.Alignment = XParagraphAlignment.Center;
formatter.DrawString(label.text, font, solidBrush, textBounds);
}
}
}
}
示例12: Render
//.........这里部分代码省略.........
#region capitals-homeworlds
//------------------------------------------------------------
// Macro: Capitals & Home Worlds
//------------------------------------------------------------
if (styles.capitals.visible && (options & MapOptions.WorldsMask) != 0)
{
WorldObjectCollection worlds = resourceManager.GetXmlFileObject(@"~/res/Worlds.xml", typeof(WorldObjectCollection)) as WorldObjectCollection;
if (worlds != null && worlds.Worlds != null)
{
solidBrush.Color = styles.capitals.textColor;
foreach (WorldObject world in worlds.Worlds.Where(world => (world.MapOptions & options) != 0))
{
world.Paint(graphics, styles.capitals.fillColor, solidBrush, styles.macroNames.SmallFont);
}
}
}
timers.Add(new Timer("macro worlds"));
#endregion
#region mega-names
//------------------------------------------------------------
// Mega: Galaxy-Scale Labels
//------------------------------------------------------------
if (styles.megaNames.visible)
{
solidBrush.Color = styles.megaNames.textColor;
foreach (var label in megaLabels)
{
using (RenderUtil.SaveState(graphics))
{
XMatrix matrix = new XMatrix();
matrix.ScalePrepend(1.0f / Astrometrics.ParsecScaleX, 1.0f / Astrometrics.ParsecScaleY);
matrix.TranslatePrepend(label.position.X, label.position.Y);
graphics.MultiplyTransform(matrix, XMatrixOrder.Prepend);
XFont font = label.minor ? styles.megaNames.SmallFont : styles.megaNames.Font;
XSize size = graphics.MeasureString(label.text, font);
graphics.TranslateTransform(-size.Width / 2, -size.Height / 2); // Center the text
RectangleF textBounds = new RectangleF(0, 0, (float)size.Width * 1.01f, (float)size.Height * 2); // *2 or it gets cut off at high sizes
XTextFormatter formatter = new XTextFormatter(graphics);
formatter.Alignment = XParagraphAlignment.Center;
formatter.DrawString(label.text, font, solidBrush, textBounds);
}
}
}
timers.Add(new Timer("mega names"));
#endregion
}
// End of clipping, so world names are not clipped in jumpmaps.
#region worlds
//------------------------------------------------------------
// Worlds
//------------------------------------------------------------
if (styles.worlds.visible)
{
// TODO: selector may be expensive
foreach (World world in selector.Worlds) { DrawWorld(fonts, world, WorldLayer.Background); }
foreach (World world in selector.Worlds) { DrawWorld(fonts, world, WorldLayer.Foreground); }
}
timers.Add(new Timer("worlds"));
#endregion
//------------------------------------------------------------
示例13: RenderContext
public RenderContext(ResourceManager resourceManager, Selector selector, RectangleF tileRect,
double scale, MapOptions options, Stylesheet styles, Size tileSize)
{
this.resourceManager = resourceManager;
this.selector = selector;
this.tileRect = tileRect;
this.scale = scale;
this.options = options;
this.styles = styles;
this.tileSize = tileSize;
XMatrix m = new XMatrix();
m.TranslatePrepend((float)(-tileRect.Left * scale * Astrometrics.ParsecScaleX), (float)(-tileRect.Top * scale * Astrometrics.ParsecScaleY));
m.ScalePrepend((float)scale * Astrometrics.ParsecScaleX, (float)scale * Astrometrics.ParsecScaleY);
imageSpaceToWorldSpace = m;
m.Invert();
worldSpaceToImageSpace = m;
}
示例14: WriteGlyphs
/// <summary>
/// Writes a Glyphs to the content stream.
/// </summary>
private void WriteGlyphs(Glyphs glyphs)
{
WriteSaveState("begin Glyphs", glyphs.Name);
// Transform also affects clipping and opacity mask
bool transformed = glyphs.RenderTransform != null;
if (transformed)
WriteRenderTransform(glyphs.RenderTransform);
bool clipped = glyphs.Clip != null;
if (clipped)
WriteClip(glyphs.Clip);
if (glyphs.Opacity < 1)
MultiplyOpacity(glyphs.Opacity);
if (glyphs.OpacityMask != null)
WriteOpacityMask(glyphs.OpacityMask);
XMatrix textMatrix = new XMatrix();
textMatrix.TranslatePrepend(glyphs.OriginX, glyphs.OriginY);
glyphs.OriginX = glyphs.OriginY = 0; // HACK: do not change model
double emSize = glyphs.FontRenderingEmSize;
textMatrix.ScalePrepend(glyphs.FontRenderingEmSize);
glyphs.FontRenderingEmSize = 1; // HACK: do not change model
bool boldSimulation = (glyphs.StyleSimulations & StyleSimulations.BoldSimulation) == StyleSimulations.BoldSimulation;
// just a draft...
if (boldSimulation)
{
boldSimulation = true;
// draw black stroke if it is not a solid color brush
XColor color = XColor.FromArgb(0, 0, 0);
if (glyphs.Fill is SolidColorBrush)
{
SolidColorBrush brush = glyphs.Fill as SolidColorBrush;
color = brush.Color;
}
WriteLiteral(String.Format(CultureInfo.InvariantCulture, "{0:0.###} {1:0.###} {2:0.###} RG\n", color.R / 255.0, color.G / 255.0, color.B / 255.0));
WriteLiteral("{0:0.###} w\n", emSize / 50);
}
if ((glyphs.StyleSimulations & StyleSimulations.ItalicSimulation) == StyleSimulations.ItalicSimulation)
{
textMatrix.SkewPrepend(-20, 0);
}
XForm xform = null;
XImage ximage = null;
RealizeFill(glyphs.Fill, ref xform, ref ximage);
RealizeFont(glyphs);
if (boldSimulation)
WriteLiteral("2 Tr\n", 1);
double x = glyphs.OriginX;
double y = glyphs.OriginY;
//switch (format.Alignment)
//{
// case XStringAlignment.Near:
// // nothing to do
// break;
// case XStringAlignment.Center:
// x += (rect.Width - width) / 2;
// break;
// case XStringAlignment.Far:
// x += rect.Width - width;
// break;
//}
PdfFont realizedFont = this.graphicsState.realizedFont;
Debug.Assert(realizedFont != null);
realizedFont.AddChars(glyphs.UnicodeString);
OpenTypeDescriptor descriptor = realizedFont.FontDescriptor.descriptor;
//if (bold && !descriptor.IsBoldFace)
//{
// // TODO: emulate bold by thicker outline
//}
//if (italic && !descriptor.IsBoldFace)
//{
// // TODO: emulate italic by shearing transformation
//}
#if true
string s2 = "";
//.........这里部分代码省略.........
示例15: DrawWorld
private static void DrawWorld(RenderContext ctx, FontCache styleRes, World world, WorldLayer layer)
{
bool isPlaceholder = world.IsPlaceholder;
bool isCapital = world.IsCapital;
bool isHiPop = world.IsHi;
bool renderName = ctx.styles.worldDetails.HasFlag(WorldDetails.AllNames) ||
(ctx.styles.worldDetails.HasFlag(WorldDetails.KeyNames) && (isCapital || isHiPop));
bool renderUWP = ctx.styles.worldDetails.HasFlag(WorldDetails.Uwp);
using (RenderUtil.SaveState(ctx.graphics))
{
XPen pen = new XPen(XColor.Empty);
XSolidBrush solidBrush = new XSolidBrush();
ctx.graphics.SmoothingMode = XSmoothingMode.AntiAlias;
// Center on the parsec
PointF center = Astrometrics.HexToCenter(world.Coordinates);
XMatrix matrix = new XMatrix();
matrix.TranslatePrepend(center.X, center.Y);
matrix.ScalePrepend(ctx.styles.hexContentScale / Astrometrics.ParsecScaleX, ctx.styles.hexContentScale / Astrometrics.ParsecScaleY);
ctx.graphics.MultiplyTransform(matrix, XMatrixOrder.Prepend);
if (!ctx.styles.useWorldImages)
{
if (layer == WorldLayer.Background)
{
#region Zone
if (ctx.styles.worldDetails.HasFlag(WorldDetails.Zone))
{
Stylesheet.StyleElement? maybeElem = ZoneStyle(ctx, world);
if (maybeElem.HasValue)
{
Stylesheet.StyleElement elem = maybeElem.Value;
if (!elem.fillColor.IsEmpty)
{
solidBrush.Color = elem.fillColor;
ctx.graphics.DrawEllipse(solidBrush, -0.4f, -0.4f, 0.8f, 0.8f);
}
PenInfo pi = elem.pen;
if (!pi.color.IsEmpty)
{
pi.Apply(ref pen);
if (renderName && ctx.styles.fillMicroBorders)
{
using (RenderUtil.SaveState(ctx.graphics))
{
ctx.graphics.IntersectClip(new RectangleF(-.5f, -.5f, 1f, renderUWP ? 0.65f : 0.75f));
ctx.graphics.DrawEllipse(pen, -0.4f, -0.4f, 0.8f, 0.8f);
}
}
else
{
ctx.graphics.DrawEllipse(pen, -0.4f, -0.4f, 0.8f, 0.8f);
}
}
}
}
#endregion
#region Hex
if (!ctx.styles.numberAllHexes &&
ctx.styles.worldDetails.HasFlag(WorldDetails.Hex))
{
string hex;
switch (ctx.styles.hexCoordinateStyle)
{
default:
case Stylesheet.HexCoordinateStyle.Sector: hex = world.Hex; break;
case Stylesheet.HexCoordinateStyle.Subsector: hex = world.SubsectorHex; break;
}
solidBrush.Color = ctx.styles.hexNumber.textColor;
ctx.graphics.DrawString(hex, ctx.styles.hexNumber.Font, solidBrush, 0.0f, -0.5f, RenderUtil.StringFormatTopCenter);
}
#endregion
}
if (layer == WorldLayer.Foreground)
{
Stylesheet.StyleElement? elem = ZoneStyle(ctx, world);
TextBackgroundStyle worldTextBackgroundStyle = (elem.HasValue && !elem.Value.fillColor.IsEmpty)
? TextBackgroundStyle.None : ctx.styles.worlds.textBackgroundStyle;
#region Name
if (renderName)
{
string name = world.Name;
if ((isHiPop && ctx.styles.worldDetails.HasFlag(WorldDetails.Highlight)) || ctx.styles.worlds.textStyle.Uppercase)
name = name.ToUpperInvariant();
Color textColor = (isCapital && ctx.styles.worldDetails.HasFlag(WorldDetails.Highlight))
? ctx.styles.worlds.textHighlightColor : ctx.styles.worlds.textColor;
XFont font = ((isHiPop || isCapital) && ctx.styles.worldDetails.HasFlag(WorldDetails.Highlight))
? ctx.styles.worlds.LargeFont : ctx.styles.worlds.Font;
DrawWorldLabel(ctx, worldTextBackgroundStyle, solidBrush, textColor, ctx.styles.worlds.textStyle.Translation, font, name);
}
//.........这里部分代码省略.........