diff --git a/src/UglyToad.PdfPig/Graphics/ColorSpaceContext.cs b/src/UglyToad.PdfPig/Graphics/ColorSpaceContext.cs index f0f92f36..aa26ec10 100644 --- a/src/UglyToad.PdfPig/Graphics/ColorSpaceContext.cs +++ b/src/UglyToad.PdfPig/Graphics/ColorSpaceContext.cs @@ -68,6 +68,7 @@ { AdvancedStrokingColorSpace = namedColorSpace.Name; CurrentStrokingColorSpace = colorspaceActual; + DefaultColorSpace(colorspaceActual); } else { @@ -120,10 +121,11 @@ if (namedColorSpace.Name == NameToken.Separation && namedColorSpace.Data is ArrayToken separationArray && separationArray.Length == 4 && separationArray[2] is NameToken alternativeColorSpaceName - && alternativeColorSpaceName.TryMapToColorSpace(out var colorSpaceActual)) + && alternativeColorSpaceName.TryMapToColorSpace(out colorspaceActual)) { AdvancedNonStrokingColorSpace = namedColorSpace.Name; - CurrentNonStrokingColorSpace = colorSpaceActual; + CurrentNonStrokingColorSpace = colorspaceActual; + DefaultColorSpace(colorspaceActual); } else { diff --git a/src/UglyToad.PdfPig/Graphics/ContentStreamProcessor.cs b/src/UglyToad.PdfPig/Graphics/ContentStreamProcessor.cs index b8c05427..c07af4ae 100644 --- a/src/UglyToad.PdfPig/Graphics/ContentStreamProcessor.cs +++ b/src/UglyToad.PdfPig/Graphics/ContentStreamProcessor.cs @@ -50,6 +50,7 @@ private Stack graphicsStack = new Stack(); private IFont activeExtendedGraphicsStateFont; private InlineImageBuilder inlineImageBuilder; + private bool currentPathAdded; /// /// A counter to track individual calls to operations used to determine if letters are likely to be @@ -215,20 +216,22 @@ ? currentState.CurrentNonStrokingColor : currentState.CurrentStrokingColor; - ShowGlyph(font, transformedGlyphBounds, + var letter = new Letter(unicode, transformedGlyphBounds, transformedPdfBounds.BottomLeft, transformedPdfBounds.BottomRight, transformedPdfBounds.Width, - unicode, fontSize, + font.Name.Data, color, pointSize, textSequence); + letters.Add(letter); + decimal tx, ty; if (font.IsVertical) { - var verticalFont = (IVerticalWritingSupported) font; + var verticalFont = (IVerticalWritingSupported)font; var displacement = verticalFont.GetDisplacementVector(code); tx = 0; ty = (displacement.Y * fontSize) + characterSpacing + wordSpacing; @@ -352,7 +355,7 @@ { formMatrix = TransformationMatrix.FromArray(formMatrixToken.Data.OfType().Select(x => x.Data).ToArray()); } - + // 2. Update current transformation matrix. var resultingTransformationMatrix = startState.CurrentTransformationMatrix.Multiply(formMatrix); @@ -378,12 +381,13 @@ public void BeginSubpath() { - if (CurrentPath != null && CurrentPath.Commands.Count > 0 && !paths.Contains(CurrentPath)) + if (CurrentPath != null && CurrentPath.Commands.Count > 0 && !currentPathAdded) { paths.Add(CurrentPath); } CurrentPath = new PdfPath(); + currentPathAdded = false; } public void StrokePath(bool close) @@ -395,6 +399,7 @@ else { paths.Add(CurrentPath); + currentPathAdded = true; } } @@ -407,6 +412,7 @@ else { paths.Add(CurrentPath); + currentPathAdded = true; } } @@ -415,6 +421,7 @@ CurrentPath.ClosePath(); paths.Add(CurrentPath); CurrentPath = null; + currentPathAdded = false; } public void SetNamedGraphicsState(NameToken stateName) @@ -501,28 +508,5 @@ 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); - } } } \ No newline at end of file diff --git a/src/UglyToad.PdfPig/Tokens/OperatorToken.cs b/src/UglyToad.PdfPig/Tokens/OperatorToken.cs index 15950575..889605a1 100644 --- a/src/UglyToad.PdfPig/Tokens/OperatorToken.cs +++ b/src/UglyToad.PdfPig/Tokens/OperatorToken.cs @@ -4,6 +4,7 @@ internal class OperatorToken : IDataToken { + private static readonly object Lock = new object(); private static readonly Dictionary PooledNames = new Dictionary(); public static readonly OperatorToken R = new OperatorToken("R"); @@ -24,10 +25,15 @@ private OperatorToken(string data) { - if (!PooledNames.TryGetValue(data, out var stored)) + string stored; + + lock (Lock) { - stored = data; - PooledNames[data] = stored; + if (!PooledNames.TryGetValue(data, out stored)) + { + stored = data; + PooledNames[data] = stored; + } } Data = stored;