mirror of
https://github.com/jtheoof/swappy.git
synced 2024-09-11 14:55:49 +03:00
fix(blur): adjust blur bounding box based on scaled monitor
This commit is contained in:
parent
1be7798a8b
commit
6b2ec90efd
@ -211,6 +211,7 @@ struct swappy_state {
|
|||||||
|
|
||||||
struct swappy_box *window;
|
struct swappy_box *window;
|
||||||
struct swappy_box *geometry;
|
struct swappy_box *geometry;
|
||||||
|
gint scaling_factor;
|
||||||
|
|
||||||
GList *paints;
|
GList *paints;
|
||||||
GList *redo_paints;
|
GList *redo_paints;
|
||||||
|
@ -560,11 +560,14 @@ static void compute_window_size(struct swappy_state *state) {
|
|||||||
GdkDisplay *display = gdk_display_get_default();
|
GdkDisplay *display = gdk_display_get_default();
|
||||||
GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(state->ui->window));
|
GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(state->ui->window));
|
||||||
GdkMonitor *monitor = gdk_display_get_monitor_at_window(display, window);
|
GdkMonitor *monitor = gdk_display_get_monitor_at_window(display, window);
|
||||||
|
gint scaling_factor = gdk_monitor_get_scale_factor(monitor);
|
||||||
gdk_monitor_get_workarea(monitor, &workarea);
|
gdk_monitor_get_workarea(monitor, &workarea);
|
||||||
|
g_info("scale_factor: %d", scaling_factor);
|
||||||
g_info("size of monitor at window: %ux%u", workarea.width, workarea.height);
|
g_info("size of monitor at window: %ux%u", workarea.width, workarea.height);
|
||||||
g_assert(workarea.width > 0);
|
g_assert(workarea.width > 0);
|
||||||
g_assert(workarea.height > 0);
|
g_assert(workarea.height > 0);
|
||||||
|
|
||||||
|
state->scaling_factor = scaling_factor;
|
||||||
state->window = g_new(struct swappy_box, 1);
|
state->window = g_new(struct swappy_box, 1);
|
||||||
state->window->x = workarea.x;
|
state->window->x = workarea.x;
|
||||||
state->window->y = workarea.y;
|
state->window->y = workarea.y;
|
||||||
|
30
src/render.c
30
src/render.c
@ -18,11 +18,22 @@
|
|||||||
|
|
||||||
#define ARRAY_LENGTH(a) (sizeof(a) / sizeof(a)[0])
|
#define ARRAY_LENGTH(a) (sizeof(a) / sizeof(a)[0])
|
||||||
|
|
||||||
|
static struct swappy_point swappy_point_scaled(struct swappy_point point,
|
||||||
|
gint scale) {
|
||||||
|
struct swappy_point ret = {
|
||||||
|
.x = point.x * scale,
|
||||||
|
.y = point.y * scale,
|
||||||
|
};
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This code was largely taken from Kristian Høgsberg and Chris Wilson from:
|
* This code was largely taken from Kristian Høgsberg and Chris Wilson from:
|
||||||
* https://www.cairographics.org/cookbook/blur.c/
|
* https://www.cairographics.org/cookbook/blur.c/
|
||||||
*/
|
*/
|
||||||
static void blur_paint(cairo_t *cr, struct swappy_paint_blur *blur) {
|
static void blur_paint(cairo_t *cr, struct swappy_paint_blur *blur,
|
||||||
|
gint scaling_factor) {
|
||||||
cairo_surface_t *tmp;
|
cairo_surface_t *tmp;
|
||||||
int width, height;
|
int width, height;
|
||||||
int src_stride, dst_stride;
|
int src_stride, dst_stride;
|
||||||
@ -34,8 +45,8 @@ static void blur_paint(cairo_t *cr, struct swappy_paint_blur *blur) {
|
|||||||
const int size = ARRAY_LENGTH(kernel);
|
const int size = ARRAY_LENGTH(kernel);
|
||||||
const int half = size / 2;
|
const int half = size / 2;
|
||||||
double bluriness = blur->bluriness;
|
double bluriness = blur->bluriness;
|
||||||
struct swappy_point from = blur->from;
|
struct swappy_point from = swappy_point_scaled(blur->from, scaling_factor);
|
||||||
struct swappy_point to = blur->to;
|
struct swappy_point to = swappy_point_scaled(blur->to, scaling_factor);
|
||||||
|
|
||||||
cairo_surface_t *surface = cairo_get_target(cr);
|
cairo_surface_t *surface = cairo_get_target(cr);
|
||||||
|
|
||||||
@ -339,7 +350,7 @@ static void render_background(cairo_t *cr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void render_blur(cairo_t *cr, struct swappy_paint_blur blur,
|
static void render_blur(cairo_t *cr, struct swappy_paint_blur blur,
|
||||||
bool is_committed) {
|
bool is_committed, gint scaling_factor) {
|
||||||
if (!is_committed) {
|
if (!is_committed) {
|
||||||
// Blur not committed yet, draw bounding rectangle
|
// Blur not committed yet, draw bounding rectangle
|
||||||
struct swappy_paint_shape rect = {
|
struct swappy_paint_shape rect = {
|
||||||
@ -354,7 +365,7 @@ static void render_blur(cairo_t *cr, struct swappy_paint_blur blur,
|
|||||||
};
|
};
|
||||||
render_shape_rectangle(cr, rect);
|
render_shape_rectangle(cr, rect);
|
||||||
}
|
}
|
||||||
blur_paint(cr, &blur);
|
blur_paint(cr, &blur, scaling_factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void render_brush(cairo_t *cr, struct swappy_paint_brush brush) {
|
static void render_brush(cairo_t *cr, struct swappy_paint_brush brush) {
|
||||||
@ -377,13 +388,14 @@ static void render_brush(cairo_t *cr, struct swappy_paint_brush brush) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void render_paint(cairo_t *cr, struct swappy_paint *paint) {
|
static void render_paint(cairo_t *cr, struct swappy_paint *paint,
|
||||||
|
gint scaling_factor) {
|
||||||
if (!paint->can_draw) {
|
if (!paint->can_draw) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (paint->type) {
|
switch (paint->type) {
|
||||||
case SWAPPY_PAINT_MODE_BLUR:
|
case SWAPPY_PAINT_MODE_BLUR:
|
||||||
render_blur(cr, paint->content.blur, paint->is_committed);
|
render_blur(cr, paint->content.blur, paint->is_committed, scaling_factor);
|
||||||
break;
|
break;
|
||||||
case SWAPPY_PAINT_MODE_BRUSH:
|
case SWAPPY_PAINT_MODE_BRUSH:
|
||||||
render_brush(cr, paint->content.brush);
|
render_brush(cr, paint->content.brush);
|
||||||
@ -405,11 +417,11 @@ static void render_paint(cairo_t *cr, struct swappy_paint *paint) {
|
|||||||
static void render_paints(cairo_t *cr, struct swappy_state *state) {
|
static void render_paints(cairo_t *cr, struct swappy_state *state) {
|
||||||
for (GList *elem = g_list_last(state->paints); elem; elem = elem->prev) {
|
for (GList *elem = g_list_last(state->paints); elem; elem = elem->prev) {
|
||||||
struct swappy_paint *paint = elem->data;
|
struct swappy_paint *paint = elem->data;
|
||||||
render_paint(cr, paint);
|
render_paint(cr, paint, state->scaling_factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state->temp_paint) {
|
if (state->temp_paint) {
|
||||||
render_paint(cr, state->temp_paint);
|
render_paint(cr, state->temp_paint, state->scaling_factor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user