]> www.fi.muni.cz Git - evince.git/blobdiff - backend/djvu/djvu-document.c
[djvu] Implement document_links_find_link_page()
[evince.git] / backend / djvu / djvu-document.c
index de85c1d4b30250a3755ddbdfd867693ae73f78c1..89925e4efe720ee931f13e1bc569b4a6e0865584 100644 (file)
@@ -14,7 +14,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #include "config.h"
@@ -24,7 +24,6 @@
 #include "djvu-text-page.h"
 #include "djvu-links.h"
 #include "djvu-document-private.h"
-#include "ev-document-thumbnails.h"
 #include "ev-file-exporter.h"
 #include "ev-document-misc.h"
 #include "ev-document-find.h"
@@ -46,21 +45,18 @@ enum {
 
 struct _DjvuDocumentClass
 {
-       GObjectClass parent_class;
+       EvDocumentClass parent_class;
 };
 
 typedef struct _DjvuDocumentClass DjvuDocumentClass;
 
-static void djvu_document_document_iface_init (EvDocumentIface *iface);
-static void djvu_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface);
-static void djvu_document_file_exporter_iface_init (EvFileExporterIface *iface);
-static void djvu_document_find_iface_init (EvDocumentFindIface *iface);
-static void djvu_document_document_links_iface_init  (EvDocumentLinksIface *iface);
-static void djvu_selection_iface_init (EvSelectionIface *iface);
+static void djvu_document_file_exporter_iface_init (EvFileExporterInterface *iface);
+static void djvu_document_find_iface_init (EvDocumentFindInterface *iface);
+static void djvu_document_document_links_iface_init  (EvDocumentLinksInterface *iface);
+static void djvu_selection_iface_init (EvSelectionInterface *iface);
 
 EV_BACKEND_REGISTER_WITH_CODE (DjvuDocument, djvu_document,
     {
-      EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_THUMBNAILS, djvu_document_document_thumbnails_iface_init);
       EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_FILE_EXPORTER, djvu_document_file_exporter_iface_init);
       EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FIND, djvu_document_find_iface_init);
       EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_LINKS, djvu_document_document_links_iface_init);
@@ -75,7 +71,7 @@ ev_djvu_error_quark (void)
 {
        static GQuark q = 0;
        if (q == 0)
-               q = g_quark_from_static_string ("ev-djvu-quark");
+               q = g_quark_from_string ("ev-djvu-quark");
        
        return q;
 }
@@ -171,7 +167,7 @@ djvu_document_load (EvDocument  *document,
                g_set_error_literal (error,
                                     EV_DOCUMENT_ERROR,
                                     EV_DOCUMENT_ERROR_INVALID,
-                                    _("DJVU document has incorrect format"));
+                                    _("DjVu document has incorrect format"));
                return FALSE;
        }
 
@@ -249,7 +245,7 @@ djvu_document_load (EvDocument  *document,
                                      G_FILE_ERROR,
                                      G_FILE_ERROR_EXIST,
                                     _("The document is composed of several files. "
-                                       "One or more of such files cannot be accessed."));
+                                       "One or more of these files cannot be accessed."));
 
                return FALSE;
        }
@@ -324,7 +320,6 @@ djvu_document_render (EvDocument      *document,
        ddjvu_page_t *d_page;
        ddjvu_page_rotation_t rotation;
        double page_width, page_height, tmp;
-       static const cairo_user_data_key_t key;
 
        d_page = ddjvu_page_create_by_pageno (djvu_document->d_document, rc->page->index);
        
@@ -356,19 +351,12 @@ djvu_document_render (EvDocument      *document,
                default:
                        rotation = DDJVU_ROTATE_0;
        }
-#ifdef HAVE_CAIRO_FORMAT_STRIDE_FOR_WIDTH
-       rowstride = cairo_format_stride_for_width (CAIRO_FORMAT_RGB24, page_width);
-#else
-       rowstride = page_width * 4;
-#endif
-       pixels = (gchar *) g_malloc (page_height * rowstride);
-       surface = cairo_image_surface_create_for_data ((guchar *)pixels,
-                                                      CAIRO_FORMAT_RGB24,
-                                                      page_width,
-                                                      page_height,
-                                                      rowstride);
-       cairo_surface_set_user_data (surface, &key,
-                                    pixels, (cairo_destroy_func_t)g_free);
+
+       surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
+                                             page_width, page_height);
+       rowstride = cairo_image_surface_get_stride (surface);
+       pixels = (gchar *)cairo_image_surface_get_data (surface);
+
        prect.x = 0;
        prect.y = 0;
        prect.w = page_width;
@@ -384,9 +372,49 @@ djvu_document_render (EvDocument      *document,
                           rowstride,
                           pixels);
 
