[poppler] glib/poppler-page.cc

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Apr 25 13:59:11 UTC 2020


 glib/poppler-page.cc |   78 ++++++++++++++++++++++++++++++++-------------------
 1 file changed, 50 insertions(+), 28 deletions(-)

New commits:
commit b7aed3eb2950c1389ab81a2261eee2e2221050f6
Author: Nelson Benítez León <nbenitezl at gmail.com>
Date:   Sat Feb 29 22:05:18 2020 -0400

    glib: implement rotation for 'flagNoRotate' annots
    
    previously poppler_page_get_annot_mapping() function
    was ignoring to rotate annots flagged as 'flagNoRotate'
    probably because they require a special rotation where
    the annotation pivots on the upper left corner, as
    described in PDF 1.7 spec "8.4.2 Annotation Flags"
    NoRotate flag.
    
    Added support for that, while refactoring the code to
    make it more readable.
    
    Fixes #767

diff --git a/glib/poppler-page.cc b/glib/poppler-page.cc
index 7ae9463e..7723af16 100644
--- a/glib/poppler-page.cc
+++ b/glib/poppler-page.cc
@@ -33,6 +33,8 @@
 #include "poppler.h"
 #include "poppler-private.h"
 
+#define SUPPORTED_ROTATION(r) (r == 90 || r == 180 || r == 270)
+
 /**
  * SECTION:poppler-page
  * @short_description: Information about a page in a document
@@ -1400,9 +1402,11 @@ poppler_page_get_annot_mapping (PopplerPage *page)
     PopplerRectangle rect;
     Annot *annot;
     PDFRectangle *annot_rect;
+    gboolean flag_no_rotate;
     gint rotation = 0;
 
     annot = annots->getAnnot (i);
+    flag_no_rotate = annot->getFlags () & Annot::flagNoRotate;
 
     /* Create the mapping */
     mapping = poppler_annot_mapping_new ();
@@ -1450,35 +1454,53 @@ poppler_page_get_annot_mapping (PopplerPage *page)
     rect.x2 = annot_rect->x2 - crop_box->x1;
     rect.y2 = annot_rect->y2 - crop_box->y1;
 
-    if (! (annot->getFlags () & Annot::flagNoRotate))
-      rotation = page->page->getRotate ();
-
-    switch (rotation)
-      {
-      case 90:
-        mapping->area.x1 = rect.y1;
-        mapping->area.y1 = height - rect.x2;
-        mapping->area.x2 = mapping->area.x1 + (rect.y2 - rect.y1);
-        mapping->area.y2 = mapping->area.y1 + (rect.x2 - rect.x1);
-        break;
-      case 180:
-        mapping->area.x1 = width - rect.x2;
-        mapping->area.y1 = height - rect.y2;
-        mapping->area.x2 = mapping->area.x1 + (rect.x2 - rect.x1);
-        mapping->area.y2 = mapping->area.y1 + (rect.y2 - rect.y1);
-        break;
-      case 270:
-        mapping->area.x1 = width - rect.y2;
-        mapping->area.y1 = rect.x1;
-        mapping->area.x2 = mapping->area.x1 + (rect.y2 - rect.y1);
-        mapping->area.y2 = mapping->area.y1 + (rect.x2 - rect.x1);
-        break;
-      default:
-        mapping->area.x1 = rect.x1;
-        mapping->area.y1 = rect.y1;
-        mapping->area.x2 = rect.x2;
-        mapping->area.y2 = rect.y2;
+    rotation = page->page->getRotate ();
+
+    if (rotation == 0 || !SUPPORTED_ROTATION (rotation)) { /* zero or unknown rotation */
+      mapping->area.x1 = rect.x1;
+      mapping->area.y1 = rect.y1;
+      mapping->area.x2 = rect.x2;
+      mapping->area.y2 = rect.y2;
+    } else {
+      gdouble annot_height = rect.y2 - rect.y1;
+      gdouble annot_width = rect.x2 - rect.x1;
+
+      if (flag_no_rotate) {
+        if (rotation == 90) {
+          mapping->area.x1 = rect.y2;
+          mapping->area.y1 = height - (rect.x1 + annot_height);
+          mapping->area.x2 = rect.y2 + annot_width;
+          mapping->area.y2 = height - rect.x1;
+        } else if (rotation == 180) {
+          mapping->area.x1 = width - rect.x1;
+          mapping->area.x2 = MIN (mapping->area.x1 + annot_width, width);
+          mapping->area.y2 = height - rect.y2;
+          mapping->area.y1 = MAX (0, mapping->area.y2 - annot_height);
+        } else if (rotation == 270) {
+          mapping->area.x1 = width - rect.y2;
+          mapping->area.x2 = MIN (mapping->area.x1 + annot_width, width);
+          mapping->area.y2 = rect.x1;
+          mapping->area.y1 = MAX (0, mapping->area.y2 - annot_height);
+        }
+      } else { /* !flag_no_rotate */
+        if (rotation == 90) {
+          mapping->area.x1 = rect.y1;
+          mapping->area.y1 = height - rect.x2;
+          mapping->area.x2 = mapping->area.x1 + annot_height;
+          mapping->area.y2 = mapping->area.y1 + annot_width;
+        } else if (rotation == 180) {
+          mapping->area.x1 = width - rect.x2;
+          mapping->area.y1 = height - rect.y2;
+          mapping->area.x2 = mapping->area.x1 + annot_width;
+          mapping->area.y2 = mapping->area.y1 + annot_height;
+        } else if (rotation == 270) {
+          mapping->area.x1 = width - rect.y2;
+          mapping->area.y1 = rect.x1;
+          mapping->area.x2 = mapping->area.x1 + annot_height;
+          mapping->area.y2 = mapping->area.y1 + annot_width;
+        }
       }
+    }
 
     map_list = g_list_prepend (map_list, mapping);
   }


More information about the poppler mailing list