fix flipped blit clipping
This commit is contained in:
parent
20d0d8630d
commit
bb54c3bec6
|
@ -101,6 +101,8 @@ pub enum BlitMethod {
|
||||||
/// source to, which may be adjusted as necessary during clipping
|
/// source to, which may be adjusted as necessary during clipping
|
||||||
/// * `dest_y`: the y (top) coordinate of the location on the destination bitmap to blit the source
|
/// * `dest_y`: the y (top) coordinate of the location on the destination bitmap to blit the source
|
||||||
/// to, which may be adjusted as necessary during clipping
|
/// to, which may be adjusted as necessary during clipping
|
||||||
|
/// * `horizontal_flip`: whether the blit is supposed to flip the source image horizontally
|
||||||
|
/// * `vertical_flip`: whether the blit is supposed to flip the source image vertically
|
||||||
///
|
///
|
||||||
/// returns: true if the results of the clip is partially or entirely visible on the destination
|
/// returns: true if the results of the clip is partially or entirely visible on the destination
|
||||||
/// bitmap, or false if the blit is entirely outside of the destination bitmap (and so no blit
|
/// bitmap, or false if the blit is entirely outside of the destination bitmap (and so no blit
|
||||||
|
@ -110,6 +112,8 @@ pub fn clip_blit(
|
||||||
src_blit_region: &mut Rect,
|
src_blit_region: &mut Rect,
|
||||||
dest_x: &mut i32,
|
dest_x: &mut i32,
|
||||||
dest_y: &mut i32,
|
dest_y: &mut i32,
|
||||||
|
horizontal_flip: bool,
|
||||||
|
vertical_flip: bool,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
// off the left edge?
|
// off the left edge?
|
||||||
if *dest_x < dest_clip_region.x {
|
if *dest_x < dest_clip_region.x {
|
||||||
|
@ -119,7 +123,9 @@ pub fn clip_blit(
|
||||||
}
|
}
|
||||||
|
|
||||||
let offset = dest_clip_region.x - *dest_x;
|
let offset = dest_clip_region.x - *dest_x;
|
||||||
src_blit_region.x += offset;
|
if !horizontal_flip {
|
||||||
|
src_blit_region.x += offset;
|
||||||
|
}
|
||||||
src_blit_region.width = (src_blit_region.width as i32 - offset) as u32;
|
src_blit_region.width = (src_blit_region.width as i32 - offset) as u32;
|
||||||
*dest_x = dest_clip_region.x;
|
*dest_x = dest_clip_region.x;
|
||||||
}
|
}
|
||||||
|
@ -132,6 +138,9 @@ pub fn clip_blit(
|
||||||
}
|
}
|
||||||
|
|
||||||
let offset = *dest_x + src_blit_region.width as i32 - dest_clip_region.width as i32;
|
let offset = *dest_x + src_blit_region.width as i32 - dest_clip_region.width as i32;
|
||||||
|
if horizontal_flip {
|
||||||
|
src_blit_region.x += offset;
|
||||||
|
}
|
||||||
src_blit_region.width = (src_blit_region.width as i32 - offset) as u32;
|
src_blit_region.width = (src_blit_region.width as i32 - offset) as u32;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,7 +152,9 @@ pub fn clip_blit(
|
||||||
}
|
}
|
||||||
|
|
||||||
let offset = dest_clip_region.y - *dest_y;
|
let offset = dest_clip_region.y - *dest_y;
|
||||||
src_blit_region.y += offset;
|
if !vertical_flip {
|
||||||
|
src_blit_region.y += offset;
|
||||||
|
}
|
||||||
src_blit_region.height = (src_blit_region.height as i32 - offset) as u32;
|
src_blit_region.height = (src_blit_region.height as i32 - offset) as u32;
|
||||||
*dest_y = dest_clip_region.y;
|
*dest_y = dest_clip_region.y;
|
||||||
}
|
}
|
||||||
|
@ -156,6 +167,9 @@ pub fn clip_blit(
|
||||||
}
|
}
|
||||||
|
|
||||||
let offset = *dest_y + src_blit_region.height as i32 - dest_clip_region.height as i32;
|
let offset = *dest_y + src_blit_region.height as i32 - dest_clip_region.height as i32;
|
||||||
|
if vertical_flip {
|
||||||
|
src_blit_region.y += offset;
|
||||||
|
}
|
||||||
src_blit_region.height = (src_blit_region.height as i32 - offset) as u32;
|
src_blit_region.height = (src_blit_region.height as i32 - offset) as u32;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -639,6 +653,24 @@ impl Bitmap {
|
||||||
RotoZoom { .. } => {}
|
RotoZoom { .. } => {}
|
||||||
RotoZoomTransparent { .. } => {}
|
RotoZoomTransparent { .. } => {}
|
||||||
|
|
||||||
|
// set axis flip arguments
|
||||||
|
SolidFlipped { horizontal_flip, vertical_flip, .. } |
|
||||||
|
SolidFlippedOffset { horizontal_flip, vertical_flip, .. } |
|
||||||
|
TransparentFlipped { horizontal_flip, vertical_flip, .. } |
|
||||||
|
TransparentFlippedSingle { horizontal_flip, vertical_flip, .. } |
|
||||||
|
TransparentFlippedOffset { horizontal_flip, vertical_flip, .. } => {
|
||||||
|
if !clip_blit(
|
||||||
|
self.clip_region(),
|
||||||
|
&mut src_region,
|
||||||
|
&mut dest_x,
|
||||||
|
&mut dest_y,
|
||||||
|
horizontal_flip,
|
||||||
|
vertical_flip,
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// otherwise clip like normal!
|
// otherwise clip like normal!
|
||||||
_ => {
|
_ => {
|
||||||
if !clip_blit(
|
if !clip_blit(
|
||||||
|
@ -646,6 +678,8 @@ impl Bitmap {
|
||||||
&mut src_region,
|
&mut src_region,
|
||||||
&mut dest_x,
|
&mut dest_x,
|
||||||
&mut dest_y,
|
&mut dest_y,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
) {
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -738,7 +772,7 @@ pub mod tests {
|
||||||
src = Rect::new(0, 0, 16, 16);
|
src = Rect::new(0, 0, 16, 16);
|
||||||
x = 10;
|
x = 10;
|
||||||
y = 10;
|
y = 10;
|
||||||
assert!(clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
assert_eq!(src, Rect::new(0, 0, 16, 16));
|
assert_eq!(src, Rect::new(0, 0, 16, 16));
|
||||||
assert_eq!(10, x);
|
assert_eq!(10, x);
|
||||||
assert_eq!(10, y);
|
assert_eq!(10, y);
|
||||||
|
@ -748,7 +782,7 @@ pub mod tests {
|
||||||
src = Rect::new(0, 0, 16, 16);
|
src = Rect::new(0, 0, 16, 16);
|
||||||
x = 0;
|
x = 0;
|
||||||
y = 10;
|
y = 10;
|
||||||
assert!(clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
assert_eq!(src, Rect::new(0, 0, 16, 16));
|
assert_eq!(src, Rect::new(0, 0, 16, 16));
|
||||||
assert_eq!(0, x);
|
assert_eq!(0, x);
|
||||||
assert_eq!(10, y);
|
assert_eq!(10, y);
|
||||||
|
@ -756,7 +790,7 @@ pub mod tests {
|
||||||
src = Rect::new(0, 0, 16, 16);
|
src = Rect::new(0, 0, 16, 16);
|
||||||
x = -5;
|
x = -5;
|
||||||
y = 10;
|
y = 10;
|
||||||
assert!(clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
assert_eq!(src, Rect::new(5, 0, 11, 16));
|
assert_eq!(src, Rect::new(5, 0, 11, 16));
|
||||||
assert_eq!(0, x);
|
assert_eq!(0, x);
|
||||||
assert_eq!(10, y);
|
assert_eq!(10, y);
|
||||||
|
@ -764,14 +798,14 @@ pub mod tests {
|
||||||
src = Rect::new(0, 0, 16, 16);
|
src = Rect::new(0, 0, 16, 16);
|
||||||
x = -16;
|
x = -16;
|
||||||
y = 10;
|
y = 10;
|
||||||
assert!(!clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(!clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
|
|
||||||
// right edge
|
// right edge
|
||||||
|
|
||||||
src = Rect::new(0, 0, 16, 16);
|
src = Rect::new(0, 0, 16, 16);
|
||||||
x = 304;
|
x = 304;
|
||||||
y = 10;
|
y = 10;
|
||||||
assert!(clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
assert_eq!(src, Rect::new(0, 0, 16, 16));
|
assert_eq!(src, Rect::new(0, 0, 16, 16));
|
||||||
assert_eq!(304, x);
|
assert_eq!(304, x);
|
||||||
assert_eq!(10, y);
|
assert_eq!(10, y);
|
||||||
|
@ -779,7 +813,7 @@ pub mod tests {
|
||||||
src = Rect::new(0, 0, 16, 16);
|
src = Rect::new(0, 0, 16, 16);
|
||||||
x = 310;
|
x = 310;
|
||||||
y = 10;
|
y = 10;
|
||||||
assert!(clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
assert_eq!(src, Rect::new(0, 0, 10, 16));
|
assert_eq!(src, Rect::new(0, 0, 10, 16));
|
||||||
assert_eq!(310, x);
|
assert_eq!(310, x);
|
||||||
assert_eq!(10, y);
|
assert_eq!(10, y);
|
||||||
|
@ -787,14 +821,14 @@ pub mod tests {
|
||||||
src = Rect::new(0, 0, 16, 16);
|
src = Rect::new(0, 0, 16, 16);
|
||||||
x = 320;
|
x = 320;
|
||||||
y = 10;
|
y = 10;
|
||||||
assert!(!clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(!clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
|
|
||||||
// top edge
|
// top edge
|
||||||
|
|
||||||
src = Rect::new(0, 0, 16, 16);
|
src = Rect::new(0, 0, 16, 16);
|
||||||
x = 10;
|
x = 10;
|
||||||
y = 0;
|
y = 0;
|
||||||
assert!(clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
assert_eq!(src, Rect::new(0, 0, 16, 16));
|
assert_eq!(src, Rect::new(0, 0, 16, 16));
|
||||||
assert_eq!(10, x);
|
assert_eq!(10, x);
|
||||||
assert_eq!(0, y);
|
assert_eq!(0, y);
|
||||||
|
@ -802,7 +836,7 @@ pub mod tests {
|
||||||
src = Rect::new(0, 0, 16, 16);
|
src = Rect::new(0, 0, 16, 16);
|
||||||
x = 10;
|
x = 10;
|
||||||
y = -5;
|
y = -5;
|
||||||
assert!(clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
assert_eq!(src, Rect::new(0, 5, 16, 11));
|
assert_eq!(src, Rect::new(0, 5, 16, 11));
|
||||||
assert_eq!(10, x);
|
assert_eq!(10, x);
|
||||||
assert_eq!(0, y);
|
assert_eq!(0, y);
|
||||||
|
@ -810,14 +844,14 @@ pub mod tests {
|
||||||
src = Rect::new(0, 0, 16, 16);
|
src = Rect::new(0, 0, 16, 16);
|
||||||
x = 10;
|
x = 10;
|
||||||
y = -16;
|
y = -16;
|
||||||
assert!(!clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(!clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
|
|
||||||
// bottom edge
|
// bottom edge
|
||||||
|
|
||||||
src = Rect::new(0, 0, 16, 16);
|
src = Rect::new(0, 0, 16, 16);
|
||||||
x = 10;
|
x = 10;
|
||||||
y = 224;
|
y = 224;
|
||||||
assert!(clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
assert_eq!(src, Rect::new(0, 0, 16, 16));
|
assert_eq!(src, Rect::new(0, 0, 16, 16));
|
||||||
assert_eq!(10, x);
|
assert_eq!(10, x);
|
||||||
assert_eq!(224, y);
|
assert_eq!(224, y);
|
||||||
|
@ -825,7 +859,7 @@ pub mod tests {
|
||||||
src = Rect::new(0, 0, 16, 16);
|
src = Rect::new(0, 0, 16, 16);
|
||||||
x = 10;
|
x = 10;
|
||||||
y = 229;
|
y = 229;
|
||||||
assert!(clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
assert_eq!(src, Rect::new(0, 0, 16, 11));
|
assert_eq!(src, Rect::new(0, 0, 16, 11));
|
||||||
assert_eq!(10, x);
|
assert_eq!(10, x);
|
||||||
assert_eq!(229, y);
|
assert_eq!(229, y);
|
||||||
|
@ -833,12 +867,12 @@ pub mod tests {
|
||||||
src = Rect::new(0, 0, 16, 16);
|
src = Rect::new(0, 0, 16, 16);
|
||||||
x = 10;
|
x = 10;
|
||||||
y = 240;
|
y = 240;
|
||||||
assert!(!clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(!clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
|
|
||||||
src = Rect::new(16, 16, 16, 16);
|
src = Rect::new(16, 16, 16, 16);
|
||||||
x = -1;
|
x = -1;
|
||||||
y = 112;
|
y = 112;
|
||||||
assert!(clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
assert_eq!(src, Rect::new(17, 16, 15, 16));
|
assert_eq!(src, Rect::new(17, 16, 15, 16));
|
||||||
assert_eq!(0, x);
|
assert_eq!(0, x);
|
||||||
assert_eq!(112, y);
|
assert_eq!(112, y);
|
||||||
|
@ -855,7 +889,7 @@ pub mod tests {
|
||||||
src = Rect::new(0, 0, 128, 128);
|
src = Rect::new(0, 0, 128, 128);
|
||||||
x = 0;
|
x = 0;
|
||||||
y = 0;
|
y = 0;
|
||||||
assert!(clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
assert_eq!(src, Rect::new(0, 0, 64, 64));
|
assert_eq!(src, Rect::new(0, 0, 64, 64));
|
||||||
assert_eq!(0, x);
|
assert_eq!(0, x);
|
||||||
assert_eq!(0, y);
|
assert_eq!(0, y);
|
||||||
|
@ -863,7 +897,7 @@ pub mod tests {
|
||||||
src = Rect::new(0, 0, 128, 128);
|
src = Rect::new(0, 0, 128, 128);
|
||||||
x = -16;
|
x = -16;
|
||||||
y = -24;
|
y = -24;
|
||||||
assert!(clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
assert_eq!(src, Rect::new(16, 24, 64, 64));
|
assert_eq!(src, Rect::new(16, 24, 64, 64));
|
||||||
assert_eq!(0, x);
|
assert_eq!(0, x);
|
||||||
assert_eq!(0, y);
|
assert_eq!(0, y);
|
||||||
|
@ -871,7 +905,7 @@ pub mod tests {
|
||||||
src = Rect::new(0, 0, 32, 128);
|
src = Rect::new(0, 0, 32, 128);
|
||||||
x = 10;
|
x = 10;
|
||||||
y = -20;
|
y = -20;
|
||||||
assert!(clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
assert_eq!(src, Rect::new(0, 20, 32, 64));
|
assert_eq!(src, Rect::new(0, 20, 32, 64));
|
||||||
assert_eq!(10, x);
|
assert_eq!(10, x);
|
||||||
assert_eq!(0, y);
|
assert_eq!(0, y);
|
||||||
|
@ -879,7 +913,7 @@ pub mod tests {
|
||||||
src = Rect::new(0, 0, 128, 32);
|
src = Rect::new(0, 0, 128, 32);
|
||||||
x = -20;
|
x = -20;
|
||||||
y = 10;
|
y = 10;
|
||||||
assert!(clip_blit(&dest, &mut src, &mut x, &mut y));
|
assert!(clip_blit(&dest, &mut src, &mut x, &mut y, false, false));
|
||||||
assert_eq!(src, Rect::new(20, 0, 64, 32));
|
assert_eq!(src, Rect::new(20, 0, 64, 32));
|
||||||
assert_eq!(0, x);
|
assert_eq!(0, x);
|
||||||
assert_eq!(10, y);
|
assert_eq!(10, y);
|
||||||
|
|
Loading…
Reference in a new issue