From f7c3085a0e3c5c813cf9ae40b55fd7390e9373e2 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Wed, 27 Dec 2006 17:33:22 +0000 Subject: Add page transition support in presentation mode. At the moment only page 2006-12-27 Carlos Garcia Campos * configure.ac: * backend/Makefile.am: * backend/ev-document-transition.[ch]: * pdf/ev-poppler.cc: (pdf_document_get_page_duration), (pdf_document_page_transition_iface_init): * shell/ev-view-private.h: * shell/ev-view.c: (ev_view_destroy), (page_changed_cb), (ev_view_set_presentation), (transition_next_page), (ev_view_presentation_transition_stop), (ev_view_presentation_transition_start), (ev_view_next_page): Add page transition support in presentation mode. At the moment only page duration is supported, but not transition effects. Fixes bug #309815. --- diff --git a/ChangeLog b/ChangeLog index 20cbe9e..731dae9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2006-12-27 Carlos Garcia Campos + + * configure.ac: + * backend/Makefile.am: + * backend/ev-document-transition.[ch]: + * pdf/ev-poppler.cc: (pdf_document_get_page_duration), + (pdf_document_page_transition_iface_init): + * shell/ev-view-private.h: + * shell/ev-view.c: (ev_view_destroy), (page_changed_cb), + (ev_view_set_presentation), (transition_next_page), + (ev_view_presentation_transition_stop), + (ev_view_presentation_transition_start), (ev_view_next_page): + + Add page transition support in presentation mode. At the moment only + page duration is supported, but not transition effects. Fixes bug + #309815. + 2006-12-25 Carlos Garcia Campos * backend/ev-document-links.c: (ev_document_links_find_link_dest): diff --git a/backend/Makefile.am b/backend/Makefile.am index 2de2f5f..54dbd2c 100644 --- a/backend/Makefile.am +++ b/backend/Makefile.am @@ -43,6 +43,8 @@ libevbackend_la_SOURCES= \ ev-document-find.c \ ev-document-find.h \ ev-document-info.h \ + ev-document-transition.h \ + ev-document-transition.c \ ev-file-exporter.c \ ev-file-exporter.h \ ev-render-context.h \ diff --git a/backend/ev-document-transition.c b/backend/ev-document-transition.c new file mode 100644 index 0000000..274da7c --- /dev/null +++ b/backend/ev-document-transition.c @@ -0,0 +1,55 @@ +/* ev-document-transition.c + * this file is part of evince, a gnome document viewer + * + * Copyright (C) 2006 Carlos Garcia Campos + * + * Evince is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Evince is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * 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. + */ + +#include "ev-document-transition.h" + +GType +ev_document_transition_get_type (void) +{ + static GType type = 0; + + if (G_UNLIKELY (type == 0)) { + const GTypeInfo our_info = { + sizeof (EvDocumentTransitionIface), + NULL, + NULL, + }; + + type = g_type_register_static (G_TYPE_INTERFACE, + "EvDocumentTransition", + &our_info, (GTypeFlags)0); + } + + return type; +} + +gdouble +ev_document_transition_get_page_duration (EvDocumentTransition *document_trans, + gint page) +{ + EvDocumentTransitionIface *iface = EV_DOCUMENT_TRANSITION_GET_IFACE (document_trans); + + if (iface->get_page_duration) + return iface->get_page_duration (document_trans, page); + + return -1; +} + + diff --git a/backend/ev-document-transition.h b/backend/ev-document-transition.h new file mode 100644 index 0000000..3ca55ab --- /dev/null +++ b/backend/ev-document-transition.h @@ -0,0 +1,56 @@ +/* ev-document-transition.h + * this file is part of evince, a gnome document viewer + * + * Copyright (C) 2006 Carlos Garcia Campos + * + * Evince is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Evince is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * 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. + */ + +#ifndef EV_DOCUMENT_TRANSITION_H +#define EV_DOCUMENT_TRANSITION_H + +#include + +#include "ev-document.h" + +G_BEGIN_DECLS + +#define EV_TYPE_DOCUMENT_TRANSITION (ev_document_transition_get_type ()) +#define EV_DOCUMENT_TRANSITION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EV_TYPE_DOCUMENT_TRANSITION, EvDocumentTransition)) +#define EV_DOCUMENT_TRANSITION_IFACE(k) (G_TYPE_CHECK_CLASS_CAST((k), EV_TYPE_DOCUMENT_TRANSITION, EvDocumentTransitionIface)) +#define EV_IS_DOCUMENT_TRANSITION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EV_TYPE_DOCUMENT_TRANSITION)) +#define EV_IS_DOCUMENT_TRANSITION_IFACE(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EV_TYPE_DOCUMENT_TRANSITION)) +#define EV_DOCUMENT_TRANSITION_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), EV_TYPE_DOCUMENT_TRANSITION, EvDocumentTransitionIface)) + +typedef struct _EvDocumentTransition EvDocumentTransition; +typedef struct _EvDocumentTransitionIface EvDocumentTransitionIface; + +struct _EvDocumentTransitionIface +{ + GTypeInterface base_iface; + + /* Methods */ + gdouble (* get_page_duration) (EvDocumentTransition *document_trans, + gint page); + /* TODO: Support page transition effects (page 562 PDF Reference 1.6) */ +}; + +GType ev_document_transition_get_type (void) G_GNUC_CONST; +gdouble ev_document_transition_get_page_duration (EvDocumentTransition *document_trans, + gint page); + +G_END_DECLS + +#endif /* EV_DOCUMENT_TRANSITION_H */ diff --git a/configure.ac b/configure.ac index 39f9d8d..cfd8d66 100644 --- a/configure.ac +++ b/configure.ac @@ -207,9 +207,11 @@ if test "x$enable_pdf" = "xyes"; then FRONTEND_LIBS="$FRONTEND_LIBS $POPPLER_LIBS" SHELL_LIBS="$SHELL_LIBS $POPPLER_LIBS" SHELL_CFLAGS="$SHELL_CFLAGS $POPPLER_CFLAGS" + evince_save_LIBS=$LIBS LIBS="$LIBS $FRONTEND_LIBS" AC_CHECK_FUNCS(poppler_page_render) + AC_CHECK_FUNCS(poppler_page_get_duration) LIBS=$evince_save_LIBS PKG_CHECK_MODULES(CAIRO_PDF, cairo-pdf, enable_cairo_pdf=yes, enable_cairo_pdf=no) diff --git a/pdf/ev-poppler.cc b/pdf/ev-poppler.cc index 2e0e46a..479a741 100644 --- a/pdf/ev-poppler.cc +++ b/pdf/ev-poppler.cc @@ -38,6 +38,7 @@ #include "ev-document-fonts.h" #include "ev-document-security.h" #include "ev-document-thumbnails.h" +#include "ev-document-transition.h" #include "ev-selection.h" #include "ev-attachment.h" @@ -86,6 +87,7 @@ static void pdf_document_document_fonts_iface_init (EvDocumentFontsIface static void pdf_document_find_iface_init (EvDocumentFindIface *iface); static void pdf_document_file_exporter_iface_init (EvFileExporterIface *iface); static void pdf_selection_iface_init (EvSelectionIface *iface); +static void pdf_document_page_transition_iface_init (EvDocumentTransitionIface *iface); static void pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnails, gint page, gint size, @@ -119,6 +121,8 @@ G_DEFINE_TYPE_WITH_CODE (PdfDocument, pdf_document, G_TYPE_OBJECT, pdf_document_file_exporter_iface_init); G_IMPLEMENT_INTERFACE (EV_TYPE_SELECTION, pdf_selection_iface_init); + G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_TRANSITION, + pdf_document_page_transition_iface_init); }); @@ -1637,6 +1641,36 @@ pdf_selection_iface_init (EvSelectionIface *iface) iface->get_selection_map = pdf_selection_get_selection_map; } +/* Page Transitions */ +static gdouble +pdf_document_get_page_duration (EvDocumentTransition *trans, + gint page) +{ +#ifdef HAVE_POPPLER_PAGE_GET_DURATION + PdfDocument *pdf_document; + PopplerPage *poppler_page; + gdouble duration = -1; + + pdf_document = PDF_DOCUMENT (trans); + poppler_page = poppler_document_get_page (pdf_document->document, page); + if (!poppler_page) + return -1; + + duration = poppler_page_get_duration (poppler_page); + g_object_unref (poppler_page); + + return duration; +#else + return -1; +#endif /* HAVE_POPPLER_PAGE_GET_DURATION */ +} + +static void +pdf_document_page_transition_iface_init (EvDocumentTransitionIface *iface) +{ + iface->get_page_duration = pdf_document_get_page_duration; +} + PdfDocument * pdf_document_new (void) { diff --git a/shell/ev-view-private.h b/shell/ev-view-private.h index d03a936..f1f5ad5 100644 --- a/shell/ev-view-private.h +++ b/shell/ev-view-private.h @@ -111,6 +111,7 @@ struct _EvView { EvPresentationState presentation_state; EvSizingMode sizing_mode_saved; double scale_saved; + guint trans_timeout_id; /* Common for button press handling */ int pressed_button; diff --git a/shell/ev-view.c b/shell/ev-view.c index ad7ef61..a7bae3d 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -36,6 +36,7 @@ #include "ev-selection.h" #include "ev-document-links.h" #include "ev-document-find.h" +#include "ev-document-transition.h" #include "ev-document-misc.h" #include "ev-debug.h" #include "ev-job-queue.h" @@ -312,6 +313,10 @@ static void ev_view_primary_clear_cb (GtkClipboard gpointer data); static void ev_view_update_primary_selection (EvView *ev_view); +/*** Presentation ***/ +static void ev_view_presentation_transition_start (EvView *ev_view); +static void ev_view_presentation_transition_stop (EvView *ev_view); + G_DEFINE_TYPE (EvView, ev_view, GTK_TYPE_WIDGET) @@ -2814,6 +2819,8 @@ ev_view_destroy (GtkObject *object) view->selection_update_id = 0; } + ev_view_presentation_transition_stop (view); + ev_view_set_scroll_adjustments (view, NULL, NULL); GTK_OBJECT_CLASS (ev_view_parent_class)->destroy (object); @@ -3163,6 +3170,8 @@ page_changed_cb (EvPageCache *page_cache, if (view->current_page != new_page) { view->current_page = new_page; view->pending_scroll = SCROLL_TO_PAGE_POSITION; + if (view->presentation) + ev_view_presentation_transition_start (view); gtk_widget_queue_resize (GTK_WIDGET (view)); } else { gtk_widget_queue_draw (GTK_WIDGET (view)); @@ -3427,6 +3436,11 @@ ev_view_set_presentation (EvView *view, gtk_widget_queue_resize (GTK_WIDGET (view)); + if (presentation) + ev_view_presentation_transition_start (view); + else + ev_view_presentation_transition_stop (view); + if (GTK_WIDGET_REALIZED (view)) { if (view->presentation) gdk_window_set_background (GTK_WIDGET(view)->window, @@ -3447,6 +3461,40 @@ ev_view_get_presentation (EvView *view) return view->presentation; } +static gboolean +transition_next_page (EvView *view) +{ + ev_view_next_page (view); + + return FALSE; +} + +static void +ev_view_presentation_transition_stop (EvView *view) +{ + if (view->trans_timeout_id > 0) + g_source_remove (view->trans_timeout_id); + view->trans_timeout_id = 0; +} + +static void +ev_view_presentation_transition_start (EvView *view) +{ + gdouble duration; + + if (!EV_IS_DOCUMENT_TRANSITION (view->document)) + return; + + ev_view_presentation_transition_stop (view); + + duration = ev_document_transition_get_page_duration (EV_DOCUMENT_TRANSITION (view->document), + view->current_page); + if (duration > 0) + view->trans_timeout_id = g_timeout_add (duration * 1000, + (GSourceFunc) transition_next_page, + view); +} + void ev_view_set_sizing_mode (EvView *view, EvSizingMode sizing_mode) @@ -4556,6 +4604,7 @@ ev_view_next_page (EvView *view) if (!view->page_cache) return FALSE; + ev_view_presentation_transition_stop (view); ev_view_reset_presentation_state (view); page = ev_page_cache_get_current_page (view->page_cache); -- cgit v0.9.1