Merge pull request #63 from Clownacy/master

Fixed 3x window upscaling
This commit is contained in:
Cucky 2019-02-12 16:26:35 -05:00 committed by GitHub
commit c75894e9ef
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 44 additions and 12 deletions

View file

@ -14,12 +14,15 @@ This project currently depends on SDL2 and Freetype2.
## Building ## Building
Just run 'make' in the base directory, preferably with some of the following optional settings: The project is currently built 'the Linux way':
Just run 'make' in the base directory, preferably with some of the following settings:
* RELEASE=1 to compile a release build (optimised, stripped, etc.) * RELEASE=1 to compile a release build (optimised, stripped, etc.)
* STATIC=1 to produce a statically-linked executable (good for Windows builds) * STATIC=1 to produce a statically-linked executable (good for Windows builds)
* JAPANESE=1 to enable the Japanese-language build (instead of the unofficial Aeon Genesis English translation) * JAPANESE=1 to enable the Japanese-language build (instead of the unofficial Aeon Genesis English translation)
* FIX_BUGS=1 to fix certain bugs (see [src/Bug Fixes.txt](https://github.com/cuckydev/Cave-Story-Engine-2/blob/master/src/Bug%20Fixes.txt)) * FIX_BUGS=1 to fix certain bugs (see [src/Bug Fixes.txt](https://github.com/cuckydev/Cave-Story-Engine-2/blob/master/src/Bug%20Fixes.txt))
* WINDOWS=1 to enable Windows-only features like a unique file/taskbar icon, and system font loading (needed for the font setting in Config.dat to do anything)
## Running ## Running

Binary file not shown.

Before

Width:  |  Height:  |  Size: 400 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 B

View file

@ -189,21 +189,51 @@ static bool LoadBitmap(SDL_RWops *fp, int surf_no, bool create_surface)
{ {
if (create_surface == false || MakeSurface_Generic(surface->w, surface->h, surf_no)) if (create_surface == false || MakeSurface_Generic(surface->w, surface->h, surf_no))
{ {
SDL_Surface *converted_surface = SDL_ConvertSurface(surface, surf[surf_no].surface->format, 0); if (gWindowScale == 1)
if (converted_surface == NULL)
{ {
printf("Couldn't convert bitmap to surface format (surface id %d)\nSDL Error: %s\n", surf_no, SDL_GetError()); SDL_Rect dst_rect = {0, 0, surface->w, surface->h};
} SDL_BlitSurface(surface, NULL, surf[surf_no].surface, &dst_rect);
else
{
SDL_Rect dst_rect = {0, 0, converted_surface->w * gWindowScale, converted_surface->h * gWindowScale};
SDL_BlitScaled(converted_surface, NULL, surf[surf_no].surface, &dst_rect);
SDL_FreeSurface(converted_surface);
surf[surf_no].needs_updating = true; surf[surf_no].needs_updating = true;
printf(" ^ Successfully loaded\n"); printf(" ^ Successfully loaded\n");
success = true; success = true;
} }
else
{
SDL_Surface *converted_surface = SDL_ConvertSurface(surface, surf[surf_no].surface->format, 0);
if (converted_surface == NULL)
{
printf("Couldn't convert bitmap to surface format (surface id %d)\nSDL Error: %s\n", surf_no, SDL_GetError());
}
else
{
// Upscale the bitmap to the game's native resolution (SDL_BlitScaled is buggy, so we have to do it on our own)
const unsigned char (*src_pixels)[converted_surface->pitch] = (unsigned char(*)[converted_surface->pitch])converted_surface->pixels;
unsigned char (*dst_pixels)[surf[surf_no].surface->pitch] = (unsigned char(*)[surf[surf_no].surface->pitch])surf[surf_no].surface->pixels;
for (int h = 0; h < converted_surface->h; ++h)
{
const unsigned long *src_row = (unsigned long*)src_pixels[h];
unsigned long *dst_row = (unsigned long*)dst_pixels[h * gWindowScale];
for (int w = 0; w < converted_surface->w; ++w)
{
const unsigned long src_pixel = *src_row++;
for (int i = 0; i < gWindowScale; ++i)
*dst_row++ = src_pixel;
}
for (int i = 1; i < gWindowScale; ++i)
memcpy(dst_pixels[(h * gWindowScale) + i], dst_pixels[h * gWindowScale], surf[surf_no].surface->w * sizeof(unsigned long));
}
SDL_FreeSurface(converted_surface);
surf[surf_no].needs_updating = true;
printf(" ^ Successfully loaded\n");
success = true;
}
}
} }
SDL_FreeSurface(surface); SDL_FreeSurface(surface);
@ -329,7 +359,6 @@ static void DrawBitmap(RECT *rcView, int x, int y, RECT *rect, int surf_no, bool
SDL_Rect frameRect = RectToSDLRect(rect); SDL_Rect frameRect = RectToSDLRect(rect);
frameRect = {frameRect.x * gWindowScale, frameRect.y * gWindowScale, frameRect.w * gWindowScale, frameRect.h * gWindowScale}; frameRect = {frameRect.x * gWindowScale, frameRect.y * gWindowScale, frameRect.w * gWindowScale, frameRect.h * gWindowScale};
//Get dest rect //Get dest rect
SDL_Rect destRect = {x * gWindowScale, y * gWindowScale, frameRect.w, frameRect.h}; SDL_Rect destRect = {x * gWindowScale, y * gWindowScale, frameRect.w, frameRect.h};