Skip to content

Commit dd9e204

Browse files
introfogiText-CI
authored andcommitted
Improve float arithmetic isIdentityMatrix method
DEVSIX-4620 Autoported commit. Original commit hash: [bd1ac0434]
1 parent 68b8c5b commit dd9e204

File tree

5 files changed

+81
-11
lines changed

5 files changed

+81
-11
lines changed

itext.tests/itext.kernel.tests/itext/kernel/pdf/canvas/PdfCanvasXObjectTest.cs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,5 +520,60 @@ protected internal CustomPdfXObject(PdfStream pdfObject)
520520
: base(pdfObject) {
521521
}
522522
}
523+
524+
// Adds PdfFormXObject with matrix close to the identity matrix tests block
525+
[NUnit.Framework.Test]
526+
public virtual void AddFormXObjectWithUserIdentityMatrixTest() {
527+
String fileName = "addFormXObjectWithUserIdentityMatrixTest.pdf";
528+
String destPdf = DESTINATION_FOLDER + fileName;
529+
String cmpPdf = SOURCE_FOLDER + "cmp_" + fileName;
530+
FileStream fos = new FileStream(destPdf, FileMode.Create);
531+
PdfWriter writer = new PdfWriter(fos);
532+
PdfDocument document = new PdfDocument(writer);
533+
PdfFormXObject formXObject = new PdfFormXObject(new Rectangle(0, 0, 20, 20));
534+
new PdfCanvas(formXObject, document).Circle(10, 10, 10).Fill();
535+
PdfPage page = document.AddNewPage();
536+
PdfCanvas canvas = new PdfCanvas(page);
537+
// It should be written because it is user matrix
538+
canvas.AddXObjectWithTransformationMatrix(formXObject, 1.00011f, 0, 0, 1, 0, 0);
539+
canvas.Release();
540+
page.Flush();
541+
page = document.AddNewPage();
542+
canvas = new PdfCanvas(page);
543+
// It should be written because it is user matrix
544+
canvas.AddXObjectWithTransformationMatrix(formXObject, 1.00009f, 0, 0, 1, 0, 0);
545+
canvas.Release();
546+
page.Flush();
547+
document.Close();
548+
NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(destPdf, cmpPdf, DESTINATION_FOLDER, "diff_"
549+
));
550+
}
551+
552+
[NUnit.Framework.Test]
553+
public virtual void AddFormXObjectWithIdentityMatrixTest() {
554+
String fileName = "addFormXObjectWithIdentityMatrixTest.pdf";
555+
String destPdf = DESTINATION_FOLDER + fileName;
556+
String cmpPdf = SOURCE_FOLDER + "cmp_" + fileName;
557+
FileStream fos = new FileStream(destPdf, FileMode.Create);
558+
PdfWriter writer = new PdfWriter(fos);
559+
PdfDocument document = new PdfDocument(writer);
560+
PdfFormXObject formXObject = new PdfFormXObject(new Rectangle(0, 0, 20, 20));
561+
new PdfCanvas(formXObject, document).Circle(10, 10, 10).Fill();
562+
PdfPage page = document.AddNewPage();
563+
PdfCanvas canvas = new PdfCanvas(page);
564+
// It should be written because it is larger then PdfCanvas#IDENTITY_MATRIX_EPS
565+
canvas.AddXObjectAt(formXObject, 0.00011f, 0);
566+
canvas.Release();
567+
page.Flush();
568+
page = document.AddNewPage();
569+
canvas = new PdfCanvas(page);
570+
// It shouldn't be written because it is less then PdfCanvas#IDENTITY_MATRIX_EPS
571+
canvas.AddXObjectAt(formXObject, 0.00009f, 0);
572+
canvas.Release();
573+
page.Flush();
574+
document.Close();
575+
NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(destPdf, cmpPdf, DESTINATION_FOLDER, "diff_"
576+
));
577+
}
523578
}
524579
}

