void TCOD_image_save(TCOD_image_t image, const char *filename) { image_data_t *img=(image_data_t *)image; void *bitmap=NULL; if ( img->sys_img ) { bitmap=img->sys_img; } else if ( img->mipmaps ){ bitmap=TCOD_sys_create_bitmap(img->mipmaps[0].width, img->mipmaps[0].height, img->mipmaps[0].buf); } if (bitmap) TCOD_sys_save_bitmap(bitmap, filename); }
static void save_screenshot(const char *filename) { if ( TCOD_ctx.renderer == TCOD_RENDERER_SDL ) { /* This would be a lot easier if image saving could do textures. */ SDL_Rect rect; SDL_RenderGetViewport(renderer, &rect); Uint32 format = SDL_GetWindowPixelFormat(window); SDL_Texture *texture = SDL_CreateTexture(renderer, format, SDL_TEXTUREACCESS_TARGET, rect.w, rect.h); if (0 != texture) { if (SDL_SetRenderTarget(renderer, texture)) { void *pixels; int pitch, access; actual_rendering(); SDL_SetRenderTarget(renderer, NULL); rect.x = rect.y = rect.w = rect.h = 0; if (-1 != SDL_QueryTexture(texture, &format, &access, &rect.w, &rect.h) && -1 != SDL_LockTexture(texture, NULL, &pixels, &pitch)) { int depth; Uint32 rmask, gmask, bmask, amask; if (SDL_TRUE == SDL_PixelFormatEnumToMasks(format, &depth, &rmask, &gmask, &bmask, &amask)) { SDL_Surface *surface = SDL_CreateRGBSurfaceFrom(pixels, rect.w, rect.h, depth, pitch, rmask, gmask, bmask, amask); TCOD_sys_save_bitmap((void *)surface,filename); SDL_FreeSurface(surface); } else TCOD_LOG(("TCOD_sys_save_screenshot - failed call to SDL_PixelFormatEnumToMasks")); SDL_UnlockTexture(texture); } else TCOD_LOG(("TCOD_sys_save_screenshot - failed call to SDL_QueryTexture or SDL_LockTexture")); } else TCOD_LOG(("TCOD_sys_save_screenshot - failed call to SDL_SetRenderTarget")); SDL_DestroyTexture(texture); } else TCOD_LOG(("TCOD_sys_save_screenshot - failed call to SDL_CreateTexture")); #ifndef NO_OPENGL } else { SDL_Surface *screenshot=(SDL_Surface *)TCOD_opengl_get_screen(); TCOD_sys_save_bitmap((void *)screenshot,filename); SDL_FreeSurface(screenshot); #endif } }
void TCOD_image_save(TCOD_image_t image, const char *filename) { image_data_t *img=(image_data_t *)image; void *bitmap=NULL; bool must_free=false; if ( img->sys_img ) { bitmap=img->sys_img; } else if ( img->mipmaps ){ bitmap=TCOD_sys_create_bitmap(img->mipmaps[0].width, img->mipmaps[0].height, img->mipmaps[0].buf); must_free=true; } if (bitmap) { TCOD_sys_save_bitmap(bitmap, filename); if ( must_free ) { TCOD_sys_delete_bitmap(bitmap); } } }
void TCOD_sys_save_screenshot(const char *filename) { char buf[128]; if ( filename == NULL ) { // generate filename int idx=0; do { FILE *f=NULL; sprintf(buf,"./screenshot%03d.png",idx); f=fopen(buf,"rb"); if ( ! f ) filename=buf; else { idx++; fclose(f); } } while(!filename); } TCOD_sys_save_bitmap((void *)screen,filename); }