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. pub fn screenshot(path string) ? { if !path.ends_with('.ppm') { return error(@MOD + '.' + @FN + ' currently only supports .ppm files.') } return screenshot_ppm(path) } // screenshot_ppm takes a screenshot of the current window 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 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 ') ? } } } }