From dd6c15e0756c3999ef8f50dee8eda362c3f18728 Mon Sep 17 00:00:00 2001 From: Vitali Prudnikovich Date: Mon, 3 Feb 2025 12:15:03 +0000 Subject: [PATCH 01/10] =?UTF-8?q?=EF=BB=BFFix=20annotation=20UA-1=20checks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DEVSIX-8679 Autoported commit. Original commit hash: [e17315386] --- .../itext/pdfua/PdfUAAnnotationsTest.cs | 177 ++++++++---------- ...mp_screenAnnotationWithBEMediaDataTest.pdf | Bin 5093 -> 0 bytes ...mp_screenAnnotationWithMHMediaDataTest.pdf | Bin 5093 -> 0 bytes .../cmp_ua1ScreenAnnotWithAltTest.pdf | Bin 4600 -> 0 bytes .../cmp_ua1StampAnnotWithAltTest.pdf | Bin 4658 -> 0 bytes .../checkers/utils/AnnotationCheckUtil.cs | 5 +- .../PdfUAExceptionMessageConstants.cs | 4 +- port-hash | 2 +- 8 files changed, 85 insertions(+), 103 deletions(-) delete mode 100644 itext.tests/itext.pdfua.tests/resources/itext/pdfua/PdfUAAnnotationsTest/cmp_screenAnnotationWithBEMediaDataTest.pdf delete mode 100644 itext.tests/itext.pdfua.tests/resources/itext/pdfua/PdfUAAnnotationsTest/cmp_screenAnnotationWithMHMediaDataTest.pdf delete mode 100644 itext.tests/itext.pdfua.tests/resources/itext/pdfua/PdfUAAnnotationsTest/cmp_ua1ScreenAnnotWithAltTest.pdf delete mode 100644 itext.tests/itext.pdfua.tests/resources/itext/pdfua/PdfUAAnnotationsTest/cmp_ua1StampAnnotWithAltTest.pdf diff --git a/itext.tests/itext.pdfua.tests/itext/pdfua/PdfUAAnnotationsTest.cs b/itext.tests/itext.pdfua.tests/itext/pdfua/PdfUAAnnotationsTest.cs index 7b78dabad3..0105a551b2 100644 --- a/itext.tests/itext.pdfua.tests/itext/pdfua/PdfUAAnnotationsTest.cs +++ b/itext.tests/itext.pdfua.tests/itext/pdfua/PdfUAAnnotationsTest.cs @@ -37,16 +37,13 @@ You should have received a copy of the GNU Affero General Public License using iText.Kernel.Pdf.Tagging; using iText.Kernel.Pdf.Tagutils; using iText.Kernel.Pdf.Xobject; -using iText.Kernel.Utils; using iText.Layout; using iText.Layout.Element; using iText.Layout.Properties; using iText.Pdfua.Exceptions; using iText.Test; -using iText.Test.Pdfa; namespace iText.Pdfua { - // Android-Conversion-Skip-Line (TODO DEVSIX-7377 introduce pdf/ua validation on Android) [NUnit.Framework.Category("IntegrationTest")] public class PdfUAAnnotationsTest : ExtendedITextTest { private static readonly String SOURCE_FOLDER = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext @@ -72,12 +69,12 @@ public virtual void InitializeFramework() { [NUnit.Framework.Test] public virtual void Ua1LinkAnnotNoDirectChildOfAnnotTest() { - framework.AddSuppliers(new _Generator_118()); + framework.AddSuppliers(new _Generator_115()); framework.AssertBothValid("ua1LinkAnnotNoDirectChildOfAnnotTest"); } - private sealed class _Generator_118 : UaValidationTestFramework.Generator { - public _Generator_118() { + private sealed class _Generator_115 : UaValidationTestFramework.Generator { + public _Generator_115() { } public IBlockElement Generate() { @@ -121,8 +118,7 @@ public virtual void Ua1WidgetAnnotNoDirectChildOfAnnotAutomaticConformanceLevelT [NUnit.Framework.Test] public virtual void Ua1PrinterMAnnotNoDirectChildOfAnnotTest() { - String outPdf = DESTINATION_FOLDER + "ua1PrinterMAnnotNoDirectChildOfAnnotTest.pdf"; - using (PdfUATestPdfDocument pdfDoc = new PdfUATestPdfDocument(new PdfWriter(outPdf))) { + framework.AddBeforeGenerationHook((pdfDoc) => { PdfPage pdfPage = pdfDoc.AddNewPage(); PdfFormXObject form = new PdfFormXObject(PageSize.A4); PdfCanvas canvas = new PdfCanvas(form, pdfDoc); @@ -133,10 +129,11 @@ public virtual void Ua1PrinterMAnnotNoDirectChildOfAnnotTest() { annot.SetFlag(PdfAnnotation.HIDDEN); pdfPage.AddAnnotation(annot); } - NUnit.Framework.Assert.IsNull(new VeraPdfValidator().Validate(outPdf)); - // Android-Conversion-Skip-Line (TODO DEVSIX-7377 introduce pdf\a validation on Android) - using (PdfDocument pdfDoc_1 = new PdfDocument(new PdfReader(outPdf))) { - IStructureNode docNode = pdfDoc_1.GetStructTreeRoot().GetKids()[0]; + ); + framework.AssertBothValid("ua1PrinterMAnnotNoDirectChildOfAnnotTest"); + using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(DESTINATION_FOLDER + "layout_ua1PrinterMAnnotNoDirectChildOfAnnotTest.pdf" + ))) { + IStructureNode docNode = pdfDoc.GetStructTreeRoot().GetKids()[0]; NUnit.Framework.Assert.AreEqual(PdfName.Document, docNode.GetRole()); NUnit.Framework.Assert.AreEqual(PdfName.PrinterMark, ((PdfObjRef)docNode.GetKids()[0]).GetReferencedObject ().Get(PdfName.Subtype)); @@ -210,43 +207,32 @@ public virtual void Ua1PopupWithoutContentOrAltTest() { [NUnit.Framework.Test] public virtual void Ua1StampAnnotWithAltTest() { - String outPdf = DESTINATION_FOLDER + "ua1StampAnnotWithAltTest.pdf"; - PdfUATestPdfDocument pdfDoc = new PdfUATestPdfDocument(new PdfWriter(outPdf)); - PdfPage pdfPage = pdfDoc.AddNewPage(); - PdfStampAnnotation stamp = new PdfStampAnnotation(new Rectangle(0, 0, 100, 50)); - stamp.SetStampName(PdfName.Approved); - stamp.GetPdfObject().Put(PdfName.Type, PdfName.Annot); - pdfPage.AddAnnotation(stamp); - stamp.GetPdfObject().Put(PdfName.Alt, new PdfString("Alt description")); - pdfPage.AddAnnotation(stamp); - NUnit.Framework.Assert.DoesNotThrow(() => { - pdfDoc.Close(); + framework.AddBeforeGenerationHook((pdfDoc) => { + PdfPage pdfPage = pdfDoc.AddNewPage(); + PdfStampAnnotation stamp = new PdfStampAnnotation(new Rectangle(0, 0, 100, 50)); + stamp.SetStampName(PdfName.Approved); + stamp.GetPdfObject().Put(PdfName.Type, PdfName.Annot); + pdfPage.AddAnnotation(stamp); + TagTreePointer tagPointer = pdfDoc.GetTagStructureContext().GetAutoTaggingPointer(); + tagPointer.GetProperties().SetAlternateDescription("Alt description"); } ); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outPdf, SOURCE_FOLDER + "cmp_ua1StampAnnotWithAltTest.pdf" - , DESTINATION_FOLDER, "diff_")); - new VeraPdfValidator().ValidateFailure(outPdf); + framework.AssertBothValid("ua1StampAnnotWithAltTest"); } - // Android-Conversion-Skip-Line (TODO DEVSIX-7377 introduce pdf/ua validation on Android) [NUnit.Framework.Test] public virtual void Ua1ScreenAnnotWithAltTest() { - String outPdf = DESTINATION_FOLDER + "ua1ScreenAnnotWithAltTest.pdf"; - PdfUATestPdfDocument pdfDoc = new PdfUATestPdfDocument(new PdfWriter(outPdf)); - PdfPage pdfPage = pdfDoc.AddNewPage(); - PdfScreenAnnotation screen = new PdfScreenAnnotation(new Rectangle(100, 100)); - pdfPage.AddAnnotation(screen); - screen.GetPdfObject().Put(PdfName.Alt, new PdfString("Alt description")); - NUnit.Framework.Assert.DoesNotThrow(() => { - pdfDoc.Close(); + framework.AddBeforeGenerationHook((pdfDoc) => { + PdfPage pdfPage = pdfDoc.AddNewPage(); + PdfScreenAnnotation screen = new PdfScreenAnnotation(new Rectangle(100, 100)); + pdfPage.AddAnnotation(screen); + TagTreePointer tagPointer = pdfDoc.GetTagStructureContext().GetAutoTaggingPointer(); + tagPointer.GetProperties().SetAlternateDescription("Alt description"); } ); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outPdf, SOURCE_FOLDER + "cmp_ua1ScreenAnnotWithAltTest.pdf" - , DESTINATION_FOLDER, "diff_")); - new VeraPdfValidator().ValidateFailure(outPdf); + framework.AssertBothValid("ua1ScreenAnnotWithAltTest"); } - // Android-Conversion-Skip-Line (TODO DEVSIX-7377 introduce pdf/ua validation on Android) [NUnit.Framework.Test] public virtual void Ua1InkAnnotDirectChildOfAnnotTest() { framework.AddBeforeGenerationHook((pdfDoc) => { @@ -423,14 +409,13 @@ public virtual void LinkAnnotWithoutContentsTest() { Document doc = new Document(pdfDoc); Paragraph p2 = new Paragraph("Text"); p2.SetFont(LoadFont()); - p2.GetAccessibilityProperties().SetRole(StandardRoles.LINK); + p2.GetAccessibilityProperties().SetRole(StandardRoles.LINK).SetAlternateDescription("Alt description"); p2.SetProperty(Property.LINK_ANNOTATION, annot); doc.Add(p2); - doc.GetPdfDocument().GetPage(1).GetPdfObject().GetAsArray(PdfName.Annots).GetAsDictionary(0).Put(PdfName.Alt - , new PdfString("Alt description")); } ); - framework.AssertBothFail("linkAnnotNestedWithinLinkWithAnAlternateDescriptionTest"); + framework.AssertBothFail("linkAnnotNestedWithinLinkWithAnAlternateDescriptionTest", PdfUAExceptionMessageConstants + .LINK_ANNOTATION_SHOULD_HAVE_CONTENTS_KEY); } [NUnit.Framework.Test] @@ -481,7 +466,7 @@ public virtual void LinkAnnotNotDirectChildOfLinkButOutsideTest2() { public virtual void ScreenAnnotationWithMediaDataTest() { framework.AddBeforeGenerationHook((pdfDoc) => { PdfPage page = pdfDoc.AddNewPage(); - PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, "sample.wav"); + PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, SOURCE_FOLDER + "sample.wav"); PdfScreenAnnotation screen = new PdfScreenAnnotation(new Rectangle(100, 100)); PdfAction action = PdfAction.CreateRendition("sample.wav", spec, "audio/x-wav", screen); screen.SetAction(action); @@ -498,7 +483,7 @@ public virtual void ScreenAnnotationWithMediaDataTest() { public virtual void ScreenAnnotationAsAAWithMediaDataTest() { framework.AddBeforeGenerationHook((pdfDoc) => { PdfPage page = pdfDoc.AddNewPage(); - PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, "sample.wav"); + PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, SOURCE_FOLDER + "sample.wav"); PdfScreenAnnotation screen = new PdfScreenAnnotation(new Rectangle(100, 100)); PdfAction action = PdfAction.CreateRendition("sample.wav", spec, "audio/x-wav", screen); screen.SetAdditionalAction(PdfName.E, action); @@ -513,60 +498,56 @@ public virtual void ScreenAnnotationAsAAWithMediaDataTest() { [NUnit.Framework.Test] public virtual void ScreenAnnotationWithBEMediaDataTest() { - String outPdf = DESTINATION_FOLDER + "screenAnnotationWithBEMediaDataTest.pdf"; - PdfDocument pdfDoc = new PdfUATestPdfDocument(new PdfWriter(outPdf)); - PdfPage page = pdfDoc.AddNewPage(); - String file = "sample.wav"; - String mimeType = "audio/x-wav"; - PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, file); - PdfScreenAnnotation screen = new PdfScreenAnnotation(new Rectangle(100, 100)); - PdfDictionary be = new PdfDictionary(); - PdfDictionary mediaClipData = new PdfMediaClipData(file, spec, mimeType).GetPdfObject(); - mediaClipData.Put(PdfName.Alt, new PdfArray()); - be.Put(PdfName.C, mediaClipData); - PdfDictionary rendition = new PdfDictionary(); - rendition.Put(PdfName.S, PdfName.MR); - rendition.Put(PdfName.N, new PdfString(MessageFormatUtil.Format("Rendition for {0}", file))); - rendition.Put(PdfName.BE, be); - PdfAction action = new PdfAction().Put(PdfName.S, PdfName.Rendition).Put(PdfName.OP, new PdfNumber(0)).Put - (PdfName.AN, screen.GetPdfObject()).Put(PdfName.R, new PdfRendition(rendition).GetPdfObject()); - screen.SetAction(action); - screen.SetContents("screen annotation"); - page.AddAnnotation(screen); - pdfDoc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outPdf, SOURCE_FOLDER + "cmp_screenAnnotationWithBEMediaDataTest.pdf" - , DESTINATION_FOLDER, "diff_")); + framework.AddBeforeGenerationHook((pdfDoc) => { + PdfPage page = pdfDoc.AddNewPage(); + String file = "sample.wav"; + String mimeType = "audio/x-wav"; + PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, SOURCE_FOLDER + file); + PdfScreenAnnotation screen = new PdfScreenAnnotation(new Rectangle(100, 100)); + PdfDictionary be = new PdfDictionary(); + PdfDictionary mediaClipData = new PdfMediaClipData(file, spec, mimeType).GetPdfObject(); + mediaClipData.Put(PdfName.Alt, new PdfArray()); + be.Put(PdfName.C, mediaClipData); + PdfDictionary rendition = new PdfDictionary(); + rendition.Put(PdfName.S, PdfName.MR); + rendition.Put(PdfName.N, new PdfString(MessageFormatUtil.Format("Rendition for {0}", file))); + rendition.Put(PdfName.BE, be); + PdfAction action = new PdfAction().Put(PdfName.S, PdfName.Rendition).Put(PdfName.OP, new PdfNumber(0)).Put + (PdfName.AN, screen.GetPdfObject()).Put(PdfName.R, new PdfRendition(rendition).GetPdfObject()); + screen.SetAction(action); + screen.SetContents("screen annotation"); + page.AddAnnotation(screen); + } + ); + framework.AssertBothValid("screenAnnotationWithBEMediaDataTest"); } - //Verapdf throws runtime exception, so we don't do this check here. [NUnit.Framework.Test] public virtual void ScreenAnnotationWithMHMediaDataTest() { - String outPdf = DESTINATION_FOLDER + "screenAnnotationWithMHMediaDataTest.pdf"; - PdfDocument pdfDoc = new PdfUATestPdfDocument(new PdfWriter(outPdf)); - PdfPage page = pdfDoc.AddNewPage(); - String file = "sample.wav"; - String mimeType = "audio/x-wav"; - PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, file); - PdfScreenAnnotation screen = new PdfScreenAnnotation(new Rectangle(100, 100)); - PdfDictionary mh = new PdfDictionary(); - PdfDictionary mediaClipData = new PdfMediaClipData(file, spec, mimeType).GetPdfObject(); - mediaClipData.Put(PdfName.Alt, new PdfArray()); - mh.Put(PdfName.C, mediaClipData); - PdfDictionary rendition = new PdfDictionary(); - rendition.Put(PdfName.S, PdfName.MR); - rendition.Put(PdfName.N, new PdfString(MessageFormatUtil.Format("Rendition for {0}", file))); - rendition.Put(PdfName.MH, mh); - PdfAction action = new PdfAction().Put(PdfName.S, PdfName.Rendition).Put(PdfName.OP, new PdfNumber(0)).Put - (PdfName.AN, screen.GetPdfObject()).Put(PdfName.R, new PdfRendition(rendition).GetPdfObject()); - screen.SetAction(action); - screen.SetContents("screen annotation"); - page.AddAnnotation(screen); - pdfDoc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outPdf, SOURCE_FOLDER + "cmp_screenAnnotationWithMHMediaDataTest.pdf" - , DESTINATION_FOLDER, "diff_")); + framework.AddBeforeGenerationHook((pdfDoc) => { + PdfPage page = pdfDoc.AddNewPage(); + String file = "sample.wav"; + String mimeType = "audio/x-wav"; + PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, SOURCE_FOLDER + file); + PdfScreenAnnotation screen = new PdfScreenAnnotation(new Rectangle(100, 100)); + PdfDictionary mh = new PdfDictionary(); + PdfDictionary mediaClipData = new PdfMediaClipData(file, spec, mimeType).GetPdfObject(); + mediaClipData.Put(PdfName.Alt, new PdfArray()); + mh.Put(PdfName.C, mediaClipData); + PdfDictionary rendition = new PdfDictionary(); + rendition.Put(PdfName.S, PdfName.MR); + rendition.Put(PdfName.N, new PdfString(MessageFormatUtil.Format("Rendition for {0}", file))); + rendition.Put(PdfName.MH, mh); + PdfAction action = new PdfAction().Put(PdfName.S, PdfName.Rendition).Put(PdfName.OP, new PdfNumber(0)).Put + (PdfName.AN, screen.GetPdfObject()).Put(PdfName.R, new PdfRendition(rendition).GetPdfObject()); + screen.SetAction(action); + screen.SetContents("screen annotation"); + page.AddAnnotation(screen); + } + ); + framework.AssertBothValid("screenAnnotationWithMHMediaDataTest"); } - //Verapdf throws runtime exception, so we don't do this check here. [NUnit.Framework.Test] public virtual void ScreenAnnotationWithMHWithoutAltMediaDataTest() { String outPdf = DESTINATION_FOLDER + "screenAnnotationWithInvalidMHMediaDataTest.pdf"; @@ -574,7 +555,7 @@ public virtual void ScreenAnnotationWithMHWithoutAltMediaDataTest() { PdfPage page = pdfDoc.AddNewPage(); String file = "sample.wav"; String mimeType = "audio/x-wav"; - PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, file); + PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, SOURCE_FOLDER + file); PdfScreenAnnotation screen = new PdfScreenAnnotation(new Rectangle(100, 100)); PdfDictionary mh = new PdfDictionary(); PdfDictionary mediaClipData = new PdfMediaClipData(file, spec, mimeType).GetPdfObject(); @@ -596,12 +577,12 @@ public virtual void ScreenAnnotationWithMHWithoutAltMediaDataTest() { .Message); } - //Verapdf throws runtime exception, so we don't do this check here. + // Verapdf doesn't fail here but it should [NUnit.Framework.Test] public virtual void ScreenAnnotationWithoutAltInMediaDataTest() { framework.AddBeforeGenerationHook((pdfDoc) => { PdfPage page = pdfDoc.AddNewPage(); - PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, "sample.wav"); + PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, SOURCE_FOLDER + "sample.wav"); PdfScreenAnnotation screen = new PdfScreenAnnotation(new Rectangle(100, 100)); PdfAction action = PdfAction.CreateRendition("sample.wav", spec, "audio/x-wav", screen); screen.SetAction(action); @@ -617,7 +598,7 @@ public virtual void ScreenAnnotationWithoutAltInMediaDataTest() { public virtual void ScreenAnnotationAsAAWithoutAltInMediaDataTest() { framework.AddBeforeGenerationHook((pdfDoc) => { PdfPage page = pdfDoc.AddNewPage(); - PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, "sample.wav"); + PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, SOURCE_FOLDER + "sample.wav"); PdfScreenAnnotation screen = new PdfScreenAnnotation(new Rectangle(100, 100)); PdfAction action = PdfAction.CreateRendition("sample.wav", spec, "audio/x-wav", screen); screen.SetAdditionalAction(PdfName.E, action); @@ -633,7 +614,7 @@ public virtual void ScreenAnnotationAsAAWithoutAltInMediaDataTest() { public virtual void ScreenAnnotationWithoutCTInMediaDataTest() { framework.AddBeforeGenerationHook((pdfDoc) => { PdfPage page = pdfDoc.AddNewPage(); - PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, "sample.wav"); + PdfFileSpec spec = PdfFileSpec.CreateExternalFileSpec(pdfDoc, SOURCE_FOLDER + "sample.wav"); PdfScreenAnnotation screen = new PdfScreenAnnotation(new Rectangle(100, 100)); PdfAction action = PdfAction.CreateRendition("sample.wav", spec, "audio/x-wav", screen); screen.SetAction(action); diff --git a/itext.tests/itext.pdfua.tests/resources/itext/pdfua/PdfUAAnnotationsTest/cmp_screenAnnotationWithBEMediaDataTest.pdf b/itext.tests/itext.pdfua.tests/resources/itext/pdfua/PdfUAAnnotationsTest/cmp_screenAnnotationWithBEMediaDataTest.pdf deleted file mode 100644 index faea47f23fab58410f39481c9b19aefbd0248d2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5093 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 Date: Tue, 4 Feb 2025 13:45:45 +0000 Subject: [PATCH 02/10] Change how annot tag applied for UA2 in addAnnotation method DEVSIX-8807 Autoported commit. Original commit hash: [ffa2d3c2f] --- .../itext/kernel/pdf/PdfPageTest.cs | 26 ++++++++++++++++++ .../itext/layout/PdfUA2AnnotationsTest.cs | 15 ++++------ .../cmp_pdfua3DAnnotationTest.pdf | Bin 0 -> 5001 bytes ...p_pdfuaMultipleAnnotsTabAnnotationTest.pdf | Bin 0 -> 5276 bytes .../cmp_pdfuaScreenAnnotationTest.pdf | Bin 0 -> 4681 bytes .../itext.kernel/itext/kernel/pdf/PdfPage.cs | 13 ++------- port-hash | 2 +- 7 files changed, 36 insertions(+), 20 deletions(-) create mode 100644 itext.tests/itext.layout.tests/resources/itext/layout/PdfUA2AnnotationsTest/cmp_pdfua3DAnnotationTest.pdf create mode 100644 itext.tests/itext.layout.tests/resources/itext/layout/PdfUA2AnnotationsTest/cmp_pdfuaMultipleAnnotsTabAnnotationTest.pdf create mode 100644 itext.tests/itext.layout.tests/resources/itext/layout/PdfUA2AnnotationsTest/cmp_pdfuaScreenAnnotationTest.pdf diff --git a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfPageTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfPageTest.cs index 98d9563e89..c735573dd6 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfPageTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfPageTest.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.IO; using iText.Commons.Utils; using iText.IO.Source; using iText.Kernel.Geom; @@ -138,6 +139,31 @@ public virtual void SetTrimBoxTest() { NUnit.Framework.Assert.IsTrue(pageDictionary.IsModified()); } + [NUnit.Framework.Test] + public virtual void AddAnnotationAnnotTagPDF2Test() { + byte[] docBytes; + using (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + using (PdfDocument doc = new PdfDocument(new PdfWriter(outputStream, new WriterProperties().SetPdfVersion( + PdfVersion.PDF_2_0)))) { + doc.SetTagged(); + PdfPage page = new PdfPage(doc); + PdfPopupAnnotation annot = new PdfPopupAnnotation(new Rectangle(100, 100, 100, 100)); + annot.SetName(new PdfString("this is a pop up")); + page.AddAnnotation(annot); + } + docBytes = outputStream.ToArray(); + } + using (PdfDocument docReopen = new PdfDocument(new PdfReader(new MemoryStream(docBytes)))) { + PdfDictionary structTreeRoot = docReopen.GetCatalog().GetPdfObject().GetAsDictionary(PdfName.StructTreeRoot + ); + PdfDictionary structElem = ((PdfDictionary)structTreeRoot.GetAsArray(PdfName.K).Get(0)).GetAsDictionary(PdfName + .K); + NUnit.Framework.Assert.AreEqual(PdfName.Annot, structElem.GetAsName(PdfName.S)); + NUnit.Framework.Assert.AreEqual(new PdfString("this is a pop up"), structElem.GetAsDictionary(PdfName.K).GetAsDictionary + (PdfName.Obj).GetAsString(PdfName.NM)); + } + } + /// Simulates indirect state of object making sure it is not marked as modified. /// object to which indirect state simulation is applied private void SimulateIndirectState(PdfObject obj) { diff --git a/itext.tests/itext.layout.tests/itext/layout/PdfUA2AnnotationsTest.cs b/itext.tests/itext.layout.tests/itext/layout/PdfUA2AnnotationsTest.cs index 77b17a5517..6035deebb6 100644 --- a/itext.tests/itext.layout.tests/itext/layout/PdfUA2AnnotationsTest.cs +++ b/itext.tests/itext.layout.tests/itext/layout/PdfUA2AnnotationsTest.cs @@ -169,8 +169,8 @@ public virtual void PdfUA2RubberStampNoContentsAnnotationsTest() { [NUnit.Framework.Test] public virtual void PdfUA2ScreenAnnotationsTest() { - //TODO DEVSIX-8807 Kernel: addAnnotation method doesn't annotate content elements with Annot tag when PDF version is 2.0 String outFile = DESTINATION_FOLDER + "pdfuaScreenAnnotationTest.pdf"; + String cmpFile = SOURCE_FOLDER + "cmp_pdfuaScreenAnnotationTest.pdf"; using (PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFile, new WriterProperties().SetPdfVersion (PdfVersion.PDF_2_0)))) { CreateSimplePdfUA2Document(pdfDocument); @@ -180,10 +180,9 @@ public virtual void PdfUA2ScreenAnnotationsTest() { pdfPage.AddAnnotation(screen); pdfPage.Flush(); } - new VeraPdfValidator().ValidateFailure(outFile); + CompareAndValidate(outFile, cmpFile); } - // Android-Conversion-Skip-Line (TODO DEVSIX-7377 introduce pdf\a validation on Android) [NUnit.Framework.Test] public virtual void PdfUA2ScreenNoContentsAnnotationsTest() { String outFile = DESTINATION_FOLDER + "pdfuaScreenNoContentsAnnotationTest.pdf"; @@ -263,8 +262,8 @@ public virtual void PdfUA2RedactionNoContentsAnnotationsTest() { [NUnit.Framework.Test] public virtual void PdfUA23DAnnotationsTest() { - //TODO DEVSIX-8807 Kernel: addAnnotation method doesn't annotate content elements with Annot tag when PDF version is 2.0 String outFile = DESTINATION_FOLDER + "pdfua3DAnnotationTest.pdf"; + String cmpFile = SOURCE_FOLDER + "cmp_pdfua3DAnnotationTest.pdf"; using (PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFile, new WriterProperties().SetPdfVersion (PdfVersion.PDF_2_0)))) { CreateSimplePdfUA2Document(pdfDocument); @@ -273,10 +272,9 @@ public virtual void PdfUA23DAnnotationsTest() { pdfPage.AddAnnotation(annot); pdfPage.Flush(); } - new VeraPdfValidator().ValidateFailure(outFile); + CompareAndValidate(outFile, cmpFile); } - // Android-Conversion-Skip-Line (TODO DEVSIX-7377 introduce pdf\a validation on Android) [NUnit.Framework.Test] public virtual void PdfUA23DNoContentsAnnotationsTest() { String outFile = DESTINATION_FOLDER + "pdfua3DNoContentsAnnotationTest.pdf"; @@ -394,8 +392,8 @@ public virtual void PdfUA2AltContentDiffAnnotationTest() { // Android-Conversion-Skip-Line (TODO DEVSIX-7377 introduce pdf\a validation on Android) [NUnit.Framework.Test] public virtual void PdfUA2TabAnnotationsTest() { - //TODO DEVSIX-8807 Kernel: addAnnotation method doesn't annotate content elements with Annot tag when PDF version is 2.0 String outFile = DESTINATION_FOLDER + "pdfuaMultipleAnnotsTabAnnotationTest.pdf"; + String cmpFile = SOURCE_FOLDER + "cmp_pdfuaMultipleAnnotsTabAnnotationTest.pdf"; using (PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFile, new WriterProperties().SetPdfVersion (PdfVersion.PDF_2_0)))) { CreateSimplePdfUA2Document(pdfDocument); @@ -411,10 +409,9 @@ public virtual void PdfUA2TabAnnotationsTest() { NUnit.Framework.Assert.AreEqual(PdfName.S, pageT); } } - new VeraPdfValidator().ValidateFailure(outFile); + CompareAndValidate(outFile, cmpFile); } - // Android-Conversion-Skip-Line (TODO DEVSIX-7377 introduce pdf\a validation on Android) [NUnit.Framework.Test] public virtual void AnnotationInvisibleButNoArtifactTest() { String outFile = DESTINATION_FOLDER + "pdfuaInvisibleAnnotationTest.pdf"; diff --git a/itext.tests/itext.layout.tests/resources/itext/layout/PdfUA2AnnotationsTest/cmp_pdfua3DAnnotationTest.pdf b/itext.tests/itext.layout.tests/resources/itext/layout/PdfUA2AnnotationsTest/cmp_pdfua3DAnnotationTest.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2ce87fe7a5a916dd9d4df847fb2b433985717abd GIT binary patch literal 5001 zcmeHLO>Wyp6mHR-PBCC%L`Ff)@K+)sDNw{XNo~o3Bqsp`Ek@)}VN8((NyW0yk_&Xx z3v^K+7wDolXb;dU^v#fzWH~jo3A!;2fz;Fco9}&Z%r_?^=S)@`q;~Sx-+%mBYaxQ- z#m8E^jnCn8x%h}I5RLKlHevYk#n0nz7Y`>$AwoJr&Emd9hIp9ZUKGW7p+3pewVS^T z*{a*EvB=|&xwkTa<~T@Egqh~Ng=l^C-Hd-P{$&2hKN^x%%|L2vj{BDg9`T!D{VIy+ zig~AaFu{W&95@Ns4SqkYJItr+Fh7M{dn0f>M2ZTIc<%i;%2||WbSoZY%i@L#U$EC_R!;^EgMG7UO$$*M($) zo!DKk0G9u*IM=Kk%>-TMcnG!25(=r!3MN&VPgBN_QaCTx!X-nt$Qt&tq*?=a+ zf_M#z(r~459Ot|AIdRIU7c^SdStMUgfGsq=eiQjIkb*xl4*^GE)c|KsJ(^RbXkuj? zj0_bx-j9Kb>;zL2nvu`v#^xDlsIoOr&9vn)C-Y`5jxv)=>!kp|fI&Xwj=U3)}Ri1sbBd&K)O zp7vlbyHd3bYn#{m!9|f*MTo7>_VW!e_L}8r!InYPk^cGZcL@bvM|x)r$RO#n55eoZ zluho2Q}^!LwLIy0x7Oa+n^m#`cA?EGj52%Ektpnh%!X$!#u5@L`E^I?@gLCp!3g!^ zlp&*`G>H7sB}9|DHH6x!=i6iFtn>umI#OAvo12@)jV5ZPSeAu}id9tx4LQ4wa=MYD z>__3F^y0A0O@oA!4sow^5wG)(BtewoDw6fwZG>cMHp%X*;1QD5;0ylzjpzQT6Hv$ki5I%XmwQ-wc_kGSR1sVH>(F`qn07 z-vAmo@NbVafQ;->8hdM(r5!1l!WQ`D*Mb+8;KgLv8%2C2Apqp2)k%U+Q?q< zzg6mvJpZbvBC)x(F(*+N?2HS^p1(G}AG1){g~UwGt*Y+ypG!Ks2#gIA>TLZ)HB@q&*kSyKfwexYb9vsy6U z9LQQ0jNS(_lh08HGMzlM)xHwL&|o?~uq6u2YzH!hPeb=*3emnIv*4uQKu>v?v!a?X z(cah7RSQlXDp{V=AY>^&6nf*JS=%%gi9v!SmzQU?e*w%YK#KqX literal 0 HcmV?d00001 diff --git a/itext.tests/itext.layout.tests/resources/itext/layout/PdfUA2AnnotationsTest/cmp_pdfuaMultipleAnnotsTabAnnotationTest.pdf b/itext.tests/itext.layout.tests/resources/itext/layout/PdfUA2AnnotationsTest/cmp_pdfuaMultipleAnnotsTabAnnotationTest.pdf new file mode 100644 index 0000000000000000000000000000000000000000..89932f7ecfa3245e735c32375ad6d5a388a1e29e GIT binary patch literal 5276 zcmeHLU2fY(5N^>oonpblh=W4fUH*uoASrOHI7w~Ef~2GY1U)RtrNWpZ36hFspCuRQ zOE1ue0=YmRdV}@=y+UV~q^O@J5YVQ5F#$vJaAtPq+iylYdot=@)YS&5o&5gCufNr( zjtGkEcePFjpGRTF!z?{borLocu`rA>mibZm7>^L8pgG24?qo9pUn!A)b3DnCm6MHF z0=9_Y$;!^|VvZ-$Nv~Jqp(_?>RtsJDLB#+)0Yib^KTFA~9DOP!x!8Y@lfdO)$w~61@bt-~ z@?H4S8`Y|Ex|{*gukCjz=M0wHdj0hKaj%DV-;5SWY|HrbDn(UnxtZhP1ks#{gk;Fq*(JY26py2T4_KTRi7ake^FnDHMOhWT=n+NuS1eqd z^05AD@)!?Ta`Q6uB0yMt%ARd*psrp>n-dI_J>}nxTd-eK(y+TyruNU38xBo6NSdml%}j<^52#3~SR- z-wdvDyAricv+O)s!?xb=4B33)hh62*pMO!1?{<|Ri~$+M=lrez;y&S%`{C5Nzi}*A zdD5$O*6sB&Ucwfj^)d+4_PVPu=+(Rp--Q?}NUCHvUFA%?KyL;kbRH!f84cPX^>+>- zn$oKw)Ja^gJ?>u=p5VW(@;1xjHpaKNw~bq^5hV*uEz810#j08dje2?)W^7##({H7Z z!b_jS?~fmgok7AYv!hkkRTNkyfAU~mXR|`QN&@NMbufo=5OX+M^_LR}N3Qia&)u@$sje7nbD3WOz23yttmC)3fKJEA*ZxsW?TTk3Xt} zkh-WebQULfDM!zfXceR3>w*Em0YD@Zr7LKaKayN$K~_l$ssz5^TRVVO(^b}WmwRj# zWJ+)3dauq@Bs)L{3lar>Wt>a4{B`i|nz_Oj4<*B;AD}oC4&GEw<+Tj?pl~D8OqkmCWNHiUHuhxj@4k#s3&yftJwnw3f5cK@ z1l`j!4aj&;rV|*J_GFrN=&wl+{TVvUcDuGzhwS%cgow@9)zfwJAUECEjwMT&AMiw6 zlfCStS;ugQXPFxDY*qD`?r6l-!LdfI794S1W?9s1Sxwz$rs0_;VGi{)!t9pQv`njM zQqR;VX&H`ZP@5WhQ}dXkSxshZnrYjP(`>bx+|~`xrFzq`R7cmD)v`Rpbqwm*z5hRg zITj;5$_ICG4S>Y-54RKkJzOT3z|0dl8q~$WSl=BCYH0@3jHIk?G_Bgn$+PQ=+Fx!* BkM#fm literal 0 HcmV?d00001 diff --git a/itext.tests/itext.layout.tests/resources/itext/layout/PdfUA2AnnotationsTest/cmp_pdfuaScreenAnnotationTest.pdf b/itext.tests/itext.layout.tests/resources/itext/layout/PdfUA2AnnotationsTest/cmp_pdfuaScreenAnnotationTest.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7a7604876e0bef3a71d7754284a0707502737c75 GIT binary patch literal 4681 zcmeHL-HzHu6mHc!o?_%`m5nNx@z};c0wS_xlXMpr0ZAjRxER|5an{(DZL;h>OJATj zeSuz7$_wxQTkRmXOWyoO8bU&NssxPR4`tCT)?%$zOl}@n^$A z1jX)$MyG=>;B)1EKsJ~rcy^a?eD(atNw0@TQ=}4U9V4^2FOeZ1rnnzPab66c=IPqY zUxa+s>os`fi@+jUncysravtT`Y38MzM~DeemIrb46pzbz6Yk~LB9}_!XO4@YW0ry| zB6zxXa{+BCW7K)tb)NGe%z28>LzeRa_hO&pOCBxr_sHt?vOMK%)!6*}-8XQ3D`1wU z60n$830O`oyOxB^aRncVR1-Ype!!l`8;RDi4P@zbj!T?W4w>*QUZ)<F-h>=yGYgxWI9u3>!*2E+C5%|NbfzF)yEN4g+o)aK)$um>{DI`$kK*iK0WoO_K#!LJ*;I}*- zr+mRdCz5eI2(lz(cR(BS|Sb2@M+p$4HuR}Di~)gOrVgpenI zJ@&sipbjlyZ$-Zb-KzK^@Uv^VX68kyHTQt-QRe&uRQBDIvZ!RN>)%cv{{8w=4`qOgB8ymcot@?AUPzz=_-Bk z0=*lK(OH~wWVF;4X@2ks(Ue{Tp-$>AoXOz4j0E4hN=d-&?QQE;lN_kFZDT?)rA-*o z%^#ZUuay4)vb@|R{651sCOf?)s zcjS6-2-$Ujg%K?7j&uM-&Nz+zwa3%063k$0`Sfd{3tQ@9I_i(7udZh3wEuE^i9Yf) z6F(8?(=U_|(iDpm^^^22 zYuvX?e2w5$%*P}Z6Gz=2={kz0YS1HH6%$9@AL%-ZrfSe5T@@2Y-5=>Xil%DNm*{HL zXK&~}yUMLNSs!$yvK^~hgY_zdj#Ku7^ZN9^fzGD^4YSsOBT{*xwqa-nTA<3-R-tnh z7mBtvs}0@lp3O8N{GLs>4{g*s^rfH4p~Hb~KORvJZK{~)US6BRp8@+e3p&7uHl3(D zSn`wwAy37h8m|ZFy2C76Q$6ZZKulGWxzwhX=~CbHEzh!i%d(id(5dE|rtWDvw@t27 zRc~{hxTfYACSAC;uQK1K)HGbzbWMwBhRbb_GL;*C+iUv6(gVua_5N~8TbPrNuIx+Od$;peW G^Txj-eC-4P literal 0 HcmV?d00001 diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfPage.cs b/itext/itext.kernel/itext/kernel/pdf/PdfPage.cs index 15e6443599..8e65a93630 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfPage.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfPage.cs @@ -1120,16 +1120,9 @@ public virtual iText.Kernel.Pdf.PdfPage AddAnnotation(int index, PdfAnnotation a if (!StandardRoles.ANNOT.Equals(tagPointer.GetRole()) && PdfVersion.PDF_1_4 // "Annot" tag was added starting from PDF 1.5 .CompareTo(GetDocument().GetPdfVersion()) < 0) { - if (PdfVersion.PDF_2_0.CompareTo(GetDocument().GetPdfVersion()) > 0) { - if (!(annotation is PdfWidgetAnnotation) && !(annotation is PdfLinkAnnotation) && !(annotation is PdfPrinterMarkAnnotation - )) { - tagPointer.AddTag(StandardRoles.ANNOT); - } - } - else { - if (annotation is PdfMarkupAnnotation) { - tagPointer.AddTag(StandardRoles.ANNOT); - } + if (!(annotation is PdfWidgetAnnotation) && !(annotation is PdfLinkAnnotation) && !(annotation is PdfPrinterMarkAnnotation + )) { + tagPointer.AddTag(StandardRoles.ANNOT); } } iText.Kernel.Pdf.PdfPage prevPage = tagPointer.GetCurrentPage(); diff --git a/port-hash b/port-hash index abe8055988..f6c5f53444 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -e6fb263226c008ce09a93f34771c2389d6c36fee +ffa2d3c2fdc61f6f1e0a04f780708e0b0696de57 From ea27cc8bceb6785f50be05afbc3bd64e03b68592 Mon Sep 17 00:00:00 2001 From: Alexandr Pliushchou Date: Tue, 4 Feb 2025 13:50:19 +0000 Subject: [PATCH 03/10] Add missing AES_GCM encryption references DEVSIX-8766 Autoported commit. Original commit hash: [69e07f12e] --- .../itext/kernel/pdf/EncryptionProperties.cs | 12 +++++++++--- .../itext/kernel/pdf/WriterProperties.cs | 16 ++++++++++++---- port-hash | 2 +- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/itext/itext.kernel/itext/kernel/pdf/EncryptionProperties.cs b/itext/itext.kernel/itext/kernel/pdf/EncryptionProperties.cs index 74af2c9c21..a41a46c81a 100644 --- a/itext/itext.kernel/itext/kernel/pdf/EncryptionProperties.cs +++ b/itext/itext.kernel/itext/kernel/pdf/EncryptionProperties.cs @@ -87,8 +87,10 @@ public class EncryptionProperties { /// /// , /// + /// , + /// /// or - /// . + /// . /// Optionally /// /// can be OEed @@ -152,8 +154,10 @@ public virtual EncryptionProperties SetStandardEncryption(byte[] userPassword, b /// /// , /// + /// , + /// /// or - /// . + /// . /// Optionally /// /// can be OEed @@ -236,8 +240,10 @@ public virtual EncryptionProperties SetStandardEncryption(byte[] userPassword, b /// /// , /// + /// , + /// /// or - /// . + /// . /// Optionally /// /// can be ORed to output the metadata in cleartext. diff --git a/itext/itext.kernel/itext/kernel/pdf/WriterProperties.cs b/itext/itext.kernel/itext/kernel/pdf/WriterProperties.cs index 87f0378271..98136fbfe4 100644 --- a/itext/itext.kernel/itext/kernel/pdf/WriterProperties.cs +++ b/itext/itext.kernel/itext/kernel/pdf/WriterProperties.cs @@ -236,8 +236,10 @@ public virtual iText.Kernel.Pdf.WriterProperties SetFullCompressionMode(bool ful /// /// , /// + /// , + /// /// or - /// . + /// . /// Optionally /// /// can be ORed @@ -303,8 +305,10 @@ public virtual iText.Kernel.Pdf.WriterProperties SetStandardEncryption(byte[] us /// /// , /// + /// , + /// /// or - /// . + /// . /// Optionally /// /// can be ORed @@ -376,8 +380,10 @@ public virtual iText.Kernel.Pdf.WriterProperties SetStandardEncryption(byte[] us /// /// , /// + /// , + /// /// or - /// . + /// . /// Optionally /// /// can be ORed @@ -440,8 +446,10 @@ public virtual iText.Kernel.Pdf.WriterProperties SetPublicKeyEncryption(IX509Cer /// /// , /// + /// , + /// /// or - /// . + /// . /// Optionally /// /// can be ORed diff --git a/port-hash b/port-hash index f6c5f53444..fa472f4d70 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -ffa2d3c2fdc61f6f1e0a04f780708e0b0696de57 +69e07f12e59d863d6d273abf394224a2bb349bdc From 02aeb0f8a2ec2448db7594ba8ef9b90dc874edae Mon Sep 17 00:00:00 2001 From: Dmitry Radchuk Date: Tue, 4 Feb 2025 16:45:57 +0000 Subject: [PATCH 04/10] Support display:none and visibility:hidden for svg elements except text DEVSIX-8753 Autoported commit. Original commit hash: [07a241a33] --- .../itext/svg/css/VisibilityTest.cs | 101 +++++++++++++++++- .../itext/svg/css/DisplayTest/cmp_display.pdf | Bin 2224 -> 1872 bytes .../cmp_displayNoneInClipPath.pdf | Bin 0 -> 1358 bytes .../cmp_displayNoneInClipPathWithUse.pdf | Bin 0 -> 1716 bytes .../VisibilityTest/cmp_displayNoneInDefs.pdf | Bin 0 -> 1577 bytes .../css/VisibilityTest/cmp_displayNoneInG.pdf | Bin 0 -> 1347 bytes .../VisibilityTest/cmp_displayNoneInG2.pdf | Bin 0 -> 1330 bytes .../cmp_displayNoneInLinearGradient.pdf | Bin 0 -> 1579 bytes .../cmp_displayNoneInMarker.pdf | Bin 0 -> 1939 bytes .../cmp_displayNoneInPattern.pdf | Bin 0 -> 1430 bytes .../cmp_displayNoneInSymbol.pdf | Bin 0 -> 1403 bytes .../VisibilityTest/cmp_displayNoneInUse.pdf | Bin 0 -> 1347 bytes .../svg/css/VisibilityTest/cmp_visibility.pdf | Bin 2049 -> 1780 bytes .../css/VisibilityTest/cmp_visibility2.pdf | Bin 0 -> 1593 bytes .../cmp_visibilityHiddenInClipPath.pdf | Bin 0 -> 1303 bytes .../cmp_visibilityHiddenInClipPathWithUse.pdf | Bin 0 -> 1517 bytes .../cmp_visibilityHiddenInDefs.pdf | Bin 0 -> 1577 bytes .../cmp_visibilityHiddenInG.pdf | Bin 0 -> 1347 bytes .../cmp_visibilityHiddenInLinearGradient.pdf | Bin 0 -> 2204 bytes .../cmp_visibilityHiddenInMarker.pdf | Bin 0 -> 1616 bytes .../cmp_visibilityHiddenInPattern.pdf | Bin 0 -> 1430 bytes .../cmp_visibilityHiddenInSymbol.pdf | Bin 0 -> 1403 bytes .../cmp_visibilityHiddenInUse.pdf | Bin 0 -> 1347 bytes .../VisibilityTest/displayNoneInClipPath.svg | 6 ++ .../displayNoneInClipPathWithUse.svg | 10 ++ .../css/VisibilityTest/displayNoneInDefs.svg | 18 ++++ .../svg/css/VisibilityTest/displayNoneInG.svg | 18 ++++ .../css/VisibilityTest/displayNoneInG2.svg | 18 ++++ .../displayNoneInLinearGradient.svg | 9 ++ .../VisibilityTest/displayNoneInMarker.svg | 12 +++ .../VisibilityTest/displayNoneInPattern.svg | 8 ++ .../VisibilityTest/displayNoneInSymbol.svg | 12 +++ .../css/VisibilityTest/displayNoneInUse.svg | 18 ++++ .../svg/css/VisibilityTest/visibility2.svg | 5 + .../visibilityHiddenInClipPath.svg | 7 ++ .../visibilityHiddenInClipPathWithUse.svg | 10 ++ .../VisibilityTest/visibilityHiddenInDefs.svg | 18 ++++ .../VisibilityTest/visibilityHiddenInG.svg | 18 ++++ .../visibilityHiddenInLinearGradient.svg | 9 ++ .../visibilityHiddenInMarker.svg | 12 +++ .../visibilityHiddenInPattern.svg | 8 ++ .../visibilityHiddenInSymbol.svg | 12 +++ .../VisibilityTest/visibilityHiddenInUse.svg | 18 ++++ .../SymbolTest/cmp_displayNoneAttrTest.pdf | Bin 2731 -> 2280 bytes .../SymbolTest/cmp_visibilityAttrTest.pdf | Bin 2731 -> 2280 bytes .../renderers/impl/AbstractSvgNodeRenderer.cs | 16 +++ .../renderers/impl/ClipPathSvgNodeRenderer.cs | 9 ++ .../impl/LinearGradientSvgNodeRenderer.cs | 5 + .../renderers/impl/MarkerSvgNodeRenderer.cs | 5 + port-hash | 2 +- 50 files changed, 382 insertions(+), 2 deletions(-) create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInClipPath.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInClipPathWithUse.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInDefs.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInG.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInG2.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInLinearGradient.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInMarker.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInPattern.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInSymbol.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInUse.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibility2.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInClipPath.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInClipPathWithUse.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInDefs.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInG.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInLinearGradient.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInMarker.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInPattern.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInSymbol.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInUse.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInClipPath.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInClipPathWithUse.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInDefs.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInG.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInG2.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInLinearGradient.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInMarker.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInPattern.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInSymbol.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInUse.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibility2.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInClipPath.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInClipPathWithUse.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInDefs.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInG.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInLinearGradient.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInMarker.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInPattern.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInSymbol.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInUse.svg diff --git a/itext.tests/itext.svg.tests/itext/svg/css/VisibilityTest.cs b/itext.tests/itext.svg.tests/itext/svg/css/VisibilityTest.cs index 5b572e37c7..d0b017489c 100644 --- a/itext.tests/itext.svg.tests/itext/svg/css/VisibilityTest.cs +++ b/itext.tests/itext.svg.tests/itext/svg/css/VisibilityTest.cs @@ -40,8 +40,107 @@ public static void BeforeClass() { [NUnit.Framework.Test] public virtual void VisibilityDiffValuesTest() { - //TODO DEVSIX-8753: update cmp file after supporting ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "visibility"); } + + [NUnit.Framework.Test] + public virtual void VisibilityDiffValuesTest2() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "visibility2"); + } + + [NUnit.Framework.Test] + public virtual void VisibilityHiddenInLinearGradientTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "visibilityHiddenInLinearGradient"); + } + + [NUnit.Framework.Test] + public virtual void VisibilityHiddenInMarkerTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "visibilityHiddenInMarker"); + } + + [NUnit.Framework.Test] + public virtual void VisibilityHiddenInGTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "visibilityHiddenInG"); + } + + [NUnit.Framework.Test] + public virtual void VisibilityHiddenInUseTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "visibilityHiddenInUse"); + } + + [NUnit.Framework.Test] + public virtual void VisibilityHiddenInDefsTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "visibilityHiddenInDefs"); + } + + [NUnit.Framework.Test] + public virtual void VisibilityHiddenInPatternTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "visibilityHiddenInPattern"); + } + + [NUnit.Framework.Test] + public virtual void VisibilityHiddenInClipPathTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "visibilityHiddenInClipPath"); + } + + [NUnit.Framework.Test] + public virtual void VisibilityHiddenInClipPathWithUseTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "visibilityHiddenInClipPathWithUse"); + } + + [NUnit.Framework.Test] + public virtual void VisibilityHiddenInSymbolTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "visibilityHiddenInSymbol"); + } + + [NUnit.Framework.Test] + public virtual void DisplayNoneInLinearGradientTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "displayNoneInLinearGradient"); + } + + [NUnit.Framework.Test] + public virtual void DisplayNoneInMarkerTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "displayNoneInMarker"); + } + + [NUnit.Framework.Test] + public virtual void DisplayNoneInGTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "displayNoneInG"); + } + + [NUnit.Framework.Test] + public virtual void DisplayNoneInG2Test() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "displayNoneInG2"); + } + + [NUnit.Framework.Test] + public virtual void DisplayNoneInUseTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "displayNoneInUse"); + } + + [NUnit.Framework.Test] + public virtual void DisplayNoneInDefsTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "displayNoneInDefs"); + } + + [NUnit.Framework.Test] + public virtual void DisplayNoneInPatternTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "displayNoneInPattern"); + } + + [NUnit.Framework.Test] + public virtual void DisplayNoneInSymbolTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "displayNoneInSymbol"); + } + + [NUnit.Framework.Test] + public virtual void DisplayNoneInClipPathTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "displayNoneInClipPath"); + } + + [NUnit.Framework.Test] + public virtual void DisplayNoneInClipPathWithUseTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "displayNoneInClipPathWithUse"); + } } } diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/DisplayTest/cmp_display.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/css/DisplayTest/cmp_display.pdf index 858b86940294e779111ef56c66e0918e060339bb..f3db8f21462929e98e0f1e44d623e9a29e504a20 100644 GIT binary patch delta 351 zcmc(ZF-k*05J36-AmJB+C$I`JSU5W~yYpAnDuy&7b`~P+?9Mb6BG~5;xkxazckoF5 z#xvNw*Sz8#&VEi0=iLf{0>ufJKudt->gwUWt;?rftgjI;!e4OQcHdpkDedR|bN@7a z9N%WQ-Pg%Wx2rkjn#nj~1;vKVFh%7cNXSMuPAY{OG|s}Hv5;YCT-^()VsH zZs>h@jR1npe&Z1cE@S?LW~fY{Oxt*Fbb;gv$KX~_CVsii4YHf}W^3)_N*Ik1xSFb} ztCKW~vB}KXvx0O~~7ygDnb#;k=UqM|hXpx5`6b&0Nax^dwh&Hhg5Cg%jp za>QNKeDl@}4AmjwTu>#b(K_HtDXR<%A`u$j{icnrq(W=MMPP}cq0bl>Tm?Wv$)pV} zSjo7CSOE|kyJticDlN4iaT^NZ`z$cTxg%zE%!mT*x)Dxnyr!4u|B29a40Q9gH$*~) KsNEjiU88TZx1TTo diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInClipPath.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInClipPath.pdf new file mode 100644 index 0000000000000000000000000000000000000000..438777b905a49ef0f1177f479cfd96d5342783d3 GIT binary patch literal 1358 zcmc&!-EPw`6u$RUoSSN!P!rp6;si~Vww8{G{d8>wNZT%w*eRLTcsS|Q@kZS6DqQde z@FE`KfZn=Ay6>c71`bOk90L_J^4MFcCcL#g<%jv0rxh} zkQBF|dawx|Z`gQnq)Y(gd*wn!kc_kN8{%WG}jY#$Ebd^axwsyJ5x z3qwJrmPMvSk*hq}WrxrkyW(t>4CE@@cALKRB!EM{m-K4fzH9rmn>2zM54#`j5%W-P} literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInClipPathWithUse.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInClipPathWithUse.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6acfb7d0d76912dff953fcf402abc7c1438d4fd2 GIT binary patch literal 1716 zcmdT^-EPw`6u$RUoSSN!P#gazK~trzr7*FduB`xR>qX+YU8gk}PFiie5jVUF7rX(y z2)3KG(28-1uoUO`_&fi{r_t~Bnxqw?#`hmzzaaq_iu4v89tNj6pH??OXuDljMkjOh z5e2fbwAp>0& z3!`*t4S%>uZ?&o{<*Z3}-?l3lnb~|t%jof5TUArtZabHpBg9J7F}RDeHsO(-q)P6J z=?2U;;EoNlniY9Bsq}vLCB;-=iW!M1H>1ZPF|JfLriY@xK-pN;fG^#wYG z(Ga&t3pa=7NB!ZOixFJ!AHD9M!cv>k8oWM$&lF?abSB~G-aM8XUYlZZ59jX=Hom%4 z)q!=2h0Pra-p;b}%4L2q4%VqCHzF>3waD>K?&=B)8T>i@q0{ZtKU}1hOLng?^Odc- zQ0xA1iO0}%KUZZnM-3>KQ!qtQ`S!rzT=h54_mZ=^?RF?26yvA1cM<^uM3giaq$y$M@d9B|cmfk7LasnQ;L^o*SBUu&T|BqyMxI7p=v4x6| zeJ1q+DFhQRfhQg%Hh#AtU-LMPc6e0SSFwe|q3z6V9P9{QU zama{Hu}UeAw8|pQlZZ=_WrSg?S=#xOa>6sl5_=hI&f+waDv6~^uy}lLFkN u9RveA3&8d1AQ;X*X^8BsYWPXnbc3?_`=CT+m6*yGpOBcKM&s2*5B&rLFtwrp literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInDefs.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInDefs.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0c3dcd211e3b9feb8d61ce5d1d2a8c2b596b2775 GIT binary patch literal 1577 zcmc&!-EPw`6u$RU_@>$>l;qfn;{;8WwwA)geo9*b($)(%ak@@xU7U2- zUP_?MQLS zt7+;pAH3n|L4Ww>Y(y`14_^0=>5aA}0$%LVFB||o2T2c>_O8_QwKc0HJ$=8o_SL1T z39MsQm^&7{o#o}Z%lu#*Jf@;ttGMhnDu-LSYbqQ=@aObPXS+`Sa5br1vU|qP@3ERf zJ@$u7JW$X5T$QsqY0>g#O06+fT@|2=atzUZ$bG(_9P*~?p3|zA#>DucMY)VNBfwVq zyRU0&O+!+v$p^APr(6&~?G(4}ZPBHwE^F!>SC3(6*Tjo`8M{O5bB6zVpZIBlE(#x{ zV@Y3dnh`IId=}oz0?I|)hx!PP??thXaWSM~QphDK@OEvW)_C)OhUd`k-|ZWHYjuGU zCj@)5d1x#|C}=?+Xq;iW-9s0Tw1_8LG%m0epU8p4&V5Q_I5VEmBAIT{;&{VeW!3Cj zTQ{|iy7YWsh&*OevoxDX8K+$5ajFZI10x9$kSpHL8=rmrlO3AT&GMG zf~B0vkY$oXm~pKkNkf&#NyyQ3$U%omR&ZIwT!M~@BnlZT3S>YMfolJM55~dKqA=8r tw?Qz#3y4?GZHKeZnkG0PTJ?DH+;sAOpH8H#l&$LGGZ37#TCdJ}sZCO#8DjQ`22q7JH7F6XZd4NUQO4mbS)%NgZNW+BUhKncs1&y{S-P-Ywb@9By*yv)FE3;kA)UEvr18o#! zyTLB?rYHO3>6_CToNw>H9v{JtG7Sbi-+?b7rPOmFVgJh9H40uEy}E*v_dDxc9aLRm z1HD4*0{?AQG-nR^$=rW{qFI|b^g5G+4eYuOGwS~xe(rp?@K0CLIr z2RsGOeO#CGCFwzPvjC&DZM#AtfDlV`FWx@SCl~o~>YlS|x6Z}I&h zb$kS)$OlqmPOb(DW`W0RB)WSx$$o28iJB?Fwsi|wl0*rVa4!o3M8YkoA7pWuZpgv} zyYxhla%}2TS%Bm8L>BXGL&n%6f7XcVQW-bUheJ5q<55%=naEX|=4na;o=F)Y&6Sc- zNoA20g)Av6!cygu6+(tF<3c8p$b&qi8P6kB5ha?HWtJ%+60~BHhm=Q37K)XUF@e4_ z%2E-_G~%TaNrJuv&-4EO&tUE!)};nF`4fMF+(cHoU2bY0jKYC*#H0l literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInG2.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInG2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d731519bff571e001054fca6f34bfb625ca7b049 GIT binary patch literal 1330 zcmc&z-EPw`6u$RUoSSN!P!`)s90yI6wwA)geo9*b($3#q4^&5$Rg32z)-kyJi^}>7r#{2!oXiS&n zBk@N|217;O5Q25liS5mqglp4*stwkr0q1VwA7fFa2kPdG+TSp0_uL<++UfvrRVLV| zmCmuTf#08I7nmD+bJ2u*@7v|ibhX^@GP}J(>uQ1hzDvm^!mLGCgL`PY5Uu7QHR+{V ztd)bc^1v2pDpe0tgWJRBobrg;!>)vhXEfNNbZf^yR>ji_W37r+j(WSA;f?tM1Emp? zUA9ZT>B;_h`s#EB=iB=)$479Dy0HPzci=OplzJ{C>|g2I2H~Yvt1CEpyR**KLDdyD zP%Dca^Ium*bLNnr%>8>Pnze~TuQNH=z^-FhQ2+1n$If>P|8$iZ2lhzm<*!&BQTP4f zfT!TOk7GGsk{&eI3(!iLmK6#NxGm9b`}%Z0xyTPw_ncLGbS~z1Ey|OJ1=vpccdBb= zT|a_G@{ZItr$6=fjmDBtki@doEf7%@L{P$=j5AxfTTtK2LM}ICJhG%b(xb8E@Ue{9 z>3Jjz<77i7!~=gur`08DH@}BNINRe93oU0hrhzC+n&%=7IdUemEGbz~ z<^{(A+j*0EaM5%FqTotWFDdj z1F;i=+PV)#V7T_m6u0Gq_VGM~Bx3@P$)K>((V4&CPwTpl9@A4i|3^HnCc& zs*APt0=Z+(>nzEyEc1gKXH7-EQL*e*D#uT_t1>K@^Jn@4YrCX>xQGi&c2}F}%2$=B zb$wXkDb(#`vn;2i2Kn6>jMl|7#bez(7bkc5R-h-#qBkrsSy(B(oIw+9{A;L>DiMq# z@5l@Tv_cAITrCDYLK}expGawboa1%WWRlHuMOZUvc)&ag(}#6{Uy*Q`O;SW+h=N7s+g7$&`qfWV36Ag}pb9s!OQt!Ti$RHGjacau!U$0@|OxJ|0h>pI^e;gX7cjOZZ@2jeu_t;df3c?R!W#zIC5! z3#YDH-NNfPhuc_vy1I)Es}<&tg)ioLedQULT!))f)LRpu!OrCA-u!iJ$5HtIG$`-C zrD3{C8=vr#$}QJ;9bubV@yVyq_kS(dkS$3M>JKw;Rn>f@lswS4M9Y=@Lbw{eOt5}9 z7{B|*z;|jCoF%`I5(8e}XmUz;fb4w4+brg#C0NJce@ntq%mjr6nWDP)L&42DJJu?B zMNEV*HVW$}zOFqp=tqGP-4n$R+wEeX$9q83rGbuQj4THt)-;0t{bqB3fZvDA*NuL$ zx7mGecNvl(uQyY}JR}Ai_v;noQ-UtG3EwwlJd?Y)9RnL|secIjp2!X18wPuDn>05q zqsx}>mZt>@yv>5#kYaC=?wl=9iBW=0-7SzpL;?!9mvM%7@(aq1ERK-L9T}I{-a9g? z_Q)6x-5tGHV@K`Cq{OoOT*j#SPb`d?2eQT`^M!T(^KdqTtD{`YL{Sk%JkE1rvLaV9 zVLIhWq@*qiDyY^)o){~09T}^P&P|~TYKv49nWW4}7Ez^aTtrD`OcAqGWmc!!SYag3 z3{5kI_BKt8V3|>Alp3ln7Yx57gP$M4b$C`5Rol#yaDuZ9d^=CV>HIf~)Z+;5wI6`K apa1>O=Rc{N#5HZ1ut;&z>peR^A^!p|NB;Hz literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInPattern.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInPattern.pdf new file mode 100644 index 0000000000000000000000000000000000000000..824b42d473bcf194f11d6e5a8656e2f8fbbf70b6 GIT binary patch literal 1430 zcmc&!&2rN)5Wedv_L6BkOyZRs$qv)WOq(>JLw`b&0cP4BWLpmDG;xuYlJZ7ecoh!3 z0lWySV45}s$_-sCf7<_VcWZ-gug)70t9|?aMKI8ogg~rh zhNdhQHZ>)AetVi+n$*$FyHozXO(z)J>FlwY@$I!CTNBf6`=ER%oK&hT{6ks!SV?xY z(^ti0EgY_eJCvrI7W1xlX1n`bppYmqH4 zXBAa5CGNdzBgYsqqwkX^a4dnei8EK3UB0X5T{>Tws)GYmyLrgaQHP-vx z2-dJSY)%n+6v0la%dpR|5lQ&KR`w?)QLQ|8^vNG*w2a23(V}v?eDD zEk>MI2b7edgdBchf>USu1M@qq8B%Z?n2_XV1H*_qViV&ujT=}qCZ;wpB_Ct4x`#Qd zr&q@M9dX!&v)w$FJmf7JktEM0a*T5&QA%Y*YD}JqTyrgy7A=91;X2g{15mPayd#bK&Kk+rZX$z2PT%0w7q`~OF95gg9* w0{ki&219Cf@Dnf$M$?Zp`NVr|wF>Hf6VxAW0#-V0-KrttSg~5|;Izkn022Lz82|tP literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInSymbol.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInSymbol.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3c44be7022fbb53de784ba92a4444b67e52ac6dd GIT binary patch literal 1403 zcmc&!-EPw`7`^vX_@>$>)W&w~q(M`qtzFB+eo9*b(zXjHaZ08&-W+%8cq49j6)t!K zco9Blq0s^i?(jwHoE(2Y=Q~bkIvRIrFGQVh-@klC0u!v`YqY=bov31IKVZrRgVGu$ zSLhCT;}yjtjou)ninNAd=Z^5^=uj6{6}H4K+{`;wX)X`-=7PXuKrj_o-c%Z3U{(=k zs?=+fs1nk?Kaa0fVqxcU1@8R-mbWnZsug4LaH}BDQVj;K99IMdeqFzNQPv46=1^LB zqn8cYZ^%Pv(B`@rNvn28FBxHiFyhm`&lr6{{2fAe_PkS_K2Mk$ovssQcJqbW*w1*V zjlxln_DFYrb}*g4I$z++-Gj;W1m7!DLc+^E{D~1lx-KO?xHS)@!V{y{xA^SsUQ??R zs%~tk*PtBrUgv3f;Z&bpd0Q#U=7`g-K62PnuAVI?-k+rpUF1so`8u{v>ajMf$4vE* zw$5;}6Wn!wRN!QVI=H-FVxzVFi)&n#=Zg%)lOm5cb~3jxCUD54q___O{+^$cbf^s0z6(D<45G*zbkn@dujvo$Foty8cAESdIQ0qcVseAsBDHa3F*) zaE5`T!P9GC@Rl&P3977hM?1y|m2k!kF{8Z&PO)&_sL k?L7YommKEascwDOUHb0ROOHw`jjasP7ZK`oj?TyE2XkP2DgXcg literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInUse.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_displayNoneInUse.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3669af4bf5b1be00f1d6d16abd0dfca7b087b79e GIT binary patch literal 1347 zcmc&z-EPw`6u$RU_@>$>l*M)&CqYxCt)(!rpVC%kN6edpm=TF}9)Rhj6< ztZbnh2>kIhztDw)laD6+eIHghv(<9L%k1t-gR6z^_kBt}5egPv4gR9(LbRF#>ExwZ ztd*m+@&Jl-m8pl)>Fwc5Mp#T>V=N+3{DMSVglz4E$3{J`Ft$dm3T?NmnZ9*j@xWM( zvt7DNg6YZrc>3mahR?V6UyqOQjkXO0Jm0}z7$GF^A@Tl|y=ydnZO!TmpS<5$=jx&A z3LBUeU`NBZm1@pB@{@V^07bJl@#u9X2OHRR9Tp_~JN$|F-NHXz<<5gWGIsepR@bNp zet6&s4*bV=xmcneZf+LX8splo5KJ+H68#Ie&-2Mgew=#Xt=g?~F~6rM7mo`7ru;kA zwX=?o*lP3v)sT~~fnd9U<24Z7KbvH~wYmh&6hYg%g+&}kF)s1Fj8QHV zEQT&U(IW{o^{I@)I6aZ^B-@Y)@yMUEvbxmP5A@*>pY3Ig%2II_WkLb3Qy!HZJ_T1K zR*{U-64K69k_(kGswJ0Y##Kp~AhL)!FI651ndMn3C&O`#03~s^(Qr%d~gZUp|P>TY|RDu zOx%Jux^NGd^Lp^T|1~$K4%`%Ucm}uxSe~3eyp)x!>+$Mh+6exDes69KZQsn=3>bai z8$Qfae;(%jXvW*aop-aTsm7cwCiV~+*+C>w5@Kqh7V*V7Z7C}T38BUq14`1I3uXbp zoP3dHeWM~;nMqR9GIdsUn!z&zg(_B4!{k!1g&2R2Ld(%^?A7IeD$FJa+dp^jMu#*m J7T1qA;}5H}VKo2% delta 600 zcmc(ZO-chn5QP~gh%^WuKyU~Ie*&?(`d`$Q@n<0-WaDyXsz*l>6%B%`;1OiDt^{{3 zlw8dN*vU-1f~)?j>%CX+XXRz}YdzZLAh-pmTo=R!z{b|j*&Q9GW50R0i+~FL1l4JD z9LecxG>&2|MYSA%RNwJhS3@!wF-Rcc$-@=fd@3KytQ?l(=l%9|N#t+aTZ0?cAFzw+ zGrpWaFN8WB^a~2EPU45d^8V2?)YwxASCEVrY@la&f>O;MZcW%D2F;vuh9G?LX|6nlTX_8L`@NDqyoH{!ypaNrH# zMVN8jrnEqhtdw{>JM+!wZ)UeM92|C~7qQNdpWnVS!v!y=AK3oB{}PH>J?B#OdR6Tp zS+R5GAFd=Hl zI$4&pZLr=3_wgg^MOh4z8g>Vdl~6|DA1b$f{FPest#FNKtK5NWC`Y$vy4b4hPczyZjMhH}a1+)0)ISEZyp= zR@G7?n@iw zTFEFDu?|d-B_O3xU~?;As>4KySb@qSqr+(id7cH38xu`c2HNTbf;3i13Q-(NVS?0# zVV1`^C<9i6sfyESlt_>^2{S9L)GD`O94C2hHDHyn_x~B3`Ok~Iyu6u$RUoSO>JRAM`}<4mX$v@1j7r?k~J3Ak_^rwgJnI4Od?(QfuCyVx6S zFEYCelu>P5&QcWT(z}j zYL0GDG@KI{Sagbzsq)tBZ^4DFT>G|aOx4s7!i}RNlb34G-ko9p$v6gq@kKOJ&SQWs zA!Ae9h0~_?#2-(xOQRcq3v43%@A(r=T{&NiGQGbxKGe+gdLgBd2=N|m4dF-KQY?{u z)u<~wTY=*hxbKT>N?Q$7V>Sn`DW)7#91|JGoW8>G2F4p((UHyn4H!9_FSK!+<<#6Y zU!iZEfpnW}GKKTa-Tl!a+!|MV!t*WoLNUhOKnc6o?!Gp#@9g3lj^A&s zat%_oh4t;iYe%AYWnP~J<;NG%qZIYZC8*cB?5%0nc9@aq@A4-h_EP@IB5Q)!L+j?h zx!OiO&PNa)LpQv9he6L#2kP4yIBT01h9}UxlqXG|=IICG<&2&T95{nMpvvcQx_s6L z_|BOEVUWnTqCFruk2w_ZV57uW7YrY%sg*XENQ%89rCjTTF>GXNB-fH;LHJI&B43tO;a^-@NS}(H{!ypaNrH# zMew-W1QIAmEUkAu{^ox?jefV+q^$@wzW@084M|L}NpI2NVQ{MFlj;Uj)^3-T)oO-5 zqM$dUxNFcQLVBLpY)65J*obz_ywdZk#Gq~voaub3j?MiQaYs)4HxByBIt*qWGSH=2 z+Dw~w@?3YnO2bOp0Tq>TXmt< z{Q-$5xCuX~ayCN^T&^bA8dLf9AQ)WrH_!JHSlxCzk~os%r?zA)`qgXK9{=_aOnWWZ zYV;n>T|-~G57-3TiSu@$sv8uwBxcNQGfz^{Vhlg->nk8K#7QfPG0+^gM~o-EyaR05 z!mEL^1l>SnC|oNDH%L#`3Op@p{r<4>PB|6`c+?8rpu$J;r)PO@b>Tvck!!Ge;ZRC0 zae<$BjJle^!t*sxuy}{Zr0b_G9En^_w|Ue({4Jh{k{wmEbREHTW7|HWIDYVuFO+%e9 zLSw;Q&{Cv2W|BoBOjSzam@yRe`R# literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInDefs.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInDefs.pdf new file mode 100644 index 0000000000000000000000000000000000000000..84a60bd2f399adabed6110a86287b15622cf58e2 GIT binary patch literal 1577 zcmc&!-EPw`6u$RU_@>$>l*D$N*g;dJt)(!rpVC%HWZi7D%LtJ)g1 zK%Y=BSWw(A(L01pp<6QSoCsfw_R69*MO|U1ZWNptJy(b2?Ky!XkD7lP43z~Q%o>)F zsmhhjOa+ENo~2hNt6}G?#qPcfBbeCvVoS^9ZfQW(%yhfXCFckQi8cmzQMD!-&Yr5( zbvauzhim2@1X<6^qOWSR+keRjiwI1Ng`D#jB-|lnXD>J@_45ovTk2J2?CyMGZtJhO zS6YJ;pZdfbpB@ayZ_Xz8V)x+n@EG41TY@A1v)%W$AOXX+&}A^qo;=r`yx+SMs%mBHCi#>^40SrM&Iafgq1~K^ literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInG.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInG.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7a17ab240bc9a0fdc07c10266a99910d8cd751f4 GIT binary patch literal 1347 zcmc&z-EPw`6u$RU_@>$>l*O@QJ3&*Wt)(!rpVC%oP0Fl@B6UAnXQ%^US@Y!8eA=OzwcA>i9}%0)!;9hE<~$2P)=Q% z#afxIl?PCyt4uvqPHzuiQbIX_7o{xX@&#dAglz4E$EJ8*VQfvY%C+6DX8P8B#RFqC zPIseS5=>9_$I~~bGkm_i|9X6cZ?tV7;Q0>zLJ1*(4~h4$>|LYrYim|l_~iZ0I#&-> zSJ=R;0J|uBTNTZjM}9I7AE0Q~CLX=c;(`#hg~=stGeOX{ZehVW)&5 zqBM$2#_r znhVW}lu4;#EmJ89nMp$X|38CycvzPP`^le#6W}JW(jTYQXN?n>onAY+fgjx9&%s5F RQ`WW3PbfpZ-mB9Q`UShxY&ie` literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInLinearGradient.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInLinearGradient.pdf new file mode 100644 index 0000000000000000000000000000000000000000..517c6dd0a6f5e7a0783d4a2e8878af17f89bb632 GIT binary patch literal 2204 zcmc&$!E)O+5WV9oaM8q`jz|C`NGjvej4efOrm?L^p0qQH4j>6C%t(X^Qm)fK$|b+j zL;s-tk?c~GD9KLKo=S}bVzK*n@$dksGain*+zCnNufPBJlSs;_i9eEy3-^sK7S#vJ zMZaHGR;v~HmAIo7r$a;D5~7Q=F~b{%_-*LG6qPQjk|Ny1z0ql|uFT_%LDysTckYgr z1s^JEmx(UT#wNOi#J}9dA9Yf}8)ge|ybq6iZ}Zg?l>1L>4Nwc+?_)_=2#1Jf4meOY zDQeGws?^dfT4%3y9>654+!RAq>9gTW!GvV+0}s^v1M^-m_Tt>VG3h@$jIBvGiMD6? zy?(5|(1Ed<_8ji8?)3I@JpJ+Rp1wc3ydJ-y589TH@clXcEEr>5Oi3@-_EV|pwKbbH zy?uAy){0a$6C0QfaL3)B^0b^G^OL!|r=n~_ki914>Irwv3j5ssHvJ)D*Yr;}afM`$ zj9qPWH4C-Z2NKU{7aLsVWJNl(d{|IxO!Xb{V4CmMDZJpQ(6Op2Z41!Jn9~RV{%xHH zGNe|MpGkq$HE=X333NCulY*cp;9e8vgp&RS^U=#?zAiQ4QRqm@C8Mj|dk9XP@}}93 zZ#@&jMb8mE+5~ce;f?RM16bg-eQ$i5WAxEm|{-!lJ^Reo$#%ENBlY*{Q8|X!V9;dxf4U_pnRvg|uWIZ=I_aOmoiYVFyg7icE~T_-UBc0=c_T| z%w-;f6XLe8CZ92f*)&%K*$ehJCoYOvKw(CPsBZ00Fq8TntCXxFrf(@mVY%aRX_-OO zYlT6*qjQ&xmPC>UupUS0OcZ=tBM@&Et; literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInPattern.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInPattern.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dde083ff9f5f4d34e01d69e8606018de4abc1053 GIT binary patch literal 1430 zcmc&!OL7x25Z&t(y>TTe%AS@qUn=FQ#Ewmhe2nb^s*)_`BO9mUQP9Z2;YMt@3JY!k z7olZ_IB|fmLz~e&_2;SksT+fCugO~xYkd3u zdZnjpW4Si&&^7H$m)+E=?e24dB0zzX$H)VGhH?vWYsWj*#orAEMi+}*neEwFE$wIM zXrmx$@fJ2mCwqg@i_Wg*sf{Mqzm$RZebG08{cz30!)-JAmwafnF;?+&|h4<$ML@xNM0i#7`UA24K%zq}U zTXiQ9S9ye{`?w}UK4%T6Zl++gwoeGi<$026j1QO|ENy>esa+(Ne#IfC82`%kz8b+O z_J)o3b=&LJ<;1 zJ+BvpK_CN|z%NX2Ql?u_-eJBZavPWkD9r|j5h-F5mPum^JC_ zN*OmJ4!dx+%d?EDfG1MKA{Xf-iLy}1B9{^)85Th*bDv`>Loz9ZEQ(krG0#P=q9`nU z^e1675q{#w6U8y%2`!95k%W>X#(o?ZNuctC?9(vAlqX@P6sOQA3LX~i|IgsUJ1i#} v+$b4(Ly|hU7clfjvyb%hsqc-|C}_G#(0n)vSY=aVSAvM+kTn_yr#O literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInSymbol.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInSymbol.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0b0fbd823479ebfac7748440c683be06eadbf4b3 GIT binary patch literal 1403 zcmc&!+invv5PkPo_$6v9l&ml7y`U;mn>3}Omykq&)b_!hFamqZOvc*9Z>XZCpJ%$ehD4f}&O@5H3_?faLnL{Uafc0=~}gHx!c?j7Z#+pV1i zJtrSXFqm`NH{=x|P!&xWcm7DYIodOogUZ#^ryB)lP|Wn9Sza>y8!^h&buiQx5mc-I zBdE>7=1^nVw-?zB|aRn1Qn{VZq+}{EwnnJhh>39+x@eP0fpl%ARkUj16 zdo$gDIdZtATr=B{1%H-4_L*1Gj~AKqQV)!sKU8Xl zw04GJWVoEk4PRZ-SODrn9w1|HKz$C_*a^1|4|F% z4XKbDhB}Jz)Qe@OWR-GSuY82PP}zyq!xuL7JJ zw4^^{f}sF@(P|wF1rBv9CKMWAE5_nqaSY|(#)a6zb}S09@vVI5^-auKJ$nz%pZsZK@6K}8Hgk#Jt5saAb?e*y(zhR9dQv-W-O3P&N=d7AbTJ@50ROvxW&i*H literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInUse.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/cmp_visibilityHiddenInUse.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2bade7ae4ceeea75957fddcd93fe28dc7a7cf034 GIT binary patch literal 1347 zcmc&z-EPw`6u$RU_@>$>l*M)&$3au2t)(!rpVC%_X=bPClCO_kCF5%vQ?{FSENV4Xzft-}fo`L?~EvHTa9B3(;y0lv9^x zu~v@O$^$6URi+*)r?-bM8DTMjjj@PP{(?kXglz4E$EJ8*VQfvY%C+6DX8P8B#RFqC zPIu`p38p9ek)O=N2Pm4giAS$9IoQCi>#!i<-{DWZ?-u^)Dsvv}k+I9)vARY* z@WTU7aNs|_%lQ)ZaC5W3))?1zgQfnoae5--NxC5u;*mdRRduPYALzp&KHJMQji^vDCq*u#bED}Z1 zBug?tHj5d{6xU_Ol`OJc5UKN2P(hAYk{r{iAJUpyRgZ<=B!U=E_Sm}?`>a)fYW~bLqZr}$u_;YYk S + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInClipPathWithUse.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInClipPathWithUse.svg new file mode 100644 index 0000000000..6cef41a807 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInClipPathWithUse.svg @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInDefs.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInDefs.svg new file mode 100644 index 0000000000..c6c2e5f28b --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInDefs.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInG.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInG.svg new file mode 100644 index 0000000000..d1b5b9f8e2 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInG.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInG2.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInG2.svg new file mode 100644 index 0000000000..dfaa7135c9 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInG2.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInLinearGradient.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInLinearGradient.svg new file mode 100644 index 0000000000..8331a806f6 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInLinearGradient.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInMarker.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInMarker.svg new file mode 100644 index 0000000000..309a197c0b --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInMarker.svg @@ -0,0 +1,12 @@ + + + + + + + + + Sorry, your browser does not support inline SVG. + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInPattern.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInPattern.svg new file mode 100644 index 0000000000..603609fb77 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInPattern.svg @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInSymbol.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInSymbol.svg new file mode 100644 index 0000000000..7d1e6f912c --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInSymbol.svg @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInUse.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInUse.svg new file mode 100644 index 0000000000..0bc2d28349 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/displayNoneInUse.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibility2.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibility2.svg new file mode 100644 index 0000000000..a74e84219a --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibility2.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInClipPath.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInClipPath.svg new file mode 100644 index 0000000000..729e03e0bf --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInClipPath.svg @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInClipPathWithUse.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInClipPathWithUse.svg new file mode 100644 index 0000000000..c5cc203836 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInClipPathWithUse.svg @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInDefs.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInDefs.svg new file mode 100644 index 0000000000..c7135fb7db --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInDefs.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInG.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInG.svg new file mode 100644 index 0000000000..d1719c4831 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInG.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInLinearGradient.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInLinearGradient.svg new file mode 100644 index 0000000000..e3e90a583a --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInLinearGradient.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInMarker.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInMarker.svg new file mode 100644 index 0000000000..720a62cd00 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInMarker.svg @@ -0,0 +1,12 @@ + + + + + + + + + Sorry, your browser does not support inline SVG. + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInPattern.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInPattern.svg new file mode 100644 index 0000000000..cea7695ff4 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInPattern.svg @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInSymbol.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInSymbol.svg new file mode 100644 index 0000000000..79bd01952b --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInSymbol.svg @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInUse.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInUse.svg new file mode 100644 index 0000000000..5dfee593a4 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/VisibilityTest/visibilityHiddenInUse.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/SymbolTest/cmp_displayNoneAttrTest.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/SymbolTest/cmp_displayNoneAttrTest.pdf index 478629c99a47d4c08263cc2111c910d2a01a38e7..22799b549fb260ff0f97d7fd1495ee41372c96eb 100644 GIT binary patch delta 402 zcmc&wD^3JK6wJ)57zTv^gV-^XSr)fhtp?s#2-f&CiXuX)#BTLQ>`~$R42I*}Hu3i}5kc7W)V|z@K4tQ9Kuw zV3j_~dFskOom6+}t2!@mbv$`5(@k9$kZ$XjEkNDE58C^-`4u3fP6un-OJPX}s}0$x z{J;iDTfs0w402?$;D^8zSTPTFAkW0i06L&i5;Zs@&}oQH2|*(=fyWpr_#CueY8{Pp uxqU!J10fn~d~|_wjmBV>>ge!4Crt7Nm9CpY31-g3gNcVu73K~=hDPbcX&J=c3t diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/SymbolTest/cmp_visibilityAttrTest.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/SymbolTest/cmp_visibilityAttrTest.pdf index c9f03967eef058e2d60c0a043aa10dd83391fe41..9f3294e18da586138aff45319a5027cfe96eecdc 100644 GIT binary patch delta 402 zcmc(bElvbM5QQ@{D~3TKz#w+aWR^uxRs9cy5VAlJ1dF74x;p^@27%i{wBrOM7?QmN zCm|dG$$;PrJoS?Ii7)SU^K;{ETFeOq3Q2^!AbNm)XYcYMEch|b7W)LG;15_`6wgJ4 zR_Bj$p1ZQoC)Hj4s?G~q9Z%lNd{fs2 zbU`?W=sgJ;A}HmOGTJZ`+QE6{ED-AmPJ5XoD0ar%5Crq!Mgky=JSp@bg-$+7c8N`t uHVKn}q9#@}j2i|YlTCq^>FDr36(*xY%Gb?weCny0t)oHFblvIIS@R8|6>7%- delta 478 zcmb`@y-EW?5WsQnF2-Ybm0P64VSkcm(;;$ay>t#GAtCpL1B+Ud zac%~>r2B#lBUBQ|D<=F53&lJdyYfQYLKw%T_5_9-t)-PhF(U4m6$T1p3RGqWsF;>B q&NxX9PFZ6t4Ty6>dHh$xq%`~wA>7uQ GetAttributeMapCopy() { public void Draw(SvgDrawContext context) { PdfCanvas currentCanvas = context.GetCurrentCanvas(); if (this.attributesAndStyles != null) { + if (IsHidden()) { + return; + } String transformString = this.attributesAndStyles.Get(SvgConstants.Attributes.TRANSFORM); if (transformString != null && !String.IsNullOrEmpty(transformString)) { AffineTransform transformation = TransformUtils.ParseTransform(transformString); @@ -251,6 +254,13 @@ protected internal virtual void DeepCopyAttributesAndStyles(ISvgNodeRenderer dee /// the object that knows the place to draw this element and maintains its state protected internal abstract void DoDraw(SvgDrawContext context); + /// Check if this renderer should draw the element based on its attributes (e.g. visibility/display) + /// true if element won't be drawn, false otherwise + protected internal virtual bool IsHidden() { + return CommonCssConstants.NONE.Equals(this.attributesAndStyles.Get(CommonCssConstants.DISPLAY)) || CommonCssConstants + .HIDDEN.Equals(this.attributesAndStyles.Get(CommonCssConstants.VISIBILITY)); + } + //\cond DO_NOT_DOCUMENT /// /// Gets parent @@ -566,6 +576,9 @@ private TransparentColor GetColorFromAttributeValue(SvgDrawContext context, Stri float resolvedOpacity = 1; normalizedName = normalizedName.Substring(1); ISvgNodeRenderer colorRenderer = context.GetNamedObject(normalizedName); + if (colorRenderer is AbstractSvgNodeRenderer && ((AbstractSvgNodeRenderer)colorRenderer).IsHidden()) { + colorRenderer = null; + } if (colorRenderer is ISvgPaintServer) { if (colorRenderer.GetParent() == null) { colorRenderer.SetParent(this); @@ -639,6 +652,9 @@ private bool DrawInClipPath(SvgDrawContext context) { if (template is ClipPathSvgNodeRenderer) { // Clone template to avoid muddying the state ClipPathSvgNodeRenderer clipPath = (ClipPathSvgNodeRenderer)template.CreateDeepCopy(); + if (clipPath.IsHidden()) { + return false; + } // Resolve parent inheritance SvgNodeRendererInheritanceResolver.ApplyInheritanceToSubTree(this, clipPath, context.GetCssContext()); clipPath.SetClippedRenderer(this); diff --git a/itext/itext.svg/itext/svg/renderers/impl/ClipPathSvgNodeRenderer.cs b/itext/itext.svg/itext/svg/renderers/impl/ClipPathSvgNodeRenderer.cs index bd2d27790a..7edaea8d1b 100644 --- a/itext/itext.svg/itext/svg/renderers/impl/ClipPathSvgNodeRenderer.cs +++ b/itext/itext.svg/itext/svg/renderers/impl/ClipPathSvgNodeRenderer.cs @@ -24,6 +24,7 @@ You should have received a copy of the GNU Affero General Public License using iText.Commons; using iText.Kernel.Geom; using iText.Kernel.Pdf.Canvas; +using iText.StyledXmlParser.Css; using iText.Svg.Logs; using iText.Svg.Renderers; @@ -63,6 +64,9 @@ protected internal override void DoDraw(SvgDrawContext context) { } PdfCanvas currentCanvas = context.GetCurrentCanvas(); foreach (ISvgNodeRenderer child in GetChildren()) { + if (child is AbstractSvgNodeRenderer && ((AbstractSvgNodeRenderer)child).IsHidden()) { + continue; + } currentCanvas.SaveState(); child.SetParent(this); child.Draw(context); @@ -101,5 +105,10 @@ public virtual void DrawClippedRenderer(SvgDrawContext context) { public virtual void SetClippedRenderer(AbstractSvgNodeRenderer clippedRenderer) { this.clippedRenderer = clippedRenderer; } + + protected internal override bool IsHidden() { + return CommonCssConstants.NONE.Equals(this.attributesAndStyles.Get(CommonCssConstants.DISPLAY)) && !CommonCssConstants + .HIDDEN.Equals(this.attributesAndStyles.Get(CommonCssConstants.VISIBILITY)); + } } } diff --git a/itext/itext.svg/itext/svg/renderers/impl/LinearGradientSvgNodeRenderer.cs b/itext/itext.svg/itext/svg/renderers/impl/LinearGradientSvgNodeRenderer.cs index 086d92113b..30d575265b 100644 --- a/itext/itext.svg/itext/svg/renderers/impl/LinearGradientSvgNodeRenderer.cs +++ b/itext/itext.svg/itext/svg/renderers/impl/LinearGradientSvgNodeRenderer.cs @@ -24,6 +24,7 @@ You should have received a copy of the GNU Affero General Public License using iText.Kernel.Colors; using iText.Kernel.Colors.Gradients; using iText.Kernel.Geom; +using iText.StyledXmlParser.Css; using iText.Svg; using iText.Svg.Renderers; using iText.Svg.Utils; @@ -71,6 +72,10 @@ public override Rectangle GetObjectBoundingBox(SvgDrawContext context) { return null; } + protected internal override bool IsHidden() { + return CommonCssConstants.NONE.Equals(this.attributesAndStyles.Get(CommonCssConstants.DISPLAY)); + } + // TODO: DEVSIX-4136 opacity is not supported now. // The opacity should be equal to 'parentOpacity * stopRenderer.getStopOpacity() * stopColor[3]' private IList ParseStops(float parentOpacity) { diff --git a/itext/itext.svg/itext/svg/renderers/impl/MarkerSvgNodeRenderer.cs b/itext/itext.svg/itext/svg/renderers/impl/MarkerSvgNodeRenderer.cs index f780658f31..2444b69bae 100644 --- a/itext/itext.svg/itext/svg/renderers/impl/MarkerSvgNodeRenderer.cs +++ b/itext/itext.svg/itext/svg/renderers/impl/MarkerSvgNodeRenderer.cs @@ -26,6 +26,7 @@ You should have received a copy of the GNU Affero General Public License using iText.Commons; using iText.Commons.Utils; using iText.Kernel.Geom; +using iText.StyledXmlParser.Css; using iText.StyledXmlParser.Css.Util; using iText.Svg; using iText.Svg.Logs; @@ -68,6 +69,10 @@ public override Rectangle GetObjectBoundingBox(SvgDrawContext context) { return null; } + protected internal override bool IsHidden() { + return CommonCssConstants.HIDDEN.Equals(this.attributesAndStyles.Get(CommonCssConstants.VISIBILITY)); + } + //\cond DO_NOT_DOCUMENT internal override void PreDraw(SvgDrawContext context) { base.PreDraw(context); diff --git a/port-hash b/port-hash index fa472f4d70..5eccf9326f 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -69e07f12e59d863d6d273abf394224a2bb349bdc +07a241a33317682f44cfeb56021f97b3f3781286 From 2ce85ccc8e072482b86b2142b3adbc76a046a73a Mon Sep 17 00:00:00 2001 From: Dmitry Radchuk Date: Tue, 4 Feb 2025 16:50:52 +0000 Subject: [PATCH 05/10] Fix rgba alpha channel parsing DEVSIX-2673 Autoported commit. Original commit hash: [d49afc6d1] --- .../itext/kernel/colors/WebColorsTest.cs | 6 ++++++ .../itext/svg/renderers/OpacityTest.cs | 1 - .../impl/OpacityTest/cmp_svg_rgba.pdf | Bin 3542 -> 3477 bytes .../itext/kernel/colors/WebColors.cs | 3 +++ port-hash | 2 +- 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/itext.tests/itext.kernel.tests/itext/kernel/colors/WebColorsTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/colors/WebColorsTest.cs index f876214259..8e00948c4c 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/colors/WebColorsTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/colors/WebColorsTest.cs @@ -173,6 +173,12 @@ public virtual void GetRGBAColorWithExceptionDuringParsing() { NUnit.Framework.Assert.IsNull(resultCmyk); } + [NUnit.Framework.Test] + public virtual void GetRGBAColorWithExceptionDuringParsingAlpha() { + float[] resultCmyk = WebColors.GetRGBAColor("rgba(44, 100, 0, 0,75)"); + NUnit.Framework.Assert.IsNull(resultCmyk); + } + [NUnit.Framework.Test] public virtual void GetCMYKColorTest() { //corresponding color name = "violet" diff --git a/itext.tests/itext.svg.tests/itext/svg/renderers/OpacityTest.cs b/itext.tests/itext.svg.tests/itext/svg/renderers/OpacityTest.cs index dac31926f4..60ada7db52 100644 --- a/itext.tests/itext.svg.tests/itext/svg/renderers/OpacityTest.cs +++ b/itext.tests/itext.svg.tests/itext/svg/renderers/OpacityTest.cs @@ -54,7 +54,6 @@ public virtual void TestOpacityComplex() { [NUnit.Framework.Test] public virtual void TestRGBA() { - //TODO: update after DEVSIX-2673 fix ConvertAndCompare(SOURCE_FOLDER, DESTINATION_FOLDER, "svg_rgba"); } diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/OpacityTest/cmp_svg_rgba.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/OpacityTest/cmp_svg_rgba.pdf index 0a8331a699622cf80af67cb745796ee13eae2885..4d9f1f54c080fcc8f3031f06d79f6f32d32069c2 100644 GIT binary patch delta 580 zcmb`Eze;046vmkdVrKs!sN1A)nh;lsIWuSO{8>U8vkNIi{8I>GG56jX2}mwnQn=gX z4QvJofQU%XXVs>=x<7bDEFe`HGM4JU6Zyx9en60CFji+bzHrK^J(~1c(Iw8L9!vNexxJsU62=tyS5D$J!FG*_LNS=L8NK)-C{Uk(H z5A`o3{-&Sf3tc8U{-KR{NooC}^nn87GWI`QZz#iHHf+S`s{o-a&M_VLKdwx)RPz^| z%rOJvXOnYS==O3)mgOoid8vnp}9l+H_=n1G1h$Q*K>*x&?r!N{PD6$V|_duxQr zG{ZYZIPDBZpcYB>rr3uV z@(_W5!nN`hwAM%P3GA~Pu*hPYQ~mfj{LaVux%jYny~Ng~(jYaV+5lVySY0c2`mqy+ z)tAne0!8q)Pg0=t_j5d|k+LlfkXSMa{r414>l`h1dB1{Q_Qi?1{7rY!r@MV~MY Date: Tue, 4 Feb 2025 16:54:44 +0000 Subject: [PATCH 06/10] SVG: fix preserveAspectRatio on image DEVSIX-8885 Autoported commit. Original commit hash: [903b8dfd4] --- ...pectRatioSvgNodeRendererIntegrationTest.cs | 12 +- .../cmp_noWidthHeightSvg.pdf | Bin 4876 -> 4935 bytes .../noWidthHeightSvgImage.svg | 1 + .../cmp_patternHrefPreserveAR1.pdf | Bin 10605 -> 10617 bytes .../cmp_patternHrefTransitivePresAR2.pdf | Bin 10604 -> 10616 bytes .../cmp_differentAspectRatios.pdf | Bin 14810 -> 16514 bytes .../cmp_imageNegativeWidthHeight.pdf | Bin 0 -> 4999 bytes .../cmp_imagePreserveAspectRatio.pdf | Bin 0 -> 7521 bytes .../differentAspectRatios.svg | 17 ++- .../imageNegativeWidthHeight.svg | 33 +++++ .../imagePreserveAspectRatio.svg | 117 ++++++++++++++++++ .../cmp_patternXlinkHrefPreserveAR1.pdf | Bin 10523 -> 10544 bytes .../impl/AbstractBranchSvgNodeRenderer.cs | 29 ----- .../renderers/impl/AbstractSvgNodeRenderer.cs | 29 +++++ .../renderers/impl/ImageSvgNodeRenderer.cs | 110 +++++----------- port-hash | 2 +- 16 files changed, 232 insertions(+), 118 deletions(-) create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/cmp_imageNegativeWidthHeight.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/cmp_imagePreserveAspectRatio.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/imageNegativeWidthHeight.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/imagePreserveAspectRatio.svg diff --git a/itext.tests/itext.svg.tests/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest.cs b/itext.tests/itext.svg.tests/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest.cs index 3dcdb2aeb3..208f8bd08c 100644 --- a/itext.tests/itext.svg.tests/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest.cs +++ b/itext.tests/itext.svg.tests/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest.cs @@ -56,12 +56,20 @@ public virtual void ViewBoxWithoutSetPreserveAspectRatioTest() { } [NUnit.Framework.Test] - [LogMessage(iText.StyledXmlParser.Logs.StyledXmlParserLogMessageConstant.INVALID_CSS_PROPERTY_DECLARATION, - Count = 19)] public virtual void DifferentAspectRatiosTest() { ConvertAndCompare(SOURCE_FOLDER, DESTINATION_FOLDER, "differentAspectRatios"); } + [NUnit.Framework.Test] + public virtual void ImagePreserveAspectRatioTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "imagePreserveAspectRatio"); + } + + [NUnit.Framework.Test] + public virtual void ImageNegativeWidthHeightTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "imageNegativeWidthHeight"); + } + [NUnit.Framework.Test] public virtual void ViewBoxScalingTestPreserveAspectDefaultAllGroup() { ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "PreserveAspectDefaultAllGroup"); diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/SvgImageRendererTest/cmp_noWidthHeightSvg.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/SvgImageRendererTest/cmp_noWidthHeightSvg.pdf index 9dc92a054bbce85d435afda4fc50005442009294..e9f58f168fd430395a7d475309664758a00774c0 100644 GIT binary patch delta 445 zcmc(ZyGjE=6oy&1atcAqRNHLg1>-qqE@wu9Ra6i}>;!G*YAFfn^8$9;+xP-PDl1E0 z%Uub+g3W({|AYT^{5}4_>X<;HLnq}4$O*vY=3>P9)JN@2sCzB4E=PQ`$}ry zHm(kPwIk@>_D5@Nu_%n5eTW=@Bqa~53`#2%NzJ*~#4-fX(kH`)06CC1Y@wJ`(CHEq zqL0xPb{sQj6%`pKjwWl0DJEMuvL!Sgf-VqMiaJ>*iPms2`_Bt?|DpRlxY>0e+V=A9 GO8fw!wQ)@V delta 407 zcmcJKJxT;Y5QUjFvI7Id4WyIZ^#|Fi{;BDb!Dw_*5D%~>{Wl_r;xPGMz-*4-1%$nT znHTZ^&KMY)`6{VbJc{pq&R^&6SR5m0bcg^apcep(qvg$Ws(qIa>oWz)!f&8o7puZ- z-->B5A?`mWcLyNHY4630P|E(8({U-S)BxLVC+uw;p@dQLNs6xZ50AMORkggT<+@^J zxCt&r@<>KQZpfm_$;8s+2-*&((kJbk;8P5NGFtY89E020ZV1DmWKyS vm<(vZaznx8?ETO&aI}UpF=?feL&gB-|BWCAhCdPdul?&?jbb*txV;qL9|3Af diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/SvgImageRendererTest/noWidthHeightSvgImage.svg b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/SvgImageRendererTest/noWidthHeightSvgImage.svg index 24d7ee3ebc..ba3af39f5c 100644 --- a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/SvgImageRendererTest/noWidthHeightSvgImage.svg +++ b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/SvgImageRendererTest/noWidthHeightSvgImage.svg @@ -1,5 +1,6 @@ + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PathSvgNodeRendererTest/cmp_patternHrefPreserveAR1.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PathSvgNodeRendererTest/cmp_patternHrefPreserveAR1.pdf index 149e4def2fc84a1fd21793bcd58426b34eae9bbe..30e9a6e2298e64d1ca078b321c7f21c432a353b4 100644 GIT binary patch delta 405 zcmaDG^fPFK6{D7sfr+7^iK(H9wt=y_fq}ZFzHfetOJYf?hKrSvfsv^JT*2fNMt4Tj z&1)F>n3&9rChuXcHxf8}N2H}IXy>7wpBkJT%sfJ_AM!YVNJu4jVS47O33E;_eLpjM z#e+%bMLAkBV;Ej;;?voj$TCZr$<%Q2Uv=sF#I&R|OA}+$L^CsEBTHjbQ)5$Oqog#` z6boaEG&4&J3&Z4OW8);tM3b~MGjlTw^Aw{*LsJ72^JF8#WYbiGlr&Q_BTJJM1H)9H zmc%3@GxJm<%e1tV6jP(L6yr2Q)6_(ZWT0_IX{O1RrfI23=BWk-29{}wAbx7SosGpn XI)NGJhRKqe-kc_uT&k+B{%%|VOd5Kh delta 393 zcmc)FyGjE=6o6r8qs6Y^186DhCb4kNncJD5R`CKNLJ+jDnVp&KL`>`~_93=QZ)YK- zv9R$8Yy=xC5k=4kuroHkg8g57|M%c)aMNR5-~tE$)G8MR=S632|19*~MQrzb$WigX zpb2b;$;mZaND{@HyH>p-MjP{jA3Z%E-XA|ap0M5GefV+tw%EOW9nB4|&e_aomcC3* zXUEHluua-ts-uL;lPI;a!E+lF+5i*~fXIkaMnyq^ap*acGtP?WypDk^7_=I#RFYh& zo#2i{#Vdqp%2;WnszT*rkk$ob$f78xcCS4;q!_gRU8y(M=|2grsiDa`d#Ny4o^Ks& FXFunNZr1<+ diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PathSvgNodeRendererTest/cmp_patternHrefTransitivePresAR2.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PathSvgNodeRendererTest/cmp_patternHrefTransitivePresAR2.pdf index 8ea691382b85c70df740afb837553e014c2bdb28..66094032d38931357abe0550fcc7e7d0cf776205 100644 GIT binary patch delta 409 zcmaD8^do446{D7sfr+7^iK(H9wt=y_fq}ZFzHfetOJYf?hKrSvfsv^JT*2fNMt4Tj z&1)EWnV8IsChumhHxxL0N2H}IXy>7wpBkJT%sfJ_AM!YVNJu4jVS47O33E;_eLpjM z#e+%bMLAkBV;Ej;;+tH^EWEjhr9+v?)L`--b*XwoQwtLV12eTSTmX=~d!qmV delta 415 zcmcJ}y-EW?6oz3pYLOLhz-mF`npotVnK?TW;g&ouGxlF-2s_D)1N}ZnpQ%ZLSAyCGRj` z1i!)123vs`-30Ts8o}^>x?1M_wK)!l&o2iLM~_b@!FK#neqO#WwC>*ev*qR%T%r-uD94bb zHVR2ONydxRaMYSJ=?tNCz=UuFLLg71vf6lS6cb3Gv@I%)WVB3>JSLMnDeZyF!Z?>I ZSpRoIG%@^17%nw;>pTe?jg9@y@EZzdb!h+q diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/cmp_differentAspectRatios.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/cmp_differentAspectRatios.pdf index 410b2c0f0aff45da1281504cfeb60fe1560883da..f02a52b08f1b329406c153b8dcc7e76eabce8da2 100644 GIT binary patch delta 1067 zcmc(dO-~b16oxZ12y|NLw1UWG?|HjSGf|SByo&P?)l=&j54vBJP#3 z^S6Mzdi`bUf@q-5kPXxcUIT>-s)5o4zk!}hNduKjp@F_jDK42K@fYizm0qx+DC?T~ zEqWBk6M5`z>%sSJOW6gR6n!aWU4^(%(v(6EG-MNM%nN)l;-C`IN=bcT1 z?G`$lS#RfVY0jRqrx1FNVr#Yww^%7zH$iDpxQxWB`4=X3b~|eu#KPmbO#GJpHj(EK z$8PtIiIcrfT+Fpuc%$EmC-N;8&JP^JkL=9BA`c4LIG5cv@#(M=U+X<&;p(Up&-R-Z zJ||B6aNw7T8!Qtq7c9%95U&h(>MxC-jka2e`?tf$)~*sI0IGsnRNhe!0w`$|>-OmRaaA6-9v`lxZNV z6{>;&f&CU=*++tY*SVQvB*mqe1AUpqS+)Fcoi7MiGqU=#NCW{ZFdY9Rp) zT56+wRj^c|DU`qFPyPzvI68)exr-JMB9L>>onn}BOz`Q(^m&e{ zNTI;gPoa;gOrgXyNMV4fN}<9uOks!_F|Xb4E=+b|$aY_Y)$R>Mp;*`hpNkDx%KI?u z?T4vM4IXxv;d*8np7dnlU7-Y%**8eEmGk)qR6HMMsypFMu7-TePQs7e9FlOhcLSd0 z$}pdQfRyE*q0qc4_^eZ>d_g<8kTW|cLgxN4rgjP1Fs6xa5t_s?iJ5NFIFc-g1(jS&dyA>iBotxD;vm+c ztt5&lmS~YMExAt<`*+3ts3}`b84<=MPgo*Uv?z}p`kxWHYz7IV6IHu;Cntuof-sh; K)sD_gXZ`>a67>xL diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/cmp_imageNegativeWidthHeight.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/cmp_imageNegativeWidthHeight.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d9e7338b2ee766ea72671865642d7dd1ae5fe715 GIT binary patch literal 4999 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 ALI3~& literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/cmp_imagePreserveAspectRatio.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/cmp_imagePreserveAspectRatio.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dcdc4c4a2ffd5d4f4e0b03ce2f426f13d7eef342 GIT binary patch literal 7521 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 M@n&YT=DXql4*`E*&;S4c literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/differentAspectRatios.svg b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/differentAspectRatios.svg index 6e1cecc52a..a2a4844e0e 100644 --- a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/differentAspectRatios.svg +++ b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/differentAspectRatios.svg @@ -3,7 +3,6 @@ Example PreserveAspectRatio - illustrates preserveAspectRatio attribute @@ -20,13 +19,23 @@ SVG to fit - + Viewport 1 - + + + + + + Viewport 2 - + + + + + + --------------- meet --------------- diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/imageNegativeWidthHeight.svg b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/imageNegativeWidthHeight.svg new file mode 100644 index 0000000000..2cf2e6ac62 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/imageNegativeWidthHeight.svg @@ -0,0 +1,33 @@ + + + + + + Image with 40 width, 40 height: + + + + Image with 0 width, 0 height: + + + + Image with -10 width, -10 height: + + + + Image with -150 width, -150 height: + + + + Image with no width, no height: + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/imagePreserveAspectRatio.svg b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/imagePreserveAspectRatio.svg new file mode 100644 index 0000000000..8d8ad7d545 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/PreserveAspectRatioSvgNodeRendererIntegrationTest/imagePreserveAspectRatio.svg @@ -0,0 +1,117 @@ + + + + + + + + + preserveAspectRatio on an image element + + Image to fit: + + + + Viewport 1 + + + + + Viewport 2 + + + + + + ---------- Meet: ---------- + + xMin* + + + + + xMid* + + + + + xMax* + + + + + + ---------- Meet: ---------- + + *YMin + + + + + *YMid + + + + + *YMax + + + + + + ---------- Slice: ---------- + + xMin* + + + + + xMid* + + + + + xMax* + + + + + + + ---------- Slice: ---------- + + *YMin + + + + + *YMid + + + + + *YMax + + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/XLinkDataTest/cmp_patternXlinkHrefPreserveAR1.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/XLinkDataTest/cmp_patternXlinkHrefPreserveAR1.pdf index 511d11d1c76f6a54aa9ccfc96279420da648f7f0..c37d59d99f7310b8dfa2ca11f07f2e3e2772f056 100644 GIT binary patch delta 409 zcmc(ZO-chn6oi?WjqMHGI3Qu7V)FWRzwXx(T#ZTu5wmgKKQp^AD6Y*JWR@0i|=E#U2TtwQv@xgCW&XDDuC)_ez#7we{H7q1p*TM9r|T)Q_$|c z_$fxl_1)eZK?$X$K`)JX6i?z=|Edyk~qN03ol0@lW6R22X?f%2AJKEK}(I5U|3dwRQXt(Z)%?yto!YQAS& delta 388 zcmc(ZJxT*n6or|X##w@m0}>Jyll$}Tdv`=qjYIH`&WkGqMnyol2A%`VFIUgIu8FUyNdCvTMxOZ63uxd~G7QbIL$>dV!p$Ew*KtLf*(M0EI?pY72}jYchy5jl&sqR;3P zNvPXYBS>Ht&0KpSQB6R}P+QlrL1d2LeNHNr$afhn=B&BJ;Ki_Qt&5s#cIKkb6j)?$>%0F{n2ruM{4AbM#h0_${mVo73lPm^Z~y=R diff --git a/itext/itext.svg/itext/svg/renderers/impl/AbstractBranchSvgNodeRenderer.cs b/itext/itext.svg/itext/svg/renderers/impl/AbstractBranchSvgNodeRenderer.cs index dc605616c3..b4244b313e 100644 --- a/itext/itext.svg/itext/svg/renderers/impl/AbstractBranchSvgNodeRenderer.cs +++ b/itext/itext.svg/itext/svg/renderers/impl/AbstractBranchSvgNodeRenderer.cs @@ -114,35 +114,6 @@ internal virtual void ApplyViewBox(SvgDrawContext context) { } //\endcond -//\cond DO_NOT_DOCUMENT - internal virtual String[] RetrieveAlignAndMeet() { - String meetOrSlice = SvgConstants.Values.MEET; - String align = SvgConstants.Values.DEFAULT_ASPECT_RATIO; - String preserveAspectRatioValue = this.attributesAndStyles.Get(SvgConstants.Attributes.PRESERVE_ASPECT_RATIO - ); - // TODO: DEVSIX-3923 remove normalization (.toLowerCase) - if (preserveAspectRatioValue == null) { - preserveAspectRatioValue = this.attributesAndStyles.Get(SvgConstants.Attributes.PRESERVE_ASPECT_RATIO.ToLowerInvariant - ()); - } - if (this.attributesAndStyles.ContainsKey(SvgConstants.Attributes.PRESERVE_ASPECT_RATIO) || this.attributesAndStyles - .ContainsKey(SvgConstants.Attributes.PRESERVE_ASPECT_RATIO.ToLowerInvariant())) { - IList aspectRatioValuesSplitValues = SvgCssUtils.SplitValueList(preserveAspectRatioValue); - align = aspectRatioValuesSplitValues[0].ToLowerInvariant(); - if (aspectRatioValuesSplitValues.Count > 1) { - meetOrSlice = aspectRatioValuesSplitValues[1].ToLowerInvariant(); - } - } - if (this is MarkerSvgNodeRenderer && !SvgConstants.Values.NONE.Equals(align) && SvgConstants.Values.MEET.Equals - (meetOrSlice)) { - // Browsers do not correctly display markers with 'meet' option in the preserveAspectRatio attribute. - // The Chrome, IE, and Firefox browsers set the align value to 'xMinYMin' regardless of the actual align. - align = SvgConstants.Values.XMIN_YMIN; - } - return new String[] { align, meetOrSlice }; - } -//\endcond - ///

Applies a clipping operation based on the view port. /// the svg draw context private void ApplyViewportClip(SvgDrawContext context) { diff --git a/itext/itext.svg/itext/svg/renderers/impl/AbstractSvgNodeRenderer.cs b/itext/itext.svg/itext/svg/renderers/impl/AbstractSvgNodeRenderer.cs index da4dc8e50d..7e6ed8ae24 100644 --- a/itext/itext.svg/itext/svg/renderers/impl/AbstractSvgNodeRenderer.cs +++ b/itext/itext.svg/itext/svg/renderers/impl/AbstractSvgNodeRenderer.cs @@ -254,6 +254,35 @@ protected internal virtual void DeepCopyAttributesAndStyles(ISvgNodeRenderer dee /// the object that knows the place to draw this element and maintains its state protected internal abstract void DoDraw(SvgDrawContext context); +//\cond DO_NOT_DOCUMENT + internal virtual String[] RetrieveAlignAndMeet() { + String meetOrSlice = SvgConstants.Values.MEET; + String align = SvgConstants.Values.DEFAULT_ASPECT_RATIO; + String preserveAspectRatioValue = this.attributesAndStyles.Get(SvgConstants.Attributes.PRESERVE_ASPECT_RATIO + ); + // TODO: DEVSIX-3923 remove normalization (.toLowerCase) + if (preserveAspectRatioValue == null) { + preserveAspectRatioValue = this.attributesAndStyles.Get(SvgConstants.Attributes.PRESERVE_ASPECT_RATIO.ToLowerInvariant + ()); + } + if (this.attributesAndStyles.ContainsKey(SvgConstants.Attributes.PRESERVE_ASPECT_RATIO) || this.attributesAndStyles + .ContainsKey(SvgConstants.Attributes.PRESERVE_ASPECT_RATIO.ToLowerInvariant())) { + IList aspectRatioValuesSplitValues = SvgCssUtils.SplitValueList(preserveAspectRatioValue); + align = aspectRatioValuesSplitValues[0].ToLowerInvariant(); + if (aspectRatioValuesSplitValues.Count > 1) { + meetOrSlice = aspectRatioValuesSplitValues[1].ToLowerInvariant(); + } + } + if (this is MarkerSvgNodeRenderer && !SvgConstants.Values.NONE.Equals(align) && SvgConstants.Values.MEET.Equals + (meetOrSlice)) { + // Browsers do not correctly display markers with 'meet' option in the preserveAspectRatio attribute. + // The Chrome, IE, and Firefox browsers set the align value to 'xMinYMin' regardless of the actual align. + align = SvgConstants.Values.XMIN_YMIN; + } + return new String[] { align, meetOrSlice }; + } +//\endcond + /// Check if this renderer should draw the element based on its attributes (e.g. visibility/display) /// true if element won't be drawn, false otherwise protected internal virtual bool IsHidden() { diff --git a/itext/itext.svg/itext/svg/renderers/impl/ImageSvgNodeRenderer.cs b/itext/itext.svg/itext/svg/renderers/impl/ImageSvgNodeRenderer.cs index 79b1bad65a..74520c3518 100644 --- a/itext/itext.svg/itext/svg/renderers/impl/ImageSvgNodeRenderer.cs +++ b/itext/itext.svg/itext/svg/renderers/impl/ImageSvgNodeRenderer.cs @@ -24,9 +24,11 @@ You should have received a copy of the GNU Affero General Public License using iText.Kernel.Geom; using iText.Kernel.Pdf.Canvas; using iText.Kernel.Pdf.Xobject; +using iText.StyledXmlParser.Css.Util; using iText.StyledXmlParser.Resolver.Resource; using iText.Svg; using iText.Svg.Renderers; +using iText.Svg.Utils; namespace iText.Svg.Renderers.Impl { /// Responsible for drawing Images to the canvas. @@ -67,98 +69,42 @@ protected internal override void DoDraw(SvgDrawContext context) { if (attributesAndStyles.ContainsKey(SvgConstants.Attributes.Y)) { y = ParseVerticalLength(attributesAndStyles.Get(SvgConstants.Attributes.Y), context); } - float width; + float width = -1; if (attributesAndStyles.ContainsKey(SvgConstants.Attributes.WIDTH)) { width = ParseHorizontalLength(attributesAndStyles.Get(SvgConstants.Attributes.WIDTH), context); } - else { - width = xObject.GetWidth(); + if (width < 0) { + width = CssUtils.ConvertPxToPts(xObject.GetWidth()); } - float height; + float height = -1; if (attributesAndStyles.ContainsKey(SvgConstants.Attributes.HEIGHT)) { height = ParseVerticalLength(attributesAndStyles.Get(SvgConstants.Attributes.HEIGHT), context); } - else { - height = xObject.GetHeight(); + if (height < 0) { + height = CssUtils.ConvertPxToPts(xObject.GetHeight()); } - String preserveAspectRatio = ""; - if (attributesAndStyles.ContainsKey(SvgConstants.Attributes.PRESERVE_ASPECT_RATIO)) { - preserveAspectRatio = attributesAndStyles.Get(SvgConstants.Attributes.PRESERVE_ASPECT_RATIO); - } - else { - if (attributesAndStyles.ContainsKey(SvgConstants.Attributes.PRESERVE_ASPECT_RATIO.ToLowerInvariant())) { - // TODO: DEVSIX-3923 remove normalization (.toLowerCase) - preserveAspectRatio = attributesAndStyles.Get(SvgConstants.Attributes.PRESERVE_ASPECT_RATIO.ToLowerInvariant - ()); - } - } - preserveAspectRatio = preserveAspectRatio.ToLowerInvariant(); - if (!SvgConstants.Values.NONE.Equals(preserveAspectRatio) && !(width == 0 || height == 0)) { - float normalizedWidth; - float normalizedHeight; - if (xObject.GetWidth() / width > xObject.GetHeight() / height) { - normalizedWidth = width; - normalizedHeight = xObject.GetHeight() / xObject.GetWidth() * width; - } - else { - normalizedWidth = xObject.GetWidth() / xObject.GetHeight() * height; - normalizedHeight = height; - } - switch (preserveAspectRatio.ToLowerInvariant()) { - case SvgConstants.Values.XMIN_YMIN: { - break; - } - - case SvgConstants.Values.XMIN_YMID: { - y += Math.Abs(normalizedHeight - height) / 2; - break; - } - - case SvgConstants.Values.XMIN_YMAX: { - y += Math.Abs(normalizedHeight - height); - break; - } - - case SvgConstants.Values.XMID_YMIN: { - x += Math.Abs(normalizedWidth - width) / 2; - break; - } - - case SvgConstants.Values.XMID_YMAX: { - x += Math.Abs(normalizedWidth - width) / 2; - y += Math.Abs(normalizedHeight - height); - break; - } - - case SvgConstants.Values.XMAX_YMIN: { - x += Math.Abs(normalizedWidth - width); - break; - } - - case SvgConstants.Values.XMAX_YMID: { - x += Math.Abs(normalizedWidth - width); - y += Math.Abs(normalizedHeight - height) / 2; - break; - } - - case SvgConstants.Values.XMAX_YMAX: { - x += Math.Abs(normalizedWidth - width); - y += Math.Abs(normalizedHeight - height); - break; - } - - case SvgConstants.Values.DEFAULT_ASPECT_RATIO: - default: { - x += Math.Abs(normalizedWidth - width) / 2; - y += Math.Abs(normalizedHeight - height) / 2; - break; - } + if (width != 0 && height != 0) { + String[] alignAndMeet = RetrieveAlignAndMeet(); + String align = alignAndMeet[0]; + String meetOrSlice = alignAndMeet[1]; + Rectangle currentViewPort = new Rectangle(0, 0, width, height); + Rectangle viewBox = new Rectangle(0, 0, xObject.GetWidth(), xObject.GetHeight()); + Rectangle appliedViewBox = SvgCoordinateUtils.ApplyViewBox(viewBox, currentViewPort, align, meetOrSlice); + float scaleWidth = appliedViewBox.GetWidth() / viewBox.GetWidth(); + float scaleHeight = appliedViewBox.GetHeight() / viewBox.GetHeight(); + float xOffset = appliedViewBox.GetX() / scaleWidth - viewBox.GetX(); + float yOffset = appliedViewBox.GetY() / scaleHeight - viewBox.GetY(); + x += xOffset; + y += yOffset; + width = appliedViewBox.GetWidth(); + height = appliedViewBox.GetHeight(); + if (SvgConstants.Values.SLICE.Equals(meetOrSlice)) { + currentCanvas.SaveState().Rectangle(currentViewPort).Clip().EndPath().AddXObjectWithTransformationMatrix(xObject + , width, 0, 0, -height, x, y + height).RestoreState(); + return; } - width = normalizedWidth; - height = normalizedHeight; } - float v = y + height; - currentCanvas.AddXObjectWithTransformationMatrix(xObject, width, 0, 0, -height, x, v); + currentCanvas.AddXObjectWithTransformationMatrix(xObject, width, 0, 0, -height, x, y + height); } } } diff --git a/port-hash b/port-hash index 052cea135c..b428e5c49b 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -d49afc6d1805f0493e00b10a61b53b441356f466 +903b8dfd4da6bfca580b85de4f7ad5d4ac7fd67b From 5b2b75d966f117f9bb4032398f15532f63f5d2dd Mon Sep 17 00:00:00 2001 From: Angelina Pavlovets Date: Tue, 4 Feb 2025 16:58:00 +0000 Subject: [PATCH 07/10] SVG: Fix currentColor handling DEVSIX-8886 Autoported commit. Original commit hash: [862fac8d9] --- .../svg/css/ColorTest/cmp_current-color.pdf | Bin 2119 -> 2369 bytes .../itext/svg/css/ColorTest/current-color.svg | 50 +++++++++++------- .../renderers/impl/AbstractSvgNodeRenderer.cs | 2 +- port-hash | 2 +- 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/ColorTest/cmp_current-color.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/css/ColorTest/cmp_current-color.pdf index 7f0f105eaddadb3d47ddf7c9f4ab2f566d6bbb7a..5ae1fb3f063cd45ff72d2fbc5682edbc93bb4db3 100644 GIT binary patch delta 530 zcmc&uOG*Pl6l64$NF(@J_*sav2__2hz3zGa5fPCn3W_LMW-~qAV^-Wf!}6G%b5f~r^4+wAN7<7%+ZL7)*@=nW8S0Bh~dlacEtx4zZg;=l=h z15Zc6OE6(%(U`oecL=bQ50f81a!@-Cuz0SW2lzA@&rqPOT$X_X)o8%;LzMoMnINKui7J0AD(BIvgmi3$ c@dEGd&h~#!sFfRR@!2?Jn#Zi!+&?{FU&d^R)&Kwi delta 375 zcmc)EF-k*05P)Hxc@lYrh!==WNYuiaot@pR1Ph6xpa|Yzc4yZ{5F{2>vGM|Y5y93b zmB+BLu=5JW#w*x=Km5z>_pO&fvxmk4S|-{D8Uc)U4=(R?Ci6U=9U3qUf8h1Jd27}@ z)_(7?KKH)ryuE0kF5Bx4cJ6Pw@$v0Lu21ctPS-!{X8&Um#eyP>B?%J6n}E(UJ609L zE~7y3F+@_0L2L#LF({j0CIMlhi6$<5 e{gudNVUMQ&xzMg2Z2jIi>)6|FI6S#J?S255`DhLR diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/css/ColorTest/current-color.svg b/itext.tests/itext.svg.tests/resources/itext/svg/css/ColorTest/current-color.svg index 3c6e2be18a..bdef4d13e4 100644 --- a/itext.tests/itext.svg.tests/resources/itext/svg/css/ColorTest/current-color.svg +++ b/itext.tests/itext.svg.tests/resources/itext/svg/css/ColorTest/current-color.svg @@ -1,25 +1,35 @@ - - - - - - Green text and border - - + + + + + + Green text and border + + + + + + + + + Blue text and border + + - - - - - - Blue text and border + + + + Orange Rectangle, black text and border. Parent element does not have a color set so currentColor = black. - - - - - Orange Rectangle, black text and border. Parent element does not have a color set so currentColor = black. - + + + + + + Red text and border + (inherit color) + + diff --git a/itext/itext.svg/itext/svg/renderers/impl/AbstractSvgNodeRenderer.cs b/itext/itext.svg/itext/svg/renderers/impl/AbstractSvgNodeRenderer.cs index 7e6ed8ae24..90f6741b36 100644 --- a/itext/itext.svg/itext/svg/renderers/impl/AbstractSvgNodeRenderer.cs +++ b/itext/itext.svg/itext/svg/renderers/impl/AbstractSvgNodeRenderer.cs @@ -587,7 +587,7 @@ private TransparentColor GetColorFromAttributeValue(SvgDrawContext context, Stri if (rawColorValue == null) { return null; } - if (CommonCssConstants.CURRENTCOLOR.Equals(rawColorValue)) { + if (CommonCssConstants.CURRENTCOLOR.Equals(rawColorValue.ToLowerInvariant())) { rawColorValue = GetAttributeOrDefault(CommonCssConstants.COLOR, "black"); } CssDeclarationValueTokenizer tokenizer = new CssDeclarationValueTokenizer(rawColorValue); diff --git a/port-hash b/port-hash index b428e5c49b..32e95eebbd 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -903b8dfd4da6bfca580b85de4f7ad5d4ac7fd67b +862fac8d90dda21c84542534c44a7cdfb97cf0e5 From 48ae01e9ca330a3382889ed000ddcddc6de7e08e Mon Sep 17 00:00:00 2001 From: Angelina Pavlovets Date: Tue, 4 Feb 2025 17:00:58 +0000 Subject: [PATCH 08/10] SVG: add tests for text-decoration inheritance DEVSIX-8888 Autoported commit. Original commit hash: [586e3e323] --- .../MarkerSvgNodeRendererIntegrationTest.cs | 2 - .../impl/TSpanNodeRendererIntegrationTest.cs | 18 +++ .../cmp_textDecorationOnGroup.pdf | Bin 0 -> 6414 bytes .../cmp_textDecorationOnSvg.pdf | Bin 0 -> 8832 bytes .../cmp_textDecorationOnSymbol.pdf | Bin 0 -> 9752 bytes .../textDecorationOnGroup.svg | 94 ++++++++++++++ .../textDecorationOnSvg.svg | 96 +++++++++++++++ .../textDecorationOnSymbol.svg | 116 ++++++++++++++++++ port-hash | 2 +- 9 files changed, 325 insertions(+), 3 deletions(-) create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/cmp_textDecorationOnGroup.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/cmp_textDecorationOnSvg.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/cmp_textDecorationOnSymbol.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/textDecorationOnGroup.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/textDecorationOnSvg.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/textDecorationOnSymbol.svg diff --git a/itext.tests/itext.svg.tests/itext/svg/renderers/impl/MarkerSvgNodeRendererIntegrationTest.cs b/itext.tests/itext.svg.tests/itext/svg/renderers/impl/MarkerSvgNodeRendererIntegrationTest.cs index c03b2623c8..e960c8745d 100644 --- a/itext.tests/itext.svg.tests/itext/svg/renderers/impl/MarkerSvgNodeRendererIntegrationTest.cs +++ b/itext.tests/itext.svg.tests/itext/svg/renderers/impl/MarkerSvgNodeRendererIntegrationTest.cs @@ -308,8 +308,6 @@ public virtual void DeformationWhenRotationAndPreserveAspectRationNoneTest() { [NUnit.Framework.Test] public virtual void MarkerParentElementTest() { - // TODO DEVSIX-4130 fix after ticket will be completed - // Compare with Chrome browser ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "markerParentElement"); } diff --git a/itext.tests/itext.svg.tests/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest.cs b/itext.tests/itext.svg.tests/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest.cs index 55c5a89627..aa5e2d20a9 100644 --- a/itext.tests/itext.svg.tests/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest.cs +++ b/itext.tests/itext.svg.tests/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest.cs @@ -314,6 +314,24 @@ public virtual void TextDecorationTspanTest() { ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "textDecorationTspan"); } + [NUnit.Framework.Test] + public virtual void TextDecorationOnGroupTest() { + // TODO DEVSIX-8888 SVG: support text-decoration inheritance + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "textDecorationOnGroup"); + } + + [NUnit.Framework.Test] + public virtual void TextDecorationOnSvgTest() { + // TODO DEVSIX-8888 SVG: support text-decoration inheritance + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "textDecorationOnSvg"); + } + + [NUnit.Framework.Test] + public virtual void TextDecorationOnSymbolTest() { + // TODO DEVSIX-8888 SVG: support text-decoration inheritance + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "textDecorationOnSymbol"); + } + [NUnit.Framework.Test] public virtual void TextDecorationTspanSubTest() { ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "textDecorationTspanSub"); diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/cmp_textDecorationOnGroup.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/cmp_textDecorationOnGroup.pdf new file mode 100644 index 0000000000000000000000000000000000000000..329621f449673c191ffde19222c24b8bf269247b GIT binary patch literal 6414 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 literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/cmp_textDecorationOnSymbol.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/cmp_textDecorationOnSymbol.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4c5d194f2e325517056e8eb642d4733361ce3025 GIT binary patch literal 9752 zcmc&)UvJws5P#RF;7ia1gJqHu^=Bvoq)D?C>z_0+)&XrEY)j5uG*%-!MZ0gbmwlBz z>>F%fWOpQGQI;Z#or}3ZBg?$|-I4dZJ5oBhI6EIPKlTp({^!rXJV7WaX79bnkH^pR z)y?Kt!uav=dQ;}pTkp;rpWiZaR(P*HFJEQ)He8`dSc{$(t4+SztO=^S9KXo3<@8DM z`7MR7K}dZT=|9)wi)jfX36}#e^L24w&hs_E|MF_~KA&&k3Nd5+{TM#uNx8gzK-c8U z#~c*i7LYf8P8-PKz=psn2{mx_WtXarNV?33+#T^25b* z@+mLZ0Ql~R{LU$*BZMR;AImT6ocvH0_aDj2pO0!=quSOd({+9hGd`XyZ}au&vbdeD z#!pxCB3rI*#&4FZlht~;{eE>n+u%Im6fpV!7=>%ixDNcoH%SMdHzM4AthWCQd4{%Ok;;5el@R2{5*E@6i8gj**htd?) z>ji)>0ZyY_74#gG`|58c&sCo3l$LXWvPyD*wxCBFga~iCsU}Ri31;EMOZ(JCWnj2} zm7-TAcy0JR$i`^j3gcdd!A`gsHcFl)m2|s$AU{l|jY2*19QdmUXD}^pFb(q;)(J*j zh*2ZN7y$+`?z|@xD0K`uH(BT?gH(gwu>}90RIvvkeK{IE+EfC=1tK?Fkgn!R77ddhkeve`iiT3f1bhi%IC3~6;%0O9 zbtPjcBid!7E*kBYYj6Rn*IT8azVhLeX;lfR)i=V)S~}datSSXHmUg9^8M16RxuQ~k zt-j$(A2VdJadSnLfEr7?(#Z=oR_b>w7Fs`qdq?Ql%7(F-lRLAKY@JyIjf|jst`}N& z0==?;X205I)P@J|k3_zyGv>h@o`vbt7uaIT z<093t*O@nt_Ry)<7|@}s9lgiD&T~ayOglM>AP0Fq=>CLJ!h4!?pF&y*q)~DutSypXpc7!T@N*k(Cw-%#jubnw=JI?kHLq01bDnv~YAs(ZWEp(?TIQ(qfCy)si&p zMf(8(Yds<8+{!Xalf86Q&Kyw>%iz@0PLj?MvI4NcY4fNb70AbQh&+T?OkuPO&Q`k8 z`ZZmeVM-%rtrXN|b#M@qjqxl)w}Wtw1gDZ6!@K)h{RF}=&(2x + + + + + a + b + c + d + e + f + g + + + + + a + b + c + d + e + f + g + + + + + + a + b + c + d + e + f + g + + + + + + + a + b + c + d + e + f + g + + + + + + + a + b + c + d + e + f + g + + + + + + + + a + b + c + d + e + f + g + + + + + + + + a + b + c + d + e + f + g + + + + diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/textDecorationOnSvg.svg b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/textDecorationOnSvg.svg new file mode 100644 index 0000000000..01a8285157 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/textDecorationOnSvg.svg @@ -0,0 +1,96 @@ + + + + + a + b + c + d + e + f + g + + + + + a + b + c + d + e + f + g + + + + + + a + b + c + d + e + f + g + + + + + + + a + b + c + d + e + f + g + + + + + + + + a + b + c + d + e + f + g + + + + + + + + + + a + b + c + d + e + f + g + + + + + + + + a + b + c + d + e + f + g + + + + diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/textDecorationOnSymbol.svg b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/textDecorationOnSymbol.svg new file mode 100644 index 0000000000..05c2851a87 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/textDecorationOnSymbol.svg @@ -0,0 +1,116 @@ + + + + + a + b + c + d + e + f + g + + + + + a + b + c + d + e + f + g + + + + + a + b + c + d + e + f + g + + + + + + a + b + c + d + e + f + g + + + + + + + + a + b + c + d + e + f + g + + + + + + + + a + b + c + d + e + f + g + + + + + + + + + a + b + c + d + e + f + g + + + + + + + + a + b + c + d + e + f + g + + + + + + + + + + + + + diff --git a/port-hash b/port-hash index 32e95eebbd..1ca8e59931 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -862fac8d90dda21c84542534c44a7cdfb97cf0e5 +586e3e3233aa474f31491f2b946d6cba8f24d2da From 5c972df6a5cb0d7083f71ae03ff8044bcfdca1a8 Mon Sep 17 00:00:00 2001 From: Angelina Pavlovets Date: Tue, 4 Feb 2025 17:03:59 +0000 Subject: [PATCH 09/10] SVG: don't draw rect with negative or zero height or width DEVSIX-8760 Autoported commit. Original commit hash: [457ddde85] --- .../itext/svg/renderers/FillTest.cs | 1 - .../itext/svg/renderers/StrokeTest.cs | 8 ++++++-- ...hSvgNodeRendererLowLevelIntegrationTest.cs | 8 ++++---- .../cmp_rectangleNoWidthNoHeight.pdf | Bin 1478 -> 1422 bytes .../impl/StrokeTest/cmp_height-width-zero.pdf | Bin 1733 -> 0 bytes .../StrokeTest/cmp_heightWidthNegative.pdf | Bin 0 -> 1540 bytes .../impl/StrokeTest/cmp_heightWidthZero.pdf | Bin 0 -> 1650 bytes .../impl/StrokeTest/heightWidthNegative.svg | 6 ++++++ .../impl/StrokeTest/heightWidthZero.svg | 8 ++++++++ .../impl/RectangleSvgNodeRenderer.cs | 3 +++ port-hash | 2 +- 11 files changed, 28 insertions(+), 8 deletions(-) delete mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/cmp_height-width-zero.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/cmp_heightWidthNegative.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/cmp_heightWidthZero.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/heightWidthNegative.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/heightWidthZero.svg diff --git a/itext.tests/itext.svg.tests/itext/svg/renderers/FillTest.cs b/itext.tests/itext.svg.tests/itext/svg/renderers/FillTest.cs index 7b731a8503..b1dcf65a05 100644 --- a/itext.tests/itext.svg.tests/itext/svg/renderers/FillTest.cs +++ b/itext.tests/itext.svg.tests/itext/svg/renderers/FillTest.cs @@ -121,7 +121,6 @@ public virtual void InvalidUrlFillTest() { [NUnit.Framework.Test] [LogMessage(SvgLogMessageConstant.UNMAPPED_TAG, Count = 4)] public virtual void TextFillFallbackTest() { - //TODO update cmp file after DEVSIX-2915 will be fixed ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "textFillFallbackTest"); } diff --git a/itext.tests/itext.svg.tests/itext/svg/renderers/StrokeTest.cs b/itext.tests/itext.svg.tests/itext/svg/renderers/StrokeTest.cs index 402ae7c667..4f04573031 100644 --- a/itext.tests/itext.svg.tests/itext/svg/renderers/StrokeTest.cs +++ b/itext.tests/itext.svg.tests/itext/svg/renderers/StrokeTest.cs @@ -102,8 +102,12 @@ public virtual void StrokeAttributesTest() { [NUnit.Framework.Test] public virtual void HeightWidthZeroTest() { - //TODO DEVSIX-8760 : change cmp after fix - ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "height-width-zero"); + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "heightWidthZero"); + } + + [NUnit.Framework.Test] + public virtual void HeightWidthNegativeTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "heightWidthNegative"); } [NUnit.Framework.Test] diff --git a/itext.tests/itext.svg.tests/itext/svg/renderers/impl/ClipPathSvgNodeRendererLowLevelIntegrationTest.cs b/itext.tests/itext.svg.tests/itext/svg/renderers/impl/ClipPathSvgNodeRendererLowLevelIntegrationTest.cs index 9a494f64a2..ce0dc3bc9b 100644 --- a/itext.tests/itext.svg.tests/itext/svg/renderers/impl/ClipPathSvgNodeRendererLowLevelIntegrationTest.cs +++ b/itext.tests/itext.svg.tests/itext/svg/renderers/impl/ClipPathSvgNodeRendererLowLevelIntegrationTest.cs @@ -78,7 +78,7 @@ public virtual void TestRectClipPathRenderer() { clipRenderer.AddChild(rectRenderer); clipRenderer.SetClippedRenderer(new RectangleSvgNodeRenderer()); clipRenderer.Draw(sdc); - NUnit.Framework.Assert.AreEqual("q\n% rect\n0 0 300 300 re\nW\nn\n0 0 0 rg\n% rect\n0 0 0 0 re\nf\nQ\n", iText.Commons.Utils.JavaUtil.GetStringForBytes + NUnit.Framework.Assert.AreEqual("q\n% rect\n0 0 300 300 re\nW\nn\n0 0 0 rg\n% rect\nf\nQ\n", iText.Commons.Utils.JavaUtil.GetStringForBytes (cv.GetContentStream().GetBytes())); } @@ -93,7 +93,7 @@ public virtual void TestRectClipPathEoRendererNoChange() { clipRenderer.AddChild(rectRenderer); clipRenderer.SetClippedRenderer(new RectangleSvgNodeRenderer()); clipRenderer.Draw(sdc); - NUnit.Framework.Assert.AreEqual("q\n% rect\n0 0 300 300 re\nW\nn\n0 0 0 rg\n% rect\n0 0 0 0 re\nf\nQ\n", iText.Commons.Utils.JavaUtil.GetStringForBytes + NUnit.Framework.Assert.AreEqual("q\n% rect\n0 0 300 300 re\nW\nn\n0 0 0 rg\n% rect\nf\nQ\n", iText.Commons.Utils.JavaUtil.GetStringForBytes (cv.GetContentStream().GetBytes())); } @@ -108,8 +108,8 @@ public virtual void TestRectEoClipPathRenderer() { clipRenderer.AddChild(rectRenderer); clipRenderer.SetClippedRenderer(new RectangleSvgNodeRenderer()); clipRenderer.Draw(sdc); - NUnit.Framework.Assert.AreEqual("q\n% rect\n0 0 300 300 re\nW*\nn\n0 0 0 rg\n% rect\n0 0 0 0 re\nf\nQ\n", - iText.Commons.Utils.JavaUtil.GetStringForBytes(cv.GetContentStream().GetBytes())); + NUnit.Framework.Assert.AreEqual("q\n% rect\n0 0 300 300 re\nW*\nn\n0 0 0 rg\n% rect\nf\nQ\n", iText.Commons.Utils.JavaUtil.GetStringForBytes + (cv.GetContentStream().GetBytes())); } [NUnit.Framework.Test] diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/RectangleSvgNodeRendererTest/cmp_rectangleNoWidthNoHeight.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/RectangleSvgNodeRendererTest/cmp_rectangleNoWidthNoHeight.pdf index dcfa75a0b13a8f9656be81af144300ae33a11679..1c25c2a814a9f0f52c73c206520d0d9eee6acd1a 100644 GIT binary patch delta 375 zcmc(ZJ4ysW5I`A6liqj}5!_^0KY`WNT~*y8Mytz$A|9cqtJ_dq)_5-^H6T zG<@v53^(n;w3>VKWMF1T)(@tetxMhv@9odFLXhme)EcOdgpR9qoNb7?0IBndW47Mv z=)h6$IU`DOfjOaKRSB9@Fw`8NAGIO`N>z%7ND(4rPDy)NztOsUAwnTfMya V&xPIbL5JtPr3o>ZuDiOsHorhwV_5(I delta 431 zcmc&u%Sr=55M+&BCMU0gxR($gp#7MhnKtSv8a#;j3A3{^9z2L4_xykevi~81|KQnA za#z7$kcMiysIID)@#pw`uR26v^r9?Bz*B(f!O6{IJCCcpKR+cPfj>caT`em6@mlRv zBLeK+HlDZrvD7F7da0pa=1xbuv*BhK5Nbr~_cEJe?#z?viGG&%X3}$MWd@P`F@WFy zhtbzM*;1O=Dg!l6kYcbFiKN&Ded8%3ah8~Yv!=pc1NsmXCWVqX5CB6{oY>M74brM} zE?UN*KpHdwC)Y;K;D}OdAthn$(*PtFYS(;m_Ma6t`wrZlZ!L_9HIvEZ?Unfk@`G$g diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/cmp_height-width-zero.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/cmp_height-width-zero.pdf deleted file mode 100644 index fc278cf97f1844876a69562cca19ae5f45707618..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1733 zcmc&!-EPw`6u$RU_@>$>)W&vfCq`4Htz~0kKc%ezY1@V4xTVt?4<{WPZ^R9+!Ub;t zFT!!i*0BmE(F-g^aZZlE^PTS;pVpwi*QT8WwZ8xO`V9$8u*)vc_I7k=i)r;9Q`YU4 zmA871KA>oCPI2F%*9h4nZ_Ka@NBHt+&lQy|suBmdVRU5kncj6brvyF|Q9tL=Kzs1P ztacgN(k;BPB?NwVl3iF+!7fCT;eQuaH1@Ok3d;EQ$^z8XcDsR6AVT3plSBAXHX&-y zp04zzn=YN>rE?FGtY)t0>&kBSpEJS)p^Q^b6TzO5c!Q9Qt?0<*e|H#omoJR+i1Lws$02?5Wx@MlH{X@`(_=gQxf7VmqvxWdP8 zww7FjR83+%w*c*E^lFxur$PDQd2}yDxjYioYmV%$XxCJj)9BCgCjq;bf3(P|AoiZ~ z^Ix%=Lf!XA5T4+6c!esPIcnkZdWyYs)f3GV!aT`Sh=)X>Bc7)8pyRN&=q)OM2NSCQ%_wBPUS_f;1a#H~N*Y4T%vPt(jkgo1R*K->Gz&{1Vu2_4&c-OTVpzDiw{e!P z*qDGGc;rVCxK)pB6molHyR<$`)Pp`g-DZl}j1r}&p$W0Ejbj-T zt~ib3IF&pjM(5NTDu~SNL?%{ICeu7Mxl*Z4m9Zo>(g>3qt8}hYCRoOD3V1QIhHK4Y zm6MD>YiDvoWUjf2jb<{NnPIt`t9=W!b z)3v^`(-l~(z&%W}p4qamYqQ;d$|;wW(~wCnIeS9I7NuJ|!LiN%3>Z3_FEZn{XA^T< ze}bNM29gfz(DwLbZ#aH_I)U@;y@TNq+!$A(!}A^Z$SI|5?-KT|-Cbqiz}dw$oV?mu z#p=0g66@IolE;Db7Tdn&4xil?tp+216uDRRhz-xol63VI2wYF$0I~NE9BHAO57bvyboKFYNq#wav$R>r8=Z z#sr(LSrADnBoy#d#u<|17nJw1P#`yJGA`o{8CBSlYdFeq9IVO07+Ymc7Rd*)+UePq zaeg2j_Tg-oNnM07*P$vB6VW(RMyeu@l0=1(mRXjhEY*gYA`>EFc%ga0<6MPQP?bud z5Wq5-D^`fG5Uk*#$P%TEha1k7qg#|yi tM!^W*751v%j%ObX#Q5@C%em9`W2gP=*dbM|UA-(m!*Y;T>)Gjmdq-_^Y;*?HnJe+iFyb(9N3KzTq zya>l7tfLi7;syyzQJgR5&);`^TEqUJ%{q#-zJB}sg-D=a(@V0u8yuN(TE7LxyWOgG zM$gGR5)9@H`j)&T#FTjhRjm4O3i7uRs| zYG+le=c+ka&n}QW7QC3{)tTphbP?QBQLS7&eT~chCV7p>f(O4BK>6TH0mh58_G}NV zoBv4GNOj*Lo_Pvw|MDV3HYY8pZl>U@tsiM1pXbp^!$>_W6}#f`q8_##I742O5=)_- zNW}ux@5Dk;q^XlomPFvD#5*t;9T3)$@E%X#upNoQkL80e>ErCNdrX9=#2UtByn#`L7huhfG8{f@n2514*RV)Fz-p&w zSH}7Aci4xs-6BqsQ0OE}cxX6hNfA>aQ>v1XXF8)S*MeszG?MB#WTJ?Rh-IPR31d+a z6((V+$a%<(P+Ie}$a9?*F^`NeN>j-ZOLUwVUPu)w#WER76&6Y + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/heightWidthZero.svg b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/heightWidthZero.svg new file mode 100644 index 0000000000..7f43ce0772 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/heightWidthZero.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/itext/itext.svg/itext/svg/renderers/impl/RectangleSvgNodeRenderer.cs b/itext/itext.svg/itext/svg/renderers/impl/RectangleSvgNodeRenderer.cs index b6fc371d8d..6b7a6abf54 100644 --- a/itext/itext.svg/itext/svg/renderers/impl/RectangleSvgNodeRenderer.cs +++ b/itext/itext.svg/itext/svg/renderers/impl/RectangleSvgNodeRenderer.cs @@ -58,6 +58,9 @@ protected internal override void DoDraw(SvgDrawContext context) { PdfCanvas cv = context.GetCurrentCanvas(); cv.WriteLiteral("% rect\n"); SetParameters(context); + if (width <= 0 || height <= 0) { + return; + } bool singleValuePresent = (rxPresent && !ryPresent) || (!rxPresent && ryPresent); AffineTransform transform = ApplyNonScalingStrokeTransform(context); if (!rxPresent && !ryPresent) { diff --git a/port-hash b/port-hash index 1ca8e59931..aab78bd50d 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -586e3e3233aa474f31491f2b946d6cba8f24d2da +457ddde85884c7b96413950d2b1a81f800a2926c From 83ec8b04ece58aaef57ab37465a4ca2d441db516 Mon Sep 17 00:00:00 2001 From: Angelina Pavlovets Date: Tue, 4 Feb 2025 17:06:54 +0000 Subject: [PATCH 10/10] Fix behavior for svg containing elements with zero or negative stroke-width DEVSIX-6270 Autoported commit. Original commit hash: [1ffa4d507] --- .../itext/svg/renderers/StrokeTest.cs | 10 ++++++++++ .../ColumnChartsTest/cmp_columnDualYChart.pdf | Bin 8366 -> 8288 bytes .../cmp_columnMaterialChart.pdf | Bin 8173 -> 8095 bytes .../ColumnChartsTest/cmp_columnTopXChart.pdf | Bin 5633 -> 5555 bytes .../GoogleChartsTest/cmp_barChart.pdf | Bin 8042 -> 7964 bytes .../LineChartsTest/cmp_lineClassicChart.pdf | Bin 21154 -> 21074 bytes .../LineChartsTest/cmp_lineMaterialChart.pdf | Bin 23491 -> 23411 bytes .../LineChartsTest/cmp_lineTopXChart.pdf | Bin 19676 -> 19596 bytes .../cmp_scatterDualYChart.pdf | Bin 24155 -> 24075 bytes .../cmp_scatterMaterialChart.pdf | Bin 20035 -> 19955 bytes .../cmp_scatterTopXChart.pdf | Bin 19967 -> 19887 bytes .../StrokeTest/cmp_negativeStrokeWidth.pdf | Bin 0 -> 2068 bytes .../impl/StrokeTest/cmp_zeroStrokeWidth.pdf | Bin 0 -> 1972 bytes .../impl/StrokeTest/negativeStrokeWidth.svg | 8 ++++++++ .../impl/StrokeTest/zeroStrokeWidth.svg | 8 ++++++++ .../renderers/impl/AbstractSvgNodeRenderer.cs | 15 ++++++++++----- port-hash | 2 +- 17 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/cmp_negativeStrokeWidth.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/cmp_zeroStrokeWidth.pdf create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/negativeStrokeWidth.svg create mode 100644 itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/zeroStrokeWidth.svg diff --git a/itext.tests/itext.svg.tests/itext/svg/renderers/StrokeTest.cs b/itext.tests/itext.svg.tests/itext/svg/renderers/StrokeTest.cs index 4f04573031..e902f4c3b4 100644 --- a/itext.tests/itext.svg.tests/itext/svg/renderers/StrokeTest.cs +++ b/itext.tests/itext.svg.tests/itext/svg/renderers/StrokeTest.cs @@ -100,6 +100,16 @@ public virtual void StrokeAttributesTest() { ConvertAndCompare(SOURCE_FOLDER, DESTINATION_FOLDER, "stroke-attributes"); } + [NUnit.Framework.Test] + public virtual void ZeroStrokeWidthTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "zeroStrokeWidth"); + } + + [NUnit.Framework.Test] + public virtual void NegativeStrokeWidthTest() { + ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "negativeStrokeWidth"); + } + [NUnit.Framework.Test] public virtual void HeightWidthZeroTest() { ConvertAndCompareSinglePage(SOURCE_FOLDER, DESTINATION_FOLDER, "heightWidthZero"); diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/googlecharts/ColumnChartsTest/cmp_columnDualYChart.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/googlecharts/ColumnChartsTest/cmp_columnDualYChart.pdf index 0ba09a8af881e9e84fe3a78a88de7af441bf1529..11f10300b1080799b4782fad67d5f1443863b633 100644 GIT binary patch delta 413 zcmc(ZJ4ysW6h$dp7`k%}4D3P}M#sQc|0)qbFe(P>0*vbODiVZd5MhE@gVa7m=+rg1 z2F+cB6}bh28(cUC&fCS;`Fl_193)ec34RD-1~5A~x_wFuzr_8;F$b>T4=6X}nyB%W zJd+IurET_#Zo<}-4j7jmP@vix9f&>%qz-k}-h=>1^~l3MPGY%7aTuZ7}75_5{j`&Rfp9>Gbmcs`~|M Cb#gEO delta 457 zcmc&wOG*Pl5M?sLkOmiS6aF#l-kOW=0$QeTKJVX$( zb>mGufE#aM>%uEo@SrH(kNP-UoxgUoAp&8E66p|V05CWh-8}fQornGLu>hgqj}Wi3 zNha6J>@jN*#&+H-Mw6M~2yu`%@ugrr{>0J=`Q425`82pW0}fmp#VKJL*hPe5Z~dNs z=9yTpis$WCQg3y5hEa6hc8n-F{0zV6>~{fU6veO3?gC{~`+&9fN|DzFNgGR+bnr-t zhOQ|aCxxiW%6r?0MwMP9jj>u;stkqTgTSDrK#>HI`c5nay diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/googlecharts/ColumnChartsTest/cmp_columnMaterialChart.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/googlecharts/ColumnChartsTest/cmp_columnMaterialChart.pdf index fa135bd0f41cb3d6127ef6df020563cb8257abd1..5ef0d77b0ab2835e7f344802eca9385dc152d27c 100644 GIT binary patch delta 416 zcmc)EJxT*X7{+lXtHmzZi58-}h#?va-*>)tM#MBxu@KKN?|fJaF^C|TBS@Ie#sk<0 z+X;3a#0z)_xAF>B4?O&e|Ig%g@?Nts2Z>6e;D;ba0HcGWtJ^Sj^SD1f=D-#Ffqcm> znCh17o(-_gWwD!eL7T&77X7?}1{w{}h*tGSmAbFud36Pwo4fqIvDZD8YwP91ET$eJ z=o|7&T{FlZ^|<7w K8V=8{&#Pa8k8u6~ delta 464 zcmc(bO-chn5QUkHA{lTe*+`s54ACg0s(Y$`L<~qY2#Vs?)lC1m5k(VpnInkI0o-^1 zVb+2d@(y-fcm=CA#jD51(JDy4H%A%Pvc>e&~L71Tk0)yJOk!0g5Elu(3WTCA|}t8*mXROa(?d z@FH+udMm9Z3aG2f6$+3>*@pJ-(rBsV2-E;zusc4zsi$EchtmTDH1HebS#eUB z@1{5Eeja1FNG<`K|TUmg3?zZ+3Q;pY8XJ&V3Wps*{jk zw_X-j3HX_~7UjGNmshbVCzJ7PD$Xa4v_}_`lC=-0Af%uwM~0agG?;`c7!HBRArc3` z6r-~`Xs0TY=rt-&7MY?kY<*z%9*8Oz!7|q=xRi26XSbbYq;;;^W!`XKM1eipAu=zBN%`! zy@HLYyn@Ap$Kw^>d*9>h_$I1z1zHYTD!Kri1I(A#PcL!hH)*lDQJ@C+E9@SskE+(z z43KnIhs<)8L+YYmtL zI!+`51dn<^B5RqYVe%#h=ba4*7+vs#BA+ZmGQmX^5>LRvl4m8Mq|r%q-cST@$+6<% vS?OdjB`qaOXC|K%vYaAYhB9eO=g#eCqk54NGuz4)b#z`^L_IRy3%YX delta 453 zcmc(by-Gtt5QVv3C1wjPECk8V5(qI`WM=I-fC$5C?gP-!l3pV6GYIeV%}67 zlv0j4i73D@ElaRL8s-#m>$NGZMi*RRtqEe~18xdm+RCd?Najj4`7-(bMBe%eD}=bgAd`` zJ-9XjZB8Xqk_k3P#WbbU?S-}HvU8mm@|kmsoN`6~Ex=V+1?8{8HVkO(%ZI)Ps#0lE znr9?jW?Oq6eW%6~i;70^cjuq41xUE|&&b`pgx)KH2o^M{kvY`^jnr zKzM$<1R%YwRRB$mAZ-o#Cr=Cko{hRd?;4AgSe>8Fo@ZAxDKe}Om z^JJ*}>?HAbMnm@2DDg0M3<5oAGyp3Nf`85r`$xt@)!aD2r_T=ir%r{7)l-6VeK%qZY*lT}Y!0h_jnUz-ZS@)W@@&9HxdIv}2yPW)># z;m++Dvb)y?e4|bLC$ph!Z4-ADp_`CB#=%@L8hvq`qOnIT|EtLZ} zLlb+*Npmiyy)OF@4`@8~+<+nV^G0Qj*<{B3&}@GDDv7zN;W zj`+a`gW0c(RX?^AGDnvZ9B&-K#pS<%;obTA?&b=hTOmFS0&w#z@!JnwID$7;EB@w% zsY6&pKAX|FQw&w0%nzwQBG5=uGf~ij#m_qb0)kt_fQSRP9TWz>fF1c zVydw*)l$6PC&YGE$5d-$s$&QnwH*=LIUQ4-i>QvWi0Y_}TpiU>4@cd8kLG`d?HG@n zFo_p8YRe|ZG8bbxkJKGk_?M>suVF*Dtve|5Mn#UVyY4` zRcXAsS!>(aPP3S*C9;cSJDhh-kuy=4PDjz6$qOO!aOx-_X-McyQ`XhFa4Zwr8bNzK zAv3MImg?}^R9ZQ%yFF%|EVyM^-gCxe1!qMeR4#3nxh~H-UD}ma^1LW))>BgRoZ3## hck-2`|5ITwIOMp#H4(n=OIx#Lt#!H8dTir-`ES_4e%Js2 delta 1696 zcmc(f&u>&!6vuOh&P+RibIa7}4@&zA^cSV{{{De8ElPnB1*D0_jnVfyGbV=Egc{L> znVpFXjd}tuHK zL%8`7d^!%Zj0$F%WNeO#X-cPO7cQ)~meUv8Gs`DA<%<5Z09RlIq<!@686_;3DzC0pN)x;-?ow zaOM>8fu6fQd+Mpa!s&6~cA>*3HuP@Y^R!1|2@wg^pRim;0Vy)@IjoZbuELOELR<#<_Tp@Pnc&zGVtm+Kj zx>)PF$ep7+Qgt-{J9c_?)I_R|(a5V~JZ3QUH>3NX18~g75KdzV7cqpZ7{YD55y5sa zx?xYu2@yktjv>Ov5XoYQlsh0>45?#=bln)DSPW6&0o&bvWnzeOF+}s2q4Os&9~1xH zf2U0hF%<7Sez410OlBtsfyCZjat z)KaQa>MYIN8Z~X!p+<6RxUgxKwo+=>TA7eWcZ{_e(`#<6MXi!T7$#ENvZB)!i;e%& bLQn7@@ZRNd5IDAatYWyXOirG;bhh#r18R-W diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/googlecharts/LineChartsTest/cmp_lineMaterialChart.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/googlecharts/LineChartsTest/cmp_lineMaterialChart.pdf index a48e84526d36f386273e02577c3d19659dbb2d84..11dd42a5e48b975a8dfefbdff0b93fe8f89eef4f 100644 GIT binary patch delta 1596 zcmb`HPiP!f9LIS{H`{D&XTqkNhNRg^YnrT^bl?AZFWHSv8{3N5LMSmIr^#eS1!*;{ zcq*YsK@|Pn>Y;}~)k`e=p!Hy_B8c=R1rHvCB6!eC#Xks2mv;SAPzCT#ss1UeT3GjB`UIH6^A%1n>5dwD)g!oIpE57XyA!rt{f1p5!!Rp`u zfuX?=pE~HePaO>Lxgl39427_d7V))e7lD_n0bHIb;=56i5P>&_%LLvZ4)NZhy~NGx z{^3&{M6cJ55EwfWz(%D6$47sL+Gqf``?~S$*e(KktOr+W4t%Z_;+4nTIQCYv53kod z3A|npU}A7Lemw57-Ww0`%ZWV%KAQ;fhof5on~gyN4;yWXZWOFQV1R{iXSfT`@FD@j zL(GJm+Bwk!4-OacRe7|7Q20Rq4!3k$s0erCp9sf0rkB7+Cd6;7n~B8lC*AvZlOYC8 z2i=@%dvwEiYZH1~Ax=#@czrs=xyQRmhp@2OsKATI9>U_W058ut+4D1PjpF*%WOg6;q%%4eel~{fDh(II-xPY+wG8<|FC9^j%fRd&PS!Kf>Xc3*Sy_pQ^1- zjo}kVh^22AYo8ihpK73IvD`B4i)P2Vo7krs>r*Wxi{&+|d^;QegL-K-dH#iLwbX1j zo}7)AnwF;S0$i4Pww$EPnau^yGn=tgF{|9ZL(Ot-Ws+yf%1W+OCeqyHY3at~NjCj|Dk$gh-xc7( VQq}$SZ!FcjsVI$%JaP79=?}>{jDr9G delta 1699 zcmcJPPiz%M9LF=Sy!YCLvfDh~pK75~2)zEGy!pF3)4#NR0>+@w#0cr3+4tVAF(E32 zgkH29O!QKW`JpHAf{A*w8KW^Vn#P!T^}r4BuAER3Oc0zUHL0D87k4keot^!BKePMW z`Ta}u{a5JoK{P@Mr-}+n#t5$yQXgrYey!7tFDJvz2}YPC|4e{W=oAv>J#+=-m^5D3 z9W*5b77-?Rv2pT}#6oSAAr^Y8jIbnIrNWYKl^RP1wS2md;_O^J=@ERzvk;13z65XN zt7zW5pI^!EV%hav`Jfr!ea?e7D?VH={|f6>|K@rH!DqF=+^FtB@I!xKzOL;-D1tMi z6?3~kkKnJTeYiW>Z5}*jFZ%Zfrgy;3ln46E$o^i0C=AV3%;^IK1g~S?vI?jf!WlS`SWA|%cDj3W#SPE&7H}82zq8RlWy>)9|N8ZO#h6X7ab3b6+!Ua zTwqQdFJv$3A}&K~?lG(`1aM=hcyo0g!Mn}Cyt81n1e_IB^GUO|H@7fnHWyh}&VJjC zv$dYpl_a&_RdRUv;x~zAwhyuczlyyl1tVHWcPz3^vU8rcP4@3GN*H&?;HQ^L(%r=1??<<6j^QE;=yLJ(CsZq8y>>xyuOI5^mRm{y$ z@=3n;)@oW<>O~ta! z+DS`OA(`w*l7_0oxZRMYpiFc+p=`CJSoQw+{bB0S1=_?XESu QG}aSx@9^PgUO3_X4fB_r*8l(j diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/googlecharts/LineChartsTest/cmp_lineTopXChart.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/googlecharts/LineChartsTest/cmp_lineTopXChart.pdf index 8a15c8a25577f70c159d9f952b0bf42c34f7b3db..123c074c31d040c21d27e57a10b07ed0b1285d0f 100644 GIT binary patch delta 1719 zcmc)K%WGXl90zbFH}@vFX+4uZuFXSoVsrDjsqH+@yh2)1hz-S*s4GEfIQQIhL=*$o zN_BI$E{bS>8@m!+xoA=NfeS6T@j<)l%DT{Qg)RyOl@eQV&TWvS^9OWR!*3p+@5~v_ zZI9jOpl8=55cs)4;ietLf1d6mgyX-5#tA$;L~(x14~~vepi6^zX524P;}kb0 ze06;y!VjKV?jst%n|zAEx04a9(;D24x8Qml;U80e(yghHUYy~>RRVuLOEI3V6QI)+ z7n?N#t!9MlGkbmh8H#Vs`US7emO*Ox(VWkJVJ^bY=Y3?2S6ib5uC&S^1MvI81Ndoy z!p6iP-aFz?{p%5m{YPaV{PkP}r`Q%4=ELwUSmqJFA_fSY78Ez7CpTp8PT*qlH=Iu> zUQ#u`e|aVFm3|1HYKqs4x33tAH?2?oy``{cbO`Rc2k?udxV7kaxwA--F4f4TrCtg+ zdi*{#jz_3Y{8)t>D-jN@G%G_F-pPwPi0p3&U}3l$>5gotDzB4vn36&^&|ord=r^O;$QBr-%29U_Sh5yf{R zj|?S4Lv?kCC>J7{hlox>MC%aIE;NjIWOR3acawyOF(G1Hh*%LKw)}IHZO7ZPW|vXk zKR1qrh!Y{=RERhmAeOORNNHFm1H&@)Vt`m?1H^J3B3yTydvUnYFDCI zRJK>89^{K)J?NoIy$Hgf1?|C`;KhR%OG^(P3LcCoqNUi>d1;VM=MV7h<@>%nZ$97e zci+yHtLV;E^hFKLF)Em0l9~n;bxP~A$JVye)#R<#%<2NCT+#m)z$w&3(!GZ+pn_)9 zRSI{}l9WVhLdlt9&GU*#vlqrh+PzQ{MfXBO6x$0eQ5=SgSwAEB=S;Ig$;FD_gpt?I z!=>U7I_};tZWp_Gem^lj;XXU~dI4%U0unufMm2(Y{1BG=uv@HlAy_|z-CEy4gf#p% zIq0?y`P`L(2)5J#_jZ2)!KZ^5=BG>U+JOJ&+o7uaa33N(Y5O}1Yb?$_4L3^ z@&H+PW8xVEzfM+Rt*_*MdA5k4JcZrPWCg+abY4>#YEzG3p^n}Bw6Efo8SGxH`{2#l zyquCdJJXHeojL3-&-!ORX<+x^oDXgs$%`q$H;sRgh54}|_rnq2T0h0^=cA$v##sc< z(FaiHc{OEF>5JzrHl{}?)hXe1%58)%@HQkMT zA0L~31m7)G^Qpl1b_eb*V)xTR4}w3Ju-jhD$CQ@=z03Fg{>7Cai}3aFr`^31(*>je zt&Tu%v+UOlG;g*URfOgjIY%nH0n<$QSL4Z?io=}YL5@@ZvOV!E7c$JnyGDB-%uR?0 z79v7~h=@Z(*su}FIt}kr%CwXrBI6K|HbfK;5hXj3$A;3Oq1rY?Vjd!K{%_5%j-M&k zA);xBXdW6`JvQ2%8)_3GhK7g{A!1aB7!x*P**+tmKhsu(h>b(UngB7B1&E87R|oD08aD>ME; z_xCzBG0P;)jA~h`jAq=gmW-!Dt0avxr82(BOq$3v-ppEpCuu6OmenG&EQy7$U9@N- v61yQXnIyt;Zbg;}Cfjsn>HjRD+t)zBoUZwEXZ`eCg-cVJntI{ola+q~q)n?d diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/googlecharts/ScatterChartsTest/cmp_scatterDualYChart.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/googlecharts/ScatterChartsTest/cmp_scatterDualYChart.pdf index dfd711f8c11c71147320c37aecc99fbd40b6a8f2..e80ed06eba599eb15ff70e1f51f1551b73d6fde0 100644 GIT binary patch delta 1989 zcmc(gU1%It7>1d|ZrZgnXS?}p%+KU!lWdYE=bV`{GbevdlWh`3E3IH@leX;6?9g6R zp;i=cR?&hW71H-gD2Nn=URhZRf-MSO*b5PZ;s!N~WhYXwSWCSSD(Gxlr1k8*bF;%Y zJKy`A=Q(Hh$1B>~SF}rA+7PD}6Bgrqn3@BW4y4DPe!Znd<{H;wH4@OK3XCR# z-sXxX!OSLfw3N}%Lhxv7h`Z6}->oIwY9;t(X9?f$Bp^-<-?o);wM|F8dkuQ39hV+Y z;BtG2584SXc7%AhgW%`!7%p^{aki6SrK^J1x)L~Jgm}py_-HDILU$P_x(QD9lyIa+ z$Fsc~$n+8{_Jwf!2qse@MpDs){UMBgg1&(ejROSxGBI=xma%n^V0*fPyMu{yLm_@o z>$o$tfpCbRb1{bBhF7sRtmEsEHGDRr9nZ}Y9G(mD^v~-^FKnP~ffPFzKi!7m z1Bv2|{YzVL?BG_7;`qU<1h3ioVOZCO9`@SB~#Vl19 z6JQYyf&GV)X`w1%wyK2Lcs+W@#{1Dbb`9!I4eHJ&b!U^hTZ6h=gSuOTx?81QkTs~w z8q{SC>QX8$qhE7n<8i7w;PjpYe7XEsfvG2lGt~rVstL|i6P&9DhjaDdaDLAcZY?(# zysYCxjHBrI|Bx-1E3iUC$33U(z7!n}P?fonvNJnm)_( z=&>)e(I1*H?VRf}Kd_?*S>JYptmBIy&$HADxFfRC%jG?rc_PSh(=UkW$^UbNN1_=7 X8jf~F$9drB@HXniQ>ner%*X!$#!nYX delta 2003 zcmc&!O>7%Q7}dIoLwu+wahtYDnrzZKiIX&$ncbb8P2-X@KUP7AwuhGVM_{kl90~-b zmBOJS>WKpfC{N-55{L^&pfaK$wVV)06+eOlj!JEWvWdh`rM8xe1QKB!Do8uNV;^Sp zY36t!D<^pq-_PuJ6h0XMe%1_1z+tX_<2W&4|fricb4#GJHcnWN_eFs zj+>$hm)a|agI7DMSlms3&Jbt12wvJ9;>m7;PsgIT&{Z)!Jk@;%vpp^F%@F&036A%K z2FG~s8rt>}@I4`7NrJw;A^uY9;mIh>WJQr&Pgb$kuXy!`xIRE|SFK;C2+Wx#+#a|Q zu_(StRq@df!FPi-$jd`(O7UC6YdA9!2lg#1de4lk!J~0xN0-sZ2oBLQ+BrdddlS;E zjI9>IAYX~t6mhGHyEZ|q9pV>|CteG_mm%I8 zBe>>;hQ#}0RlGhD!7@iK%Fk92Sg5T9zPBo!@wu0X>1P^7D=;F=HwdRJY zNs|_@9w{_NRAMe2Zf|~JAtfefpacX8GW#3 zJ9^Evw3?*<^jO;5SaQ9Ibo3@t>PByohl8C=sPG<9cPvX&q}u2>7A~keHr|;_ zq-|SQV!Jwy?ddoUZYu=G(Umw-M-@y*6_`|>iThpO@JG~f-L2!gyWzT9$8}l9by>%C zx#7C3xxVDpaowxqx~IOGn{rZP%qi70bM>9q&*>B4RBlZ6kfkBc*W zdoq#cTnh~6`nWjP$Hgu5oJvG23vZn2SjtJCF`r2)rEfXhb)AA82oTbx4&BBc(lQWOc#{LF9KNT?m diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/googlecharts/ScatterChartsTest/cmp_scatterMaterialChart.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/googlecharts/ScatterChartsTest/cmp_scatterMaterialChart.pdf index 5845d77f46785252c95857caf157cf60ba56f9b3..aa8e2802f92e9e8ea6373b2329c3e95e2fbc5ce1 100644 GIT binary patch delta 1820 zcmbu9UuYaf9LL$DxjPQ)ZhC+6r#9KdUXshzWd7{V&csAaliH?DtMyHS;NI;W7K&n9 z`Wh9VL@Mp~K|w)8-$X5(ASmL$Hx*5!)D~_pDt90#22&qIg}9fiQki?}J`MBR`ONn> zpV|HVRpZ7h#^qsSk`afx4rR1J_&6cs`RU_N28;f=^2Fi{Bg`fLy?`a-u;ErO8t08} zNAha2d#NiYY**OCet7!uSRrpjY>5eJJn^->eGo|b{P!o zeHlEvdkv>|n|Nn1j>qr3W;mEPw{X8{VJ#oSk`)>PBhD7adM&&-6$jZz)u+yKWCe$Wi5Q)_Z`;yOk9{s;OqVn@AsSdCLhPA z19iMLVBy`t4ZJqks>ku>-a0PqZR20QE9{~QMmmER_O0XmzV@=SLv=hlWa6>mAEO@T z%`6_VLmafTSRT0oF_MKCt-~H|br474?sf+m4DGKYvERh>XacERh`*!pcCLZVoV7Fe z*H~x}Tpz!IYvUGb6AgSd(b}g8m;_WsF2=EV=+8MuV96?+gM?B9AYLm`eHc2zlGv0NE5cxj#zL* zq}{fLA+e5xXw~EB@#@$VZ5e-hp&=tZS^O$%xGF7}={SB+b$qG*jTGYJ8MFG?y&G|S zxX@d@ys)qf=8;6yYX6as9umwZt;c@CPVNk-P%^ql|DW>+b@e%i>vOnxEOnA7rBx`? zsnpe}RO(a)<7jG*ah=M9PGw4`a-56^+@)GB?&(yA=u`)h zPfsU^P8D3I3d|o%&4~_vybgZ64t~5HKVAnvvV$Ml!H?|VC%WTDQ+d_FkLut@fi9=! z2-A9&ME4_!?nhEQvz%I`Tsuigbw85oek9ZVNakqPqeId6;B8y0w|+E|>$)U&Z@C2L z&iJQJm(L_;XQ!7I?Uh;XITgQ1D`h7LSjFX>v$7&3;T4rvDg{Aw&Wa1kNKo>m;8BgJ zXh~2G1f`s^@~ST>Df?b2V9KF>P!bj2SF-F2RV+FV3H*{@qKdmrMu~l15~Xrc79H;T l!t=}CeYY9mV3grDBVhCRaP%KCPfRAc^pd&Up$8vG{sR;`>H7cx delta 1892 zcmb`HUuYav6vmltlHD$}GwEbEZJKtcrfITio4t4Ly>suxq>wf>ZbB>--^4$g-Psa} ze@LqqMBoo45?@ z<;^TR3Fd+LZ?2QTy{k#Oq?O7MfbhMO4&ce+;bMb^fNTndd$Lkl?gD!Yoe z_u9DDy^J^ZwGbcgZQ#`&2UqePSlSn3e!q>kdVa*yy*6Ii|1%yt(8RA`2kdof9e0BL$}u($e`w;(KZFIBN!=bN> z*XJW_S>yj^Yq%>M5U&F%5#yVnm33d-vZTJ7!AcP0Gv(mf;Ut!210ROX)>8Od)p2>G zHLUAlY*C$^)#cO^!UxG^Y9BnfoNPNa?vdK-ryglb=nc7gvS;VTg{Yb)UO-WwytWwX z6>I*y=e+d#flA_2Gsg9%ZO@Z>C%45Y5oU}rGZwTo7B>r1Ws3OJ6!Ez!;!9J65wj8I zZ{ZHt~U5anE z>%u~5Za!K_kB%0K6W-&a6;c=BmpZERb@%PYGC>$>}fK^_ihG=Q7>jfBMWr>3;xr2lqGt diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/googlecharts/ScatterChartsTest/cmp_scatterTopXChart.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/googlecharts/ScatterChartsTest/cmp_scatterTopXChart.pdf index 80c3d8af710607b8e4f1f04cf113867d84d78fd2..bdbebcaa6efb9e5a977e7790887273713d3aa334 100644 GIT binary patch delta 1787 zcmc(eOKclO9LBXKwOxyJZH(=-q4lQ5&BLXhncdl$$)g-nnuIn&N+o(ibl3JuJd}us zXoS>8mEeK|h<+zj^@?~LK(fRMRpm;N+DJXLYIiTh1#U%!V-)(9; z@3*^s$@u<~@k7;^WW=G|p^P<%Jx<8@WOI3~eaw5mGjVL15yr{m2e4=?8oc|3an?vt z-pxI=l&ZTHcP(PAG#B0z78j3}(&F;bQdwN#qg?^Eca@ExTTXwFGHCbH?EN8w;rwt9 z=Y~y0Q)#U4*)*Js<7J#N?_$Z!VqPtSU-m|ZiyKoV zT-mpYulFT)v-oN>#OI?X&e06Md@f8;h4uXpaCU$HPZthEcNCc>Z7Nl)4C-!pGyaBaTOeS3a>X!rWN zoghanm*D2YPaUZoizGj5)ynNGsH>>b_ni3Mdh$8JpWG9K*!mv46GemI!cuXLNR1;X z)j8DBITV{QfhsMXU`(enu2UJtUM|krlxi7mTc_HtPPOq)OmLW<&fz-M5jvIQ=a|54 zJso#-DpxwyMd3to&ee?wcYqNwz=+r}B6f_30Y>BiBXWQdnHbrS1B|EvM$`Z!N@_Dp zqWh6V_ajN)4^E#P-XKcrQ&QbhJeby}q`D=^h~{20-I-*4XXbxDAjuRyJ2|?+d`?*) zsq#Hrc1Xu39hbP$mxM_!xR7>-2C_|km$m}s`ogD-w*nDxmnlj~(Dpb9xUgMYw3#QE z-*SSM3^;8E(kEU!F5d3gs@1Z+cDqBR^n4!Bz#)O>xz2`nboT#@FcfF-@ZEAX{`9Xc PH+EB%tJhz8<#_I2ppDzD delta 1815 zcmc(f+iM*~9LL#XE++?*-FR}&X%d@knw%zSYBHCdotd<$HjO4t45bx8C_bEPMZA@Y z6%?W%;+vE&f>7wQ2;Mjp5qI`F`hj z*$*x|e_eJy9CXGh;ZzF2*#zOEgp7_)Ek9eGD?MKuo112Y3G&YdEI12J(75DWbW&V4 zGIyO!QNer>`oupoHGd)Wh1^|AU#Q)s@`c`AYCj}+v9;bq{p39}pCSImj5$gDa~BY` z7M$6}?ba7k4r@G>{-wp?c)W89W3G$SU0WL0U*@-PWuJ>{g*8W*b9r3d z7vc53Cik7*7*F@Rc&l%1hnmN0{ShAB@8SHt8(0|dP~E?UnZaat2TB9$JLDW58H`aJ z%46P-(R-kPqeBrohZEmzm^u(UA&#>ghKFO^9&z!LYDZxt#*al810s#PixHxOF8(NP zVs+HpiT!pk!WUy6ZjNr^lW`YuE{*lE2=5(Aw9{A}kDLJSANn3|9M0q2i5M^6*Sy1( z!!e$l^zgG$iKo|7JW08gdHaIGFw5i3fxHj$KJH3TZk0g+^QIDGWY1}yS zWIH-$yBbR;=2}vw8&1#m;m!H9L-F?fXDgbSu1OyM89%eLprIDrjwyO)OcG++?7wFv z;ie()jD^CE=^c%gy~2_*TZ9I-2$i-7Ben?R)Se3T;zE+%SYt*hveeO_ju^N(?P# zXJlx*liH>#YEw;zFJ{faUNRZf#O7#jb2L6*%&ur<`BB8Kfg*Md6pgyp&rfv$(TRFl=RD4DNPtx~P2G9_hJE{nS4vRtbMAqzxBP+l)H z!>OsjSS3NVszn&orK*=}oF;pPnel+Eh+{|pPYW%^gTUG4LG$BzX?dbU>P)ft;Hif) Fe*@9s<46Di diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/cmp_negativeStrokeWidth.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/cmp_negativeStrokeWidth.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3558a5be26ac26082b4e20523186b36f496268e1 GIT binary patch literal 2068 zcmc&#-EP}96u#$E@WyC@!4gT45;X({5_`#twTy2wM}Q5uEpNmB7SYkTAkUu8v@Hr5KM_6 zxA9y#0Abc+7N)gZr%el8-KBni0#AJH>h)7I*Y_I(ww7ix@j>}eC>$BG z@Eh&mqeo6vr&e}(04E3V6w>T!+sssFj%Hso!USQ2Q^6&pUyO*S7q3z}(q# ztBpIVugzWe5l^i%IFD#V##e7n=U3leUgNh%rx){A_=9mRIDC7Ie`AD@v3H42H}1YQ z_`=!k2EX~?_z4@>NqyHgq2v%>t_br^0W7 zi6CecEQeKa9^m^xG%7wnojorJ`A?bQ(wiH&5rju18@Lg4NGu3DZoQN8n z9mpr~^zy!Qrh>MY2ri-F0lq~daD{g|M&V=e4{r84p1`;ANXLYHq9YkxQIBwh!gzS3 z;}WipN4iuz&~;ALE93ltdO5>4Cwajr*OU-#B&(!Jl`ab*6Go|PgsTvuFGj1!h8oU@dARbEw;m86iG0U3o( zxtjd{5!}Wvo62H8#}@Gd?pe6Iym(drYOsV!FzV;f*pH#{-^UPYJLS5*_%P%WG#Y(# Hd5-=9%nShe literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/cmp_zeroStrokeWidth.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/cmp_zeroStrokeWidth.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a8c5d231b2c6966b2b0c4a162b882a24cdabbcde GIT binary patch literal 1972 zcmc&#&2Hm15We#%cri9XVQEN_qErM1vUamwba&%AL0cf3gCtX~7Pjc6ZPyJ zL*Jl%kq$-LP7}1*qK68wH6-Wf`({SN(R_9>W|1PJ-~agaHzFxeQ+^<4XYm`|uKFJ- zRPi9|o;1W0pCPmKEFCcjV@ZvOnYnK14Ft=v8 ztF%37uJv923!NIPX&$i%##iso=T~1}Ueos{=db2(=qGJE4EX+({>%Yj>_XD>t-bFw zePzvVOW%EWdc^8-6^KpE4wJ{?Z<=Ly<8r^ajSs2ljwUXB!Q|!B}mn$-@He^J*Pb+GT>7QvJ7w1`|X_h~Pie2$MsE2Jw zttQ`-7NJ0ts!U+@qf98kG(|bEJf(JpkS+EfQIVv>4`0$5*4X&Z80z)9*>;*_9F18n z>Bftk$w*-{5C1%Ir$SOMRD_F&=V9d{25l!gAJqVbDX%sBGwBY|g%>K~J^Pgp?$r-K zs?ULc;GMvKVlFag9=J;o5vagjvH;u*d+vVaj)L}}HF)vtu|`pzP@gHWXYYkQd%qeO z2X!w8H=j|y1ON12^WU2F{kmzjZ<_&N;ID?o+BZTr)P6l^J(TxK4&>9}dS`V_fMx`T zM0hZtGLf{V`#sLEncYL%!=6a6`5*0ZnLXJ9g(KvV9xxo=kM=}{pZ24@R6f}2ZPBc? zbr;C%8NE5<8bIbuGM3~*l~U=tR(Yv~mJEkoo~xvi1ut02>#EKK6!}tBEYnp2SqYV_ zfoH5pDuv%D)45Jc26?JgA|XT6yhNuQDKVBQT~(Svs(2|dpeQihCso07vxX6SLuQP literal 0 HcmV?d00001 diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/negativeStrokeWidth.svg b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/negativeStrokeWidth.svg new file mode 100644 index 0000000000..ad56d8a2a5 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/negativeStrokeWidth.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/zeroStrokeWidth.svg b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/zeroStrokeWidth.svg new file mode 100644 index 0000000000..635a8d790a --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/StrokeTest/zeroStrokeWidth.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/itext/itext.svg/itext/svg/renderers/impl/AbstractSvgNodeRenderer.cs b/itext/itext.svg/itext/svg/renderers/impl/AbstractSvgNodeRenderer.cs index 90f6741b36..e010fa9624 100644 --- a/itext/itext.svg/itext/svg/renderers/impl/AbstractSvgNodeRenderer.cs +++ b/itext/itext.svg/itext/svg/renderers/impl/AbstractSvgNodeRenderer.cs @@ -735,11 +735,14 @@ private AbstractSvgNodeRenderer.StrokeProperties CalculateStrokeProperties(SvgDr String strokeRawValue = GetAttributeOrDefault(SvgConstants.Attributes.STROKE, SvgConstants.Values.NONE); if (!SvgConstants.Values.NONE.EqualsIgnoreCase(strokeRawValue)) { String strokeWidthRawValue = GetAttribute(SvgConstants.Attributes.STROKE_WIDTH); - // 1 px = 0,75 pt - float strokeWidth = 0.75f; + float strokeWidth = -1; if (strokeWidthRawValue != null) { strokeWidth = ParseHorizontalLength(strokeWidthRawValue, context); } + if (strokeWidth < 0) { + // Default: 1 px = 0,75 pt + strokeWidth = 0.75f; + } float generalOpacity = GetOpacity(); float strokeOpacity = GetOpacityByAttributeName(SvgConstants.Attributes.STROKE_OPACITY, generalOpacity); Color strokeColor = null; @@ -753,9 +756,11 @@ private AbstractSvgNodeRenderer.StrokeProperties CalculateStrokeProperties(SvgDr String strokeDashOffsetRawValue = GetAttribute(SvgConstants.Attributes.STROKE_DASHOFFSET); SvgStrokeParameterConverter.PdfLineDashParameters lineDashParameters = SvgStrokeParameterConverter.ConvertStrokeDashParameters (strokeDashArrayRawValue, strokeDashOffsetRawValue, GetCurrentFontSize(context), context); - doStroke = true; - return new AbstractSvgNodeRenderer.StrokeProperties(strokeColor, strokeWidth, strokeOpacity, lineDashParameters - ); + if (strokeWidth > 0) { + doStroke = true; + return new AbstractSvgNodeRenderer.StrokeProperties(strokeColor, strokeWidth, strokeOpacity, lineDashParameters + ); + } } return null; } diff --git a/port-hash b/port-hash index aab78bd50d..3159250fa2 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -457ddde85884c7b96413950d2b1a81f800a2926c +1ffa4d50794389556f2f007a928fb51e350036c1