Skip to content

Commit 58486bb

Browse files
owtaylorraveit65
authored andcommitted
EvView: render correctly on hi-dpi displays
Make EvPixbufCache generate surfaces with extra resolution based on gtk_widget_get_scale_factor(). Handle cairo surfaces with a device scale in ev_view_draw(). Trigger an update of the pixbuf cache when the scale factor changes. https://bugzilla.gnome.org/show_bug.cgi?id=723431 origin commit: https://git.gnome.org/browse/evince/commit/?id=a612f8
1 parent f4b94ea commit 58486bb

File tree

2 files changed

+20
-7
lines changed

2 files changed

+20
-7
lines changed

‎libview/ev-pixbuf-cache.c‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,9 +296,9 @@ copy_job_to_job_info (EvJobRender *job_render,
296296

297297
job_info->selection_points = job_render->selection_points;
298298
job_info->selection = cairo_surface_reference (job_render->selection);
299-
job_info->selection_scale = job_render->scale;
300299
if (job_info->selection)
301300
set_device_scale_on_surface (job_info->selection, job_info->device_scale);
301+
job_info->selection_scale = job_render->scale * job_info->device_scale;
302302
g_assert (job_info->selection_points.x1 >= 0);
303303

304304
job_info->selection_region_points = job_render->selection_points;
@@ -1093,7 +1093,7 @@ ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache,
10931093
if (job_info->selection)
10941094
set_device_scale_on_surface (job_info->selection, job_info->device_scale);
10951095
job_info->selection_points = job_info->target_points;
1096-
job_info->selection_scale = scale;
1096+
job_info->selection_scale = scale * job_info->device_scale;
10971097
g_object_unref (rc);
10981098
ev_document_doc_mutex_unlock ();
10991099
}

‎libview/ev-view.c‎

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5690,10 +5690,14 @@ draw_surface (cairo_t *cr,
56905690
gint target_width,
56915691
gint target_height)
56925692
{
5693-
gint width, height;
5693+
gdouble width, height;
5694+
gdouble device_scale_x = 1, device_scale_y = 1;
56945695

5695-
width = cairo_image_surface_get_width (surface);
5696-
height = cairo_image_surface_get_height (surface);
5696+
#ifdef HAVE_HIDPI_SUPPORT
5697+
cairo_surface_get_device_scale (surface, &device_scale_x, &device_scale_y);
5698+
#endif
5699+
width = cairo_image_surface_get_width (surface) / device_scale_x;
5700+
height = cairo_image_surface_get_height (surface) / device_scale_y;
56975701

56985702
cairo_save (cr);
56995703
cairo_translate (cr, x, y);
@@ -5712,8 +5716,8 @@ draw_surface (cairo_t *cr,
57125716
}
57135717

57145718
cairo_surface_set_device_offset (surface,
5715-
offset_x,
5716-
offset_y);
5719+
offset_x * device_scale_x,
5720+
offset_y * device_scale_y);
57175721
cairo_set_source_surface (cr, surface, 0, 0);
57185722
cairo_paint (cr);
57195723
cairo_restore (cr);
@@ -5848,9 +5852,18 @@ draw_one_page (EvView *view,
58485852
if (region) {
58495853
double scale_x, scale_y;
58505854
GdkRGBA color;
5855+
double device_scale_x = 1, device_scale_y = 1;
58515856

58525857
scale_x = (gdouble)width / cairo_image_surface_get_width (page_surface);
58535858
scale_y = (gdouble)height / cairo_image_surface_get_height (page_surface);
5859+
5860+
#ifdef HAVE_HIDPI_SUPPORT
5861+
cairo_surface_get_device_scale (page_surface, &device_scale_x, &device_scale_y);
5862+
#endif
5863+
5864+
scale_x *= device_scale_x;
5865+
scale_y *= device_scale_y;
5866+
58545867
_ev_view_get_selection_colors (view, &color, NULL);
58555868
draw_selection_region (cr, region, &color, real_page_area.x, real_page_area.y,
58565869
scale_x, scale_y);

0 commit comments

Comments
 (0)