Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/backend
diff options
context:
space:
mode:
Diffstat (limited to 'backend')
-rw-r--r--backend/ev-document-thumbnails.h6
-rw-r--r--backend/ev-document.c86
-rw-r--r--backend/ev-document.h77
-rw-r--r--backend/ev-jobs.c8
-rw-r--r--backend/ev-jobs.h5
-rw-r--r--backend/ev-link.c54
-rw-r--r--backend/ev-link.h18
-rw-r--r--backend/ev-page-cache.c16
8 files changed, 136 insertions, 134 deletions
diff --git a/backend/ev-document-thumbnails.h b/backend/ev-document-thumbnails.h
index 76b0cc8..c84e426 100644
--- a/backend/ev-document-thumbnails.h
+++ b/backend/ev-document-thumbnails.h
@@ -52,6 +52,12 @@ struct _EvDocumentThumbnailsIface
};
GType ev_document_thumbnails_get_type (void);
+
+/* FIXME: This is a little bit busted. We call get_thumbnail w/ a suggested
+ * width, but we should call it with a scale so that different sized pages get
+ * sized proportionally.
+ */
+
GdkPixbuf *ev_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document,
gint page,
gint size,
diff --git a/backend/ev-document.c b/backend/ev-document.c
index 6238ac5..080af0b 100644
--- a/backend/ev-document.c
+++ b/backend/ev-document.c
@@ -27,17 +27,9 @@
static void ev_document_class_init (gpointer g_class);
-enum
-{
- PAGE_CHANGED,
- SCALE_CHANGED,
- LAST_SIGNAL
-};
-static guint signals[LAST_SIGNAL] = { 0 };
GMutex *ev_doc_mutex = NULL;
-
#define LOG(x)
GType
ev_document_get_type (void)
@@ -75,26 +67,6 @@ ev_document_error_quark (void)
static void
ev_document_class_init (gpointer g_class)
{
- signals[PAGE_CHANGED] =
- g_signal_new ("page_changed",
- EV_TYPE_DOCUMENT,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EvDocumentIface, page_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
-
- signals[SCALE_CHANGED] =
- g_signal_new ("scale_changed",
- EV_TYPE_DOCUMENT,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EvDocumentIface, scale_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
-
g_object_interface_install_property (g_class,
g_param_spec_string ("title",
"Document Title",
@@ -140,8 +112,11 @@ ev_document_load (EvDocument *document,
gboolean retval;
LOG ("ev_document_load");
retval = iface->load (document, uri, error);
+
/* Call this to make the initial cached copy */
- ev_document_get_page_cache (document);
+ if (retval)
+ ev_document_get_page_cache (document);
+
return retval;
}
@@ -205,16 +180,6 @@ ev_document_get_page (EvDocument *document)
}
void
-ev_document_set_target (EvDocument *document,
- GdkDrawable *target)
-{
- EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
-
- LOG ("ev_document_set_target");
- iface->set_target (document, target);
-}
-
-void
ev_document_set_scale (EvDocument *document,
double scale)
{
@@ -225,17 +190,6 @@ ev_document_set_scale (EvDocument *document,
}
void
-ev_document_set_page_offset (EvDocument *document,
- int x,
- int y)
-{
- EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
-
- LOG ("ev_document_set_page_offset");
- iface->set_page_offset (document, x, y);
-}
-
-void
ev_document_get_page_size (EvDocument *document,
int page,
int *width,
@@ -269,25 +223,29 @@ ev_document_get_link (EvDocument *document,
EvLink *retval;
LOG ("ev_document_get_link");
+ if (iface->get_link == NULL)
+ return NULL;
retval = iface->get_link (document, x, y);
return retval;
}
-void
-ev_document_render (EvDocument *document,
- int clip_x,
- int clip_y,
- int clip_width,
- int clip_height)
+GList *
+ev_document_get_links (EvDocument *document)
{
EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
+ GList *retval;
+
+ LOG ("ev_document_get_link");
+ if (iface->get_links == NULL)
+ return NULL;
+ retval = iface->get_links (document);
- LOG ("ev_document_render");
- iface->render (document, clip_x, clip_y, clip_width, clip_height);
+ return retval;
}
+
GdkPixbuf *
ev_document_render_pixbuf (EvDocument *document)
{
@@ -302,15 +260,3 @@ ev_document_render_pixbuf (EvDocument *document)
return retval;
}
-
-void
-ev_document_page_changed (EvDocument *document)
-{
- g_signal_emit (G_OBJECT (document), signals[PAGE_CHANGED], 0);
-}
-
-void
-ev_document_scale_changed (EvDocument *document)
-{
- g_signal_emit (G_OBJECT (document), signals[SCALE_CHANGED], 0);
-}
diff --git a/backend/ev-document.h b/backend/ev-document.h
index be0d1db..15b2cc9 100644
--- a/backend/ev-document.h
+++ b/backend/ev-document.h
@@ -73,13 +73,8 @@ struct _EvDocumentIface
void (* set_page) (EvDocument *document,
int page);
int (* get_page) (EvDocument *document);
- void (* set_target) (EvDocument *document,
- GdkDrawable *target);
void (* set_scale) (EvDocument *document,
double scale);
- void (* set_page_offset) (EvDocument *document,
- int x,
- int y);
void (* get_page_size) (EvDocument *document,
int page,
int *width,
@@ -89,15 +84,8 @@ struct _EvDocumentIface
EvLink * (* get_link) (EvDocument *document,
int x,
int y);
- void (* render) (EvDocument *document,
- int clip_x,
- int clip_y,
- int clip_width,
- int clip_height);
- GdkPixbuf *(* render_pixbuf) (EvDocument *document);
-
-
-
+ GList * (* get_links) (EvDocument *document);
+ GdkPixbuf * (* render_pixbuf) (EvDocument *document);
};
GType ev_document_get_type (void);
@@ -106,42 +94,31 @@ EvPageCache *ev_document_get_page_cache (EvDocument *document);
GMutex *ev_document_get_doc_mutex (void);
-gboolean ev_document_load (EvDocument *document,
- const char *uri,
- GError **error);
-gboolean ev_document_save (EvDocument *document,
- const char *uri,
- 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_target (EvDocument *document,
- GdkDrawable *target);
-void ev_document_set_scale (EvDocument *document,
- double scale);
-void ev_document_set_page_offset (EvDocument *document,
- int x,
- int y);
-void ev_document_get_page_size (EvDocument *document,
- int page,
- int *width,
- int *height);
-char *ev_document_get_text (EvDocument *document,
- GdkRectangle *rect);
-EvLink *ev_document_get_link (EvDocument *document,
- int x,
- int y);
-void ev_document_render (EvDocument *document,
- int clip_x,
- int clip_y,
- int clip_width,
- int clip_height);
-/* Quick hack to test threaded rendering */
-GdkPixbuf *ev_document_render_pixbuf (EvDocument *document);
-void ev_document_page_changed (EvDocument *document);
-void ev_document_scale_changed (EvDocument *document);
+gboolean ev_document_load (EvDocument *document,
+ const char *uri,
+ GError **error);
+gboolean ev_document_save (EvDocument *document,
+ const char *uri,
+ 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);
+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);
+
G_END_DECLS
diff --git a/backend/ev-jobs.c b/backend/ev-jobs.c
index 355a103..8265aeb 100644
--- a/backend/ev-jobs.c
+++ b/backend/ev-jobs.c
@@ -182,7 +182,8 @@ ev_job_render_new (EvDocument *document,
gint page,
double scale,
gint width,
- gint height)
+ gint height,
+ gboolean include_links)
{
EvJobRender *job;
@@ -193,6 +194,7 @@ ev_job_render_new (EvDocument *document,
job->scale = scale;
job->target_width = width;
job->target_height = height;
+ job->include_links = include_links;
return EV_JOB (job);
}
@@ -204,9 +206,11 @@ ev_job_render_run (EvJobRender *job)
g_mutex_lock (EV_DOC_MUTEX);
- ev_document_set_scale (EV_JOB (job)->document, job->scale);
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);
+ if (job->include_links)
+ job->link_mapping = ev_document_get_links (EV_JOB (job)->document);
EV_JOB (job)->finished = TRUE;
g_mutex_unlock (EV_DOC_MUTEX);
diff --git a/backend/ev-jobs.h b/backend/ev-jobs.h
index a212349..1b64e01 100644
--- a/backend/ev-jobs.h
+++ b/backend/ev-jobs.h
@@ -97,6 +97,8 @@ struct _EvJobRender
gint target_width;
gint target_height;
GdkPixbuf *pixbuf;
+ GList *link_mapping;
+ gboolean include_links;
};
struct _EvJobRenderClass
@@ -134,7 +136,8 @@ EvJob *ev_job_render_new (EvDocument *document,
gint page,
double scale,
gint width,
- gint height);
+ gint height,
+ gboolean include_links);
void ev_job_render_run (EvJobRender *thumbnail);
/* EvJobThumbnail */
diff --git a/backend/ev-link.c b/backend/ev-link.c
index 7e6eb52..7e26a58 100644
--- a/backend/ev-link.c
+++ b/backend/ev-link.c
@@ -85,13 +85,14 @@ void
ev_link_set_title (EvLink* self, const char *title)
{
g_assert (EV_IS_LINK (self));
- g_assert (title != NULL);
if (self->priv->title != NULL) {
g_free (self->priv->title);
}
-
- self->priv->title = g_strdup (title);
+ if (title)
+ self->priv->title = g_strdup (title);
+ else
+ self->priv->title = NULL;
g_object_notify (G_OBJECT (self), "title");
}
@@ -314,3 +315,50 @@ ev_link_new_external (const char *title, const char *uri)
"type", EV_LINK_TYPE_EXTERNAL_URI,
NULL));
}
+
+
+
+static void
+ev_link_mapping_free_foreach (EvLinkMapping *mapping)
+{
+ g_object_unref (G_OBJECT (mapping->link));
+ g_free (mapping);
+}
+
+void
+ev_link_mapping_free (GList *link_mapping)
+{
+ if (link_mapping == NULL)
+ return;
+
+ g_list_foreach (link_mapping, (GFunc) (ev_link_mapping_free_foreach), NULL);
+ g_list_free (link_mapping);
+}
+
+
+EvLink *
+ev_link_mapping_find (GList *link_mapping,
+ gdouble x,
+ gdouble y)
+{
+ GList *list;
+ EvLink *link = NULL;
+ int i;
+
+ i = 0;
+ for (list = link_mapping; list; list = list->next) {
+ EvLinkMapping *mapping = list->data;
+
+ i++;
+ if ((x >= mapping->x1) &&
+ (y >= mapping->y1) &&
+ (x <= mapping->x2) &&
+ (y <= mapping->y2)) {
+ link = mapping->link;
+ break;
+ }
+ }
+
+ return link;
+}
+
diff --git a/backend/ev-link.h b/backend/ev-link.h
index d92d428..b79e2fa 100644
--- a/backend/ev-link.h
+++ b/backend/ev-link.h
@@ -37,6 +37,8 @@ typedef struct _EvLinkPrivate EvLinkPrivate;
#define EV_TYPE_LINK_TYPE (ev_link_type_get_type ())
+
+
typedef enum
{
EV_LINK_TYPE_TITLE,
@@ -67,6 +69,22 @@ int ev_link_get_page (EvLink *link);
void ev_link_set_page (EvLink *link,
int page);
+/* Link Mapping stuff */
+
+typedef struct _EvLinkMapping EvLinkMapping;
+struct _EvLinkMapping
+{
+ EvLink *link;
+ gdouble x1;
+ gdouble y1;
+ gdouble x2;
+ gdouble y2;
+};
+
+void ev_link_mapping_free (GList *link_mapping);
+EvLink *ev_link_mapping_find (GList *link_mapping,
+ gdouble x,
+ gdouble y);
G_END_DECLS
#endif /* !EV_LINK_H */
diff --git a/backend/ev-page-cache.c b/backend/ev-page-cache.c
index e2771b6..f16ddc5 100644
--- a/backend/ev-page-cache.c
+++ b/backend/ev-page-cache.c
@@ -48,7 +48,7 @@ G_DEFINE_TYPE (EvPageCache, ev_page_cache, G_TYPE_OBJECT)
static void
ev_page_cache_init (EvPageCache *page_cache)
{
- page_cache->current_page = 1;
+ page_cache->current_page = 0;
}
static void
@@ -102,13 +102,13 @@ _ev_page_cache_new (EvDocument *document)
page_cache->title = ev_document_get_title (document);
ev_document_set_scale (document, 1.0);
- for (i = 1; i <= page_cache->n_pages; i++) {
+ for (i = 0; i < page_cache->n_pages; i++) {
gint page_width = 0;
gint page_height = 0;
ev_document_get_page_size (document, i, &page_width, &page_height);
- if (i == 1) {
+ if (i == 0) {
page_cache->uniform_width = page_width;
page_cache->uniform_height = page_height;
} else if (page_cache->uniform &&
@@ -169,7 +169,7 @@ ev_page_cache_set_current_page (EvPageCache *page_cache,
int page)
{
g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
- g_return_if_fail (page > 0 || page <= page_cache->n_pages);
+ g_return_if_fail (page >= 0 || page < page_cache->n_pages);
if (page == page_cache->current_page)
return;
@@ -204,7 +204,7 @@ ev_page_cache_get_size (EvPageCache *page_cache,
gint *height)
{
g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
- g_return_if_fail (page > 0 && page <= page_cache->n_pages);
+ g_return_if_fail (page >= 0 && page < page_cache->n_pages);
if (page_cache->uniform) {
if (width)
@@ -214,7 +214,7 @@ ev_page_cache_get_size (EvPageCache *page_cache,
} else {
EvPageCacheInfo *info;
- info = &(page_cache->size_cache [page - 1]);
+ info = &(page_cache->size_cache [page]);
if (width)
*width = info->width;
@@ -234,7 +234,7 @@ ev_page_cache_next_page (EvPageCache *page_cache)
{
g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE);
- if (page_cache->current_page >= page_cache->n_pages)
+ if (page_cache->current_page > page_cache->n_pages)
return FALSE;
ev_page_cache_set_current_page (page_cache, page_cache->current_page + 1);
@@ -247,7 +247,7 @@ ev_page_cache_prev_page (EvPageCache *page_cache)
{
g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE);
- if (page_cache->current_page <= 1)
+ if (page_cache->current_page <= 0)
return FALSE;
ev_page_cache_set_current_page (page_cache, page_cache->current_page - 1);