@@ -7,6 +7,8 @@ use fontdue::{
77use std:: iter:: zip;
88pub use tiny_skia:: { ColorU8 , FillRule , Mask , Paint , PathBuilder , Pixmap , Stroke , Transform } ;
99use tiny_skia:: { LineCap , LineJoin , Path , PixmapPaint } ;
10+ use image:: io:: Reader as ImageReader ;
11+ use std:: io:: Cursor ;
1012
1113#[ derive( Debug ) ]
1214pub enum Shapes {
@@ -112,6 +114,10 @@ pub struct Image {
112114 pub y : i32 ,
113115 pub width : u32 ,
114116 pub height : u32 ,
117+ pub blur : Option < f32 > ,
118+ pub grayscale : Option < bool > ,
119+ pub brighten : Option < i32 > ,
120+ pub invert : Option < bool > ,
115121}
116122
117123#[ derive( Debug ) ]
@@ -509,7 +515,30 @@ impl Shape for Image {
509515
510516 fn draw ( & self , pixmap : & mut Pixmap , context : & DrawContext ) -> ( ) {
511517 let u8_array = base64:: decode ( & self . image ) . expect ( "base64 decode failed" ) ;
512- let p = Pixmap :: decode_png ( & u8_array) . expect ( "decode png failed" ) ;
518+ let mut bytes: Vec < u8 > = Vec :: new ( ) ;
519+
520+ let mut img = ImageReader :: new ( Cursor :: new ( & u8_array as & [ u8 ] ) ) . with_guessed_format ( ) . unwrap ( ) . decode ( ) . unwrap ( ) ;
521+
522+ if let Some ( blur) = self . blur {
523+ img = img. blur ( blur) ;
524+ }
525+ if let Some ( grayscale) = self . grayscale {
526+ if grayscale {
527+ img = img. grayscale ( ) ;
528+ }
529+ }
530+ if let Some ( brighten) = self . brighten {
531+ img = img. brighten ( brighten) ;
532+ }
533+ if let Some ( invert) = self . invert {
534+ if invert {
535+ img. invert ( ) ;
536+ }
537+ }
538+
539+ img. write_to ( & mut Cursor :: new ( & mut bytes) , image:: ImageFormat :: Png ) . unwrap ( ) ;
540+
541+ let p = Pixmap :: decode_png ( & bytes) . expect ( "decode png failed" ) ;
513542 let scale_x = self . width as f32 / p. width ( ) as f32 ;
514543 let scale_y = self . height as f32 / p. height ( ) as f32 ;
515544 pixmap. draw_pixmap (
0 commit comments