mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-07-08 00:05:00 +00:00
Fix incorrectly calculating nonzero-area bounding boxes for empty raster images (#2772)
No bounding box for empty rasters Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
parent
357e77077d
commit
62c7f88f5b
1 changed files with 23 additions and 1 deletions
|
@ -57,6 +57,10 @@ impl Raster<CPU> {
|
||||||
let RasterStorage::Cpu(cpu) = self.data else { unreachable!() };
|
let RasterStorage::Cpu(cpu) = self.data else { unreachable!() };
|
||||||
cpu
|
cpu
|
||||||
}
|
}
|
||||||
|
pub fn is_empty(&self) -> bool {
|
||||||
|
let data = self.data();
|
||||||
|
data.height == 0 || data.width == 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
impl Default for Raster<CPU> {
|
impl Default for Raster<CPU> {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
|
@ -93,6 +97,10 @@ impl Raster<GPU> {
|
||||||
let RasterStorage::Gpu(gpu) = &self.data else { unreachable!() };
|
let RasterStorage::Gpu(gpu) = &self.data else { unreachable!() };
|
||||||
gpu.clone()
|
gpu.clone()
|
||||||
}
|
}
|
||||||
|
pub fn is_empty(&self) -> bool {
|
||||||
|
let data = self.data();
|
||||||
|
data.width() == 0 || data.height() == 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#[cfg(feature = "wgpu")]
|
#[cfg(feature = "wgpu")]
|
||||||
impl Deref for Raster<GPU> {
|
impl Deref for Raster<GPU> {
|
||||||
|
@ -104,9 +112,23 @@ impl Deref for Raster<GPU> {
|
||||||
}
|
}
|
||||||
pub type RasterDataTable<Storage> = Instances<Raster<Storage>>;
|
pub type RasterDataTable<Storage> = Instances<Raster<Storage>>;
|
||||||
|
|
||||||
impl<S: Storage> BoundingBox for RasterDataTable<S> {
|
// TODO: Make this not dupliated
|
||||||
|
impl BoundingBox for RasterDataTable<CPU> {
|
||||||
fn bounding_box(&self, transform: DAffine2, _include_stroke: bool) -> Option<[DVec2; 2]> {
|
fn bounding_box(&self, transform: DAffine2, _include_stroke: bool) -> Option<[DVec2; 2]> {
|
||||||
self.instance_ref_iter()
|
self.instance_ref_iter()
|
||||||
|
.filter(|instance| !instance.instance.is_empty()) // Eliminate empty images
|
||||||
|
.flat_map(|instance| {
|
||||||
|
let transform = transform * *instance.transform;
|
||||||
|
(transform.matrix2.determinant() != 0.).then(|| (transform * Quad::from_box([DVec2::ZERO, DVec2::ONE])).bounding_box())
|
||||||
|
})
|
||||||
|
.reduce(Quad::combine_bounds)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BoundingBox for RasterDataTable<GPU> {
|
||||||
|
fn bounding_box(&self, transform: DAffine2, _include_stroke: bool) -> Option<[DVec2; 2]> {
|
||||||
|
self.instance_ref_iter()
|
||||||
|
.filter(|instance| !instance.instance.is_empty()) // Eliminate empty images
|
||||||
.flat_map(|instance| {
|
.flat_map(|instance| {
|
||||||
let transform = transform * *instance.transform;
|
let transform = transform * *instance.transform;
|
||||||
(transform.matrix2.determinant() != 0.).then(|| (transform * Quad::from_box([DVec2::ZERO, DVec2::ONE])).bounding_box())
|
(transform.matrix2.determinant() != 0.).then(|| (transform * Quad::from_box([DVec2::ZERO, DVec2::ONE])).bounding_box())
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue