Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2005-04-05 00:40:58 (GMT)
committer Kristian Høgsberg <krh@src.gnome.org>2005-04-05 00:40:58 (GMT)
commit5e6728daa9b09a76f2537f7c848123639165cd70 (patch)
tree5025ca7e39a8b82ffecf70292de02360cf98973c
parent0278ffdb57c2e17e33acb52bb5569d746246f671 (diff)
Make searching work again.
2005-04-04 Kristian Høgsberg <krh@redhat.com> Make searching work again. * backend/ev-document.c: * backend/ev-document.h: * backend/ev-document-find.c: * backend/ev-document-find.h: Change EvDocumentIface so we no longer store the current page or zoom level in the document. The consequence is that all calls that operate on the current page now instead take the page number as an extra argument, and all coordinates are now doubles in document coordinate system. * pdf/ev-poppler.cc: * pixbuf/pixbuf-document.c: * ps/ps-document.c: Update backends accordingly.
-rw-r--r--ChangeLog17
-rw-r--r--backend/ev-document-find.c13
-rw-r--r--backend/ev-document-find.h16
-rw-r--r--backend/ev-document.c70
-rw-r--r--backend/ev-document.h57
-rw-r--r--backend/ev-jobs.c8
-rw-r--r--backend/ev-page-cache.c13
-rw-r--r--pdf/ev-poppler.cc158
-rw-r--r--pixbuf/pixbuf-document.c57
-rw-r--r--ps/ps-document.c86
-rw-r--r--shell/ev-view.c84
-rw-r--r--shell/ev-view.h1
-rw-r--r--shell/ev-window.c5
13 files changed, 226 insertions, 359 deletions
diff --git a/ChangeLog b/ChangeLog
index 3571839..ac173d3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2005-04-04 Kristian Høgsberg <krh@redhat.com>
+
+ Make searching work again.
+
+ * backend/ev-document.c:
+ * backend/ev-document.h:
+ * backend/ev-document-find.c:
+ * backend/ev-document-find.h: Change EvDocumentIface so we no
+ longer store the current page or zoom level in the document. The
+ consequence is that all calls that operate on the current page now
+ instead take the page number as an extra argument, and all
+ coordinates are now doubles in document coordinate system.
+
+ * pdf/ev-poppler.cc:
+ * pixbuf/pixbuf-document.c:
+ * ps/ps-document.c: Update backends accordingly.
+
2005-04-04 Marco Pesenti Gritti <marco@gnome.org>
* autogen.sh:
diff --git a/backend/ev-document-find.c b/backend/ev-document-find.c
index 5c1fbe4..1be43b9 100644
--- a/backend/ev-document-find.c
+++ b/backend/ev-document-find.c
@@ -68,6 +68,7 @@ ev_document_find_base_init (gpointer g_class)
void
ev_document_find_begin (EvDocumentFind *document_find,
+ int page,
const char *search_string,
gboolean case_sensitive)
{
@@ -75,7 +76,7 @@ ev_document_find_begin (EvDocumentFind *document_find,
g_return_if_fail (search_string != NULL);
- iface->begin (document_find, search_string, case_sensitive);
+ iface->begin (document_find, page, search_string, case_sensitive);
}
void
@@ -94,19 +95,21 @@ ev_document_find_page_has_results (EvDocumentFind *document_find,
}
int
-ev_document_find_get_n_results (EvDocumentFind *document_find)
+ev_document_find_get_n_results (EvDocumentFind *document_find,
+ int page)
{
EvDocumentFindIface *iface = EV_DOCUMENT_FIND_GET_IFACE (document_find);
- return iface->get_n_results (document_find);
+ return iface->get_n_results (document_find, page);
}
gboolean
ev_document_find_get_result (EvDocumentFind *document_find,
+ int page,
int n_result,
- GdkRectangle *rectangle)
+ EvRectangle *rectangle)
{
EvDocumentFindIface *iface = EV_DOCUMENT_FIND_GET_IFACE (document_find);
- return iface->get_result (document_find, n_result, rectangle);
+ return iface->get_result (document_find, page, n_result, rectangle);
}
double
diff --git a/backend/ev-document-find.h b/backend/ev-document-find.h
index 49c3672..f365df1 100644
--- a/backend/ev-document-find.h
+++ b/backend/ev-document-find.h
@@ -26,6 +26,8 @@
#include <glib.h>
#include <gdk/gdk.h>
+#include "ev-document.h" /* For EvRectangle */
+
G_BEGIN_DECLS
#define EV_TYPE_DOCUMENT_FIND (ev_document_find_get_type ())
@@ -45,15 +47,18 @@ struct _EvDocumentFindIface
/* Methods */
void (* begin) (EvDocumentFind *document_find,
+ int page,
const char *search_string,
gboolean case_sensitive);
void (* cancel) (EvDocumentFind *document_find);
int (* page_has_results) (EvDocumentFind *document_find,
int page);
- int (* get_n_results) (EvDocumentFind *document_find);
+ int (* get_n_results) (EvDocumentFind *document_find,
+ int page);
gboolean (* get_result) (EvDocumentFind *document_find,
+ int page,
int n_result,
- GdkRectangle *rectangle);
+ EvRectangle *rectangle);
double (* get_progress) (EvDocumentFind *document_find);
/* Signals */
@@ -64,15 +69,18 @@ struct _EvDocumentFindIface
GType ev_document_find_get_type (void);
void ev_document_find_begin (EvDocumentFind *document_find,
+ int page,
const char *search_string,
gboolean case_sensitive);
void ev_document_find_cancel (EvDocumentFind *document_find);
int ev_document_find_page_has_results (EvDocumentFind *document_find,
int page);
-int ev_document_find_get_n_results (EvDocumentFind *document_find);
+int ev_document_find_get_n_results (EvDocumentFind *document_find,
+ int page);
gboolean ev_document_find_get_result (EvDocumentFind *document_find,
+ int page,
int n_result,
- GdkRectangle *rectangle);
+ EvRectangle *rectangle);
double ev_document_find_get_progress (EvDocumentFind *document_find);
void ev_document_find_changed (EvDocumentFind *document_find,
int page);
diff --git a/backend/ev-document.c b/backend/ev-document.c
index d4d6f20..aa61fc6 100644
--- a/backend/ev-document.c
+++ b/backend/ev-document.c
@@ -158,42 +158,10 @@ ev_document_get_n_pages (EvDocument *document)
}
void
-ev_document_set_page (EvDocument *document,
- int page)
-{
- EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
-
- LOG ("ev_document_set_page");
- iface->set_page (document, page);
-}
-
-int
-ev_document_get_page (EvDocument *document)
-{
- EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
- int retval;
-
- LOG ("ev_document_get_page");
- retval = iface->get_page (document);
-
- return retval;
-}
-
-void
-ev_document_set_scale (EvDocument *document,
- double scale)
-{
- EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
-
- LOG ("ev_document_set_scale");
- iface->set_scale (document, scale);
-}
-
-void
ev_document_get_page_size (EvDocument *document,
int page,
- int *width,
- int *height)
+ double *width,
+ double *height)
{
EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
@@ -215,36 +183,22 @@ ev_document_get_page_label(EvDocument *document,
}
char *
-ev_document_get_text (EvDocument *document,
- GdkRectangle *rect)
+ev_document_get_text (EvDocument *document,
+ int page,
+ EvRectangle *rect)
{
EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
char *retval;
LOG ("ev_document_get_text");
- retval = iface->get_text (document, rect);
-
- return retval;
-}
-
-EvLink *
-ev_document_get_link (EvDocument *document,
- int x,
- int y)
-{
- EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
- EvLink *retval;
-
- LOG ("ev_document_get_link");
- if (iface->get_link == NULL)
- return NULL;
- retval = iface->get_link (document, x, y);
+ retval = iface->get_text (document, page, rect);
return retval;
}
GList *
-ev_document_get_links (EvDocument *document)
+ev_document_get_links (EvDocument *document,
+ int page)
{
EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
GList *retval;
@@ -252,7 +206,7 @@ ev_document_get_links (EvDocument *document)
LOG ("ev_document_get_link");
if (iface->get_links == NULL)
return NULL;
- retval = iface->get_links (document);
+ retval = iface->get_links (document, page);
return retval;
}
@@ -260,7 +214,9 @@ ev_document_get_links (EvDocument *document)
GdkPixbuf *
-ev_document_render_pixbuf (EvDocument *document)
+ev_document_render_pixbuf (EvDocument *document,
+ int page,
+ double scale)
{
EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
GdkPixbuf *retval;
@@ -268,7 +224,7 @@ ev_document_render_pixbuf (EvDocument *document)
LOG ("ev_document_render_pixbuf");
g_assert (iface->render_pixbuf);
- retval = iface->render_pixbuf (document);
+ retval = iface->render_pixbuf (document, page, scale);
return retval;
}
diff --git a/backend/ev-document.h b/backend/ev-document.h
index e5c91b7..743b947 100644
--- a/backend/ev-document.h
+++ b/backend/ev-document.h
@@ -54,14 +54,17 @@ typedef enum
EV_DOCUMENT_ERROR_ENCRYPTED
} EvDocumentError;
+typedef struct {
+ double x1;
+ double y1;
+ double x2;
+ double y2;
+} EvRectangle;
+
struct _EvDocumentIface
{
GTypeInterface base_iface;
- /* Signals */
- void (* page_changed) (EvDocument *document);
- void (* scale_changed) (EvDocument *document);
-
/* Methods */
gboolean (* load) (EvDocument *document,
const char *uri,
@@ -70,24 +73,20 @@ struct _EvDocumentIface
const char *uri,
GError **error);
int (* get_n_pages) (EvDocument *document);
- void (* set_page) (EvDocument *document,
- int page);
- int (* get_page) (EvDocument *document);
- void (* set_scale) (EvDocument *document,
- double scale);
void (* get_page_size) (EvDocument *document,
int page,
- int *width,
- int *height);
+ double *width,
+ double *height);
char * (* get_page_label) (EvDocument *document,
int page);
char * (* get_text) (EvDocument *document,
- GdkRectangle *rect);
- EvLink * (* get_link) (EvDocument *document,
- int x,
- int y);
- GList * (* get_links) (EvDocument *document);
- GdkPixbuf * (* render_pixbuf) (EvDocument *document);
+ int page,
+ EvRectangle *rect);
+ GList * (* get_links) (EvDocument *document,
+ int page);
+ GdkPixbuf * (* render_pixbuf) (EvDocument *document,
+ int page,
+ double scale);
};
GType ev_document_get_type (void);
@@ -104,24 +103,20 @@ gboolean ev_document_save (EvDocument *document,
GError **error);
char *ev_document_get_title (EvDocument *document);
int ev_document_get_n_pages (EvDocument *document);
-void ev_document_set_page (EvDocument *document,
- int page);
-int ev_document_get_page (EvDocument *document);
-void ev_document_set_scale (EvDocument *document,
- double scale);
void ev_document_get_page_size (EvDocument *document,
int page,
- int *width,
- int *height);
+ double *width,
+ double *height);
char *ev_document_get_page_label(EvDocument *document,
- int page);
+ int page);
char *ev_document_get_text (EvDocument *document,
- GdkRectangle *rect);
-EvLink *ev_document_get_link (EvDocument *document,
- int x,
- int y);
-GList *ev_document_get_links (EvDocument *document);
-GdkPixbuf *ev_document_render_pixbuf (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);
G_END_DECLS
diff --git a/backend/ev-jobs.c b/backend/ev-jobs.c
index 8265aeb..0a5f69f 100644
--- a/backend/ev-jobs.c
+++ b/backend/ev-jobs.c
@@ -206,11 +206,11 @@ ev_job_render_run (EvJobRender *job)
g_mutex_lock (EV_DOC_MUTEX);
- ev_document_set_page (EV_JOB (job)->document, job->page);
- ev_document_set_scale (EV_JOB (job)->document, job->scale);
- job->pixbuf = ev_document_render_pixbuf (EV_JOB (job)->document);
+ job->pixbuf = ev_document_render_pixbuf (EV_JOB (job)->document,
+ job->page,
+ job->scale);
if (job->include_links)
- job->link_mapping = ev_document_get_links (EV_JOB (job)->document);
+ job->link_mapping = ev_document_get_links (EV_JOB (job)->document, job->page);
EV_JOB (job)->finished = TRUE;
g_mutex_unlock (EV_DOC_MUTEX);
diff --git a/backend/ev-page-cache.c b/backend/ev-page-cache.c
index 08d1be4..7960cb4 100644
--- a/backend/ev-page-cache.c
+++ b/backend/ev-page-cache.c
@@ -5,8 +5,8 @@
typedef struct _EvPageCacheInfo
{
- gint width;
- gint height;
+ double width;
+ double height;
}
EvPageCacheInfo;
@@ -21,8 +21,8 @@ struct _EvPageCache
char **page_labels;
gboolean uniform;
- gint uniform_width;
- gint uniform_height;
+ double uniform_width;
+ double uniform_height;
EvPageCacheInfo *size_cache;
};
@@ -105,10 +105,9 @@ _ev_page_cache_new (EvDocument *document)
page_cache->title = ev_document_get_title (document);
page_cache->page_labels = g_new0 (char *, page_cache->n_pages);
- ev_document_set_scale (document, 1.0);
for (i = 0; i < page_cache->n_pages; i++) {
- gint page_width = 0;
- gint page_height = 0;
+ double page_width = 0;
+ double page_height = 0;
ev_document_get_page_size (document, i, &page_width, &page_height);
page_cache->page_labels[i] = ev_document_get_page_label (document, i);
diff --git a/pdf/ev-poppler.cc b/pdf/ev-poppler.cc
index e1ce95a..7fcc9c0 100644
--- a/pdf/ev-poppler.cc
+++ b/pdf/ev-poppler.cc
@@ -58,8 +58,6 @@ struct _PdfDocument
GObject parent_instance;
PopplerDocument *document;
- PopplerPage *page;
- double scale;
gchar *password;
PdfDocumentSearch *search;
@@ -133,8 +131,6 @@ pdf_document_class_init (PdfDocumentClass *klass)
static void
pdf_document_init (PdfDocument *pdf_document)
{
- pdf_document->page = NULL;
- pdf_document->scale = 1.0;
pdf_document->password = NULL;
}
@@ -209,84 +205,28 @@ pdf_document_get_n_pages (EvDocument *document)
}
static void
-pdf_document_set_page (EvDocument *document,
- int page)
-{
- page = CLAMP (page, 0, poppler_document_get_n_pages (PDF_DOCUMENT (document)->document) - 1);
-
- PDF_DOCUMENT (document)->page = poppler_document_get_page (PDF_DOCUMENT (document)->document, page);
-}
-
-static int
-pdf_document_get_page (EvDocument *document)
-{
- PdfDocument *pdf_document;
-
- pdf_document = PDF_DOCUMENT (document);
-
- if (pdf_document->page)
- return poppler_page_get_index (pdf_document->page);
-
- return 1;
-}
-
-static void
-pdf_document_set_scale (EvDocument *document,
- double scale)
-{
- PDF_DOCUMENT (document)->scale = scale;
-}
-
-
-static void
-get_size_from_page (PopplerPage *poppler_page,
- double scale,
- int *width,
- int *height)
-{
- gdouble width_d, height_d;
- poppler_page_get_size (poppler_page, &width_d, &height_d);
- if (width)
- *width = (int) (width_d * scale);
- if (height)
- *height = (int) (height_d * scale);
-
-}
-
-static void
pdf_document_get_page_size (EvDocument *document,
int page,
- int *width,
- int *height)
+ double *width,
+ double *height)
{
- PopplerPage *poppler_page = NULL;
-
- if (page == -1)
- poppler_page = PDF_DOCUMENT (document)->page;
- else
- poppler_page = poppler_document_get_page (PDF_DOCUMENT (document)->document,
- page);
+ PopplerPage *poppler_page;
- if (poppler_page == NULL)
- poppler_document_get_page (PDF_DOCUMENT (document)->document, 0);
+ poppler_page = poppler_document_get_page (PDF_DOCUMENT (document)->document,
+ page);
- get_size_from_page (poppler_page,
- PDF_DOCUMENT (document)->scale,
- width, height);
+ poppler_page_get_size (poppler_page, width, height);
}
static char *
pdf_document_get_page_label (EvDocument *document,
int page)
{
- PopplerPage *poppler_page = NULL;
+ PopplerPage *poppler_page;
char *label = NULL;
- if (page == -1)
- poppler_page = PDF_DOCUMENT (document)->page;
- else
- poppler_page = poppler_document_get_page (PDF_DOCUMENT (document)->document,
- page);
+ poppler_page = poppler_document_get_page (PDF_DOCUMENT (document)->document,
+ page);
g_object_get (poppler_page,
"label", &label,
@@ -296,19 +236,21 @@ pdf_document_get_page_label (EvDocument *document,
}
static GList *
-pdf_document_get_links (EvDocument *document)
+pdf_document_get_links (EvDocument *document,
+ int page)
{
PdfDocument *pdf_document;
+ PopplerPage *poppler_page;
GList *retval = NULL;
GList *mapping_list;
GList *list;
- gint height;
+ double height;
pdf_document = PDF_DOCUMENT (document);
- g_return_val_if_fail (pdf_document->page != NULL, NULL);
-
- mapping_list = poppler_page_get_link_mapping (pdf_document->page);
- get_size_from_page (pdf_document->page, 1.0, NULL, &height);
+ poppler_page = poppler_document_get_page (pdf_document->document,
+ page);
+ mapping_list = poppler_page_get_link_mapping (poppler_page);
+ poppler_page_get_size (poppler_page, NULL, &height);
for (list = mapping_list; list; list = list->next) {
PopplerLinkMapping *link_mapping;
@@ -333,27 +275,32 @@ pdf_document_get_links (EvDocument *document)
static GdkPixbuf *
-pdf_document_render_pixbuf (EvDocument *document)
+pdf_document_render_pixbuf (EvDocument *document,
+ int page,
+ double scale)
{
PdfDocument *pdf_document;
+ PopplerPage *poppler_page;
GdkPixbuf *pixbuf;
+ double width_points, height_points;
gint width, height;
pdf_document = PDF_DOCUMENT (document);
- g_return_val_if_fail (pdf_document->page != NULL, NULL);
+ poppler_page = poppler_document_get_page (pdf_document->document,
+ page);
- get_size_from_page (pdf_document->page,
- pdf_document->scale,
- &width, &height);
+ poppler_page_get_size (poppler_page, &width_points, &height_points);
+ width = (int) ceil (width_points * scale);
+ height = (int) ceil (height_points * scale);
pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
FALSE, 8,
width, height);
- poppler_page_render_to_pixbuf (pdf_document->page,
+ poppler_page_render_to_pixbuf (poppler_page,
0, 0,
width, height,
- pdf_document->scale,
+ scale,
pixbuf,
0, 0);
@@ -389,9 +336,6 @@ pdf_document_document_iface_init (EvDocumentIface *iface)
iface->save = pdf_document_save;
iface->load = pdf_document_load;
iface->get_n_pages = pdf_document_get_n_pages;
- iface->set_page = pdf_document_set_page;
- iface->get_page = pdf_document_get_page;
- iface->set_scale = pdf_document_set_scale;
iface->get_page_size = pdf_document_get_page_size;
iface->get_page_label = pdf_document_get_page_label;
iface->get_links = pdf_document_get_links;
@@ -599,10 +543,9 @@ pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnail
has_thumb = poppler_page_get_thumbnail_size (poppler_page, width, height);
if (!has_thumb) {
- int page_width, page_height;
-
- get_size_from_page (poppler_page, 1.0, &page_width, &page_height);
+ double page_width, page_height;
+ poppler_page_get_size (poppler_page, &page_width, &page_height);
if (page_width > page_height) {
*width = size;
*height = (int) (size * page_height / page_width);
@@ -640,8 +583,7 @@ pdf_document_search_idle_callback (void *data)
search->pages[search->search_page] = matches;
n_pages = pdf_document_get_n_pages (EV_DOCUMENT (search->document));
- changed_page = search->start_page;
-
+ changed_page = search->search_page;
search->search_page += 1;
if (search->search_page == n_pages) {
/* wrap around */
@@ -661,7 +603,9 @@ pdf_document_search_idle_callback (void *data)
static PdfDocumentSearch *
-pdf_document_search_new (PdfDocument *pdf_document, const char *text)
+pdf_document_search_new (PdfDocument *pdf_document,
+ int start_page,
+ const char *text)
{
PdfDocumentSearch *search;
int n_pages;
@@ -685,8 +629,8 @@ pdf_document_search_new (PdfDocument *pdf_document, const char *text)
search,
NULL);
- search->start_page = pdf_document_get_page (EV_DOCUMENT (pdf_document));
- search->search_page = search->start_page;
+ search->start_page = start_page;
+ search->search_page = start_page;
return search;
}
@@ -712,6 +656,7 @@ pdf_document_search_free (PdfDocumentSearch *search)
static void
pdf_document_find_begin (EvDocumentFind *document,
+ int page,
const char *search_string,
gboolean case_sensitive)
{
@@ -730,19 +675,18 @@ pdf_document_find_begin (EvDocumentFind *document,
pdf_document_search_free (pdf_document->search);
pdf_document->search = pdf_document_search_new (pdf_document,
+ page,
search_string);
}
int
-pdf_document_find_get_n_results (EvDocumentFind *document_find)
+pdf_document_find_get_n_results (EvDocumentFind *document_find, int page)
{
PdfDocumentSearch *search = PDF_DOCUMENT (document_find)->search;
int current_page;
- current_page = pdf_document_get_page (EV_DOCUMENT (document_find));
-
if (search) {
- return g_list_length (search->pages[current_page]);
+ return g_list_length (search->pages[page]);
} else {
return 0;
}
@@ -750,29 +694,31 @@ pdf_document_find_get_n_results (EvDocumentFind *document_find)
gboolean
pdf_document_find_get_result (EvDocumentFind *document_find,
+ int page,
int n_result,
- GdkRectangle *rectangle)
+ EvRectangle *rectangle)
{
PdfDocument *pdf_document = PDF_DOCUMENT (document_find);
PdfDocumentSearch *search = pdf_document->search;
+ PopplerPage *poppler_page;
PopplerRectangle *r;
int current_page;
- double scale;
+ double scale, height;
if (search == NULL)
return FALSE;
- current_page = pdf_document_get_page (EV_DOCUMENT (pdf_document));
- r = (PopplerRectangle *) g_list_nth_data (search->pages[current_page],
+ r = (PopplerRectangle *) g_list_nth_data (search->pages[page],
n_result);
if (r == NULL)
return FALSE;
- scale = pdf_document->scale;
- rectangle->x = (gint) floor (r->x1 * scale);
- rectangle->y = (gint) floor (r->y1 * scale);
- rectangle->width = (gint) ceil (r->x2 * scale) - rectangle->x;
- rectangle->height = (gint) ceil (r->y2 * scale) - rectangle->y;
+ poppler_page = poppler_document_get_page (pdf_document->document, page);
+ poppler_page_get_size (poppler_page, NULL, &height);
+ rectangle->x1 = r->x1;
+ rectangle->y1 = height - r->y2;
+ rectangle->x2 = r->x2;
+ rectangle->y2 = height - r->y1;
return TRUE;
}
diff --git a/pixbuf/pixbuf-document.c b/pixbuf/pixbuf-document.c
index c728ed0..b83da78 100644
--- a/pixbuf/pixbuf-document.c
+++ b/pixbuf/pixbuf-document.c
@@ -36,7 +36,6 @@ struct _PixbufDocument
GdkPixbuf *pixbuf;
GdkDrawable *target;
- gdouble scale;
gint x_offset, y_offset;
};
@@ -94,48 +93,29 @@ pixbuf_document_get_n_pages (EvDocument *document)
}
static void
-pixbuf_document_set_page (EvDocument *document,
- int page)
-{
- /* Do nothing */
-}
-
-static int
-pixbuf_document_get_page (EvDocument *document)
-{
- return 1;
-}
-
-static void
-pixbuf_document_set_scale (EvDocument *document,
- double scale)
-{
- PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
-
- pixbuf_document->scale = scale;
-}
-
-static void
pixbuf_document_get_page_size (EvDocument *document,
int page,
- int *width,
- int *height)
+ double *width,
+ double *height)
{
PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
if (width)
- *width = gdk_pixbuf_get_width (pixbuf_document->pixbuf) * pixbuf_document->scale;
+ *width = gdk_pixbuf_get_width (pixbuf_document->pixbuf);
if (height)
- *height = gdk_pixbuf_get_height (pixbuf_document->pixbuf) * pixbuf_document->scale;
+ *height = gdk_pixbuf_get_height (pixbuf_document->pixbuf);
+
+ printf ("get_page_size, page=%d, *width=%f, *height=%f\n",
+ page, *width, *height);
}
static GdkPixbuf*
-pixbuf_document_render_pixbuf (EvDocument *document)
+pixbuf_document_render_pixbuf (EvDocument *document, int page, double scale)
{
PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
return gdk_pixbuf_scale_simple (pixbuf_document->pixbuf,
- gdk_pixbuf_get_width (pixbuf_document->pixbuf) * pixbuf_document->scale,
- gdk_pixbuf_get_height (pixbuf_document->pixbuf) * pixbuf_document->scale,
+ gdk_pixbuf_get_width (pixbuf_document->pixbuf) * scale,
+ gdk_pixbuf_get_height (pixbuf_document->pixbuf) * scale,
GDK_INTERP_BILINEAR);
}
@@ -190,33 +170,20 @@ pixbuf_document_class_init (PixbufDocumentClass *klass)
}
static char *
-pixbuf_document_get_text (EvDocument *document, GdkRectangle *rect)
+pixbuf_document_get_text (EvDocument *document, int page, EvRectangle *rect)
{
/* FIXME this method should not be in EvDocument */
g_warning ("pixbuf_document_get_text not implemented");
return NULL;
}
-
-static EvLink *
-pixbuf_document_get_link (EvDocument *document,
- int x,
- int y)
-{
- return NULL;
-}
-
static void
pixbuf_document_document_iface_init (EvDocumentIface *iface)
{
iface->load = pixbuf_document_load;
iface->save = pixbuf_document_save;
iface->get_text = pixbuf_document_get_text;
- iface->get_link = pixbuf_document_get_link;
iface->get_n_pages = pixbuf_document_get_n_pages;
- iface->set_page = pixbuf_document_set_page;
- iface->get_page = pixbuf_document_get_page;
- iface->set_scale = pixbuf_document_set_scale;
iface->get_page_size = pixbuf_document_get_page_size;
iface->render_pixbuf = pixbuf_document_render_pixbuf;
}
@@ -269,8 +236,6 @@ pixbuf_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface
static void
pixbuf_document_init (PixbufDocument *pixbuf_document)
{
- pixbuf_document->scale = 1.0;
-
pixbuf_document->x_offset = 0;
pixbuf_document->y_offset = 0;
}
diff --git a/ps/ps-document.c b/ps/ps-document.c
index 4b2d4c4..20d55c4 100644
--- a/ps/ps-document.c
+++ b/ps/ps-document.c
@@ -82,6 +82,12 @@ struct record_list {
struct record_list *next;
};
+typedef struct {
+ int page;
+ double scale;
+ PSDocument *document;
+} PSRenderJob;
+
static gboolean broken_pipe = FALSE;
/* Forward declarations */
@@ -381,7 +387,7 @@ setup_pixmap (PSDocument *gs)
}
static void
-setup_page (PSDocument *gs)
+setup_page (PSDocument *gs, double scale)
{
char buf[1024];
#ifdef HAVE_LOCALE_H
@@ -400,8 +406,8 @@ setup_page (PSDocument *gs)
g_snprintf (buf, 1024, "%ld %d %d %d %d %d %f %f %d %d %d %d",
0L, gs->orientation * 90, gs->llx, gs->lly, gs->urx, gs->ury,
- get_xdpi (gs) * gs->zoom_factor,
- get_ydpi (gs) * gs->zoom_factor,
+ get_xdpi (gs) * scale,
+ get_ydpi (gs) * scale,
0, 0, 0, 0);
LOG ("GS property %s", buf);
@@ -1106,7 +1112,7 @@ ps_document_next_page (PSDocument *gs)
}
static gboolean
-render_page (PSDocument *gs)
+render_page (PSDocument *gs, int page)
{
g_return_val_if_fail(gs != NULL, FALSE);
g_return_val_if_fail(PS_IS_DOCUMENT(gs), FALSE);
@@ -1126,8 +1132,8 @@ render_page (PSDocument *gs)
send_ps (gs, gs->doc->beginsetup, gs->doc->lensetup, FALSE);
}
- send_ps (gs, gs->doc->pages[gs->current_page].begin,
- gs->doc->pages[gs->current_page].len, FALSE);
+ send_ps (gs, gs->doc->pages[page].begin,
+ gs->doc->pages[page].len, FALSE);
} else {
/* Unstructured document
*
@@ -1199,47 +1205,17 @@ ps_document_get_n_pages (EvDocument *document)
}
static void
-ps_document_set_page (EvDocument *document,
- int page)
-{
- PSDocument *gs = PS_DOCUMENT (document);
-
- LOG ("Set document page %d\n", page);
-
- gs->current_page = page;
- compute_dimensions (gs, page);
-}
-
-static int
-ps_document_get_page (EvDocument *document)
-{
- PSDocument *ps = PS_DOCUMENT (document);
-
- g_return_val_if_fail (ps != NULL, -1);
-
- return ps->current_page;
-}
-
-static void
-ps_document_set_scale (EvDocument *document,
- double scale)
-{
- PSDocument *gs = PS_DOCUMENT (document);
-
- gs->zoom_factor = scale;
- compute_dimensions (gs, gs->current_page);
-}
-
-static void
ps_document_get_page_size (EvDocument *document,
int page,
- int *width,
- int *height)
+ double *width,
+ double *height)
{
/* Post script documents never vary in size */
PSDocument *gs = PS_DOCUMENT (document);
+ compute_dimensions (gs, page);
+
if (width) {
*width = gs->width;
}
@@ -1250,24 +1226,16 @@ ps_document_get_page_size (EvDocument *document,
}
static char *
-ps_document_get_text (EvDocument *document, GdkRectangle *rect)
+ps_document_get_text (EvDocument *document, int page, EvRectangle *rect)
{
g_warning ("ps_document_get_text not implemented"); /* FIXME ? */
return NULL;
}
-static EvLink *
-ps_document_get_link (EvDocument *document,
- int x,
- int y)
-{
- return NULL;
-}
-
static gboolean
-render_pixbuf_idle (EvDocument *document)
+render_pixbuf_idle (PSRenderJob *job)
{
- PSDocument *gs = PS_DOCUMENT (document);
+ PSDocument *gs = job->document;
if (gs->pstarget == NULL) {
GtkWidget *widget;
@@ -1286,21 +1254,25 @@ render_pixbuf_idle (EvDocument *document)
if (gs->changed) {
stop_interpreter (gs);
setup_pixmap (gs);
- setup_page (gs);
+ setup_page (gs, job->scale);
gs->changed = FALSE;
}
- render_page (PS_DOCUMENT (document));
+ render_page (gs, job->page);
return FALSE;
}
static GdkPixbuf *
-ps_document_render_pixbuf (EvDocument *document)
+ps_document_render_pixbuf (EvDocument *document, int page, double scale)
{
GdkPixbuf *pixbuf;
+ PSRenderJob job;
- g_idle_add ((GSourceFunc)render_pixbuf_idle, document);
+ job.page = page;
+ job.scale = scale;
+ job.document = PS_DOCUMENT (document);
+ g_idle_add ((GSourceFunc)render_pixbuf_idle, &job);
g_mutex_lock (pixbuf_mutex);
while (!current_pixbuf)
@@ -1320,11 +1292,7 @@ ps_document_document_iface_init (EvDocumentIface *iface)
iface->load = ps_document_load;
iface->save = ps_document_save;
iface->get_text = ps_document_get_text;
- iface->get_link = ps_document_get_link;
iface->get_n_pages = ps_document_get_n_pages;
- iface->set_page = ps_document_set_page;
- iface->get_page = ps_document_get_page;
- iface->set_scale = ps_document_set_scale;
iface->get_page_size = ps_document_get_page_size;
iface->render_pixbuf = ps_document_render_pixbuf;
}
diff --git a/shell/ev-view.c b/shell/ev-view.c
index 29c85f4..2db1317 100644
--- a/shell/ev-view.c
+++ b/shell/ev-view.c
@@ -18,6 +18,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
+#include <math.h>
#include <gtk/gtkalignment.h>
#include <glib/gi18n.h>
#include <gtk/gtkbindings.h>
@@ -94,7 +95,7 @@ struct _EvView {
gboolean pressed_button;
gboolean has_selection;
GdkPoint selection_start;
- GdkRectangle selection;
+ EvRectangle selection;
EvViewCursor cursor;
GtkAdjustment *hadjustment;
@@ -257,27 +258,27 @@ ev_view_get_offsets (EvView *view, int *x_offset, int *y_offset)
}
static void
-view_rect_to_doc_rect (EvView *view, GdkRectangle *view_rect, GdkRectangle *doc_rect)
+view_rect_to_doc_rect (EvView *view, GdkRectangle *view_rect, EvRectangle *doc_rect)
{
int x_offset, y_offset;
ev_view_get_offsets (view, &x_offset, &y_offset);
- doc_rect->x = (view_rect->x - x_offset) / view->scale;
- doc_rect->y = (view_rect->y - y_offset) / view->scale;
- doc_rect->width = view_rect->width / view->scale;
- doc_rect->height = view_rect->height / view->scale;
+ doc_rect->x1 = (double) (view_rect->x - x_offset) / view->scale;
+ doc_rect->y1 = (double) (view_rect->y - y_offset) / view->scale;
+ doc_rect->x2 = doc_rect->x1 + (double) view_rect->width / view->scale;
+ doc_rect->y2 = doc_rect->y1 + (double) view_rect->height / view->scale;
}
static void
-doc_rect_to_view_rect (EvView *view, GdkRectangle *doc_rect, GdkRectangle *view_rect)
+doc_rect_to_view_rect (EvView *view, EvRectangle *doc_rect, GdkRectangle *view_rect)
{
int x_offset, y_offset;
ev_view_get_offsets (view, &x_offset, &y_offset);
- view_rect->x = doc_rect->x * view->scale + x_offset;
- view_rect->y = doc_rect->y * view->scale + y_offset;
- view_rect->width = doc_rect->width * view->scale;
- view_rect->height = doc_rect->height * view->scale;
+ view_rect->x = floor (doc_rect->x1 * view->scale) + x_offset;
+ view_rect->y = floor (doc_rect->y1 * view->scale) + y_offset;
+ view_rect->width = ceil (doc_rect->x2 * view->scale) + x_offset - view_rect->x;
+ view_rect->height = ceil (doc_rect->y2 * view->scale) + y_offset - view_rect->y;
}
@@ -436,9 +437,6 @@ draw_rubberband (GtkWidget *widget, GdkWindow *window,
GdkPixbuf *pixbuf;
GdkColor *fill_color_gdk;
guint fill_color;
- int x_offset, y_offset;
-
- ev_view_get_offsets (EV_VIEW (widget), &x_offset, &y_offset);
fill_color_gdk = gdk_color_copy (&GTK_WIDGET (widget)->style->base[GTK_STATE_SELECTED]);
fill_color = ev_gdk_color_to_rgb (fill_color_gdk) << 8 | alpha;
@@ -449,7 +447,7 @@ draw_rubberband (GtkWidget *widget, GdkWindow *window,
gdk_draw_pixbuf (window, NULL, pixbuf,
0, 0,
- rect->x + x_offset, rect->y + y_offset,
+ rect->x, rect->y,
rect->width, rect->height,
GDK_RGB_DITHER_NONE,
0, 0);
@@ -459,7 +457,7 @@ draw_rubberband (GtkWidget *widget, GdkWindow *window,
gc = gdk_gc_new (window);
gdk_gc_set_rgb_fg_color (gc, fill_color_gdk);
gdk_draw_rectangle (window, gc, FALSE,
- rect->x + x_offset, rect->y + y_offset,
+ rect->x, rect->y,
rect->width - 1,
rect->height - 1);
g_object_unref (gc);
@@ -478,19 +476,22 @@ highlight_find_results (EvView *view)
find = EV_DOCUMENT_FIND (view->document);
g_mutex_lock (EV_DOC_MUTEX);
- results = ev_document_find_get_n_results (find);
+ results = ev_document_find_get_n_results (find, view->current_page);
g_mutex_unlock (EV_DOC_MUTEX);
for (i = 0; i < results; i++) {
- GdkRectangle rectangle;
+ EvRectangle rectangle;
+ GdkRectangle view_rectangle;
guchar alpha;
alpha = (i == view->find_result) ? 0x90 : 0x20;
g_mutex_lock (EV_DOC_MUTEX);
- ev_document_find_get_result (find, i, &rectangle);
+ ev_document_find_get_result (find, view->current_page,
+ i, &rectangle);
g_mutex_unlock (EV_DOC_MUTEX);
+ doc_rect_to_view_rect (view, &rectangle, &view_rectangle);
draw_rubberband (GTK_WIDGET (view), view->bin_window,
- &rectangle, alpha);
+ &view_rectangle, alpha);
}
}
@@ -617,12 +618,12 @@ void
ev_view_copy (EvView *ev_view)
{
GtkClipboard *clipboard;
- GdkRectangle selection;
char *text;
- doc_rect_to_view_rect (ev_view, &ev_view->selection, &selection);
g_mutex_lock (EV_DOC_MUTEX);
- text = ev_document_get_text (ev_view->document, &selection);
+ text = ev_document_get_text (ev_view->document,
+ ev_view->current_page,
+ &ev_view->selection);
g_mutex_unlock (EV_DOC_MUTEX);
clipboard = gtk_widget_get_clipboard (GTK_WIDGET (ev_view),
@@ -638,12 +639,12 @@ ev_view_primary_get_cb (GtkClipboard *clipboard,
gpointer data)
{
EvView *ev_view = EV_VIEW (data);
- GdkRectangle selection;
char *text;
- doc_rect_to_view_rect (ev_view, &ev_view->selection, &selection);
g_mutex_lock (EV_DOC_MUTEX);
- text = ev_document_get_text (ev_view->document, &selection);
+ text = ev_document_get_text (ev_view->document,
+ ev_view->current_page,
+ &ev_view->selection);
g_mutex_unlock (EV_DOC_MUTEX);
gtk_selection_data_set_text (selection_data, text, -1);
}
@@ -1207,12 +1208,13 @@ update_find_status_message (EvView *view)
char *message;
// g_mutex_lock (EV_DOC_MUTEX);
- if (ev_document_get_page (view->document) == view->find_page) {
+ if (view->current_page == view->find_page) {
int results;
// g_mutex_lock (EV_DOC_MUTEX);
results = ev_document_find_get_n_results
- (EV_DOCUMENT_FIND (view->document));
+ (EV_DOCUMENT_FIND (view->document),
+ view->current_page);
// g_mutex_unlock (EV_DOC_MUTEX);
/* TRANS: Sometimes this could be better translated as
"%d hit(s) on this page". Therefore this string
@@ -1280,20 +1282,22 @@ static void
jump_to_find_result (EvView *view)
{
EvDocumentFind *find = EV_DOCUMENT_FIND (view->document);
- GdkRectangle rect;
+ EvRectangle rect;
+ GdkRectangle view_rect;
int n_results;
g_mutex_lock (EV_DOC_MUTEX);
- n_results = ev_document_find_get_n_results (find);
+ n_results = ev_document_find_get_n_results (find, view->current_page);
g_mutex_unlock (EV_DOC_MUTEX);
if (n_results > view->find_result) {
g_mutex_lock (EV_DOC_MUTEX);
ev_document_find_get_result
- (find, view->find_result, &rect);
+ (find, view->current_page, view->find_result, &rect);
g_mutex_unlock (EV_DOC_MUTEX);
- ensure_rectangle_is_visible (view, &rect);
+ doc_rect_to_view_rect (view, &rect, &view_rect);
+ ensure_rectangle_is_visible (view, &view_rect);
}
}
@@ -1334,12 +1338,8 @@ find_changed_cb (EvDocument *document, int page, EvView *view)
jump_to_find_result (view);
update_find_status_message (view);
-#if 0
- /* FIXME: */
- if (ev_document_get_page (document) == page) {
+ if (view->current_page == page)
gtk_widget_queue_draw (GTK_WIDGET (view));
- }
-#endif
}
/*** Public API ***/
@@ -1443,6 +1443,12 @@ ev_view_set_document (EvView *view,
}
}
+int
+ev_view_get_page (EvView *view)
+{
+ return view->current_page;
+}
+
static void
go_to_link (EvView *view, EvLink *link)
{
@@ -1593,7 +1599,7 @@ ev_view_find_next (EvView *view)
page_cache = ev_document_get_page_cache (view->document);
g_mutex_lock (EV_DOC_MUTEX);
- n_results = ev_document_find_get_n_results (find);
+ n_results = ev_document_find_get_n_results (find, view->current_page);
g_mutex_unlock (EV_DOC_MUTEX);
n_pages = ev_page_cache_get_n_pages (page_cache);
@@ -1625,7 +1631,7 @@ ev_view_find_previous (EvView *view)
page_cache = ev_document_get_page_cache (view->document);
g_mutex_lock (EV_DOC_MUTEX);
- n_results = ev_document_find_get_n_results (find);
+ n_results = ev_document_find_get_n_results (find, view->current_page);
g_mutex_unlock (EV_DOC_MUTEX);
n_pages = ev_page_cache_get_n_pages (page_cache);
diff --git a/shell/ev-view.h b/shell/ev-view.h
index 00b92ea..8ba79f1 100644
--- a/shell/ev-view.h
+++ b/shell/ev-view.h
@@ -38,6 +38,7 @@ GType ev_view_get_type (void) G_GNUC_CONST;
GtkWidget* ev_view_new (void);
void ev_view_set_document (EvView *view,
EvDocument *document);
+int ev_view_get_page (EvView *view);
/* Clipboard */
void ev_view_copy (EvView *view);
diff --git a/shell/ev-window.c b/shell/ev-window.c
index e606aed..64b072e 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -1876,7 +1876,10 @@ find_bar_search_changed_cb (EggFindBar *find_bar,
EV_IS_DOCUMENT_FIND (ev_window->priv->document)) {
if (visible && search_string && search_string[0]) {
g_mutex_lock (EV_DOC_MUTEX);
- ev_document_find_begin (EV_DOCUMENT_FIND (ev_window->priv->document), search_string, case_sensitive);
+ ev_document_find_begin (EV_DOCUMENT_FIND (ev_window->priv->document),
+ ev_view_get_page (EV_VIEW (ev_window->priv->view)),
+ search_string,
+ case_sensitive);
g_mutex_unlock (EV_DOC_MUTEX);
} else {
g_mutex_lock (EV_DOC_MUTEX);