#include "gdkdisplayprivate.h"
#include <glib/gi18n-lib.h>
+#include <math.h>
/**
* GdkVulkanContext:
*/
if (capabilities.currentExtent.width == -1 || capabilities.currentExtent.height == -1)
{
- capabilities.currentExtent.width = MAX (1, gdk_surface_get_width (surface) * gdk_surface_get_scale_factor (surface));
- capabilities.currentExtent.height = MAX (1, gdk_surface_get_height (surface) * gdk_surface_get_scale_factor (surface));
+ double scale = gdk_surface_get_scale (surface);
+
+ capabilities.currentExtent.width = MAX (1, (int) ceil (gdk_surface_get_width (surface) * scale));
+ capabilities.currentExtent.height = MAX (1, (int) ceil (gdk_surface_get_height (surface) * scale));
}
res = GDK_VK_CHECK (vkCreateSwapchainKHR, device,
VkPresentRegionsKHR *regionsptr = VK_NULL_HANDLE;
VkPresentRegionsKHR regions;
VkRectLayerKHR *rectangles;
+ double scale;
int n_regions;
- int scale;
- scale = gdk_surface_get_scale_factor (surface);
+ scale = gdk_surface_get_scale (surface);
n_regions = cairo_region_num_rectangles (painted);
rectangles = g_alloca (sizeof (VkRectLayerKHR) * n_regions);
rectangles[i] = (VkRectLayerKHR) {
.layer = 0,
- .offset.x = r.x * scale,
- .offset.y = r.y * scale,
- .extent.width = r.width * scale,
- .extent.height = r.height * scale,
+ .offset.x = (int) floor (r.x * scale),
+ .offset.y = (int) floor (r.y * scale),
+ .extent.width = (int) ceil (r.width * scale),
+ .extent.height = (int) ceil (r.height * scale),
};
}
GskRenderer *renderer;
GdkVulkanContext *vulkan;
- int scale_factor;
+ double scale;
graphene_rect_t viewport;
cairo_region_t *clip;
if (rect)
{
self->viewport = *rect;
- self->scale_factor = 1;
+ self->scale = 1.0;
}
else
{
- self->scale_factor = gdk_surface_get_scale_factor (surface);
+ self->scale = gdk_surface_get_scale (surface);
self->viewport = GRAPHENE_RECT_INIT (0, 0,
- gdk_surface_get_width (surface) * self->scale_factor,
- gdk_surface_get_height (surface) * self->scale_factor);
+ (int) ceil (gdk_surface_get_width (surface) * self->scale),
+ (int) ceil (gdk_surface_get_height (surface) * self->scale));
}
if (clip)
{
GskVulkanRenderPass *pass;
graphene_matrix_t mv;
- graphene_matrix_init_scale (&mv, self->scale_factor, self->scale_factor, 1.0);
+ graphene_matrix_init_scale (&mv, self->scale, self->scale, 1.0);
pass = gsk_vulkan_render_pass_new (self->vulkan,
self->target,
- self->scale_factor,
- self->scale_factor,
+ self->scale,
+ self->scale,
&mv,
&self->viewport,
self->clip,
GdkRectangle whole_surface;
GdkRectangle extents;
GdkSurface *surface;
- int scale;
+ double scale;
render_region = NULL;
surface = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (self->vulkan));
- scale = gdk_surface_get_scale_factor (surface);
+ scale = gdk_surface_get_scale (surface);
whole_surface.x = 0;
whole_surface.y = 0;
cairo_rectangle_int_t rect;
cairo_region_get_rectangle (damage, i, &rect);
cairo_region_union_rectangle (scaled_damage, &(cairo_rectangle_int_t) {
- .x = rect.x * scale,
- .y = rect.y * scale,
- .width = rect.width * scale,
- .height = rect.height * scale,
+ .x = (int) floor (rect.x * scale),
+ .y = (int) floor (rect.y * scale),
+ .width = (int) ceil ((rect.x + rect.width) * scale) - floor (rect.x * scale),
+ .height = (int) ceil ((rect.y + rect.height) * scale) - floor (rect.y * scale),
});
}
GskVulkanRenderer *self)
{
GdkSurface *window;
- int scale_factor;
+ double scale;
gsize width, height;
guint i;
self->targets = g_new (GskVulkanImage *, self->n_targets);
window = gsk_renderer_get_surface (GSK_RENDERER (self));
- scale_factor = gdk_surface_get_scale_factor (window);
- width = gdk_surface_get_width (window) * scale_factor;
- height = gdk_surface_get_height (window) * scale_factor;
+ scale = gdk_surface_get_scale (window);
+ width = (int) ceil (gdk_surface_get_width (window) * scale);
+ height = (int) ceil (gdk_surface_get_height (window) * scale);
for (i = 0; i < self->n_targets; i++)
{