1use std::collections::HashMap;
9
10use rpdfium_core::{Matrix, Name};
11use rpdfium_graphics::ImageRef;
12use rpdfium_parser::Operand;
13
14use crate::error::RenderError;
15
16#[derive(Debug, Clone, Copy, PartialEq, Eq)]
18pub enum DecodedImageFormat {
19 Gray8,
21 Rgb24,
23 Rgba32,
25}
26
27#[derive(Debug, Clone)]
29pub struct DecodedImage {
30 pub width: u32,
32 pub height: u32,
34 pub data: Vec<u8>,
36 pub format: DecodedImageFormat,
38}
39
40pub trait ImageDecoder: Send + Sync {
45 fn decode_image(
47 &self,
48 image_ref: &ImageRef,
49 matrix: &Matrix,
50 ) -> Result<DecodedImage, RenderError>;
51
52 fn decode_inline_image(
54 &self,
55 properties: &HashMap<Name, Operand>,
56 data: &[u8],
57 matrix: &Matrix,
58 ) -> Result<DecodedImage, RenderError>;
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64
65 #[test]
66 fn test_decoded_image_format_eq() {
67 assert_eq!(DecodedImageFormat::Gray8, DecodedImageFormat::Gray8);
68 assert_ne!(DecodedImageFormat::Gray8, DecodedImageFormat::Rgb24);
69 }
70
71 #[test]
72 fn test_decoded_image_clone() {
73 let img = DecodedImage {
74 width: 10,
75 height: 10,
76 data: vec![0; 100],
77 format: DecodedImageFormat::Gray8,
78 };
79 let cloned = img.clone();
80 assert_eq!(cloned.width, 10);
81 assert_eq!(cloned.data.len(), 100);
82 }
83}