metadata: Centralize many loose ends
This commit is contained in:
parent
b6d578cc0a
commit
fe43bc3a4c
21 changed files with 179 additions and 195 deletions
|
|
@ -1,4 +1,4 @@
|
|||
// Copyright (c) 2023 Sophie Herold
|
||||
// Copyright (c) 2023-2024 Sophie Herold
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -24,7 +24,7 @@ use gtk::prelude::*;
|
|||
use super::*;
|
||||
use crate::decoder::tiling::{self, SharedFrameBuffer};
|
||||
use crate::deps::*;
|
||||
use crate::metadata::{ImageFormat, Metadata};
|
||||
use crate::metadata::Metadata;
|
||||
|
||||
pub const FRAME_BUFFER: usize = 3;
|
||||
|
||||
|
|
@ -57,23 +57,20 @@ impl Glycin {
|
|||
|
||||
let image = image_request.request().await?;
|
||||
|
||||
if let Some(exif_raw) = image.info().details.exif.clone() {
|
||||
let mut metadata = Metadata::default();
|
||||
metadata.set_exif_bytes(exif_raw);
|
||||
metadata.set_transformations_applied(image.info().details.transformations_applied);
|
||||
updater.send(DecoderUpdate::Metadata(metadata));
|
||||
}
|
||||
let mut metadata: Metadata = Metadata::default();
|
||||
metadata.set_image_info(image.info().details.clone());
|
||||
metadata.set_mime_type(image.mime_type());
|
||||
updater.send(DecoderUpdate::Metadata(Box::new(metadata)));
|
||||
|
||||
let dimensions = (image.info().width, image.info().height);
|
||||
tiles.set_original_dimensions(dimensions);
|
||||
|
||||
updater.send(DecoderUpdate::Format(ImageFormat::new(
|
||||
image.mime_type(),
|
||||
image.format_name(),
|
||||
)));
|
||||
|
||||
let frame = image.next_frame().await?;
|
||||
|
||||
let mut metadata: Metadata = Metadata::default();
|
||||
metadata.set_frame_info(frame.details);
|
||||
updater.send(DecoderUpdate::Metadata(Box::new(metadata)));
|
||||
|
||||
if let Some(delay) = frame.delay {
|
||||
updater.send(DecoderUpdate::Animated);
|
||||
|
||||
|
|
|
|||
|
|
@ -22,10 +22,3 @@ pub use glycin_proxy::Glycin;
|
|||
pub use svg::{Svg, RSVG_MAX_SIZE};
|
||||
|
||||
use super::{DecoderUpdate, UpdateSender};
|
||||
|
||||
#[derive(Clone, Debug, Default)]
|
||||
pub enum ImageDimensionDetails {
|
||||
Svg(String, Option<(f64, f64)>),
|
||||
#[default]
|
||||
None,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Copyright (c) 2023 Sophie Herold
|
||||
// Copyright (c) 2023-2024 Sophie Herold
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -27,7 +27,7 @@ use super::*;
|
|||
use crate::decoder::tiling::SharedFrameBuffer;
|
||||
use crate::decoder::TileRequest;
|
||||
use crate::deps::*;
|
||||
use crate::metadata::ImageFormat;
|
||||
use crate::metadata::Metadata;
|
||||
|
||||
/// Current librsvg limit on maximum dimensions. See
|
||||
/// <https://gitlab.gnome.org/GNOME/librsvg/-/issues/938>
|
||||
|
|
@ -78,21 +78,12 @@ impl Svg {
|
|||
|
||||
let image = image_request.request().await?;
|
||||
|
||||
let dimensions = if let Some(string) = image.info().details.dimensions_text.as_ref() {
|
||||
ImageDimensionDetails::Svg(string.to_string(), image.info().details.dimensions_inch)
|
||||
} else {
|
||||
ImageDimensionDetails::None
|
||||
};
|
||||
let mut metadata: Metadata = Metadata::default();
|
||||
metadata.set_image_info(image.info().details.clone());
|
||||
metadata.set_mime_type(image.mime_type());
|
||||
updater.send(DecoderUpdate::Metadata(Box::new(metadata)));
|
||||
|
||||
tiles.set_original_dimensions_full(
|
||||
(image.info().width, image.info().height),
|
||||
dimensions,
|
||||
);
|
||||
|
||||
updater.send(DecoderUpdate::Format(ImageFormat::new(
|
||||
image.mime_type(),
|
||||
image.format_name(),
|
||||
)));
|
||||
tiles.set_original_dimensions((image.info().width, image.info().height));
|
||||
|
||||
loop {
|
||||
let tile_request = {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Copyright (c) 2023 Sophie Herold
|
||||
// Copyright (c) 2023-2024 Sophie Herold
|
||||
// Copyright (c) 2023 Julian Hofer
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
|
|
@ -24,13 +24,13 @@ pub mod tiling;
|
|||
use std::sync::Arc;
|
||||
|
||||
use anyhow::Result;
|
||||
pub use formats::RSVG_MAX_SIZE;
|
||||
use formats::*;
|
||||
pub use formats::{ImageDimensionDetails, RSVG_MAX_SIZE};
|
||||
use futures_channel::mpsc;
|
||||
|
||||
use self::tiling::SharedFrameBuffer;
|
||||
use crate::deps::*;
|
||||
use crate::metadata::{ImageFormat, Metadata};
|
||||
use crate::metadata::Metadata;
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
/// Renderer requests new tiles
|
||||
|
|
@ -52,11 +52,9 @@ pub struct UpdateSender {
|
|||
/// Signals for renderer (LpImage)
|
||||
pub enum DecoderUpdate {
|
||||
/// Dimensions of image in `TilingSore` available/updated
|
||||
Dimensions(ImageDimensionDetails),
|
||||
Dimensions,
|
||||
/// Metadata available
|
||||
Metadata(Metadata),
|
||||
/// Image format determined
|
||||
Format(ImageFormat),
|
||||
Metadata(Box<Metadata>),
|
||||
/// Image format not supported or unknown
|
||||
UnsupportedFormat,
|
||||
/// New image data available, redraw
|
||||
|
|
@ -144,10 +142,6 @@ impl Decoder {
|
|||
// - image/svg+xml
|
||||
// - image/svg+xml-compressed
|
||||
if mime_type.split('+').next() == Some("image/svg") {
|
||||
update_sender.send(DecoderUpdate::Format(ImageFormat::new(
|
||||
mime_type,
|
||||
Some("SVG".into()),
|
||||
)));
|
||||
return FormatDecoder::Svg(Svg::new(file, update_sender, tiles));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Copyright (c) 2023 Sophie Herold
|
||||
// Copyright (c) 2023-2024 Sophie Herold
|
||||
// Copyright (c) 2023 FineFindus
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
|
|
@ -33,7 +33,7 @@ use std::time::Duration;
|
|||
use arc_swap::ArcSwap;
|
||||
use gtk::prelude::*;
|
||||
|
||||
use super::{DecoderUpdate, ImageDimensionDetails, UpdateSender};
|
||||
use super::{DecoderUpdate, UpdateSender};
|
||||
use crate::deps::*;
|
||||
|
||||
const ZOOM_SIGNIFICANT_DIGITS: i32 = 6;
|
||||
|
|
@ -676,14 +676,6 @@ impl SharedFrameBuffer {
|
|||
}
|
||||
|
||||
pub fn set_original_dimensions(&self, size: Coordinates) {
|
||||
self.set_original_dimensions_full(size, Default::default());
|
||||
}
|
||||
|
||||
pub fn set_original_dimensions_full(
|
||||
&self,
|
||||
size: Coordinates,
|
||||
dimension_details: ImageDimensionDetails,
|
||||
) {
|
||||
self.buffer.rcu(|tiling_store| {
|
||||
let mut new_store = (**tiling_store).clone();
|
||||
new_store.current().original_dimensions = Some(size);
|
||||
|
|
@ -691,7 +683,7 @@ impl SharedFrameBuffer {
|
|||
});
|
||||
|
||||
if let Some(updater) = &self.buffer.load().update_sender {
|
||||
updater.send(DecoderUpdate::Dimensions(dimension_details));
|
||||
updater.send(DecoderUpdate::Dimensions);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue