Skip to content

Commit

Permalink
fix(blur): adjust blur bounding box based on scaled monitor
Browse files Browse the repository at this point in the history
  • Loading branch information
jtheoof committed Jun 2, 2020
1 parent 1be7798 commit 6b2ec90
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 9 deletions.
1 change: 1 addition & 0 deletions include/swappy.h
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ struct swappy_state {

struct swappy_box *window;
struct swappy_box *geometry;
gint scaling_factor;

GList *paints;
GList *redo_paints;
Expand Down
3 changes: 3 additions & 0 deletions src/application.c
Original file line number Diff line number Diff line change
Expand Up @@ -560,11 +560,14 @@ static void compute_window_size(struct swappy_state *state) {
GdkDisplay *display = gdk_display_get_default();
GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(state->ui->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);
g_info("scale_factor: %d", scaling_factor);
g_info("size of monitor at window: %ux%u", workarea.width, workarea.height);
g_assert(workarea.width > 0);
g_assert(workarea.height > 0);

state->scaling_factor = scaling_factor;
state->window = g_new(struct swappy_box, 1);
state->window->x = workarea.x;
state->window->y = workarea.y;
Expand Down
30 changes: 21 additions & 9 deletions src/render.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,22 @@

#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:
* 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;
int width, height;
int src_stride, dst_stride;
Expand All @@ -34,8 +45,8 @@ static void blur_paint(cairo_t *cr, struct swappy_paint_blur *blur) {
const int size = ARRAY_LENGTH(kernel);
const int half = size / 2;
double bluriness = blur->bluriness;
struct swappy_point from = blur->from;
struct swappy_point to = blur->to;
struct swappy_point from = swappy_point_scaled(blur->from, scaling_factor);
struct swappy_point to = swappy_point_scaled(blur->to, scaling_factor);

cairo_surface_t *surface = cairo_get_target(cr);

Expand Down Expand Up @@ -339,7 +350,7 @@ static void render_background(cairo_t *cr) {
}

static void render_blur(cairo_t *cr, struct swappy_paint_blur blur,
bool is_committed) {
bool is_committed, gint scaling_factor) {
if (!is_committed) {
// Blur not committed yet, draw bounding rectangle
struct swappy_paint_shape rect = {
Expand All @@ -354,7 +365,7 @@ static void render_blur(cairo_t *cr, struct swappy_paint_blur blur,
};
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) {
Expand All @@ -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) {
return;
}
switch (paint->type) {
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;
case SWAPPY_PAINT_MODE_BRUSH:
render_brush(cr, paint->content.brush);
Expand All @@ -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) {
for (GList *elem = g_list_last(state->paints); elem; elem = elem->prev) {
struct swappy_paint *paint = elem->data;
render_paint(cr, paint);
render_paint(cr, paint, state->scaling_factor);
}

if (state->temp_paint) {
render_paint(cr, state->temp_paint);
render_paint(cr, state->temp_paint, state->scaling_factor);
}
}

Expand Down

0 comments on commit 6b2ec90

Please sign in to comment.