Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ zip = "2.2.2"
uzers = "0.12.1"
md-5 = "0.10.6"
png = "0.17.16"
jxl-oxide = { version = "0.12.2", features = ["image"] }
num_cpus = "1.17.0"
jxl-oxide = { version = "0.12.2", features = ["image", "lcms2", "rayon"] }

# Completion-based IO runtime to enable io_uring / IOCP file IO support.
[dependencies.compio]
Expand Down
121 changes: 94 additions & 27 deletions src/tab.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1775,31 +1775,52 @@ impl ItemThumbnail {
if mime.type_() == mime::IMAGE && check_size("image", max_size_mb * 1000 * 1000) {
tried_supported_file = true;
let dyn_img: Option<image::DynamicImage> = match mime.subtype().as_str() {
"jxl" => match File::open(path) {
Ok(file) => match JxlDecoder::new(file) {
Ok(mut decoder) => {
let mut limits = image::Limits::default();
let max_ram = max_mem * 1000 * 1000 / jobs as u64;
limits.max_alloc = Some(max_ram);
let _ = decoder.set_limits(limits);
match image::DynamicImage::from_decoder(decoder) {
Ok(img) => Some(img),
Err(err) => {
log::warn!("failed to decode jxl {:?}: {}", path, err);
None
}
}
}
Err(err) => {
log::warn!("failed to create jxl decoder {:?}: {}", path, err);
None
}
},
Err(err) => {
log::warn!("failed to open path {:?}: {}", path, err);
None
}
},
"jxl" => {
let jxldynimg = (|| {
let file = File::open(path).map_err(|err| {
log::warn!("failed to open file {:?}: {}", path, err);
}).ok()?;
let mut limits = image::Limits::default();
let max_ram = max_mem * 1000 * 1000 / jobs as u64;
limits.max_alloc = Some(max_ram);
let mut jxl = JxlDecoder::new(file).map_err(|err| {
log::warn!("to create JxlDecoder for {:?}: {}", path, err);
}).ok()?;
let _ = jxl.set_limits(limits);
Some(image::DynamicImage::from_decoder(jxl).map_err(|err| {
log::warn!("failed to decode the file {:?}: {}", path, err);
}).ok()?
)
})();
//TODO: This will be unwrap_or(generic image)
jxldynimg
}
//match File::open(path) {
// //TODO: working
// Ok(file) => match JxlDecoder::new(file) {
// Ok(mut decoder) => {
// let mut limits = image::Limits::default();
// let max_ram = max_mem * 1000 * 1000 / jobs as u64;
// limits.max_alloc = Some(max_ram);
// let _ = decoder.set_limits(limits);
// match image::DynamicImage::from_decoder(decoder) {
// Ok(img) => Some(img),
// Err(err) => {
// log::warn!("failed to decode jxl {:?}: {}", path, err);
// None
// }
// }
// }
// Err(err) => {
// log::warn!("failed to create jxl decoder {:?}: {}", path, err);
// None
// }
// },
// Err(err) => {
// log::warn!("failed to open path {:?}: {}", path, err);
// None
// }
//},
_ => {
match image::ImageReader::open(path).and_then(|img| img.with_guessed_format()) {
Ok(mut reader) => {
Expand Down Expand Up @@ -2056,7 +2077,29 @@ impl Item {
ItemThumbnail::Image(handle, _) => {
if let Some(path) = self.path_opt() {
if self.mime.type_() == mime::IMAGE {
return widget::image(widget::image::Handle::from_path(path)).into();
//TODO: working
match self.mime.subtype().as_str() {
"jxl" => {
let jxl_buffer = (|| {
let file = File::open(path).ok()?;
let jxl = JxlDecoder::new(file).ok()?;
let image = image::DynamicImage::from_decoder(jxl).ok()?;
Some(image.into_rgba8())
})();
//TODO: This will be unwrap_or(generic image)
let imagebuffer = jxl_buffer.unwrap();
return widget::image(widget::image::Handle::from_rgba(
imagebuffer.width(),
imagebuffer.height(),
imagebuffer.into_raw(),
))
.into();
}
_ => {
//TODO: add thumbnailer/generic image
return widget::image(widget::image::Handle::from_path(path)).into();
}
}
}
}
widget::image(handle.clone()).into()
Expand Down Expand Up @@ -4197,12 +4240,36 @@ impl Tab {
element_opt = Some(
widget::container(
//TODO: use widget::image::viewer, when its zoom can be reset
widget::image(widget::image::Handle::from_path(path)),
//TODO: working
match item.mime.subtype().as_str() {
"jxl" => {
let jxl_buffer = (|| {
let file = File::open(path).ok()?;
let jxl = JxlDecoder::new(file).ok()?;
let image =
image::DynamicImage::from_decoder(jxl)
.ok()?;
Some(image.into_rgba8())
})(
);
//TODO: This will be unwrap_or(generic image)
let imagebuffer = jxl_buffer.unwrap();
widget::image(widget::image::Handle::from_rgba(
imagebuffer.width(),
imagebuffer.height(),
imagebuffer.into_raw(),
))
} //TODO: Add a generic image or don't don't display
_ => widget::image(widget::image::Handle::from_path(
path,
)),
},
)
.center(Length::Fill)
.into(),
);
} else {
log::warn!("gallery view is handle?");
element_opt = Some(
widget::container(
//TODO: use widget::image::viewer, when its zoom can be reset
Expand Down