Properly clip pixel buffer when larger than surface texture (#190)
- Fixes #186
This commit is contained in:
parent
e08c91bfd2
commit
b00c65fc55
2 changed files with 16 additions and 16 deletions
10
src/lib.rs
10
src/lib.rs
|
@ -464,13 +464,11 @@ impl Pixels {
|
||||||
);
|
);
|
||||||
|
|
||||||
let pos = self.scaling_matrix_inverse * pos;
|
let pos = self.scaling_matrix_inverse * pos;
|
||||||
|
let offset_width = pixels_width.min(physical_width) / 2.0;
|
||||||
|
let offset_height = pixels_height.min(physical_height) / 2.0;
|
||||||
|
|
||||||
let pos = (
|
let pixel_x = (pos.x / pos.w + offset_width).floor() as isize;
|
||||||
pos.x / pos.w + pixels_width / 2.0,
|
let pixel_y = (-pos.y / pos.w + offset_height).floor() as isize;
|
||||||
-pos.y / pos.w + pixels_height / 2.0,
|
|
||||||
);
|
|
||||||
let pixel_x = pos.0.floor() as isize;
|
|
||||||
let pixel_y = pos.1.floor() as isize;
|
|
||||||
|
|
||||||
if pixel_x < 0
|
if pixel_x < 0
|
||||||
|| pixel_x >= self.context.texture_extent.width as isize
|
|| pixel_x >= self.context.texture_extent.width as isize
|
||||||
|
|
|
@ -253,26 +253,28 @@ impl ScalingMatrix {
|
||||||
let scaled_width = texture_width * scale;
|
let scaled_width = texture_width * scale;
|
||||||
let scaled_height = texture_height * scale;
|
let scaled_height = texture_height * scale;
|
||||||
|
|
||||||
// Update transformation matrix
|
// Create a transformation matrix
|
||||||
let sw = scaled_width / screen_width;
|
let sw = scaled_width / screen_width;
|
||||||
let sh = scaled_height / screen_height;
|
let sh = scaled_height / screen_height;
|
||||||
|
let tx = (texture_width / screen_width - 1.0).max(0.0);
|
||||||
|
let ty = (1.0 - texture_height / screen_height).min(0.0);
|
||||||
#[rustfmt::skip]
|
#[rustfmt::skip]
|
||||||
let transform: [f32; 16] = [
|
let transform: [f32; 16] = [
|
||||||
sw, 0.0, 0.0, 0.0,
|
sw, 0.0, 0.0, 0.0,
|
||||||
0.0, -sh, 0.0, 0.0,
|
0.0, -sh, 0.0, 0.0,
|
||||||
0.0, 0.0, 1.0, 0.0,
|
0.0, 0.0, 1.0, 0.0,
|
||||||
0.0, 0.0, 0.0, 1.0,
|
tx, ty, 0.0, 1.0,
|
||||||
];
|
];
|
||||||
|
|
||||||
// Create a clipping rectangle
|
// Create a clipping rectangle
|
||||||
let x = (screen_width - scaled_width) / 2.0;
|
let clip_rect = {
|
||||||
let y = (screen_height - scaled_height) / 2.0;
|
let scaled_width = scaled_width.min(screen_width);
|
||||||
let clip_rect = (
|
let scaled_height = scaled_height.min(screen_height);
|
||||||
x as u32,
|
let x = ((screen_width - scaled_width) / 2.0) as u32;
|
||||||
y as u32,
|
let y = ((screen_height - scaled_height) / 2.0) as u32;
|
||||||
scaled_width as u32,
|
|
||||||
scaled_height as u32,
|
(x, y, scaled_width as u32, scaled_height as u32)
|
||||||
);
|
};
|
||||||
|
|
||||||
ScalingMatrix {
|
ScalingMatrix {
|
||||||
transform: Mat4::from(transform),
|
transform: Mat4::from(transform),
|
||||||
|
|
Loading…
Add table
Reference in a new issue