propertiesView: Use image dimensions from decoder
This also shows the units for SVG dimensions if not pixels. Issue #43 Part-of: <https://gitlab.gnome.org/Incubator/loupe/-/merge_requests/136>
This commit is contained in:
parent
490a46d7c4
commit
42d558d22f
9 changed files with 101 additions and 265 deletions
|
|
@ -33,3 +33,10 @@ impl std::fmt::Display for ImageFormat {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Default)]
|
||||
pub enum ImageDimensionDetails {
|
||||
Svg((rsvg::Length, rsvg::Length)),
|
||||
#[default]
|
||||
None,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,7 +58,11 @@ impl Svg {
|
|||
|
||||
let (original_width, original_height) = svg_dimensions(&renderer);
|
||||
|
||||
tiles.set_original_dimensions((original_width, original_height));
|
||||
let intrisic_dimensions = renderer.intrinsic_dimensions();
|
||||
tiles.set_original_dimensions_full(
|
||||
(original_width, original_height),
|
||||
ImageDimensionDetails::Svg((intrisic_dimensions.width, intrisic_dimensions.height)),
|
||||
);
|
||||
|
||||
loop {
|
||||
let tile_request = {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
mod formats;
|
||||
pub mod tiling;
|
||||
|
||||
pub use formats::ImageDimensionDetails;
|
||||
|
||||
use crate::image_metadata::ImageMetadata;
|
||||
use formats::*;
|
||||
use tiling::TilingStoreExt;
|
||||
|
|
@ -36,7 +38,7 @@ pub struct UpdateSender {
|
|||
/// Signals for renderer
|
||||
pub enum DecoderUpdate {
|
||||
/// Dimensions of image in `TilingSore` available/updated
|
||||
Dimensions,
|
||||
Dimensions(ImageDimensionDetails),
|
||||
/// Metadata available
|
||||
Metadata(ImageMetadata),
|
||||
/// Image format determined
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
///! be re-genearted for each zoom level. It can also be used to allow
|
||||
///! showing large JPEGs etc where the complete decoded image would not
|
||||
///! even fit in the VRAM.
|
||||
use super::{DecoderUpdate, UpdateSender};
|
||||
use super::{DecoderUpdate, ImageDimensionDetails, UpdateSender};
|
||||
use crate::deps::*;
|
||||
|
||||
use arc_swap::ArcSwap;
|
||||
|
|
@ -134,9 +134,17 @@ impl TilingStore {
|
|||
}
|
||||
|
||||
pub fn set_original_dimensions(&mut self, dimensions: Coordinates) {
|
||||
self.set_original_dimensions_full(dimensions, Default::default());
|
||||
}
|
||||
|
||||
pub fn set_original_dimensions_full(
|
||||
&mut self,
|
||||
dimensions: Coordinates,
|
||||
dimension_details: ImageDimensionDetails,
|
||||
) {
|
||||
self.original_dimensions = Some(dimensions);
|
||||
if let Some(updater) = &self.update_sender {
|
||||
updater.send(DecoderUpdate::Dimensions);
|
||||
updater.send(DecoderUpdate::Dimensions(dimension_details));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -335,6 +343,11 @@ impl RectExt for graphene::Rect {
|
|||
pub trait TilingStoreExt {
|
||||
fn push(&self, tile: Tile);
|
||||
fn set_original_dimensions(&self, size: Coordinates);
|
||||
fn set_original_dimensions_full(
|
||||
&self,
|
||||
size: Coordinates,
|
||||
dimension_details: ImageDimensionDetails,
|
||||
);
|
||||
fn set_update_sender(&self, sender: UpdateSender);
|
||||
}
|
||||
|
||||
|
|
@ -355,6 +368,18 @@ impl TilingStoreExt for ArcSwap<TilingStore> {
|
|||
});
|
||||
}
|
||||
|
||||
fn set_original_dimensions_full(
|
||||
&self,
|
||||
size: Coordinates,
|
||||
dimension_details: ImageDimensionDetails,
|
||||
) {
|
||||
self.rcu(|tiling_store| {
|
||||
let mut new_store = (**tiling_store).clone();
|
||||
new_store.set_original_dimensions_full(size, dimension_details.clone());
|
||||
Arc::new(new_store)
|
||||
});
|
||||
}
|
||||
|
||||
fn set_update_sender(&self, sender: UpdateSender) {
|
||||
self.rcu(|tiling_store| {
|
||||
let mut new_store = (**tiling_store).clone();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue