diff options
Diffstat (limited to 'backend/epub/epub-document.c')
-rw-r--r-- | backend/epub/epub-document.c | 80 |
1 files changed, 54 insertions, 26 deletions
diff --git a/backend/epub/epub-document.c b/backend/epub/epub-document.c index bf1dc00b..09ad973d 100644 --- a/backend/epub/epub-document.c +++ b/backend/epub/epub-document.c @@ -71,6 +71,8 @@ struct _EpubDocument GList* contentList ; /* A variable to hold our epubDocument for unzipping*/ unzFile epubDocument ; + /* A pointer to an offscreen WebKitWebView, for thumbnails*/ + WebKitWebView *webview; }; static void epub_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface); @@ -81,27 +83,39 @@ EV_BACKEND_REGISTER_WITH_CODE (EpubDocument, epub_document, epub_document_document_thumbnails_iface_init); } ); +/* A cairo surface for the thumbnails, this probably dosen't need to be global, but I couldn't find a better solution.*/ +static cairo_surface_t* surface = NULL ; +static gboolean completed = FALSE; +static GdkPixbuf *thumbnail=NULL ; + static void -epub_webkit_render(cairo_surface_t **surface, - const char* uri); +epub_webkit_render(EpubDocument *document,const char* uri); + static GdkPixbuf * epub_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document, EvRenderContext *rc, gboolean border) { - GdkPixbuf *thumbnail; - cairo_surface_t* surface=NULL; gchar* uri = (gchar*) rc->page->backend_page; - epub_webkit_render (&surface,uri); - if ( !surface ) { - return NULL ; - } - + EpubDocument *epub_document = EPUB_DOCUMENT(document); + completed = FALSE ; + thumbnail=NULL; if (surface) { - thumbnail = ev_document_misc_pixbuf_from_surface (surface); cairo_surface_destroy (surface); + surface=NULL; + } + epub_webkit_render (epub_document,uri); + + while (completed != TRUE ) { + /*Wait for the job to complete*/ + } + + if (thumbnail) { + return thumbnail; + } + else { + return NULL; } - return thumbnail; } static void @@ -110,8 +124,11 @@ epub_document_thumbnails_get_dimensions (EvDocumentThumbnails *document, gint *width, gint *height) { - gdouble page_width = 800; - gdouble page_height = 600; + gdouble page_width, page_height; + + page_width = 800; + page_height = 600; + *width = MAX ((gint)(page_width * rc->scale + 0.5), 1); *height = MAX ((gint)(page_height * rc->scale + 0.5), 1); } @@ -147,30 +164,40 @@ epub_document_get_n_pages (EvDocument *document) static void webkit_render_cb(GtkWidget *web_view, GParamSpec *specification, - cairo_surface_t **surface) + gpointer data) { WebKitLoadStatus status = webkit_web_view_get_load_status (WEBKIT_WEB_VIEW(web_view)); if ( status == WEBKIT_LOAD_FINISHED ) { - *(surface) = webkit_web_view_get_snapshot (WEBKIT_WEB_VIEW(web_view)); + surface = webkit_web_view_get_snapshot (WEBKIT_WEB_VIEW(web_view)); + thumbnail = ev_document_misc_pixbuf_from_surface(surface); + completed=TRUE; } } -static void -epub_webkit_render(cairo_surface_t **surface, - const char* uri) +static void epub_webkit_render(EpubDocument *epub_document,const char* uri) { - GtkWidget *offscreen_window = gtk_offscreen_window_new (); + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(epub_document->webview),uri); +} + +static WebKitWebView* +offscreen_webview_init() +{ + GtkWidget *offscreen_window = gtk_offscreen_window_new(); gtk_window_set_default_size(GTK_WINDOW(offscreen_window),800,600); + GtkWidget* scroll_view = gtk_scrolled_window_new (NULL,NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scroll_view),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); GtkWidget* web_view = webkit_web_view_new (); - g_signal_connect(WEBKIT_WEB_VIEW(web_view),"notify::load-status",G_CALLBACK(webkit_render_cb),surface); + WebKitWebSettings *webviewsettings = webkit_web_settings_new (); + g_object_set (G_OBJECT(webviewsettings), "enable-plugins", FALSE, NULL); + webkit_web_view_set_settings (WEBKIT_WEB_VIEW(web_view),webviewsettings); + g_signal_connect(WEBKIT_WEB_VIEW(web_view),"notify::load-status",G_CALLBACK(webkit_render_cb),NULL); gtk_container_add(GTK_CONTAINER(scroll_view),web_view); gtk_container_add(GTK_CONTAINER(offscreen_window),scroll_view); gtk_widget_show_all (offscreen_window); - webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_view),uri); + return WEBKIT_WEB_VIEW(web_view); } #else /* The webkit2 code for GTK3 */ @@ -203,20 +230,21 @@ webkit_render_cb(WebKitWebView *webview, surface); } -static void epub_webkit_render(cairo_surface_t **surface, - const char* uri) { GtkWidget *offscreen_window = gtk_offscreen_window_new (); gtk_window_set_default_size(GTK_WINDOW(offscreen_window),800,600); GtkWidget* scroll_view = gtk_scrolled_window_new (NULL,NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scroll_view),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); GtkWidget* web_view = webkit_web_view_new (); + gtk_container_add(GTK_CONTAINER(offscreen_window),scroll_view); gtk_container_add(GTK_CONTAINER(scroll_view),web_view); - webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_view),uri); + gtk_widget_show_all(offscreen_window); g_signal_connect(web_view,"load-changed",G_CALLBACK(webkit_render_cb),surface); + return web_view ; } + #endif /** * epub_remove_temporary_dir : Removes a directory recursively. @@ -863,6 +891,7 @@ epub_document_init (EpubDocument *epub_document) epub_document->archivename = NULL ; epub_document->tmp_archive_dir = NULL ; epub_document->contentList = NULL ; + epub_document->webview = offscreen_webview_init(); } static gboolean @@ -1037,13 +1066,12 @@ epub_document_class_init (EpubDocumentClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); EvDocumentClass *ev_document_class = EV_DOCUMENT_CLASS (klass); - + gobject_class->finalize = epub_document_finalize; ev_document_class->load = epub_document_load; ev_document_class->save = epub_document_save; ev_document_class->get_n_pages = epub_document_get_n_pages; -/* ev_document_class->wekit_render->render = epub_document_render;*/ ev_document_class->get_info = epub_document_get_info; ev_document_class->get_page = epub_document_get_page; } |