+       cairo_surface_mark_dirty (surface);
+
        return surface;
 }
 
+static GdkPixbuf *
+djvu_document_get_thumbnail (EvDocument      *document,
+                            EvRenderContext *rc)
+{
+       DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
+       GdkPixbuf *pixbuf, *rotated_pixbuf;
+       gdouble page_width, page_height;
+       gint thumb_width, thumb_height;
+       guchar *pixels;
+       
+       g_return_val_if_fail (djvu_document->d_document, NULL);
+
+       djvu_document_get_page_size (EV_DOCUMENT(djvu_document), rc->page,
+                                    &page_width, &page_height);
+       
+       thumb_width = (gint) (page_width * rc->scale);
+       thumb_height = (gint) (page_height * rc->scale);
+
+       pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8,
+                                thumb_width, thumb_height);
+       gdk_pixbuf_fill (pixbuf, 0xffffffff);
+       pixels = gdk_pixbuf_get_pixels (pixbuf);
+       
+       while (ddjvu_thumbnail_status (djvu_document->d_document, rc->page->index, 1) < DDJVU_JOB_OK)
+               djvu_handle_events(djvu_document, TRUE, NULL);
+                   
+       ddjvu_thumbnail_render (djvu_document->d_document, rc->page->index, 
+                               &thumb_width, &thumb_height,
+                               djvu_document->thumbs_format,
+                               gdk_pixbuf_get_rowstride (pixbuf), 
+                               (gchar *)pixels);
+
+       rotated_pixbuf = gdk_pixbuf_rotate_simple (pixbuf, 360 - rc->rotation);
+       g_object_unref (pixbuf);
+
+       return rotated_pixbuf;
+}
+
 static void
 djvu_document_finalize (GObject *object)
 {
@@ -412,30 +440,17 @@ djvu_document_finalize (GObject *object)
 static void
 djvu_document_class_init (DjvuDocumentClass *klass)
 {
-       GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+       GObjectClass    *gobject_class = G_OBJECT_CLASS (klass);
+       EvDocumentClass *ev_document_class = EV_DOCUMENT_CLASS (klass);
 
        gobject_class->finalize = djvu_document_finalize;
-}
-
-static EvDocumentInfo *
-djvu_document_get_info (EvDocument *document)
-{
-       EvDocumentInfo *info;
-
-       info = g_new0 (EvDocumentInfo, 1);
-
-       return info;
-}
 
-static void
-djvu_document_document_iface_init (EvDocumentIface *iface)
-{
-       iface->load = djvu_document_load;
-       iface->save = djvu_document_save;
-       iface->get_n_pages = djvu_document_get_n_pages;
-       iface->get_page_size = djvu_document_get_page_size;
-       iface->render = djvu_document_render;
-       iface->get_info = djvu_document_get_info;
+       ev_document_class->load = djvu_document_load;
+       ev_document_class->save = djvu_document_save;
+       ev_document_class->get_n_pages = djvu_document_get_n_pages;
+       ev_document_class->get_page_size = djvu_document_get_page_size;
+       ev_document_class->render = djvu_document_render;
+       ev_document_class->get_thumbnail = djvu_document_get_thumbnail;
 }
 
 static gchar *
@@ -464,7 +479,7 @@ djvu_text_copy (DjvuDocument *djvu_document,
 
 static gchar *
 djvu_selection_get_selected_text (EvSelection     *selection,
-                                 EvRenderContext *rc,
+                                 EvPage          *page,
                                  EvSelectionStyle style,
                                  EvRectangle     *points)
 {
@@ -474,13 +489,13 @@ djvu_selection_get_selected_text (EvSelection     *selection,
        gchar *text;
             
        djvu_document_get_page_size (EV_DOCUMENT (djvu_document),
-                                    rc->page, &width, &height);                
+                                    page, &width, &height);
        rectangle.x1 = points->x1 / SCALE_FACTOR;
        rectangle.y1 = (height - points->y2) / SCALE_FACTOR;
        rectangle.x2 = points->x2 / SCALE_FACTOR;
        rectangle.y2 = (height - points->y1) / SCALE_FACTOR;
                
-       text = djvu_text_copy (djvu_document, rc->page->index, &rectangle);
+       text = djvu_text_copy (djvu_document, page->index, &rectangle);
       
        if (text == NULL)
                text = g_strdup ("");
@@ -489,85 +504,11 @@ djvu_selection_get_selected_text (EvSelection     *selection,
 }
 
 static void
-djvu_selection_iface_init (EvSelectionIface *iface)
+djvu_selection_iface_init (EvSelectionInterface *iface)
 {
        iface->get_selected_text = djvu_selection_get_selected_text;
 }
 
-static void
-djvu_document_thumbnails_get_dimensions (EvDocumentThumbnails *document,
-                                        EvRenderContext      *rc, 
-                                        gint                 *width,
-                                        gint                 *height)
-{
-       DjvuDocument *djvu_document = DJVU_DOCUMENT (document); 
-       gdouble page_width, page_height;
-       
-       djvu_document_get_page_size (EV_DOCUMENT(djvu_document), rc->page,
-                                    &page_width, &page_height);
-
-       if (rc->rotation == 90 || rc->rotation == 270) {
-               *width = (gint) (page_height * rc->scale);
-               *height = (gint) (page_width * rc->scale);
-       } else {
-               *width = (gint) (page_width * rc->scale);
-               *height = (gint) (page_height * rc->scale);
-       }
-}
-
-static GdkPixbuf *
-djvu_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document,
-                                       EvRenderContext      *rc,
-                                       gboolean              border)
-{
-       DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
-       GdkPixbuf *pixbuf, *rotated_pixbuf;
-       gdouble page_width, page_height;
-       gint thumb_width, thumb_height;
-       guchar *pixels;
-       
-       g_return_val_if_fail (djvu_document->d_document, NULL);
-
-       djvu_document_get_page_size (EV_DOCUMENT(djvu_document), rc->page,
-                                    &page_width, &page_height);
-       
-       thumb_width = (gint) (page_width * rc->scale);
-       thumb_height = (gint) (page_height * rc->scale);
-
-       pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8,
-                                thumb_width, thumb_height);
-       gdk_pixbuf_fill (pixbuf, 0xffffffff);
-       pixels = gdk_pixbuf_get_pixels (pixbuf);
-       
-       while (ddjvu_thumbnail_status (djvu_document->d_document, rc->page->index, 1) < DDJVU_JOB_OK)
-               djvu_handle_events(djvu_document, TRUE, NULL);
-                   
-       ddjvu_thumbnail_render (djvu_document->d_document, rc->page->index, 
-                               &thumb_width, &thumb_height,
-                               djvu_document->thumbs_format,
-                               gdk_pixbuf_get_rowstride (pixbuf), 
-                               (gchar *)pixels);
-
-       rotated_pixbuf = gdk_pixbuf_rotate_simple (pixbuf, 360 - rc->rotation);
-       g_object_unref (pixbuf);
-
-        if (border) {
-             GdkPixbuf *tmp_pixbuf = rotated_pixbuf;
-             
-             rotated_pixbuf = ev_document_misc_get_thumbnail_frame (-1, -1, tmp_pixbuf);
-             g_object_unref (tmp_pixbuf);
-       }
-       
-       return rotated_pixbuf;
-}
-
-static void
-djvu_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface)
-{
-       iface->get_thumbnail = djvu_document_thumbnails_get_thumbnail;
-       iface->get_dimensions = djvu_document_thumbnails_get_dimensions;
-}
-
 /* EvFileExporterIface */
 static void
 djvu_document_file_exporter_begin (EvFileExporter        *exporter,
@@ -626,7 +567,7 @@ djvu_document_file_exporter_get_capabilities (EvFileExporter *exporter)
 }
 
 static void
