EvRenderContext *rc;
/* Data we get from rendering */
- GdkPixbuf *pixbuf;
+ cairo_surface_t *surface;
GList *link_mapping;
GList *image_mapping;
GdkRegion *text_mapping;
EvRectangle target_points;
gboolean points_set;
- GdkPixbuf *selection;
+ cairo_surface_t *selection;
GdkRegion *selection_region;
} CacheJobInfo;
static void copy_job_to_job_info (EvJobRender *job_render,
CacheJobInfo *job_info,
EvPixbufCache *pixbuf_cache);
-static gboolean new_selection_pixbuf_needed(EvPixbufCache *pixbuf_cache,
- CacheJobInfo *job_info,
- gint page,
- gfloat scale);
+static gboolean new_selection_surface_needed(EvPixbufCache *pixbuf_cache,
+ CacheJobInfo *job_info,
+ gint page,
+ gfloat scale);
/* These are used for iterating through the prev and next arrays */
g_object_unref (G_OBJECT (job_info->job));
job_info->job = NULL;
}
- if (job_info->pixbuf) {
- g_object_unref (G_OBJECT (job_info->pixbuf));
- job_info->pixbuf = NULL;
+ if (job_info->surface) {
+ cairo_surface_destroy (job_info->surface);
+ job_info->surface = NULL;
}
if (job_info->link_mapping) {
ev_link_mapping_free (job_info->link_mapping);
job_info->text_mapping = NULL;
}
if (job_info->selection) {
- g_object_unref (G_OBJECT (job_info->selection));
+ cairo_surface_destroy (job_info->selection);
job_info->selection = NULL;
}
if (job_info->selection_region) {
job_info = find_job_cache (pixbuf_cache, job_render->rc->page);
copy_job_to_job_info (job_render, job_info, pixbuf_cache);
-
g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0);
}
*target_page = *job_info;
job_info->job = NULL;
- job_info->pixbuf = NULL;
+ job_info->surface = NULL;
job_info->link_mapping = NULL;
job_info->image_mapping = NULL;
job_info->points_set = FALSE;
- if (job_info->pixbuf) {
- g_object_unref (G_OBJECT (job_info->pixbuf));
+ if (job_info->surface) {
+ cairo_surface_destroy (job_info->surface);
}
- job_info->pixbuf = g_object_ref (job_render->pixbuf);
+ job_info->surface = cairo_surface_reference (job_render->surface);
if (job_info->rc) {
g_object_unref (G_OBJECT (job_info->rc));
if (job_render->include_selection) {
if (job_info->selection) {
- g_object_unref (G_OBJECT (job_info->selection));
+ cairo_surface_destroy (job_info->selection);
job_info->selection = NULL;
}
if (job_info->selection_region) {
job_info->selection_points = job_render->selection_points;
job_info->selection_region = gdk_region_copy (job_render->selection_region);
- job_info->selection = g_object_ref (job_render->selection);
+ job_info->selection = cairo_surface_reference (job_render->selection);
g_assert (job_info->selection_points.x1 >= 0);
+ job_info->points_set = TRUE;
}
if (job_info->job) {
ev_page_cache_get_size (page_cache, page, rotation,
scale, &width, &height);
- if (job_info->pixbuf &&
- gdk_pixbuf_get_width (job_info->pixbuf) == width &&
- gdk_pixbuf_get_height (job_info->pixbuf) == height)
+ if (job_info->surface &&
+ cairo_image_surface_get_width (job_info->surface) == width &&
+ cairo_image_surface_get_height (job_info->surface) == height)
return;
/* make a new job now */
include_images = TRUE;
if (job_info->text_mapping == NULL)
include_text = TRUE;
- if (new_selection_pixbuf_needed (pixbuf_cache, job_info, page, scale)) {
+ if (new_selection_surface_needed (pixbuf_cache, job_info, page, scale)) {
include_selection = TRUE;
}
ev_pixbuf_cache_add_jobs_if_needed (pixbuf_cache, rotation, scale);
}
-GdkPixbuf *
-ev_pixbuf_cache_get_pixbuf (EvPixbufCache *pixbuf_cache,
- gint page)
+cairo_surface_t *
+ev_pixbuf_cache_get_surface (EvPixbufCache *pixbuf_cache,
+ gint page)
{
CacheJobInfo *job_info;
if (job_info->job &&
EV_JOB (job_info->job)->finished) {
copy_job_to_job_info (EV_JOB_RENDER (job_info->job), job_info, pixbuf_cache);
+ g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0);
}
- return job_info->pixbuf;
+ return job_info->surface;
}
GList *
if (job_info->job &&
EV_JOB (job_info->job)->finished) {
copy_job_to_job_info (EV_JOB_RENDER (job_info->job), job_info, pixbuf_cache);
+ g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0);
}
return job_info->link_mapping;
if (job_info->job &&
EV_JOB (job_info->job)->finished) {
copy_job_to_job_info (EV_JOB_RENDER (job_info->job), job_info, pixbuf_cache);
+ g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0);
}
return job_info->image_mapping;
}
static gboolean
-new_selection_pixbuf_needed (EvPixbufCache *pixbuf_cache,
+new_selection_surface_needed (EvPixbufCache *pixbuf_cache,
CacheJobInfo *job_info,
gint page,
gfloat scale)
{
EvPageCache *page_cache;
- gint width, height;
if (job_info->selection) {
+ gint width, height;
+ gint selection_width, selection_height;
+
page_cache = ev_page_cache_get (pixbuf_cache->document);
- ev_page_cache_get_size (page_cache, page, job_info->rc->rotation,
+ ev_page_cache_get_size (page_cache, page,
+ job_info->rc->rotation,
scale, &width, &height);
+
+ selection_width = cairo_image_surface_get_width (job_info->selection);
+ selection_height = cairo_image_surface_get_height (job_info->selection);
- if (width != gdk_pixbuf_get_width (job_info->selection) ||
- height != gdk_pixbuf_get_height (job_info->selection))
+ if (width != selection_width || height != selection_height)
return TRUE;
} else {
if (job_info->points_set)
return TRUE;
}
+
return FALSE;
}
gint page,
gfloat scale)
{
- if (new_selection_pixbuf_needed (pixbuf_cache, job_info, page, scale)) {
+ if (new_selection_surface_needed (pixbuf_cache, job_info, page, scale)) {
if (job_info->selection)
- g_object_unref (job_info->selection);
+ cairo_surface_destroy (job_info->selection);
job_info->selection = NULL;
job_info->selection_points.x1 = -1;
}
if (job_info->job &&
EV_JOB (job_info->job)->finished) {
copy_job_to_job_info (EV_JOB_RENDER (job_info->job), job_info, pixbuf_cache);
+ g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0);
}
return job_info->text_mapping;
job_info = pixbuf_cache->prev_job + i;
if (job_info->selection) {
- g_object_unref (G_OBJECT (job_info->selection));
+ cairo_surface_destroy (job_info->selection);
job_info->selection = NULL;
}
job_info = pixbuf_cache->next_job + i;
if (job_info->selection) {
- g_object_unref (G_OBJECT (job_info->selection));
+ cairo_surface_destroy (job_info->selection);
job_info->selection = NULL;
}
}
job_info = pixbuf_cache->job_list + i;
if (job_info->selection) {
- g_object_unref (G_OBJECT (job_info->selection));
+ cairo_surface_destroy (job_info->selection);
job_info->selection = NULL;
}
}
}
-GdkPixbuf *
-ev_pixbuf_cache_get_selection_pixbuf (EvPixbufCache *pixbuf_cache,
- gint page,
- gfloat scale,
- GdkRegion **region)
+cairo_surface_t *
+ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache,
+ gint page,
+ gfloat scale,
+ GdkRegion **region)
{
CacheJobInfo *job_info;
job_info->selection_points.x1 = -1;
if (job_info->selection) {
- g_object_unref (job_info->selection);
+ cairo_surface_destroy (job_info->selection);
job_info->selection = NULL;
}
}