Upscale screenshots 2x

The plan is to have Steam screenshots always be 2x, but in the VVVVVV
screenshots directory (for F6 keybind) save both 1x and 2x.

Again, just for now, the 2x screenshot is being saved to a temporary
location for testing and will get proper timestamps later.
This commit is contained in:
Misa 2024-01-07 17:56:26 -08:00
parent 6d787e221c
commit 9e475546c4
8 changed files with 76 additions and 4 deletions

View File

@ -34,9 +34,19 @@ SDL_Surface* GRAPHICS_tempScreenshot(void)
return graphics.tempScreenshot;
}
SDL_Surface* GRAPHICS_tempScreenshot2x(void)
{
return graphics.tempScreenshot2x;
}
uint8_t UTIL_TakeScreenshot(SDL_Surface** surface)
{
return TakeScreenshot(surface);
}
uint8_t UTIL_UpscaleScreenshot2x(SDL_Surface* src, SDL_Surface** dest)
{
return UpscaleScreenshot2x(src, dest);
}
} /* extern "C" */

View File

@ -11,7 +11,9 @@ extern "C" {
char* HELP_number_words(int _t, const char* number_class);
uint32_t LOC_toupper_ch(uint32_t ch);
SDL_Surface* GRAPHICS_tempScreenshot(void);
SDL_Surface* GRAPHICS_tempScreenshot2x(void);
uint8_t UTIL_TakeScreenshot(SDL_Surface** surface);
uint8_t UTIL_UpscaleScreenshot2x(SDL_Surface* src, SDL_Surface** dest);
#ifdef __cplusplus
}

View File

@ -112,6 +112,7 @@ void Graphics::init(void)
backgroundTexture = NULL;
foregroundTexture = NULL;
tempScreenshot = NULL;
tempScreenshot2x = NULL;
towerbg = TowerBG();
titlebg = TowerBG();
trinketr = 0;
@ -222,6 +223,7 @@ void Graphics::destroy_buffers(void)
VVV_freefunc(SDL_FreeSurface, tempFilterSrc);
VVV_freefunc(SDL_FreeSurface, tempFilterDest);
VVV_freefunc(SDL_FreeSurface, tempScreenshot);
VVV_freefunc(SDL_FreeSurface, tempScreenshot2x);
}
void Graphics::drawspritesetcol(int x, int y, int t, int c)

View File

@ -333,6 +333,7 @@ public:
SDL_Texture* foregroundTexture;
SDL_Texture* tempScrollingTexture;
SDL_Surface* tempScreenshot;
SDL_Surface* tempScreenshot2x;
TowerBG towerbg;
TowerBG titlebg;

View File

@ -523,6 +523,19 @@ bool SaveScreenshot(void)
return false;
}
success = UpscaleScreenshot2x(graphics.tempScreenshot, &graphics.tempScreenshot2x);
if (!success)
{
vlog_error("Could not upscale screenshot to 2x");
return false;
}
success = SaveImage(graphics.tempScreenshot2x, "screenshots/test2x.png");
if (!success)
{
return false;
}
vlog_info("Saved screenshot");
return true;
}

View File

@ -346,3 +346,40 @@ bool TakeScreenshot(SDL_Surface** surface)
return true;
}
bool UpscaleScreenshot2x(SDL_Surface* src, SDL_Surface** dest)
{
if (src == NULL)
{
SDL_assert(0 && "src is NULL!");
return false;
}
if (dest == NULL)
{
SDL_assert(0 && "dest is NULL!");
return false;
}
if (*dest == NULL)
{
*dest = SDL_CreateRGBSurface(
0, src->w * 2, src->h * 2, src->format->BitsPerPixel, 0, 0, 0, 0
);
if (*dest == NULL)
{
WHINE_ONCE_ARGS(
("Could not create temporary surface: %s", SDL_GetError())
);
return false;
}
}
int result = SDL_BlitScaled(src, NULL, *dest, NULL);
if (result != 0)
{
WHINE_ONCE_ARGS(("Could not blit surface: %s", SDL_GetError()));
return false;
}
return true;
}

View File

@ -15,5 +15,6 @@ void UpdateFilter(void);
void ApplyFilter(SDL_Surface** src, SDL_Surface** dest);
bool TakeScreenshot(SDL_Surface** surface);
bool UpscaleScreenshot2x(SDL_Surface* src, SDL_Surface** dest);
#endif /* GRAPHICSUTIL_H */

View File

@ -131,13 +131,19 @@ static void run_screenshot()
{
return;
}
SDL_Surface* surface2x = GRAPHICS_tempScreenshot2x();
success = UTIL_UpscaleScreenshot2x(surface, &surface2x);
if (!success)
{
return;
}
SteamAPI_ISteamScreenshots_WriteScreenshot(
steamScreenshots,
surface->pixels,
surface->w * surface->h * surface->format->BytesPerPixel,
surface->w,
surface->h
surface2x->pixels,
surface2x->w * surface2x->h * surface2x->format->BytesPerPixel,
surface2x->w,
surface2x->h
);
}