Processing the NoRotate flag when displaying annotations

Bug: pdfium:1883

Change-Id: Ibd7694d00733e09929c77c5a28c31ed9b7093ebd
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/97171
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/AUTHORS b/AUTHORS
index 4c4b287..b7e8252 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -11,6 +11,7 @@
 # Please keep the list sorted.
 
 # BEGIN individuals section.
+Aleksei Skotnikov <fineaskotnikov@gmail.com>
 Antonio Gomes <tonikitoo@igalia.com>
 Chery Cherian <cherycherian@gmail.com>
 Claudio DeSouza <claudiomdsjr@gmail.com>
diff --git a/core/fpdfdoc/cpdf_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp
index 9a0ba1a..baf8d42 100644
--- a/core/fpdfdoc/cpdf_annot.cpp
+++ b/core/fpdfdoc/cpdf_annot.cpp
@@ -53,6 +53,21 @@
   CFX_FloatRect form_bbox =
       form_matrix.TransformRect(pForm->GetDict()->GetRectFor("BBox"));
   matrix->MatchRect(pAnnot->GetRect(), form_bbox);
+
+  // Compensate for page rotation.
+  if ((pAnnot->GetFlags() & pdfium::annotation_flags::kNoRotate) &&
+      pPage->GetPageRotation() != 0) {
+    // Rotate annotation rect around top-left angle (according to the
+    // specification).
+    const float offset_x = pAnnot->GetRect().Left();
+    const float offset_y = pAnnot->GetRect().Top();
+    matrix->Concat({1, 0, 0, 1, -offset_x, -offset_y});
+    // GetPageRotation returns value in fractions of pi/2.
+    const float angle = FXSYS_PI / 2 * pPage->GetPageRotation();
+    matrix->Rotate(angle);
+    matrix->Concat({1, 0, 0, 1, offset_x, offset_y});
+  }
+
   matrix->Concat(mtUser2Device);
   return pForm;
 }
diff --git a/testing/resources/pixel/bug_1883_expected.pdf.1.png b/testing/resources/pixel/bug_1883_expected.pdf.1.png
index 219cadd..f18c1d7 100644
--- a/testing/resources/pixel/bug_1883_expected.pdf.1.png
+++ b/testing/resources/pixel/bug_1883_expected.pdf.1.png
Binary files differ
diff --git a/testing/resources/pixel/bug_1883_expected.pdf.2.png b/testing/resources/pixel/bug_1883_expected.pdf.2.png
index 1037f55..a3093ff 100644
--- a/testing/resources/pixel/bug_1883_expected.pdf.2.png
+++ b/testing/resources/pixel/bug_1883_expected.pdf.2.png
Binary files differ
diff --git a/testing/resources/pixel/bug_1883_expected.pdf.3.png b/testing/resources/pixel/bug_1883_expected.pdf.3.png
index b8036f8..e6e3988 100644
--- a/testing/resources/pixel/bug_1883_expected.pdf.3.png
+++ b/testing/resources/pixel/bug_1883_expected.pdf.3.png
Binary files differ
diff --git a/testing/resources/pixel/bug_1883_expected_skia.pdf.1.png b/testing/resources/pixel/bug_1883_expected_skia.pdf.1.png
index 543bf2a..84f2696 100644
--- a/testing/resources/pixel/bug_1883_expected_skia.pdf.1.png
+++ b/testing/resources/pixel/bug_1883_expected_skia.pdf.1.png
Binary files differ
diff --git a/testing/resources/pixel/bug_1883_expected_skia.pdf.2.png b/testing/resources/pixel/bug_1883_expected_skia.pdf.2.png
index 0b71a4d..e991b81 100644
--- a/testing/resources/pixel/bug_1883_expected_skia.pdf.2.png
+++ b/testing/resources/pixel/bug_1883_expected_skia.pdf.2.png
Binary files differ
diff --git a/testing/resources/pixel/bug_1883_expected_skia.pdf.3.png b/testing/resources/pixel/bug_1883_expected_skia.pdf.3.png
index dea2ab8..8e1ecc7 100644
--- a/testing/resources/pixel/bug_1883_expected_skia.pdf.3.png
+++ b/testing/resources/pixel/bug_1883_expected_skia.pdf.3.png
Binary files differ