+2005-06-14 Marco Pesenti Gritti <mpg@redhat.com>
+
+ * backend/ev-document.c: (ev_document_set_orientation):
+ * backend/ev-document.h:
+ * pdf/ev-poppler.cc:
+
+ Add orientation api. Currently poppler api is not optimal,
+ we need to set orientation every time we _get a page
+
+ * data/evince-ui.xml:
+ * shell/ev-window.c: (ev_window_cmd_edit_landscape),
+ (ev_window_cmd_edit_portrait), (ev_window_cmd_edit_flip):
+
+ Add orientation menu items
+
+ * shell/ev-page-cache.c: (ev_page_cache_clear):
+ * shell/ev-page-cache.h:
+
+ Add api to clear the cache
+
+ * shell/ev-view.c: (setup_caches), (clear_caches),
+ (ev_view_set_document), (ev_view_zoom_out),
+ (ev_view_set_orientation):
+ * shell/ev-view.h:
+
+ Implement orientation changing
+
2005-06-13 Marco Pesenti Gritti <mpg@redhat.com>
* backend/ev-document-fonts.c: (ev_document_fonts_get_progress),
return retval;
}
+void
+ev_document_set_orientation (EvDocument *document,
+ EvOrientation orientation)
+{
+ EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
+
+ iface->set_orientation (document, orientation);
+}
+
void
ev_document_info_free (EvDocumentInfo *info)
{
EV_DOCUMENT_ERROR_ENCRYPTED
} EvDocumentError;
+typedef enum
+{
+ EV_ORIENTATION_DOCUMENT,
+ EV_ORIENTATION_PORTRAIT,
+ EV_ORIENTATION_LANDSCAPE,
+ EV_ORIENTATION_UPSIDEDOWN,
+ EV_ORIENTATION_SEASCAPE
+} EvOrientation;
+
typedef struct {
double x1;
double y1;
GTypeInterface base_iface;
/* Methods */
- gboolean (* load) (EvDocument *document,
- const char *uri,
- GError **error);
- gboolean (* save) (EvDocument *document,
- const char *uri,
- GError **error);
- int (* get_n_pages) (EvDocument *document);
- void (* get_page_size) (EvDocument *document,
- int page,
- double *width,
- double *height);
- char * (* get_page_label) (EvDocument *document,
- int page);
- gboolean (* can_get_text) (EvDocument *document);
- char * (* get_text) (EvDocument *document,
- int page,
- EvRectangle *rect);
- GList * (* get_links) (EvDocument *document,
- int page);
- GdkPixbuf * (* render_pixbuf) (EvDocument *document,
- int page,
- double scale);
- EvDocumentInfo *(* get_info) (EvDocument *document);
+ gboolean (* load) (EvDocument *document,
+ const char *uri,
+ GError **error);
+ gboolean (* save) (EvDocument *document,
+ const char *uri,
+ GError **error);
+ int (* get_n_pages) (EvDocument *document);
+ void (* get_page_size) (EvDocument *document,
+ int page,
+ double *width,
+ double *height);
+ char * (* get_page_label) (EvDocument *document,
+ int page);
+ gboolean (* can_get_text) (EvDocument *document);
+ char * (* get_text) (EvDocument *document,
+ int page,
+ EvRectangle *rect);
+ GList * (* get_links) (EvDocument *document,
+ int page);
+ GdkPixbuf * (* render_pixbuf) (EvDocument *document,
+ int page,
+ double scale);
+ void (* set_orientation) (EvDocument *document,
+ EvOrientation orientation);
+ EvDocumentInfo * (* get_info) (EvDocument *document);
};
GType ev_document_get_type (void);
void ev_document_doc_mutex_lock (void);
void ev_document_doc_mutex_unlock (void);
-EvDocumentInfo *ev_document_get_info (EvDocument *document);
-gboolean ev_document_load (EvDocument *document,
- const char *uri,
- GError **error);
-gboolean ev_document_save (EvDocument *document,
- const char *uri,
- GError **error);
-int ev_document_get_n_pages (EvDocument *document);
-void ev_document_get_page_size (EvDocument *document,
- int page,
- double *width,
- double *height);
-char *ev_document_get_page_label (EvDocument *document,
- int page);
-gboolean ev_document_can_get_text (EvDocument *document);
-char *ev_document_get_text (EvDocument *document,
- int page,
- EvRectangle *rect);
-GList *ev_document_get_links (EvDocument *document,
- int page);
-GdkPixbuf *ev_document_render_pixbuf (EvDocument *document,
- int page,
- double scale);
+EvDocumentInfo *ev_document_get_info (EvDocument *document);
+gboolean ev_document_load (EvDocument *document,
+ const char *uri,
+ GError **error);
+gboolean ev_document_save (EvDocument *document,
+ const char *uri,
+ GError **error);
+int ev_document_get_n_pages (EvDocument *document);
+void ev_document_get_page_size (EvDocument *document,
+ int page,
+ double *width,
+ double *height);
+char *ev_document_get_page_label (EvDocument *document,
+ int page);
+gboolean ev_document_can_get_text (EvDocument *document);
+char *ev_document_get_text (EvDocument *document,
+ int page,
+ EvRectangle *rect);
+GList *ev_document_get_links (EvDocument *document,
+ int page);
+GdkPixbuf *ev_document_render_pixbuf (EvDocument *document,
+ int page,
+ double scale);
+void ev_document_set_orientation (EvDocument *document,
+ EvOrientation orientation);
G_END_DECLS
<menuitem name="EditFindMenu" action="EditFind"/>
<menuitem name="EditFindNextMenu" action="EditFindNext"/>
<separator/>
+ <menuitem name="EditLandscapeMenu" action="EditLandscape"/>
+ <menuitem name="EditPortraitMenu" action="EditPortrait"/>
+ <menuitem name="EditFlipMenu" action="EditFlip"/>
+ <separator/>
<menuitem name="EditToolbarMenu" action="EditToolbar"/>
</menu>
PopplerPSFile *ps_file;
gchar *password;
+ PopplerOrientation orientation;
+
PopplerFontInfo *font_info;
PopplerFontsIter *fonts_iter;
int fonts_scanned_pages;
double *width,
double *height)
{
+ PdfDocument *pdf_document = PDF_DOCUMENT (document);
PopplerPage *poppler_page;
- poppler_page = poppler_document_get_page (PDF_DOCUMENT (document)->document,
- page);
-
+ poppler_page = poppler_document_get_page (pdf_document->document, page);
+ poppler_page_set_orientation (poppler_page, pdf_document->orientation);
poppler_page_get_size (poppler_page, width, height);
}
pdf_document = PDF_DOCUMENT (document);
poppler_page = poppler_document_get_page (pdf_document->document,
page);
+ poppler_page_set_orientation (poppler_page, pdf_document->orientation);
poppler_page_get_size (poppler_page, &width_points, &height_points);
width = (int) ((width_points * scale) + 0.5);
return poppler_page_get_text (poppler_page, &r);
}
+static void
+pdf_document_set_orientation (EvDocument *document, EvOrientation orientation)
+{
+ PdfDocument *pdf_document = PDF_DOCUMENT (document);
+ PopplerOrientation poppler_orientation;
+
+ switch (orientation) {
+ case EV_ORIENTATION_DOCUMENT:
+ poppler_orientation = POPPLER_ORIENTATION_DOCUMENT;
+ break;
+ case EV_ORIENTATION_PORTRAIT:
+ poppler_orientation = POPPLER_ORIENTATION_PORTRAIT;
+ break;
+ case EV_ORIENTATION_LANDSCAPE:
+ poppler_orientation = POPPLER_ORIENTATION_LANDSCAPE;
+ break;
+ case EV_ORIENTATION_UPSIDEDOWN:
+ poppler_orientation = POPPLER_ORIENTATION_UPSIDEDOWN;
+ break;
+ case EV_ORIENTATION_SEASCAPE:
+ poppler_orientation = POPPLER_ORIENTATION_SEASCAPE;
+ break;
+ }
+
+ pdf_document->orientation = poppler_orientation;
+}
+
static void
pdf_document_document_iface_init (EvDocumentIface *iface)
{
iface->get_text = pdf_document_get_text;
iface->can_get_text = pdf_document_can_get_text;
iface->get_info = pdf_document_get_info;
+ iface->set_orientation = pdf_document_set_orientation;
};
static void
return page_cache;
}
+void
+ev_page_cache_clear (EvDocument *document)
+{
+ g_return_if_fail (EV_IS_DOCUMENT (document));
+ g_object_set_data (G_OBJECT (document), PAGE_CACHE_STRING, NULL);
+}
gboolean ev_page_cache_next_page (EvPageCache *page_cache);
gboolean ev_page_cache_prev_page (EvPageCache *page_cache);
-EvPageCache* ev_page_cache_get (EvDocument *document);
+EvPageCache *ev_page_cache_get (EvDocument *document);
+void ev_page_cache_clear (EvDocument *document);
G_END_DECLS
return view;
}
+static void
+setup_caches (EvView *view)
+{
+ view->page_cache = ev_page_cache_get (view->document);
+ g_signal_connect (view->page_cache, "page-changed", G_CALLBACK (page_changed_cb), view);
+ view->pixbuf_cache = ev_pixbuf_cache_new (view->document);
+ g_signal_connect (view->pixbuf_cache, "job-finished", G_CALLBACK (job_finished_cb), view);
+}
+
+static void
+clear_caches (EvView *view)
+{
+ if (view->pixbuf_cache) {
+ g_object_unref (view->pixbuf_cache);
+ view->pixbuf_cache = NULL;
+ }
+
+ if (view->document) {
+ ev_page_cache_clear (view->document);
+ }
+}
+
void
ev_view_set_document (EvView *view,
EvDocument *document)
}
- if (view->pixbuf_cache) {
- g_object_unref (view->pixbuf_cache);
- view->pixbuf_cache = NULL;
- }
+ clear_caches (view);
view->document = document;
view->find_page = 0;
G_CALLBACK (find_changed_cb),
view);
}
- view->page_cache = ev_page_cache_get (view->document);
- g_signal_connect (view->page_cache, "page-changed", G_CALLBACK (page_changed_cb), view);
- view->pixbuf_cache = ev_pixbuf_cache_new (view->document);
- g_signal_connect (view->pixbuf_cache, "job-finished", G_CALLBACK (job_finished_cb), view);
+
+ setup_caches (view);
}
gtk_widget_queue_resize (GTK_WIDGET (view));
ev_view_set_zoom (view, ZOOM_OUT_FACTOR, TRUE);
}
+void
+ev_view_set_orientation (EvView *view,
+ EvOrientation orientation)
+{
+ ev_document_set_orientation (view->document, orientation);
+
+ clear_caches (view);
+ setup_caches (view);
+
+ gtk_widget_queue_resize (GTK_WIDGET (view));
+}
+
static double
zoom_for_size_fit_width (int doc_width,
int doc_height,
double factor,
gboolean relative);
double ev_view_get_zoom (EvView *view);
+void ev_view_set_zoom_for_size (EvView *view,
+ int width,
+ int height,
+ int vsb_width,
+ int hsb_height);
+void ev_view_set_orientation (EvView *view,
+ EvOrientation orientation);
-void ev_view_set_zoom_for_size (EvView *view,
- int width,
- int height,
- int vsb_width,
- int hsb_height);
/* Find */
gboolean ev_view_can_find_next (EvView *view);
void ev_view_find_next (EvView *view);
gtk_widget_destroy (GTK_WIDGET (dialog));
}
+static void
+ev_window_cmd_edit_landscape (GtkAction *action, EvWindow *ev_window)
+{
+ ev_view_set_orientation (EV_VIEW (ev_window->priv->view),
+ EV_ORIENTATION_LANDSCAPE);
+}
+
+static void
+ev_window_cmd_edit_portrait (GtkAction *action, EvWindow *ev_window)
+{
+ ev_view_set_orientation (EV_VIEW (ev_window->priv->view),
+ EV_ORIENTATION_PORTRAIT);
+}
+
+static void
+ev_window_cmd_edit_flip (GtkAction *action, EvWindow *ev_window)
+{
+ ev_view_set_orientation (EV_VIEW (ev_window->priv->view),
+ EV_ORIENTATION_SEASCAPE);
+}
+
static void
ev_window_cmd_edit_toolbar (GtkAction *action, EvWindow *ev_window)
{
{ "EditToolbar", NULL, N_("T_oolbar"), NULL,
N_("Customize the toolbar"),
G_CALLBACK (ev_window_cmd_edit_toolbar) },
+ { "EditLandscape", NULL, N_("_Landscape"), NULL,
+ N_("Change the document orientation to landscape"),
+ G_CALLBACK (ev_window_cmd_edit_landscape) },
+ { "EditPortrait", NULL, N_("_Portrait"), NULL,
+ N_("Change the document orientation to portrait"),
+ G_CALLBACK (ev_window_cmd_edit_portrait) },
+ { "EditFlip", NULL, N_("_Flip"), NULL,
+ N_("Flip the document"),
+ G_CALLBACK (ev_window_cmd_edit_flip) },
/* View menu */
{ "ViewZoomIn", GTK_STOCK_ZOOM_IN, NULL, "<control>plus",