@@ -4,16 +4,16 @@ use crate::{CosmicBg, CosmicBgLayer};
44
55use std:: {
66 collections:: VecDeque ,
7- fs,
7+ fs:: { self , File } ,
88 path:: PathBuf ,
99 time:: { Duration , Instant } ,
1010} ;
1111
1212use cosmic_bg_config:: { Color , Entry , SamplingMethod , ScalingMode , Source , state:: State } ;
1313use cosmic_config:: CosmicConfigEntry ;
14- use eyre:: { OptionExt , eyre} ;
15- use image:: { DynamicImage , GrayAlphaImage , GrayImage , ImageReader , RgbImage , RgbaImage } ;
16- use jxl_oxide:: { EnumColourEncoding , JxlImage , PixelFormat } ;
14+ use eyre:: eyre;
15+ use image:: { DynamicImage , ImageReader } ;
16+ use jxl_oxide:: integration :: JxlDecoder ;
1717use notify:: { RecommendedWatcher , RecursiveMode , Watcher } ;
1818use rand:: { rng, seq:: SliceRandom } ;
1919use sctk:: reexports:: {
@@ -405,71 +405,11 @@ fn current_image(output: &str) -> Option<Source> {
405405
406406/// Decodes JPEG XL image files into `image::DynamicImage` via `jxl-oxide`.
407407fn decode_jpegxl ( path : & std:: path:: Path ) -> eyre:: Result < DynamicImage > {
408- let mut image = JxlImage :: builder ( )
409- . open ( path)
410- . map_err ( |why| eyre ! ( "failed to read image header: {why}" ) ) ?;
411-
412- image. request_color_encoding ( EnumColourEncoding :: srgb (
413- jxl_oxide:: RenderingIntent :: Relative ,
414- ) ) ;
415-
416- let render = image
417- . render_frame ( 0 )
418- . map_err ( |why| eyre ! ( "failed to render image frame: {why}" ) ) ?;
419-
420- let framebuffer = render. image_all_channels ( ) ;
421-
422- match image. pixel_format ( ) {
423- PixelFormat :: Graya => GrayAlphaImage :: from_raw (
424- framebuffer. width ( ) as u32 ,
425- framebuffer. height ( ) as u32 ,
426- framebuffer
427- . buf ( )
428- . iter ( )
429- . map ( |x| x * 255. + 0.5 )
430- . map ( |x| x as u8 )
431- . collect :: < Vec < _ > > ( ) ,
432- )
433- . map ( DynamicImage :: ImageLumaA8 )
434- . ok_or_eyre ( "Can't decode gray alpha buffer" ) ,
435- PixelFormat :: Gray => GrayImage :: from_raw (
436- framebuffer. width ( ) as u32 ,
437- framebuffer. height ( ) as u32 ,
438- framebuffer
439- . buf ( )
440- . iter ( )
441- . map ( |x| x * 255. + 0.5 )
442- . map ( |x| x as u8 )
443- . collect :: < Vec < _ > > ( ) ,
444- )
445- . map ( DynamicImage :: ImageLuma8 )
446- . ok_or_eyre ( "Can't decode gray buffer" ) ,
447- PixelFormat :: Rgba => RgbaImage :: from_raw (
448- framebuffer. width ( ) as u32 ,
449- framebuffer. height ( ) as u32 ,
450- framebuffer
451- . buf ( )
452- . iter ( )
453- . map ( |x| x * 255. + 0.5 )
454- . map ( |x| x as u8 )
455- . collect :: < Vec < _ > > ( ) ,
456- )
457- . map ( DynamicImage :: ImageRgba8 )
458- . ok_or_eyre ( "Can't decode rgba buffer" ) ,
459- PixelFormat :: Rgb => RgbImage :: from_raw (
460- framebuffer. width ( ) as u32 ,
461- framebuffer. height ( ) as u32 ,
462- framebuffer
463- . buf ( )
464- . iter ( )
465- . map ( |x| x * 255. + 0.5 )
466- . map ( |x| x as u8 )
467- . collect :: < Vec < _ > > ( ) ,
468- )
469- . map ( DynamicImage :: ImageRgb8 )
470- . ok_or_eyre ( "Can't decode rgb buffer" ) ,
471- //TODO: handle this
472- PixelFormat :: Cmyk => Err ( eyre ! ( "unsupported pixel format: CMYK" ) ) ,
473- PixelFormat :: Cmyka => Err ( eyre ! ( "unsupported pixel format: CMYKA" ) ) ,
474- }
408+ let file = File :: open ( path) . map_err ( |why| eyre ! ( "failed to open jxl image file: {why}" ) ) ?;
409+
410+ let decoder =
411+ JxlDecoder :: new ( file) . map_err ( |why| eyre ! ( "failed to read jxl image header: {why}" ) ) ?;
412+
413+ image:: DynamicImage :: from_decoder ( decoder)
414+ . map_err ( |why| eyre ! ( "failed to decode jxl image: {why}" ) )
475415}
0 commit comments