Commit 2491a3a0 authored by Michael Natterer's avatar Michael Natterer 😴

app: add (disabled) support for rendering the image at high resolution

for what Apple calls "Retina". Disabled because the GDK API to figure
the scale factor doesn't exist yet.
parent 0357f836
......@@ -54,6 +54,7 @@ gimp_display_shell_render (GimpDisplayShell *shell,
GimpImage *image;
GimpProjection *projection;
GeglBuffer *buffer;
gdouble window_scale = 1.0;
gint viewport_offset_x;
gint viewport_offset_y;
gint viewport_width;
......@@ -67,6 +68,13 @@ gimp_display_shell_render (GimpDisplayShell *shell,
projection = gimp_image_get_projection (image);
buffer = gimp_pickable_get_buffer (GIMP_PICKABLE (projection));
#ifdef GIMP_DISPLAY_RENDER_ENABLE_SCALING
/* if we had this future API, things would look pretty on hires (retina) */
window_scale = gdk_window_get_scale_factor (gtk_widget_get_window (gtk_widget_get_toplevel (GTK_WIDGET (shell))));
#endif
window_scale = MIN (window_scale, GIMP_DISPLAY_RENDER_MAX_SCALE);
gimp_display_shell_scroll_get_scaled_viewport (shell,
&viewport_offset_x,
&viewport_offset_y,
......@@ -74,10 +82,11 @@ gimp_display_shell_render (GimpDisplayShell *shell,
&viewport_height);
gegl_buffer_get (buffer,
GEGL_RECTANGLE (x + viewport_offset_x,
y + viewport_offset_y,
w, h),
shell->scale_x,
GEGL_RECTANGLE ((x + viewport_offset_x) * window_scale,
(y + viewport_offset_y) * window_scale,
w * window_scale,
h * window_scale),
shell->scale_x * window_scale,
babl_format ("cairo-ARGB32"),
cairo_image_surface_get_data (shell->render_surface),
cairo_image_surface_get_stride (shell->render_surface),
......@@ -91,7 +100,9 @@ gimp_display_shell_render (GimpDisplayShell *shell,
if (w != GIMP_DISPLAY_RENDER_BUF_WIDTH ||
h != GIMP_DISPLAY_RENDER_BUF_HEIGHT)
sub = cairo_image_surface_create_for_data (cairo_image_surface_get_data (sub),
CAIRO_FORMAT_ARGB32, w, h,
CAIRO_FORMAT_ARGB32,
w * window_scale,
h * window_scale,
GIMP_DISPLAY_RENDER_BUF_WIDTH * 4);
gimp_color_display_stack_convert_surface (shell->filter_stack, sub);
......@@ -100,7 +111,9 @@ gimp_display_shell_render (GimpDisplayShell *shell,
cairo_surface_destroy (sub);
}
cairo_surface_mark_dirty_rectangle (shell->render_surface, 0, 0, w, h);
cairo_surface_mark_dirty_rectangle (shell->render_surface,
0, 0,
w * window_scale, h * window_scale);
#if 0
if (shell->mask)
......@@ -136,7 +149,12 @@ gimp_display_shell_render (GimpDisplayShell *shell,
cairo_rectangle (cr, x, y, w, h);
cairo_clip (cr);
cairo_set_source_surface (cr, shell->render_surface, x, y);
cairo_scale (cr, 1.0 / window_scale, 1.0 / window_scale);
cairo_set_source_surface (cr, shell->render_surface,
x * window_scale,
y * window_scale);
cairo_paint (cr);
#if 0
......
......@@ -19,9 +19,17 @@
#define __GIMP_DISPLAY_SHELL_RENDER_H__
/* #define GIMP_DISPLAY_RENDER_ENABLE_SCALING 1 */
#define GIMP_DISPLAY_RENDER_BUF_WIDTH 256
#define GIMP_DISPLAY_RENDER_BUF_HEIGHT 256
#ifdef GIMP_DISPLAY_RENDER_ENABLE_SCALING
#define GIMP_DISPLAY_RENDER_MAX_SCALE 2.0
#else
#define GIMP_DISPLAY_RENDER_MAX_SCALE 1.0
#endif
void gimp_display_shell_render (GimpDisplayShell *shell,
cairo_t *cr,
......
......@@ -300,8 +300,10 @@ gimp_display_shell_init (GimpDisplayShell *shell)
shell->y_src_dec = 1;
shell->render_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
GIMP_DISPLAY_RENDER_BUF_WIDTH,
GIMP_DISPLAY_RENDER_BUF_HEIGHT);
GIMP_DISPLAY_RENDER_BUF_WIDTH *
GIMP_DISPLAY_RENDER_MAX_SCALE,
GIMP_DISPLAY_RENDER_BUF_HEIGHT *
GIMP_DISPLAY_RENDER_MAX_SCALE);
gimp_display_shell_items_init (shell);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment