From ecbf86d0b3cee001a392c84ac15a5760028f8c21 Mon Sep 17 00:00:00 2001 From: Nanou Persoons Date: Mon, 16 Sep 2024 13:29:34 +0200 Subject: [PATCH 1/3] Resolve static final SQ rules DEVSIX-8225 --- .../io/font/CFFFontSubsetIntegrationTest.cs | 2 +- .../itext/io/font/cmap/CMapToUnicodeTest.cs | 35 ++ .../io/font/otf/ActualTextIteratorTest.cs | 45 +- .../itext/io/font/otf/GlyphLinePartTest.cs | 39 ++ .../itext/io/font/otf/GlyphLineTest.cs | 262 ++++++-- .../itext/io/font/otf/GposLookupType1Test.cs | 4 +- .../itext/io/font/otf/GposLookupType2Test.cs | 63 ++ .../itext/io/font/otf/GposLookupType4Test.cs | 2 +- .../itext/io/font/otf/GposLookupType5Test.cs | 17 +- .../itext/io/font/otf/GposLookupType6Test.cs | 63 ++ .../itext/io/font/otf/GsubLookupType4Test.cs | 15 +- .../itext/io/font/otf/LanguageRecordTest.cs | 50 ++ .../itext/io/font/otf/OpenTableLookupTest.cs | 57 ++ .../font/otf/OpenTypeFontTableReaderTest.cs | 119 +++- .../itext/io/font/otf/OtfReadCommonTest.cs | 8 +- .../BitstreamCopyright.txt | 15 + .../otf/GposLookupType2Test/DejaVuSans.ttf | Bin 0 -> 757076 bytes .../otf/GposLookupType2Test/LICENSE_OFL.txt | 92 +++ .../font/otf/GposLookupType2Test/NOTICE.txt | 3 + .../NotoSansMyanmar-Regular.ttf | Bin 0 -> 153604 bytes .../itext/kernel/pdf/canvas/PdfCanvasTest.cs | 85 ++- .../layout/renderer/LineRendererUnitTest.cs | 50 ++ .../renderer/TextRendererIntegrationTest.cs | 118 +++- .../itext/layout/renderer/TextRendererTest.cs | 8 +- .../itext/layout/renderer/WordWrapUnitTest.cs | 2 +- .../itext/pdfa/checker/PdfA2CheckerTest.cs | 51 ++ .../itext/barcodes/BarcodeDataMatrix.cs | 62 +- .../itext/barcodes/BarcodePDF417.cs | 76 ++- .../itext/barcodes/BarcodePostnet.cs | 4 +- .../itext/barcodes/dmcode/DmParams.cs | 56 +- .../itext/io/codec/Jbig2SegmentReader.cs | 278 +++++++-- itext/itext.io/itext/io/font/CFFFont.cs | 578 +++++++++++++++--- itext/itext.io/itext/io/font/CFFFontSubset.cs | 243 ++++---- .../itext/io/font/cmap/CMapByteCid.cs | 39 +- .../itext/io/font/cmap/CMapToUnicode.cs | 4 +- .../io/font/constants/FontDescriptorFlags.cs | 18 +- .../itext/io/font/otf/ActualTextIterator.cs | 30 +- .../io/font/otf/ChainingContextualTable.cs | 20 +- .../itext/io/font/otf/ContextualTable.cs | 16 +- .../itext/io/font/otf/FeatureRecord.cs | 28 +- itext/itext.io/itext/io/font/otf/GlyphLine.cs | 151 ++++- .../itext.io/itext/io/font/otf/GposAnchor.cs | 34 +- .../itext/io/font/otf/GposLookupType1.cs | 18 +- .../itext/io/font/otf/GposLookupType2.cs | 82 ++- .../itext/io/font/otf/GposLookupType4.cs | 37 +- .../itext/io/font/otf/GposLookupType5.cs | 31 +- .../itext/io/font/otf/GposLookupType6.cs | 38 +- .../itext/io/font/otf/GposLookupType7.cs | 24 +- .../itext/io/font/otf/GposValueRecord.cs | 56 +- .../itext/io/font/otf/GsubLookupType1.cs | 6 +- .../itext/io/font/otf/GsubLookupType2.cs | 6 +- .../itext/io/font/otf/GsubLookupType3.cs | 6 +- .../itext/io/font/otf/GsubLookupType4.cs | 12 +- .../itext/io/font/otf/GsubLookupType5.cs | 24 +- .../itext/io/font/otf/LanguageRecord.cs | 42 +- .../itext/io/font/otf/OpenTableLookup.cs | 50 +- .../itext/io/font/otf/OpenTypeFeature.cs | 6 +- .../io/font/otf/OpenTypeFontTableReader.cs | 24 +- .../itext/io/font/otf/OpenTypeScript.cs | 38 +- .../itext/io/font/otf/OtfMarkRecord.cs | 28 +- .../itext/io/font/otf/OtfReadCommon.cs | 28 +- .../itext/io/font/otf/ScriptRecord.cs | 42 +- .../itext/io/font/otf/TagAndLocation.cs | 28 +- .../itext/io/image/Jbig2ImageHelper.cs | 4 +- .../itext/io/image/Jpeg2000ImageData.cs | 70 ++- .../itext/io/image/Jpeg2000ImageHelper.cs | 18 +- .../itext.io/itext/io/source/PdfTokenizer.cs | 38 +- .../io/source/RandomAccessFileOrArray.cs | 7 - .../itext/kernel/font/FontUtil.cs | 2 +- .../itext/kernel/font/PdfSimpleFont.cs | 6 +- .../itext/kernel/font/PdfType0Font.cs | 8 +- .../itext/kernel/font/PdfType3Font.cs | 4 +- .../itext/kernel/numbering/RomanNumbering.cs | 38 +- .../itext.kernel/itext/kernel/pdf/PdfName.cs | 2 +- .../itext/kernel/pdf/PdfOutline.cs | 4 +- .../itext/kernel/pdf/canvas/PdfCanvas.cs | 26 +- .../pdf/canvas/parser/data/TextRenderInfo.cs | 8 +- .../itext/kernel/pdf/canvas/wmf/MetaDo.cs | 4 +- .../itext/kernel/pdf/canvas/wmf/MetaState.cs | 52 +- .../kernel/pdf/extgstate/PdfExtGState.cs | 32 +- .../itext/layout/renderer/LineRenderer.cs | 48 +- .../itext/layout/renderer/TableRenderer.cs | 42 +- .../itext/layout/renderer/TextRenderer.cs | 182 +++--- .../renderer/TextSequenceWordWrapping.cs | 20 +- .../itext/pdfa/checker/PdfA2Checker.cs | 10 +- .../itext/signatures/CertificateInfo.cs | 2 +- .../itext/signatures/LtvVerification.cs | 76 ++- port-hash | 2 +- 88 files changed, 3198 insertions(+), 975 deletions(-) create mode 100644 itext.tests/itext.io.tests/itext/io/font/cmap/CMapToUnicodeTest.cs create mode 100644 itext.tests/itext.io.tests/itext/io/font/otf/GlyphLinePartTest.cs create mode 100644 itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType2Test.cs create mode 100644 itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType6Test.cs create mode 100644 itext.tests/itext.io.tests/itext/io/font/otf/LanguageRecordTest.cs create mode 100644 itext.tests/itext.io.tests/itext/io/font/otf/OpenTableLookupTest.cs create mode 100644 itext.tests/itext.io.tests/resources/itext/io/font/otf/GposLookupType2Test/BitstreamCopyright.txt create mode 100644 itext.tests/itext.io.tests/resources/itext/io/font/otf/GposLookupType2Test/DejaVuSans.ttf create mode 100644 itext.tests/itext.io.tests/resources/itext/io/font/otf/GposLookupType2Test/LICENSE_OFL.txt create mode 100644 itext.tests/itext.io.tests/resources/itext/io/font/otf/GposLookupType2Test/NOTICE.txt create mode 100644 itext.tests/itext.io.tests/resources/itext/io/font/otf/GposLookupType2Test/NotoSansMyanmar-Regular.ttf diff --git a/itext.tests/itext.io.tests/itext/io/font/CFFFontSubsetIntegrationTest.cs b/itext.tests/itext.io.tests/itext/io/font/CFFFontSubsetIntegrationTest.cs index 596cce5093..18be4a5f8a 100644 --- a/itext.tests/itext.io.tests/itext/io/font/CFFFontSubsetIntegrationTest.cs +++ b/itext.tests/itext.io.tests/itext/io/font/CFFFontSubsetIntegrationTest.cs @@ -104,7 +104,7 @@ public virtual void SubsetNonCidCFFFontRangeCheck() { CFFFont result = new CFFFont(cffSubsetBytes); int expectedCharsetLength = 255; // skip over the format ID (1 byte) and the first SID (2 bytes) - result.Seek(result.fonts[0].charsetOffset + 3); + result.Seek(result.fonts[0].GetCharsetOffset() + 3); NUnit.Framework.Assert.AreEqual(expectedCharsetLength - 2, result.GetCard16()); } diff --git a/itext.tests/itext.io.tests/itext/io/font/cmap/CMapToUnicodeTest.cs b/itext.tests/itext.io.tests/itext/io/font/cmap/CMapToUnicodeTest.cs new file mode 100644 index 0000000000..ae6de29c43 --- /dev/null +++ b/itext.tests/itext.io.tests/itext/io/font/cmap/CMapToUnicodeTest.cs @@ -0,0 +1,35 @@ +/* +This file is part of the iText (R) project. +Copyright (c) 1998-2024 Apryse Group NV +Authors: Apryse Software. + +This program is offered under a commercial and under the AGPL license. +For commercial licensing, contact us at https://itextpdf.com/sales. For AGPL licensing, see below. + +AGPL licensing: +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +using iText.Test; + +namespace iText.IO.Font.Cmap { + [NUnit.Framework.Category("UnitTest")] + public class CMapToUnicodeTest : ExtendedITextTest { + [NUnit.Framework.Test] + public virtual void EmptyCmapVarTest() { + NUnit.Framework.Assert.IsNotNull(CMapToUnicode.EMPTY_CMAP); + NUnit.Framework.Assert.IsFalse(CMapToUnicode.EMPTY_CMAP.HasByteMappings(), "Cmap has no two byte mappings" + ); + } + } +} diff --git a/itext.tests/itext.io.tests/itext/io/font/otf/ActualTextIteratorTest.cs b/itext.tests/itext.io.tests/itext/io/font/otf/ActualTextIteratorTest.cs index 86d23cc879..e94e996756 100644 --- a/itext.tests/itext.io.tests/itext/io/font/otf/ActualTextIteratorTest.cs +++ b/itext.tests/itext.io.tests/itext/io/font/otf/ActualTextIteratorTest.cs @@ -34,7 +34,50 @@ public virtual void TestActualTestParts() { ActualTextIterator actualTextIterator = new ActualTextIterator(glyphLine); GlyphLine.GlyphLinePart part = actualTextIterator.Next(); // When actual text is the same as the result by text extraction, we should omit redundant actual text in the content stream - NUnit.Framework.Assert.IsNull(part.actualText); + NUnit.Framework.Assert.IsNull(part.GetActualText()); + } + + [NUnit.Framework.Test] + public virtual void NextCurrentResNullTest() { + Glyph glyph = new Glyph(200, 200, '\u002d'); + GlyphLine glyphLine = new GlyphLine(JavaUtil.ArraysAsList(glyph, null, glyph)); + glyphLine.SetActualText(0, 1, "\u002d"); + ActualTextIterator actualTextIterator = new ActualTextIterator(glyphLine); + actualTextIterator.Next(); + GlyphLine.GlyphLinePart secondNext = actualTextIterator.Next(); + NUnit.Framework.Assert.IsNull(secondNext); + } + + [NUnit.Framework.Test] + public virtual void NextIterationTest() { + Glyph glyph = new Glyph(200, 200, '\u002d'); + GlyphLine glyphLine = new GlyphLine(JavaUtil.ArraysAsList(glyph, glyph, glyph)); + glyphLine.SetActualText(0, 1, "\u002d"); + ActualTextIterator actualTextIterator = new ActualTextIterator(glyphLine); + GlyphLine.GlyphLinePart next = actualTextIterator.Next(); + NUnit.Framework.Assert.AreEqual(3, next.GetEnd()); + } + + [NUnit.Framework.Test] + public virtual void NextWithNegativeEndTest() { + Glyph glyph = new Glyph(200, 200, '\u002d'); + GlyphLine glyphLine = new GlyphLine(JavaUtil.ArraysAsList(glyph, glyph, glyph)); + glyphLine.SetActualText(0, 1, "\u002d"); + glyphLine.SetEnd(-1); + ActualTextIterator actualTextIterator = new ActualTextIterator(glyphLine); + GlyphLine.GlyphLinePart next = actualTextIterator.Next(); + NUnit.Framework.Assert.IsNull(next); + } + + [NUnit.Framework.Test] + public virtual void NextWithInvalidUnicodeTest() { + Glyph glyph = new Glyph(200, 200, 0); + Glyph glyphinvalid = new Glyph(200, 200, null); + GlyphLine glyphLine = new GlyphLine(JavaUtil.ArraysAsList(glyph, glyphinvalid)); + glyphLine.SetActualText(1, 2, "X"); + ActualTextIterator actualTextIterator = new ActualTextIterator(glyphLine); + GlyphLine.GlyphLinePart next = actualTextIterator.Next(); + NUnit.Framework.Assert.IsNull(next.GetActualText()); } } } diff --git a/itext.tests/itext.io.tests/itext/io/font/otf/GlyphLinePartTest.cs b/itext.tests/itext.io.tests/itext/io/font/otf/GlyphLinePartTest.cs new file mode 100644 index 0000000000..c5af958300 --- /dev/null +++ b/itext.tests/itext.io.tests/itext/io/font/otf/GlyphLinePartTest.cs @@ -0,0 +1,39 @@ +/* +This file is part of the iText (R) project. +Copyright (c) 1998-2024 Apryse Group NV +Authors: Apryse Software. + +This program is offered under a commercial and under the AGPL license. +For commercial licensing, contact us at https://itextpdf.com/sales. For AGPL licensing, see below. + +AGPL licensing: +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +using iText.Test; + +namespace iText.IO.Font.Otf { + [NUnit.Framework.Category("UnitTest")] + public class GlyphLinePartTest : ExtendedITextTest { + [NUnit.Framework.Test] + public virtual void CustomGlyphLinePartTest() { + GlyphLine.GlyphLinePart part = new GlyphLine.GlyphLinePart(0, 4); + part.SetStart(1); + part.SetEnd(5); + part.SetReversed(false); + NUnit.Framework.Assert.AreEqual(1, part.GetStart()); + NUnit.Framework.Assert.AreEqual(5, part.GetEnd()); + NUnit.Framework.Assert.IsFalse(part.IsReversed()); + } + } +} diff --git a/itext.tests/itext.io.tests/itext/io/font/otf/GlyphLineTest.cs b/itext.tests/itext.io.tests/itext/io/font/otf/GlyphLineTest.cs index a825953dbe..0c40cdee58 100644 --- a/itext.tests/itext.io.tests/itext/io/font/otf/GlyphLineTest.cs +++ b/itext.tests/itext.io.tests/itext/io/font/otf/GlyphLineTest.cs @@ -30,6 +30,9 @@ You should have received a copy of the GNU Affero General Public License namespace iText.IO.Font.Otf { [NUnit.Framework.Category("UnitTest")] public class GlyphLineTest : ExtendedITextTest { + public static readonly String FREESANS_FONT_PATH = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext + .CurrentContext.TestDirectory) + "/resources/itext/io/font/otf/FreeSans.ttf"; + private static IList ConstructGlyphListFromString(String text, TrueTypeFont font) { IList glyphList = new List(); char[] chars = text.ToCharArray(); @@ -49,48 +52,42 @@ public virtual void TestEquals() { >(JavaUtil.ArraysAsList(actualText)), 0, 1); one.Add(glyph); two.Add(glyph); - one.end++; - two.end++; + one.SetEnd(one.GetEnd() + 1); + two.SetEnd(two.GetEnd() + 1); NUnit.Framework.Assert.IsTrue(one.Equals(two)); } [NUnit.Framework.Test] public virtual void TestOtherLinesAddition() { - byte[] ttf = StreamUtil.InputStreamToArray(FileUtil.GetInputStreamForFile(iText.Test.TestUtil.GetParentProjectDirectory - (NUnit.Framework.TestContext.CurrentContext.TestDirectory) + "/resources/itext/io/font/otf/FreeSans.ttf" - )); - TrueTypeFont font = new TrueTypeFont(ttf); + TrueTypeFont font = InitializeFont(); GlyphLine containerLine = new GlyphLine(ConstructGlyphListFromString("Viva France!", font)); GlyphLine childLine1 = new GlyphLine(ConstructGlyphListFromString(" Liberte", font)); containerLine.Add(childLine1); - NUnit.Framework.Assert.AreEqual(containerLine.end, 12); - containerLine.end = 20; + NUnit.Framework.Assert.AreEqual(12, containerLine.GetEnd()); + containerLine.SetEnd(20); GlyphLine childLine2 = new GlyphLine(ConstructGlyphListFromString(" Egalite", font)); containerLine.Add(childLine2); - NUnit.Framework.Assert.AreEqual(containerLine.end, 20); - containerLine.start = 10; + NUnit.Framework.Assert.AreEqual(20, containerLine.GetEnd()); + containerLine.SetStart(10); GlyphLine childLine3 = new GlyphLine(ConstructGlyphListFromString(" Fraternite", font)); containerLine.Add(childLine3); - NUnit.Framework.Assert.AreEqual(containerLine.start, 10); - containerLine.start = 0; + NUnit.Framework.Assert.AreEqual(10, containerLine.GetStart()); + containerLine.SetStart(0); containerLine.Add(ConstructGlyphListFromString("!", font)[0]); - containerLine.end = 40; - NUnit.Framework.Assert.AreEqual(containerLine.glyphs.Count, 40); + containerLine.SetEnd(40); + NUnit.Framework.Assert.AreEqual(40, containerLine.glyphs.Count); } [NUnit.Framework.Test] public virtual void TestAdditionWithActualText() { - byte[] ttf = StreamUtil.InputStreamToArray(FileUtil.GetInputStreamForFile(iText.Test.TestUtil.GetParentProjectDirectory - (NUnit.Framework.TestContext.CurrentContext.TestDirectory) + "/resources/itext/io/font/otf/FreeSans.ttf" - )); - TrueTypeFont font = new TrueTypeFont(ttf); + TrueTypeFont font = InitializeFont(); IList glyphs = ConstructGlyphListFromString("Viva France!", font); GlyphLine containerLine = new GlyphLine(glyphs); NUnit.Framework.Assert.IsNull(containerLine.actualText); containerLine.SetActualText(0, 1, "TEST"); NUnit.Framework.Assert.IsNotNull(containerLine.actualText); NUnit.Framework.Assert.AreEqual(12, containerLine.actualText.Count); - NUnit.Framework.Assert.AreEqual("TEST", containerLine.actualText[0].value); + NUnit.Framework.Assert.AreEqual("TEST", containerLine.actualText[0].GetValue()); containerLine.Add(new GlyphLine(glyphs)); NUnit.Framework.Assert.AreEqual(24, containerLine.actualText.Count); for (int i = 13; i < 24; i++) { @@ -100,55 +97,46 @@ public virtual void TestAdditionWithActualText() { [NUnit.Framework.Test] public virtual void TestOtherLinesWithActualTextAddition() { - byte[] ttf = StreamUtil.InputStreamToArray(FileUtil.GetInputStreamForFile(iText.Test.TestUtil.GetParentProjectDirectory - (NUnit.Framework.TestContext.CurrentContext.TestDirectory) + "/resources/itext/io/font/otf/FreeSans.ttf" - )); - TrueTypeFont font = new TrueTypeFont(ttf); + TrueTypeFont font = InitializeFont(); GlyphLine containerLine = new GlyphLine(ConstructGlyphListFromString("France", font)); GlyphLine childLine = new GlyphLine(ConstructGlyphListFromString("---Liberte", font)); childLine.SetActualText(3, 10, "Viva"); containerLine.Add(childLine); - containerLine.end = 16; + containerLine.SetEnd(16); for (int i = 0; i < 9; i++) { NUnit.Framework.Assert.IsNull(containerLine.actualText[i]); } for (int i = 9; i < 16; i++) { - NUnit.Framework.Assert.AreEqual("Viva", containerLine.actualText[i].value); + NUnit.Framework.Assert.AreEqual("Viva", containerLine.actualText[i].GetValue()); } NUnit.Framework.Assert.AreEqual("France---Viva", containerLine.ToString()); } [NUnit.Framework.Test] public virtual void TestOtherLinesWithActualTextAddition02() { - byte[] ttf = StreamUtil.InputStreamToArray(FileUtil.GetInputStreamForFile(iText.Test.TestUtil.GetParentProjectDirectory - (NUnit.Framework.TestContext.CurrentContext.TestDirectory) + "/resources/itext/io/font/otf/FreeSans.ttf" - )); - TrueTypeFont font = new TrueTypeFont(ttf); + TrueTypeFont font = InitializeFont(); GlyphLine containerLine = new GlyphLine(ConstructGlyphListFromString("France", font)); containerLine.SetActualText(1, 5, "id"); GlyphLine childLine = new GlyphLine(ConstructGlyphListFromString("---Liberte", font)); childLine.SetActualText(3, 10, "Viva"); containerLine.Add(childLine); - containerLine.end = 16; + containerLine.SetEnd(16); NUnit.Framework.Assert.IsNull(containerLine.actualText[0]); for (int i = 1; i < 5; i++) { - NUnit.Framework.Assert.AreEqual("id", containerLine.actualText[i].value); + NUnit.Framework.Assert.AreEqual("id", containerLine.actualText[i].GetValue()); } for (int i = 5; i < 9; i++) { NUnit.Framework.Assert.IsNull(containerLine.actualText[i]); } for (int i = 9; i < 16; i++) { - NUnit.Framework.Assert.AreEqual("Viva", containerLine.actualText[i].value); + NUnit.Framework.Assert.AreEqual("Viva", containerLine.actualText[i].GetValue()); } NUnit.Framework.Assert.AreEqual("Fide---Viva", containerLine.ToString()); } [NUnit.Framework.Test] public virtual void TestContentReplacingWithNullActualText() { - byte[] ttf = StreamUtil.InputStreamToArray(FileUtil.GetInputStreamForFile(iText.Test.TestUtil.GetParentProjectDirectory - (NUnit.Framework.TestContext.CurrentContext.TestDirectory) + "/resources/itext/io/font/otf/FreeSans.ttf" - )); - TrueTypeFont font = new TrueTypeFont(ttf); + TrueTypeFont font = InitializeFont(); GlyphLine lineToBeReplaced = new GlyphLine(ConstructGlyphListFromString("Byelorussia", font)); lineToBeReplaced.SetActualText(1, 2, "e"); GlyphLine lineToBeCopied = new GlyphLine(ConstructGlyphListFromString("Belarus", font)); @@ -161,49 +149,219 @@ public virtual void TestContentReplacingWithNullActualText() { public virtual void TestActualTextForSubstitutedGlyphProcessingInSubstituteOneToMany01() { String expectedActualTextForFirstGlyph = "0"; String expectedActualTextForSecondGlyph = "A"; - byte[] ttf = StreamUtil.InputStreamToArray(FileUtil.GetInputStreamForFile(iText.Test.TestUtil.GetParentProjectDirectory - (NUnit.Framework.TestContext.CurrentContext.TestDirectory) + "/resources/itext/io/font/otf/FreeSans.ttf" - )); - TrueTypeFont font = new TrueTypeFont(ttf); + TrueTypeFont font = InitializeFont(); // no actual text for the second glyph is set - it should be created during substitution GlyphLine line = new GlyphLine(ConstructGlyphListFromString("AA", font)); line.SetActualText(0, 1, expectedActualTextForFirstGlyph); - line.idx = 1; + line.SetIdx(1); line.SubstituteOneToMany(font.GetGsubTable(), new int[] { 39, 40 }); NUnit.Framework.Assert.IsNotNull(line.actualText); NUnit.Framework.Assert.AreEqual(3, line.actualText.Count); NUnit.Framework.Assert.AreSame(line.actualText[1], line.actualText[2]); - NUnit.Framework.Assert.AreEqual(expectedActualTextForSecondGlyph, line.actualText[1].value); + NUnit.Framework.Assert.AreEqual(expectedActualTextForSecondGlyph, line.actualText[1].GetValue()); // check that it hasn't been corrupted - NUnit.Framework.Assert.AreEqual(expectedActualTextForFirstGlyph, line.actualText[0].value); + NUnit.Framework.Assert.AreEqual(expectedActualTextForFirstGlyph, line.actualText[0].GetValue()); } [NUnit.Framework.Test] public virtual void TestActualTextForSubstitutedGlyphProcessingInSubstituteOneToMany02() { String expectedActualTextForFirstGlyph = "A"; - byte[] ttf = StreamUtil.InputStreamToArray(FileUtil.GetInputStreamForFile(iText.Test.TestUtil.GetParentProjectDirectory - (NUnit.Framework.TestContext.CurrentContext.TestDirectory) + "/resources/itext/io/font/otf/FreeSans.ttf" - )); - TrueTypeFont font = new TrueTypeFont(ttf); + TrueTypeFont font = InitializeFont(); GlyphLine line = new GlyphLine(ConstructGlyphListFromString("A", font)); line.SetActualText(0, 1, expectedActualTextForFirstGlyph); line.SubstituteOneToMany(font.GetGsubTable(), new int[] { 39, 40 }); NUnit.Framework.Assert.IsNotNull(line.actualText); NUnit.Framework.Assert.AreEqual(2, line.actualText.Count); NUnit.Framework.Assert.AreSame(line.actualText[0], line.actualText[1]); - NUnit.Framework.Assert.AreEqual(expectedActualTextForFirstGlyph, line.actualText[0].value); + NUnit.Framework.Assert.AreEqual(expectedActualTextForFirstGlyph, line.actualText[0].GetValue()); } [NUnit.Framework.Test] public virtual void TestActualTextForSubstitutedGlyphProcessingInSubstituteOneToMany03() { - byte[] ttf = StreamUtil.InputStreamToArray(FileUtil.GetInputStreamForFile(iText.Test.TestUtil.GetParentProjectDirectory - (NUnit.Framework.TestContext.CurrentContext.TestDirectory) + "/resources/itext/io/font/otf/FreeSans.ttf" - )); - TrueTypeFont font = new TrueTypeFont(ttf); + TrueTypeFont font = InitializeFont(); // no actual text is set GlyphLine line = new GlyphLine(ConstructGlyphListFromString("A", font)); line.SubstituteOneToMany(font.GetGsubTable(), new int[] { 39, 40 }); NUnit.Framework.Assert.IsNull(line.actualText); } + + [NUnit.Framework.Test] + public virtual void DefaultConstructorTest() { + GlyphLine glyphLine = new GlyphLine(); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetStart()); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetEnd()); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetIdx()); + } + + [NUnit.Framework.Test] + public virtual void OtherConstructorTest() { + TrueTypeFont font = InitializeFont(); + GlyphLine otherLine = new GlyphLine(ConstructGlyphListFromString("A test otherLine", font)); + GlyphLine glyphLine = new GlyphLine(otherLine); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetStart()); + NUnit.Framework.Assert.AreEqual(16, glyphLine.GetEnd()); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetIdx()); + NUnit.Framework.Assert.AreEqual("A test otherLine", glyphLine.ToString()); + } + + [NUnit.Framework.Test] + public virtual void StartEndConstructorTest() { + TrueTypeFont font = InitializeFont(); + GlyphLine otherLine = new GlyphLine(ConstructGlyphListFromString("A test otherLine", font)); + GlyphLine glyphLine = new GlyphLine(otherLine, 2, 16); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetStart()); + NUnit.Framework.Assert.AreEqual(14, glyphLine.GetEnd()); + NUnit.Framework.Assert.AreEqual(-2, glyphLine.GetIdx()); + NUnit.Framework.Assert.AreEqual("test otherLine", glyphLine.ToString()); + } + + [NUnit.Framework.Test] + public virtual void StartEndAndActualTextTest() { + TrueTypeFont font = InitializeFont(); + GlyphLine glyphLine = new GlyphLine(ConstructGlyphListFromString("XXX otherLine", font)); + glyphLine.SetActualText(0, 3, "txt"); + GlyphLine other = new GlyphLine(glyphLine, 0, 13); + NUnit.Framework.Assert.AreEqual("txt otherLine", other.ToString()); + } + + [NUnit.Framework.Test] + public virtual void CopyGlyphLineTest() { + TrueTypeFont font = InitializeFont(); + GlyphLine glyphLine = new GlyphLine(ConstructGlyphListFromString("A test otherLine", font)); + GlyphLine copyLine = glyphLine.Copy(2, 6); + NUnit.Framework.Assert.AreEqual(0, copyLine.GetStart()); + NUnit.Framework.Assert.AreEqual(4, copyLine.GetEnd()); + NUnit.Framework.Assert.AreEqual(0, copyLine.GetIdx()); + NUnit.Framework.Assert.AreEqual("test", copyLine.ToString()); + } + + [NUnit.Framework.Test] + public virtual void CopyWithActualTextGlyphLineTest() { + TrueTypeFont font = InitializeFont(); + GlyphLine glyphLine = new GlyphLine(ConstructGlyphListFromString("XXX otherLine", font)); + glyphLine.SetActualText(0, 3, "txt"); + GlyphLine copyLine = glyphLine.Copy(0, 3); + NUnit.Framework.Assert.AreEqual(0, copyLine.GetStart()); + NUnit.Framework.Assert.AreEqual(3, copyLine.GetEnd()); + NUnit.Framework.Assert.AreEqual(0, copyLine.GetIdx()); + NUnit.Framework.Assert.AreEqual("txt", copyLine.ToString()); + } + + [NUnit.Framework.Test] + public virtual void AddIndexedGlyphLineTest() { + TrueTypeFont font = InitializeFont(); + GlyphLine glyphLine = new GlyphLine(ConstructGlyphListFromString("A test otherLine", font)); + Glyph glyph = new Glyph(200, 200, 200); + glyphLine.Add(0, glyph); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetStart()); + NUnit.Framework.Assert.AreEqual(16, glyphLine.GetEnd()); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetIdx()); + NUnit.Framework.Assert.AreEqual("ÈA test otherLin", glyphLine.ToString()); + } + + [NUnit.Framework.Test] + public virtual void AddIndexedGlyphLineActualTextTest() { + TrueTypeFont font = InitializeFont(); + GlyphLine glyphLine = new GlyphLine(ConstructGlyphListFromString("XXX otherLine", font)); + glyphLine.SetActualText(0, 3, "txt"); + Glyph glyph = new Glyph(200, 200, 200); + glyphLine.Add(0, glyph); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetStart()); + NUnit.Framework.Assert.AreEqual(13, glyphLine.GetEnd()); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetIdx()); + NUnit.Framework.Assert.AreEqual("Ètxt otherLin", glyphLine.ToString()); + } + + [NUnit.Framework.Test] + public virtual void ReplaceGlyphInLineTest() { + TrueTypeFont font = InitializeFont(); + GlyphLine glyphLine = new GlyphLine(ConstructGlyphListFromString("A test otherLine", font)); + Glyph glyph = new Glyph(200, 200, 200); + glyphLine.Set(0, glyph); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetStart()); + NUnit.Framework.Assert.AreEqual(16, glyphLine.GetEnd()); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetIdx()); + NUnit.Framework.Assert.AreEqual("È test otherLine", glyphLine.ToString()); + } + + [NUnit.Framework.Test] + public virtual void ReplaceGlyphLineNoActualTextTest() { + TrueTypeFont font = InitializeFont(); + GlyphLine glyphLine = new GlyphLine(ConstructGlyphListFromString("A test otherLine", font)); + GlyphLine replaceLine = new GlyphLine(ConstructGlyphListFromString("different text", font)); + replaceLine.SetActualText(0, 14, "different text"); + glyphLine.ReplaceContent(replaceLine); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetStart()); + NUnit.Framework.Assert.AreEqual(14, glyphLine.GetEnd()); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetIdx()); + NUnit.Framework.Assert.AreEqual("different text", glyphLine.ToString()); + } + + [NUnit.Framework.Test] + public virtual void ReplaceGlyphLineWithActualTextTest() { + TrueTypeFont font = InitializeFont(); + GlyphLine glyphLine = new GlyphLine(ConstructGlyphListFromString("A test otherLine", font)); + glyphLine.SetActualText(0, 14, "A test otherLine"); + GlyphLine replaceLine = new GlyphLine(ConstructGlyphListFromString("different text", font)); + replaceLine.SetActualText(0, 14, "different text"); + glyphLine.ReplaceContent(replaceLine); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetStart()); + NUnit.Framework.Assert.AreEqual(14, glyphLine.GetEnd()); + NUnit.Framework.Assert.AreEqual(0, glyphLine.GetIdx()); + NUnit.Framework.Assert.AreEqual("different text", glyphLine.ToString()); + } + + [NUnit.Framework.Test] + public virtual void NullEqualsTest() { + TrueTypeFont font = InitializeFont(); + GlyphLine glyphLine = new GlyphLine(ConstructGlyphListFromString("A test otherLine", font)); + bool equals = glyphLine.Equals(null); + NUnit.Framework.Assert.IsFalse(equals); + } + + [NUnit.Framework.Test] + public virtual void EqualsItselfTest() { + TrueTypeFont font = InitializeFont(); + GlyphLine glyphLine = new GlyphLine(ConstructGlyphListFromString("A test otherLine", font)); + bool equals = glyphLine.Equals(glyphLine); + NUnit.Framework.Assert.IsTrue(equals); + } + + [NUnit.Framework.Test] + public virtual void EqualGlyphLinesTest() { + TrueTypeFont font = InitializeFont(); + GlyphLine first = new GlyphLine(ConstructGlyphListFromString("A test otherLine", font)); + first.SetActualText(0, 14, "A test otherLine"); + GlyphLine second = new GlyphLine(ConstructGlyphListFromString("A test otherLine", font)); + second.SetActualText(0, 14, "A test otherLine"); + bool equals = first.Equals(second); + NUnit.Framework.Assert.IsTrue(equals); + } + + [NUnit.Framework.Test] + public virtual void DiffStartEndEqualsTest() { + TrueTypeFont font = InitializeFont(); + GlyphLine first = new GlyphLine(ConstructGlyphListFromString("A test otherLine", font)); + GlyphLine second = new GlyphLine(ConstructGlyphListFromString("A test otherLine", font)); + second.SetEnd(3); + second.SetStart(1); + bool equals = first.Equals(second); + NUnit.Framework.Assert.IsFalse(equals); + } + + [NUnit.Framework.Test] + public virtual void DiffActualTextEqualsTest() { + TrueTypeFont font = InitializeFont(); + GlyphLine first = new GlyphLine(ConstructGlyphListFromString("A test otherLine", font)); + first.SetActualText(0, 3, "txt"); + GlyphLine second = new GlyphLine(ConstructGlyphListFromString("A test otherLine", font)); + bool equals = first.Equals(second); + NUnit.Framework.Assert.IsFalse(equals); + } + + private TrueTypeFont InitializeFont() { + byte[] ttf = StreamUtil.InputStreamToArray(FileUtil.GetInputStreamForFile(FREESANS_FONT_PATH)); + return new TrueTypeFont(ttf); + } } } diff --git a/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType1Test.cs b/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType1Test.cs index 6f9f48bc91..cc9835a795 100644 --- a/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType1Test.cs +++ b/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType1Test.cs @@ -41,7 +41,7 @@ public virtual void VerifyXAdvanceIsAppliedSubFormat1() { IList glyphs = JavaUtil.ArraysAsList(new Glyph(fontProgram.GetGlyphByCode(174)), new Glyph(fontProgram .GetGlyphByCode(5))); GlyphLine gl = new GlyphLine(glyphs); - gl.idx = 0; + gl.SetIdx(0); NUnit.Framework.Assert.AreEqual(0, gl.Get(0).GetXAdvance()); NUnit.Framework.Assert.IsTrue(lookup.TransformOne(gl)); NUnit.Framework.Assert.AreEqual(219, gl.Get(0).GetXAdvance()); @@ -56,7 +56,7 @@ public virtual void VerifyPositionIsNotAppliedForIrrelevantGlyphSubFormat1() { IList glyphs = JavaUtil.ArraysAsList(new Glyph(fontProgram.GetGlyphByCode(5)), new Glyph(fontProgram .GetGlyphByCode(174))); GlyphLine gl = new GlyphLine(glyphs); - gl.idx = 0; + gl.SetIdx(0); NUnit.Framework.Assert.AreEqual(0, gl.Get(0).GetXAdvance()); NUnit.Framework.Assert.IsFalse(lookup.TransformOne(gl)); NUnit.Framework.Assert.AreEqual(0, gl.Get(0).GetXAdvance()); diff --git a/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType2Test.cs b/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType2Test.cs new file mode 100644 index 0000000000..63b1c55584 --- /dev/null +++ b/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType2Test.cs @@ -0,0 +1,63 @@ +/* +This file is part of the iText (R) project. +Copyright (c) 1998-2024 Apryse Group NV +Authors: Apryse Software. + +This program is offered under a commercial and under the AGPL license. +For commercial licensing, contact us at https://itextpdf.com/sales. For AGPL licensing, see below. + +AGPL licensing: +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +using System; +using System.Collections.Generic; +using iText.Commons.Utils; +using iText.IO.Font; +using iText.Test; + +namespace iText.IO.Font.Otf { + [NUnit.Framework.Category("IntegrationTest")] + public class GposLookupType2Test : ExtendedITextTest { + private static readonly String RESOURCE_FOLDER = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext + .CurrentContext.TestDirectory) + "/resources/itext/io/font/otf/GposLookupType2Test/"; + + private static readonly String DEJAVU_FONT_PATH = RESOURCE_FOLDER + "DejaVuSans.ttf"; + + [NUnit.Framework.Test] + public virtual void IdxEqualToEndLineGpos2Test() { + TrueTypeFont font = new TrueTypeFont(DEJAVU_FONT_PATH); + GlyphPositioningTableReader gposTableReader = font.GetGposTable(); + GposLookupType2 lookup = (GposLookupType2)gposTableReader.GetLookupTable(15); + IList glyphs = JavaUtil.ArraysAsList(new Glyph(font.GetGlyphByCode(174)), new Glyph(font.GetGlyphByCode + (5))); + GlyphLine gl = new GlyphLine(glyphs); + gl.SetIdx(2); + bool transform = lookup.TransformOne(gl); + NUnit.Framework.Assert.IsFalse(transform); + } + + [NUnit.Framework.Test] + public virtual void IdxSmallerThanEndLineGpos2Test() { + TrueTypeFont font = new TrueTypeFont(DEJAVU_FONT_PATH); + GlyphPositioningTableReader gposTableReader = font.GetGposTable(); + GposLookupType2 lookup = (GposLookupType2)gposTableReader.GetLookupTable(15); + IList glyphs = JavaUtil.ArraysAsList(new Glyph(font.GetGlyphByCode(174)), new Glyph(font.GetGlyphByCode + (5))); + GlyphLine gl = new GlyphLine(glyphs); + gl.SetIdx(0); + bool transform = lookup.TransformOne(gl); + NUnit.Framework.Assert.IsFalse(transform); + } + } +} diff --git a/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType4Test.cs b/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType4Test.cs index 05051cb972..d42cdbbda2 100644 --- a/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType4Test.cs +++ b/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType4Test.cs @@ -41,7 +41,7 @@ public virtual void VerifyMarkToBaseAttachment() { IList glyphs = JavaUtil.ArraysAsList(new Glyph(fontProgram.GetGlyphByCode(163)), new Glyph(fontProgram .GetGlyphByCode(207)), new Glyph(fontProgram.GetGlyphByCode(213))); GlyphLine gl = new GlyphLine(glyphs); - gl.idx = 2; + gl.SetIdx(2); NUnit.Framework.Assert.AreEqual(0, gl.Get(2).GetXPlacement()); NUnit.Framework.Assert.AreEqual(0, gl.Get(2).GetAnchorDelta()); lookup.TransformOne(gl); diff --git a/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType5Test.cs b/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType5Test.cs index 2e57c3d250..d54e897d1e 100644 --- a/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType5Test.cs +++ b/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType5Test.cs @@ -40,7 +40,7 @@ public virtual void VerifyMarkToBaseAttachment() { IList glyphs = JavaUtil.ArraysAsList(new Glyph(fontProgram.GetGlyphByCode(445)), new Glyph(fontProgram .GetGlyphByCode(394))); GlyphLine gl = new GlyphLine(glyphs); - gl.idx = 1; + gl.SetIdx(1); lookup.TransformOne(gl); NUnit.Framework.Assert.AreEqual(2, gl.Size()); NUnit.Framework.Assert.AreEqual(445, gl.Get(0).GetCode()); @@ -60,7 +60,7 @@ public virtual void TestSelectingCorrectAttachmentAlternative() { (75))); GlyphPositioningTableReader gposTableReader = fontProgram.GetGposTable(); GposLookupType5 lookup = (GposLookupType5)gposTableReader.GetLookupTable(3); - glyphLine.idx = 1; + glyphLine.SetIdx(1); lookup.TransformOne(glyphLine); NUnit.Framework.Assert.AreEqual(2, glyphLine.Size()); NUnit.Framework.Assert.AreEqual(513, glyphLine.Get(0).GetCode()); @@ -77,7 +77,7 @@ public virtual void TestThatNoTransformationsAppliedForNonRelevantGlyphs() { (75))); GlyphPositioningTableReader gposTableReader = fontProgram.GetGposTable(); GposLookupType5 lookup = (GposLookupType5)gposTableReader.GetLookupTable(3); - glyphLine.idx = 1; + glyphLine.SetIdx(1); lookup.TransformOne(glyphLine); NUnit.Framework.Assert.AreEqual(2, glyphLine.Size()); NUnit.Framework.Assert.AreEqual(1490, glyphLine.Get(0).GetCode()); @@ -85,5 +85,16 @@ public virtual void TestThatNoTransformationsAppliedForNonRelevantGlyphs() { NUnit.Framework.Assert.AreEqual(0, glyphLine.Get(1).GetAnchorDelta()); NUnit.Framework.Assert.AreEqual(0, glyphLine.Get(1).GetXPlacement()); } + + [NUnit.Framework.Test] + public virtual void IdxBiggerThanLineEndTest() { + TrueTypeFont fontProgram = (TrueTypeFont)FontProgramFactory.CreateFont(RESOURCE_FOLDER + "NotoNaskhArabic-Regular.ttf" + ); + GlyphLine glyphLine = new GlyphLine(JavaCollectionsUtil.SingletonList(fontProgram.GetGlyph(203))); + GlyphPositioningTableReader gposTableReader = fontProgram.GetGposTable(); + GposLookupType5 lookup = (GposLookupType5)gposTableReader.GetLookupTable(3); + glyphLine.SetIdx(10); + NUnit.Framework.Assert.IsFalse(lookup.TransformOne(glyphLine)); + } } } diff --git a/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType6Test.cs b/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType6Test.cs new file mode 100644 index 0000000000..05331d5669 --- /dev/null +++ b/itext.tests/itext.io.tests/itext/io/font/otf/GposLookupType6Test.cs @@ -0,0 +1,63 @@ +/* +This file is part of the iText (R) project. +Copyright (c) 1998-2024 Apryse Group NV +Authors: Apryse Software. + +This program is offered under a commercial and under the AGPL license. +For commercial licensing, contact us at https://itextpdf.com/sales. For AGPL licensing, see below. + +AGPL licensing: +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +using System; +using System.Collections.Generic; +using iText.Commons.Utils; +using iText.IO.Font; +using iText.Test; + +namespace iText.IO.Font.Otf { + [NUnit.Framework.Category("IntegrationTest")] + public class GposLookupType6Test : ExtendedITextTest { + private static readonly String RESOURCE_FOLDER = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext + .CurrentContext.TestDirectory) + "/resources/itext/io/font/otf/"; + + private static readonly String FREE_SANS_FONT_PATH = RESOURCE_FOLDER + "FreeSans.ttf"; + + [NUnit.Framework.Test] + public virtual void IdxEqualToEndLineGpos6Test() { + TrueTypeFont fontProgram = (TrueTypeFont)FontProgramFactory.CreateFont(FREE_SANS_FONT_PATH); + GlyphPositioningTableReader gposTableReader = fontProgram.GetGposTable(); + GposLookupType6 lookup = new GposLookupType6(gposTableReader, 0, new int[0]); + IList glyphs = JavaUtil.ArraysAsList(new Glyph(fontProgram.GetGlyphByCode(445)), new Glyph(fontProgram + .GetGlyphByCode(394))); + GlyphLine gl = new GlyphLine(glyphs); + gl.SetIdx(2); + bool transform = lookup.TransformOne(gl); + NUnit.Framework.Assert.IsFalse(transform); + } + + [NUnit.Framework.Test] + public virtual void IdxSmallerThanEndLineGpos6Test() { + TrueTypeFont font = new TrueTypeFont(FREE_SANS_FONT_PATH); + GlyphPositioningTableReader gposTableReader = font.GetGposTable(); + GposLookupType6 lookup = new GposLookupType6(gposTableReader, 0, new int[0]); + IList glyphs = JavaUtil.ArraysAsList(new Glyph(font.GetGlyphByCode(174)), new Glyph(font.GetGlyphByCode + (5))); + GlyphLine gl = new GlyphLine(glyphs); + gl.SetIdx(0); + bool transform = lookup.TransformOne(gl); + NUnit.Framework.Assert.IsFalse(transform); + } + } +} diff --git a/itext.tests/itext.io.tests/itext/io/font/otf/GsubLookupType4Test.cs b/itext.tests/itext.io.tests/itext/io/font/otf/GsubLookupType4Test.cs index 153a8f1e83..ead2a0a303 100644 --- a/itext.tests/itext.io.tests/itext/io/font/otf/GsubLookupType4Test.cs +++ b/itext.tests/itext.io.tests/itext/io/font/otf/GsubLookupType4Test.cs @@ -40,10 +40,23 @@ public virtual void TestNoIndexOutOfBound() { IList glyphs = JavaUtil.ArraysAsList(new Glyph(1, 1, 1), new Glyph(1, 1, 1), new Glyph(1, 1, 1), new Glyph(1, 1, 1), new Glyph(1, 1, 1), new Glyph(1, 1, 1)); GlyphLine gl = new GlyphLine(glyphs); - gl.idx = gl.end; + gl.SetIdx(gl.GetEnd()); GsubLookupType4 lookup = (GsubLookupType4)gsubTableReader.GetLookupTable(6); //Assert that no exception is thrown if gl.idx = gl.end NUnit.Framework.Assert.IsFalse(lookup.TransformOne(gl)); } + + [NUnit.Framework.Test] + public virtual void NoTransformationTest() { + TrueTypeFont fontProgram = (TrueTypeFont)FontProgramFactory.CreateFont(RESOURCE_FOLDER + "DejaVuSansMono.ttf" + ); + GlyphSubstitutionTableReader gsubTableReader = fontProgram.GetGsubTable(); + IList glyphs = JavaUtil.ArraysAsList(new Glyph(1, 1, 1), new Glyph(1, 1, 1), new Glyph(1, 1, 1), new + Glyph(1, 1, 1), new Glyph(1, 1, 1), new Glyph(1, 1, 1)); + GlyphLine gl = new GlyphLine(glyphs); + gl.SetIdx(3); + GsubLookupType4 lookup = (GsubLookupType4)gsubTableReader.GetLookupTable(6); + NUnit.Framework.Assert.IsFalse(lookup.TransformOne(gl)); + } } } diff --git a/itext.tests/itext.io.tests/itext/io/font/otf/LanguageRecordTest.cs b/itext.tests/itext.io.tests/itext/io/font/otf/LanguageRecordTest.cs new file mode 100644 index 0000000000..a53439260e --- /dev/null +++ b/itext.tests/itext.io.tests/itext/io/font/otf/LanguageRecordTest.cs @@ -0,0 +1,50 @@ +/* +This file is part of the iText (R) project. +Copyright (c) 1998-2024 Apryse Group NV +Authors: Apryse Software. + +This program is offered under a commercial and under the AGPL license. +For commercial licensing, contact us at https://itextpdf.com/sales. For AGPL licensing, see below. + +AGPL licensing: +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +using iText.Test; + +namespace iText.IO.Font.Otf { + [NUnit.Framework.Category("UnitTest")] + public class LanguageRecordTest : ExtendedITextTest { + [NUnit.Framework.Test] + public virtual void FeaturesRequiredTest() { + LanguageRecord languageRecord = new LanguageRecord(); + languageRecord.SetFeatureRequired(1); + NUnit.Framework.Assert.AreEqual(1, languageRecord.GetFeatureRequired()); + } + + [NUnit.Framework.Test] + public virtual void TaggingTest() { + LanguageRecord languageRecord = new LanguageRecord(); + languageRecord.SetTag("tagname"); + NUnit.Framework.Assert.AreEqual("tagname", languageRecord.GetTag()); + } + + [NUnit.Framework.Test] + public virtual void FeaturesTest() { + LanguageRecord languageRecord = new LanguageRecord(); + int[] features = new int[2]; + languageRecord.SetFeatures(features); + NUnit.Framework.Assert.AreEqual(2, languageRecord.GetFeatures().Length); + } + } +} diff --git a/itext.tests/itext.io.tests/itext/io/font/otf/OpenTableLookupTest.cs b/itext.tests/itext.io.tests/itext/io/font/otf/OpenTableLookupTest.cs new file mode 100644 index 0000000000..7a8027cf31 --- /dev/null +++ b/itext.tests/itext.io.tests/itext/io/font/otf/OpenTableLookupTest.cs @@ -0,0 +1,57 @@ +/* +This file is part of the iText (R) project. +Copyright (c) 1998-2024 Apryse Group NV +Authors: Apryse Software. + +This program is offered under a commercial and under the AGPL license. +For commercial licensing, contact us at https://itextpdf.com/sales. For AGPL licensing, see below. + +AGPL licensing: +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +using iText.Commons.Utils; +using iText.Test; + +namespace iText.IO.Font.Otf { + [NUnit.Framework.Category("UnitTest")] + public class OpenTableLookupTest : ExtendedITextTest { + [NUnit.Framework.Test] + public virtual void IdxTest() { + OpenTableLookup.GlyphIndexer glyphIndexer = new OpenTableLookup.GlyphIndexer(); + glyphIndexer.SetIdx(2); + NUnit.Framework.Assert.AreEqual(2, glyphIndexer.GetIdx()); + } + + [NUnit.Framework.Test] + public virtual void GlyphTest() { + Glyph glyph = new Glyph(200, 200, 200); + OpenTableLookup.GlyphIndexer glyphIndexer = new OpenTableLookup.GlyphIndexer(); + glyphIndexer.SetGlyph(glyph); + NUnit.Framework.Assert.AreEqual(200, glyphIndexer.GetGlyph().GetWidth()); + NUnit.Framework.Assert.AreEqual(200, glyphIndexer.GetGlyph().GetCode()); + NUnit.Framework.Assert.AreEqual(200, glyphIndexer.GetGlyph().GetUnicode()); + } + + [NUnit.Framework.Test] + public virtual void GlyphLineTest() { + Glyph glyph = new Glyph(200, 200, 200); + GlyphLine glyphLine = new GlyphLine(JavaCollectionsUtil.SingletonList(glyph)); + OpenTableLookup.GlyphIndexer glyphIndexer = new OpenTableLookup.GlyphIndexer(); + glyphIndexer.SetLine(glyphLine); + NUnit.Framework.Assert.AreEqual(0, glyphIndexer.GetLine().GetIdx()); + NUnit.Framework.Assert.AreEqual(0, glyphIndexer.GetLine().GetStart()); + NUnit.Framework.Assert.AreEqual(1, glyphIndexer.GetLine().GetEnd()); + } + } +} diff --git a/itext.tests/itext.io.tests/itext/io/font/otf/OpenTypeFontTableReaderTest.cs b/itext.tests/itext.io.tests/itext/io/font/otf/OpenTypeFontTableReaderTest.cs index c68e7d2942..af8e0e5142 100644 --- a/itext.tests/itext.io.tests/itext/io/font/otf/OpenTypeFontTableReaderTest.cs +++ b/itext.tests/itext.io.tests/itext/io/font/otf/OpenTypeFontTableReaderTest.cs @@ -21,6 +21,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ using System; +using System.Collections.Generic; using System.Linq; using iText.IO.Font; using iText.Test; @@ -31,18 +32,25 @@ public class OpenTypeFontTableReaderTest : ExtendedITextTest { private static readonly String RESOURCE_FOLDER = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext .CurrentContext.TestDirectory) + "/resources/itext/io/font/otf/OpenTypeFontTableReaderTest/"; + private static readonly String FONTS_FOLDER = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext + .CurrentContext.TestDirectory) + "/resources/itext/io/font/sharedFontsResourceFiles/"; + + private static readonly String CJK_JP_BOLD_PATH = FONTS_FOLDER + "NotoSansCJKjp-Bold.otf"; + + private static readonly String SANS_MYANMAR_REGULAR_PATH = RESOURCE_FOLDER + "NotoSansMyanmar-Regular.ttf"; + [NUnit.Framework.Test] public virtual void TestFetchLangSysByTag() { - TrueTypeFont fontProgram = (TrueTypeFont)FontProgramFactory.CreateFont(RESOURCE_FOLDER + "NotoSansMyanmar-Regular.ttf" - ); + TrueTypeFont fontProgram = (TrueTypeFont)FontProgramFactory.CreateFont(SANS_MYANMAR_REGULAR_PATH); GlyphSubstitutionTableReader gsub = fontProgram.GetGsubTable(); ScriptRecord mym2 = gsub.GetScriptRecords()[0]; - NUnit.Framework.Assert.AreEqual("mym2", mym2.tag); + NUnit.Framework.Assert.AreEqual("mym2", mym2.GetTag()); // default LangSys has no tag - NUnit.Framework.Assert.AreEqual("", gsub.GetLanguageRecord("mym2").tag); + NUnit.Framework.Assert.AreEqual("", gsub.GetLanguageRecord("mym2").GetTag()); NUnit.Framework.Assert.AreEqual(LanguageTags.SGAW_KAREN, gsub.GetLanguageRecord("mym2", LanguageTags.SGAW_KAREN - ).tag); - NUnit.Framework.Assert.AreEqual(LanguageTags.MON, gsub.GetLanguageRecord("mym2", LanguageTags.MON).tag); + ).GetTag()); + NUnit.Framework.Assert.AreEqual(LanguageTags.MON, gsub.GetLanguageRecord("mym2", LanguageTags.MON).GetTag( + )); NUnit.Framework.Assert.IsNull(gsub.GetLanguageRecord(null)); NUnit.Framework.Assert.IsNull(gsub.GetLanguageRecord("mym3")); NUnit.Framework.Assert.IsNull(gsub.GetLanguageRecord("mym3", LanguageTags.SGAW_KAREN)); @@ -50,15 +58,14 @@ public virtual void TestFetchLangSysByTag() { [NUnit.Framework.Test] public virtual void TestGetLookupsArray() { - TrueTypeFont fontProgram = (TrueTypeFont)FontProgramFactory.CreateFont(RESOURCE_FOLDER + "NotoSansMyanmar-Regular.ttf" - ); + TrueTypeFont fontProgram = (TrueTypeFont)FontProgramFactory.CreateFont(SANS_MYANMAR_REGULAR_PATH); GlyphSubstitutionTableReader gsub = fontProgram.GetGsubTable(); FeatureRecord firstRecord = new FeatureRecord(); - firstRecord.lookups = new int[] { 5, 2 }; - firstRecord.tag = "1"; + firstRecord.SetLookups(new int[] { 5, 2 }); + firstRecord.SetTag("1"); FeatureRecord secondRecord = new FeatureRecord(); - secondRecord.lookups = new int[] { 4, 10 }; - secondRecord.tag = "2"; + secondRecord.SetLookups(new int[] { 4, 10 }); + secondRecord.SetTag("2"); FeatureRecord[] records = new FeatureRecord[] { firstRecord, secondRecord }; int[] lookupsLocations = gsub.GetLookups(firstRecord).Select((record) => record.subTableLocations[0]).ToArray (); @@ -68,5 +75,93 @@ public virtual void TestGetLookupsArray() { expected = new int[] { 142436, 142538, 142610, 143908 }; NUnit.Framework.Assert.AreEqual(expected, lookupsLocations); } + + [NUnit.Framework.Test] + public virtual void GetNegativeIdxTest() { + GlyphPositioningTableReader gposTableReader = GetGPosTableReader(SANS_MYANMAR_REGULAR_PATH); + GposLookupType1 lookup = (GposLookupType1)gposTableReader.GetLookupTable(-1); + NUnit.Framework.Assert.IsNull(lookup); + } + + [NUnit.Framework.Test] + public virtual void GetFeatureRecordsTest() { + GlyphPositioningTableReader gposTableReader = GetGPosTableReader(SANS_MYANMAR_REGULAR_PATH); + IList lookup = gposTableReader.GetFeatureRecords(); + NUnit.Framework.Assert.AreEqual(3, lookup.Count); + } + + [NUnit.Framework.Test] + public virtual void GetFeaturesNullTest() { + GlyphPositioningTableReader gposTableReader = GetGPosTableReader(SANS_MYANMAR_REGULAR_PATH); + String[] scripts = new String[0]; + IList lookup = gposTableReader.GetFeatures(scripts, "null"); + NUnit.Framework.Assert.IsNull(lookup); + } + + [NUnit.Framework.Test] + public virtual void GetRequiredFeaturesNullTest() { + GlyphPositioningTableReader gposTableReader = GetGPosTableReader(SANS_MYANMAR_REGULAR_PATH); + String[] scripts = new String[1]; + scripts[0] = "test"; + FeatureRecord requiredFeature = gposTableReader.GetRequiredFeature(scripts, "null"); + NUnit.Framework.Assert.IsNull(requiredFeature); + } + + [NUnit.Framework.Test] + public virtual void DefaultLangTest() { + GlyphPositioningTableReader gposTableReader = GetGPosTableReader(CJK_JP_BOLD_PATH); + String[] scripts = new String[7]; + scripts[0] = "DFLT"; + IList featureRecords = gposTableReader.GetFeatures(scripts, ""); + NUnit.Framework.Assert.AreEqual(8, featureRecords.Count); + } + + [NUnit.Framework.Test] + public virtual void NullStringArrayScriptsTest() { + GlyphPositioningTableReader gposTableReader = GetGPosTableReader(CJK_JP_BOLD_PATH); + String[] scripts = new String[7]; + IList featureRecords = gposTableReader.GetFeatures(scripts, ""); + NUnit.Framework.Assert.AreEqual(8, featureRecords.Count); + } + + [NUnit.Framework.Test] + public virtual void NonDefTest() { + GlyphPositioningTableReader gposTableReader = GetGPosTableReader(SANS_MYANMAR_REGULAR_PATH); + String[] scripts = new String[7]; + scripts[2] = "DFLT"; + IList featureRecords = gposTableReader.GetFeatures(scripts, ""); + NUnit.Framework.Assert.AreEqual(3, featureRecords.Count); + } + + [NUnit.Framework.Test] + public virtual void TestFetchLangSysByTag2() { + TrueTypeFont fontProgram = (TrueTypeFont)FontProgramFactory.CreateFont(SANS_MYANMAR_REGULAR_PATH); + GlyphSubstitutionTableReader gsub = fontProgram.GetGsubTable(); + NUnit.Framework.Assert.IsNull(gsub.GetLanguageRecord("mym2", LanguageTags.ARABIC)); + } + + [NUnit.Framework.Test] + public virtual void SpecificEqualsNullTest() { + GlyphPositioningTableReader gPosTableReader = GetGPosTableReader(CJK_JP_BOLD_PATH); + IList test = new List(); + test.Add(new FeatureRecord()); + IList specificFeatures = gPosTableReader.GetSpecificFeatures(test, null); + NUnit.Framework.Assert.AreEqual(test, specificFeatures); + } + + [NUnit.Framework.Test] + public virtual void SpecificFeaturesTest() { + GlyphPositioningTableReader gPosTableReader = GetGPosTableReader(CJK_JP_BOLD_PATH); + String[] specific = new String[1]; + IList test = new List(); + test.Add(new FeatureRecord()); + IList specificFeatures = gPosTableReader.GetSpecificFeatures(test, specific); + NUnit.Framework.Assert.AreEqual(test, specificFeatures); + } + + private GlyphPositioningTableReader GetGPosTableReader(String fontPath) { + TrueTypeFont fontProgram = (TrueTypeFont)FontProgramFactory.CreateFont(fontPath); + return fontProgram.GetGposTable(); + } } } diff --git a/itext.tests/itext.io.tests/itext/io/font/otf/OtfReadCommonTest.cs b/itext.tests/itext.io.tests/itext/io/font/otf/OtfReadCommonTest.cs index a924fc698d..eafc761d67 100644 --- a/itext.tests/itext.io.tests/itext/io/font/otf/OtfReadCommonTest.cs +++ b/itext.tests/itext.io.tests/itext/io/font/otf/OtfReadCommonTest.cs @@ -71,10 +71,10 @@ public virtual void TestConversionGlyphToTextSpace() { (this, new OtfReadCommonTest.RandomAccesArrayTest(this, null), 0, null, null, 1); // at 15 we fill up all values GposValueRecord valueRecord = OtfReadCommon.ReadGposValueRecord(gposTableReader, 15); - NUnit.Framework.Assert.AreEqual(2000, valueRecord.XAdvance); - NUnit.Framework.Assert.AreEqual(2000, valueRecord.XPlacement); - NUnit.Framework.Assert.AreEqual(2000, valueRecord.YAdvance); - NUnit.Framework.Assert.AreEqual(2000, valueRecord.YPlacement); + NUnit.Framework.Assert.AreEqual(2000, valueRecord.GetXAdvance()); + NUnit.Framework.Assert.AreEqual(2000, valueRecord.GetXPlacement()); + NUnit.Framework.Assert.AreEqual(2000, valueRecord.GetYAdvance()); + NUnit.Framework.Assert.AreEqual(2000, valueRecord.GetYPlacement()); } //\cond DO_NOT_DOCUMENT diff --git a/itext.tests/itext.io.tests/resources/itext/io/font/otf/GposLookupType2Test/BitstreamCopyright.txt b/itext.tests/itext.io.tests/resources/itext/io/font/otf/GposLookupType2Test/BitstreamCopyright.txt new file mode 100644 index 0000000000..ce8e3a19b1 --- /dev/null +++ b/itext.tests/itext.io.tests/resources/itext/io/font/otf/GposLookupType2Test/BitstreamCopyright.txt @@ -0,0 +1,15 @@ +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: + +The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". + +This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. + +The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. \ No newline at end of file diff --git a/itext.tests/itext.io.tests/resources/itext/io/font/otf/GposLookupType2Test/DejaVuSans.ttf b/itext.tests/itext.io.tests/resources/itext/io/font/otf/GposLookupType2Test/DejaVuSans.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e5f7eecce43be41ff0703ed99e1553029b849f14 GIT binary patch literal 757076 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

fI);V1&`p^P@z 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%0Dm&v@4taQGLT-zh3S`AeK1 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,GZiO*k^1+ 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


*Toc{%?n7Na{@W#kyM+}-t@ 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�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 diff --git a/itext.tests/itext.layout.tests/itext/layout/renderer/WordWrapUnitTest.cs b/itext.tests/itext.layout.tests/itext/layout/renderer/WordWrapUnitTest.cs index 7f50e4bd97..e0ec78ea56 100644 --- a/itext.tests/itext.layout.tests/itext/layout/renderer/WordWrapUnitTest.cs +++ b/itext.tests/itext.layout.tests/itext/layout/renderer/WordWrapUnitTest.cs @@ -118,7 +118,7 @@ public virtual void NoNeedToSplitTextRendererOnLineSplit() { TextRenderer textRendererFirst = new TextRenderer(new Text("")); textRendererFirst.SetProperty(Property.FONT, pdfFont); textRendererFirst.SetText(thai.JSubstring(0, 8)); - textRendererFirst.text.start = 3; + textRendererFirst.text.SetStart(3); textRendererFirst.SetSpecialScriptsWordBreakPoints(new List(JavaUtil.ArraysAsList(3, 8))); textRendererFirst.SetParent(document.GetRenderer()); float longestWordLength = textRendererFirst.GetMinMaxWidth().GetMaxWidth(); diff --git a/itext.tests/itext.pdfa.tests/itext/pdfa/checker/PdfA2CheckerTest.cs b/itext.tests/itext.pdfa.tests/itext/pdfa/checker/PdfA2CheckerTest.cs index 9edfce0284..caaf749d3b 100644 --- a/itext.tests/itext.pdfa.tests/itext/pdfa/checker/PdfA2CheckerTest.cs +++ b/itext.tests/itext.pdfa.tests/itext/pdfa/checker/PdfA2CheckerTest.cs @@ -22,6 +22,7 @@ You should have received a copy of the GNU Affero General Public License */ using System; using System.Collections.Generic; +using System.IO; using iText.Commons.Utils; using iText.Kernel.Colors; using iText.Kernel.Pdf; @@ -713,6 +714,56 @@ public virtual void CheckColorSpaceWithDeviceNWithoutColorants() { , e.Message); } + [NUnit.Framework.Test] + public virtual void CheckColorSpaceWithIndexedTest() { + PdfDictionary currentColorSpaces = new PdfDictionary(); + PdfSpecialCs.Indexed indexed = new PdfSpecialCs.Indexed(PdfName.Indexed, 255, new PdfString(iText.Commons.Utils.JavaUtil.GetStringForBytes + ("".GetBytes(System.Text.Encoding.UTF8), System.Text.Encoding.UTF8))); + pdfA2Checker.CheckColorSpace(indexed, null, currentColorSpaces, true, false); + } + + //Nothing to check, no error should be thrown. + [NUnit.Framework.Test] + public virtual void CheckColorSpaceWithUnColoredTilingTest() { + PdfDictionary currentColorSpaces = new PdfDictionary(); + PdfSpecialCs.UncoloredTilingPattern uncoloredTilingCmykCs = new PdfSpecialCs.UncoloredTilingPattern(new PdfDeviceCs.Cmyk + ()); + pdfA2Checker.CheckColorSpace(uncoloredTilingCmykCs, null, currentColorSpaces, true, false); + } + + //Nothing to check, no error should be thrown. + [NUnit.Framework.Test] + public virtual void CheckExtGateTest() { + PdfExtGState egs = new PdfExtGState(); + egs.SetOverprintMode(1); + egs.SetFillOverPrintFlag(true); + egs.SetSoftMask(new PdfDictionary()); + egs.SetStrokeOpacity(0.3f); + PdfDocument dummyDoc = new PdfDocument(new PdfWriter(new MemoryStream())); + PdfCanvas canvas = new PdfCanvas(dummyDoc.AddNewPage()); + canvas.SetExtGState(egs); + CanvasGraphicsState canvasGraphicsState = new CanvasGraphicsState(canvas.GetGraphicsState()); + pdfA2Checker.CheckExtGState(canvasGraphicsState, null); + NUnit.Framework.Assert.AreEqual(0.3f, canvasGraphicsState.GetStrokeOpacity(), 0.00001); + NUnit.Framework.Assert.IsNotNull(canvasGraphicsState.GetSoftMask()); + NUnit.Framework.Assert.IsTrue(canvasGraphicsState.GetSoftMask().IsDictionary()); + NUnit.Framework.Assert.IsTrue(canvasGraphicsState.GetFillOverprint()); + NUnit.Framework.Assert.AreEqual(1, canvasGraphicsState.GetOverprintMode()); + } + + [NUnit.Framework.Test] + public virtual void CheckExtGateOverprintModeTest() { + PdfExtGState egs = new PdfExtGState(); + egs.SetSoftMask(new PdfDictionary()); + egs.SetStrokeOpacity(0.3f); + PdfDocument dummyDoc = new PdfDocument(new PdfWriter(new MemoryStream())); + PdfCanvas canvas = new PdfCanvas(dummyDoc.AddNewPage()); + canvas.SetExtGState(egs); + CanvasGraphicsState canvasGraphicsState = new CanvasGraphicsState(canvas.GetGraphicsState()); + pdfA2Checker.CheckExtGState(canvasGraphicsState, null); + } + + //Nothing to check, no error should be thrown. private static PdfDictionary CreateSignatureDict() { PdfDictionary signatureDict = new PdfDictionary(); PdfDictionary reference = new PdfDictionary(); diff --git a/itext/itext.barcodes/itext/barcodes/BarcodeDataMatrix.cs b/itext/itext.barcodes/itext/barcodes/BarcodeDataMatrix.cs index 589b021387..52047696db 100644 --- a/itext/itext.barcodes/itext/barcodes/BarcodeDataMatrix.cs +++ b/itext/itext.barcodes/itext/barcodes/BarcodeDataMatrix.cs @@ -296,24 +296,24 @@ public virtual int SetCode(byte[] text, int textOffset, int textSize) { ], new int[textSize - extOut], new int[textSize - extOut], new int[textSize - extOut] }; if (height == 0 || width == 0) { last = dmSizes[dmSizes.Length - 1]; - e = GetEncodation(text, textOffset + extOut, textSize - extOut, data, extCount, last.dataSize - extCount, - options, false); + e = GetEncodation(text, textOffset + extOut, textSize - extOut, data, extCount, last.GetDataSize() - extCount + , options, false); if (e < 0) { return DM_ERROR_TEXT_TOO_BIG; } e += extCount; for (k = 0; k < dmSizes.Length; ++k) { - if (dmSizes[k].dataSize >= e) { + if (dmSizes[k].GetDataSize() >= e) { break; } } dm = dmSizes[k]; - height = dm.height; - width = dm.width; + height = dm.GetHeight(); + width = dm.GetWidth(); } else { for (k = 0; k < dmSizes.Length; ++k) { - if (height == dmSizes[k].height && width == dmSizes[k].width) { + if (height == dmSizes[k].GetHeight() && width == dmSizes[k].GetWidth()) { break; } } @@ -321,8 +321,8 @@ public virtual int SetCode(byte[] text, int textOffset, int textSize) { return DM_ERROR_INVALID_SQUARE; } dm = dmSizes[k]; - e = GetEncodation(text, textOffset + extOut, textSize - extOut, data, extCount, dm.dataSize - extCount, options - , true); + e = GetEncodation(text, textOffset + extOut, textSize - extOut, data, extCount, dm.GetDataSize() - extCount + , options, true); if (e < 0) { return DM_ERROR_TEXT_TOO_BIG; } @@ -331,12 +331,12 @@ public virtual int SetCode(byte[] text, int textOffset, int textSize) { if ((options & DM_TEST) != 0) { return DM_NO_ERROR; } - image = new byte[(dm.width + 2 * ws + 7) / 8 * (dm.height + 2 * ws)]; - MakePadding(data, e, dm.dataSize - e); - place = Placement.DoPlacement(dm.height - dm.height / dm.heightSection * 2, dm.width - dm.width / dm.widthSection - * 2); - full = dm.dataSize + (dm.dataSize + 2) / dm.dataBlock * dm.errorBlock; - ReedSolomon.GenerateECC(data, dm.dataSize, dm.dataBlock, dm.errorBlock); + image = new byte[(dm.GetWidth() + 2 * ws + 7) / 8 * (dm.GetHeight() + 2 * ws)]; + MakePadding(data, e, dm.GetDataSize() - e); + place = Placement.DoPlacement(dm.GetHeight() - dm.GetHeight() / dm.GetHeightSection() * 2, dm.GetWidth() - + dm.GetWidth() / dm.GetWidthSection() * 2); + full = dm.GetDataSize() + (dm.GetDataSize() + 2) / dm.GetDataBlock() * dm.GetErrorBlock(); + ReedSolomon.GenerateECC(data, dm.GetDataSize(), dm.GetDataBlock(), dm.GetErrorBlock()); Draw(data, full, dm); return DM_NO_ERROR; } @@ -831,8 +831,8 @@ private int EdifactEncodation(byte[] text, int textOffset, int textLength, byte[ if (!sizeFixed && (symbolIndex == text.Length - 1 || symbolIndex < 0) && textLength % 4 < 3) { dataSize = int.MaxValue; for (int i = 0; i < dmSizes.Length; ++i) { - if (dmSizes[i].dataSize >= dataRequired + textLength % 4) { - dataSize = dmSizes[i].dataSize; + if (dmSizes[i].GetDataSize() >= dataRequired + textLength % 4) { + dataSize = dmSizes[i].GetDataSize(); break; } } @@ -1000,8 +1000,8 @@ private int EdifactEncodation(byte[] text, int textOffset, int textLength, byte[ if (!sizeFixed && (symbolIndex == text.Length - 1 || symbolIndex < 0)) { dataSize = int.MaxValue; for (int i = 0; i < dmSizes.Length; ++i) { - if (dmSizes[i].dataSize >= dataOffset + ptrOut + (3 - pedi / 6)) { - dataSize = dmSizes[i].dataSize; + if (dmSizes[i].GetDataSize() >= dataOffset + ptrOut + (3 - pedi / 6)) { + dataSize = dmSizes[i].GetDataSize(); break; } } @@ -1247,38 +1247,38 @@ private void Draw(byte[] data, int dataSize, DmParams dm) { int xs; int ys; int z; - int xByte = (dm.width + ws * 2 + 7) / 8; + int xByte = (dm.GetWidth() + ws * 2 + 7) / 8; JavaUtil.Fill(image, (byte)0); //alignment patterns //dotted horizontal line - for (i = ws; i < dm.height + ws; i += dm.heightSection) { - for (j = ws; j < dm.width + ws; j += 2) { + for (i = ws; i < dm.GetHeight() + ws; i += dm.GetHeightSection()) { + for (j = ws; j < dm.GetWidth() + ws; j += 2) { SetBit(j, i, xByte); } } //solid horizontal line - for (i = dm.heightSection - 1 + ws; i < dm.height + ws; i += dm.heightSection) { - for (j = ws; j < dm.width + ws; ++j) { + for (i = dm.GetHeightSection() - 1 + ws; i < dm.GetHeight() + ws; i += dm.GetHeightSection()) { + for (j = ws; j < dm.GetWidth() + ws; ++j) { SetBit(j, i, xByte); } } //solid vertical line - for (i = ws; i < dm.width + ws; i += dm.widthSection) { - for (j = ws; j < dm.height + ws; ++j) { + for (i = ws; i < dm.GetWidth() + ws; i += dm.GetWidthSection()) { + for (j = ws; j < dm.GetHeight() + ws; ++j) { SetBit(i, j, xByte); } } //dotted vertical line - for (i = dm.widthSection - 1 + ws; i < dm.width + ws; i += dm.widthSection) { - for (j = 1 + ws; j < dm.height + ws; j += 2) { + for (i = dm.GetWidthSection() - 1 + ws; i < dm.GetWidth() + ws; i += dm.GetWidthSection()) { + for (j = 1 + ws; j < dm.GetHeight() + ws; j += 2) { SetBit(i, j, xByte); } } p = 0; - for (ys = 0; ys < dm.height; ys += dm.heightSection) { - for (y = 1; y < dm.heightSection - 1; ++y) { - for (xs = 0; xs < dm.width; xs += dm.widthSection) { - for (x = 1; x < dm.widthSection - 1; ++x) { + for (ys = 0; ys < dm.GetHeight(); ys += dm.GetHeightSection()) { + for (y = 1; y < dm.GetHeightSection() - 1; ++y) { + for (xs = 0; xs < dm.GetWidth(); xs += dm.GetWidthSection()) { + for (x = 1; x < dm.GetWidthSection() - 1; ++x) { z = place[p++]; if (z == 1 || z > 1 && (data[z / 8 - 1] & 0xff & 128 >> z % 8) != 0) { SetBit(x + xs + ws, y + ys + ws, xByte); diff --git a/itext/itext.barcodes/itext/barcodes/BarcodePDF417.cs b/itext/itext.barcodes/itext/barcodes/BarcodePDF417.cs index f899bdff38..450c945d1b 100644 --- a/itext/itext.barcodes/itext/barcodes/BarcodePDF417.cs +++ b/itext/itext.barcodes/itext/barcodes/BarcodePDF417.cs @@ -1085,7 +1085,7 @@ protected internal virtual bool CheckSegmentType(BarcodePDF417.Segment segment, if (segment == null) { return false; } - return segment.type == type; + return segment.GetType() == type; } /// Calculates the length of the given segment @@ -1095,7 +1095,7 @@ protected internal virtual int GetSegmentLength(BarcodePDF417.Segment segment) { if (segment == null) { return 0; } - return segment.end - segment.start; + return segment.GetEnd() - segment.GetStart(); } /// Compacts the code words. @@ -1142,24 +1142,24 @@ protected internal virtual void Assemble() { cwPtr = 1; for (k = 0; k < segmentList.Size(); ++k) { BarcodePDF417.Segment v = segmentList.Get(k); - switch (v.type) { + switch (v.GetType()) { case 'T': { if (k != 0) { codewords[cwPtr++] = TEXT_MODE; } - TextCompaction(v.start, GetSegmentLength(v)); + TextCompaction(v.GetStart(), GetSegmentLength(v)); break; } case 'N': { codewords[cwPtr++] = NUMERIC_MODE; - NumberCompaction(v.start, GetSegmentLength(v)); + NumberCompaction(v.GetStart(), GetSegmentLength(v)); break; } case 'B': { codewords[cwPtr++] = GetSegmentLength(v) % 6 != 0 ? BYTE_MODE : BYTE_MODE_6; - ByteCompaction(v.start, GetSegmentLength(v)); + ByteCompaction(v.GetStart(), GetSegmentLength(v)); break; } } @@ -1195,13 +1195,13 @@ protected internal virtual void DumpList() { int len = GetSegmentLength(v); char[] c = new char[len]; for (int j = 0; j < len; ++j) { - c[j] = (char)(code[v.start + j] & 0xff); + c[j] = (char)(code[v.GetStart() + j] & 0xff); if (c[j] == '\r') { c[j] = '\n'; } } StringBuilder sb = new StringBuilder(); - sb.Append(v.type); + sb.Append(v.GetType()); sb.Append(c); System.Console.Out.WriteLine(sb.ToString()); } @@ -1324,7 +1324,7 @@ internal virtual void BreakString() { if (CheckSegmentType(v, 'B') && GetSegmentLength(v) == 1) { if (CheckSegmentType(vp, 'T') && CheckSegmentType(vn, 'T') && GetSegmentLength(vp) + GetSegmentLength(vn) >= 3) { - vp.end = vn.end; + vp.SetEnd(vn.GetEnd()); segmentList.Remove(k); segmentList.Remove(k); k = -1; @@ -1341,13 +1341,13 @@ internal virtual void BreakString() { bool redo = false; if (CheckSegmentType(vp, 'B') && GetSegmentLength(vp) == 1 || CheckSegmentType(vp, 'T')) { redo = true; - v.start = vp.start; + v.SetStart(vp.GetStart()); segmentList.Remove(k - 1); --k; } if (CheckSegmentType(vn, 'B') && GetSegmentLength(vn) == 1 || CheckSegmentType(vn, 'T')) { redo = true; - v.end = vn.end; + v.SetEnd(vn.GetEnd()); segmentList.Remove(k + 1); } if (redo) { @@ -1365,13 +1365,13 @@ internal virtual void BreakString() { bool redo = false; if (CheckSegmentType(vp, 'T') && GetSegmentLength(vp) < 5 || CheckSegmentType(vp, 'B')) { redo = true; - v.start = vp.start; + v.SetStart(vp.GetStart()); segmentList.Remove(k - 1); --k; } if (CheckSegmentType(vn, 'T') && GetSegmentLength(vn) < 5 || CheckSegmentType(vn, 'B')) { redo = true; - v.end = vn.end; + v.SetEnd(vn.GetEnd()); segmentList.Remove(k + 1); } if (redo) { @@ -1381,15 +1381,15 @@ internal virtual void BreakString() { } } // check if all numbers - if (segmentList.Size() == 1 && (v = segmentList.Get(0)).type == 'T' && GetSegmentLength(v) >= 8) { - for (k = v.start; k < v.end; ++k) { + if (segmentList.Size() == 1 && (v = segmentList.Get(0)).GetType() == 'T' && GetSegmentLength(v) >= 8) { + for (k = v.GetStart(); k < v.GetEnd(); ++k) { c = (char)(code[k] & 0xff); if (c < '0' || c > '9') { break; } } - if (k == v.end) { - v.type = 'N'; + if (k == v.GetEnd()) { + v.SetType('N'); } } } @@ -1655,11 +1655,11 @@ private void TextCompaction(byte[] input, int start, int length) { /// A container that encapsulates all data needed for a segment. protected internal class Segment { - public char type; + private char type; - public int start; + private int start; - public int end; + private int end; /// /// Creates a new @@ -1674,6 +1674,42 @@ public Segment(char type, int start, int end) { this.start = start; this.end = end; } + + /// Retrieves the type of the segment. + /// segment type + public virtual char GetType() { + return type; + } + + /// Sets the type of the segment. + /// segment type + public virtual void SetType(char type) { + this.type = type; + } + + /// Retrieves the start of the segment. + /// segment start + public virtual int GetStart() { + return start; + } + + /// Sets the start of the segment. + /// segment start + public virtual void SetStart(int start) { + this.start = start; + } + + /// Retrieves the end of the segment. + /// segment end + public virtual int GetEnd() { + return end; + } + + /// Sets the end of the segment. + /// segment end + public virtual void SetEnd(int end) { + this.end = end; + } } /// An utility class that encapsulates a list of segments. diff --git a/itext/itext.barcodes/itext/barcodes/BarcodePostnet.cs b/itext/itext.barcodes/itext/barcodes/BarcodePostnet.cs index c4534b6c9d..e0633cb790 100644 --- a/itext/itext.barcodes/itext/barcodes/BarcodePostnet.cs +++ b/itext/itext.barcodes/itext/barcodes/BarcodePostnet.cs @@ -37,9 +37,9 @@ namespace iText.Barcodes { /// point is added, usually being the last two digits of the address or PO box number. /// public class BarcodePostnet : Barcode1D { - public static int TYPE_POSTNET = 1; + public const int TYPE_POSTNET = 1; - public static int TYPE_PLANET = 2; + public const int TYPE_PLANET = 2; /// The bars for each character. private static readonly byte[][] BARS = new byte[][] { new byte[] { 1, 1, 0, 0, 0 }, new byte[] { 0, 0, 0, diff --git a/itext/itext.barcodes/itext/barcodes/dmcode/DmParams.cs b/itext/itext.barcodes/itext/barcodes/dmcode/DmParams.cs index d2b142b067..6b39bfb555 100644 --- a/itext/itext.barcodes/itext/barcodes/dmcode/DmParams.cs +++ b/itext/itext.barcodes/itext/barcodes/dmcode/DmParams.cs @@ -46,18 +46,60 @@ public DmParams(int height, int width, int heightSection, int widthSection, int this.errorBlock = errorBlock; } - public int height; + private readonly int height; - public int width; + private readonly int width; - public int heightSection; + private readonly int heightSection; - public int widthSection; + private readonly int widthSection; - public int dataSize; + private readonly int dataSize; - public int dataBlock; + private readonly int dataBlock; - public int errorBlock; + private readonly int errorBlock; + + /// Retrieves the height of DmParams object. + /// total height value + public virtual int GetHeight() { + return height; + } + + /// Retrieves the width of DmParams object. + /// total width value + public virtual int GetWidth() { + return width; + } + + /// Retrieves the height of a single section. + /// total height value + public virtual int GetHeightSection() { + return heightSection; + } + + /// Retrieves the width of a single section. + /// total width value + public virtual int GetWidthSection() { + return widthSection; + } + + /// Retrieves the size of the data. + /// data size value + public virtual int GetDataSize() { + return dataSize; + } + + /// Retrieves the size of the data block. + /// data block size value + public virtual int GetDataBlock() { + return dataBlock; + } + + /// Retrieves the size of the error block. + /// error block size value + public virtual int GetErrorBlock() { + return errorBlock; + } } } diff --git a/itext/itext.io/itext/io/codec/Jbig2SegmentReader.cs b/itext/itext.io/itext/io/codec/Jbig2SegmentReader.cs index 16d04dd9ce..555cc747c8 100644 --- a/itext/itext.io/itext/io/codec/Jbig2SegmentReader.cs +++ b/itext/itext.io/itext/io/codec/Jbig2SegmentReader.cs @@ -128,29 +128,29 @@ public class Jbig2SegmentReader { /// Inner class that holds information about a JBIG2 segment. public class Jbig2Segment : IComparable { - public readonly int segmentNumber; + private readonly int segmentNumber; - public long dataLength = -1; + private long dataLength = -1; - public int page = -1; + private int page = -1; - public int[] referredToSegmentNumbers = null; + private int[] referredToSegmentNumbers = null; - public bool[] segmentRetentionFlags = null; + private bool[] segmentRetentionFlags = null; - public int type = -1; + private int type = -1; - public bool deferredNonRetain = false; + private bool deferredNonRetain = false; - public int countOfReferredToSegments = -1; + private int countOfReferredToSegments = -1; - public byte[] data = null; + private byte[] data = null; - public byte[] headerData = null; + private byte[] headerData = null; - public bool page_association_size = false; + private bool pageAssociationSize = false; - public int page_association_offset = -1; + private int pageAssociationOffset = -1; public Jbig2Segment(int segment_number) { this.segmentNumber = segment_number; @@ -159,26 +159,198 @@ public Jbig2Segment(int segment_number) { public virtual int CompareTo(Jbig2SegmentReader.Jbig2Segment s) { return this.segmentNumber - s.segmentNumber; } + + /// Retrieves the data length of a JBig2Segment object. + /// data length value + public virtual long GetDataLength() { + return dataLength; + } + + /// Sets the data length of a JBig2Segment object. + /// data length value + public virtual void SetDataLength(long dataLength) { + this.dataLength = dataLength; + } + + /// Retrieves the page number of a JBig2Segment object. + /// page number + public virtual int GetPage() { + return page; + } + + /// Sets the page number of a JBig2Segment object. + /// page number + public virtual void SetPage(int page) { + this.page = page; + } + + /// Retrieves the referred-to segment numbers of a JBig2Segment object. + /// Every referred-to segment number + public virtual int[] GetReferredToSegmentNumbers() { + return referredToSegmentNumbers; + } + + /// Sets the referred-to segment numbers of a JBig2Segment object. + /// Referred-to segment numbers + public virtual void SetReferredToSegmentNumbers(int[] referredToSegmentNumbers) { + this.referredToSegmentNumbers = referredToSegmentNumbers; + } + + /// Retrieves segment retention flags of a JBig2Segment object. + /// Every segment retention flag value + public virtual bool[] GetSegmentRetentionFlags() { + return segmentRetentionFlags; + } + + /// Sets segment retention flags of a JBig2Segment object. + /// Segment retention flag values + public virtual void SetSegmentRetentionFlags(bool[] segmentRetentionFlags) { + this.segmentRetentionFlags = segmentRetentionFlags; + } + + /// Retrieves type of the JBig2Segment object. + /// Type value + public virtual int GetType() { + return type; + } + + /// Sets type of the JBig2Segment object. + /// Type value + public virtual void SetType(int type) { + this.type = type; + } + + /// Retrieves whether the object is deferred without retention. + /// + /// Retrieves whether the object is deferred without retention. + /// Default value is false. + /// + /// true if deferred without retention, false otherwise + public virtual bool IsDeferredNonRetain() { + return deferredNonRetain; + } + + /// Sets whether the JBig2Segments object is deferred without retention. + /// true for deferred without retention, false otherwise + public virtual void SetDeferredNonRetain(bool deferredNonRetain) { + this.deferredNonRetain = deferredNonRetain; + } + + /// Retrieves the count of the referred-to segments. + /// count of referred-to segments + public virtual int GetCountOfReferredToSegments() { + return countOfReferredToSegments; + } + + /// Sets the count of referred-to segments of the JBig2Segment object. + /// count of referred segments + public virtual void SetCountOfReferredToSegments(int countOfReferredToSegments) { + this.countOfReferredToSegments = countOfReferredToSegments; + } + + /// Retrieves data of the JBig2Segment object. + /// data bytes + public virtual byte[] GetData() { + return data; + } + + /// Sets data of the JBig2Segment object. + /// data bytes + public virtual void SetData(byte[] data) { + this.data = data; + } + + /// Retrieves header data of the JBig2Segment object. + /// header data bytes + public virtual byte[] GetHeaderData() { + return headerData; + } + + /// Sets header data of the JBig2Segment object. + /// header date bytes + public virtual void SetHeaderData(byte[] headerData) { + this.headerData = headerData; + } + + /// Retrieves page association size of the JBig2Segment object. + /// page association size value + public virtual bool IsPageAssociationSize() { + return pageAssociationSize; + } + + /// Sets page association size of the JBig2Segment object. + /// page association size + public virtual void SetPageAssociationSize(bool pageAssociationSize) { + this.pageAssociationSize = pageAssociationSize; + } + + /// Retrieves the page association offset of the JBig2Segment object. + /// page association offset value + public virtual int GetPageAssociationOffset() { + return pageAssociationOffset; + } + + /// Sets page association offset of the JBig2Segment object. + /// page association offset + public virtual void SetPageAssociationOffset(int pageAssociationOffset) { + this.pageAssociationOffset = pageAssociationOffset; + } + + /// Retrieves the segment number of the JBig2Segment object. + /// segment number + public virtual int GetSegmentNumber() { + return segmentNumber; + } } /// Inner class that holds information about a JBIG2 page. public class Jbig2Page { - public readonly int page; + private readonly int page; private readonly Jbig2SegmentReader sr; private readonly IDictionary segs = new SortedDictionary(); - public int pageBitmapWidth = -1; + private int pageBitmapWidth = -1; - public int pageBitmapHeight = -1; + private int pageBitmapHeight = -1; public Jbig2Page(int page, Jbig2SegmentReader sr) { this.page = page; this.sr = sr; } + /// Retrieves the page number of the Jbig2Page object. + /// page number + public virtual int GetPage() { + return page; + } + + /// Retrieves page bitmap width of the Jbig2Page object. + /// width of page bitmap + public virtual int GetPageBitmapWidth() { + return pageBitmapWidth; + } + + /// Sets page bitmap width of the JBig2Page object. + /// page bitmap width + public virtual void SetPageBitmapWidth(int pageBitmapWidth) { + this.pageBitmapWidth = pageBitmapWidth; + } + + /// Retrieves page bitmap height of the JBig2Page object. + /// height of the page bitmap + public virtual int GetPageBitmapHeight() { + return pageBitmapHeight; + } + + /// Sets the height of the page bitmap of a Jbig2Page object. + /// height of the page bitmap + public virtual void SetPageBitmapHeight(int pageBitmapHeight) { + this.pageBitmapHeight = pageBitmapHeight; + } + /// /// return as a single byte array the header-data for each segment in segment number /// order, EMBEDDED organization, but I am putting the needed segments in SEQUENTIAL organization. @@ -196,34 +368,34 @@ public virtual byte[] GetData(bool for_embedding) { Jbig2SegmentReader.Jbig2Segment s = segs.Get(sn); // pdf reference 1.4, section 3.3.6 Jbig2Decode Filter // D.3 Embedded organisation - if (for_embedding && (s.type == END_OF_FILE || s.type == END_OF_PAGE)) { + if (for_embedding && (s.GetType() == END_OF_FILE || s.GetType() == END_OF_PAGE)) { continue; } if (for_embedding) { // change the page association to page 1 - byte[] headerData_emb = CopyByteArray(s.headerData); - if (s.page_association_size) { - headerData_emb[s.page_association_offset] = 0x0; - headerData_emb[s.page_association_offset + 1] = 0x0; - headerData_emb[s.page_association_offset + 2] = 0x0; - headerData_emb[s.page_association_offset + 3] = 0x1; + byte[] headerDataEmb = CopyByteArray(s.GetHeaderData()); + if (s.IsPageAssociationSize()) { + headerDataEmb[s.GetPageAssociationOffset()] = 0x0; + headerDataEmb[s.GetPageAssociationOffset() + 1] = 0x0; + headerDataEmb[s.GetPageAssociationOffset() + 2] = 0x0; + headerDataEmb[s.GetPageAssociationOffset() + 3] = 0x1; } else { - headerData_emb[s.page_association_offset] = 0x1; + headerDataEmb[s.GetPageAssociationOffset()] = 0x1; } - os.Write(headerData_emb); + os.Write(headerDataEmb); } else { - os.Write(s.headerData); + os.Write(s.GetHeaderData()); } - os.Write(s.data); + os.Write(s.GetData()); } os.Dispose(); return os.ToArray(); } public virtual void AddSegment(Jbig2SegmentReader.Jbig2Segment s) { - segs.Put(s.segmentNumber, s); + segs.Put(s.GetSegmentNumber(), s); } } @@ -249,7 +421,7 @@ public virtual void Read() { do { Jbig2SegmentReader.Jbig2Segment tmp = ReadHeader(); ReadSegment(tmp); - segments.Put(tmp.segmentNumber, tmp); + segments.Put(tmp.GetSegmentNumber(), tmp); } while (this.ra.GetPosition() < this.ra.Length()); } @@ -258,9 +430,9 @@ public virtual void Read() { Jbig2SegmentReader.Jbig2Segment tmp; do { tmp = ReadHeader(); - segments.Put(tmp.segmentNumber, tmp); + segments.Put(tmp.GetSegmentNumber(), tmp); } - while (tmp.type != END_OF_FILE); + while (tmp.GetType() != END_OF_FILE); foreach (int integer in segments.Keys) { ReadSegment(segments.Get(integer)); } @@ -271,25 +443,25 @@ public virtual void Read() { internal virtual void ReadSegment(Jbig2SegmentReader.Jbig2Segment s) { int ptr = (int)ra.GetPosition(); //TODO DEVSIX-6406 7.2.7 not supported - if (s.dataLength == unchecked((long)(0xffffffffl))) { + if (s.GetDataLength() == unchecked((long)(0xffffffffl))) { return; } - byte[] data = new byte[(int)s.dataLength]; + byte[] data = new byte[(int)s.GetDataLength()]; ra.Read(data); - s.data = data; - if (s.type == PAGE_INFORMATION) { + s.SetData(data); + if (s.GetType() == PAGE_INFORMATION) { int last = (int)ra.GetPosition(); ra.Seek(ptr); int page_bitmap_width = ra.ReadInt(); int page_bitmap_height = ra.ReadInt(); ra.Seek(last); - Jbig2SegmentReader.Jbig2Page p = pages.Get(s.page); + Jbig2SegmentReader.Jbig2Page p = pages.Get(s.GetPage()); if (p == null) { throw new iText.IO.Exceptions.IOException("Referring to widht or height of a page we haven't seen yet: {0}" - ).SetMessageParams(s.page); + ).SetMessageParams(s.GetPage()); } - p.pageBitmapWidth = page_bitmap_width; - p.pageBitmapHeight = page_bitmap_height; + p.SetPageBitmapWidth(page_bitmap_width); + p.SetPageBitmapHeight(page_bitmap_height); } } //\endcond @@ -303,10 +475,10 @@ internal virtual Jbig2SegmentReader.Jbig2Segment ReadHeader() { // 7.2.3 int segment_header_flags = ra.Read(); bool deferred_non_retain = (segment_header_flags & 0x80) == 0x80; - s.deferredNonRetain = deferred_non_retain; + s.SetDeferredNonRetain(deferred_non_retain); bool page_association_size = (segment_header_flags & 0x40) == 0x40; int segment_type = segment_header_flags & 0x3f; - s.type = segment_type; + s.SetType(segment_type); //7.2.4 int referred_to_byte0 = ra.Read(); int count_of_referred_to_segments = (referred_to_byte0 & 0xE0) >> 5; @@ -345,8 +517,8 @@ internal virtual Jbig2SegmentReader.Jbig2Segment ReadHeader() { } } } - s.segmentRetentionFlags = segment_retention_flags; - s.countOfReferredToSegments = count_of_referred_to_segments; + s.SetSegmentRetentionFlags(segment_retention_flags); + s.SetCountOfReferredToSegments(count_of_referred_to_segments); // 7.2.5 referred_to_segment_numbers = new int[count_of_referred_to_segments + 1]; for (int i = 1; i <= count_of_referred_to_segments; i++) { @@ -362,7 +534,7 @@ internal virtual Jbig2SegmentReader.Jbig2Segment ReadHeader() { } } } - s.referredToSegmentNumbers = referred_to_segment_numbers; + s.SetReferredToSegmentNumbers(referred_to_segment_numbers); // 7.2.6 int segment_page_association; int page_association_offset = (int)ra.GetPosition() - ptr; @@ -376,10 +548,10 @@ internal virtual Jbig2SegmentReader.Jbig2Segment ReadHeader() { throw new iText.IO.Exceptions.IOException("Page {0} is invalid for segment {1} starting at {2}").SetMessageParams (segment_page_association, segment_number, ptr); } - s.page = segment_page_association; + s.SetPage(segment_page_association); // so we can change the page association at embedding time. - s.page_association_size = page_association_size; - s.page_association_offset = page_association_offset; + s.SetPageAssociationSize(page_association_size); + s.SetPageAssociationOffset(page_association_offset); if (segment_page_association > 0 && !pages.ContainsKey(segment_page_association)) { pages.Put(segment_page_association, new Jbig2SegmentReader.Jbig2Page(segment_page_association, this)); } @@ -392,12 +564,12 @@ internal virtual Jbig2SegmentReader.Jbig2Segment ReadHeader() { // 7.2.7 long segment_data_length = ra.ReadUnsignedInt(); //TODO DEVSIX-6406 the 0xffffffff value that might be here, and how to understand those afflicted segments - s.dataLength = segment_data_length; + s.SetDataLength(segment_data_length); int end_ptr = (int)ra.GetPosition(); ra.Seek(ptr); byte[] header_data = new byte[end_ptr - ptr]; ra.Read(header_data); - s.headerData = header_data; + s.SetHeaderData(header_data); return s; } //\endcond @@ -431,11 +603,11 @@ public virtual int NumberOfPages() { } public virtual int GetPageHeight(int i) { - return pages.Get(i).pageBitmapHeight; + return pages.Get(i).GetPageBitmapHeight(); } public virtual int GetPageWidth(int i) { - return pages.Get(i).pageBitmapWidth; + return pages.Get(i).GetPageBitmapWidth(); } public virtual Jbig2SegmentReader.Jbig2Page GetPage(int page) { @@ -448,11 +620,11 @@ public virtual byte[] GetGlobal(bool for_embedding) { try { foreach (Object element in globals) { Jbig2SegmentReader.Jbig2Segment s = (Jbig2SegmentReader.Jbig2Segment)element; - if (for_embedding && (s.type == END_OF_FILE || s.type == END_OF_PAGE)) { + if (for_embedding && (s.GetType() == END_OF_FILE || s.GetType() == END_OF_PAGE)) { continue; } - os.Write(s.headerData); - os.Write(s.data); + os.Write(s.GetHeaderData()); + os.Write(s.GetData()); } if (os.Length > 0) { streamBytes = os.ToArray(); diff --git a/itext/itext.io/itext/io/font/CFFFont.cs b/itext/itext.io/itext/io/font/CFFFont.cs index a72de44734..5fe213d724 100644 --- a/itext/itext.io/itext/io/font/CFFFont.cs +++ b/itext/itext.io/itext/io/font/CFFFont.cs @@ -365,7 +365,13 @@ public virtual void Xref() { } protected internal abstract class OffsetItem : CFFFont.Item { - public int value; + private int offset; + + /// Retrieves offset of an OffsetItem object. + /// offset value + public virtual int GetOffset() { + return offset; + } /// Set the value of an offset item that was initially unknown. /// @@ -373,18 +379,18 @@ protected internal abstract class OffsetItem : CFFFont.Item { /// It will be fixed up latex by a call to xref on some marker. /// /// offset to set - public virtual void Set(int offset) { - this.value = offset; + public virtual void SetOffset(int offset) { + this.offset = offset; } } /// A range item. protected internal sealed class RangeItem : CFFFont.Item { - public int offset; + private readonly int offset; - public int length; + private readonly int length; - private RandomAccessFileOrArray buf; + private readonly RandomAccessFileOrArray buf; public RangeItem(RandomAccessFileOrArray buf, int offset, int length) { this.offset = offset; @@ -421,11 +427,11 @@ public override void Emit(byte[] buffer) { /// variable-size representation. /// protected internal sealed class IndexOffsetItem : CFFFont.OffsetItem { - public readonly int size; + private readonly int size; public IndexOffsetItem(int size, int value) { this.size = size; - this.value = value; + this.SetOffset(value); } public IndexOffsetItem(int size) { @@ -440,7 +446,7 @@ public override void Increment(int[] currentOffset) { public override void Emit(byte[] buffer) { if (size >= 1 && size <= 4) { for (int i = 0; i < size; i++) { - buffer[myOffset + i] = (byte)((int)(((uint)value) >> ((size - 1 - i) << 3)) & 0xFF); + buffer[myOffset + i] = (byte)((int)(((uint)base.GetOffset()) >> ((size - 1 - i) << 3)) & 0xFF); } } } @@ -452,9 +458,9 @@ public IndexBaseItem() { } protected internal sealed class IndexMarkerItem : CFFFont.Item { - private CFFFont.OffsetItem offItem; + private readonly CFFFont.OffsetItem offItem; - private CFFFont.IndexBaseItem indexBase; + private readonly CFFFont.IndexBaseItem indexBase; public IndexMarkerItem(CFFFont.OffsetItem offItem, CFFFont.IndexBaseItem indexBase) { this.offItem = offItem; @@ -463,14 +469,14 @@ public IndexMarkerItem(CFFFont.OffsetItem offItem, CFFFont.IndexBaseItem indexBa public override void Xref() { //System.err.println("index marker item, base="+indexBase.myOffset+" my="+this.myOffset); - offItem.Set(this.myOffset - indexBase.myOffset + 1); + offItem.SetOffset(this.myOffset - indexBase.myOffset + 1); } } protected internal sealed class SubrMarkerItem : CFFFont.Item { - private CFFFont.OffsetItem offItem; + private readonly CFFFont.OffsetItem offItem; - private CFFFont.IndexBaseItem indexBase; + private readonly CFFFont.IndexBaseItem indexBase; public SubrMarkerItem(CFFFont.OffsetItem offItem, CFFFont.IndexBaseItem indexBase) { this.offItem = offItem; @@ -479,7 +485,7 @@ public SubrMarkerItem(CFFFont.OffsetItem offItem, CFFFont.IndexBaseItem indexBas public override void Xref() { //System.err.println("index marker item, base="+indexBase.myOffset+" my="+this.myOffset); - offItem.Set(this.myOffset - indexBase.myOffset); + offItem.SetOffset(this.myOffset - indexBase.myOffset); } } @@ -504,17 +510,17 @@ public override void Increment(int[] currentOffset) { public override void Emit(byte[] buffer) { if (size == 5) { buffer[myOffset] = 29; - buffer[myOffset + 1] = (byte)((int)(((uint)value) >> 24) & 0xff); - buffer[myOffset + 2] = (byte)((int)(((uint)value) >> 16) & 0xff); - buffer[myOffset + 3] = (byte)((int)(((uint)value) >> 8) & 0xff); - buffer[myOffset + 4] = (byte)((int)(((uint)value) >> 0) & 0xff); + buffer[myOffset + 1] = (byte)((int)(((uint)base.GetOffset()) >> 24) & 0xff); + buffer[myOffset + 2] = (byte)((int)(((uint)base.GetOffset()) >> 16) & 0xff); + buffer[myOffset + 3] = (byte)((int)(((uint)base.GetOffset()) >> 8) & 0xff); + buffer[myOffset + 4] = (byte)((int)(((uint)base.GetOffset()) >> 0) & 0xff); } } } /// Card24 item. protected internal sealed class UInt24Item : CFFFont.Item { - public int value; + private readonly int value; public UInt24Item(int value) { this.value = value; @@ -535,7 +541,7 @@ public override void Emit(byte[] buffer) { /// Card32 item. protected internal sealed class UInt32Item : CFFFont.Item { - public int value; + private readonly int value; public UInt32Item(int value) { this.value = value; @@ -557,7 +563,7 @@ public override void Emit(byte[] buffer) { /// A SID or Card16 item. protected internal sealed class UInt16Item : CFFFont.Item { - public char value; + private readonly char value; public UInt16Item(char value) { this.value = value; @@ -580,7 +586,7 @@ public override void Emit(byte[] buffer) { /// A Card8 item. protected internal sealed class UInt8Item : CFFFont.Item { - public char value; + private readonly char value; public UInt8Item(char value) { this.value = value; @@ -599,7 +605,7 @@ public override void Emit(byte[] buffer) { } protected internal sealed class StringItem : CFFFont.Item { - public String s; + private readonly String s; public StringItem(String s) { this.s = s; @@ -624,14 +630,26 @@ public override void Emit(byte[] buffer) { /// representation. /// protected internal sealed class DictNumberItem : CFFFont.Item { - public readonly int value; + private readonly int value; - public int size = 5; + private int size = 5; public DictNumberItem(int value) { this.value = value; } + /// Retrieves the size of a DictNumberItem. + /// size value + public int GetSize() { + return size; + } + + /// Sets the size of a DictNumberItem. + /// size value + public void SetSize(int size) { + this.size = size; + } + public override void Increment(int[] currentOffset) { base.Increment(currentOffset); currentOffset[0] += size; @@ -664,7 +682,7 @@ public MarkerItem(CFFFont.OffsetItem pointerToMarker) { } public override void Xref() { - p.Set(this.myOffset); + p.SetOffset(this.myOffset); } } @@ -702,7 +720,7 @@ public virtual byte[] GetCID(String fontName) { //throws java.io.FileNotFoundException int j; for (j = 0; j < fonts.Length; j++) { - if (fontName.Equals(fonts[j].name)) { + if (fontName.Equals(fonts[j].GetName())) { break; } } @@ -719,9 +737,9 @@ public virtual byte[] GetCID(String fontName) { l.AddLast(new CFFFont.RangeItem(buf, 0, hdrSize)); int nglyphs = -1; int nstrings = -1; - if (!fonts[j].isCID) { + if (!fonts[j].IsCID()) { // count the glyphs - Seek(fonts[j].charstringsOffset); + Seek(fonts[j].GetCharstringsOffset()); nglyphs = GetCard16(); Seek(stringIndexOffset); nstrings = GetCard16() + standardStrings.Length; @@ -734,8 +752,8 @@ public virtual byte[] GetCID(String fontName) { l.AddLast(new CFFFont.UInt8Item((char)1)); // first offset l.AddLast(new CFFFont.UInt8Item((char)1)); - l.AddLast(new CFFFont.UInt8Item((char)(1 + fonts[j].name.Length))); - l.AddLast(new CFFFont.StringItem(fonts[j].name)); + l.AddLast(new CFFFont.UInt8Item((char)(1 + fonts[j].GetName().Length))); + l.AddLast(new CFFFont.StringItem(fonts[j].GetName())); // create the topdict Index // count l.AddLast(new CFFFont.UInt16Item((char)1)); @@ -759,7 +777,7 @@ public virtual byte[] GetCID(String fontName) { CFFFont.OffsetItem charstringsRef = new CFFFont.DictOffsetItem(); CFFFont.OffsetItem fdarrayRef = new CFFFont.DictOffsetItem(); CFFFont.OffsetItem fdselectRef = new CFFFont.DictOffsetItem(); - if (!fonts[j].isCID) { + if (!fonts[j].IsCID()) { // create a ROS key l.AddLast(new CFFFont.DictNumberItem(nstrings)); l.AddLast(new CFFFont.DictNumberItem(nstrings + 1)); @@ -804,11 +822,11 @@ public virtual byte[] GetCID(String fontName) { // Copy the string index and append new strings. // We need 3 more strings: Registry, Ordering, and a FontName for one FD. // The total length is at most "Adobe"+"Identity"+63 = 76 - if (fonts[j].isCID) { + if (fonts[j].IsCID()) { l.AddLast(GetEntireIndexRange(stringIndexOffset)); } else { - String fdFontName = fonts[j].name + "-OneRange"; + String fdFontName = fonts[j].GetName() + "-OneRange"; if (fdFontName.Length > 127) { fdFontName = fdFontName.JSubstring(0, 127); } @@ -853,7 +871,7 @@ public virtual byte[] GetCID(String fontName) { // copy the global subroutine index l.AddLast(GetEntireIndexRange(gsubrIndexOffset)); // deal with fdarray, fdselect, and the font descriptors - if (fonts[j].isCID) { + if (fonts[j].IsCID()) { } else { // copy the FDArray, FDSelect, charset @@ -896,7 +914,7 @@ public virtual byte[] GetCID(String fontName) { //l.addLast(new DictNumberItem((standardStrings.length+(stringOffsets.length-1)+2))); //l.addLast(new UInt8Item((char)12)); //l.addLast(new UInt8Item((char)38)); // FontName - l.AddLast(new CFFFont.DictNumberItem(fonts[j].privateLength)); + l.AddLast(new CFFFont.DictNumberItem(fonts[j].GetPrivateLength())); CFFFont.OffsetItem privateRef = new CFFFont.DictOffsetItem(); l.AddLast(privateRef); // Private @@ -907,15 +925,15 @@ public virtual byte[] GetCID(String fontName) { // copy the private dict and the local subroutines. // the length of the private dict seems to NOT include // the local subroutines. - l.AddLast(new CFFFont.RangeItem(buf, fonts[j].privateOffset, fonts[j].privateLength)); - if (fonts[j].privateSubrs >= 0) { + l.AddLast(new CFFFont.RangeItem(buf, fonts[j].GetPrivateOffset(), fonts[j].GetPrivateLength())); + if (fonts[j].GetPrivateSubrs() >= 0) { //System.err.println("has subrs="+fonts[j].privateSubrs+" ,len="+fonts[j].privateLength); - l.AddLast(GetEntireIndexRange(fonts[j].privateSubrs)); + l.AddLast(GetEntireIndexRange(fonts[j].GetPrivateSubrs())); } } // copy the charstring index l.AddLast(new CFFFont.MarkerItem(charstringsRef)); - l.AddLast(GetEntireIndexRange(fonts[j].charstringsOffset)); + l.AddLast(GetEntireIndexRange(fonts[j].GetCharstringsOffset())); // now create the new CFF font int[] currentOffset = new int[1]; currentOffset[0] = 0; @@ -940,8 +958,8 @@ public virtual bool IsCID() { public virtual bool IsCID(String fontName) { int j; for (j = 0; j < fonts.Length; j++) { - if (fontName.Equals(fonts[j].name)) { - return fonts[j].isCID; + if (fontName.Equals(fonts[j].GetName())) { + return fonts[j].IsCID(); } } return false; @@ -950,7 +968,7 @@ public virtual bool IsCID(String fontName) { public virtual bool Exists(String fontName) { int j; for (j = 0; j < fonts.Length; j++) { - if (fontName.Equals(fonts[j].name)) { + if (fontName.Equals(fonts[j].GetName())) { return true; } } @@ -960,7 +978,7 @@ public virtual bool Exists(String fontName) { public virtual String[] GetNames() { String[] names = new String[fonts.Length]; for (int i = 0; i < fonts.Length; i++) { - names[i] = fonts[i].name; + names[i] = fonts[i].GetName(); } return names; } @@ -968,7 +986,7 @@ public virtual String[] GetNames() { /// A random Access File or an array protected internal RandomAccessFileOrArray buf; - private int offSize; + private readonly int offSize; protected internal int nameIndexOffset; @@ -987,70 +1005,430 @@ public virtual String[] GetNames() { protected internal int[] gsubrOffsets; protected internal sealed class Font { - public String name; + private String name; - public String fullName; + private String fullName; - public bool isCID = false; + private bool isCID = false; // only if not CID - public int privateOffset = -1; + private int privateOffset = -1; // only if not CID - public int privateLength = -1; + private int privateLength = -1; - public int privateSubrs = -1; + private int privateSubrs = -1; - public int charstringsOffset = -1; + private int charstringsOffset = -1; - public int encodingOffset = -1; + private int encodingOffset = -1; - public int charsetOffset = -1; + private int charsetOffset = -1; // only if CID - public int fdarrayOffset = -1; + private int fdarrayOffset = -1; // only if CID - public int fdselectOffset = -1; + private int fdselectOffset = -1; - public int[] fdprivateOffsets; + private int[] fdprivateOffsets; - public int[] fdprivateLengths; + private int[] fdprivateLengths; - public int[] fdprivateSubrs; + private int[] fdprivateSubrs; // Added by Oren & Ygal - public int nglyphs; + private int nglyphs; + + private int nstrings; + + private int charsetLength; + + private int[] charstringsOffsets; + + private int[] charset; + + private int[] FDSelect; + + private int FDSelectLength; + + private int FDSelectFormat; + + private int charstringType = 2; + + private int FDArrayCount; + + private int FDArrayOffsize; + + private int[] FDArrayOffsets; + + private int[] privateSubrsOffset; + + private int[][] privateSubrsOffsetsArray; + + private int[] subrsOffsets; + + private int[] gidToCid; + + /// Retrieves the name of the font. + /// font name + public String GetName() { + return this.name; + } + + /// Sets the name of the font. + /// font name + public void SetName(String name) { + this.name = name; + } + + /// Retrieves the full name of the font. + /// full font name + public String GetFullName() { + return this.fullName; + } + + /// Sets the full name of the font. + /// full font name + public void SetFullName(String fullName) { + this.fullName = fullName; + } + + /// Retrieves whether the font is a CID font. + /// true if font is CID font, false otherwise + public bool IsCID() { + return this.isCID; + } + + /// Sets if font is CID font. + /// true if font is CID font, false otherwise + public void SetCID(bool CID) { + this.isCID = CID; + } + + /// Retrieves the private offset of the font. + /// private offset value + public int GetPrivateOffset() { + return this.privateOffset; + } + + /// Sets the private offset of the font. + /// private offset value + public void SetPrivateOffset(int privateOffset) { + this.privateOffset = privateOffset; + } + + /// Retrieves the private length of the font. + /// private length value + public int GetPrivateLength() { + return this.privateLength; + } + + /// Sets the private length of the font. + /// private length value + public void SetPrivateLength(int privateLength) { + this.privateLength = privateLength; + } + + /// Retrieves the private subrs of the font. + /// private subrs value + public int GetPrivateSubrs() { + return this.privateSubrs; + } + + /// Sets the private subrs of the font. + /// private subrs value + public void SetPrivateSubrs(int privateSubrs) { + this.privateSubrs = privateSubrs; + } + + /// Retrieves the char string offset of the font. + /// char string offset + public int GetCharstringsOffset() { + return this.charstringsOffset; + } + + /// Sets the char string offset of the font. + /// char string offset + public void SetCharstringsOffset(int charstringsOffset) { + this.charstringsOffset = charstringsOffset; + } + + /// Retrieves the encoding offset of the font. + /// encoding offset + public int GetEncodingOffset() { + return this.encodingOffset; + } + + /// Sets the encoding offset of the font. + /// encoding offset + public void SetEncodingOffset(int encodingOffset) { + this.encodingOffset = encodingOffset; + } + + /// Retrieves the charset offset of the font. + /// charset offset + public int GetCharsetOffset() { + return this.charsetOffset; + } + + /// Sets the charset offset of the font. + /// charset offset + public void SetCharsetOffset(int charsetOffset) { + this.charsetOffset = charsetOffset; + } + + /// Retrieves the font dictionary array offset of the object. + /// FD array offset + public int GetFdarrayOffset() { + return this.fdarrayOffset; + } - public int nstrings; + /// Sets the font dictionary array offset of the object. + /// FD array offset + public void SetFdarrayOffset(int fdarrayOffset) { + this.fdarrayOffset = fdarrayOffset; + } + + /// Retrieves the font dictionary select offset of the object. + /// FD select offset + public int GetFdselectOffset() { + return this.fdselectOffset; + } + + /// Sets the font dictionary select offset of the object. + /// FD select offset + public void SetFdselectOffset(int fdselectOffset) { + this.fdselectOffset = fdselectOffset; + } + + /// Retrieves the font dictionary private offsets of the object. + /// FD private offsets + public int[] GetFdprivateOffsets() { + return this.fdprivateOffsets; + } + + /// Sets the font dictionary private offsets of the object. + /// FD private offsets + public void SetFdprivateOffsets(int[] fdprivateOffsets) { + this.fdprivateOffsets = fdprivateOffsets; + } + + /// Retrieves the font dictionary private lengths of the object. + /// FD private lengths + public int[] GetFdprivateLengths() { + return this.fdprivateLengths; + } + + /// Sets the font dictionary private lengths of the object. + /// FD private lengths + public void SetFdprivateLengths(int[] fdprivateLengths) { + this.fdprivateLengths = fdprivateLengths; + } + + /// Retrieves the font dictionary private subrs of the object. + /// FD private subrs + public int[] GetFdprivateSubrs() { + return this.fdprivateSubrs; + } + + /// Sets the font dictionary private subrs of the object. + /// FD private subrs + public void SetFdprivateSubrs(int[] fdprivateSubrs) { + this.fdprivateSubrs = fdprivateSubrs; + } - public int CharsetLength; + /// Retrieves the number of glyphs of the font. + /// number of glyphs + public int GetNglyphs() { + return this.nglyphs; + } - public int[] charstringsOffsets; + /// Sets the number of glyphs of the font. + /// number of glyphs + public void SetNglyphs(int nglyphs) { + this.nglyphs = nglyphs; + } - public int[] charset; + /// Retrieves the number of strings of the font. + /// number of strings + public int GetNstrings() { + return this.nstrings; + } - public int[] FDSelect; + /// Sets the number of strings of the font. + /// number of strings + public void SetNstrings(int nstrings) { + this.nstrings = nstrings; + } - public int FDSelectLength; + /// Retrieves the charset length of the font. + /// charset length + public int GetCharsetLength() { + return this.charsetLength; + } - public int FDSelectFormat; + /// Sets the charset length of the font. + /// charset length + public void SetCharsetLength(int charsetLength) { + this.charsetLength = charsetLength; + } - public int CharstringType = 2; + /// Retrieves the char strings offsets of the font. + /// char strings offsets + public int[] GetCharstringsOffsets() { + return this.charstringsOffsets; + } - public int FDArrayCount; + /// Sets the char strings offsets of the font. + /// char strings offsets + public void SetCharstringsOffsets(int[] charstringsOffsets) { + this.charstringsOffsets = charstringsOffsets; + } - public int FDArrayOffsize; + /// Retrieves the charset of the font. + /// charset + public int[] GetCharset() { + return this.charset; + } - public int[] FDArrayOffsets; + /// Sets the charset of the font. + /// charset + public void SetCharset(int[] charset) { + this.charset = charset; + } + + /// Retrieves the font dictionary select of the object. + /// FD select + public int[] GetFDSelect() { + return this.FDSelect; + } + + /// Sets the font dictionary select of the object. + /// FD select + public void SetFDSelect(int[] FDSelect) { + this.FDSelect = FDSelect; + } - public int[] PrivateSubrsOffset; + /// Retrieves the font dictionary select length of the object. + /// FD select length + public int GetFDSelectLength() { + return this.FDSelectLength; + } - public int[][] PrivateSubrsOffsetsArray; + /// Sets the font dictionary select length of the object. + /// FD select length + public void SetFDSelectLength(int FDSelectLength) { + this.FDSelectLength = FDSelectLength; + } - public int[] SubrsOffsets; + /// Retrieves the font dictionary select format of the object. + /// FD select format + public int GetFDSelectFormat() { + return this.FDSelectFormat; + } - public int[] gidToCid; + /// Sets the font dictionary select format of the object. + /// FD select format + public void SetFDSelectFormat(int FDSelectFormat) { + this.FDSelectFormat = FDSelectFormat; + } + + /// Retrieves the char string type of the font. + /// char string type + public int GetCharstringType() { + return this.charstringType; + } + + /// Sets the char string type of the font. + /// char string type + public void SetCharstringType(int charstringType) { + this.charstringType = charstringType; + } + + /// Retrieves the font dictionary array count of the object. + /// FD array count + public int GetFDArrayCount() { + return this.FDArrayCount; + } + + /// Sets the font dictionary array count of the object. + /// FD array count + public void SetFDArrayCount(int FDArrayCount) { + this.FDArrayCount = FDArrayCount; + } + + /// Retrieves the font dictionary array offsize of the object. + /// FD array offsize + public int GetFDArrayOffsize() { + return this.FDArrayOffsize; + } + + /// Sets the font dictionary array offsize of the object. + /// FD array offsize + public void SetFDArrayOffsize(int FDArrayOffsize) { + this.FDArrayOffsize = FDArrayOffsize; + } + + /// Retrieves the font dictionary array offsets of the object. + /// FD array offsets + public int[] GetFDArrayOffsets() { + return this.FDArrayOffsets; + } + + /// Sets the font dictionary array offsets of the object. + /// FD array offsets + public void SetFDArrayOffsets(int[] FDArrayOffsets) { + this.FDArrayOffsets = FDArrayOffsets; + } + + /// Retrieves the private subrs offset of the font. + /// private subrs offset + public int[] GetPrivateSubrsOffset() { + return this.privateSubrsOffset; + } + + /// Set the private subrs offset of the font + /// private subrs offset + public void SetPrivateSubrsOffset(int[] privateSubrsOffset) { + this.privateSubrsOffset = privateSubrsOffset; + } + + /// Retrieves the private subrs offsets array of the font. + /// private subrs offsets array + public int[][] GetPrivateSubrsOffsetsArray() { + return this.privateSubrsOffsetsArray; + } + + /// Sets the private subrs offsets array of the font. + /// private subrs offsets array + public void SetPrivateSubrsOffsetsArray(int[][] privateSubrsOffsetsArray) { + this.privateSubrsOffsetsArray = privateSubrsOffsetsArray; + } + + /// Retrieves the subrs offsets of the font. + /// subrs offsets + public int[] GetSubrsOffsets() { + return this.subrsOffsets; + } + + /// Sets the subrs offsets of the font. + /// subrs offsets + public void SetSubrsOffsets(int[] subrsOffsets) { + this.subrsOffsets = subrsOffsets; + } + + /// Retrieves the glyphs to character id array of the font. + /// glyphs to character id array + public int[] GetGidToCid() { + return this.gidToCid; + } + + /// Sets the glyphs to character id array of the font. + /// glyphs to character id array + public void SetGidToCid(int[] gidToCid) { + this.gidToCid = gidToCid; + } internal Font(CFFFont _enclosing) { this._enclosing = _enclosing; @@ -1101,9 +1479,9 @@ public CFFFont(byte[] cff) { for (int j = 0; j < nameOffsets.Length - 1; j++) { fonts[j] = new CFFFont.Font(this); Seek(nameOffsets[j]); - fonts[j].name = ""; + fonts[j].SetName(""); for (int k = nameOffsets[j]; k < nameOffsets[j + 1]; k++) { - fonts[j].name += GetCard8(); + fonts[j].SetName(fonts[j].GetName() + GetCard8()); } } //System.err.println("name["+j+"]=<"+fonts[j].name+">"); @@ -1129,21 +1507,21 @@ public CFFFont(byte[] cff) { GetDictItem(); if (key == "FullName") { //System.err.println("getting fullname sid = "+((Integer)args[0]).intValue()); - fonts[j].fullName = GetString((char)((int?)args[0]).Value); + fonts[j].SetFullName(GetString((char)((int?)args[0]).Value)); } else { //System.err.println("got it"); if (key == "ROS") { - fonts[j].isCID = true; + fonts[j].SetCID(true); } else { if (key == "Private") { - fonts[j].privateLength = (int)((int?)args[0]).Value; - fonts[j].privateOffset = (int)((int?)args[1]).Value; + fonts[j].SetPrivateLength((int)((int?)args[0]).Value); + fonts[j].SetPrivateOffset((int)((int?)args[1]).Value); } else { if (key == "charset") { - fonts[j].charsetOffset = (int)((int?)args[0]).Value; + fonts[j].SetCharsetOffset((int)((int?)args[0]).Value); } else { // else if (key=="Encoding"){ @@ -1154,24 +1532,24 @@ public CFFFont(byte[] cff) { // } // } if (key == "CharStrings") { - fonts[j].charstringsOffset = (int)((int?)args[0]).Value; + fonts[j].SetCharstringsOffset((int)((int?)args[0]).Value); //System.err.println("charstrings "+fonts[j].charstringsOffset); // Added by Oren & Ygal int p = GetPosition(); - fonts[j].charstringsOffsets = GetIndex(fonts[j].charstringsOffset); + fonts[j].SetCharstringsOffsets(GetIndex(fonts[j].GetCharstringsOffset())); Seek(p); } else { if (key == "FDArray") { - fonts[j].fdarrayOffset = (int)((int?)args[0]).Value; + fonts[j].SetFdarrayOffset((int)((int?)args[0]).Value); } else { if (key == "FDSelect") { - fonts[j].fdselectOffset = (int)((int?)args[0]).Value; + fonts[j].SetFdselectOffset((int)((int?)args[0]).Value); } else { if (key == "CharstringType") { - fonts[j].CharstringType = (int)((int?)args[0]).Value; + fonts[j].SetCharstringType((int)((int?)args[0]).Value); } } } @@ -1182,31 +1560,35 @@ public CFFFont(byte[] cff) { } } // private dict - if (fonts[j].privateOffset >= 0) { + if (fonts[j].GetPrivateOffset() >= 0) { //System.err.println("PRIVATE::"); - Seek(fonts[j].privateOffset); - while (GetPosition() < fonts[j].privateOffset + fonts[j].privateLength) { + Seek(fonts[j].GetPrivateOffset()); + while (GetPosition() < fonts[j].GetPrivateOffset() + fonts[j].GetPrivateLength()) { GetDictItem(); if (key == "Subrs") { //Add the private offset to the lsubrs since the offset is // relative to the beginning of the PrivateDict - fonts[j].privateSubrs = (int)((int?)args[0]).Value + fonts[j].privateOffset; + fonts[j].SetPrivateSubrs((int)((int?)args[0]).Value + fonts[j].GetPrivateOffset()); } } } // fdarray index - if (fonts[j].fdarrayOffset >= 0) { - int[] fdarrayOffsets = GetIndex(fonts[j].fdarrayOffset); - fonts[j].fdprivateOffsets = new int[fdarrayOffsets.Length - 1]; - fonts[j].fdprivateLengths = new int[fdarrayOffsets.Length - 1]; + if (fonts[j].GetFdarrayOffset() >= 0) { + int[] fdarrayOffsets = GetIndex(fonts[j].GetFdarrayOffset()); + fonts[j].SetFdprivateOffsets(new int[fdarrayOffsets.Length - 1]); + fonts[j].SetFdprivateLengths(new int[fdarrayOffsets.Length - 1]); //System.err.println("FD Font::"); for (int k = 0; k < fdarrayOffsets.Length - 1; k++) { Seek(fdarrayOffsets[k]); while (GetPosition() < fdarrayOffsets[k + 1]) { GetDictItem(); if (key == "Private") { - fonts[j].fdprivateLengths[k] = (int)((int?)args[0]).Value; - fonts[j].fdprivateOffsets[k] = (int)((int?)args[1]).Value; + int[] fdprivateLengths = fonts[j].GetFdprivateLengths(); + fdprivateLengths[k] = (int)((int?)args[0]).Value; + fonts[j].SetFdprivateLengths(fdprivateLengths); + int[] fdprivateOffsets = fonts[j].GetFdprivateOffsets(); + fdprivateOffsets[k] = (int)((int?)args[1]).Value; + fonts[j].SetFdprivateOffsets(fdprivateOffsets); } } } diff --git a/itext/itext.io/itext/io/font/CFFFontSubset.cs b/itext/itext.io/itext/io/font/CFFFontSubset.cs index e4055861dd..062904e640 100644 --- a/itext/itext.io/itext/io/font/CFFFontSubset.cs +++ b/itext/itext.io/itext/io/font/CFFFontSubset.cs @@ -172,29 +172,29 @@ internal CFFFontSubset(byte[] cff, ICollection GlyphsUsed, bool isCidParsin glyphsInList = new List(GlyphsUsed); for (int i = 0; i < fonts.Length; ++i) { // Read the number of glyphs in the font - Seek(fonts[i].charstringsOffset); - fonts[i].nglyphs = GetCard16(); + Seek(fonts[i].GetCharstringsOffset()); + fonts[i].SetNglyphs(GetCard16()); // Jump to the count field of the String Index Seek(stringIndexOffset); - fonts[i].nstrings = GetCard16() + standardStrings.Length; + fonts[i].SetNstrings(GetCard16() + standardStrings.Length); // For each font save the offset array of the charstring - fonts[i].charstringsOffsets = GetIndex(fonts[i].charstringsOffset); + fonts[i].SetCharstringsOffsets(GetIndex(fonts[i].GetCharstringsOffset())); if (isCidParsingRequired) { - InitGlyphIdToCharacterIdArray(i, fonts[i].nglyphs, fonts[i].charsetOffset); + InitGlyphIdToCharacterIdArray(i, fonts[i].GetNglyphs(), fonts[i].GetCharsetOffset()); } // Process the FDSelect if exist - if (fonts[i].fdselectOffset >= 0) { + if (fonts[i].GetFdselectOffset() >= 0) { // Process the FDSelect ReadFDSelect(i); // Build the FDArrayUsed Map BuildFDArrayUsed(i); } - if (fonts[i].isCID) { + if (fonts[i].IsCID()) { // Build the FD Array used Map ReadFDArray(i); } // compute the charset length - fonts[i].CharsetLength = CountCharset(fonts[i].charsetOffset, fonts[i].nglyphs); + fonts[i].SetCharsetLength(CountCharset(fonts[i].GetCharsetOffset(), fonts[i].GetNglyphs())); } } //\endcond @@ -264,22 +264,22 @@ internal virtual int CountRange(int NumofGlyphs, int Type) { /// The index of the font being processed protected internal virtual void ReadFDSelect(int Font) { // Restore the number of glyphs - int NumOfGlyphs = fonts[Font].nglyphs; - int[] FDSelect = new int[NumOfGlyphs]; + int numOfGlyphs = fonts[Font].GetNglyphs(); + int[] FDSelect = new int[numOfGlyphs]; // Go to the beginning of the FDSelect - Seek(fonts[Font].fdselectOffset); + Seek(fonts[Font].GetFdselectOffset()); // Read the FDSelect's format - fonts[Font].FDSelectFormat = GetCard8(); - switch (fonts[Font].FDSelectFormat) { + fonts[Font].SetFDSelectFormat(GetCard8()); + switch (fonts[Font].GetFDSelectFormat()) { // Format==0 means each glyph has an entry that indicated // its FD. case 0: { - for (int i = 0; i < NumOfGlyphs; i++) { + for (int i = 0; i < numOfGlyphs; i++) { FDSelect[i] = GetCard8(); } // The FDSelect's Length is one for each glyph + the format // for later use - fonts[Font].FDSelectLength = fonts[Font].nglyphs + 1; + fonts[Font].SetFDSelectLength(fonts[Font].GetNglyphs() + 1); break; } @@ -305,7 +305,7 @@ protected internal virtual void ReadFDSelect(int Font) { first = last; } // Store the length for later use - fonts[Font].FDSelectLength = 1 + 2 + nRanges * 3 + 2; + fonts[Font].SetFDSelectLength(1 + 2 + nRanges * 3 + 2); break; } @@ -314,19 +314,19 @@ protected internal virtual void ReadFDSelect(int Font) { } } // Save the FDSelect of the font - fonts[Font].FDSelect = FDSelect; + fonts[Font].SetFDSelect(FDSelect); } /// Function reads the FDSelect and builds the FDArrayUsed Map According to the glyphs used /// the Number of font being processed protected internal virtual void BuildFDArrayUsed(int Font) { - int[] FDSelect = fonts[Font].FDSelect; + int[] fdSelect = fonts[Font].GetFDSelect(); // For each glyph used foreach (int? glyphsInList1 in glyphsInList) { // Pop the glyphs index int glyph = (int)glyphsInList1; // Pop the glyph's FD - int FD = FDSelect[glyph]; + int FD = fdSelect[glyph]; // Put the FD index into the FDArrayUsed Map FDArrayUsed.Add(FD); } @@ -335,15 +335,15 @@ protected internal virtual void BuildFDArrayUsed(int Font) { /// Read the FDArray count, offsize and Offset array /// the Number of font being processed protected internal virtual void ReadFDArray(int Font) { - Seek(fonts[Font].fdarrayOffset); - fonts[Font].FDArrayCount = GetCard16(); - fonts[Font].FDArrayOffsize = GetCard8(); + Seek(fonts[Font].GetFdarrayOffset()); + fonts[Font].SetFDArrayCount(GetCard16()); + fonts[Font].SetFDArrayOffsize(GetCard8()); // Since we will change values inside the FDArray objects // We increase its offsize to prevent errors - if (fonts[Font].FDArrayOffsize < 4) { - fonts[Font].FDArrayOffsize++; + if (fonts[Font].GetFDArrayOffsize() < 4) { + fonts[Font].SetFDArrayOffsize(fonts[Font].GetFDArrayOffsize() + 1); } - fonts[Font].FDArrayOffsets = GetIndex(fonts[Font].fdarrayOffset); + fonts[Font].SetFDArrayOffsets(GetIndex(fonts[Font].GetFdarrayOffset())); } /// @@ -357,7 +357,7 @@ public virtual byte[] Process(String fontName) { // Find the Font that we will be dealing with int j; for (j = 0; j < fonts.Length; j++) { - if (fontName.Equals(fonts[j].name)) { + if (fontName.Equals(fonts[j].GetName())) { break; } } @@ -408,7 +408,7 @@ protected internal virtual int CalcBias(int Offset, int Font) { Seek(Offset); int nSubrs = GetCard16(); // If type==1 -> bias=0 - if (fonts[Font].CharstringType == 1) { + if (fonts[Font].GetCharstringType() == 1) { return 0; } else { @@ -430,7 +430,7 @@ protected internal virtual int CalcBias(int Offset, int Font) { /// Function uses BuildNewIndex to create the new index of the subset charstrings. /// the font protected internal virtual void BuildNewCharString(int FontIndex) { - NewCharStringsIndex = BuildNewIndex(fonts[FontIndex].charstringsOffsets, GlyphsUsed, ENDCHAR_OP); + NewCharStringsIndex = BuildNewIndex(fonts[FontIndex].GetCharstringsOffsets(), GlyphsUsed, ENDCHAR_OP); } /// Function builds the new local and global subsrs indices. @@ -442,17 +442,17 @@ protected internal virtual void BuildNewCharString(int FontIndex) { protected internal virtual void BuildNewLGSubrs(int Font) { // If the font is CID then the lsubrs are divided into FontDicts. // for each FD array the lsubrs will be subsetted. - if (fonts[Font].isCID) { + if (fonts[Font].IsCID()) { // Init the Map-array and the list-array to hold the subrs used // in each private dict. - hSubrsUsed = new GenericArray>(fonts[Font].fdprivateOffsets.Length); - lSubrsUsed = new GenericArray>(fonts[Font].fdprivateOffsets.Length); + hSubrsUsed = new GenericArray>(fonts[Font].GetFdprivateOffsets().Length); + lSubrsUsed = new GenericArray>(fonts[Font].GetFdprivateOffsets().Length); // A [][] which will store the byte array for each new FD Array lsubs index - NewLSubrsIndex = new byte[fonts[Font].fdprivateOffsets.Length][]; + NewLSubrsIndex = new byte[fonts[Font].GetFdprivateOffsets().Length][]; // An array to hold the offset for each Lsubr index - fonts[Font].PrivateSubrsOffset = new int[fonts[Font].fdprivateOffsets.Length]; + fonts[Font].SetPrivateSubrsOffset(new int[fonts[Font].GetFdprivateOffsets().Length]); // A [][] which will store the offset array for each lsubr index - fonts[Font].PrivateSubrsOffsetsArray = new int[fonts[Font].fdprivateOffsets.Length][]; + fonts[Font].SetPrivateSubrsOffsetsArray(new int[fonts[Font].GetFdprivateOffsets().Length][]); // Put the FDarrayUsed into a list IList FDInList = new List(FDArrayUsed); // For each FD array which is used subset the lsubr @@ -465,34 +465,34 @@ protected internal virtual void BuildNewLGSubrs(int Font) { // store both the offset for the index and its offset array BuildFDSubrsOffsets(Font, FD); // Verify that FDPrivate has a LSubrs index - if (fonts[Font].PrivateSubrsOffset[FD] >= 0) { + if (fonts[Font].GetPrivateSubrsOffset()[FD] >= 0) { //Scans the Charstring data storing the used Local and Global subroutines // by the glyphs. Scans the Subrs recursively. - BuildSubrUsed(Font, FD, fonts[Font].PrivateSubrsOffset[FD], fonts[Font].PrivateSubrsOffsetsArray[FD], hSubrsUsed - .Get(FD), lSubrsUsed.Get(FD)); + BuildSubrUsed(Font, FD, fonts[Font].GetPrivateSubrsOffset()[FD], fonts[Font].GetPrivateSubrsOffsetsArray() + [FD], hSubrsUsed.Get(FD), lSubrsUsed.Get(FD)); // Builds the New Local Subrs index - NewLSubrsIndex[FD] = BuildNewIndex(fonts[Font].PrivateSubrsOffsetsArray[FD], hSubrsUsed.Get(FD), RETURN_OP + NewLSubrsIndex[FD] = BuildNewIndex(fonts[Font].GetPrivateSubrsOffsetsArray()[FD], hSubrsUsed.Get(FD), RETURN_OP ); } } } else { // If the font is not CID && the Private Subr exists then subset: - if (fonts[Font].privateSubrs >= 0) { + if (fonts[Font].GetPrivateSubrs() >= 0) { // Build the subrs offsets; - fonts[Font].SubrsOffsets = GetIndex(fonts[Font].privateSubrs); + fonts[Font].SetSubrsOffsets(GetIndex(fonts[Font].GetPrivateSubrs())); //Scans the Charstring data storing the used Local and Global subroutines // by the glyphs. Scans the Subrs recursively. - BuildSubrUsed(Font, -1, fonts[Font].privateSubrs, fonts[Font].SubrsOffsets, hSubrsUsedNonCID, lSubrsUsedNonCID + BuildSubrUsed(Font, -1, fonts[Font].GetPrivateSubrs(), fonts[Font].GetSubrsOffsets(), hSubrsUsedNonCID, lSubrsUsedNonCID ); } } // For all fonts subset the Global Subroutines // Scan the Global Subr Map recursively on the Gsubrs BuildGSubrsUsed(Font); - if (fonts[Font].privateSubrs >= 0) { + if (fonts[Font].GetPrivateSubrs() >= 0) { // Builds the New Local Subrs index - NewSubrsIndexNonCID = BuildNewIndex(fonts[Font].SubrsOffsets, hSubrsUsedNonCID, RETURN_OP); + NewSubrsIndexNonCID = BuildNewIndex(fonts[Font].GetSubrsOffsets(), hSubrsUsedNonCID, RETURN_OP); } //Builds the New Global Subrs index // NOTE We copy all global subroutines to index here. @@ -511,20 +511,26 @@ protected internal virtual void BuildNewLGSubrs(int Font) { /// The FDARRAY processed protected internal virtual void BuildFDSubrsOffsets(int Font, int FD) { // Initiate to -1 to indicate lsubr operator present - fonts[Font].PrivateSubrsOffset[FD] = -1; + int[] privateSubrsOffset = fonts[Font].GetPrivateSubrsOffset(); + privateSubrsOffset[FD] = -1; + fonts[Font].SetPrivateSubrsOffset(privateSubrsOffset); // Goto beginning of objects - Seek(fonts[Font].fdprivateOffsets[FD]); + Seek(fonts[Font].GetFdprivateOffsets()[FD]); // While in the same object: - while (GetPosition() < fonts[Font].fdprivateOffsets[FD] + fonts[Font].fdprivateLengths[FD]) { + while (GetPosition() < fonts[Font].GetFdprivateOffsets()[FD] + fonts[Font].GetFdprivateLengths()[FD]) { GetDictItem(); // If the dictItem is the "Subrs" then find and store offset, if ("Subrs".Equals(key)) { - fonts[Font].PrivateSubrsOffset[FD] = (int)((int?)args[0]) + fonts[Font].fdprivateOffsets[FD]; + privateSubrsOffset = fonts[Font].GetPrivateSubrsOffset(); + privateSubrsOffset[FD] = (int)((int?)args[0]) + fonts[Font].GetFdprivateOffsets()[FD]; + fonts[Font].SetPrivateSubrsOffset(privateSubrsOffset); } } //Read the lsubr index if the lsubr was found - if (fonts[Font].PrivateSubrsOffset[FD] >= 0) { - fonts[Font].PrivateSubrsOffsetsArray[FD] = GetIndex(fonts[Font].PrivateSubrsOffset[FD]); + if (fonts[Font].GetPrivateSubrsOffset()[FD] >= 0) { + int[][] privateSubrsOffsetsArray = fonts[Font].GetPrivateSubrsOffsetsArray(); + privateSubrsOffsetsArray[FD] = GetIndex(fonts[Font].GetPrivateSubrsOffset()[FD]); + fonts[Font].SetPrivateSubrsOffsetsArray(privateSubrsOffsetsArray); } } @@ -547,24 +553,24 @@ protected internal virtual void BuildSubrUsed(int Font, int FD, int SubrOffset, // For each glyph used find its GID, start & end pos foreach (int? usedGlyph in glyphsInList) { int glyph = (int)usedGlyph; - int Start = fonts[Font].charstringsOffsets[glyph]; - int End = fonts[Font].charstringsOffsets[glyph + 1]; + int start = fonts[Font].GetCharstringsOffsets()[glyph]; + int end = fonts[Font].GetCharstringsOffsets()[glyph + 1]; // IF CID: if (FD >= 0) { EmptyStack(); NumOfHints = 0; // Using FDSELECT find the FD Array the glyph belongs to. - int GlyphFD = fonts[Font].FDSelect[glyph]; + int glyphFD = fonts[Font].GetFDSelect()[glyph]; // If the Glyph is part of the FD being processed - if (GlyphFD == FD) { + if (glyphFD == FD) { // Find the Subrs called by the glyph and insert to hash: - ReadASubr(Start, End, GBias, LBias, hSubr, lSubr, SubrsOffsets); + ReadASubr(start, end, GBias, LBias, hSubr, lSubr, SubrsOffsets); } } else { // If the font is not CID //Find the Subrs called by the glyph and insert to hash: - ReadASubr(Start, End, GBias, LBias, hSubr, lSubr, SubrsOffsets); + ReadASubr(start, end, GBias, LBias, hSubr, lSubr, SubrsOffsets); } } // For all Lsubrs used, check recursively for Lsubr & Gsubr used @@ -589,8 +595,8 @@ protected internal virtual void BuildSubrUsed(int Font, int FD, int SubrOffset, protected internal virtual void BuildGSubrsUsed(int Font) { int LBias = 0; int SizeOfNonCIDSubrsUsed = 0; - if (fonts[Font].privateSubrs >= 0) { - LBias = CalcBias(fonts[Font].privateSubrs, Font); + if (fonts[Font].GetPrivateSubrs() >= 0) { + LBias = CalcBias(fonts[Font].GetPrivateSubrs(), Font); SizeOfNonCIDSubrsUsed = lSubrsUsedNonCID.Count; } // For each global subr used @@ -601,20 +607,20 @@ protected internal virtual void BuildGSubrsUsed(int Font) { // Read the subr and process int Start = gsubrOffsets[Subr]; int End = gsubrOffsets[Subr + 1]; - if (fonts[Font].isCID) { + if (fonts[Font].IsCID()) { ReadASubr(Start, End, GBias, 0, hGSubrsUsed, lGSubrsUsed, null); } else { - ReadASubr(Start, End, GBias, LBias, hSubrsUsedNonCID, lSubrsUsedNonCID, fonts[Font].SubrsOffsets); + ReadASubr(Start, End, GBias, LBias, hSubrsUsedNonCID, lSubrsUsedNonCID, fonts[Font].GetSubrsOffsets()); if (SizeOfNonCIDSubrsUsed < lSubrsUsedNonCID.Count) { for (int j = SizeOfNonCIDSubrsUsed; j < lSubrsUsedNonCID.Count; j++) { //Pop the value + check valid - int LSubr = (int)lSubrsUsedNonCID[j]; - if (LSubr < fonts[Font].SubrsOffsets.Length - 1 && LSubr >= 0) { + int lSubr = (int)lSubrsUsedNonCID[j]; + if (lSubr < fonts[Font].GetSubrsOffsets().Length - 1 && lSubr >= 0) { // Read the subr and process - int LStart = fonts[Font].SubrsOffsets[LSubr]; - int LEnd = fonts[Font].SubrsOffsets[LSubr + 1]; - ReadASubr(LStart, LEnd, GBias, LBias, hSubrsUsedNonCID, lSubrsUsedNonCID, fonts[Font].SubrsOffsets); + int lStart = fonts[Font].GetSubrsOffsets()[lSubr]; + int lEnd = fonts[Font].GetSubrsOffsets()[lSubr + 1]; + ReadASubr(lStart, lEnd, GBias, LBias, hSubrsUsedNonCID, lSubrsUsedNonCID, fonts[Font].GetSubrsOffsets()); } } SizeOfNonCIDSubrsUsed = lSubrsUsedNonCID.Count; @@ -1132,8 +1138,8 @@ protected internal virtual byte[] BuildNewFile(int Font) { CopyHeader(); // create a name index BuildIndexHeader(1, 1, 1); - OutputList.AddLast(new CFFFont.UInt8Item((char)(1 + fonts[Font].name.Length))); - OutputList.AddLast(new CFFFont.StringItem(fonts[Font].name)); + OutputList.AddLast(new CFFFont.UInt8Item((char)(1 + fonts[Font].GetName().Length))); + OutputList.AddLast(new CFFFont.StringItem(fonts[Font].GetName())); // create the topdict Index BuildIndexHeader(1, 2, 1); CFFFont.OffsetItem topdictIndex1Ref = new CFFFont.IndexOffsetItem(2); @@ -1147,15 +1153,15 @@ protected internal virtual byte[] BuildNewFile(int Font) { CFFFont.OffsetItem fdselectRef = new CFFFont.DictOffsetItem(); CFFFont.OffsetItem privateRef = new CFFFont.DictOffsetItem(); // If the font is not CID create the following keys - if (!fonts[Font].isCID) { + if (!fonts[Font].IsCID()) { // create a ROS key - OutputList.AddLast(new CFFFont.DictNumberItem(fonts[Font].nstrings)); - OutputList.AddLast(new CFFFont.DictNumberItem(fonts[Font].nstrings + 1)); + OutputList.AddLast(new CFFFont.DictNumberItem(fonts[Font].GetNstrings())); + OutputList.AddLast(new CFFFont.DictNumberItem(fonts[Font].GetNstrings() + 1)); OutputList.AddLast(new CFFFont.DictNumberItem(0)); OutputList.AddLast(new CFFFont.UInt8Item((char)12)); OutputList.AddLast(new CFFFont.UInt8Item((char)30)); // create a CIDCount key - OutputList.AddLast(new CFFFont.DictNumberItem(fonts[Font].nglyphs)); + OutputList.AddLast(new CFFFont.DictNumberItem(fonts[Font].GetNglyphs())); OutputList.AddLast(new CFFFont.UInt8Item((char)12)); OutputList.AddLast(new CFFFont.UInt8Item((char)34)); } @@ -1185,7 +1191,7 @@ protected internal virtual byte[] BuildNewFile(int Font) { // Mark the end of the top dict area OutputList.AddLast(new CFFFont.IndexMarkerItem(topdictIndex1Ref, topdictBase)); // Copy the string index - if (fonts[Font].isCID) { + if (fonts[Font].IsCID()) { OutputList.AddLast(GetEntireIndexRange(stringIndexOffset)); } else { @@ -1199,26 +1205,28 @@ protected internal virtual byte[] BuildNewFile(int Font) { )), 0, NewGSubrsIndex.Length)); // deal with fdarray, fdselect, and the font descriptors // If the font is CID: - if (fonts[Font].isCID) { + if (fonts[Font].IsCID()) { // copy the FDArray, FDSelect, charset // Copy FDSelect // Mark the beginning OutputList.AddLast(new CFFFont.MarkerItem(fdselectRef)); // If an FDSelect exists copy it - if (fonts[Font].fdselectOffset >= 0) { - OutputList.AddLast(new CFFFont.RangeItem(buf, fonts[Font].fdselectOffset, fonts[Font].FDSelectLength)); + if (fonts[Font].GetFdselectOffset() >= 0) { + OutputList.AddLast(new CFFFont.RangeItem(buf, fonts[Font].GetFdselectOffset(), fonts[Font].GetFDSelectLength + ())); } else { // Else create a new one - CreateFDSelect(fdselectRef, fonts[Font].nglyphs); + CreateFDSelect(fdselectRef, fonts[Font].GetNglyphs()); } // Copy the Charset // Mark the beginning and copy entirely OutputList.AddLast(new CFFFont.MarkerItem(charsetRef)); - OutputList.AddLast(new CFFFont.RangeItem(buf, fonts[Font].charsetOffset, fonts[Font].CharsetLength)); + OutputList.AddLast(new CFFFont.RangeItem(buf, fonts[Font].GetCharsetOffset(), fonts[Font].GetCharsetLength + ())); // Copy the FDArray // If an FDArray exists - if (fonts[Font].fdarrayOffset >= 0) { + if (fonts[Font].GetFdarrayOffset() >= 0) { // Mark the beginning OutputList.AddLast(new CFFFont.MarkerItem(fdarrayRef)); // Build a new FDArray with its private dicts and their LSubrs @@ -1232,14 +1240,14 @@ protected internal virtual byte[] BuildNewFile(int Font) { else { // If the font is not CID // create FDSelect - CreateFDSelect(fdselectRef, fonts[Font].nglyphs); + CreateFDSelect(fdselectRef, fonts[Font].GetNglyphs()); // recreate a new charset - CreateCharset(charsetRef, fonts[Font].nglyphs); + CreateCharset(charsetRef, fonts[Font].GetNglyphs()); // create a font dict index (fdarray) CreateFDArray(fdarrayRef, privateRef, Font); } // if a private dict exists insert its subsetted version - if (fonts[Font].privateOffset >= 0) { + if (fonts[Font].GetPrivateOffset() >= 0) { // Mark the beginning of the private dict CFFFont.IndexBaseItem PrivateBase = new CFFFont.IndexBaseItem(); OutputList.AddLast(PrivateBase); @@ -1356,7 +1364,7 @@ protected internal virtual void CreateKeys(CFFFont.OffsetItem fdarrayRef, CFFFon /// /// the font protected internal virtual void CreateNewStringIndex(int Font) { - String fdFontName = fonts[Font].name + "-OneRange"; + String fdFontName = fonts[Font].GetName() + "-OneRange"; if (fdFontName.Length > 127) { fdFontName = fdFontName.JSubstring(0, 127); } @@ -1469,14 +1477,15 @@ protected internal virtual void CreateFDArray(CFFFont.OffsetItem fdarrayRef, CFF OutputList.AddLast(privateBase); // Calc the new size of the private after subsetting // Origianl size - int NewSize = fonts[Font].privateLength; + int newSize = fonts[Font].GetPrivateLength(); // Calc the original size of the Subr offset in the private - int OrgSubrsOffsetSize = CalcSubrOffsetSize(fonts[Font].privateOffset, fonts[Font].privateLength); + int orgSubrsOffsetSize = CalcSubrOffsetSize(fonts[Font].GetPrivateOffset(), fonts[Font].GetPrivateLength() + ); // Increase the ptivate's size - if (OrgSubrsOffsetSize != 0) { - NewSize += 5 - OrgSubrsOffsetSize; + if (orgSubrsOffsetSize != 0) { + newSize += 5 - orgSubrsOffsetSize; } - OutputList.AddLast(new CFFFont.DictNumberItem(NewSize)); + OutputList.AddLast(new CFFFont.DictNumberItem(newSize)); OutputList.AddLast(privateRef); // Private OutputList.AddLast(new CFFFont.UInt8Item((char)18)); @@ -1488,9 +1497,10 @@ protected internal virtual void CreateFDArray(CFFFont.OffsetItem fdarrayRef, CFF /// the font internal virtual void Reconstruct(int Font) { // Init for later use - CFFFont.OffsetItem[] fdPrivate = new CFFFont.DictOffsetItem[fonts[Font].FDArrayOffsets.Length - 1]; - CFFFont.IndexBaseItem[] fdPrivateBase = new CFFFont.IndexBaseItem[fonts[Font].fdprivateOffsets.Length]; - CFFFont.OffsetItem[] fdSubrs = new CFFFont.DictOffsetItem[fonts[Font].fdprivateOffsets.Length]; + CFFFont.OffsetItem[] fdPrivate = new CFFFont.DictOffsetItem[fonts[Font].GetFDArrayOffsets().Length - 1]; + CFFFont.IndexBaseItem[] fdPrivateBase = new CFFFont.IndexBaseItem[fonts[Font].GetFdprivateOffsets().Length + ]; + CFFFont.OffsetItem[] fdSubrs = new CFFFont.DictOffsetItem[fonts[Font].GetFdprivateOffsets().Length]; // Reconstruct each type ReconstructFDArray(Font, fdPrivate); ReconstructPrivateDict(Font, fdPrivate, fdPrivateBase, fdSubrs); @@ -1504,11 +1514,11 @@ internal virtual void Reconstruct(int Font) { /// OffsetItem Array (one for each FDArray) internal virtual void ReconstructFDArray(int Font, CFFFont.OffsetItem[] fdPrivate) { // Build the header of the index - BuildIndexHeader(fonts[Font].FDArrayCount, fonts[Font].FDArrayOffsize, 1); + BuildIndexHeader(fonts[Font].GetFDArrayCount(), fonts[Font].GetFDArrayOffsize(), 1); // For each offset create an Offset Item - CFFFont.OffsetItem[] fdOffsets = new CFFFont.IndexOffsetItem[fonts[Font].FDArrayOffsets.Length - 1]; - for (int i = 0; i < fonts[Font].FDArrayOffsets.Length - 1; i++) { - fdOffsets[i] = new CFFFont.IndexOffsetItem(fonts[Font].FDArrayOffsize); + CFFFont.OffsetItem[] fdOffsets = new CFFFont.IndexOffsetItem[fonts[Font].GetFDArrayOffsets().Length - 1]; + for (int i = 0; i < fonts[Font].GetFDArrayOffsets().Length - 1; i++) { + fdOffsets[i] = new CFFFont.IndexOffsetItem(fonts[Font].GetFDArrayOffsize()); OutputList.AddLast(fdOffsets[i]); } // Declare beginning of the object array @@ -1518,12 +1528,12 @@ internal virtual void ReconstructFDArray(int Font, CFFFont.OffsetItem[] fdPrivat // if is used build a new one by changing the private object // Else do nothing // At the end of each object mark its ending (Even if wasn't written) - for (int k = 0; k < fonts[Font].FDArrayOffsets.Length - 1; k++) { + for (int k = 0; k < fonts[Font].GetFDArrayOffsets().Length - 1; k++) { // if (FDArrayUsed.contains(Integer.valueOf(k))) // { // Goto beginning of objects - Seek(fonts[Font].FDArrayOffsets[k]); - while (GetPosition() < fonts[Font].FDArrayOffsets[k + 1]) { + Seek(fonts[Font].GetFDArrayOffsets()[k]); + while (GetPosition() < fonts[Font].GetFDArrayOffsets()[k + 1]) { int p1 = GetPosition(); GetDictItem(); int p2 = GetPosition(); @@ -1531,16 +1541,16 @@ internal virtual void ReconstructFDArray(int Font, CFFFont.OffsetItem[] fdPrivat // use marker for offset and write operator number if ("Private".Equals(key)) { // Save the original length of the private dict - int NewSize = (int)((int?)args[0]); + int newSize = (int)((int?)args[0]); // Save the size of the offset to the subrs in that private - int OrgSubrsOffsetSize = CalcSubrOffsetSize(fonts[Font].fdprivateOffsets[k], fonts[Font].fdprivateLengths[ - k]); + int orgSubrsOffsetSize = CalcSubrOffsetSize(fonts[Font].GetFdprivateOffsets()[k], fonts[Font].GetFdprivateLengths + ()[k]); // Increase the private's length accordingly - if (OrgSubrsOffsetSize != 0) { - NewSize += 5 - OrgSubrsOffsetSize; + if (orgSubrsOffsetSize != 0) { + newSize += 5 - orgSubrsOffsetSize; } // Insert the new size, OffsetItem and operator key number - OutputList.AddLast(new CFFFont.DictNumberItem(NewSize)); + OutputList.AddLast(new CFFFont.DictNumberItem(newSize)); fdPrivate[k] = new CFFFont.DictOffsetItem(); OutputList.AddLast(fdPrivate[k]); // Private @@ -1572,7 +1582,7 @@ internal virtual void ReconstructPrivateDict(int Font, CFFFont.OffsetItem[] fdPr // For each fdarray private dict check if that FD is used. // if is used build a new one by changing the subrs offset // Else do nothing - for (int i = 0; i < fonts[Font].fdprivateOffsets.Length; i++) { + for (int i = 0; i < fonts[Font].GetFdprivateOffsets().Length; i++) { // if (FDArrayUsed.contains(Integer.valueOf(i))) // { // Mark beginning @@ -1580,8 +1590,8 @@ internal virtual void ReconstructPrivateDict(int Font, CFFFont.OffsetItem[] fdPr fdPrivateBase[i] = new CFFFont.IndexBaseItem(); OutputList.AddLast(fdPrivateBase[i]); // Goto beginning of objects - Seek(fonts[Font].fdprivateOffsets[i]); - while (GetPosition() < fonts[Font].fdprivateOffsets[i] + fonts[Font].fdprivateLengths[i]) { + Seek(fonts[Font].GetFdprivateOffsets()[i]); + while (GetPosition() < fonts[Font].GetFdprivateOffsets()[i] + fonts[Font].GetFdprivateLengths()[i]) { int p1 = GetPosition(); GetDictItem(); int p2 = GetPosition(); @@ -1611,10 +1621,10 @@ internal virtual void ReconstructPrivateDict(int Font, CFFFont.OffsetItem[] fdPr internal virtual void ReconstructPrivateSubrs(int Font, CFFFont.IndexBaseItem[] fdPrivateBase, CFFFont.OffsetItem [] fdSubrs) { // For each private dict - for (int i = 0; i < fonts[Font].fdprivateLengths.Length; i++) { + for (int i = 0; i < fonts[Font].GetFdprivateLengths().Length; i++) { // If that private dict's Subrs are used insert the new LSubrs // computed earlier - if (fdSubrs[i] != null && fonts[Font].PrivateSubrsOffset[i] >= 0) { + if (fdSubrs[i] != null && fonts[Font].GetPrivateSubrsOffset()[i] >= 0) { OutputList.AddLast(new CFFFont.SubrMarkerItem(fdSubrs[i], fdPrivateBase[i])); if (NewLSubrsIndex[i] != null) { OutputList.AddLast(new CFFFont.RangeItem(new RandomAccessFileOrArray(rasFactory.CreateSource(NewLSubrsIndex @@ -1688,8 +1698,8 @@ protected internal virtual int CountEntireIndexRange(int indexOffset) { /// The OffsetItem for the subrs of the private internal virtual void CreateNonCIDPrivate(int Font, CFFFont.OffsetItem Subr) { // Go to the beginning of the private dict and read until the end - Seek(fonts[Font].privateOffset); - while (GetPosition() < fonts[Font].privateOffset + fonts[Font].privateLength) { + Seek(fonts[Font].GetPrivateOffset()); + while (GetPosition() < fonts[Font].GetPrivateOffset() + fonts[Font].GetPrivateLength()) { int p1 = GetPosition(); GetDictItem(); int p2 = GetPosition(); @@ -1743,12 +1753,13 @@ internal virtual int GetCidForGlyphId(int gid) { /// glyph identifier /// CID value internal virtual int GetCidForGlyphId(int fontIndex, int gid) { - if (fonts[fontIndex].gidToCid == null) { + if (fonts[fontIndex].GetGidToCid() == null) { return gid; } // gidToCid mapping starts with value corresponding to gid == 1, becuase .notdef is omitted int index = gid - 1; - return index >= 0 && index < fonts[fontIndex].gidToCid.Length ? fonts[fontIndex].gidToCid[index] : gid; + return index >= 0 && index < fonts[fontIndex].GetGidToCid().Length ? fonts[fontIndex].GetGidToCid()[index] + : gid; } //\endcond @@ -1763,12 +1774,14 @@ private void InitGlyphIdToCharacterIdArray(int fontIndex, int numOfGlyphs, int o int format = GetCard8(); // .notdef is omitted, therefore remaining number of elements is one less than overall number int numOfElements = numOfGlyphs - 1; - fonts[fontIndex].gidToCid = new int[numOfElements]; + fonts[fontIndex].SetGidToCid(new int[numOfElements]); switch (format) { case 0: { for (int i = 0; i < numOfElements; i++) { int cid = GetCard16(); - fonts[fontIndex].gidToCid[i] = cid; + int[] gidToCid = fonts[fontIndex].GetGidToCid(); + gidToCid[i] = cid; + fonts[fontIndex].SetGidToCid(gidToCid); } break; } @@ -1780,7 +1793,9 @@ private void InitGlyphIdToCharacterIdArray(int fontIndex, int numOfGlyphs, int o int first = GetCard16(); int nLeft = format == 1 ? GetCard8() : GetCard16(); for (int i = 0; i <= nLeft && start < numOfElements; i++) { - fonts[fontIndex].gidToCid[start++] = first + i; + int[] gidToCid = fonts[fontIndex].GetGidToCid(); + gidToCid[start++] = first + i; + fonts[fontIndex].SetGidToCid(gidToCid); } } break; diff --git a/itext/itext.io/itext/io/font/cmap/CMapByteCid.cs b/itext/itext.io/itext/io/font/cmap/CMapByteCid.cs index 43b3f76e84..d32727a2bf 100644 --- a/itext/itext.io/itext/io/font/cmap/CMapByteCid.cs +++ b/itext/itext.io/itext/io/font/cmap/CMapByteCid.cs @@ -27,17 +27,41 @@ You should have received a copy of the GNU Affero General Public License namespace iText.IO.Font.Cmap { public class CMapByteCid : AbstractCMap { protected internal class Cursor { - public int offset; + private int offset; - public int length; + private int length; public Cursor(int offset, int length) { this.offset = offset; this.length = length; } + + /// Retrieves the offset of the object. + /// offset value + public virtual int GetOffset() { + return offset; + } + + /// Sets the offset of the object. + /// offset value + public virtual void SetOffset(int offset) { + this.offset = offset; + } + + /// Retrieves the length of the object. + /// length value + public virtual int GetLength() { + return length; + } + + /// Sets the length value of the object. + /// length value + public virtual void SetLength(int length) { + this.length = length; + } } - private IList planes = new List(); + private readonly IList planes = new List(); public CMapByteCid() { planes.Add(new int[256]); @@ -67,11 +91,12 @@ public virtual String DecodeSequence(byte[] cidBytes, int offset, int length) { } protected internal virtual int DecodeSingle(byte[] cidBytes, CMapByteCid.Cursor cursor) { - int end = cursor.offset + cursor.length; + int end = cursor.GetOffset() + cursor.GetLength(); int currentPlane = 0; - while (cursor.offset < end) { - int one = cidBytes[cursor.offset++] & 0xff; - cursor.length--; + while (cursor.GetOffset() < end) { + int one = cidBytes[cursor.GetOffset()] & 0xff; + cursor.SetOffset(cursor.GetOffset() + 1); + cursor.SetLength(cursor.GetLength() - 1); int[] plane = planes[currentPlane]; int cid = plane[one]; if ((cid & 0x8000) == 0) { diff --git a/itext/itext.io/itext/io/font/cmap/CMapToUnicode.cs b/itext/itext.io/itext/io/font/cmap/CMapToUnicode.cs index fa2609cc22..508dcfadbc 100644 --- a/itext/itext.io/itext/io/font/cmap/CMapToUnicode.cs +++ b/itext/itext.io/itext/io/font/cmap/CMapToUnicode.cs @@ -30,8 +30,8 @@ You should have received a copy of the GNU Affero General Public License namespace iText.IO.Font.Cmap { /// This class represents a CMap file. public class CMapToUnicode : AbstractCMap { - public static iText.IO.Font.Cmap.CMapToUnicode EmptyCMapToUnicodeMap = new iText.IO.Font.Cmap.CMapToUnicode - (true); + public static readonly iText.IO.Font.Cmap.CMapToUnicode EMPTY_CMAP = new iText.IO.Font.Cmap.CMapToUnicode( + true); private readonly IDictionary byteMappings; diff --git a/itext/itext.io/itext/io/font/constants/FontDescriptorFlags.cs b/itext/itext.io/itext/io/font/constants/FontDescriptorFlags.cs index 032ebcedb4..9ff1b2178b 100644 --- a/itext/itext.io/itext/io/font/constants/FontDescriptorFlags.cs +++ b/itext/itext.io/itext/io/font/constants/FontDescriptorFlags.cs @@ -26,22 +26,22 @@ public sealed class FontDescriptorFlags { private FontDescriptorFlags() { } - public static int FixedPitch = 1; + public const int FIXED_PITCH = 1; - public static int Serif = 1 << 1; + public const int SERIF = 1 << 1; - public static int Symbolic = 1 << 2; + public const int SYMBOLIC = 1 << 2; - public static int Script = 1 << 3; + public const int SCRIPT = 1 << 3; - public static int Nonsymbolic = 1 << 5; + public const int NONSYMBOLIC = 1 << 5; - public static int Italic = 1 << 6; + public const int ITALIC = 1 << 6; - public static int AllCap = 1 << 16; + public const int ALL_CAP = 1 << 16; - public static int SmallCap = 1 << 17; + public const int SMALL_CAP = 1 << 17; - public static int ForceBold = 1 << 18; + public const int FORCE_BOLD = 1 << 18; } } diff --git a/itext/itext.io/itext/io/font/otf/ActualTextIterator.cs b/itext/itext.io/itext/io/font/otf/ActualTextIterator.cs index f02ad72266..5527746712 100644 --- a/itext/itext.io/itext/io/font/otf/ActualTextIterator.cs +++ b/itext/itext.io/itext/io/font/otf/ActualTextIterator.cs @@ -35,7 +35,7 @@ public class ActualTextIterator : IEnumerator public ActualTextIterator(GlyphLine glyphLine) { this.glyphLine = glyphLine; - this.pos = glyphLine.start; + this.pos = glyphLine.GetStart(); } public ActualTextIterator(GlyphLine glyphLine, int start, int end) @@ -61,25 +61,25 @@ public void Reset() public GlyphLine.GlyphLinePart Next() { if (glyphLine.actualText == null) { - GlyphLine.GlyphLinePart result = new GlyphLine.GlyphLinePart(pos, glyphLine.end, + GlyphLine.GlyphLinePart result = new GlyphLine.GlyphLinePart(pos, glyphLine.GetEnd(), null); - pos = glyphLine.end; + pos = glyphLine.GetEnd(); return result; } else { GlyphLine.GlyphLinePart currentResult = NextGlyphLinePart(pos); if (currentResult == null) { return null; } - pos = currentResult.end; + pos = currentResult.GetEnd(); if (!GlyphLinePartNeedsActualText(currentResult)) { - currentResult.actualText = null; + currentResult.SetActualText(null); // Try to add more pieces without "actual text" - while (pos < glyphLine.end) { + while (pos < glyphLine.GetEnd()) { GlyphLine.GlyphLinePart nextResult = NextGlyphLinePart(pos); if (nextResult != null && !GlyphLinePartNeedsActualText(nextResult)) { - currentResult.end = nextResult.end; - pos = nextResult.end; + currentResult.SetEnd(nextResult.GetEnd()); + pos = nextResult.GetEnd(); } else { break; } @@ -91,7 +91,7 @@ public GlyphLine.GlyphLinePart Next() { } public bool HasNext() { - return pos < glyphLine.end; + return pos < glyphLine.GetEnd(); } @@ -104,29 +104,29 @@ object IEnumerator.Current private GlyphLine.GlyphLinePart NextGlyphLinePart(int pos) { - if (pos >= glyphLine.end) + if (pos >= glyphLine.GetEnd()) { return null; } int startPos = pos; GlyphLine.ActualText startActualText = glyphLine.actualText[pos]; - while (pos < glyphLine.end && glyphLine.actualText[pos] == startActualText) + while (pos < glyphLine.GetEnd() && glyphLine.actualText[pos] == startActualText) { pos++; } return new GlyphLine.GlyphLinePart(startPos, pos, startActualText != null ? startActualText - .value : null); + .GetValue() : null); } private bool GlyphLinePartNeedsActualText(GlyphLine.GlyphLinePart glyphLinePart) { - if (glyphLinePart.actualText == null) + if (glyphLinePart.GetActualText() == null) { return false; } bool needsActualText = false; StringBuilder toUnicodeMapResult = new StringBuilder(); - for (int i = glyphLinePart.start; i < glyphLinePart.end; i++) + for (int i = glyphLinePart.GetStart(); i < glyphLinePart.GetEnd(); i++) { Glyph currentGlyph = glyphLine.glyphs[i]; if (!currentGlyph.HasValidUnicode()) @@ -136,7 +136,7 @@ private bool GlyphLinePartNeedsActualText(GlyphLine.GlyphLinePart glyphLinePart) } toUnicodeMapResult.Append(TextUtil.ConvertFromUtf32(currentGlyph.GetUnicode())); } - return needsActualText || !toUnicodeMapResult.ToString().Equals(glyphLinePart.actualText + return needsActualText || !toUnicodeMapResult.ToString().Equals(glyphLinePart.GetActualText() ); } diff --git a/itext/itext.io/itext/io/font/otf/ChainingContextualTable.cs b/itext/itext.io/itext/io/font/otf/ChainingContextualTable.cs index 26a1127809..a17d487b17 100644 --- a/itext/itext.io/itext/io/font/otf/ChainingContextualTable.cs +++ b/itext/itext.io/itext/io/font/otf/ChainingContextualTable.cs @@ -30,17 +30,17 @@ protected internal ChainingContextualTable(OpenTypeFontTableReader openReader, i } public override T GetMatchingContextRule(GlyphLine line) { - if (line.idx >= line.end) { + if (line.GetIdx() >= line.GetEnd()) { return null; } - Glyph g = line.Get(line.idx); + Glyph g = line.Get(line.GetIdx()); IList rules = GetSetOfRulesForStartGlyph(g.GetCode()); foreach (T rule in rules) { int lastGlyphIndex = CheckIfContextMatch(line, rule); if (lastGlyphIndex != -1 && CheckIfLookaheadContextMatch(line, rule, lastGlyphIndex) && CheckIfBacktrackContextMatch (line, rule)) { - line.start = line.idx; - line.end = lastGlyphIndex + 1; + line.SetStart(line.GetIdx()); + line.SetEnd(lastGlyphIndex + 1); return rule; } } @@ -54,11 +54,11 @@ public override T GetMatchingContextRule(GlyphLine line) { /// true if given glyph line at the given position matches given rule protected internal virtual bool CheckIfLookaheadContextMatch(GlyphLine line, T rule, int startIdx) { OpenTableLookup.GlyphIndexer gidx = new OpenTableLookup.GlyphIndexer(); - gidx.line = line; - gidx.idx = startIdx; + gidx.SetLine(line); + gidx.SetIdx(startIdx); for (int j = 0; j < rule.GetLookaheadContextLength(); ++j) { gidx.NextGlyph(openReader, lookupFlag); - if (gidx.glyph == null || !rule.IsGlyphMatchesLookahead(gidx.glyph.GetCode(), j)) { + if (gidx.GetGlyph() == null || !rule.IsGlyphMatchesLookahead(gidx.GetGlyph().GetCode(), j)) { return false; } } @@ -71,11 +71,11 @@ protected internal virtual bool CheckIfLookaheadContextMatch(GlyphLine line, T r /// true if given glyph line matches given rule protected internal virtual bool CheckIfBacktrackContextMatch(GlyphLine line, T rule) { OpenTableLookup.GlyphIndexer gidx = new OpenTableLookup.GlyphIndexer(); - gidx.line = line; - gidx.idx = line.idx; + gidx.SetLine(line); + gidx.SetIdx(line.GetIdx()); for (int j = 0; j < rule.GetBacktrackContextLength(); ++j) { gidx.PreviousGlyph(openReader, lookupFlag); - if (gidx.glyph == null || !rule.IsGlyphMatchesBacktrack(gidx.glyph.GetCode(), j)) { + if (gidx.GetGlyph() == null || !rule.IsGlyphMatchesBacktrack(gidx.GetGlyph().GetCode(), j)) { return false; } } diff --git a/itext/itext.io/itext/io/font/otf/ContextualTable.cs b/itext/itext.io/itext/io/font/otf/ContextualTable.cs index d92c046869..09d5fe0bdf 100644 --- a/itext/itext.io/itext/io/font/otf/ContextualTable.cs +++ b/itext/itext.io/itext/io/font/otf/ContextualTable.cs @@ -46,16 +46,16 @@ protected internal ContextualTable(OpenTypeFontTableReader openReader, int looku /// a line, which is to be checked if it matches some context. /// matching context rule or null, if none was found. public virtual T GetMatchingContextRule(GlyphLine line) { - if (line.idx >= line.end) { + if (line.GetIdx() >= line.GetEnd()) { return null; } - Glyph g = line.Get(line.idx); + Glyph g = line.Get(line.GetIdx()); IList rules = GetSetOfRulesForStartGlyph(g.GetCode()); foreach (T rule in rules) { int lastGlyphIndex = CheckIfContextMatch(line, rule); if (lastGlyphIndex != -1) { - line.start = line.idx; - line.end = lastGlyphIndex + 1; + line.SetStart(line.GetIdx()); + line.SetEnd(lastGlyphIndex + 1); return rule; } } @@ -82,18 +82,18 @@ public virtual T GetMatchingContextRule(GlyphLine line) { protected internal virtual int CheckIfContextMatch(GlyphLine line, T rule) { int j; OpenTableLookup.GlyphIndexer gidx = new OpenTableLookup.GlyphIndexer(); - gidx.line = line; - gidx.idx = line.idx; + gidx.SetLine(line); + gidx.SetIdx(line.GetIdx()); //Note, that starting index shall be 1 for (j = 1; j < rule.GetContextLength(); ++j) { gidx.NextGlyph(openReader, lookupFlag); - if (gidx.glyph == null || !rule.IsGlyphMatchesInput(gidx.glyph.GetCode(), j)) { + if (gidx.GetGlyph() == null || !rule.IsGlyphMatchesInput(gidx.GetGlyph().GetCode(), j)) { break; } } bool isMatch = j == rule.GetContextLength(); if (isMatch) { - return gidx.idx; + return gidx.GetIdx(); } else { return -1; diff --git a/itext/itext.io/itext/io/font/otf/FeatureRecord.cs b/itext/itext.io/itext/io/font/otf/FeatureRecord.cs index 8be55423b8..ee3483ff2f 100644 --- a/itext/itext.io/itext/io/font/otf/FeatureRecord.cs +++ b/itext/itext.io/itext/io/font/otf/FeatureRecord.cs @@ -24,8 +24,32 @@ You should have received a copy of the GNU Affero General Public License namespace iText.IO.Font.Otf { public class FeatureRecord { - public String tag; + private String tag; - public int[] lookups; + private int[] lookups; + + /// Retrieves the tag of the feature record. + /// tag + public virtual String GetTag() { + return tag; + } + + /// Sets the tag of the feature record. + /// tag + public virtual void SetTag(String tag) { + this.tag = tag; + } + + /// Retrieves the lookups of the feature record. + /// lookups + public virtual int[] GetLookups() { + return lookups; + } + + /// Sets the lookups of the feature record. + /// lookups + public virtual void SetLookups(int[] lookups) { + this.lookups = lookups; + } } } diff --git a/itext/itext.io/itext/io/font/otf/GlyphLine.cs b/itext/itext.io/itext/io/font/otf/GlyphLine.cs index 10380b8c68..ee128c07c2 100644 --- a/itext/itext.io/itext/io/font/otf/GlyphLine.cs +++ b/itext/itext.io/itext/io/font/otf/GlyphLine.cs @@ -26,11 +26,11 @@ You should have received a copy of the GNU Affero General Public License namespace iText.IO.Font.Otf { public class GlyphLine { - public int start; + private int start; - public int end; + private int end; - public int idx; + private int idx; protected internal IList glyphs; @@ -93,6 +93,42 @@ public GlyphLine(iText.IO.Font.Otf.GlyphLine other, int start, int end) { this.idx = other.idx - start; } + /// Retrieves the start of the glyph line. + /// start of glyph line + public virtual int GetStart() { + return start; + } + + /// Sets the start of the glyph line. + /// start of glyph line + public virtual void SetStart(int start) { + this.start = start; + } + + /// Retrieves the end of the glyph line. + /// end of glyph line + public virtual int GetEnd() { + return end; + } + + /// Sets the end of the glyph line. + /// end of glyph line + public virtual void SetEnd(int end) { + this.end = end; + } + + /// Retrieves the idx of the glyph line. + /// idx of glyph line + public virtual int GetIdx() { + return idx; + } + + /// Sets the idx of the glyph line. + /// idx of glyph line + public virtual void SetIdx(int idx) { + this.idx = idx; + } + /// Get the unicode string representation of the GlyphLine slice. /// starting index of the slice /// terminating index of the slice @@ -102,11 +138,11 @@ public virtual String ToUnicodeString(int start, int end) { StringBuilder str = new StringBuilder(); while (iter.HasNext()) { GlyphLine.GlyphLinePart part = iter.Next(); - if (part.actualText != null) { - str.Append(part.actualText); + if (part.GetActualText() != null) { + str.Append(part.GetActualText()); } else { - for (int i = part.start; i < part.end; i++) { + for (int i = part.GetStart(); i < part.GetEnd(); i++) { str.Append(glyphs[i].GetUnicodeChars()); } } @@ -124,9 +160,9 @@ public override String ToString() { /// new GlyphLine containing the copied slice public virtual iText.IO.Font.Otf.GlyphLine Copy(int left, int right) { iText.IO.Font.Otf.GlyphLine glyphLine = new iText.IO.Font.Otf.GlyphLine(); - glyphLine.start = 0; - glyphLine.end = right - left; - glyphLine.glyphs = new List(glyphs.SubList(left, right)); + glyphLine.SetStart(0); + glyphLine.SetEnd(right - left); + glyphLine.SetGlyphs(new List(glyphs.SubList(left, right))); glyphLine.actualText = actualText == null ? null : new List(actualText.SubList(left, right)); return glyphLine; @@ -176,9 +212,9 @@ public virtual void Add(iText.IO.Font.Otf.GlyphLine other) { actualText.Add(null); } } - actualText.AddAll(other.actualText.SubList(other.start, other.end)); + actualText.AddAll(other.actualText.SubList(other.GetStart(), other.GetEnd())); } - glyphs.AddAll(other.glyphs.SubList(other.start, other.end)); + glyphs.AddAll(other.glyphs.SubList(other.GetStart(), other.GetEnd())); if (null != actualText) { while (actualText.Count < glyphs.Count) { actualText.Add(null); @@ -203,8 +239,8 @@ public virtual void ReplaceContent(iText.IO.Font.Otf.GlyphLine other) { else { actualText = null; } - start = other.start; - end = other.end; + start = other.GetStart(); + end = other.GetEnd(); } public virtual int Size() { @@ -214,8 +250,8 @@ public virtual int Size() { public virtual void SubstituteManyToOne(OpenTypeFontTableReader tableReader, int lookupFlag, int rightPartLen , int substitutionGlyphIndex) { OpenTableLookup.GlyphIndexer gidx = new OpenTableLookup.GlyphIndexer(); - gidx.line = this; - gidx.idx = idx; + gidx.SetLine(this); + gidx.SetIdx(idx); StringBuilder chars = new StringBuilder(); Glyph currentGlyph = glyphs[idx]; if (currentGlyph.GetChars() != null) { @@ -228,7 +264,7 @@ public virtual void SubstituteManyToOne(OpenTypeFontTableReader tableReader, int } for (int j = 0; j < rightPartLen; ++j) { gidx.NextGlyph(tableReader, lookupFlag); - currentGlyph = glyphs[gidx.idx]; + currentGlyph = glyphs[gidx.GetIdx()]; if (currentGlyph.GetChars() != null) { chars.Append(currentGlyph.GetChars()); } @@ -237,7 +273,8 @@ public virtual void SubstituteManyToOne(OpenTypeFontTableReader tableReader, int chars.Append(iText.IO.Util.TextUtil.ConvertFromUtf32(currentGlyph.GetUnicode())); } } - RemoveGlyph(gidx.idx--); + RemoveGlyph(gidx.GetIdx()); + gidx.SetIdx(gidx.GetIdx() - 1); } char[] newChars = new char[chars.Length]; chars.GetChars(0, chars.Length, newChars, 0); @@ -403,25 +440,87 @@ public interface IGlyphLineFilter { } public class GlyphLinePart { - public int start; + private int start; - public int end; + private int end; // Might be null if it's not necessary - public String actualText; + private String actualText; - public bool reversed; + private bool reversed; + /// Creates a glyph line part object with given start and end values. + /// + /// Creates a glyph line part object with given start and end values. + /// Actual text is set to null. + /// + /// start value of the glyph line part + /// end value of the glyph line part public GlyphLinePart(int start, int end) : this(start, end, null) { } + /// Creates a glyph line part object with given start, end and actual text values. + /// start value of the glyph line part + /// end value of the glyph line part + /// actual text public GlyphLinePart(int start, int end, String actualText) { this.start = start; this.end = end; this.actualText = actualText; } + /// Retrieves the start of the glyph line part. + /// start value of glyph line part + public virtual int GetStart() { + return start; + } + + /// Sets the start of the glyph line part. + /// start of the glyph line part + /// Altered glyph line part object + public virtual GlyphLine.GlyphLinePart SetStart(int start) { + this.start = start; + return this; + } + + /// Retrieves the end of the glyph line part. + /// end value of glyph line part + public virtual int GetEnd() { + return end; + } + + /// Sets the end of the glyph line part. + /// end value of glyph line part + /// Altered glyph line part object + public virtual GlyphLine.GlyphLinePart SetEnd(int end) { + this.end = end; + return this; + } + + /// Retrieves the actual text of the glyph line part. + /// Actual text of glyph line part + public virtual String GetActualText() { + return actualText; + } + + /// Sets the actual text of the glyph line part. + /// Actual text of glyph line part + /// Altered Glyph line part object + public virtual GlyphLine.GlyphLinePart SetActualText(String actualText) { + this.actualText = actualText; + return this; + } + + /// Retrieves whether the glyph line part is reversed. + /// True if it is reversed, false otherwise. + public virtual bool IsReversed() { + return reversed; + } + + /// Sets whether the glyph line part is reversed. + /// true if it should be reversed, false otherwise + /// Altered glyph line part object public virtual GlyphLine.GlyphLinePart SetReversed(bool reversed) { this.reversed = reversed; return this; @@ -429,12 +528,18 @@ public virtual GlyphLine.GlyphLinePart SetReversed(bool reversed) { } protected internal class ActualText { - public String value; + private readonly String value; public ActualText(String value) { this.value = value; } + /// Retrieves the value of the actual text. + /// actual text value + public virtual String GetValue() { + return value; + } + public override bool Equals(Object obj) { if (this == obj) { return true; @@ -443,7 +548,7 @@ public override bool Equals(Object obj) { return false; } GlyphLine.ActualText other = (GlyphLine.ActualText)obj; - return value == null && other.value == null || value.Equals(other.value); + return value == null && other.GetValue() == null || value.Equals(other.GetValue()); } public override int GetHashCode() { diff --git a/itext/itext.io/itext/io/font/otf/GposAnchor.cs b/itext/itext.io/itext/io/font/otf/GposAnchor.cs index dd1d8ea696..6a7ffb0824 100644 --- a/itext/itext.io/itext/io/font/otf/GposAnchor.cs +++ b/itext/itext.io/itext/io/font/otf/GposAnchor.cs @@ -22,16 +22,42 @@ You should have received a copy of the GNU Affero General Public License */ namespace iText.IO.Font.Otf { public class GposAnchor { - public int XCoordinate; + private int xCoordinate; - public int YCoordinate; + private int yCoordinate; public GposAnchor() { } + /// Creates a Gpos Anchor object based on a given Gpos Anchor object. + /// other Gpos Anchor object public GposAnchor(iText.IO.Font.Otf.GposAnchor other) { - this.XCoordinate = other.XCoordinate; - this.YCoordinate = other.YCoordinate; + this.xCoordinate = other.xCoordinate; + this.yCoordinate = other.yCoordinate; + } + + /// Retrieves the X coordinate of the Gpos Anchor. + /// X coordinate + public virtual int GetXCoordinate() { + return xCoordinate; + } + + /// Sets the x coordinate of the Gpos Anchor. + /// X coordinate + public virtual void SetXCoordinate(int xCoordinate) { + this.xCoordinate = xCoordinate; + } + + /// Retrieves the Y coordinate of the Gpos Anchor. + /// Y coordinate + public virtual int GetYCoordinate() { + return yCoordinate; + } + + /// Sets the Y coordinate of the Gpos Anchor. + /// Y coordinate + public virtual void SetYCoordinate(int yCoordinate) { + this.yCoordinate = yCoordinate; } } } diff --git a/itext/itext.io/itext/io/font/otf/GposLookupType1.cs b/itext/itext.io/itext/io/font/otf/GposLookupType1.cs index 74af241f5d..5ddfdbe21b 100644 --- a/itext/itext.io/itext/io/font/otf/GposLookupType1.cs +++ b/itext/itext.io/itext/io/font/otf/GposLookupType1.cs @@ -34,24 +34,24 @@ public GposLookupType1(OpenTypeFontTableReader openReader, int lookupFlag, int[] } public override bool TransformOne(GlyphLine line) { - if (line.idx >= line.end) { + if (line.GetIdx() >= line.GetEnd()) { return false; } - if (openReader.IsSkip(line.Get(line.idx).GetCode(), lookupFlag)) { - line.idx++; + if (openReader.IsSkip(line.Get(line.GetIdx()).GetCode(), lookupFlag)) { + line.SetIdx(line.GetIdx() + 1); return false; } - int glyphCode = line.Get(line.idx).GetCode(); + int glyphCode = line.Get(line.GetIdx()).GetCode(); bool positionApplied = false; GposValueRecord valueRecord = valueRecordMap.Get(glyphCode); if (valueRecord != null) { - Glyph newGlyph = new Glyph(line.Get(line.idx)); - newGlyph.SetXAdvance((short)(newGlyph.GetXAdvance() + valueRecord.XAdvance)); - newGlyph.SetYAdvance((short)(newGlyph.GetYAdvance() + valueRecord.YAdvance)); - line.Set(line.idx, newGlyph); + Glyph newGlyph = new Glyph(line.Get(line.GetIdx())); + newGlyph.SetXAdvance((short)(newGlyph.GetXAdvance() + valueRecord.GetXAdvance())); + newGlyph.SetYAdvance((short)(newGlyph.GetYAdvance() + valueRecord.GetYAdvance())); + line.Set(line.GetIdx(), newGlyph); positionApplied = true; } - line.idx++; + line.SetIdx(line.GetIdx() + 1); return positionApplied; } diff --git a/itext/itext.io/itext/io/font/otf/GposLookupType2.cs b/itext/itext.io/itext/io/font/otf/GposLookupType2.cs index 233b8a00cb..f70a45346e 100644 --- a/itext/itext.io/itext/io/font/otf/GposLookupType2.cs +++ b/itext/itext.io/itext/io/font/otf/GposLookupType2.cs @@ -36,11 +36,11 @@ public GposLookupType2(OpenTypeFontTableReader openReader, int lookupFlag, int[] } public override bool TransformOne(GlyphLine line) { - if (line.idx >= line.end) { + if (line.GetIdx() >= line.GetEnd()) { return false; } - if (openReader.IsSkip(line.Get(line.idx).GetCode(), lookupFlag)) { - line.idx++; + if (openReader.IsSkip(line.Get(line.GetIdx()).GetCode(), lookupFlag)) { + line.SetIdx(line.GetIdx() + 1); return false; } foreach (OpenTableLookup lookup in listRules) { @@ -48,7 +48,7 @@ public override bool TransformOne(GlyphLine line) { return true; } } - ++line.idx; + line.SetIdx(line.GetIdx() + 1); return false; } @@ -82,24 +82,24 @@ public PairPosAdjustmentFormat1(OpenTypeFontTableReader openReader, int lookupFl } public override bool TransformOne(GlyphLine line) { - if (line.idx >= line.end || line.idx < line.start) { + if (line.GetIdx() >= line.GetEnd() || line.GetIdx() < line.GetStart()) { return false; } bool changed = false; - Glyph g1 = line.Get(line.idx); + Glyph g1 = line.Get(line.GetIdx()); IDictionary m = gposMap.Get(g1.GetCode()); if (m != null) { OpenTableLookup.GlyphIndexer gi = new OpenTableLookup.GlyphIndexer(); - gi.line = line; - gi.idx = line.idx; + gi.SetLine(line); + gi.SetIdx(line.GetIdx()); gi.NextGlyph(openReader, lookupFlag); - if (gi.glyph != null) { - GposLookupType2.PairValueFormat pv = m.Get(gi.glyph.GetCode()); + if (gi.GetGlyph() != null) { + GposLookupType2.PairValueFormat pv = m.Get(gi.GetGlyph().GetCode()); if (pv != null) { - Glyph g2 = gi.glyph; - line.Set(line.idx, new Glyph(g1, 0, 0, pv.first.XAdvance, pv.first.YAdvance, 0)); - line.Set(gi.idx, new Glyph(g2, 0, 0, pv.second.XAdvance, pv.second.YAdvance, 0)); - line.idx = gi.idx; + Glyph g2 = gi.GetGlyph(); + line.Set(line.GetIdx(), new Glyph(g1, 0, 0, pv.GetFirst().GetXAdvance(), pv.GetFirst().GetYAdvance(), 0)); + line.Set(gi.GetIdx(), new Glyph(g2, 0, 0, pv.GetSecond().GetXAdvance(), pv.GetSecond().GetYAdvance(), 0)); + line.SetIdx(gi.GetIdx()); changed = true; } } @@ -123,8 +123,8 @@ protected internal virtual void ReadFormat(int subTableLocation) { for (int j = 0; j < pairValueCount; ++j) { int glyph2 = openReader.rf.ReadUnsignedShort(); GposLookupType2.PairValueFormat pair = new GposLookupType2.PairValueFormat(); - pair.first = OtfReadCommon.ReadGposValueRecord(openReader, valueFormat1); - pair.second = OtfReadCommon.ReadGposValueRecord(openReader, valueFormat2); + pair.SetFirst(OtfReadCommon.ReadGposValueRecord(openReader, valueFormat1)); + pair.SetSecond(OtfReadCommon.ReadGposValueRecord(openReader, valueFormat2)); pairs.Put(glyph2, pair); } } @@ -151,10 +151,10 @@ public PairPosAdjustmentFormat2(OpenTypeFontTableReader openReader, int lookupFl } public override bool TransformOne(GlyphLine line) { - if (line.idx >= line.end || line.idx < line.start) { + if (line.GetIdx() >= line.GetEnd() || line.GetIdx() < line.GetStart()) { return false; } - Glyph g1 = line.Get(line.idx); + Glyph g1 = line.Get(line.GetIdx()); if (!coverageSet.Contains(g1.GetCode())) { return false; } @@ -164,21 +164,21 @@ public override bool TransformOne(GlyphLine line) { return false; } OpenTableLookup.GlyphIndexer gi = new OpenTableLookup.GlyphIndexer(); - gi.line = line; - gi.idx = line.idx; + gi.SetLine(line); + gi.SetIdx(line.GetIdx()); gi.NextGlyph(openReader, lookupFlag); - if (gi.glyph == null) { + if (gi.GetGlyph() == null) { return false; } - Glyph g2 = gi.glyph; + Glyph g2 = gi.GetGlyph(); int c2 = classDef2.GetOtfClass(g2.GetCode()); if (c2 >= pvs.Length) { return false; } GposLookupType2.PairValueFormat pv = pvs[c2]; - line.Set(line.idx, new Glyph(g1, 0, 0, pv.first.XAdvance, pv.first.YAdvance, 0)); - line.Set(gi.idx, new Glyph(g2, 0, 0, pv.second.XAdvance, pv.second.YAdvance, 0)); - line.idx = gi.idx; + line.Set(line.GetIdx(), new Glyph(g1, 0, 0, pv.GetFirst().GetXAdvance(), pv.GetFirst().GetYAdvance(), 0)); + line.Set(gi.GetIdx(), new Glyph(g2, 0, 0, pv.GetSecond().GetXAdvance(), pv.GetSecond().GetYAdvance(), 0)); + line.SetIdx(gi.GetIdx()); return true; } @@ -195,8 +195,8 @@ protected internal virtual void ReadFormat(int subTableLocation) { posSubs.Put(k, pairs); for (int j = 0; j < class2Count; ++j) { GposLookupType2.PairValueFormat pair = new GposLookupType2.PairValueFormat(); - pair.first = OtfReadCommon.ReadGposValueRecord(openReader, valueFormat1); - pair.second = OtfReadCommon.ReadGposValueRecord(openReader, valueFormat2); + pair.SetFirst(OtfReadCommon.ReadGposValueRecord(openReader, valueFormat1)); + pair.SetSecond(OtfReadCommon.ReadGposValueRecord(openReader, valueFormat2)); pairs[j] = pair; } } @@ -211,9 +211,33 @@ protected internal override void ReadSubTable(int subTableLocation) { } private class PairValueFormat { - public GposValueRecord first; + private GposValueRecord first; - public GposValueRecord second; + private GposValueRecord second; + + /// Retrieves the first object of the pair. + /// first object + public virtual GposValueRecord GetFirst() { + return first; + } + + /// Sets the first object of the pair. + /// first object + public virtual void SetFirst(GposValueRecord first) { + this.first = first; + } + + /// Retrieves the second object of the pair. + /// second object + public virtual GposValueRecord GetSecond() { + return second; + } + + /// Sets the second object of the pair. + /// second object + public virtual void SetSecond(GposValueRecord second) { + this.second = second; + } } } } diff --git a/itext/itext.io/itext/io/font/otf/GposLookupType4.cs b/itext/itext.io/itext/io/font/otf/GposLookupType4.cs index 2a93f91b37..199bd00ab6 100644 --- a/itext/itext.io/itext/io/font/otf/GposLookupType4.cs +++ b/itext/itext.io/itext/io/font/otf/GposLookupType4.cs @@ -37,60 +37,61 @@ public GposLookupType4(OpenTypeFontTableReader openReader, int lookupFlag, int[] } public override bool TransformOne(GlyphLine line) { - if (line.idx >= line.end) { + if (line.GetIdx() >= line.GetEnd()) { return false; } - if (openReader.IsSkip(line.Get(line.idx).GetCode(), lookupFlag)) { - line.idx++; + if (openReader.IsSkip(line.Get(line.GetIdx()).GetCode(), lookupFlag)) { + line.SetIdx(line.GetIdx() + 1); return false; } bool changed = false; OpenTableLookup.GlyphIndexer gi = null; foreach (GposLookupType4.MarkToBase mb in marksbases) { - OtfMarkRecord omr = mb.marks.Get(line.Get(line.idx).GetCode()); + OtfMarkRecord omr = mb.marks.Get(line.Get(line.GetIdx()).GetCode()); if (omr == null) { continue; } if (gi == null) { gi = new OpenTableLookup.GlyphIndexer(); - gi.idx = line.idx; - gi.line = line; + gi.SetIdx(line.GetIdx()); + gi.SetLine(line); while (true) { gi.PreviousGlyph(openReader, lookupFlag); - if (gi.glyph == null) { + if (gi.GetGlyph() == null) { break; } // not mark => base glyph - if (openReader.GetGlyphClass(gi.glyph.GetCode()) != OtfClass.GLYPH_MARK) { + if (openReader.GetGlyphClass(gi.GetGlyph().GetCode()) != OtfClass.GLYPH_MARK) { break; } } - if (gi.glyph == null) { + if (gi.GetGlyph() == null) { break; } } - GposAnchor[] gpas = mb.bases.Get(gi.glyph.GetCode()); + GposAnchor[] gpas = mb.bases.Get(gi.GetGlyph().GetCode()); if (gpas == null) { continue; } - int markClass = omr.markClass; + int markClass = omr.GetMarkClass(); int xPlacement = 0; int yPlacement = 0; GposAnchor baseAnchor = gpas[markClass]; if (baseAnchor != null) { - xPlacement = baseAnchor.XCoordinate; - yPlacement = baseAnchor.YCoordinate; + xPlacement = baseAnchor.GetXCoordinate(); + yPlacement = baseAnchor.GetYCoordinate(); } - GposAnchor markAnchor = omr.anchor; + GposAnchor markAnchor = omr.GetAnchor(); if (markAnchor != null) { - xPlacement -= markAnchor.XCoordinate; - yPlacement -= markAnchor.YCoordinate; + xPlacement -= markAnchor.GetXCoordinate(); + yPlacement -= markAnchor.GetYCoordinate(); } - line.Set(line.idx, new Glyph(line.Get(line.idx), xPlacement, yPlacement, 0, 0, gi.idx - line.idx)); + line.Set(line.GetIdx(), new Glyph(line.Get(line.GetIdx()), xPlacement, yPlacement, 0, 0, gi.GetIdx() - line + .GetIdx())); changed = true; break; } - line.idx++; + line.SetIdx(line.GetIdx() + 1); return changed; } diff --git a/itext/itext.io/itext/io/font/otf/GposLookupType5.cs b/itext/itext.io/itext/io/font/otf/GposLookupType5.cs index be037e7a7c..925bed4d6e 100644 --- a/itext/itext.io/itext/io/font/otf/GposLookupType5.cs +++ b/itext/itext.io/itext/io/font/otf/GposLookupType5.cs @@ -37,43 +37,43 @@ public GposLookupType5(OpenTypeFontTableReader openReader, int lookupFlag, int[] } public override bool TransformOne(GlyphLine line) { - if (line.idx >= line.end) { + if (line.GetIdx() >= line.GetEnd()) { return false; } - if (openReader.IsSkip(line.Get(line.idx).GetCode(), lookupFlag)) { - line.idx++; + if (openReader.IsSkip(line.Get(line.GetIdx()).GetCode(), lookupFlag)) { + line.SetIdx(line.GetIdx() + 1); return false; } bool changed = false; OpenTableLookup.GlyphIndexer ligatureGlyphIndexer = null; foreach (GposLookupType5.MarkToLigature mb in marksligatures) { - OtfMarkRecord omr = mb.marks.Get(line.Get(line.idx).GetCode()); + OtfMarkRecord omr = mb.marks.Get(line.Get(line.GetIdx()).GetCode()); if (omr == null) { continue; } if (ligatureGlyphIndexer == null) { ligatureGlyphIndexer = new OpenTableLookup.GlyphIndexer(); - ligatureGlyphIndexer.idx = line.idx; - ligatureGlyphIndexer.line = line; + ligatureGlyphIndexer.SetIdx(line.GetIdx()); + ligatureGlyphIndexer.SetLine(line); while (true) { ligatureGlyphIndexer.PreviousGlyph(openReader, lookupFlag); - if (ligatureGlyphIndexer.glyph == null) { + if (ligatureGlyphIndexer.GetGlyph() == null) { break; } // not mark => ligature glyph - if (!mb.marks.ContainsKey(ligatureGlyphIndexer.glyph.GetCode())) { + if (!mb.marks.ContainsKey(ligatureGlyphIndexer.GetGlyph().GetCode())) { break; } } - if (ligatureGlyphIndexer.glyph == null) { + if (ligatureGlyphIndexer.GetGlyph() == null) { break; } } - IList componentAnchors = mb.ligatures.Get(ligatureGlyphIndexer.glyph.GetCode()); + IList componentAnchors = mb.ligatures.Get(ligatureGlyphIndexer.GetGlyph().GetCode()); if (componentAnchors == null) { continue; } - int markClass = omr.markClass; + int markClass = omr.GetMarkClass(); // TODO DEVSIX-3732 For complex cases like (glyph1, glyph2, mark, glyph3) and // (glyph1, mark, glyph2, glyph3) when the base glyphs compose a ligature and the mark // is attached to the ligature afterwards, mark should be placed in the corresponding anchor @@ -90,16 +90,17 @@ public override bool TransformOne(GlyphLine line) { for (int component = componentAnchors.Count - 1; component >= 0; component--) { if (componentAnchors[component][markClass] != null) { GposAnchor baseAnchor = componentAnchors[component][markClass]; - GposAnchor markAnchor = omr.anchor; - line.Set(line.idx, new Glyph(line.Get(line.idx), baseAnchor.XCoordinate - markAnchor.XCoordinate, baseAnchor - .YCoordinate - markAnchor.YCoordinate, 0, 0, ligatureGlyphIndexer.idx - line.idx)); + GposAnchor markAnchor = omr.GetAnchor(); + line.Set(line.GetIdx(), new Glyph(line.Get(line.GetIdx()), baseAnchor.GetXCoordinate() - markAnchor.GetXCoordinate + (), baseAnchor.GetYCoordinate() - markAnchor.GetYCoordinate(), 0, 0, ligatureGlyphIndexer.GetIdx() - line + .GetIdx())); changed = true; break; } } break; } - line.idx++; + line.SetIdx(line.GetIdx() + 1); return changed; } diff --git a/itext/itext.io/itext/io/font/otf/GposLookupType6.cs b/itext/itext.io/itext/io/font/otf/GposLookupType6.cs index b742391e83..7570908b12 100644 --- a/itext/itext.io/itext/io/font/otf/GposLookupType6.cs +++ b/itext/itext.io/itext/io/font/otf/GposLookupType6.cs @@ -37,31 +37,31 @@ public GposLookupType6(OpenTypeFontTableReader openReader, int lookupFlag, int[] } public override bool TransformOne(GlyphLine line) { - if (line.idx >= line.end) { + if (line.GetIdx() >= line.GetEnd()) { return false; } - if (openReader.IsSkip(line.Get(line.idx).GetCode(), lookupFlag)) { - line.idx++; + if (openReader.IsSkip(line.Get(line.GetIdx()).GetCode(), lookupFlag)) { + line.SetIdx(line.GetIdx() + 1); return false; } bool changed = false; OpenTableLookup.GlyphIndexer gi = null; foreach (GposLookupType6.MarkToBaseMark mb in marksbases) { - OtfMarkRecord omr = mb.marks.Get(line.Get(line.idx).GetCode()); + OtfMarkRecord omr = mb.marks.Get(line.Get(line.GetIdx()).GetCode()); if (omr == null) { continue; } if (gi == null) { gi = new OpenTableLookup.GlyphIndexer(); - gi.idx = line.idx; - gi.line = line; + gi.SetIdx(line.GetIdx()); + gi.SetLine(line); while (true) { - int prev = gi.idx; + int prev = gi.GetIdx(); // avoid attaching this mark glyph to another very distant mark glyph bool foundBaseGlyph = false; gi.PreviousGlyph(openReader, lookupFlag); - if (gi.idx != -1) { - for (int i = gi.idx; i < prev; i++) { + if (gi.GetIdx() != -1) { + for (int i = gi.GetIdx(); i < prev; i++) { if (openReader.GetGlyphClass(line.Get(i).GetCode()) == OtfClass.GLYPH_BASE) { foundBaseGlyph = true; break; @@ -69,33 +69,33 @@ public override bool TransformOne(GlyphLine line) { } } if (foundBaseGlyph) { - gi.glyph = null; + gi.SetGlyph(null); break; } - if (gi.glyph == null) { + if (gi.GetGlyph() == null) { break; } - if (mb.baseMarks.ContainsKey(gi.glyph.GetCode())) { + if (mb.baseMarks.ContainsKey(gi.GetGlyph().GetCode())) { break; } } - if (gi.glyph == null) { + if (gi.GetGlyph() == null) { break; } } - GposAnchor[] gpas = mb.baseMarks.Get(gi.glyph.GetCode()); + GposAnchor[] gpas = mb.baseMarks.Get(gi.GetGlyph().GetCode()); if (gpas == null) { continue; } - int markClass = omr.markClass; + int markClass = omr.GetMarkClass(); GposAnchor baseAnchor = gpas[markClass]; - GposAnchor markAnchor = omr.anchor; - line.Set(line.idx, new Glyph(line.Get(line.idx), -markAnchor.XCoordinate + baseAnchor.XCoordinate, -markAnchor - .YCoordinate + baseAnchor.YCoordinate, 0, 0, gi.idx - line.idx)); + GposAnchor markAnchor = omr.GetAnchor(); + line.Set(line.GetIdx(), new Glyph(line.Get(line.GetIdx()), -markAnchor.GetXCoordinate() + baseAnchor.GetXCoordinate + (), -markAnchor.GetYCoordinate() + baseAnchor.GetYCoordinate(), 0, 0, gi.GetIdx() - line.GetIdx())); changed = true; break; } - line.idx++; + line.SetIdx(line.GetIdx() + 1); return changed; } diff --git a/itext/itext.io/itext/io/font/otf/GposLookupType7.cs b/itext/itext.io/itext/io/font/otf/GposLookupType7.cs index 1c8f93648d..8e77cefca0 100644 --- a/itext/itext.io/itext/io/font/otf/GposLookupType7.cs +++ b/itext/itext.io/itext/io/font/otf/GposLookupType7.cs @@ -46,36 +46,36 @@ public GposLookupType7(OpenTypeFontTableReader openReader, int lookupFlag, int[] public override bool TransformOne(GlyphLine line) { bool changed = false; - int oldLineStart = line.start; - int oldLineEnd = line.end; - int initialLineIndex = line.idx; + int oldLineStart = line.GetStart(); + int oldLineEnd = line.GetEnd(); + int initialLineIndex = line.GetIdx(); foreach (ContextualTable subTable in subTables) { ContextualPositionRule contextRule = subTable.GetMatchingContextRule(line); if (contextRule == null) { continue; } - int lineEndBeforeTransformations = line.end; + int lineEndBeforeTransformations = line.GetEnd(); PosLookupRecord[] posLookupRecords = contextRule.GetPosLookupRecords(); OpenTableLookup.GlyphIndexer gidx = new OpenTableLookup.GlyphIndexer(); - gidx.line = line; + gidx.SetLine(line); foreach (PosLookupRecord posRecord in posLookupRecords) { // There could be some skipped glyphs inside the context sequence, therefore currently GlyphIndexer and // nextGlyph method are used to get to the glyph at "substRecord.sequenceIndex" index - gidx.idx = initialLineIndex; + gidx.SetIdx(initialLineIndex); for (int i = 0; i < posRecord.sequenceIndex; ++i) { gidx.NextGlyph(openReader, lookupFlag); } - line.idx = gidx.idx; + line.SetIdx(gidx.GetIdx()); OpenTableLookup lookupTable = openReader.GetLookupTable(posRecord.lookupListIndex); changed = lookupTable.TransformOne(line) || changed; } - line.idx = line.end; - line.start = oldLineStart; - int lenDelta = lineEndBeforeTransformations - line.end; - line.end = oldLineEnd - lenDelta; + line.SetIdx(line.GetEnd()); + line.SetStart(oldLineStart); + int lenDelta = lineEndBeforeTransformations - line.GetEnd(); + line.SetEnd(oldLineEnd - lenDelta); return changed; } - line.idx++; + line.SetIdx(line.GetIdx() + 1); return changed; } diff --git a/itext/itext.io/itext/io/font/otf/GposValueRecord.cs b/itext/itext.io/itext/io/font/otf/GposValueRecord.cs index b4244d8504..cb84269d27 100644 --- a/itext/itext.io/itext/io/font/otf/GposValueRecord.cs +++ b/itext/itext.io/itext/io/font/otf/GposValueRecord.cs @@ -22,12 +22,60 @@ You should have received a copy of the GNU Affero General Public License */ namespace iText.IO.Font.Otf { public class GposValueRecord { - public int XPlacement; + private int xPlacement; - public int YPlacement; + private int yPlacement; - public int XAdvance; + private int xAdvance; - public int YAdvance; + private int yAdvance; + + /// Retrieves the X placement of the Gpos value record. + /// X placement + public virtual int GetXPlacement() { + return xPlacement; + } + + /// Sets the X placement of the Gpos value record. + /// X placement + public virtual void SetXPlacement(int xPlacement) { + this.xPlacement = xPlacement; + } + + /// Retrieves the Y placement of the Gpos value record. + /// Y placement + public virtual int GetYPlacement() { + return yPlacement; + } + + /// Sets the Y placement of the Gpos value record. + /// Y placement + public virtual void SetYPlacement(int yPlacement) { + this.yPlacement = yPlacement; + } + + /// Retrieves the X advance of the Gpos value record. + /// x advance + public virtual int GetXAdvance() { + return xAdvance; + } + + /// Sets the X advance of the Gpos value record. + /// X advance + public virtual void SetXAdvance(int xAdvance) { + this.xAdvance = xAdvance; + } + + /// Retrieves the Y advance of the Gpos value record. + /// Y advance + public virtual int GetYAdvance() { + return yAdvance; + } + + /// Sets the Y advance of the Gpos value record. + /// Y advance + public virtual void SetYAdvance(int yAdvance) { + this.yAdvance = yAdvance; + } } } diff --git a/itext/itext.io/itext/io/font/otf/GsubLookupType1.cs b/itext/itext.io/itext/io/font/otf/GsubLookupType1.cs index b44d0b4040..795c25da95 100644 --- a/itext/itext.io/itext/io/font/otf/GsubLookupType1.cs +++ b/itext/itext.io/itext/io/font/otf/GsubLookupType1.cs @@ -35,10 +35,10 @@ public GsubLookupType1(OpenTypeFontTableReader openReader, int lookupFlag, int[] } public override bool TransformOne(GlyphLine line) { - if (line.idx >= line.end) { + if (line.GetIdx() >= line.GetEnd()) { return false; } - Glyph g = line.Get(line.idx); + Glyph g = line.Get(line.GetIdx()); bool changed = false; if (!openReader.IsSkip(g.GetCode(), lookupFlag)) { int substCode = substMap.Get(g.GetCode()); @@ -48,7 +48,7 @@ public override bool TransformOne(GlyphLine line) { changed = true; } } - line.idx++; + line.SetIdx(line.GetIdx() + 1); return changed; } diff --git a/itext/itext.io/itext/io/font/otf/GsubLookupType2.cs b/itext/itext.io/itext/io/font/otf/GsubLookupType2.cs index 72470dea84..4733c3b5c5 100644 --- a/itext/itext.io/itext/io/font/otf/GsubLookupType2.cs +++ b/itext/itext.io/itext/io/font/otf/GsubLookupType2.cs @@ -35,10 +35,10 @@ public GsubLookupType2(OpenTypeFontTableReader openReader, int lookupFlag, int[] } public override bool TransformOne(GlyphLine line) { - if (line.idx >= line.end) { + if (line.GetIdx() >= line.GetEnd()) { return false; } - Glyph g = line.Get(line.idx); + Glyph g = line.Get(line.GetIdx()); bool changed = false; if (!openReader.IsSkip(g.GetCode(), lookupFlag)) { int[] substSequence = substMap.Get(g.GetCode()); @@ -50,7 +50,7 @@ public override bool TransformOne(GlyphLine line) { } } } - line.idx++; + line.SetIdx(line.GetIdx() + 1); return changed; } diff --git a/itext/itext.io/itext/io/font/otf/GsubLookupType3.cs b/itext/itext.io/itext/io/font/otf/GsubLookupType3.cs index 3e56e0f64d..81c68acf9a 100644 --- a/itext/itext.io/itext/io/font/otf/GsubLookupType3.cs +++ b/itext/itext.io/itext/io/font/otf/GsubLookupType3.cs @@ -34,10 +34,10 @@ public GsubLookupType3(OpenTypeFontTableReader openReader, int lookupFlag, int[] } public override bool TransformOne(GlyphLine line) { - if (line.idx >= line.end) { + if (line.GetIdx() >= line.GetEnd()) { return false; } - Glyph g = line.Get(line.idx); + Glyph g = line.Get(line.GetIdx()); bool changed = false; if (!openReader.IsSkip(g.GetCode(), lookupFlag)) { int[] substCode = substMap.Get(g.GetCode()); @@ -47,7 +47,7 @@ public override bool TransformOne(GlyphLine line) { changed = true; } } - line.idx++; + line.SetIdx(line.GetIdx() + 1); return changed; } diff --git a/itext/itext.io/itext/io/font/otf/GsubLookupType4.cs b/itext/itext.io/itext/io/font/otf/GsubLookupType4.cs index 024d31d91f..aad802a410 100644 --- a/itext/itext.io/itext/io/font/otf/GsubLookupType4.cs +++ b/itext/itext.io/itext/io/font/otf/GsubLookupType4.cs @@ -39,22 +39,22 @@ public GsubLookupType4(OpenTypeFontTableReader openReader, int lookupFlag, int[] } public override bool TransformOne(GlyphLine line) { - if (line.idx >= line.end) { + if (line.GetIdx() >= line.GetEnd()) { return false; } bool changed = false; - Glyph g = line.Get(line.idx); + Glyph g = line.Get(line.GetIdx()); bool match = false; if (ligatures.ContainsKey(g.GetCode()) && !openReader.IsSkip(g.GetCode(), lookupFlag)) { OpenTableLookup.GlyphIndexer gidx = new OpenTableLookup.GlyphIndexer(); - gidx.line = line; + gidx.SetLine(line); IList ligs = ligatures.Get(g.GetCode()); foreach (int[] lig in ligs) { match = true; - gidx.idx = line.idx; + gidx.SetIdx(line.GetIdx()); for (int j = 1; j < lig.Length; ++j) { gidx.NextGlyph(openReader, lookupFlag); - if (gidx.glyph == null || gidx.glyph.GetCode() != lig[j]) { + if (gidx.GetGlyph() == null || gidx.GetGlyph().GetCode() != lig[j]) { match = false; break; } @@ -68,7 +68,7 @@ public override bool TransformOne(GlyphLine line) { if (match) { changed = true; } - line.idx++; + line.SetIdx(line.GetIdx() + 1); return changed; } diff --git a/itext/itext.io/itext/io/font/otf/GsubLookupType5.cs b/itext/itext.io/itext/io/font/otf/GsubLookupType5.cs index f461b1cad9..50bbd8e01e 100644 --- a/itext/itext.io/itext/io/font/otf/GsubLookupType5.cs +++ b/itext/itext.io/itext/io/font/otf/GsubLookupType5.cs @@ -38,36 +38,36 @@ protected internal GsubLookupType5(OpenTypeFontTableReader openReader, int looku public override bool TransformOne(GlyphLine line) { bool changed = false; - int oldLineStart = line.start; - int oldLineEnd = line.end; - int initialLineIndex = line.idx; + int oldLineStart = line.GetStart(); + int oldLineEnd = line.GetEnd(); + int initialLineIndex = line.GetIdx(); foreach (ContextualTable subTable in subTables) { ContextualSubstRule contextRule = subTable.GetMatchingContextRule(line); if (contextRule == null) { continue; } - int lineEndBeforeSubstitutions = line.end; + int lineEndBeforeSubstitutions = line.GetEnd(); SubstLookupRecord[] substLookupRecords = contextRule.GetSubstLookupRecords(); OpenTableLookup.GlyphIndexer gidx = new OpenTableLookup.GlyphIndexer(); - gidx.line = line; + gidx.SetLine(line); foreach (SubstLookupRecord substRecord in substLookupRecords) { // There could be some skipped glyphs inside the context sequence, therefore currently GlyphIndexer and // nextGlyph method are used to get to the glyph at "substRecord.sequenceIndex" index - gidx.idx = initialLineIndex; + gidx.SetIdx(initialLineIndex); for (int i = 0; i < substRecord.sequenceIndex; ++i) { gidx.NextGlyph(openReader, lookupFlag); } - line.idx = gidx.idx; + line.SetIdx(gidx.GetIdx()); OpenTableLookup lookupTable = openReader.GetLookupTable(substRecord.lookupListIndex); changed = lookupTable.TransformOne(line) || changed; } - line.idx = line.end; - line.start = oldLineStart; - int lenDelta = lineEndBeforeSubstitutions - line.end; - line.end = oldLineEnd - lenDelta; + line.SetIdx(line.GetEnd()); + line.SetStart(oldLineStart); + int lenDelta = lineEndBeforeSubstitutions - line.GetEnd(); + line.SetEnd(oldLineEnd - lenDelta); return changed; } - ++line.idx; + line.SetIdx(line.GetIdx() + 1); return changed; } diff --git a/itext/itext.io/itext/io/font/otf/LanguageRecord.cs b/itext/itext.io/itext/io/font/otf/LanguageRecord.cs index be96e2a259..4f1765919f 100644 --- a/itext/itext.io/itext/io/font/otf/LanguageRecord.cs +++ b/itext/itext.io/itext/io/font/otf/LanguageRecord.cs @@ -24,10 +24,46 @@ You should have received a copy of the GNU Affero General Public License namespace iText.IO.Font.Otf { public class LanguageRecord { - public String tag; + private String tag; - public int featureRequired; + private int featureRequired; - public int[] features; + private int[] features; + + /// Retrieves the tag of the language record. + /// tag of record + public virtual String GetTag() { + return tag; + } + + /// Sets the tag of the language record. + /// tag of record + public virtual void SetTag(String tag) { + this.tag = tag; + } + + /// Retrieves the feature required of the language record. + /// feature required + public virtual int GetFeatureRequired() { + return featureRequired; + } + + /// Sets the feature required of the language record. + /// feature required + public virtual void SetFeatureRequired(int featureRequired) { + this.featureRequired = featureRequired; + } + + /// Retrieves the features of the language record. + /// features + public virtual int[] GetFeatures() { + return features; + } + + /// Sets the features of the language record. + /// features + public virtual void SetFeatures(int[] features) { + this.features = features; + } } } diff --git a/itext/itext.io/itext/io/font/otf/OpenTableLookup.cs b/itext/itext.io/itext/io/font/otf/OpenTableLookup.cs index 094795aff2..db9864a1f4 100644 --- a/itext/itext.io/itext/io/font/otf/OpenTableLookup.cs +++ b/itext/itext.io/itext/io/font/otf/OpenTableLookup.cs @@ -43,8 +43,8 @@ public virtual int GetLookupFlag() { public virtual bool TransformLine(GlyphLine line) { bool changed = false; - line.idx = line.start; - while (line.idx < line.end && line.idx >= line.start) { + line.SetIdx(line.GetStart()); + while (line.GetIdx() < line.GetEnd() && line.GetIdx() >= line.GetStart()) { changed = TransformOne(line) || changed; } return changed; @@ -63,15 +63,51 @@ protected internal virtual void ReadSubTables() { protected internal abstract void ReadSubTable(int subTableLocation); public class GlyphIndexer { - public GlyphLine line; + private GlyphLine line; - public Glyph glyph; + private Glyph glyph; - public int idx; + private int idx; + + /// Retrieves the glyph line of the object. + /// glyph line + public virtual GlyphLine GetLine() { + return line; + } + + /// Sets the glyph line of the object. + /// glyph line + public virtual void SetLine(GlyphLine line) { + this.line = line; + } + + /// Retrieves the glyph of the object. + /// glyph + public virtual Glyph GetGlyph() { + return glyph; + } + + /// Sets the glyph of the object. + /// glyph + public virtual void SetGlyph(Glyph glyph) { + this.glyph = glyph; + } + + /// Retrieves the idx of the glyph indexer. + /// idx + public virtual int GetIdx() { + return idx; + } + + /// Sets the idx of the glyph indexer. + /// idx + public virtual void SetIdx(int idx) { + this.idx = idx; + } public virtual void NextGlyph(OpenTypeFontTableReader openReader, int lookupFlag) { glyph = null; - while (++idx < line.end) { + while (++idx < line.GetEnd()) { Glyph g = line.Get(idx); if (!openReader.IsSkip(g.GetCode(), lookupFlag)) { glyph = g; @@ -82,7 +118,7 @@ public virtual void NextGlyph(OpenTypeFontTableReader openReader, int lookupFlag public virtual void PreviousGlyph(OpenTypeFontTableReader openReader, int lookupFlag) { glyph = null; - while (--idx >= line.start) { + while (--idx >= line.GetStart()) { Glyph g = line.Get(idx); if (!openReader.IsSkip(g.GetCode(), lookupFlag)) { glyph = g; diff --git a/itext/itext.io/itext/io/font/otf/OpenTypeFeature.cs b/itext/itext.io/itext/io/font/otf/OpenTypeFeature.cs index 9c252ff3ac..7c5befbb76 100644 --- a/itext/itext.io/itext/io/font/otf/OpenTypeFeature.cs +++ b/itext/itext.io/itext/io/font/otf/OpenTypeFeature.cs @@ -35,11 +35,11 @@ public OpenTypeFeature(OpenTypeFontTableReader openTypeReader, int locationFeatu TagAndLocation[] tagsLocs = openTypeReader.ReadTagAndLocations(locationFeatureTable); foreach (TagAndLocation tagLoc in tagsLocs) { // +2 don't use FeatureParams - openTypeReader.rf.Seek(tagLoc.location + 2L); + openTypeReader.rf.Seek(tagLoc.GetLocation() + 2L); int lookupCount = openTypeReader.rf.ReadUnsignedShort(); FeatureRecord rec = new FeatureRecord(); - rec.tag = tagLoc.tag; - rec.lookups = openTypeReader.ReadUShortArray(lookupCount); + rec.SetTag(tagLoc.GetTag()); + rec.SetLookups(openTypeReader.ReadUShortArray(lookupCount)); records.Add(rec); } } diff --git a/itext/itext.io/itext/io/font/otf/OpenTypeFontTableReader.cs b/itext/itext.io/itext/io/font/otf/OpenTypeFontTableReader.cs index 5de2b09faf..9603cf9ccc 100644 --- a/itext/itext.io/itext/io/font/otf/OpenTypeFontTableReader.cs +++ b/itext/itext.io/itext/io/font/otf/OpenTypeFontTableReader.cs @@ -77,7 +77,7 @@ public virtual IList GetFeatures(String[] scripts, String languag return null; } IList ret = new List(); - foreach (int f in rec.features) { + foreach (int f in rec.GetFeatures()) { ret.Add(featuresType.GetRecord(f)); } return ret; @@ -94,7 +94,7 @@ public virtual IList GetSpecificFeatures(IList fea } IList recs = new List(); foreach (FeatureRecord rec in features) { - if (hs.Contains(rec.tag)) { + if (hs.Contains(rec.GetTag())) { recs.Add(rec); } } @@ -106,13 +106,13 @@ public virtual FeatureRecord GetRequiredFeature(String[] scripts, String languag if (rec == null) { return null; } - return featuresType.GetRecord(rec.featureRequired); + return featuresType.GetRecord(rec.GetFeatureRequired()); } public virtual IList GetLookups(FeatureRecord[] features) { IntHashtable hash = new IntHashtable(); foreach (FeatureRecord rec in features) { - foreach (int idx in rec.lookups) { + foreach (int idx in rec.GetLookups()) { hash.Put(idx, 1); } } @@ -124,8 +124,8 @@ public virtual IList GetLookups(FeatureRecord[] features) { } public virtual IList GetLookups(FeatureRecord feature) { - IList ret = new List(feature.lookups.Length); - foreach (int idx in feature.lookups) { + IList ret = new List(feature.GetLookups().Length); + foreach (int idx in feature.GetLookups()) { ret.Add(lookupList[idx]); } return ret; @@ -152,14 +152,14 @@ public virtual LanguageRecord GetLanguageRecord(String otfScriptTag, String lang return null; } foreach (ScriptRecord record in GetScriptRecords()) { - if (!otfScriptTag.Equals(record.tag)) { + if (!otfScriptTag.Equals(record.GetTag())) { continue; } if (langTag == null) { - return record.defaultLanguage; + return record.GetDefaultLanguage(); } - foreach (LanguageRecord lang in record.languages) { - if (langTag.Equals(lang.tag)) { + foreach (LanguageRecord lang in record.GetLanguages()) { + if (langTag.Equals(lang.GetTag())) { return lang; } } @@ -203,8 +203,8 @@ protected internal virtual TagAndLocation[] ReadTagAndLocations(int baseLocation TagAndLocation[] tagslLocs = new TagAndLocation[count]; for (int k = 0; k < count; ++k) { TagAndLocation tl = new TagAndLocation(); - tl.tag = rf.ReadString(4, "utf-8"); - tl.location = rf.ReadUnsignedShort() + baseLocation; + tl.SetTag(rf.ReadString(4, "utf-8")); + tl.SetLocation(rf.ReadUnsignedShort() + baseLocation); tagslLocs[k] = tl; } return tagslLocs; diff --git a/itext/itext.io/itext/io/font/otf/OpenTypeScript.cs b/itext/itext.io/itext/io/font/otf/OpenTypeScript.cs index 01a7cefed3..51d2a46feb 100644 --- a/itext/itext.io/itext/io/font/otf/OpenTypeScript.cs +++ b/itext/itext.io/itext/io/font/otf/OpenTypeScript.cs @@ -49,14 +49,14 @@ public virtual LanguageRecord GetLanguageRecord(String[] scripts, String languag ScriptRecord scriptFound = null; ScriptRecord scriptDefault = null; foreach (ScriptRecord sr in records) { - if (DEFAULT_SCRIPT.Equals(sr.tag)) { + if (DEFAULT_SCRIPT.Equals(sr.GetTag())) { scriptDefault = sr; break; } } foreach (String script in scripts) { foreach (ScriptRecord sr in records) { - if (sr.tag.Equals(script)) { + if (sr.GetTag().Equals(script)) { scriptFound = sr; break; } @@ -75,36 +75,38 @@ public virtual LanguageRecord GetLanguageRecord(String[] scripts, String languag return null; } LanguageRecord lang = null; - foreach (LanguageRecord lr in scriptFound.languages) { - if (lr.tag.Equals(language)) { + foreach (LanguageRecord lr in scriptFound.GetLanguages()) { + if (lr.GetTag().Equals(language)) { lang = lr; break; } } if (lang == null) { - lang = scriptFound.defaultLanguage; + lang = scriptFound.GetDefaultLanguage(); } return lang; } private void ReadScriptRecord(TagAndLocation tagLoc) { - openTypeReader.rf.Seek(tagLoc.location); + openTypeReader.rf.Seek(tagLoc.GetLocation()); int locationDefaultLanguage = openTypeReader.rf.ReadUnsignedShort(); if (locationDefaultLanguage > 0) { - locationDefaultLanguage += tagLoc.location; + locationDefaultLanguage += tagLoc.GetLocation(); } - TagAndLocation[] tagsLocs = openTypeReader.ReadTagAndLocations(tagLoc.location); + TagAndLocation[] tagsLocs = openTypeReader.ReadTagAndLocations(tagLoc.GetLocation()); ScriptRecord srec = new ScriptRecord(); - srec.tag = tagLoc.tag; - srec.languages = new LanguageRecord[tagsLocs.Length]; + srec.SetTag(tagLoc.GetTag()); + srec.SetLanguages(new LanguageRecord[tagsLocs.Length]); for (int k = 0; k < tagsLocs.Length; ++k) { - srec.languages[k] = ReadLanguageRecord(tagsLocs[k]); + LanguageRecord[] languages = srec.GetLanguages(); + languages[k] = ReadLanguageRecord(tagsLocs[k]); + srec.SetLanguages(languages); } if (locationDefaultLanguage > 0) { TagAndLocation t = new TagAndLocation(); - t.tag = ""; - t.location = locationDefaultLanguage; - srec.defaultLanguage = ReadLanguageRecord(t); + t.SetTag(""); + t.SetLocation(locationDefaultLanguage); + srec.SetDefaultLanguage(ReadLanguageRecord(t)); } records.Add(srec); } @@ -112,11 +114,11 @@ private void ReadScriptRecord(TagAndLocation tagLoc) { private LanguageRecord ReadLanguageRecord(TagAndLocation tagLoc) { LanguageRecord rec = new LanguageRecord(); //skip lookup order - openTypeReader.rf.Seek(tagLoc.location + 2); - rec.featureRequired = openTypeReader.rf.ReadUnsignedShort(); + openTypeReader.rf.Seek(tagLoc.GetLocation() + 2L); + rec.SetFeatureRequired(openTypeReader.rf.ReadUnsignedShort()); int count = openTypeReader.rf.ReadUnsignedShort(); - rec.features = openTypeReader.ReadUShortArray(count); - rec.tag = tagLoc.tag; + rec.SetFeatures(openTypeReader.ReadUShortArray(count)); + rec.SetTag(tagLoc.GetTag()); return rec; } } diff --git a/itext/itext.io/itext/io/font/otf/OtfMarkRecord.cs b/itext/itext.io/itext/io/font/otf/OtfMarkRecord.cs index c68aa08220..a8c2cb0003 100644 --- a/itext/itext.io/itext/io/font/otf/OtfMarkRecord.cs +++ b/itext/itext.io/itext/io/font/otf/OtfMarkRecord.cs @@ -22,8 +22,32 @@ You should have received a copy of the GNU Affero General Public License */ namespace iText.IO.Font.Otf { public class OtfMarkRecord { - public int markClass; + private int markClass; - public GposAnchor anchor; + private GposAnchor anchor; + + /// Retrieves the mark class of the OtfMarkRecord. + /// mark class + public virtual int GetMarkClass() { + return markClass; + } + + /// Sets the mark class of the OtfMarkRecord. + /// mark class + public virtual void SetMarkClass(int markClass) { + this.markClass = markClass; + } + + /// Retrieves the anchor of the OtfMarkRecord. + /// anchor + public virtual GposAnchor GetAnchor() { + return anchor; + } + + /// Sets the anchor of the OtfMarkRecord. + /// anchor + public virtual void SetAnchor(GposAnchor anchor) { + this.anchor = anchor; + } } } diff --git a/itext/itext.io/itext/io/font/otf/OtfReadCommon.cs b/itext/itext.io/itext/io/font/otf/OtfReadCommon.cs index 21e1035a59..2368ac1214 100644 --- a/itext/itext.io/itext/io/font/otf/OtfReadCommon.cs +++ b/itext/itext.io/itext/io/font/otf/OtfReadCommon.cs @@ -87,20 +87,20 @@ private static void ReadRangeRecord(RandomAccessFileOrArray rf, IList glyph public static GposValueRecord ReadGposValueRecord(OpenTypeFontTableReader tableReader, int mask) { GposValueRecord vr = new GposValueRecord(); if ((mask & 0x0001) != 0) { - vr.XPlacement = FontProgram.ConvertGlyphSpaceToTextSpace(tableReader.rf.ReadShort()) / tableReader.GetUnitsPerEm - (); + vr.SetXPlacement(FontProgram.ConvertGlyphSpaceToTextSpace(tableReader.rf.ReadShort()) / tableReader.GetUnitsPerEm + ()); } if ((mask & 0x0002) != 0) { - vr.YPlacement = FontProgram.ConvertGlyphSpaceToTextSpace(tableReader.rf.ReadShort()) / tableReader.GetUnitsPerEm - (); + vr.SetYPlacement(FontProgram.ConvertGlyphSpaceToTextSpace(tableReader.rf.ReadShort()) / tableReader.GetUnitsPerEm + ()); } if ((mask & 0x0004) != 0) { - vr.XAdvance = FontProgram.ConvertGlyphSpaceToTextSpace(tableReader.rf.ReadShort()) / tableReader.GetUnitsPerEm - (); + vr.SetXAdvance(FontProgram.ConvertGlyphSpaceToTextSpace(tableReader.rf.ReadShort()) / tableReader.GetUnitsPerEm + ()); } if ((mask & 0x0008) != 0) { - vr.YAdvance = FontProgram.ConvertGlyphSpaceToTextSpace(tableReader.rf.ReadShort()) / tableReader.GetUnitsPerEm - (); + vr.SetYAdvance(FontProgram.ConvertGlyphSpaceToTextSpace(tableReader.rf.ReadShort()) / tableReader.GetUnitsPerEm + ()); } if ((mask & 0x0010) != 0) { tableReader.rf.Skip(2); @@ -127,10 +127,10 @@ public static GposAnchor ReadGposAnchor(OpenTypeFontTableReader tableReader, int switch (format) { default: { t = new GposAnchor(); - t.XCoordinate = FontProgram.ConvertGlyphSpaceToTextSpace(tableReader.rf.ReadShort()) / tableReader.GetUnitsPerEm - (); - t.YCoordinate = FontProgram.ConvertGlyphSpaceToTextSpace(tableReader.rf.ReadShort()) / tableReader.GetUnitsPerEm - (); + t.SetXCoordinate(FontProgram.ConvertGlyphSpaceToTextSpace(tableReader.rf.ReadShort()) / tableReader.GetUnitsPerEm + ()); + t.SetYCoordinate(FontProgram.ConvertGlyphSpaceToTextSpace(tableReader.rf.ReadShort()) / tableReader.GetUnitsPerEm + ()); break; } } @@ -150,8 +150,8 @@ public static IList ReadMarkArray(OpenTypeFontTableReader tableRe IList marks = new List(); for (int k = 0; k < markCount; ++k) { OtfMarkRecord rec = new OtfMarkRecord(); - rec.markClass = classes[k]; - rec.anchor = ReadGposAnchor(tableReader, locations[k]); + rec.SetMarkClass(classes[k]); + rec.SetAnchor(ReadGposAnchor(tableReader, locations[k])); marks.Add(rec); } return marks; diff --git a/itext/itext.io/itext/io/font/otf/ScriptRecord.cs b/itext/itext.io/itext/io/font/otf/ScriptRecord.cs index 8af70bc8f9..226019200c 100644 --- a/itext/itext.io/itext/io/font/otf/ScriptRecord.cs +++ b/itext/itext.io/itext/io/font/otf/ScriptRecord.cs @@ -24,10 +24,46 @@ You should have received a copy of the GNU Affero General Public License namespace iText.IO.Font.Otf { public class ScriptRecord { - public String tag; + private String tag; - public LanguageRecord defaultLanguage; + private LanguageRecord defaultLanguage; - public LanguageRecord[] languages; + private LanguageRecord[] languages; + + /// Retrieves the tag of the Script Record. + /// tag of record + public virtual String GetTag() { + return tag; + } + + /// Sets the tag of the Script Record. + /// tag of record + public virtual void SetTag(String tag) { + this.tag = tag; + } + + /// Retrieves the default language of the Script Record. + /// default language + public virtual LanguageRecord GetDefaultLanguage() { + return defaultLanguage; + } + + /// Sets the default language of the Script Record. + /// default language + public virtual void SetDefaultLanguage(LanguageRecord defaultLanguage) { + this.defaultLanguage = defaultLanguage; + } + + /// Retrieves the languages of the Script Record. + /// languages + public virtual LanguageRecord[] GetLanguages() { + return languages; + } + + /// Sets the languages of the Script Record. + /// languages + public virtual void SetLanguages(LanguageRecord[] languages) { + this.languages = languages; + } } } diff --git a/itext/itext.io/itext/io/font/otf/TagAndLocation.cs b/itext/itext.io/itext/io/font/otf/TagAndLocation.cs index dc1af5a499..f68b704d5a 100644 --- a/itext/itext.io/itext/io/font/otf/TagAndLocation.cs +++ b/itext/itext.io/itext/io/font/otf/TagAndLocation.cs @@ -24,8 +24,32 @@ You should have received a copy of the GNU Affero General Public License namespace iText.IO.Font.Otf { public class TagAndLocation { - public String tag; + private String tag; - public int location; + private int location; + + /// Retrieves the tag of the object. + /// tag + public virtual String GetTag() { + return tag; + } + + /// Sets the tag of the object. + /// tag + public virtual void SetTag(String tag) { + this.tag = tag; + } + + /// Retrieves the location of the object. + /// location + public virtual int GetLocation() { + return location; + } + + /// Sets the location of the object. + /// location + public virtual void SetLocation(int location) { + this.location = location; + } } } diff --git a/itext/itext.io/itext/io/image/Jbig2ImageHelper.cs b/itext/itext.io/itext/io/image/Jbig2ImageHelper.cs index e7184b6997..806f5872b3 100644 --- a/itext/itext.io/itext/io/image/Jbig2ImageHelper.cs +++ b/itext/itext.io/itext/io/image/Jbig2ImageHelper.cs @@ -64,8 +64,8 @@ public static void ProcessImage(ImageData jbig2) { sr.Read(); Jbig2SegmentReader.Jbig2Page p = sr.GetPage(image.GetPage()); raf.Close(); - image.SetHeight(p.pageBitmapHeight); - image.SetWidth(p.pageBitmapWidth); + image.SetHeight(p.GetPageBitmapHeight()); + image.SetWidth(p.GetPageBitmapWidth()); image.SetBpc(1); image.SetColorEncodingComponentsNumber(1); byte[] globals = sr.GetGlobal(true); diff --git a/itext/itext.io/itext/io/image/Jpeg2000ImageData.cs b/itext/itext.io/itext/io/image/Jpeg2000ImageData.cs index d2ebfae3a7..5dd638aadb 100644 --- a/itext/itext.io/itext/io/image/Jpeg2000ImageData.cs +++ b/itext/itext.io/itext/io/image/Jpeg2000ImageData.cs @@ -28,15 +28,75 @@ You should have received a copy of the GNU Affero General Public License namespace iText.IO.Image { public class Jpeg2000ImageData : ImageData { public class Parameters { - public int numOfComps; + private int numOfComps; - public IList colorSpecBoxes = null; + private IList colorSpecBoxes = null; - public bool isJp2 = false; + private bool isJp2 = false; - public bool isJpxBaseline = false; + private bool isJpxBaseline = false; - public byte[] bpcBoxData; + private byte[] bpcBoxData; + + /// Retrieves number of components of the object. + /// number of components + public virtual int GetNumOfComps() { + return numOfComps; + } + + /// Sets number of components of the object. + /// number of components + public virtual void SetNumOfComps(int numOfComps) { + this.numOfComps = numOfComps; + } + + /// Retrieves the color spec boxes of the object. + /// color spec boxes + public virtual IList GetColorSpecBoxes() { + return colorSpecBoxes; + } + + /// Sets the color spec boxes of the object. + /// color spec boxes + public virtual void SetColorSpecBoxes(IList colorSpecBoxes) { + this.colorSpecBoxes = colorSpecBoxes; + } + + /// Retrieves whether the object is a Jp2. + /// true if it is a jp2, otherwise false + public virtual bool IsJp2() { + return isJp2; + } + + /// Sets whether the object is a jp2. + /// true is it is a jp2, otherwise false + public virtual void SetJp2(bool jp2) { + isJp2 = jp2; + } + + /// Retrieves whether jpx is baseline. + /// true if jpx is baseline, false otherwise + public virtual bool IsJpxBaseline() { + return isJpxBaseline; + } + + /// Sets whether jpx is baseline. + /// true if jpx is baseline, false otherwise + public virtual void SetJpxBaseline(bool jpxBaseline) { + isJpxBaseline = jpxBaseline; + } + + /// Retrieves the bits per component of the box data. + /// bits per component + public virtual byte[] GetBpcBoxData() { + return bpcBoxData; + } + + /// Sets the bits per component of the box data. + /// bits per component + public virtual void SetBpcBoxData(byte[] bpcBoxData) { + this.bpcBoxData = bpcBoxData; + } } public class ColorSpecBox : List { diff --git a/itext/itext.io/itext/io/image/Jpeg2000ImageHelper.cs b/itext/itext.io/itext/io/image/Jpeg2000ImageHelper.cs index 3ec2a12274..aeef16bc02 100644 --- a/itext/itext.io/itext/io/image/Jpeg2000ImageHelper.cs +++ b/itext/itext.io/itext/io/image/Jpeg2000ImageHelper.cs @@ -90,7 +90,7 @@ private static void ProcessParameters(Jpeg2000ImageData jp2) { Jpeg2000ImageHelper.Jpeg2000Box box = new Jpeg2000ImageHelper.Jpeg2000Box(); box.length = Cio_read(4, jpeg2000Stream); if (box.length == 0x0000000c) { - jp2.parameters.isJp2 = true; + jp2.parameters.SetJp2(true); box.type = Cio_read(4, jpeg2000Stream); if (JP2_JP != box.type) { throw new iText.IO.Exceptions.IOException(IoExceptionMessageConstant.EXPECTED_JP_MARKER); @@ -105,7 +105,7 @@ private static void ProcessParameters(Jpeg2000ImageData jp2) { StreamUtil.Skip(jpeg2000Stream, 8); for (int i = 4; i < box.length / 4; ++i) { if (Cio_read(4, jpeg2000Stream) == JPX_JPXB) { - jp2.parameters.isJpxBaseline = true; + jp2.parameters.SetJpxBaseline(true); } } Jp2_read_boxhdr(box, jpeg2000Stream); @@ -125,21 +125,23 @@ private static void ProcessParameters(Jpeg2000ImageData jp2) { } jp2.SetHeight(Cio_read(4, jpeg2000Stream)); jp2.SetWidth(Cio_read(4, jpeg2000Stream)); - jp2.parameters.numOfComps = Cio_read(2, jpeg2000Stream); + jp2.parameters.SetNumOfComps(Cio_read(2, jpeg2000Stream)); jp2.SetBpc(Cio_read(1, jpeg2000Stream)); StreamUtil.Skip(jpeg2000Stream, 3); Jp2_read_boxhdr(box, jpeg2000Stream); if (box.type == JP2_BPCC) { - jp2.parameters.bpcBoxData = new byte[box.length - 8]; - jpeg2000Stream.JRead(jp2.parameters.bpcBoxData, 0, box.length - 8); + jp2.parameters.SetBpcBoxData(new byte[box.length - 8]); + jpeg2000Stream.JRead(jp2.parameters.GetBpcBoxData(), 0, box.length - 8); } else { if (box.type == JP2_COLR) { do { - if (jp2.parameters.colorSpecBoxes == null) { - jp2.parameters.colorSpecBoxes = new List(); + if (jp2.parameters.GetColorSpecBoxes() == null) { + jp2.parameters.SetColorSpecBoxes(new List()); } - jp2.parameters.colorSpecBoxes.Add(Jp2_read_colr(box, jpeg2000Stream)); + IList colorSpecBoxes = jp2.parameters.GetColorSpecBoxes(); + colorSpecBoxes.Add(Jp2_read_colr(box, jpeg2000Stream)); + jp2.parameters.SetColorSpecBoxes(colorSpecBoxes); try { Jp2_read_boxhdr(box, jpeg2000Stream); } diff --git a/itext/itext.io/itext/io/source/PdfTokenizer.cs b/itext/itext.io/itext/io/source/PdfTokenizer.cs index 18956ad71c..751b79d67b 100644 --- a/itext/itext.io/itext/io/source/PdfTokenizer.cs +++ b/itext/itext.io/itext/io/source/PdfTokenizer.cs @@ -45,25 +45,6 @@ public enum TokenType { EndOfFile } - public static readonly bool[] delims = new bool[] { true, true, false, false, false, false, false, false, - false, false, true, true, false, true, true, false, false, false, false, false, false, false, false, false - , false, false, false, false, false, false, false, false, false, true, false, false, false, false, true - , false, false, true, true, false, false, false, false, false, true, false, false, false, false, false - , false, false, false, false, false, false, false, true, false, true, false, false, false, false, false - , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false - , false, false, false, false, false, false, false, false, true, false, true, false, false, false, false - , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false - , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false - , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false - , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false - , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false - , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false - , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false - , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false - , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false - , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false - , false, false, false, false, false, false, false, false }; - public static readonly byte[] Obj = ByteUtils.GetIsoBytes("obj"); public static readonly byte[] R = ByteUtils.GetIsoBytes("R"); @@ -101,6 +82,25 @@ public enum TokenType { /// Streams are closed automatically. private bool closeStream = true; + private static readonly bool[] delims = new bool[] { true, true, false, false, false, false, false, false, + false, false, true, true, false, true, true, false, false, false, false, false, false, false, false, false + , false, false, false, false, false, false, false, false, false, true, false, false, false, false, true + , false, false, true, true, false, false, false, false, false, true, false, false, false, false, false + , false, false, false, false, false, false, false, true, false, true, false, false, false, false, false + , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false + , false, false, false, false, false, false, false, false, true, false, true, false, false, false, false + , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false + , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false + , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false + , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false + , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false + , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false + , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false + , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false + , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false + , false, false, false, false, false, false, false, false, false, false, false, false, false, false, false + , false, false, false, false, false, false, false, false }; + /// /// Creates a PdfTokenizer for the specified /// . diff --git a/itext/itext.io/itext/io/source/RandomAccessFileOrArray.cs b/itext/itext.io/itext/io/source/RandomAccessFileOrArray.cs index fe74dc9294..ae444331cf 100644 --- a/itext/itext.io/itext/io/source/RandomAccessFileOrArray.cs +++ b/itext/itext.io/itext/io/source/RandomAccessFileOrArray.cs @@ -28,13 +28,6 @@ You should have received a copy of the GNU Affero General Public License namespace iText.IO.Source { /// Class that is used to unify reading from random access files and arrays. public class RandomAccessFileOrArray { - /// When true the file access is not done through a memory mapped file. - /// - /// When true the file access is not done through a memory mapped file. Use it if the file - /// is too big to be mapped in your address space. - /// - public static bool plainRandomAccess = false; - /// The source that backs this object private IRandomAccessSource byteSource; diff --git a/itext/itext.kernel/itext/kernel/font/FontUtil.cs b/itext/itext.kernel/itext/kernel/font/FontUtil.cs index 1ca1e19d96..5701f5f47a 100644 --- a/itext/itext.kernel/itext/kernel/font/FontUtil.cs +++ b/itext/itext.kernel/itext/kernel/font/FontUtil.cs @@ -67,7 +67,7 @@ internal static CMapToUnicode ProcessToUnicode(PdfObject toUnicode) { } catch (Exception e) { LOGGER.LogError(e, iText.IO.Logs.IoLogMessageConstant.UNKNOWN_ERROR_WHILE_PROCESSING_CMAP); - cMapToUnicode = CMapToUnicode.EmptyCMapToUnicodeMap; + cMapToUnicode = CMapToUnicode.EMPTY_CMAP; } } else { diff --git a/itext/itext.kernel/itext/kernel/font/PdfSimpleFont.cs b/itext/itext.kernel/itext/kernel/font/PdfSimpleFont.cs index fc779c1ac1..43c362a015 100644 --- a/itext/itext.kernel/itext/kernel/font/PdfSimpleFont.cs +++ b/itext/itext.kernel/itext/kernel/font/PdfSimpleFont.cs @@ -292,7 +292,7 @@ public override bool AppendDecodedCodesToGlyphsList(IList list, PdfString public override float GetContentWidth(PdfString content) { float width = 0; GlyphLine glyphLine = DecodeIntoGlyphLine(content); - for (int i = glyphLine.start; i < glyphLine.end; i++) { + for (int i = glyphLine.GetStart(); i < glyphLine.GetEnd(); i++) { width += glyphLine.Get(i).GetWidth(); } return width; @@ -464,9 +464,9 @@ protected internal override PdfDictionary GetFontDescriptor(String fontName) { AddFontStream(fontDescriptor); int flags = fontProgram.GetPdfFontFlags(); // reset both flags - flags &= ~(FontDescriptorFlags.Symbolic | FontDescriptorFlags.Nonsymbolic); + flags &= ~(FontDescriptorFlags.SYMBOLIC | FontDescriptorFlags.NONSYMBOLIC); // set fontSpecific based on font encoding - flags |= fontEncoding.IsFontSpecific() ? FontDescriptorFlags.Symbolic : FontDescriptorFlags.Nonsymbolic; + flags |= fontEncoding.IsFontSpecific() ? FontDescriptorFlags.SYMBOLIC : FontDescriptorFlags.NONSYMBOLIC; fontDescriptor.Put(PdfName.Flags, new PdfNumber(flags)); return fontDescriptor; } diff --git a/itext/itext.kernel/itext/kernel/font/PdfType0Font.cs b/itext/itext.kernel/itext/kernel/font/PdfType0Font.cs index 661ec8ff9b..9447ccf003 100644 --- a/itext/itext.kernel/itext/kernel/font/PdfType0Font.cs +++ b/itext/itext.kernel/itext/kernel/font/PdfType0Font.cs @@ -363,13 +363,13 @@ public override byte[] ConvertToBytes(GlyphLine glyphLine) { CMapCharsetEncoder encoder = StandardCMapCharsets.GetEncoder(cmapEncoding.GetCmapName()); if (encoder == null) { int totalByteCount = 0; - for (int i = glyphLine.start; i < glyphLine.end; i++) { + for (int i = glyphLine.GetStart(); i < glyphLine.GetEnd(); i++) { totalByteCount += cmapEncoding.GetCmapBytesLength(glyphLine.Get(i).GetCode()); } // perform actual conversion byte[] bytes = new byte[totalByteCount]; int offset = 0; - for (int i = glyphLine.start; i < glyphLine.end; i++) { + for (int i = glyphLine.GetStart(); i < glyphLine.GetEnd(); i++) { usedGlyphs.Add(glyphLine.Get(i).GetCode()); offset = cmapEncoding.FillCmapBytes(glyphLine.Get(i).GetCode(), bytes, offset); } @@ -377,7 +377,7 @@ public override byte[] ConvertToBytes(GlyphLine glyphLine) { } else { MemoryStream baos = new MemoryStream(); - for (int i = glyphLine.start; i < glyphLine.end; i++) { + for (int i = glyphLine.GetStart(); i < glyphLine.GetEnd(); i++) { Glyph g = glyphLine.Get(i); usedGlyphs.Add(g.GetCode()); byte[] encodedBit = encoder.EncodeUnicodeCodePoint(g.GetUnicode()); @@ -683,7 +683,7 @@ public override bool AppendDecodedCodesToGlyphsList(IList list, PdfString public override float GetContentWidth(PdfString content) { float width = 0; GlyphLine glyphLine = DecodeIntoGlyphLine(content); - for (int i = glyphLine.start; i < glyphLine.end; i++) { + for (int i = glyphLine.GetStart(); i < glyphLine.GetEnd(); i++) { width += glyphLine.Get(i).GetWidth(); } return width; diff --git a/itext/itext.kernel/itext/kernel/font/PdfType3Font.cs b/itext/itext.kernel/itext/kernel/font/PdfType3Font.cs index 86ead183e4..ae6b3bf81f 100644 --- a/itext/itext.kernel/itext/kernel/font/PdfType3Font.cs +++ b/itext/itext.kernel/itext/kernel/font/PdfType3Font.cs @@ -334,9 +334,9 @@ protected internal override PdfDictionary GetFontDescriptor(String fontName) { } int flags = fontProgram.GetPdfFontFlags(); // reset both flags - flags &= ~(FontDescriptorFlags.Symbolic | FontDescriptorFlags.Nonsymbolic); + flags &= ~(FontDescriptorFlags.SYMBOLIC | FontDescriptorFlags.NONSYMBOLIC); // set fontSpecific based on font encoding - flags |= fontEncoding.IsFontSpecific() ? FontDescriptorFlags.Symbolic : FontDescriptorFlags.Nonsymbolic; + flags |= fontEncoding.IsFontSpecific() ? FontDescriptorFlags.SYMBOLIC : FontDescriptorFlags.NONSYMBOLIC; fontDescriptor.Put(PdfName.Flags, new PdfNumber(flags)); return fontDescriptor; } diff --git a/itext/itext.kernel/itext/kernel/numbering/RomanNumbering.cs b/itext/itext.kernel/itext/kernel/numbering/RomanNumbering.cs index 8bf64c0de0..8eaa7d70f5 100644 --- a/itext/itext.kernel/itext/kernel/numbering/RomanNumbering.cs +++ b/itext/itext.kernel/itext/kernel/numbering/RomanNumbering.cs @@ -85,9 +85,9 @@ protected internal static String Convert(int index) { // loop over the array with values for m-d-c-l-x-v-i RomanNumbering.RomanDigit dig = ROMAN_DIGITS[pos]; // adding as many digits as we can - while (index >= dig.value) { - buf.Append(dig.digit); - index -= dig.value; + while (index >= dig.GetValue()) { + buf.Append(dig.GetDigit()); + index -= dig.GetValue(); } // we have the complete number if (index <= 0) { @@ -95,12 +95,12 @@ protected internal static String Convert(int index) { } // look for the next digit that can be used in a special way int j = pos; - while (!ROMAN_DIGITS[++j].pre) { + while (!ROMAN_DIGITS[++j].IsPre()) { } // does the special notation apply? - if (index + ROMAN_DIGITS[j].value >= dig.value) { - buf.Append(ROMAN_DIGITS[j].digit).Append(dig.digit); - index -= dig.value - ROMAN_DIGITS[j].value; + if (index + ROMAN_DIGITS[j].GetValue() >= dig.GetValue()) { + buf.Append(ROMAN_DIGITS[j].GetDigit()).Append(dig.GetDigit()); + index -= dig.GetValue() - ROMAN_DIGITS[j].GetValue(); } pos++; } @@ -110,13 +110,13 @@ protected internal static String Convert(int index) { /// Helper class for Roman Digits private class RomanDigit { /// part of a roman number - public char digit; + private readonly char digit; /// value of the roman digit - public int value; + private readonly int value; /// can the digit be used as a prefix - public bool pre; + private readonly bool pre; //\cond DO_NOT_DOCUMENT /// Constructs a roman digit @@ -129,6 +129,24 @@ internal RomanDigit(char digit, int value, bool pre) { this.pre = pre; } //\endcond + + /// Retrieves the roman digit. + /// roman digit + public virtual char GetDigit() { + return digit; + } + + /// Retrieves the value of the roman digit. + /// value + public virtual int GetValue() { + return value; + } + + /// Retrieves whether the roman digit can be used as prefix. + /// true if it can, false otherwise + public virtual bool IsPre() { + return pre; + } } } } diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfName.cs b/itext/itext.kernel/itext/kernel/pdf/PdfName.cs index 0eff417b9e..aeeacf056a 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfName.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfName.cs @@ -1838,7 +1838,7 @@ public class PdfName : PdfPrimitiveObject, IComparable protected internal String value = null; /// map strings to all known static names - public static IDictionary staticNames; + public static readonly IDictionary staticNames; static PdfName() { staticNames = PdfNameLoader.LoadNames(); diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfOutline.cs b/itext/itext.kernel/itext/kernel/pdf/PdfOutline.cs index 06fd0f5637..94fa09ce69 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfOutline.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfOutline.cs @@ -35,10 +35,10 @@ namespace iText.Kernel.Pdf { /// public class PdfOutline { /// A flag for displaying the outline item’s text with italic font. - public static int FLAG_ITALIC = 1; + public const int FLAG_ITALIC = 1; /// A flag for displaying the outline item’s text with bold font. - public static int FLAG_BOLD = 2; + public const int FLAG_BOLD = 2; private IList children = new List(); diff --git a/itext/itext.kernel/itext/kernel/pdf/canvas/PdfCanvas.cs b/itext/itext.kernel/itext/kernel/pdf/canvas/PdfCanvas.cs index aa67a9127d..615906b583 100644 --- a/itext/itext.kernel/itext/kernel/pdf/canvas/PdfCanvas.cs +++ b/itext/itext.kernel/itext/kernel/pdf/canvas/PdfCanvas.cs @@ -651,19 +651,19 @@ public virtual iText.Kernel.Pdf.Canvas.PdfCanvas ShowText(GlyphLine text, IEnume IList glyphLineParts = EnumeratorToList(iterator); for (int partIndex = 0; partIndex < glyphLineParts.Count; ++partIndex) { GlyphLine.GlyphLinePart glyphLinePart = glyphLineParts[partIndex]; - if (glyphLinePart.actualText != null) { + if (glyphLinePart.GetActualText() != null) { PdfDictionary properties = new PdfDictionary(); - properties.Put(PdfName.ActualText, new PdfString(glyphLinePart.actualText, PdfEncodings.UNICODE_BIG).SetHexWriting - (true)); + properties.Put(PdfName.ActualText, new PdfString(glyphLinePart.GetActualText(), PdfEncodings.UNICODE_BIG). + SetHexWriting(true)); BeginMarkedContent(PdfName.Span, properties); } else { - if (glyphLinePart.reversed) { + if (glyphLinePart.IsReversed()) { BeginMarkedContent(PdfName.ReversedChars); } } - int sub = glyphLinePart.start; - for (int i = glyphLinePart.start; i < glyphLinePart.end; i++) { + int sub = glyphLinePart.GetStart(); + for (int i = glyphLinePart.GetStart(); i < glyphLinePart.GetEnd(); i++) { Glyph glyph = text.Get(i); if (glyph.HasOffsets()) { if (i - 1 - sub >= 0) { @@ -727,21 +727,21 @@ public virtual iText.Kernel.Pdf.Canvas.PdfCanvas ShowText(GlyphLine text, IEnume sub = i + 1; } } - if (glyphLinePart.end - sub > 0) { - font.WriteText(text, sub, glyphLinePart.end - 1, contentStream.GetOutputStream()); + if (glyphLinePart.GetEnd() - sub > 0) { + font.WriteText(text, sub, glyphLinePart.GetEnd() - 1, contentStream.GetOutputStream()); contentStream.GetOutputStream().WriteBytes(Tj); } - if (glyphLinePart.actualText != null) { + if (glyphLinePart.GetActualText() != null) { EndMarkedContent(); } else { - if (glyphLinePart.reversed) { + if (glyphLinePart.IsReversed()) { EndMarkedContent(); } } - if (glyphLinePart.end > sub && partIndex + 1 < glyphLineParts.Count) { - contentStream.GetOutputStream().WriteFloat(GetSubrangeWidth(text, sub, glyphLinePart.end - 1), true).WriteSpace - ().WriteFloat(0).WriteSpace().WriteBytes(Td); + if (glyphLinePart.GetEnd() > sub && partIndex + 1 < glyphLineParts.Count) { + contentStream.GetOutputStream().WriteFloat(GetSubrangeWidth(text, sub, glyphLinePart.GetEnd() - 1), true). + WriteSpace().WriteFloat(0).WriteSpace().WriteBytes(Td); } } return this; diff --git a/itext/itext.kernel/itext/kernel/pdf/canvas/parser/data/TextRenderInfo.cs b/itext/itext.kernel/itext/kernel/pdf/canvas/parser/data/TextRenderInfo.cs index 2f6ca883c8..dbe79fd3c3 100644 --- a/itext/itext.kernel/itext/kernel/pdf/canvas/parser/data/TextRenderInfo.cs +++ b/itext/itext.kernel/itext/kernel/pdf/canvas/parser/data/TextRenderInfo.cs @@ -100,11 +100,11 @@ public virtual String GetText() { if (text == null) { GlyphLine gl = gs.GetFont().DecodeIntoGlyphLine(@string); if (!IsReversedChars()) { - text = gl.ToUnicodeString(gl.start, gl.end); + text = gl.ToUnicodeString(gl.GetStart(), gl.GetEnd()); } else { - StringBuilder sb = new StringBuilder(gl.end - gl.start); - for (int i = gl.end - 1; i >= gl.start; i--) { + StringBuilder sb = new StringBuilder(gl.GetEnd() - gl.GetStart()); + for (int i = gl.GetEnd() - 1; i >= gl.GetStart(); i--) { sb.Append(gl.Get(i).GetUnicodeChars()); } text = sb.ToString(); @@ -528,7 +528,7 @@ private PdfString[] SplitString(PdfString @string) { // Number of bytes forming one glyph can be arbitrary from [1; 4] range IList strings = new List(); GlyphLine glyphLine = gs.GetFont().DecodeIntoGlyphLine(@string); - for (int i = glyphLine.start; i < glyphLine.end; i++) { + for (int i = glyphLine.GetStart(); i < glyphLine.GetEnd(); i++) { strings.Add(new PdfString(gs.GetFont().ConvertToBytes(glyphLine.Get(i)))); } return strings.ToArray(new PdfString[strings.Count]); diff --git a/itext/itext.kernel/itext/kernel/pdf/canvas/wmf/MetaDo.cs b/itext/itext.kernel/itext/kernel/pdf/canvas/wmf/MetaDo.cs index de10bcd3da..28078b0083 100644 --- a/itext/itext.kernel/itext/kernel/pdf/canvas/wmf/MetaDo.cs +++ b/itext/itext.kernel/itext/kernel/pdf/canvas/wmf/MetaDo.cs @@ -177,10 +177,10 @@ public class MetaDo { public const int META_CREATEREGION = 0x06FF; /// PdfCanvas of the MetaDo object. - public PdfCanvas cb; + private readonly PdfCanvas cb; /// The InputMeta instance containing the data. - public InputMeta @in; + private readonly InputMeta @in; //\cond DO_NOT_DOCUMENT internal int left; diff --git a/itext/itext.kernel/itext/kernel/pdf/canvas/wmf/MetaState.cs b/itext/itext.kernel/itext/kernel/pdf/canvas/wmf/MetaState.cs index 8b73d579eb..677e374556 100644 --- a/itext/itext.kernel/itext/kernel/pdf/canvas/wmf/MetaState.cs +++ b/itext/itext.kernel/itext/kernel/pdf/canvas/wmf/MetaState.cs @@ -54,68 +54,68 @@ public class MetaState { public const int WINDING = 2; /// Stack of saved states. - public Stack savedStates; + private Stack savedStates; /// List of MetaObjects. - public IList MetaObjects; + private IList metaObjects; /// Current Point. - public Point currentPoint; + private Point currentPoint; /// Current Pen. - public MetaPen currentPen; + private MetaPen currentPen; /// Current Brush. - public MetaBrush currentBrush; + private MetaBrush currentBrush; /// Current Font. - public MetaFont currentFont; + private MetaFont currentFont; /// The current background color. /// The current background color. Default value is DeviceRgb#WHITE. - public Color currentBackgroundColor = ColorConstants.WHITE; + private Color currentBackgroundColor = ColorConstants.WHITE; /// Current text color. /// Current text color. Default value is DeviceRgb#BLACK. - public Color currentTextColor = ColorConstants.BLACK; + private Color currentTextColor = ColorConstants.BLACK; /// The current background mode. /// The current background mode. Default value is OPAQUE. - public int backgroundMode = OPAQUE; + private int backgroundMode = OPAQUE; /// Current polygon fill mode. /// Current polygon fill mode. Default value is ALTERNATE. - public int polyFillMode = ALTERNATE; + private int polyFillMode = ALTERNATE; /// Curent line join. /// Curent line join. Default value is 1. - public int lineJoin = 1; + private int lineJoin = 1; /// Current text alignment. - public int textAlign; + private int textAlign; /// Current offset for Wx. - public int offsetWx; + private int offsetWx; /// Current offset for Wy. - public int offsetWy; + private int offsetWy; /// Current extent for Wx. - public int extentWx; + private int extentWx; /// Current extent for Wy. - public int extentWy; + private int extentWy; /// Current x value for scaling. - public float scalingX; + private float scalingX; /// Current y value for scaling. - public float scalingY; + private float scalingY; /// Creates new MetaState public MetaState() { savedStates = new Stack(); - MetaObjects = new List(); + metaObjects = new List(); currentPoint = new Point(0, 0); currentPen = new MetaPen(); currentBrush = new MetaBrush(); @@ -132,7 +132,7 @@ public MetaState(iText.Kernel.Pdf.Canvas.Wmf.MetaState state) { /// state to copy public virtual void SetMetaState(iText.Kernel.Pdf.Canvas.Wmf.MetaState state) { savedStates = state.savedStates; - MetaObjects = state.MetaObjects; + metaObjects = state.metaObjects; currentPoint = state.currentPoint; currentPen = state.currentPen; currentBrush = state.currentBrush; @@ -154,20 +154,20 @@ public virtual void SetMetaState(iText.Kernel.Pdf.Canvas.Wmf.MetaState state) { /// Add a MetaObject to the State. /// MetaObject to be added public virtual void AddMetaObject(MetaObject @object) { - for (int k = 0; k < MetaObjects.Count; ++k) { - if (MetaObjects[k] == null) { - MetaObjects[k] = @object; + for (int k = 0; k < metaObjects.Count; ++k) { + if (metaObjects[k] == null) { + metaObjects[k] = @object; return; } } - MetaObjects.Add(@object); + metaObjects.Add(@object); } /// Select the MetaObject at the specified index and prepare the PdfCanvas. /// position of the MetaObject /// PdfCanvas to prepare public virtual void SelectMetaObject(int index, PdfCanvas cb) { - MetaObject obj = MetaObjects[index]; + MetaObject obj = metaObjects[index]; if (obj == null) { return; } @@ -236,7 +236,7 @@ public virtual void SelectMetaObject(int index, PdfCanvas cb) { /// Deletes the MetaObject at the specified index. /// index of the MetaObject to delete public virtual void DeleteMetaObject(int index) { - MetaObjects[index] = null; + metaObjects[index] = null; } /// Saves the state of this MetaState object. diff --git a/itext/itext.kernel/itext/kernel/pdf/extgstate/PdfExtGState.cs b/itext/itext.kernel/itext/kernel/pdf/extgstate/PdfExtGState.cs index 7855786922..c473b01ed6 100644 --- a/itext/itext.kernel/itext/kernel/pdf/extgstate/PdfExtGState.cs +++ b/itext/itext.kernel/itext/kernel/pdf/extgstate/PdfExtGState.cs @@ -31,67 +31,67 @@ namespace iText.Kernel.Pdf.Extgstate { public class PdfExtGState : PdfObjectWrapper { /// Standard separable blend mode. /// Standard separable blend mode. See ISO-320001, table 136 - public static PdfName BM_NORMAL = PdfName.Normal; + public static readonly PdfName BM_NORMAL = PdfName.Normal; /// Standard separable blend mode. /// Standard separable blend mode. See ISO-320001, table 136 - public static PdfName BM_MULTIPLY = PdfName.Multiply; + public static readonly PdfName BM_MULTIPLY = PdfName.Multiply; /// Standard separable blend mode. /// Standard separable blend mode. See ISO-320001, table 136 - public static PdfName BM_SCREEN = PdfName.Screen; + public static readonly PdfName BM_SCREEN = PdfName.Screen; /// Standard separable blend mode. /// Standard separable blend mode. See ISO-320001, table 136 - public static PdfName BM_OVERLAY = PdfName.Overlay; + public static readonly PdfName BM_OVERLAY = PdfName.Overlay; /// Standard separable blend mode. /// Standard separable blend mode. See ISO-320001, table 136 - public static PdfName BM_DARKEN = PdfName.Darken; + public static readonly PdfName BM_DARKEN = PdfName.Darken; /// Standard separable blend mode. /// Standard separable blend mode. See ISO-320001, table 136 - public static PdfName BM_LIGHTEN = PdfName.Lighten; + public static readonly PdfName BM_LIGHTEN = PdfName.Lighten; /// Standard separable blend mode. /// Standard separable blend mode. See ISO-320001, table 136 - public static PdfName BM_COLOR_DODGE = PdfName.ColorDodge; + public static readonly PdfName BM_COLOR_DODGE = PdfName.ColorDodge; /// Standard separable blend mode. /// Standard separable blend mode. See ISO-320001, table 136 - public static PdfName BM_COLOR_BURN = PdfName.ColorBurn; + public static readonly PdfName BM_COLOR_BURN = PdfName.ColorBurn; /// Standard separable blend mode. /// Standard separable blend mode. See ISO-320001, table 136 - public static PdfName BM_HARD_LIGHT = PdfName.HardLight; + public static readonly PdfName BM_HARD_LIGHT = PdfName.HardLight; /// Standard separable blend mode. /// Standard separable blend mode. See ISO-320001, table 136 - public static PdfName BM_SOFT_LIGHT = PdfName.SoftLight; + public static readonly PdfName BM_SOFT_LIGHT = PdfName.SoftLight; /// Standard separable blend mode. /// Standard separable blend mode. See ISO-320001, table 136 - public static PdfName BM_DIFFERENCE = PdfName.Difference; + public static readonly PdfName BM_DIFFERENCE = PdfName.Difference; /// Standard separable blend mode. /// Standard separable blend mode. See ISO-320001, table 136 - public static PdfName BM_EXCLUSION = PdfName.Exclusion; + public static readonly PdfName BM_EXCLUSION = PdfName.Exclusion; /// Standard nonseparable blend mode. /// Standard nonseparable blend mode. See ISO-320001, table 137 - public static PdfName BM_HUE = PdfName.Hue; + public static readonly PdfName BM_HUE = PdfName.Hue; /// Standard nonseparable blend mode. /// Standard nonseparable blend mode. See ISO-320001, table 137 - public static PdfName BM_SATURATION = PdfName.Saturation; + public static readonly PdfName BM_SATURATION = PdfName.Saturation; /// Standard nonseparable blend mode. /// Standard nonseparable blend mode. See ISO-320001, table 137 - public static PdfName BM_COLOR = PdfName.Color; + public static readonly PdfName BM_COLOR = PdfName.Color; /// Standard nonseparable blend mode. /// Standard nonseparable blend mode. See ISO-320001, table 137 - public static PdfName BM_LUMINOSITY = PdfName.Luminosity; + public static readonly PdfName BM_LUMINOSITY = PdfName.Luminosity; /// /// Create instance of graphics state parameter dictionary wrapper diff --git a/itext/itext.layout/itext/layout/renderer/LineRenderer.cs b/itext/itext.layout/itext/layout/renderer/LineRenderer.cs index 53ff59b119..7774be49b3 100644 --- a/itext/itext.layout/itext/layout/renderer/LineRenderer.cs +++ b/itext/itext.layout/itext/layout/renderer/LineRenderer.cs @@ -974,7 +974,7 @@ internal static LineRenderer.LineSplitIntoGlyphsData SplitLineIntoGlyphs(LineRen } if (child is TextRenderer) { GlyphLine childLine = ((TextRenderer)child).line; - for (int i = childLine.start; i < childLine.end; i++) { + for (int i = childLine.GetStart(); i < childLine.GetEnd(); i++) { if (iText.IO.Util.TextUtil.IsNewLine(childLine.Get(i))) { newLineFound = true; break; @@ -999,7 +999,7 @@ internal static void Reorder(LineRenderer toProcess, LineRenderer.LineSplitIntoG IList lineGlyphs = splitLineIntoGlyphsResult.GetLineGlyphs(); int initialPos = 0; for (int offset = initialPos; offset < lineGlyphs.Count; offset = initialPos) { - TextRenderer renderer = lineGlyphs[offset].renderer; + TextRenderer renderer = lineGlyphs[offset].GetRenderer(); TextRenderer newRenderer = new TextRenderer(renderer).RemoveReversedRanges(); toProcess.AddChildRenderer(newRenderer); // Insert non-text renderers @@ -1007,11 +1007,11 @@ internal static void Reorder(LineRenderer toProcess, LineRenderer.LineSplitIntoG newRenderer.line = new GlyphLine(newRenderer.line); IList replacementGlyphs = new List(); bool reversed = false; - for (int pos = offset; pos < lineGlyphs.Count && lineGlyphs[pos].renderer == renderer; ++pos) { - replacementGlyphs.Add(lineGlyphs[pos].glyph); - if (pos + 1 < lineGlyphs.Count && lineGlyphs[pos + 1].renderer == renderer && newOrder[pos] == newOrder[pos - + 1] + 1 && !iText.IO.Util.TextUtil.IsSpaceOrWhitespace(lineGlyphs[pos + 1].glyph) && !iText.IO.Util.TextUtil - .IsSpaceOrWhitespace(lineGlyphs[pos].glyph)) { + for (int pos = offset; pos < lineGlyphs.Count && lineGlyphs[pos].GetRenderer() == renderer; ++pos) { + replacementGlyphs.Add(lineGlyphs[pos].GetGlyph()); + if (pos + 1 < lineGlyphs.Count && lineGlyphs[pos + 1].GetRenderer() == renderer && newOrder[pos] == newOrder + [pos + 1] + 1 && !iText.IO.Util.TextUtil.IsSpaceOrWhitespace(lineGlyphs[pos + 1].GetGlyph()) && !iText.IO.Util.TextUtil + .IsSpaceOrWhitespace(lineGlyphs[pos].GetGlyph())) { reversed = true; continue; } @@ -1247,9 +1247,9 @@ internal virtual int TrimFirst() { TextRenderer textRenderer = (TextRenderer)renderer; GlyphLine currentText = textRenderer.GetText(); if (currentText != null) { - int prevTextStart = currentText.start; + int prevTextStart = currentText.GetStart(); textRenderer.TrimFirst(); - int numOfTrimmedGlyphs = textRenderer.GetText().start - prevTextStart; + int numOfTrimmedGlyphs = textRenderer.GetText().GetStart() - prevTextStart; totalNumberOfTrimmedGlyphs += numOfTrimmedGlyphs; } trimFinished = textRenderer.Length() > 0; @@ -1535,7 +1535,7 @@ private void UpdateBidiLevels(int totalNumberOfTrimmedGlyphs, BaseDirection? bas } if (child is TextRenderer) { GlyphLine text = ((TextRenderer)child).GetText(); - for (int i = text.start; i < text.end; i++) { + for (int i = text.GetStart(); i < text.GetEnd(); i++) { Glyph glyph = text.Get(i); if (iText.IO.Util.TextUtil.IsNewLine(glyph)) { newLineFound = true; @@ -1628,14 +1628,38 @@ private bool HasInlineBlocksWithVerticalAlignment() { } public class RendererGlyph { - public Glyph glyph; + private Glyph glyph; - public TextRenderer renderer; + private TextRenderer renderer; public RendererGlyph(Glyph glyph, TextRenderer textRenderer) { this.glyph = glyph; this.renderer = textRenderer; } + + /// Sets the glyph of the object. + /// glyph + public virtual void SetGlyph(Glyph glyph) { + this.glyph = glyph; + } + + /// Retrieves the glyph of the object. + /// glyph + public virtual Glyph GetGlyph() { + return glyph; + } + + /// Sets the renderer of the object. + /// renderer + public virtual void SetRenderer(TextRenderer renderer) { + this.renderer = renderer; + } + + /// Retrieves the renderer of the object. + /// renderer + public virtual TextRenderer GetRenderer() { + return renderer; + } } //\cond DO_NOT_DOCUMENT diff --git a/itext/itext.layout/itext/layout/renderer/TableRenderer.cs b/itext/itext.layout/itext/layout/renderer/TableRenderer.cs index 239cd40a5b..35de011089 100644 --- a/itext/itext.layout/itext/layout/renderer/TableRenderer.cs +++ b/itext/itext.layout/itext/layout/renderer/TableRenderer.cs @@ -477,16 +477,16 @@ public override LayoutResult Layout(LayoutContext layoutContext) { // if cell is in the last row on the page, its borders shouldn't collapse with the next row borders while (cellProcessingQueue.Count > 0) { TableRenderer.CellRendererInfo currentCellInfo = cellProcessingQueue.JRemoveFirst(); - col = currentCellInfo.column; - CellRenderer cell = currentCellInfo.cellRenderer; + col = currentCellInfo.GetColumn(); + CellRenderer cell = currentCellInfo.GetCellRenderer(); int colspan = (int)cell.GetPropertyAsInteger(Property.COLSPAN); int rowspan = (int)cell.GetPropertyAsInteger(Property.ROWSPAN); if (1 != rowspan) { cellWithBigRowspanAdded = true; } - targetOverflowRowIndex[col] = currentCellInfo.finishRowInd; + targetOverflowRowIndex[col] = currentCellInfo.GetFinishRowInd(); // This cell came from the future (split occurred and we need to place cell with big rowpsan into the current area) - bool currentCellHasBigRowspan = (row != currentCellInfo.finishRowInd); + bool currentCellHasBigRowspan = (row != currentCellInfo.GetFinishRowInd()); if (cell.HasOwnOrModelProperty(Property.HEIGHT)) { rowHasCellWithSetHeight = true; } @@ -499,7 +499,7 @@ public override LayoutResult Layout(LayoutContext layoutContext) { colOffset += countedColumnWidth[l]; } float rowspanOffset = 0; - for (int m = row - 1; m > currentCellInfo.finishRowInd - rowspan && m >= 0; m--) { + for (int m = row - 1; m > currentCellInfo.GetFinishRowInd() - rowspan && m >= 0; m--) { rowspanOffset += (float)heights[m]; } float cellLayoutBoxHeight = rowspanOffset + (!currentCellHasBigRowspan || hasContent ? layoutBox.GetHeight @@ -516,8 +516,8 @@ public override LayoutResult Layout(LayoutContext layoutContext) { cell.SetProperty(Property.WIDTH, UnitValue.CreatePointValue(cellWidth)); } // Apply cell borders - float[] cellIndents = bordersHandler.GetCellBorderIndents(currentCellInfo.finishRowInd, col, rowspan, colspan - ); + float[] cellIndents = bordersHandler.GetCellBorderIndents(currentCellInfo.GetFinishRowInd(), col, rowspan, + colspan); if (!(bordersHandler is SeparatedTableBorders)) { // Bottom indent to be applied consists of two parts which should be summed up: // a) half of the border of the current row (in case it is the last row on the area) @@ -592,9 +592,9 @@ public override LayoutResult Layout(LayoutContext layoutContext) { currentRow[col] = (CellRenderer)cellResult.GetSplitRenderer(); } else { - rows[currentCellInfo.finishRowInd][col] = null; + rows[currentCellInfo.GetFinishRowInd()][col] = null; currentRow[col] = cell; - rowMoves.Put(col, currentCellInfo.finishRowInd); + rowMoves.Put(col, currentCellInfo.GetFinishRowInd()); } } else { @@ -1880,11 +1880,11 @@ private float GetTableWidth() { /// This are a structs used for convenience in layout. private class CellRendererInfo { - public CellRenderer cellRenderer; + private readonly CellRenderer cellRenderer; - public int column; + private readonly int column; - public int finishRowInd; + private readonly int finishRowInd; public CellRendererInfo(CellRenderer cellRenderer, int column, int finishRow) { this.cellRenderer = cellRenderer; @@ -1893,6 +1893,24 @@ public CellRendererInfo(CellRenderer cellRenderer, int column, int finishRow) { // Otherwise, this is simply the index of the row of the cell in the {@link #rows} array. this.finishRowInd = finishRow; } + + /// Retrieves the cell renderer. + /// cell renderer + public virtual CellRenderer GetCellRenderer() { + return cellRenderer; + } + + /// Retrieves the column. + /// column + public virtual int GetColumn() { + return column; + } + + /// Retrieves the finish row index. + /// finish row index + public virtual int GetFinishRowInd() { + return finishRowInd; + } } /// Utility class that copies overflow renderer rows on cell replacement so it won't affect original renderer diff --git a/itext/itext.layout/itext/layout/renderer/TextRenderer.cs b/itext/itext.layout/itext/layout/renderer/TextRenderer.cs index 5e302e8a95..92f205661e 100644 --- a/itext/itext.layout/itext/layout/renderer/TextRenderer.cs +++ b/itext/itext.layout/itext/layout/renderer/TextRenderer.cs @@ -193,7 +193,7 @@ public override LayoutResult Layout(LayoutContext layoutContext) { .GetHeight(), 0, 0)); TargetCounterHandler.AddPageByID(this); bool anythingPlaced = false; - int currentTextPos = text.start; + int currentTextPos = text.GetStart(); UnitValue fontSize = (UnitValue)this.GetPropertyAsUnitValue(Property.FONT_SIZE); if (!fontSize.IsPointValue()) { ILogger logger = ITextLogManager.GetLogger(typeof(iText.Layout.Renderer.TextRenderer)); @@ -210,7 +210,8 @@ public override LayoutResult Layout(LayoutContext layoutContext) { float boldSimulationAddition = true.Equals(GetPropertyAsBoolean(Property.BOLD_SIMULATION)) ? BOLD_SIMULATION_STROKE_COEFF * fontSize.GetValue() : 0; line = new GlyphLine(text); - line.start = line.end = -1; + line.SetStart(-1); + line.SetEnd(-1); float ascender = 0; float descender = 0; float currentLineAscender = 0; @@ -247,19 +248,19 @@ public override LayoutResult Layout(LayoutContext layoutContext) { HyphenationConfig hyphenationConfig = this.GetProperty(Property.HYPHENATION); // For example, if a first character is a RTL mark (U+200F), and the second is a newline, we need to break anyway int firstPrintPos = currentTextPos; - while (firstPrintPos < text.end && NoPrint(text.Get(firstPrintPos))) { + while (firstPrintPos < text.GetEnd() && NoPrint(text.Get(firstPrintPos))) { firstPrintPos++; } - while (currentTextPos < text.end) { + while (currentTextPos < text.GetEnd()) { if (NoPrint(text.Get(currentTextPos))) { - if (line.start == -1) { - line.start = currentTextPos; + if (line.GetStart() == -1) { + line.SetStart(currentTextPos); } - line.end = Math.Max(line.end, currentTextPos + 1); + line.SetEnd(Math.Max(line.GetEnd(), currentTextPos + 1)); currentTextPos++; continue; } - int nonBreakablePartEnd = text.end - 1; + int nonBreakablePartEnd = text.GetEnd() - 1; float nonBreakablePartFullWidth = 0; float nonBreakablePartWidthWhichDoesNotExceedAllowedWidth = 0; float nonBreakablePartMaxAscender = 0; @@ -270,7 +271,7 @@ public override LayoutResult Layout(LayoutContext layoutContext) { int nonBreakingHyphenRelatedChunkStart = -1; float beforeNonBreakingHyphenRelatedChunkMaxAscender = 0; float beforeNonBreakingHyphenRelatedChunkMaxDescender = 0; - for (int ind = currentTextPos; ind < text.end; ind++) { + for (int ind = currentTextPos; ind < text.GetEnd(); ind++) { if (iText.IO.Util.TextUtil.IsNewLine(text.Get(ind))) { containsPossibleBreak = true; wordBreakGlyphAtLineEnding = text.Get(ind); @@ -283,24 +284,24 @@ public override LayoutResult Layout(LayoutContext layoutContext) { // Notice that in that case we do not need to ignore the new line symbol ('\n') forcePartialSplitOnFirstChar = true; } - if (line.start == -1) { - line.start = currentTextPos; + if (line.GetStart() == -1) { + line.SetStart(currentTextPos); } crlf = iText.IO.Util.TextUtil.IsCarriageReturnFollowedByLineFeed(text, currentTextPos); if (crlf) { currentTextPos++; } - line.end = Math.Max(line.end, firstCharacterWhichExceedsAllowedWidth - 1); + line.SetEnd(Math.Max(line.GetEnd(), firstCharacterWhichExceedsAllowedWidth - 1)); break; } Glyph currentGlyph = text.Get(ind); if (NoPrint(currentGlyph)) { - bool nextGlyphIsSpaceOrWhiteSpace = ind + 1 < text.end && (splitCharacters.IsSplitCharacter(text, ind + 1) - && iText.IO.Util.TextUtil.IsSpaceOrWhitespace(text.Get(ind + 1))); + bool nextGlyphIsSpaceOrWhiteSpace = ind + 1 < text.GetEnd() && (splitCharacters.IsSplitCharacter(text, ind + + 1) && iText.IO.Util.TextUtil.IsSpaceOrWhitespace(text.Get(ind + 1))); if (nextGlyphIsSpaceOrWhiteSpace && firstCharacterWhichExceedsAllowedWidth == -1) { containsPossibleBreak = true; } - if (ind + 1 == text.end || nextGlyphIsSpaceOrWhiteSpace || (ind + 1 >= indexOfFirstCharacterToBeForcedToOverflow + if (ind + 1 == text.GetEnd() || nextGlyphIsSpaceOrWhiteSpace || (ind + 1 >= indexOfFirstCharacterToBeForcedToOverflow )) { if (ind + 1 >= indexOfFirstCharacterToBeForcedToOverflow) { firstCharacterWhichExceedsAllowedWidth = currentTextPos; @@ -365,8 +366,8 @@ public override LayoutResult Layout(LayoutContext layoutContext) { nonBreakablePartMaxHeight = FontProgram.ConvertTextSpaceToGlyphSpace((nonBreakablePartMaxAscender - nonBreakablePartMaxDescender ) * fontSize.GetValue()) + textRise; previousCharPos = ind; - if (!noSoftWrap && symbolNotFitOnLine && (0 == nonBreakingHyphenRelatedChunkWidth || ind + 1 == text.end || - !GlyphBelongsToNonBreakingHyphenRelatedChunk(text, ind + 1))) { + if (!noSoftWrap && symbolNotFitOnLine && (0 == nonBreakingHyphenRelatedChunkWidth || ind + 1 == text.GetEnd + () || !GlyphBelongsToNonBreakingHyphenRelatedChunk(text, ind + 1))) { if (IsOverflowFit(overflowX)) { // we have extracted all the information we wanted and we do not want to continue. // we will have to split the word anyway. @@ -388,12 +389,12 @@ public override LayoutResult Layout(LayoutContext layoutContext) { bool endOfWordBelongingToSpecialScripts = TextContainsSpecialScriptGlyphs(true) && FindPossibleBreaksSplitPosition (specialScriptsWordBreakPoints, ind + 1, true) >= 0; bool endOfNonBreakablePartCausedBySplitCharacter = splitCharacters.IsSplitCharacter(text, ind) || (ind + 1 - < text.end && (splitCharacters.IsSplitCharacter(text, ind + 1) && iText.IO.Util.TextUtil.IsSpaceOrWhitespace + < text.GetEnd() && (splitCharacters.IsSplitCharacter(text, ind + 1) && iText.IO.Util.TextUtil.IsSpaceOrWhitespace (text.Get(ind + 1)))); if (endOfNonBreakablePartCausedBySplitCharacter && firstCharacterWhichExceedsAllowedWidth == -1) { containsPossibleBreak = true; } - if (ind + 1 == text.end || endOfNonBreakablePartCausedBySplitCharacter || endOfWordBelongingToSpecialScripts + if (ind + 1 == text.GetEnd() || endOfNonBreakablePartCausedBySplitCharacter || endOfWordBelongingToSpecialScripts || (ind + 1 >= indexOfFirstCharacterToBeForcedToOverflow)) { if (ind + 1 >= indexOfFirstCharacterToBeForcedToOverflow && !endOfNonBreakablePartCausedBySplitCharacter) { firstCharacterWhichExceedsAllowedWidth = currentTextPos; @@ -404,10 +405,10 @@ public override LayoutResult Layout(LayoutContext layoutContext) { } if (firstCharacterWhichExceedsAllowedWidth == -1) { // can fit the whole word in a line - if (line.start == -1) { - line.start = currentTextPos; + if (line.GetStart() == -1) { + line.SetStart(currentTextPos); } - line.end = Math.Max(line.end, nonBreakablePartEnd + 1); + line.SetEnd(Math.Max(line.GetEnd(), nonBreakablePartEnd + 1)); currentLineAscender = Math.Max(currentLineAscender, nonBreakablePartMaxAscender); currentLineDescender = Math.Min(currentLineDescender, nonBreakablePartMaxDescender); currentLineHeight = Math.Max(currentLineHeight, nonBreakablePartMaxHeight); @@ -438,10 +439,10 @@ public override LayoutResult Layout(LayoutContext layoutContext) { ApplyBorderBox(occupiedArea.GetBBox(), borders, true); ApplyMargins(occupiedArea.GetBBox(), margins, true); // Force to place what we can - if (line.start == -1) { - line.start = currentTextPos; + if (line.GetStart() == -1) { + line.SetStart(currentTextPos); } - line.end = Math.Max(line.end, firstCharacterWhichExceedsAllowedWidth); + line.SetEnd(Math.Max(line.GetEnd(), firstCharacterWhichExceedsAllowedWidth)); // the line does not fit because of height - full overflow iText.Layout.Renderer.TextRenderer[] splitResult = Split(initialLineTextPos); bool[] startsEnds = IsStartsWithSplitCharWhiteSpaceAndEndsWithSplitChar(splitCharacters); @@ -456,8 +457,8 @@ public override LayoutResult Layout(LayoutContext layoutContext) { if (hyphenationConfig != null && indexOfFirstCharacterToBeForcedToOverflow == UNDEFINED_FIRST_CHAR_TO_FORCE_OVERFLOW ) { if (-1 == nonBreakingHyphenRelatedChunkStart) { - int[] wordBounds = GetWordBoundsForHyphenation(text, currentTextPos, text.end, Math.Max(currentTextPos, firstCharacterWhichExceedsAllowedWidth - - 1)); + int[] wordBounds = GetWordBoundsForHyphenation(text, currentTextPos, text.GetEnd(), Math.Max(currentTextPos + , firstCharacterWhichExceedsAllowedWidth - 1)); if (wordBounds != null) { String word = text.ToUnicodeString(wordBounds[0], wordBounds[1]); iText.Layout.Hyphenation.Hyphenation hyph = hyphenationConfig.Hyphenate(word); @@ -471,13 +472,13 @@ public override LayoutResult Layout(LayoutContext layoutContext) { if (currentLineWidth + currentHyphenationChoicePreTextWidth + italicSkewAddition + boldSimulationAddition <= layoutBox.GetWidth()) { hyphenationApplied = true; - if (line.start == -1) { - line.start = currentTextPos; + if (line.GetStart() == -1) { + line.SetStart(currentTextPos); } - line.end = Math.Max(line.end, wordBounds[0] + pre.Length); - GlyphLine lineCopy = line.Copy(line.start, line.end); + line.SetEnd(Math.Max(line.GetEnd(), wordBounds[0] + pre.Length)); + GlyphLine lineCopy = line.Copy(line.GetStart(), line.GetEnd()); lineCopy.Add(font.GetGlyph(hyphenationConfig.GetHyphenSymbol())); - lineCopy.end++; + lineCopy.SetEnd(lineCopy.GetEnd() + 1); line = lineCopy; // TODO DEVSIX-7010 recalculate line properties in case of word hyphenation. // These values are based on whole word. Recalculate properly based on hyphenated part. @@ -502,7 +503,7 @@ public override LayoutResult Layout(LayoutContext layoutContext) { } } else { - if (text.start == nonBreakingHyphenRelatedChunkStart) { + if (text.GetStart() == nonBreakingHyphenRelatedChunkStart) { nonBreakingHyphenRelatedChunkWidth = 0; firstCharacterWhichExceedsAllowedWidth = previousCharPos + 1; } @@ -521,15 +522,15 @@ public override LayoutResult Layout(LayoutContext layoutContext) { // if the word is too long for a single line we will have to split it // we also need to split the word here if text contains glyphs from scripts // which require word wrapping for further processing in LineRenderer - if (line.start == -1) { - line.start = currentTextPos; + if (line.GetStart() == -1) { + line.SetStart(currentTextPos); } if (!crlf) { currentTextPos = (forcePartialSplitOnFirstChar || IsOverflowFit(overflowX) || specialScriptWordSplit) ? firstCharacterWhichExceedsAllowedWidth : nonBreakablePartEnd + 1; } - line.end = Math.Max(line.end, currentTextPos); - wordSplit = !forcePartialSplitOnFirstChar && (text.end != currentTextPos); + line.SetEnd(Math.Max(line.GetEnd(), currentTextPos)); + wordSplit = !forcePartialSplitOnFirstChar && (text.GetEnd() != currentTextPos); if (wordSplit || !(forcePartialSplitOnFirstChar || IsOverflowFit(overflowX))) { currentLineAscender = Math.Max(currentLineAscender, nonBreakablePartMaxAscender); currentLineDescender = Math.Min(currentLineDescender, nonBreakablePartMaxDescender); @@ -557,11 +558,11 @@ public override LayoutResult Layout(LayoutContext layoutContext) { currentLineDescender = descender; currentLineHeight = FontProgram.ConvertTextSpaceToGlyphSpace((currentLineAscender - currentLineDescender) * fontSize.GetValue()) + textRise; - currentLineWidth += FontProgram.ConvertTextSpaceToGlyphSpace(GetCharWidth(line.Get(line.start), fontSize.GetValue - (), hScale, characterSpacing, wordSpacing)); + currentLineWidth += FontProgram.ConvertTextSpaceToGlyphSpace(GetCharWidth(line.Get(line.GetStart()), fontSize + .GetValue(), hScale, characterSpacing, wordSpacing)); } } - if (line.end <= line.start) { + if (line.GetEnd() <= line.GetStart()) { bool[] startsEnds = IsStartsWithSplitCharWhiteSpaceAndEndsWithSplitChar(splitCharacters); return new TextLayoutResult(LayoutResult.NOTHING, occupiedArea, null, this, this).SetContainsPossibleBreak (containsPossibleBreak).SetStartsWithSplitCharacterWhiteSpace(startsEnds[0]).SetEndsWithSplitCharacter @@ -621,7 +622,7 @@ public override LayoutResult Layout(LayoutContext layoutContext) { split[0].SaveWordBreakIfNotYetSaved(wordBreakGlyphAtLineEnding); } // no sense to process empty renderer - if (split[1].text.start != split[1].text.end) { + if (split[1].text.GetStart() != split[1].text.GetEnd()) { result.SetOverflowRenderer(split[1]); } else { @@ -675,7 +676,7 @@ private void IncreaseYLineOffset(UnitValue[] paddings, Border[] borders, UnitVal public virtual void ApplyOtf() { UpdateFontAndText(); UnicodeScript? script = this.GetProperty(Property.FONT_SCRIPT); - if (!otfFeaturesApplied && TypographyUtils.IsPdfCalligraphAvailable() && text.start < text.end) { + if (!otfFeaturesApplied && TypographyUtils.IsPdfCalligraphAvailable() && text.GetStart() < text.GetEnd()) { PdfDocument pdfDocument = GetPdfDocument(); SequenceId sequenceId = pdfDocument == null ? null : pdfDocument.GetDocumentIdWrapper(); MetaInfoContainer metaInfoContainer = this.GetProperty(Property.META_INFO); @@ -691,13 +692,13 @@ public virtual void ApplyOtf() { } IList scriptsRanges = new List(); if (script != null) { - scriptsRanges.Add(new TextRenderer.ScriptRange(script, text.end)); + scriptsRanges.Add(new TextRenderer.ScriptRange(script, text.GetEnd())); } else { // Try to autodetect script. - TextRenderer.ScriptRange currRange = new TextRenderer.ScriptRange(null, text.end); + TextRenderer.ScriptRange currRange = new TextRenderer.ScriptRange(null, text.GetEnd()); scriptsRanges.Add(currRange); - for (int i = text.start; i < text.end; i++) { + for (int i = text.GetStart(); i < text.GetEnd(); i++) { int unicode = text.Get(i).GetUnicode(); if (unicode > -1) { UnicodeScript glyphScript = UnicodeScriptUtil.Of(unicode); @@ -711,7 +712,7 @@ public virtual void ApplyOtf() { } else { currRange.rangeEnd = i; - currRange = new TextRenderer.ScriptRange(glyphScript, text.end); + currRange = new TextRenderer.ScriptRange(glyphScript, text.GetEnd()); scriptsRanges.Add(currRange); } } @@ -719,16 +720,16 @@ public virtual void ApplyOtf() { } } int delta = 0; - int origTextStart = text.start; - int origTextEnd = text.end; - int shapingRangeStart = text.start; + int origTextStart = text.GetStart(); + int origTextEnd = text.GetEnd(); + int shapingRangeStart = text.GetStart(); foreach (TextRenderer.ScriptRange scriptsRange in scriptsRanges) { if (scriptsRange.script == null || !supportedScripts.Contains(EnumUtil.ThrowIfNull(scriptsRange.script))) { continue; } scriptsRange.rangeEnd += delta; - text.start = shapingRangeStart; - text.end = scriptsRange.rangeEnd; + text.SetStart(shapingRangeStart); + text.SetEnd(scriptsRange.rangeEnd); if ((scriptsRange.script == UnicodeScript.ARABIC || scriptsRange.script == UnicodeScript.HEBREW) && parent is LineRenderer) { // It's safe to set here BASE_DIRECTION to TextRenderer without additional checks, because @@ -740,11 +741,11 @@ public virtual void ApplyOtf() { } TypographyUtils.ApplyOtfScript(font.GetFontProgram(), text, scriptsRange.script, typographyConfig, sequenceId , metaInfo); - delta += text.end - scriptsRange.rangeEnd; - scriptsRange.rangeEnd = shapingRangeStart = text.end; + delta += text.GetEnd() - scriptsRange.rangeEnd; + scriptsRange.rangeEnd = shapingRangeStart = text.GetEnd(); } - text.start = origTextStart; - text.end = origTextEnd + delta; + text.SetStart(origTextStart); + text.SetEnd(origTextEnd + delta); } FontKerning fontKerning = (FontKerning)this.GetProperty(Property.FONT_KERNING, FontKerning.NO ); @@ -789,7 +790,7 @@ public override void Draw(DrawContext drawContext) { ApplyRelativePositioningTranslation(false); } float leftBBoxX = GetInnerAreaBBox().GetX(); - if (line.end > line.start || savedWordBreakAtLineEnding != null) { + if (line.GetEnd() > line.GetStart() || savedWordBreakAtLineEnding != null) { UnitValue fontSize = this.GetPropertyAsUnitValue(Property.FONT_SIZE); if (!fontSize.IsPointValue()) { ILogger logger = ITextLogManager.GetLogger(typeof(iText.Layout.Renderer.TextRenderer)); @@ -868,7 +869,7 @@ public override void Draw(DrawContext drawContext) { // It does not apply to occurrences of the byte value 32 in multiple-byte codes. // // For PdfType0Font we must add word manually with glyph offsets - for (int gInd = line.start; gInd < line.end; gInd++) { + for (int gInd = line.GetStart(); gInd < line.GetEnd(); gInd++) { if (iText.IO.Util.TextUtil.IsUni0020(line.Get(gInd))) { short advance = (short)(FontProgram.ConvertGlyphSpaceToTextSpace((float)wordSpacing) / fontSize.GetValue() ); @@ -890,7 +891,7 @@ public override void Draw(DrawContext drawContext) { if (GetReversedRanges() != null) { bool writeReversedChars = !appearanceStreamLayout; List removedIds = new List(); - for (int i = line.start; i < line.end; i++) { + for (int i = line.GetStart(); i < line.GetEnd(); i++) { if (!filter.Accept(line.Get(i))) { removedIds.Add(i); } @@ -908,7 +909,7 @@ public override void Draw(DrawContext drawContext) { } else { if (appearanceStreamLayout) { - line.SetActualText(line.start, line.end, null); + line.SetActualText(line.GetStart(), line.GetEnd(), null); } canvas.ShowText(line.Filter(filter)); } @@ -956,9 +957,9 @@ public virtual void TrimFirst() { UpdateFontAndText(); if (text != null) { Glyph glyph; - while (text.start < text.end && iText.IO.Util.TextUtil.IsWhitespace(glyph = text.Get(text.start)) && !iText.IO.Util.TextUtil - .IsNewLine(glyph)) { - text.start++; + while (text.GetStart() < text.GetEnd() && iText.IO.Util.TextUtil.IsWhitespace(glyph = text.Get(text.GetStart + ())) && !iText.IO.Util.TextUtil.IsNewLine(glyph)) { + text.SetStart(text.GetStart() + 1); } } /* Between two sentences separated by one or more whitespaces, @@ -969,7 +970,7 @@ we need to remove this point from the list (or replace it with -1 thus marking that text contains special scripts, in case if the removed break point was the only possible break point). */ - if (TextContainsSpecialScriptGlyphs(true) && specialScriptsWordBreakPoints[0] == text.start) { + if (TextContainsSpecialScriptGlyphs(true) && specialScriptsWordBreakPoints[0] == text.GetStart()) { if (specialScriptsWordBreakPoints.Count == 1) { specialScriptsWordBreakPoints[0] = -1; } @@ -982,7 +983,7 @@ we need to remove this point from the list //\cond DO_NOT_DOCUMENT internal virtual float TrimLast() { float trimmedSpace = 0; - if (line.end <= 0) { + if (line.GetEnd() <= 0) { return trimmedSpace; } UnitValue fontSize = (UnitValue)this.GetPropertyAsUnitValue(Property.FONT_SIZE); @@ -994,8 +995,8 @@ internal virtual float TrimLast() { float? characterSpacing = this.GetPropertyAsFloat(Property.CHARACTER_SPACING); float? wordSpacing = this.GetPropertyAsFloat(Property.WORD_SPACING); float hScale = (float)this.GetPropertyAsFloat(Property.HORIZONTAL_SCALING, 1f); - int firstNonSpaceCharIndex = line.end - 1; - while (firstNonSpaceCharIndex >= line.start) { + int firstNonSpaceCharIndex = line.GetEnd() - 1; + while (firstNonSpaceCharIndex >= line.GetStart()) { Glyph currentGlyph = line.Get(firstNonSpaceCharIndex); if (!iText.IO.Util.TextUtil.IsWhitespace(currentGlyph)) { break; @@ -1003,13 +1004,13 @@ internal virtual float TrimLast() { SaveWordBreakIfNotYetSaved(currentGlyph); float currentCharWidth = FontProgram.ConvertTextSpaceToGlyphSpace(GetCharWidth(currentGlyph, fontSize.GetValue (), hScale, characterSpacing, wordSpacing)); - float xAdvance = firstNonSpaceCharIndex > line.start ? FontProgram.ConvertTextSpaceToGlyphSpace(ScaleXAdvance + float xAdvance = firstNonSpaceCharIndex > line.GetStart() ? FontProgram.ConvertTextSpaceToGlyphSpace(ScaleXAdvance (line.Get(firstNonSpaceCharIndex - 1).GetXAdvance(), fontSize.GetValue(), hScale)) : 0; trimmedSpace += currentCharWidth - xAdvance; occupiedArea.GetBBox().SetWidth(occupiedArea.GetBBox().GetWidth() - currentCharWidth); firstNonSpaceCharIndex--; } - line.end = firstNonSpaceCharIndex + 1; + line.SetEnd(firstNonSpaceCharIndex + 1); return trimmedSpace; } //\endcond @@ -1087,7 +1088,7 @@ public virtual GlyphLine GetText() { /// The length of the whole text assigned to this renderer. /// the text length public virtual int Length() { - return text == null ? 0 : text.end - text.start; + return text == null ? 0 : text.GetEnd() - text.GetStart(); } public override String ToString() { @@ -1098,7 +1099,7 @@ public override String ToString() { /// the position in range [0; length()) /// Unicode char code public virtual int CharAt(int pos) { - return text.Get(pos + text.start).GetUnicode(); + return text.Get(pos + text.GetStart()).GetUnicode(); } public virtual float GetTabAnchorCharacterPosition() { @@ -1267,7 +1268,7 @@ internal virtual bool TextContainsSpecialScriptGlyphs(bool analyzeSpecialScripts if (splitCharacters is BreakAllSplitCharacters) { specialScriptsWordBreakPoints = new List(); } - for (int i = text.start; i < text.end; i++) { + for (int i = text.GetStart(); i < text.GetEnd(); i++) { int unicode = text.Get(i).GetUnicode(); if (unicode > -1) { if (CodePointIsOfSpecialScript(unicode)) { @@ -1344,12 +1345,12 @@ protected internal override Rectangle GetBackgroundArea(Rectangle occupiedAreaWi /// /// the length of the line protected internal virtual int LineLength() { - return line.end > 0 ? line.end - line.start : 0; + return line.GetEnd() > 0 ? line.GetEnd() - line.GetStart() : 0; } protected internal virtual int BaseCharactersCount() { int count = 0; - for (int i = line.start; i < line.end; i++) { + for (int i = line.GetStart(); i < line.GetEnd(); i++) { Glyph glyph = line.Get(i); if (!glyph.HasPlacement()) { count++; @@ -1365,11 +1366,11 @@ public override MinMaxWidth GetMinMaxWidth() { } protected internal virtual int GetNumberOfSpaces() { - if (line.end <= 0) { + if (line.GetEnd() <= 0) { return 0; } int spaces = 0; - for (int i = line.start; i < line.end; i++) { + for (int i = line.GetStart(); i < line.GetEnd(); i++) { Glyph currentGlyph = line.Get(i); if (currentGlyph.GetUnicode() == ' ') { spaces++; @@ -1389,8 +1390,8 @@ protected internal virtual iText.Layout.Renderer.TextRenderer CreateOverflowRend protected internal virtual iText.Layout.Renderer.TextRenderer[] Split(int initialOverflowTextPos) { iText.Layout.Renderer.TextRenderer splitRenderer = CreateSplitRenderer(); GlyphLine newText = new GlyphLine(text); - newText.start = text.start; - newText.end = initialOverflowTextPos; + newText.SetStart(text.GetStart()); + newText.SetEnd(initialOverflowTextPos); splitRenderer.SetProcessedGlyphLineAndFont(newText, font); splitRenderer.line = line; splitRenderer.occupiedArea = occupiedArea.Clone(); @@ -1401,8 +1402,8 @@ protected internal virtual iText.Layout.Renderer.TextRenderer[] Split(int initia splitRenderer.AddAllProperties(GetOwnProperties()); iText.Layout.Renderer.TextRenderer overflowRenderer = CreateOverflowRenderer(); newText = new GlyphLine(text); - newText.start = initialOverflowTextPos; - newText.end = text.end; + newText.SetStart(initialOverflowTextPos); + newText.SetEnd(text.GetEnd()); overflowRenderer.SetProcessedGlyphLineAndFont(newText, font); overflowRenderer.otfFeaturesApplied = otfFeaturesApplied; overflowRenderer.parent = parent; @@ -1690,15 +1691,16 @@ internal override PdfFont ResolveFirstPdfFont(String[] font, FontProvider provid /// internal virtual bool[] IsStartsWithSplitCharWhiteSpaceAndEndsWithSplitChar(ISplitCharacters splitCharacters ) { - bool startsWithBreak = line.start < line.end && splitCharacters.IsSplitCharacter(text, line.start) && iText.IO.Util.TextUtil - .IsSpaceOrWhitespace(text.Get(line.start)); - bool endsWithBreak = line.start < line.end && splitCharacters.IsSplitCharacter(text, line.end - 1); + bool startsWithBreak = line.GetStart() < line.GetEnd() && splitCharacters.IsSplitCharacter(text, line.GetStart + ()) && iText.IO.Util.TextUtil.IsSpaceOrWhitespace(text.Get(line.GetStart())); + bool endsWithBreak = line.GetStart() < line.GetEnd() && splitCharacters.IsSplitCharacter(text, line.GetEnd + () - 1); if (specialScriptsWordBreakPoints == null || specialScriptsWordBreakPoints.IsEmpty()) { return new bool[] { startsWithBreak, endsWithBreak }; } else { if (!endsWithBreak) { - endsWithBreak = specialScriptsWordBreakPoints.Contains(line.end); + endsWithBreak = specialScriptsWordBreakPoints.Contains(line.GetEnd()); } return new bool[] { startsWithBreak, endsWithBreak }; } @@ -1738,12 +1740,12 @@ private float ScaleXAdvance(float xAdvance, float fontSize, float? hScale) { private float GetGlyphLineWidth(GlyphLine glyphLine, float fontSize, float hScale, float? characterSpacing , float? wordSpacing) { float width = 0; - for (int i = glyphLine.start; i < glyphLine.end; i++) { + for (int i = glyphLine.GetStart(); i < glyphLine.GetEnd(); i++) { if (!NoPrint(glyphLine.Get(i))) { float charWidth = GetCharWidth(glyphLine.Get(i), fontSize, hScale, characterSpacing, wordSpacing); width += charWidth; - float xAdvance = (i != glyphLine.start) ? ScaleXAdvance(glyphLine.Get(i - 1).GetXAdvance(), fontSize, hScale - ) : 0; + float xAdvance = (i != glyphLine.GetStart()) ? ScaleXAdvance(glyphLine.Get(i - 1).GetXAdvance(), fontSize, + hScale) : 0; width += xAdvance; } } @@ -1837,8 +1839,8 @@ private static bool NoPrint(Glyph g) { } private static bool GlyphBelongsToNonBreakingHyphenRelatedChunk(GlyphLine text, int ind) { - return iText.IO.Util.TextUtil.IsNonBreakingHyphen(text.Get(ind)) || (ind + 1 < text.end && iText.IO.Util.TextUtil - .IsNonBreakingHyphen(text.Get(ind + 1))) || ind - 1 >= text.start && iText.IO.Util.TextUtil.IsNonBreakingHyphen + return iText.IO.Util.TextUtil.IsNonBreakingHyphen(text.Get(ind)) || (ind + 1 < text.GetEnd() && iText.IO.Util.TextUtil + .IsNonBreakingHyphen(text.Get(ind + 1))) || ind - 1 >= text.GetStart() && iText.IO.Util.TextUtil.IsNonBreakingHyphen (text.Get(ind - 1)); } @@ -1882,8 +1884,8 @@ public ReversedCharsIterator(IList reversedRange, GlyphLine line) { } } else { - outStart.Add(line.start); - outEnd.Add(line.end); + outStart.Add(line.GetStart()); + outEnd.Add(line.GetEnd()); reversed.Add(false); } } diff --git a/itext/itext.layout/itext/layout/renderer/TextSequenceWordWrapping.cs b/itext/itext.layout/itext/layout/renderer/TextSequenceWordWrapping.cs index 0d27e1d4e7..bde70d3e1a 100644 --- a/itext/itext.layout/itext/layout/renderer/TextSequenceWordWrapping.cs +++ b/itext/itext.layout/itext/layout/renderer/TextSequenceWordWrapping.cs @@ -193,7 +193,7 @@ public static TextSequenceWordWrapping.LastFittingChildRendererData GetIndexAndL break; } if (textLayoutResult.IsContainsPossibleBreak() && textLayoutResult.GetStatus() != LayoutResult.NOTHING) { - textRenderer.SetIndexOfFirstCharacterToBeForcedToOverflow(textRenderer.line.end); + textRenderer.SetIndexOfFirstCharacterToBeForcedToOverflow(textRenderer.line.GetEnd()); LayoutArea layoutArea = textRenderer.GetOccupiedArea().Clone(); layoutArea.GetBBox().IncreaseHeight(OCCUPIED_AREA_RELAYOUT_EPS).IncreaseWidth(OCCUPIED_AREA_RELAYOUT_EPS); // Here we relayout the child with the possible break using its own occupied area as @@ -287,8 +287,8 @@ public static TextSequenceWordWrapping.LastFittingChildRendererData GetIndexAndL GlyphLine splitText = splitTextRenderer.text; if (splitTextRenderer.Length() > 0) { fittingLengthWithTrailingRightSideSpaces = splitTextRenderer.Length(); - while (splitText.end + amountOfTrailingRightSideSpaces < splitText.Size() && iText.IO.Util.TextUtil.IsWhitespace - (splitText.Get(splitText.end + amountOfTrailingRightSideSpaces))) { + while (splitText.GetEnd() + amountOfTrailingRightSideSpaces < splitText.Size() && iText.IO.Util.TextUtil.IsWhitespace + (splitText.Get(splitText.GetEnd() + amountOfTrailingRightSideSpaces))) { fittingLengthWithTrailingRightSideSpaces++; amountOfTrailingRightSideSpaces++; } @@ -300,10 +300,10 @@ public static TextSequenceWordWrapping.LastFittingChildRendererData GetIndexAndL IList breakPoints = textRenderer.GetSpecialScriptsWordBreakPoints(); if (breakPoints != null && breakPoints.Count > 0 && breakPoints[0] != -1) { int possibleBreakPointPosition = TextRenderer.FindPossibleBreaksSplitPosition(textRenderer.GetSpecialScriptsWordBreakPoints - (), fittingLengthWithTrailingRightSideSpaces + textRenderer.text.start, false); + (), fittingLengthWithTrailingRightSideSpaces + textRenderer.text.GetStart(), false); if (possibleBreakPointPosition > -1) { splitPosition = breakPoints[possibleBreakPointPosition] - amountOfTrailingRightSideSpaces; - needToSplitRendererContainingLastFullyFittingWord = splitPosition != textRenderer.text.end; + needToSplitRendererContainingLastFullyFittingWord = splitPosition != textRenderer.text.GetEnd(); if (!needToSplitRendererContainingLastFullyFittingWord) { analyzedTextRendererIndex++; } @@ -349,7 +349,7 @@ public static TextSequenceWordWrapping.LastFittingChildRendererData GetIndexAndL ]; if (needToSplitRendererContainingLastFullyFittingWord) { int amountOfFitOnTheFirstLayout = fittingLengthWithTrailingRightSideSpaces - amountOfTrailingRightSideSpaces - + childRenderer.text.start; + + childRenderer.text.GetStart(); if (amountOfFitOnTheFirstLayout != splitPosition) { LayoutArea layoutArea = childRenderer.GetOccupiedArea().Clone(); layoutArea.GetBBox().IncreaseHeight(OCCUPIED_AREA_RELAYOUT_EPS).IncreaseWidth(OCCUPIED_AREA_RELAYOUT_EPS); @@ -700,15 +700,15 @@ private static void FillActualTextChunkRelatedLists(GlyphLine glyphLine, IList 1) { + if (@params.GetColorSpecBoxes() != null && @params.GetColorSpecBoxes().Count > 1) { int numOfApprox0x01 = 0; - foreach (Jpeg2000ImageData.ColorSpecBox colorSpecBox in @params.colorSpecBoxes) { + foreach (Jpeg2000ImageData.ColorSpecBox colorSpecBox in @params.GetColorSpecBoxes()) { if (colorSpecBox.GetApprox() == 1) { ++numOfApprox0x01; if (numOfApprox0x01 == 1 && colorSpecBox.GetMeth() != 1 && colorSpecBox.GetMeth() != 2 && colorSpecBox.GetMeth @@ -899,7 +899,7 @@ protected internal override void CheckImage(PdfStream image, PdfDictionary curre // The Bits Per Component box specifies the bit depth of each component. // If the bit depth of all components in the codestream is the same (in both sign and precision), // then this box shall not be found. Otherwise, this box specifies the bit depth of each individual component. - if (@params.bpcBoxData != null) { + if (@params.GetBpcBoxData() != null) { throw new PdfAConformanceException(PdfaExceptionMessageConstant.ALL_COLOUR_CHANNELS_IN_THE_JPEG2000_DATA_SHALL_HAVE_THE_SAME_BIT_DEPTH ); } diff --git a/itext/itext.sign/itext/signatures/CertificateInfo.cs b/itext/itext.sign/itext/signatures/CertificateInfo.cs index 5ba382d26f..a3ef2db9f9 100644 --- a/itext/itext.sign/itext/signatures/CertificateInfo.cs +++ b/itext/itext.sign/itext/signatures/CertificateInfo.cs @@ -138,7 +138,7 @@ static X500Name() { } /// A Map with values. - public IDictionary> values = new Dictionary>(); + private readonly IDictionary> values = new Dictionary>(); /// Constructs an X509 name. /// an ASN1 Sequence diff --git a/itext/itext.sign/itext/signatures/LtvVerification.cs b/itext/itext.sign/itext/signatures/LtvVerification.cs index 50d73e6de0..08683b61a8 100644 --- a/itext/itext.sign/itext/signatures/LtvVerification.cs +++ b/itext/itext.sign/itext/signatures/LtvVerification.cs @@ -211,10 +211,12 @@ public virtual bool AddVerification(String signatureName, IOcspClient ocsp, ICrl } if (certInclude == LtvVerification.CertificateInclusion.YES) { foreach (IX509Certificate processedCert in processedCerts) { - validationData.certs.Add(processedCert.GetEncoded()); + IList certs = validationData.GetCerts(); + certs.Add(processedCert.GetEncoded()); + validationData.SetCerts(certs); } } - if (validationData.crls.IsEmpty() && validationData.ocsps.IsEmpty()) { + if (validationData.GetCrls().IsEmpty() && validationData.GetOcsps().IsEmpty()) { return false; } validated.Put(GetSignatureHashKey(signatureName), validationData); @@ -235,14 +237,20 @@ public virtual bool AddVerification(String signatureName, ICollection oc LtvVerification.ValidationData vd = new LtvVerification.ValidationData(); if (ocsps != null) { foreach (byte[] ocsp in ocsps) { - vd.ocsps.Add(LtvVerification.BuildOCSPResponse(ocsp)); + IList ocspsArr = vd.GetOcsps(); + ocspsArr.Add(LtvVerification.BuildOCSPResponse(ocsp)); + vd.SetOcsps(ocspsArr); } } if (crls != null) { - vd.crls.AddAll(crls); + IList crlsArr = vd.GetCrls(); + crlsArr.AddAll(crls); + vd.SetCrls(crlsArr); } if (certs != null) { - vd.certs.AddAll(certs); + IList certsArr = vd.GetCerts(); + certsArr.AddAll(certs); + vd.SetCerts(certsArr); } validated.Put(GetSignatureHashKey(signatureName), vd); return true; @@ -336,7 +344,9 @@ private void AddRevocationDataForCertificate(IX509Certificate signingCert, IX509 ocspEnc = ocsp.GetEncoded(cert, GetParent(cert, certificateChain), null); if (ocspEnc != null && BOUNCY_CASTLE_FACTORY.CreateCertificateStatus().GetGood().Equals(OcspClientBouncyCastle .GetCertificateStatus(ocspEnc))) { - validationData.ocsps.Add(LtvVerification.BuildOCSPResponse(ocspEnc)); + IList ocsps = validationData.GetOcsps(); + ocsps.Add(LtvVerification.BuildOCSPResponse(ocspEnc)); + validationData.SetOcsps(ocsps); revocationDataAdded = true; LOGGER.LogInformation("OCSP added"); if (certOption == LtvVerification.CertificateOption.ALL_CERTIFICATES) { @@ -355,14 +365,16 @@ private void AddRevocationDataForCertificate(IX509Certificate signingCert, IX509 foreach (byte[] cim in cims) { revocationDataAdded = true; bool dup = false; - foreach (byte[] b in validationData.crls) { + foreach (byte[] b in validationData.GetCrls()) { if (JavaUtil.ArraysEquals(b, cim)) { dup = true; break; } } if (!dup) { - validationData.crls.Add(cim); + IList crls = validationData.GetCrls(); + crls.Add(cim); + validationData.SetCrls(crls); LOGGER.LogInformation("CRL added"); if (certOption == LtvVerification.CertificateOption.ALL_CERTIFICATES) { IX509Certificate[] certsList = issuingCertificateRetriever.GetCrlIssuerCertificates(SignUtils.ParseCrlFromStream @@ -513,7 +525,7 @@ private void OutputDss(PdfDictionary dss, PdfDictionary vrim, PdfArray ocsps, Pd PdfArray crl = new PdfArray(); PdfArray cert = new PdfArray(); PdfDictionary vri = new PdfDictionary(); - foreach (byte[] b in validated.Get(vkey).crls) { + foreach (byte[] b in validated.Get(vkey).GetCrls()) { PdfStream ps = new PdfStream(b); ps.SetCompressionLevel(CompressionConstants.DEFAULT_COMPRESSION); ps.MakeIndirect(document); @@ -521,14 +533,14 @@ private void OutputDss(PdfDictionary dss, PdfDictionary vrim, PdfArray ocsps, Pd crls.Add(ps); crls.SetModified(); } - foreach (byte[] b in validated.Get(vkey).ocsps) { + foreach (byte[] b in validated.Get(vkey).GetOcsps()) { PdfStream ps = new PdfStream(b); ps.SetCompressionLevel(CompressionConstants.DEFAULT_COMPRESSION); ocsp.Add(ps); ocsps.Add(ps); ocsps.SetModified(); } - foreach (byte[] b in validated.Get(vkey).certs) { + foreach (byte[] b in validated.Get(vkey).GetCerts()) { PdfStream ps = new PdfStream(b); ps.SetCompressionLevel(CompressionConstants.DEFAULT_COMPRESSION); ps.MakeIndirect(document); @@ -572,11 +584,47 @@ private void OutputDss(PdfDictionary dss, PdfDictionary vrim, PdfArray ocsps, Pd } private class ValidationData { - public IList crls = new List(); + private IList crls = new List(); - public IList ocsps = new List(); + private IList ocsps = new List(); - public IList certs = new List(); + private IList certs = new List(); + + /// Sets the crls byte array. + /// crls + public virtual void SetCrls(IList crls) { + this.crls = crls; + } + + /// Retrieves Crls byte array. + /// crls + public virtual IList GetCrls() { + return crls; + } + + /// Sets the ocsps array. + /// ocsps + public virtual void SetOcsps(IList ocsps) { + this.ocsps = ocsps; + } + + /// Retrieves ocsps byte array. + /// ocsps + public virtual IList GetOcsps() { + return ocsps; + } + + /// Sets the certs byte array. + /// certs + public virtual void SetCerts(IList certs) { + this.certs = certs; + } + + /// Retrieves cert byte array. + /// cert + public virtual IList GetCerts() { + return certs; + } } private IX509Certificate[] RetrieveMissingCertificates(IX509Certificate[] certChain) { diff --git a/port-hash b/port-hash index 48629a1cb7..0cc5b43f67 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -2204b357b7acee16bdabb19b2bea98320abfdf89 +c68258e32f84c44d0627e1651572b658d348f11d From 9f64b25e46f7304c02ec4520be013203ced12f93 Mon Sep 17 00:00:00 2001 From: Guust Ysebie Date: Fri, 6 Sep 2024 12:50:23 +0200 Subject: [PATCH 2/3] Add SECURITY.md DEVSIX-8514 --- SECURITY.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..7b6923f5f8 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,40 @@ +# iText Security Policy + +## Reporting a Vulnerability + +We are committed to maintaining the security of our software. If you discover a security vulnerability, we encourage you to report it to us as soon as possible. + +To report a vulnerability, please visit our [Vulnerability Reporting Page](https://itextpdf.com/report-vulnerability), or email [vulnerability@apryse.com](vulnerability@apryse.com). If you do not receive a response in 2 business days, please follow up as we may not have received your message. + +We follow the procedure of Coordinated Vulnerability Disclosure (CVD) and, to protect the ecosystem, we request that those reporting do the same. Please visit the above page for more information, and follow the steps below to ensure that your report is handled promptly and appropriately: + +1. **Do not disclose the vulnerability publicly** until we have had a chance to address it. +2. **Provide a detailed description** of the vulnerability, including steps to reproduce it, if possible. +3. **Include any relevant information** such as the version of iText Core you are using, your operating system, and any other pertinent details. + +## Security Updates and Patches + + When a vulnerability is reported, we will: + +1. **Investigate and verify** the vulnerability. +2. **Develop and test** a fix for the vulnerability. +3. **Release a patch** as soon as possible. + + +## Known Vulnerabilities + +The iText Knowledge Base has a page for known [Common Vulnerabilities and Exposures](https://kb.itextpdf.com/itext/cves) (CVEs), please check it to ensure your vulnerability has not already been disclosed or addressed. + +## Supported product lines + +See [Compatibility Matrix](https://kb.itextpdf.com/itext/compatibility-matrix) + +## Security Best Practices + +To help ensure the security of your applications using iText Core, we recommend the following best practices: + +1. **Keep iText Core up to date** by regularly checking for and applying updates. +2. **Review and follow** our security guidelines for secure usage. +3. **Monitor your applications** for any unusual activity and investigate any anomalies promptly. + +Thank you for helping us keep iText secure! From 32a29e8ab30d6ce45a315330d327168d4e166a0c Mon Sep 17 00:00:00 2001 From: iText Software Date: Thu, 19 Sep 2024 19:06:52 +0000 Subject: [PATCH 3/3] Update port-hash Add SECURITY.md DEVSIX-8514 Autoported commit. Original commit hash: [1579f6d23] Manual files: SECURITY.md --- port-hash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/port-hash b/port-hash index 0cc5b43f67..f24fe9c74a 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -c68258e32f84c44d0627e1651572b658d348f11d +1579f6d230435438da87a1a905092b5e83310d98

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 yG(ie}<9^%4y`!vZ4|#9uXZRI { new PdfCanvas(stream, new PdfResources(), doc); @@ -868,8 +873,8 @@ public virtual void CanvasStreamFlushedNoException() { ); } - private sealed class _PdfStream_1111 : PdfStream { - public _PdfStream_1111() { + private sealed class _PdfStream_1121 : PdfStream { + public _PdfStream_1121() { this.isFlushed = false; } @@ -889,7 +894,7 @@ public override bool IsFlushed() { public virtual void CanvasInitializationStampingExistingStreamMemoryLimitAware() { String srcFile = SOURCE_FOLDER + "pageWithContent.pdf"; ReaderProperties properties = new ReaderProperties(); - MemoryLimitsAwareHandler handler = new _MemoryLimitsAwareHandler_1134(); + MemoryLimitsAwareHandler handler = new _MemoryLimitsAwareHandler_1144(); handler.SetMaxSizeOfSingleDecompressedPdfStream(1); properties.SetMemoryLimitsAwareHandler(handler); PdfDocument document = new PdfDocument(new PdfReader(srcFile, properties)); @@ -900,8 +905,8 @@ public virtual void CanvasInitializationStampingExistingStreamMemoryLimitAware() ); } - private sealed class _MemoryLimitsAwareHandler_1134 : MemoryLimitsAwareHandler { - public _MemoryLimitsAwareHandler_1134() { + private sealed class _MemoryLimitsAwareHandler_1144 : MemoryLimitsAwareHandler { + public _MemoryLimitsAwareHandler_1144() { } public override bool IsMemoryLimitsAwarenessRequiredOnDecompression(PdfArray filters) { @@ -1234,6 +1239,62 @@ public virtual void IgnorePageRotationForContentTest() { )); } + [NUnit.Framework.Test] + public virtual void GetResourcesTest() { + String outPdf = DESTINATION_FOLDER + "getResourcesDoc.pdf"; + PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outPdf)); + PdfPage page1 = pdfDoc.AddNewPage(); + PdfCanvas canvas = new PdfCanvas(page1); + canvas.SaveState().BeginText().MoveText(150, 400).SetFontAndSize(PdfFontFactory.CreateFont(), 8).ShowText( + "test text").EndText().RestoreState(); + PdfResources resources = canvas.GetResources(); + pdfDoc.Close(); + NUnit.Framework.Assert.AreEqual(1, resources.GetResourceNames().Count); + } + + [NUnit.Framework.Test] + public virtual void AttachContentStreamTest() { + String outPdf = DESTINATION_FOLDER + "attachContentStreamDoc.pdf"; + PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outPdf)); + PdfPage page1 = pdfDoc.AddNewPage(); + PdfCanvas canvas = new PdfCanvas(page1); + canvas.AttachContentStream(new PdfStream("test".GetBytes(System.Text.Encoding.UTF8))); + String contentFromStream = iText.Commons.Utils.JavaUtil.GetStringForBytes(canvas.GetContentStream().GetBytes + (), System.Text.Encoding.UTF8); + pdfDoc.Close(); + NUnit.Framework.Assert.AreEqual("test", contentFromStream); + } + + [NUnit.Framework.Test] + public virtual void GraphicStateFontNullTest() { + String outPdf = DESTINATION_FOLDER + "showTextDoc.pdf"; + using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outPdf))) { + PdfPage page1 = pdfDoc.AddNewPage(); + PdfCanvas canvas = new PdfCanvas(page1); + GlyphLine glyphLine = new GlyphLine(); + canvas.GetGraphicsState().SetFont(null); + ActualTextIterator actualTextIterator = new ActualTextIterator(glyphLine); + NUnit.Framework.Assert.Catch(typeof(PdfException), () => canvas.ShowText(glyphLine, actualTextIterator)); + } + } + + [NUnit.Framework.Test] + public virtual void GlyphlineActualTextTest() { + String outFileName = DESTINATION_FOLDER + "glyphlineActualText.pdf"; + using (PdfDocument pdfDocument = new PdfDocument(CompareTool.CreateTestPdfWriter(outFileName))) { + PdfFont font = PdfFontFactory.CreateFont(FONTS_FOLDER + "NotoSansCJKjp-Bold.otf", PdfEncodings.IDENTITY_H); + IList glyphs = JavaCollectionsUtil.SingletonList(font.GetGlyph((int)'\u65E0')); + GlyphLine glyphLine = new GlyphLine(glyphs); + glyphLine.SetActualText(0, 1, "TEST"); + PdfCanvas canvas = new PdfCanvas(pdfDocument.AddNewPage()); + canvas.SaveState().BeginText().SetFontAndSize(font, 7).ShowText(glyphLine).EndText().RestoreState(); + String contentstream = iText.Commons.Utils.JavaUtil.GetStringForBytes(canvas.GetContentStream().GetBytes() + , System.Text.Encoding.UTF8); + canvas.Release(); + NUnit.Framework.Assert.IsTrue(contentstream.Contains("/ActualText")); + } + } + private void CreateStandardDocument(PdfWriter writer, int pageCount, PdfCanvasTest.ContentProvider contentProvider ) { PdfDocument pdfDoc = new PdfDocument(writer); diff --git a/itext.tests/itext.layout.tests/itext/layout/renderer/LineRendererUnitTest.cs b/itext.tests/itext.layout.tests/itext/layout/renderer/LineRendererUnitTest.cs index 3df96ee8fc..6f1465957b 100644 --- a/itext.tests/itext.layout.tests/itext/layout/renderer/LineRendererUnitTest.cs +++ b/itext.tests/itext.layout.tests/itext/layout/renderer/LineRendererUnitTest.cs @@ -20,6 +20,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ +using System; using System.Collections.Generic; using iText.Commons.Utils; using iText.IO.Font.Constants; @@ -369,5 +370,54 @@ public virtual void ReorderSimpleTest() { NUnit.Framework.Assert.AreSame(dummyImage4, childRenderers[6]); NUnit.Framework.Assert.AreSame(dummyImage5, childRenderers[7]); } + + [NUnit.Framework.Test] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED, Count = 2)] + public virtual void PercentFontSizeNotSupportedTest() { + LineRenderer lineRenderer = new LineRenderer(); + Leading leading = new Leading(Leading.MULTIPLIED, 1); + lineRenderer.SetProperty(Property.FONT_SIZE, UnitValue.CreatePercentValue(35)); + float topLeadingIndent = lineRenderer.GetTopLeadingIndent(leading); + float bottomLeadingIndent = lineRenderer.GetBottomLeadingIndent(leading); + NUnit.Framework.Assert.AreEqual(0.0, topLeadingIndent); + NUnit.Framework.Assert.AreEqual(7.0, bottomLeadingIndent); + } + + [NUnit.Framework.Test] + public virtual void LeadingTypeUnsupportedTest() { + LineRenderer lineRenderer = new LineRenderer(); + Leading leading = new Leading(new Leading(3, 3).GetLeadingType(), 1); + NUnit.Framework.Assert.Catch(typeof(InvalidOperationException), () => lineRenderer.GetTopLeadingIndent(leading + )); + NUnit.Framework.Assert.Catch(typeof(InvalidOperationException), () => lineRenderer.GetBottomLeadingIndent( + leading)); + } + + [NUnit.Framework.Test] + public virtual void GetGlyphTest() { + Document dummyDocument = CreateDummyDocument(); + TextRenderer textRenderer = CreateLayoutedTextRenderer("hello", dummyDocument); + LineRenderer.RendererGlyph rendererGlyph = new LineRenderer.RendererGlyph(null, textRenderer); + rendererGlyph.SetGlyph(new Glyph('\n', 0, '\n')); + Glyph glyph = rendererGlyph.GetGlyph(); + NUnit.Framework.Assert.AreEqual(1, glyph.GetChars().Length); + NUnit.Framework.Assert.AreEqual(0, glyph.GetWidth()); + NUnit.Framework.Assert.AreEqual(10, glyph.GetUnicode()); + NUnit.Framework.Assert.AreEqual(10, glyph.GetCode()); + NUnit.Framework.Assert.IsFalse(glyph.IsMark()); + } + + [NUnit.Framework.Test] + public virtual void GetRendererTest() { + Document dummyDocument = CreateDummyDocument(); + LineRenderer.RendererGlyph rendererGlyph = new LineRenderer.RendererGlyph(new Glyph('\n', 0, '\n'), null); + TextRenderer textRenderer = CreateLayoutedTextRenderer("hello", dummyDocument); + rendererGlyph.SetRenderer(textRenderer); + TextRenderer renderer = rendererGlyph.GetRenderer(); + NUnit.Framework.Assert.AreEqual("hello", renderer.GetText().ToString()); + NUnit.Framework.Assert.AreEqual(0, renderer.GetText().GetStart()); + NUnit.Framework.Assert.AreEqual(5, renderer.GetText().GetEnd()); + NUnit.Framework.Assert.AreEqual(0, renderer.GetText().GetIdx()); + } } } diff --git a/itext.tests/itext.layout.tests/itext/layout/renderer/TextRendererIntegrationTest.cs b/itext.tests/itext.layout.tests/itext/layout/renderer/TextRendererIntegrationTest.cs index 1445edfffc..a1a2a5c212 100644 --- a/itext.tests/itext.layout.tests/itext/layout/renderer/TextRendererIntegrationTest.cs +++ b/itext.tests/itext.layout.tests/itext/layout/renderer/TextRendererIntegrationTest.cs @@ -21,6 +21,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ using System; +using System.IO; using System.Text; using iText.IO.Font; using iText.IO.Font.Otf; @@ -29,6 +30,7 @@ You should have received a copy of the GNU Affero General Public License using iText.Kernel.Font; using iText.Kernel.Geom; using iText.Kernel.Pdf; +using iText.Kernel.Pdf.Canvas; using iText.Kernel.Utils; using iText.Layout; using iText.Layout.Borders; @@ -467,19 +469,19 @@ public virtual void CustomTextRendererShouldOverrideGetNextRendererTest() { Document doc = new Document(pdfDoc); Text text = new Text("If getNextRenderer() is not overridden and text overflows to the next line," + " then customizations are not applied. " ); - text.SetNextRenderer(new _TextRenderer_738(text)); + text.SetNextRenderer(new _TextRenderer_742(text)); doc.Add(new Paragraph(text)); text = new Text("If getNextRenderer() is overridden and text overflows to the next line, " + "then customizations are applied. " ); - text.SetNextRenderer(new _TextRenderer_754(text)); + text.SetNextRenderer(new _TextRenderer_758(text)); doc.Add(new Paragraph(text)); doc.Close(); NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder )); } - private sealed class _TextRenderer_738 : TextRenderer { - public _TextRenderer_738(Text baseArg1) + private sealed class _TextRenderer_742 : TextRenderer { + public _TextRenderer_742(Text baseArg1) : base(baseArg1) { } @@ -490,8 +492,8 @@ public override void Draw(DrawContext drawContext) { } } - private sealed class _TextRenderer_754 : TextRenderer { - public _TextRenderer_754(Text baseArg1) + private sealed class _TextRenderer_758 : TextRenderer { + public _TextRenderer_758(Text baseArg1) : base(baseArg1) { } @@ -585,7 +587,7 @@ public virtual void CustomTextRendererShouldOverrideCreateCopyTest() { longTextBuilder.Append("Дзень добры, свет! Hallo Welt! "); } iText.Layout.Element.Text text = new iText.Layout.Element.Text(longTextBuilder.ToString()); - text.SetNextRenderer(new _TextRenderer_889(text)); + text.SetNextRenderer(new _TextRenderer_893(text)); doc.Add(new Paragraph(text)); text.SetNextRenderer(new TextRendererIntegrationTest.TextRendererWithOverriddenGetNextRenderer(text)); doc.Add(new Paragraph(text)); @@ -594,8 +596,8 @@ public virtual void CustomTextRendererShouldOverrideCreateCopyTest() { )); } - private sealed class _TextRenderer_889 : TextRenderer { - public _TextRenderer_889(iText.Layout.Element.Text baseArg1) + private sealed class _TextRenderer_893 : TextRenderer { + public _TextRenderer_893(iText.Layout.Element.Text baseArg1) : base(baseArg1) { } @@ -611,6 +613,104 @@ public override IRenderer GetNextRenderer() { } } + [NUnit.Framework.Test] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.OCCUPIED_AREA_HAS_NOT_BEEN_INITIALIZED, Count = 1)] + public virtual void DrawWithSkewAndHorizontalScalingTest() { + using (PdfDocument pdfDocument = new PdfDocument(new PdfWriter(new MemoryStream()))) { + Document doc = new Document(pdfDocument); + iText.Layout.Element.Text text = new iText.Layout.Element.Text("test string").SetTextRise(0).SetWordSpacing + (0).SetSkew(10, 10).SetHorizontalScaling(2); + Paragraph paragraph = new Paragraph().Add(text); + paragraph.SetNextRenderer(new _TextRenderer_932(text)); + doc.Add(paragraph); + String contentstream = iText.Commons.Utils.JavaUtil.GetStringForBytes(doc.GetPdfDocument().GetPage(1).GetContentBytes + (), System.Text.Encoding.UTF8); + NUnit.Framework.Assert.IsTrue(contentstream.Contains("test string")); + } + } + + private sealed class _TextRenderer_932 : TextRenderer { + public _TextRenderer_932(iText.Layout.Element.Text baseArg1) + : base(baseArg1) { + } + + public override void Draw(DrawContext drawContext) { + drawContext.GetCanvas().SaveState().Rectangle(this.occupiedArea.GetBBox()).Fill().RestoreState(); + base.Draw(drawContext); + } + + public override IRenderer GetNextRenderer() { + return new TextRendererIntegrationTest.TextRendererWithOverriddenGetNextRenderer((iText.Layout.Element.Text + )this.modelElement); + } + } + + [NUnit.Framework.Test] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.OCCUPIED_AREA_HAS_NOT_BEEN_INITIALIZED, Count = 1)] + public virtual void DrawTextRenderingModeFillStrokeTest() { + using (PdfDocument pdfDocument = new PdfDocument(new PdfWriter(new MemoryStream()))) { + Document doc = new Document(pdfDocument); + iText.Layout.Element.Text text = new iText.Layout.Element.Text("test string").SetTextRenderingMode(PdfCanvasConstants.TextRenderingMode + .FILL_STROKE); + Paragraph paragraph = new Paragraph().Add(text).SetBackgroundColor(ColorConstants.YELLOW).SetWidth(10).SetStrokeWidth + (1f).SetStrokeColor(null).SetBorder(new SolidBorder(1)); + paragraph.SetNextRenderer(new _TextRenderer_970(text)); + doc.Add(paragraph); + String contentstream = iText.Commons.Utils.JavaUtil.GetStringForBytes(doc.GetPdfDocument().GetPage(1).GetContentBytes + (), System.Text.Encoding.UTF8); + NUnit.Framework.Assert.IsTrue(contentstream.Contains("test string")); + } + } + + private sealed class _TextRenderer_970 : TextRenderer { + public _TextRenderer_970(iText.Layout.Element.Text baseArg1) + : base(baseArg1) { + } + + public override void Draw(DrawContext drawContext) { + drawContext.GetCanvas().SaveState().Rectangle(this.occupiedArea.GetBBox()).Fill().RestoreState(); + base.Draw(drawContext); + } + + public override IRenderer GetNextRenderer() { + return new TextRendererIntegrationTest.TextRendererWithOverriddenGetNextRenderer((iText.Layout.Element.Text + )this.modelElement); + } + } + + [NUnit.Framework.Test] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.OCCUPIED_AREA_HAS_NOT_BEEN_INITIALIZED, Count = 1)] + public virtual void FontColorNullTest() { + using (PdfDocument pdfDocument = new PdfDocument(new PdfWriter(new MemoryStream()))) { + Document doc = new Document(pdfDocument); + iText.Layout.Element.Text text = new iText.Layout.Element.Text("test string").SetTextRenderingMode(PdfCanvasConstants.TextRenderingMode + .FILL_STROKE); + Paragraph paragraph = new Paragraph().Add(text); + paragraph.SetNextRenderer(new _TextRenderer_1003(text)); + doc.Add(paragraph); + String contentstream = iText.Commons.Utils.JavaUtil.GetStringForBytes(doc.GetPdfDocument().GetPage(1).GetContentBytes + (), System.Text.Encoding.UTF8); + NUnit.Framework.Assert.IsTrue(contentstream.Contains("test string")); + } + } + + private sealed class _TextRenderer_1003 : TextRenderer { + public _TextRenderer_1003(iText.Layout.Element.Text baseArg1) + : base(baseArg1) { + } + + public override void Draw(DrawContext drawContext) { + drawContext.GetCanvas().SaveState().Rectangle(this.occupiedArea.GetBBox()).Fill().RestoreState(); + this.SetProperty(Property.FONT_COLOR, new TransparentColor(ColorConstants.RED)); + base.Draw(drawContext); + } + + public override IRenderer GetNextRenderer() { + return new TextRendererIntegrationTest.TextRendererWithOverriddenGetNextRenderer((iText.Layout.Element.Text + )this.modelElement); + } + } + private class TextRendererWithOverriddenGetNextRenderer : TextRenderer { public TextRendererWithOverriddenGetNextRenderer(iText.Layout.Element.Text textElement) : base(textElement) { diff --git a/itext.tests/itext.layout.tests/itext/layout/renderer/TextRendererTest.cs b/itext.tests/itext.layout.tests/itext/layout/renderer/TextRendererTest.cs index 654cdce286..c1a67ffd78 100644 --- a/itext.tests/itext.layout.tests/itext/layout/renderer/TextRendererTest.cs +++ b/itext.tests/itext.layout.tests/itext/layout/renderer/TextRendererTest.cs @@ -110,8 +110,8 @@ public virtual void SetTextGlyphLineAndPositionsParamTest() { glyphLine.Add(glyph); } renderer.SetText(new GlyphLine(), pdfFont); - glyphLine.start = 1; - glyphLine.end = 2; + glyphLine.SetStart(1); + glyphLine.SetEnd(2); renderer.SetText(glyphLine, pdfFont); GlyphLine actualLine = renderer.GetText(); NUnit.Framework.Assert.IsFalse(actualLine == glyphLine); @@ -120,8 +120,8 @@ public virtual void SetTextGlyphLineAndPositionsParamTest() { // Check that the glyph line has been processed using the replaceSpecialWhitespaceGlyphs method NUnit.Framework.Assert.AreEqual(space.GetCode(), glyph_1.GetCode()); NUnit.Framework.Assert.AreEqual(space.GetWidth(), glyph_1.GetWidth()); - NUnit.Framework.Assert.AreEqual(1, actualLine.start); - NUnit.Framework.Assert.AreEqual(2, actualLine.end); + NUnit.Framework.Assert.AreEqual(1, actualLine.GetStart()); + NUnit.Framework.Assert.AreEqual(2, actualLine.GetEnd()); } ///