Fix implicit conversion of floats to ints in calls to pixman_region32_contains_point
I do not think the conversion is specifically defined, but on my system and SirCmpwn's the floats are rounded instead of floored, which is incorrect in this case, since for a range from 0 to 256, any value greater or equal to 0 and less than 256 is valid. I.e. [0;256[, or 0 <= x < 256, but if x is e.g. -0.1, then it will be rounded to 0, which is invalid. The correct behavior would be to floor to -1.
This commit is contained in:
parent
fa2e6e7d9d
commit
afa2e399aa
|
@ -381,7 +381,7 @@ void roots_cursor_handle_motion_absolute(struct roots_cursor *cursor,
|
||||||
|
|
||||||
if (cursor->active_constraint &&
|
if (cursor->active_constraint &&
|
||||||
!pixman_region32_contains_point(&cursor->confine,
|
!pixman_region32_contains_point(&cursor->confine,
|
||||||
lx - view->x, ly - view->y, NULL)) {
|
floor(lx - view->x), floor(ly - view->y), NULL)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -501,7 +501,7 @@ void roots_cursor_handle_tool_axis(struct roots_cursor *cursor,
|
||||||
|
|
||||||
if (cursor->active_constraint &&
|
if (cursor->active_constraint &&
|
||||||
!pixman_region32_contains_point(&cursor->confine,
|
!pixman_region32_contains_point(&cursor->confine,
|
||||||
lx - view->x, ly - view->y, NULL)) {
|
floor(lx - view->x), floor(ly - view->y), NULL)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -602,7 +602,7 @@ void roots_cursor_constrain(struct roots_cursor *cursor,
|
||||||
|
|
||||||
pixman_region32_t *region = &constraint->region;
|
pixman_region32_t *region = &constraint->region;
|
||||||
|
|
||||||
if (!pixman_region32_contains_point(region, sx, sy, NULL)) {
|
if (!pixman_region32_contains_point(region, floor(sx), floor(sy), NULL)) {
|
||||||
// Warp into region if possible
|
// Warp into region if possible
|
||||||
int nboxes;
|
int nboxes;
|
||||||
pixman_box32_t *boxes = pixman_region32_rectangles(region, &nboxes);
|
pixman_box32_t *boxes = pixman_region32_rectangles(region, &nboxes);
|
||||||
|
|
|
@ -943,7 +943,7 @@ bool wlr_surface_point_accepts_input(struct wlr_surface *surface,
|
||||||
double sx, double sy) {
|
double sx, double sy) {
|
||||||
return sx >= 0 && sx < surface->current.width &&
|
return sx >= 0 && sx < surface->current.width &&
|
||||||
sy >= 0 && sy < surface->current.height &&
|
sy >= 0 && sy < surface->current.height &&
|
||||||
pixman_region32_contains_point(&surface->current.input, sx, sy, NULL);
|
pixman_region32_contains_point(&surface->current.input, floor(sx), floor(sy), NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wlr_surface *wlr_surface_surface_at(struct wlr_surface *surface,
|
struct wlr_surface *wlr_surface_surface_at(struct wlr_surface *surface,
|
||||||
|
|
|
@ -241,7 +241,7 @@ static void region_confine(pixman_region32_t *region, double x1, double y1, doub
|
||||||
bool wlr_region_confine(pixman_region32_t *region, double x1, double y1, double x2,
|
bool wlr_region_confine(pixman_region32_t *region, double x1, double y1, double x2,
|
||||||
double y2, double *x2_out, double *y2_out) {
|
double y2, double *x2_out, double *y2_out) {
|
||||||
pixman_box32_t box;
|
pixman_box32_t box;
|
||||||
if (pixman_region32_contains_point(region, x1, y1, &box)) {
|
if (pixman_region32_contains_point(region, floor(x1), floor(y1), &box)) {
|
||||||
region_confine(region, x1, y1, x2, y2, x2_out, y2_out, box);
|
region_confine(region, x1, y1, x2, y2, x2_out, y2_out, box);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue