ASCU_ALL/MigraDoc.Rendering/Rendering/TextFrameRenderer.cs
2020-09-04 12:49:15 +05:00

131 lines
4.7 KiB
C#

#region MigraDoc - Creating Documents on the Fly
//
// Authors:
// Klaus Potzesny
//
// Copyright (c) 2001-2017 empira Software GmbH, Cologne Area (Germany)
//
// http://www.pdfsharp.com
// http://www.migradoc.com
// http://sourceforge.net/projects/pdfsharp
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
#endregion
using PdfSharp.Drawing;
using MigraDoc.DocumentObjectModel.Shapes;
namespace MigraDoc.Rendering
{
/// <summary>
/// Renders textframes.
/// </summary>
public class TextFrameRenderer : ShapeRenderer
{
public TextFrameRenderer(XGraphics gfx, TextFrame textframe, FieldInfos fieldInfos)
: base(gfx, textframe, fieldInfos)
{
_textframe = textframe;
TextFrameRenderInfo renderInfo = new TextFrameRenderInfo();
renderInfo.DocumentObject = _shape;
_renderInfo = renderInfo;
}
public TextFrameRenderer(XGraphics gfx, RenderInfo renderInfo, FieldInfos fieldInfos)
: base(gfx, renderInfo, fieldInfos)
{
_textframe = (TextFrame)renderInfo.DocumentObject;
}
public override void Format(Area area, FormatInfo previousFormatInfo)
{
FormattedTextFrame formattedTextFrame = new FormattedTextFrame(_textframe, _documentRenderer, _fieldInfos);
formattedTextFrame.Format(_gfx);
((TextFrameFormatInfo)_renderInfo.FormatInfo).FormattedTextFrame = formattedTextFrame;
base.Format(area, previousFormatInfo);
}
public override LayoutInfo InitialLayoutInfo
{
get { return base.InitialLayoutInfo; }
}
public override void Render()
{
RenderFilling();
RenderContent();
RenderLine();
}
void RenderContent()
{
FormattedTextFrame formattedTextFrame = ((TextFrameFormatInfo)_renderInfo.FormatInfo).FormattedTextFrame;
RenderInfo[] renderInfos = formattedTextFrame.GetRenderInfos();
if (renderInfos == null)
return;
XGraphicsState state = Transform();
RenderByInfos(renderInfos);
ResetTransform(state);
}
XGraphicsState Transform()
{
Area frameContentArea = _renderInfo.LayoutInfo.ContentArea;
XGraphicsState state = _gfx.Save();
XUnit xPosition;
XUnit yPosition;
switch (_textframe.Orientation)
{
case TextOrientation.Downward:
case TextOrientation.Vertical:
case TextOrientation.VerticalFarEast:
xPosition = frameContentArea.X + frameContentArea.Width;
yPosition = frameContentArea.Y;
_gfx.TranslateTransform(xPosition, yPosition);
_gfx.RotateTransform(90);
break;
case TextOrientation.Upward:
state = _gfx.Save();
xPosition = frameContentArea.X;
yPosition = frameContentArea.Y + frameContentArea.Height;
_gfx.TranslateTransform(xPosition, yPosition);
_gfx.RotateTransform(-90);
break;
default:
xPosition = frameContentArea.X;
yPosition = frameContentArea.Y;
_gfx.TranslateTransform(xPosition, yPosition);
break;
}
return state;
}
void ResetTransform(XGraphicsState state)
{
if (state != null)
_gfx.Restore(state);
}
readonly TextFrame _textframe;
}
}