-djvu_document_file_exporter_iface_init (EvFileExporterIface *iface)
+djvu_document_file_exporter_iface_init (EvFileExporterInterface *iface)
 {
         iface->begin = djvu_document_file_exporter_begin;
         iface->do_page = djvu_document_file_exporter_do_page;
@@ -705,23 +646,24 @@ djvu_document_find_find_text (EvDocumentFind   *document,
 }
 
 static void
-djvu_document_find_iface_init (EvDocumentFindIface *iface)
+djvu_document_find_iface_init (EvDocumentFindInterface *iface)
 {
         iface->find_text = djvu_document_find_find_text;
 }
 
-static GList *
+static EvMappingList *
 djvu_document_links_get_links (EvDocumentLinks *document_links,
-                              gint             page)
+                              EvPage          *page)
 {
-       return djvu_links_get_links (document_links, page, SCALE_FACTOR);
+       return djvu_links_get_links (document_links, page->index, SCALE_FACTOR);
 }
 
 static void
-djvu_document_document_links_iface_init  (EvDocumentLinksIface *iface)
+djvu_document_document_links_iface_init  (EvDocumentLinksInterface *iface)
 {
        iface->has_document_links = djvu_links_has_document_links;
        iface->get_links_model = djvu_links_get_links_model;
        iface->get_links = djvu_document_links_get_links;
        iface->find_link_dest = djvu_links_find_link_dest;
+       iface->find_link_page = djvu_links_find_link_page;
 }