68 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			V
		
	
	
| module sapp
 | |
| 
 | |
| import os
 | |
| import stbi
 | |
| 
 | |
| // v_sapp_gl_read_rgba_pixels reads pixles from the OpenGL buffer into `pixels`.
 | |
| fn C.v_sapp_gl_read_rgba_pixels(x int, y int, width int, height int, pixels charptr)
 | |
| 
 | |
| // screenshot takes a screenshot of the current window and
 | |
| // saves it to `path`. The format is inferred from the extension
 | |
| // of the file name in `path`.
 | |
| //
 | |
| // Supported formats are: `.png`, `.ppm`.
 | |
| pub fn screenshot(path string) ? {
 | |
| 	match os.file_ext(path) {
 | |
| 		'.png' {
 | |
| 			return screenshot_png(path)
 | |
| 		}
 | |
| 		'.ppm' {
 | |
| 			return screenshot_ppm(path)
 | |
| 		}
 | |
| 		else {
 | |
| 			return error(@MOD + '.' + @FN + ' currently only supports .png and .ppm files.')
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // screenshot_ppm takes a screenshot of the current window and
 | |
| // saves it to `path` as a .ppm file.
 | |
| [manualfree]
 | |
| pub fn screenshot_ppm(path string) ? {
 | |
| 	ss := screenshot_window()
 | |
| 	write_rgba_to_ppm(path, ss.width, ss.height, 4, ss.pixels) ?
 | |
| 	unsafe { ss.destroy() }
 | |
| }
 | |
| 
 | |
| // screenshot_png takes a screenshot of the current window and
 | |
| // saves it to `path` as a .png file.
 | |
| [manualfree]
 | |
| pub fn screenshot_png(path string) ? {
 | |
| 	ss := screenshot_window()
 | |
| 	stbi.set_flip_vertically_on_write(true)
 | |
| 	stbi.stbi_write_png(path, ss.width, ss.height, 4, ss.pixels, ss.width * 4) ?
 | |
| 	unsafe { ss.destroy() }
 | |
| }
 | |
| 
 | |
| // write_rgba_to_ppm writes `pixels` data in RGBA format to PPM3 format.
 | |
| fn write_rgba_to_ppm(path string, w int, h int, components int, pixels &byte) ? {
 | |
| 	mut f_out := os.create(path) ?
 | |
| 	defer {
 | |
| 		f_out.close()
 | |
| 	}
 | |
| 	f_out.writeln('P3') ?
 | |
| 	f_out.writeln('$w $h') ?
 | |
| 	f_out.writeln('255') ?
 | |
| 	for i := h - 1; i >= 0; i-- {
 | |
| 		for j := 0; j < w; j++ {
 | |
| 			idx := i * w * components + j * components
 | |
| 			unsafe {
 | |
| 				r := int(pixels[idx])
 | |
| 				g := int(pixels[idx + 1])
 | |
| 				b := int(pixels[idx + 2])
 | |
| 				f_out.write_string('$r $g $b ') ?
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |