From ea76b6988ccafaa6a4d4ed90f2489d0e49e1f180 Mon Sep 17 00:00:00 2001 From: Benjamin Barenblat Date: Sat, 5 Sep 2015 09:32:30 -0400 Subject: Imported Upstream version 0.40.24 --- g_src/renderer_offscreen.cpp | 86 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100755 g_src/renderer_offscreen.cpp (limited to 'g_src/renderer_offscreen.cpp') diff --git a/g_src/renderer_offscreen.cpp b/g_src/renderer_offscreen.cpp new file mode 100755 index 0000000..a3a7f16 --- /dev/null +++ b/g_src/renderer_offscreen.cpp @@ -0,0 +1,86 @@ +#include "renderer_2d.hpp" + + +bool renderer_offscreen::init_video(int w, int h) { + if (screen) SDL_FreeSurface(screen); + // Create an offscreen buffer + screen = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32, 0, 0, 0, 0); + assert(screen); + return true; +} + +renderer_offscreen::~renderer_offscreen() { + //ASSUMES renderer_offscreen IS NEVER gps_allocate()'d THROUGH reshape()/grid_resize() + //to-do: flag for those calls on the renderer to control this behavior? + renderer::screen = NULL; + renderer::screentexpos = NULL; + renderer::screentexpos_addcolor = NULL; + renderer::screentexpos_grayscale = NULL; + renderer::screentexpos_cf = NULL; + renderer::screentexpos_cbr = NULL; + renderer::screen_old = NULL; + renderer::screentexpos_old = NULL; + renderer::screentexpos_addcolor_old = NULL; + renderer::screentexpos_grayscale_old = NULL; + renderer::screentexpos_cf_old = NULL; + renderer::screentexpos_cbr_old = NULL; + + SDL_FreeSurface(screen); +} + +// Create an offscreen renderer of a given grid-size +renderer_offscreen::renderer_offscreen(int grid_x, int grid_y) { + screen = NULL; + dispx = enabler.is_fullscreen() ? + init.font.large_font_dispx : + init.font.small_font_dispx; + dispy = enabler.is_fullscreen() ? + init.font.large_font_dispy : + init.font.small_font_dispy; + dispx_z = dispx; + dispy_z = dispy; + origin_x = origin_y = 0; + zoom_steps = forced_steps = 0; + natural_w = dispx * grid_x; + natural_h = dispy * grid_y; + dimx = grid_x; + dimy = grid_y; + init_video(natural_w, natural_h); + // Copy the GPS pointers here + renderer::screen = gps.screen; + renderer::screentexpos = gps.screentexpos; + renderer::screentexpos_addcolor = gps.screentexpos_addcolor; + renderer::screentexpos_grayscale = gps.screentexpos_grayscale; + renderer::screentexpos_cf = gps.screentexpos_cf; + renderer::screentexpos_cbr = gps.screentexpos_cbr; +} + +// Slurp the entire gps content into the renderer at some given offset +void renderer_offscreen::update_all(int offset_x, int offset_y) { + for (int x = 0; x < gps.dimx; x++) { + for (int y = 0; y < gps.dimy; y++) { + // Read tiles from gps, create cached texture + Either id = screen_to_texid(x, y); + SDL_Surface *tex = id.isL ? + tile_cache_lookup(id.left, false) : + ttf_manager.get_texture(id.right); + if (id.isL) { + tex = tile_cache_lookup(id.left); + } else { + tex = enabler.textures.get_texture_data(id.right); + } + // Figure out where to blit + SDL_Rect dst; + dst.x = dispx * (x+offset_x); + dst.y = dispy * (y+offset_y); + // And blit. + SDL_BlitSurface(tex, NULL, screen, &dst); + } + } +} + +// Save the image to some file +void renderer_offscreen::save_to_file(const string &file) { + // TODO: Support png, etc. + SDL_SaveBMP(screen, file.c_str()); +} -- cgit v1.2.3