merge pull request #103 from uglytoad/version-10-bugfixes

version 10 bugfixes
This commit is contained in:
Eliot Jones
2019-12-16 13:24:21 +00:00
committed by GitHub
3 changed files with 25 additions and 33 deletions

View File

@@ -68,6 +68,7 @@
{ {
AdvancedStrokingColorSpace = namedColorSpace.Name; AdvancedStrokingColorSpace = namedColorSpace.Name;
CurrentStrokingColorSpace = colorspaceActual; CurrentStrokingColorSpace = colorspaceActual;
DefaultColorSpace(colorspaceActual);
} }
else else
{ {
@@ -120,10 +121,11 @@
if (namedColorSpace.Name == NameToken.Separation && namedColorSpace.Data is ArrayToken separationArray if (namedColorSpace.Name == NameToken.Separation && namedColorSpace.Data is ArrayToken separationArray
&& separationArray.Length == 4 && separationArray.Length == 4
&& separationArray[2] is NameToken alternativeColorSpaceName && separationArray[2] is NameToken alternativeColorSpaceName
&& alternativeColorSpaceName.TryMapToColorSpace(out var colorSpaceActual)) && alternativeColorSpaceName.TryMapToColorSpace(out colorspaceActual))
{ {
AdvancedNonStrokingColorSpace = namedColorSpace.Name; AdvancedNonStrokingColorSpace = namedColorSpace.Name;
CurrentNonStrokingColorSpace = colorSpaceActual; CurrentNonStrokingColorSpace = colorspaceActual;
DefaultColorSpace(colorspaceActual);
} }
else else
{ {

View File

@@ -50,6 +50,7 @@
private Stack<CurrentGraphicsState> graphicsStack = new Stack<CurrentGraphicsState>(); private Stack<CurrentGraphicsState> graphicsStack = new Stack<CurrentGraphicsState>();
private IFont activeExtendedGraphicsStateFont; private IFont activeExtendedGraphicsStateFont;
private InlineImageBuilder inlineImageBuilder; private InlineImageBuilder inlineImageBuilder;
private bool currentPathAdded;
/// <summary> /// <summary>
/// A counter to track individual calls to <see cref="ShowText"/> operations used to determine if letters are likely to be /// A counter to track individual calls to <see cref="ShowText"/> operations used to determine if letters are likely to be
@@ -215,20 +216,22 @@
? currentState.CurrentNonStrokingColor ? currentState.CurrentNonStrokingColor
: currentState.CurrentStrokingColor; : currentState.CurrentStrokingColor;
ShowGlyph(font, transformedGlyphBounds, var letter = new Letter(unicode, transformedGlyphBounds,
transformedPdfBounds.BottomLeft, transformedPdfBounds.BottomLeft,
transformedPdfBounds.BottomRight, transformedPdfBounds.BottomRight,
transformedPdfBounds.Width, transformedPdfBounds.Width,
unicode,
fontSize, fontSize,
font.Name.Data,
color, color,
pointSize, pointSize,
textSequence); textSequence);
letters.Add(letter);
decimal tx, ty; decimal tx, ty;
if (font.IsVertical) if (font.IsVertical)
{ {
var verticalFont = (IVerticalWritingSupported) font; var verticalFont = (IVerticalWritingSupported)font;
var displacement = verticalFont.GetDisplacementVector(code); var displacement = verticalFont.GetDisplacementVector(code);
tx = 0; tx = 0;
ty = (displacement.Y * fontSize) + characterSpacing + wordSpacing; ty = (displacement.Y * fontSize) + characterSpacing + wordSpacing;
@@ -352,7 +355,7 @@
{ {
formMatrix = TransformationMatrix.FromArray(formMatrixToken.Data.OfType<NumericToken>().Select(x => x.Data).ToArray()); formMatrix = TransformationMatrix.FromArray(formMatrixToken.Data.OfType<NumericToken>().Select(x => x.Data).ToArray());
} }
// 2. Update current transformation matrix. // 2. Update current transformation matrix.
var resultingTransformationMatrix = startState.CurrentTransformationMatrix.Multiply(formMatrix); var resultingTransformationMatrix = startState.CurrentTransformationMatrix.Multiply(formMatrix);
@@ -378,12 +381,13 @@
public void BeginSubpath() public void BeginSubpath()
{ {
if (CurrentPath != null && CurrentPath.Commands.Count > 0 && !paths.Contains(CurrentPath)) if (CurrentPath != null && CurrentPath.Commands.Count > 0 && !currentPathAdded)
{ {
paths.Add(CurrentPath); paths.Add(CurrentPath);
} }
CurrentPath = new PdfPath(); CurrentPath = new PdfPath();
currentPathAdded = false;
} }
public void StrokePath(bool close) public void StrokePath(bool close)
@@ -395,6 +399,7 @@
else else
{ {
paths.Add(CurrentPath); paths.Add(CurrentPath);
currentPathAdded = true;
} }
} }
@@ -407,6 +412,7 @@
else else
{ {
paths.Add(CurrentPath); paths.Add(CurrentPath);
currentPathAdded = true;
} }
} }
@@ -415,6 +421,7 @@
CurrentPath.ClosePath(); CurrentPath.ClosePath();
paths.Add(CurrentPath); paths.Add(CurrentPath);
CurrentPath = null; CurrentPath = null;
currentPathAdded = false;
} }
public void SetNamedGraphicsState(NameToken stateName) public void SetNamedGraphicsState(NameToken stateName)
@@ -501,28 +508,5 @@
TextMatrices.TextMatrix = newMatrix; TextMatrices.TextMatrix = newMatrix;
} }
private void ShowGlyph(IFont font, PdfRectangle glyphRectangle,
PdfPoint startBaseLine,
PdfPoint endBaseLine,
decimal width,
string unicode,
decimal fontSize,
IColor color,
decimal pointSize,
int textSequence)
{
var letter = new Letter(unicode, glyphRectangle,
startBaseLine,
endBaseLine,
width,
fontSize,
font.Name.Data,
color,
pointSize,
textSequence);
letters.Add(letter);
}
} }
} }

View File

@@ -4,6 +4,7 @@
internal class OperatorToken : IDataToken<string> internal class OperatorToken : IDataToken<string>
{ {
private static readonly object Lock = new object();
private static readonly Dictionary<string, string> PooledNames = new Dictionary<string, string>(); private static readonly Dictionary<string, string> PooledNames = new Dictionary<string, string>();
public static readonly OperatorToken R = new OperatorToken("R"); public static readonly OperatorToken R = new OperatorToken("R");
@@ -24,10 +25,15 @@
private OperatorToken(string data) private OperatorToken(string data)
{ {
if (!PooledNames.TryGetValue(data, out var stored)) string stored;
lock (Lock)
{ {
stored = data; if (!PooledNames.TryGetValue(data, out stored))
PooledNames[data] = stored; {
stored = data;
PooledNames[data] = stored;
}
} }
Data = stored; Data = stored;