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.
This commit is contained in:
@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user