[poppler] poppler/glib: poppler-action.cc, 1.9, 1.10 poppler-page.cc, 1.52, 1.53

Albert Astals Cid aacid at kemper.freedesktop.org
Sun Jan 28 07:55:13 PST 2007


Update of /cvs/poppler/poppler/glib
In directory kemper:/tmp/cvs-serv2226/glib

Modified Files:
	poppler-action.cc poppler-page.cc 
Log Message:
        * glib/poppler-page.cc: Make link mapping coordinates follow page
        rotation. Patch by Carlos Garcia Campos <carlosgc at gnome.org>
        * glib/poppler-action.cc: Fix link destination coordinates. Patch by
        Carlos Garcia Campos <carlosgc at gnome.org>


Index: poppler-action.cc
===================================================================
RCS file: /cvs/poppler/poppler/glib/poppler-action.cc,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- poppler-action.cc	19 May 2006 22:26:03 -0000	1.9
+++ poppler-action.cc	28 Jan 2007 15:55:11 -0000	1.10
@@ -249,7 +249,20 @@
 	dest->change_left = link_dest->getChangeLeft ();
 	dest->change_top = link_dest->getChangeTop ();
 	dest->change_zoom = link_dest->getChangeZoom ();
-
+	
+	if (dest->page_num > 0) {
+		PopplerPage *page;
+		
+		page = poppler_document_get_page (document, dest->page_num - 1);
+		
+		dest->left -= page->page->getCropBox ()->x1;
+		dest->bottom -= page->page->getCropBox ()->x1;
+		dest->right -= page->page->getCropBox ()->y1;
+		dest->top -= page->page->getCropBox ()->y1;
+		
+		g_object_unref (page);
+	}
+	
 	return dest;
 }
 

Index: poppler-page.cc
===================================================================
RCS file: /cvs/poppler/poppler/glib/poppler-page.cc,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- poppler-page.cc	26 Dec 2006 19:56:29 -0000	1.52
+++ poppler-page.cc	28 Jan 2007 15:55:11 -0000	1.53
@@ -841,7 +841,6 @@
 {
 }
 
-
 /**
  * poppler_page_get_link_mapping:
  * @page: A #PopplerPage
@@ -855,52 +854,87 @@
 GList *
 poppler_page_get_link_mapping (PopplerPage *page)
 {
-	GList *map_list = NULL;
-	gint i;
-	Links *links;
-	Object obj;
-
-	g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);
-
-	links = new Links (page->page->getAnnots (&obj),
-			   page->document->doc->getCatalog ()->getBaseURI ());
-	obj.free ();
-
-	if (links == NULL)
-		return NULL;
-
-	for (i = 0; i < links->getNumLinks (); i++) {
-		PopplerLinkMapping *mapping;
-		LinkAction *link_action;
-		Link *link;
-
-		link = links->getLink (i);
-		link_action = link->getAction ();
-
-		/* Create the mapping */
-		mapping = g_new (PopplerLinkMapping, 1);
-		mapping->action = _poppler_action_new (page->document, link_action, NULL);
-		link->getRect (&(mapping->area.x1), &(mapping->area.y1),
-			       &(mapping->area.x2), &(mapping->area.y2));
-
-		mapping->area.x1 -= page->page->getCropBox()->x1;
-		mapping->area.x2 -= page->page->getCropBox()->x1;
-		mapping->area.y1 -= page->page->getCropBox()->y1;
-		mapping->area.y2 -= page->page->getCropBox()->y1;
-
-		map_list = g_list_prepend (map_list, mapping);
+  GList *map_list = NULL;
+  gint i;
+  Links *links;
+  Object obj;
+  double width, height;
+  
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);
+  
+  links = new Links (page->page->getAnnots (&obj),
+		     page->document->doc->getCatalog ()->getBaseURI ());
+  obj.free ();
+  
+  if (links == NULL)
+    return NULL;
+  
+  poppler_page_get_size (page, &width, &height);
+  
+  for (i = 0; i < links->getNumLinks (); i++)
+    {
+      PopplerLinkMapping *mapping;
+      PopplerRectangle rect;
+      LinkAction *link_action;
+      Link *link;
+      
+      link = links->getLink (i);
+      link_action = link->getAction ();
+      
+      /* Create the mapping */
+      mapping = g_new (PopplerLinkMapping, 1);
+      mapping->action = _poppler_action_new (page->document, link_action, NULL);
+      
+      link->getRect (&rect.x1, &rect.y1, &rect.x2, &rect.y2);
+      
+      switch (page->page->getRotate ())
+        {
+        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;
 	}
-
-	delete links;
-
-	return map_list;
+			
+      mapping->area.x1 -= page->page->getCropBox()->x1;
+      mapping->area.x2 -= page->page->getCropBox()->x1;
+      mapping->area.y1 -= page->page->getCropBox()->y1;
+      mapping->area.y2 -= page->page->getCropBox()->y1;
+      
+      map_list = g_list_prepend (map_list, mapping);
+    }
+  
+  delete links;
+  
+  return map_list;
 }
 
 static void
 poppler_mapping_free (PopplerLinkMapping *mapping)
 {
-	poppler_action_free (mapping->action);
-	g_free (mapping);
+  poppler_action_free (mapping->action);
+  g_free (mapping);
 }
 
 /**
@@ -915,11 +949,11 @@
 void
 poppler_page_free_link_mapping (GList *list)
 {
-	if (list == NULL)
-		return;
+  if (list == NULL)
+    return;
 
-	g_list_foreach (list, (GFunc) (poppler_mapping_free), NULL);
-	g_list_free (list);
+  g_list_foreach (list, (GFunc) (poppler_mapping_free), NULL);
+  g_list_free (list);
 }
 
 /* PopplerRectangle type */



More information about the poppler mailing list