static void get_page_y_offset (EvView *view,
int page,
int *y_offset);
-static gboolean get_page_extents (EvView *view,
- gint page,
- GdkRectangle *page_area,
- GtkBorder *border);
static void view_rect_to_doc_rect (EvView *view,
GdkRectangle *view_rect,
GdkRectangle *page_area,
static AtkObject *ev_view_get_accessible (GtkWidget *widget);
/*** Drawing ***/
-static guint32 ev_gdk_color_to_rgb (const GdkColor *color);
-static void draw_rubberband (GtkWidget *widget,
- GdkWindow *window,
- const GdkRectangle *rect,
- guchar alpha);
static void highlight_find_results (EvView *view,
int page);
static void draw_one_page (EvView *view,
GdkRectangle page_area;
GtkBorder border;
- get_page_extents (view, view->current_page, &page_area, &border);
+ ev_view_get_page_extents (view, view->current_page, &page_area, &border);
x = page_area.x;
y = page_area.y;
} else {
for (i = 0; i < ev_document_get_n_pages (view->document); i++) {
- get_page_extents (view, i, &page_area, &border);
+ ev_view_get_page_extents (view, i, &page_area, &border);
if (gdk_rectangle_intersect (¤t_area, &page_area, &unused)) {
area = unused.width * unused.height;
ev_pixbuf_cache_set_page_range (view->pixbuf_cache,
view->start_page,
view->end_page,
- view->rotation,
- view->scale,
view->selection_info.selections);
if (ev_pixbuf_cache_get_surface (view->pixbuf_cache, view->current_page))
return gtk_adjustment_get_page_size (adjustment);
gtk_widget_get_allocation (widget, &allocation);
- get_page_extents (view, page, &page_area, &border);
+ ev_view_get_page_extents (view, page, &page_area, &border);
rect.x = page_area.x + view->scroll_x;
rect.y = view->scroll_y + (scroll == GTK_SCROLL_PAGE_BACKWARD ? 5 : allocation.height - 5);
rect.width = page_area.width;
return;
}
-static gboolean
-get_page_extents (EvView *view,
- gint page,
- GdkRectangle *page_area,
- GtkBorder *border)
+gboolean
+ev_view_get_page_extents (EvView *view,
+ gint page,
+ GdkRectangle *page_area,
+ GtkBorder *border)
{
GtkWidget *widget;
int width, height;
g_assert_not_reached ();
}
- get_page_extents (view, page, &page_area, &border);
+ ev_view_get_page_extents (view, page, &page_area, &border);
view_x = CLAMP (x * view->scale, 0, page_area.width);
view_y = CLAMP (y * view->scale, 0, page_area.height);
g_assert_not_reached ();
}
- get_page_extents (view, page, &page_area, &border);
+ ev_view_get_page_extents (view, page, &page_area, &border);
view_rect->x = x * view->scale + page_area.x;
view_rect->y = y * view->scale + page_area.y;
GdkRectangle page_area;
GtkBorder border;
- if (! get_page_extents (view, i, &page_area, &border))
+ if (! ev_view_get_page_extents (view, i, &page_area, &border))
continue;
if ((x >= page_area.x + border.left) &&
view_rect.width = width;
view_rect.height = height;
- get_page_extents (view, child->page, &page_area, &border);
+ ev_view_get_page_extents (view, child->page, &page_area, &border);
view_rect_to_doc_rect (view, &view_rect, &page_area, &doc_rect);
child->orig_x = doc_rect.x1;
child->orig_y = doc_rect.y1;
GtkBorder border;
gboolean page_ready = TRUE;
- if (!get_page_extents (view, i, &page_area, &border))
+ if (!ev_view_get_page_extents (view, i, &page_area, &border))
continue;
page_area.x -= view->scroll_x;
if (gtk_drag_get_source_widget (context) == widget)
gdk_drag_status (context, 0, time);
else
- gdk_drag_status (context, context->suggested_action, time);
+ gdk_drag_status (context, gdk_drag_context_get_suggested_action (context), time);
return TRUE;
}
/*** Drawing ***/
-static guint32
-ev_gdk_color_to_rgb (const GdkColor *color)
-{
- guint32 result;
- result = (0xff0000 | (color->red & 0xff00));
- result <<= 8;
- result |= ((color->green & 0xff00) | (color->blue >> 8));
- return result;
-}
-
static void
-draw_rubberband (GtkWidget *widget, GdkWindow *window,
- const GdkRectangle *rect, guchar alpha)
+draw_rubberband (EvView *view,
+ GdkWindow *window,
+ const GdkRectangle *rect,
+ gdouble alpha)
{
- GdkGC *gc;
- GdkPixbuf *pixbuf;
GtkStyle *style;
GdkColor *fill_color_gdk;
- guint fill_color;
+ gdouble r, g, b;
+ cairo_t *cr;
- style = gtk_widget_get_style (widget);
+ style = gtk_widget_get_style (GTK_WIDGET (view));
fill_color_gdk = gdk_color_copy (&style->base[GTK_STATE_SELECTED]);
- fill_color = ev_gdk_color_to_rgb (fill_color_gdk) << 8 | alpha;
+ r = fill_color_gdk->red / 65535.;
+ g = fill_color_gdk->green / 65535.;
+ b = fill_color_gdk->blue / 65535.;
- pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8,
- rect->width, rect->height);
- gdk_pixbuf_fill (pixbuf, fill_color);
+ cr = gdk_cairo_create (window);
- gdk_draw_pixbuf (window, NULL, pixbuf,
- 0, 0,
- rect->x - EV_VIEW (widget)->scroll_x, rect->y - EV_VIEW (widget)->scroll_y,
- rect->width, rect->height,
- GDK_RGB_DITHER_NONE,
- 0, 0);
+ cairo_set_source_rgba (cr, r, g, b, alpha);
+ cairo_rectangle (cr,
+ rect->x - view->scroll_x,
+ rect->y - view->scroll_y,
+ rect->width, rect->height);
+ cairo_fill_preserve (cr);
- g_object_unref (pixbuf);
+ cairo_set_line_width (cr, 0.5);
+ cairo_set_source_rgb (cr, r, g, b);
+ cairo_stroke (cr);
- gc = gdk_gc_new (window);
- gdk_gc_set_rgb_fg_color (gc, fill_color_gdk);
- gdk_draw_rectangle (window, gc, FALSE,
- rect->x - EV_VIEW (widget)->scroll_x, rect->y - EV_VIEW (widget)->scroll_y,
- rect->width - 1,
- rect->height - 1);
- g_object_unref (gc);
+ cairo_destroy (cr);
gdk_color_free (fill_color_gdk);
}
for (i = 0; i < n_results; i++) {
EvRectangle *rectangle;
GdkRectangle view_rectangle;
- guchar alpha;
+ gdouble alpha;
if (i == view->find_result && page == view->current_page) {
- alpha = 0x90;
+ alpha = 0.6;
} else {
- alpha = 0x20;
+ alpha = 0.3;
}
rectangle = ev_view_find_get_result (view, page, i);
doc_rect_to_view_rect (view, page, rectangle, &view_rectangle);
- draw_rubberband (GTK_WIDGET (view), bin_window,
- &view_rectangle, alpha);
+ draw_rubberband (view, bin_window, &view_rectangle, alpha);
}
}
gboolean inverted_colors;
view->height_to_page_cache = ev_view_get_height_to_page_cache (view);
- view->pixbuf_cache = ev_pixbuf_cache_new (GTK_WIDGET (view), view->document);
+ view->pixbuf_cache = ev_pixbuf_cache_new (GTK_WIDGET (view), view->model, view->pixbuf_cache_size);
view->page_cache = ev_page_cache_new (view->document);
inverted_colors = ev_document_model_get_inverted_colors (view->model);
ev_pixbuf_cache_set_inverted_colors (view->pixbuf_cache, inverted_colors);
}
}
+/**
+ * ev_view_set_page_cache_size:
+ * @view:
+ * @cache_size:
+ *
+ * Sets the maximum size in bytes that will be used to cache
+ * rendered pages. Use 0 to disable caching rendered pages.
+ *
+ * Note that this limit doesn't affect the current visible page range,
+ * which will always be rendered. In order to limit the total memory used
+ * you have to use ev_document_model_set_max_scale() too.
+ *
+ */
+void
+ev_view_set_page_cache_size (EvView *view,
+ gsize cache_size)
+{
+ if (view->pixbuf_cache_size == cache_size)
+ return;
+
+ view->pixbuf_cache_size = cache_size;
+ if (view->pixbuf_cache)
+ ev_pixbuf_cache_set_max_size (view->pixbuf_cache, cache_size);
+}
+
void
ev_view_set_loading (EvView *view,
gboolean loading)
{
+ if (view->loading && !loading)
+ hide_loading_window (view);
view->loading = loading;
gtk_widget_queue_draw (GTK_WIDGET (view));
}
GdkRectangle page_area;
GtkBorder border;
- if (get_page_extents (view, i, &page_area, &border)) {
+ if (ev_view_get_page_extents (view, i, &page_area, &border)) {
GdkRectangle overlap;
if (gdk_rectangle_intersect (&page_area, &view_rect, &overlap)) {
GdkRectangle page_area;
GtkBorder border;
- get_page_extents (view, i, &page_area, &border);
+ ev_view_get_page_extents (view, i, &page_area, &border);
if (gdk_rectangle_point_in (&page_area, start) ||
gdk_rectangle_point_in (&page_area, stop)) {
if (first == n_pages)
selection->rect.x2 = width;
selection->rect.y2 = height;
- get_page_extents (view, i, &page_area, &border);
+ ev_view_get_page_extents (view, i, &page_area, &border);
if (gdk_rectangle_point_in (&page_area, start))
point = start;
*/
gdk_region_shrink (region, -5, -5);
- get_page_extents (view, cur_page, &page_area, &border);
+ ev_view_get_page_extents (view, cur_page, &page_area, &border);
gdk_region_offset (region,
page_area.x + border.left - view->scroll_x,
page_area.y + border.top - view->scroll_y);