itext/itext.kernel/itext/kernel/pdf/canvas/PdfCanvas.cs

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@ public class PdfCanvas {
202202

203203
private static readonly PdfSpecialCs.Pattern pattern = new PdfSpecialCs.Pattern();
204204

205+
private const float IDENTITY_MATRIX_EPS = 1e-4f;
206+
205207
/// <summary>a LIFO stack of graphics state saved states.</summary>
206208
protected internal Stack<CanvasGraphicsState> gsStack = new Stack<CanvasGraphicsState>();
207209

@@ -1820,6 +1822,10 @@ public virtual PdfXObject AddImage(ImageData image, iText.Kernel.Geom.Rectangle
18201822
/// <param name="asInline">true if to add image as in-line</param>
18211823
/// <returns>the created imageXObject or null in case of in-line image (asInline = true)</returns>
18221824
/// <seealso cref="ConcatMatrix(double, double, double, double, double, double)"/>
1825+
/// <seealso cref="iText.Kernel.Pdf.Xobject.PdfXObject.CalculateProportionallyFitRectangleWithWidth(iText.Kernel.Pdf.Xobject.PdfXObject, float, float, float)
1826+
/// "/>
1827+
/// <seealso cref="iText.Kernel.Pdf.Xobject.PdfXObject.CalculateProportionallyFitRectangleWithHeight(iText.Kernel.Pdf.Xobject.PdfXObject, float, float, float)
1828+
/// "/>
18231829
public virtual PdfXObject AddImageFittedIntoRectangle(ImageData image, iText.Kernel.Geom.Rectangle rect, bool
18241830
asInline) {
18251831
return AddImageWithTransformationMatrix(image, rect.GetWidth(), 0, 0, rect.GetHeight(), rect.GetX(), rect.
@@ -1992,7 +1998,7 @@ public virtual PdfXObject AddImage(ImageData image, float x, float y, float heig
19921998
public virtual iText.Kernel.Pdf.Canvas.PdfCanvas AddXObjectWithTransformationMatrix(PdfXObject xObject, float
19931999
a, float b, float c, float d, float e, float f) {
19942000
if (xObject is PdfFormXObject) {
1995-
return AddFormWithTransformationMatrix((PdfFormXObject)xObject, a, b, c, d, e, f);
2001+
return AddFormWithTransformationMatrix((PdfFormXObject)xObject, a, b, c, d, e, f, true);
19962002
}
19972003
else {
19982004
if (xObject is PdfImageXObject) {
@@ -2093,6 +2099,10 @@ public virtual iText.Kernel.Pdf.Canvas.PdfCanvas AddXObject(PdfXObject xObject,
20932099
/// <param name="xObject">the xObject to add</param>
20942100
/// <param name="rect">the rectangle in which the xObject will be fitted</param>
20952101
/// <returns>the current canvas</returns>
2102+
/// <seealso cref="iText.Kernel.Pdf.Xobject.PdfXObject.CalculateProportionallyFitRectangleWithWidth(iText.Kernel.Pdf.Xobject.PdfXObject, float, float, float)
2103+
/// "/>
2104+
/// <seealso cref="iText.Kernel.Pdf.Xobject.PdfXObject.CalculateProportionallyFitRectangleWithHeight(iText.Kernel.Pdf.Xobject.PdfXObject, float, float, float)
2105+
/// "/>
20962106
public virtual iText.Kernel.Pdf.Canvas.PdfCanvas AddXObjectFittedIntoRectangle(PdfXObject xObject, iText.Kernel.Geom.Rectangle
20972107
rect) {
20982108
if (xObject is PdfFormXObject) {
@@ -2278,7 +2288,7 @@ public virtual iText.Kernel.Pdf.Canvas.PdfCanvas AddXObject(PdfXObject xObject,
22782288
/// <returns>the current canvas</returns>
22792289
public virtual iText.Kernel.Pdf.Canvas.PdfCanvas AddXObject(PdfXObject xObject) {
22802290
if (xObject is PdfFormXObject) {
2281-
return AddFormWithTransformationMatrix((PdfFormXObject)xObject, 1, 0, 0, 1, 0, 0);
2291+
return AddFormWithTransformationMatrix((PdfFormXObject)xObject, 1, 0, 0, 1, 0, 0, false);
22822292
}
22832293
else {
22842294
if (xObject is PdfImageXObject) {
@@ -2499,11 +2509,17 @@ protected internal virtual void AddInlineImage(PdfImageXObject imageXObject, flo
24992509
/// <param name="d">an element of the transformation matrix</param>
25002510
/// <param name="e">an element of the transformation matrix</param>
25012511
/// <param name="f">an element of the transformation matrix</param>
2512+
/// <param name="writeIdentityMatrix">
2513+
/// true if the matrix is written in any case, otherwise if the
2514+
/// <see cref="IsIdentityMatrix(float, float, float, float, float, float)"/>
2515+
/// method indicates
2516+
/// that the matrix is identity, the matrix will not be written
2517+
/// </param>
25022518
/// <returns>current canvas</returns>
25032519
private iText.Kernel.Pdf.Canvas.PdfCanvas AddFormWithTransformationMatrix(PdfFormXObject form, float a, float
2504-
b, float c, float d, float e, float f) {
2520+
b, float c, float d, float e, float f, bool writeIdentityMatrix) {
25052521
SaveState();
2506-
if (!iText.Kernel.Pdf.Canvas.PdfCanvas.IsIdentityMatrix(a, b, c, d, e, f)) {
2522+
if (writeIdentityMatrix || !iText.Kernel.Pdf.Canvas.PdfCanvas.IsIdentityMatrix(a, b, c, d, e, f)) {
25072523
ConcatMatrix(a, b, c, d, e, f);
25082524
}
25092525
PdfName name = resources.AddForm(form);
@@ -2525,7 +2541,7 @@ private iText.Kernel.Pdf.Canvas.PdfCanvas AddFormWithTransformationMatrix(PdfFor
25252541
/// <param name="e">an element of the transformation matrix</param>
25262542
/// <param name="f">an element of the transformation matrix</param>
25272543
/// <returns>current canvas</returns>
2528-
[System.ObsoleteAttribute(@"will be removed in 7.2, useAddFormWithTransformationMatrix(iText.Kernel.Pdf.Xobject.PdfFormXObject, float, float, float, float, float, float) instead"
2544+
[System.ObsoleteAttribute(@"will be removed in 7.2, useAddFormWithTransformationMatrix(iText.Kernel.Pdf.Xobject.PdfFormXObject, float, float, float, float, float, float, bool) instead"
25292545
)]
25302546
private iText.Kernel.Pdf.Canvas.PdfCanvas AddForm(PdfFormXObject form, float a, float b, float c, float d,
25312547
float e, float f) {
@@ -2556,7 +2572,7 @@ private iText.Kernel.Pdf.Canvas.PdfCanvas AddFormAt(PdfFormXObject form, float x
25562572
float[] result = iText.Kernel.Pdf.Canvas.PdfCanvas.CalculateTransformationMatrix(rectMin, rectMax, bBoxMin
25572573
, bBoxMax);
25582574
return AddFormWithTransformationMatrix(form, result[0], result[1], result[2], result[3], result[4], result
2559-
[5]);
2575+
[5], false);
25602576
}
25612577

25622578
/// <summary>
@@ -2641,7 +2657,7 @@ private iText.Kernel.Pdf.Canvas.PdfCanvas AddFormFittedIntoRectangle(PdfFormXObj
26412657
float[] result = iText.Kernel.Pdf.Canvas.PdfCanvas.CalculateTransformationMatrix(rectMin, rectMax, bBoxMin
26422658
, bBoxMax);
26432659
return AddFormWithTransformationMatrix(form, result[0], result[1], result[2], result[3], result[4], result
2644-
[5]);
2660+
[5], false);
26452661
}
26462662

26472663
/// <summary>
@@ -2829,9 +2845,8 @@ private static float[] CalculateTransformationMatrix(Vector expectedMin, Vector
28292845
}
28302846

28312847
private static bool IsIdentityMatrix(float a, float b, float c, float d, float e, float f) {
2832-
return JavaUtil.FloatCompare(a, 1) == 0 && JavaUtil.FloatCompare(b, 0) == 0 && JavaUtil.FloatCompare(c, 0)
2833-
== 0 && JavaUtil.FloatCompare(d, 1) == 0 && JavaUtil.FloatCompare(e, 0) == 0 && JavaUtil.FloatCompare
2834-
(f, 0) == 0;
2848+
return Math.Abs(1 - a) < IDENTITY_MATRIX_EPS && Math.Abs(b) < IDENTITY_MATRIX_EPS && Math.Abs(c) < IDENTITY_MATRIX_EPS
2849+
&& Math.Abs(1 - d) < IDENTITY_MATRIX_EPS && Math.Abs(e) < IDENTITY_MATRIX_EPS && Math.Abs(f) < IDENTITY_MATRIX_EPS;
28352850
}
28362851
}
28372852
}

port-hash

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4cb1c09e6b161ca4fe822178d7bf4a4dbc2dfec5
1+
bd1ac0434e24f939a5d3df1d3d0f1c3b1b7f9a67

0 commit comments

Comments
 (0)