@@ -157,60 +157,59 @@ impl ImageFormat {
157157 }
158158
159159 fn save_screen_gif ( & self , screen : & dyn Screen , path : & Path , region : Rectangle ) -> EngineResult < ( ) > {
160- /* use gifski::{Repeat, progress::NoProgress};
161-
162- let size = screen.get_size();
163- let dim = screen.get_font_dimensions();
164- let width = (region.get_width().min(size.width) * dim.width) as usize;
165- let height = (region.get_height().min(size.height) * dim.height) as usize;
166-
167- // Get blink rate from the screen's buffer type (in milliseconds)
168- let blink_rate_ms = screen.buffer_type().get_blink_rate();
169- let blink_rate_secs = blink_rate_ms as f64 / 1000.0;
170-
171- let settings = gifski::Settings {
172- width: Some(width as u32),
173- height: Some(height as u32),
174- quality: 100,
175- fast: true,
176- repeat: Repeat::Infinite,
177- };
178-
179- let (collector, writer) = gifski::new(settings)?;
180-
181- let fs = std::fs::File::create(path)?;
182- let mut pb = NoProgress {};
183-
184- let path_clone = path.to_path_buf();
185- let writer_handle = std::thread::spawn(move || {
186- if let Err(e) = writer.write(fs, &mut pb) {
187- log::error!("GIF writer error for {:?}: {}", path_clone, e);
188- }
189- });
190-
191- // Frame 1: blink_on = true (visible)
192- let options1 = RenderOptions {
193- rect: region.into(),
194- blink_on: true,
195- ..Default::default()
196- };
197- let (frame1_size, frame1_data) = screen.render_to_rgba(&options1);
198- let img1 = Self::create_imgref(frame1_data, frame1_size);
199- collector.add_frame_rgba(0, img1, 0.0)?;
200-
201- // Frame 2: blink_on = false (hidden) - use screen's blink rate
202- let options2 = RenderOptions {
203- rect: region.into(),
204- blink_on: false,
205- ..Default::default()
206- };
207- let (frame2_size, frame2_data) = screen.render_to_rgba(&options2);
208- let img2 = Self::create_imgref(frame2_data, frame2_size);
209- collector.add_frame_rgba(1, img2, blink_rate_secs)?;
210-
211- drop(collector);
212- writer_handle.join().map_err(|_| anyhow::anyhow!("GIF writer thread panicked"))?;
213- */
160+ use gifski:: { Repeat , progress:: NoProgress } ;
161+
162+ let size = screen. get_size ( ) ;
163+ let dim = screen. get_font_dimensions ( ) ;
164+ let width = ( region. get_width ( ) . min ( size. width ) * dim. width ) as usize ;
165+ let height = ( region. get_height ( ) . min ( size. height ) * dim. height ) as usize ;
166+
167+ // Get blink rate from the screen's buffer type (in milliseconds)
168+ let blink_rate_ms = screen. buffer_type ( ) . get_blink_rate ( ) ;
169+ let blink_rate_secs = blink_rate_ms as f64 / 1000.0 ;
170+
171+ let settings = gifski:: Settings {
172+ width : Some ( width as u32 ) ,
173+ height : Some ( height as u32 ) ,
174+ quality : 100 ,
175+ fast : true ,
176+ repeat : Repeat :: Infinite ,
177+ } ;
178+
179+ let ( collector, writer) = gifski:: new ( settings) ?;
180+
181+ let fs = std:: fs:: File :: create ( path) ?;
182+ let mut pb = NoProgress { } ;
183+
184+ let path_clone = path. to_path_buf ( ) ;
185+ let writer_handle = std:: thread:: spawn ( move || {
186+ if let Err ( e) = writer. write ( fs, & mut pb) {
187+ log:: error!( "GIF writer error for {:?}: {}" , path_clone, e) ;
188+ }
189+ } ) ;
190+
191+ // Frame 1: blink_on = true (visible)
192+ let options1 = RenderOptions {
193+ rect : region. into ( ) ,
194+ blink_on : true ,
195+ ..Default :: default ( )
196+ } ;
197+ let ( frame1_size, frame1_data) = screen. render_to_rgba ( & options1) ;
198+ let img1 = Self :: create_imgref ( frame1_data, frame1_size) ;
199+ collector. add_frame_rgba ( 0 , img1, 0.0 ) ?;
200+
201+ // Frame 2: blink_on = false (hidden) - use screen's blink rate
202+ let options2 = RenderOptions {
203+ rect : region. into ( ) ,
204+ blink_on : false ,
205+ ..Default :: default ( )
206+ } ;
207+ let ( frame2_size, frame2_data) = screen. render_to_rgba ( & options2) ;
208+ let img2 = Self :: create_imgref ( frame2_data, frame2_size) ;
209+ collector. add_frame_rgba ( 1 , img2, blink_rate_secs) ?;
210+
211+ drop ( collector) ;
212+ writer_handle. join ( ) . map_err ( |_| anyhow:: anyhow!( "GIF writer thread panicked" ) ) ?;
214213 Ok ( ( ) )
215214 }
216215
@@ -273,65 +272,64 @@ impl ImageFormat {
273272 }
274273
275274 fn save_gif ( & self , buffer : & TextBuffer , path : & Path , region : Rectangle ) -> EngineResult < ( ) > {
276- /*use gifski::{Repeat, progress::NoProgress};
277-
278- let size = buffer.get_size();
279- let dim = buffer.get_font_dimensions();
280- let width = (region.get_width().min(size.width) * dim.width) as usize;
281- let height = (region.get_height().min(size.height) * dim.height) as usize;
282-
283- // Get blink rate from the buffer's type (in milliseconds)
284- let blink_rate_ms = buffer.buffer_type.get_blink_rate();
285- let blink_rate_secs = blink_rate_ms as f64 / 1000.0;
286-
287- let settings = gifski::Settings {
288- width: Some(width as u32),
289- height: Some(height as u32),
290- quality: 100,
291- fast: true,
292- repeat: Repeat::Infinite,
293- };
294-
295- let (collector, writer) = gifski::new(settings)?;
296-
297- let fs = std::fs::File::create(path)?;
298- let mut pb = NoProgress {};
299-
300- // Spawn writer thread
301- let path_clone = path.to_path_buf();
302- let writer_handle = std::thread::spawn(move || {
303- if let Err(e) = writer.write(fs, &mut pb) {
304- log::error!("GIF writer error for {:?}: {}", path_clone, e);
305- }
306- });
307-
308- // Frame 1: blink_on = true (visible)
309- let options1 = RenderOptions {
310- rect: region.into(),
311- blink_on: true,
312- ..Default::default()
313- };
314- let scan_lines = options1.override_scan_lines.unwrap_or(false);
315- let (frame1_size, frame1_data) = buffer.render_to_rgba(&options1, scan_lines);
316- let img1 = Self::create_imgref(frame1_data, frame1_size);
317- collector.add_frame_rgba(0, img1, 0.0)?;
318-
319- // Frame 2: blink_on = false (hidden) - use buffer's blink rate
320- let options2 = RenderOptions {
321- rect: region.into(),
322- blink_on: false,
323- ..Default::default()
324- };
325- let (frame2_size, frame2_data) = buffer.render_to_rgba(&options2, scan_lines);
326- let img2 = Self::create_imgref(frame2_data, frame2_size);
327- collector.add_frame_rgba(1, img2, blink_rate_secs)?;
328-
329- // Drop collector to signal completion
330- drop(collector);
331-
332- // Wait for writer to finish
333- writer_handle.join().map_err(|_| anyhow::anyhow!("GIF writer thread panicked"))?;
334- */
275+ use gifski:: { Repeat , progress:: NoProgress } ;
276+
277+ let size = buffer. get_size ( ) ;
278+ let dim = buffer. get_font_dimensions ( ) ;
279+ let width = ( region. get_width ( ) . min ( size. width ) * dim. width ) as usize ;
280+ let height = ( region. get_height ( ) . min ( size. height ) * dim. height ) as usize ;
281+
282+ // Get blink rate from the buffer's type (in milliseconds)
283+ let blink_rate_ms = buffer. buffer_type . get_blink_rate ( ) ;
284+ let blink_rate_secs = blink_rate_ms as f64 / 1000.0 ;
285+
286+ let settings = gifski:: Settings {
287+ width : Some ( width as u32 ) ,
288+ height : Some ( height as u32 ) ,
289+ quality : 100 ,
290+ fast : true ,
291+ repeat : Repeat :: Infinite ,
292+ } ;
293+
294+ let ( collector, writer) = gifski:: new ( settings) ?;
295+
296+ let fs = std:: fs:: File :: create ( path) ?;
297+ let mut pb = NoProgress { } ;
298+
299+ // Spawn writer thread
300+ let path_clone = path. to_path_buf ( ) ;
301+ let writer_handle = std:: thread:: spawn ( move || {
302+ if let Err ( e) = writer. write ( fs, & mut pb) {
303+ log:: error!( "GIF writer error for {:?}: {}" , path_clone, e) ;
304+ }
305+ } ) ;
306+
307+ // Frame 1: blink_on = true (visible)
308+ let options1 = RenderOptions {
309+ rect : region. into ( ) ,
310+ blink_on : true ,
311+ ..Default :: default ( )
312+ } ;
313+ let scan_lines = options1. override_scan_lines . unwrap_or ( false ) ;
314+ let ( frame1_size, frame1_data) = buffer. render_to_rgba ( & options1, scan_lines) ;
315+ let img1 = Self :: create_imgref ( frame1_data, frame1_size) ;
316+ collector. add_frame_rgba ( 0 , img1, 0.0 ) ?;
317+
318+ // Frame 2: blink_on = false (hidden) - use buffer's blink rate
319+ let options2 = RenderOptions {
320+ rect : region. into ( ) ,
321+ blink_on : false ,
322+ ..Default :: default ( )
323+ } ;
324+ let ( frame2_size, frame2_data) = buffer. render_to_rgba ( & options2, scan_lines) ;
325+ let img2 = Self :: create_imgref ( frame2_data, frame2_size) ;
326+ collector. add_frame_rgba ( 1 , img2, blink_rate_secs) ?;
327+
328+ // Drop collector to signal completion
329+ drop ( collector) ;
330+
331+ // Wait for writer to finish
332+ writer_handle. join ( ) . map_err ( |_| anyhow:: anyhow!( "GIF writer thread panicked" ) ) ?;
335333 Ok ( ( ) )
336334 }
337335
0 commit comments