aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.c42
-rwxr-xr-xsrc/sdl/graphics.c45
-rw-r--r--src/sdl/graphics.h6
3 files changed, 67 insertions, 26 deletions
diff --git a/src/main.c b/src/main.c
index e2c88c6..39ce6ae 100644
--- a/src/main.c
+++ b/src/main.c
@@ -48,7 +48,7 @@ int main(int argc, char **argv)
SDL_Delay(5000);
exit(EXIT_FAILURE);
}
-
+ int desktopFS = 0;
#if defined(PANDORA) || defined(PYRA) || defined(CHIP) || defined(ODROID)
wantFullscreen = 1;
#else
@@ -57,20 +57,10 @@ int main(int argc, char **argv)
#ifdef CHIP
screenScale = 1;
#elif defined(PYRA)
- screenScale = 3;
+ //screenScale = 3;
+ desktopFS = 1;
#elif defined(ODROID)
- const SDL_VideoInfo* infos = SDL_GetVideoInfo();
- int maxy = infos->current_h;
- if(maxy < 640)
- screenScale = 1;
- else if (maxy < 720)
- screenScale = 2;
- else if (maxy < 960)
- screenScale = 3;
- else if (maxy < 1200)
- screenScale = 4;
- else
- screenScale = 5;
+ desktopFS = 1;
#else
screenScale = 2;
#endif
@@ -82,6 +72,10 @@ int main(int argc, char **argv)
wantFullscreen = 1;
if(!strcmp(argv[i], "--fullscreen"))
wantFullscreen = 1;
+ if(!strcmp(argv[i], "-d"))
+ desktopFS = 1;
+ if(!strcmp(argv[i], "--desktop"))
+ desktopFS = 1;
if(!strcmp(argv[i], "-x1"))
screenScale = 1;
if(!strcmp(argv[i], "-x2"))
@@ -97,11 +91,27 @@ int main(int argc, char **argv)
if(!strcmp(argv[i], "--nojoy"))
useJoystick = 0;
if(!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) {
- printf("Quick help\n\t-f|--fullscreen\tUse fullscreen\n\t-x1|-x2|-x3|-x4\tUse screenScale of *1..*4 (default *2 = 640x480)\n\t-j|-nojoy\tdo not use Joystick\n");
+ printf("Quick help\n\t-f|--fullscreen\tUse fullscreen\n\t-d|--desktop\tdesktop fullscreen\n\t-x1|-x2|-x3|-x4\tUse screenScale of *1..*4 (default *2 = 640x480)\n\t-j|-nojoy\tdo not use Joystick\n");
exit(0);
}
}
- printf("Hydra Caslte Labyrinth, %s scale=x%d, using Joystick=%d\n", wantFullscreen?"Fullscreen":"Windowed", screenScale, useJoystick);
+ if(desktopFS)
+ {
+ const SDL_VideoInfo* infos = SDL_GetVideoInfo();
+ screenH = infos->current_h;
+ screenW = infos->current_w;
+ if(screenW/320 < screenH/240)
+ screenScale = screenW/320;
+ else
+ screenScale = screenH/240; // automatic guess the scale
+ deltaX = (screenW-320*screenScale)/2;
+ deltaY = (screenH-240*screenScale)/2;
+
+ } else {
+ screenW = 320 * screenScale;
+ screenH = 240 * screenScale;
+ }
+ printf("Hydra Caslte Labyrinth, %s %dx%d scale=x%d, using Joystick=%d\n", (wantFullscreen || desktopFS)?"Fullscreen":"Windowed", screenW, screenH, screenScale, useJoystick);
#endif
srand(time(NULL));
diff --git a/src/sdl/graphics.c b/src/sdl/graphics.c
index 166eb32..2488fae 100755
--- a/src/sdl/graphics.c
+++ b/src/sdl/graphics.c
@@ -11,6 +11,14 @@ SDL_Surface* backbuffer = NULL;
int wantFullscreen = 0;
int screenScale = 2;
+int deltaX = 0;
+int deltaY = 0;
+
+int screenW = 640;
+int screenH = 480;
+
+int drawscreen = 0;
+
static uint32_t tframe;
extern void Input_InitJoystick();
@@ -31,8 +39,9 @@ void PHL_GraphicsInit()
uint32_t flags = SDL_HWSURFACE|SDL_DOUBLEBUF;
if(wantFullscreen)
flags |= SDL_FULLSCREEN;
- screen = SDL_SetVideoMode(320*screenScale, 240*screenScale, 0, flags);
- drawbuffer = screen;
+ screen = SDL_SetVideoMode(screenW, screenH, 0, flags);
+ drawbuffer = screen;
+ drawscreen = 1;
backbuffer = PHL_NewSurface(320*screenScale, 240*screenScale);
tframe = SDL_GetTicks();
}
@@ -50,6 +59,20 @@ void PHL_StartDrawing()
}
void PHL_EndDrawing()
{
+ // handle black borders
+ if(deltaX) {
+ SDL_Rect rect = {0, 0, deltaX, screenH};
+ SDL_FillRect(screen, &rect, SDL_MapRGB(screen->format, 0, 0, 0));
+ rect.x = screenW - deltaX -1;
+ SDL_FillRect(screen, &rect, SDL_MapRGB(screen->format, 0, 0, 0));
+ }
+ if(deltaY) {
+ SDL_Rect rect = {0, 0, screenW, deltaY};
+ SDL_FillRect(screen, &rect, SDL_MapRGB(screen->format, 0, 0, 0));
+ rect.y = screenH - deltaY -1;
+ SDL_FillRect(screen, &rect, SDL_MapRGB(screen->format, 0, 0, 0));
+ }
+
SDL_Flip(screen);
uint32_t tnext = tframe + 1000/60;
while((tframe = SDL_GetTicks())<tnext)
@@ -63,11 +86,13 @@ void PHL_ForceScreenUpdate()
void PHL_SetDrawbuffer(PHL_Surface surf)
{
- drawbuffer = surf;
+ drawbuffer = surf;
+ drawscreen = (surf==screen);
}
void PHL_ResetDrawbuffer()
{
- drawbuffer = screen;
+ drawbuffer = screen;
+ drawscreen = 1;
}
//PHL_RGB PHL_NewRGB(int r, int g, int b);
@@ -151,7 +176,7 @@ PHL_Surface PHL_LoadBMP(int index)
void PHL_DrawRect(int x, int y, int w, int h, SDL_Color col)
{
- SDL_Rect rect = {x*screenScale/2, y*screenScale/2, w*screenScale/2, h*screenScale/2};
+ SDL_Rect rect = {x*screenScale/2 + (drawscreen?deltaX:0), y*screenScale/2 + (drawscreen?deltaY:0), w*screenScale/2, h*screenScale/2};
SDL_FillRect(drawbuffer, &rect, SDL_MapRGB(drawbuffer->format, col.r, col.g, col.b));
}
@@ -168,8 +193,8 @@ void PHL_DrawSurface(double x, double y, PHL_Surface surface)
}
SDL_Rect offset;
- offset.x = x*screenScale/2;
- offset.y = y*screenScale/2;
+ offset.x = x*screenScale/2 + (drawscreen?deltaX:0);
+ offset.y = y*screenScale/2 + (drawscreen?deltaY:0);
SDL_BlitSurface(surface, NULL, drawbuffer, &offset);
}
@@ -190,15 +215,15 @@ void PHL_DrawSurfacePart(double x, double y, int cropx, int cropy, int cropw, in
crop.w = cropw*screenScale/2;
crop.h = croph*screenScale/2;
- offset.x = x*screenScale/2;
- offset.y = y*screenScale/2;
+ offset.x = x*screenScale/2 + (drawscreen?deltaX:0);
+ offset.y = y*screenScale/2 + (drawscreen?deltaY:0);
SDL_BlitSurface(surface, &crop, drawbuffer, &offset);
}
void PHL_DrawBackground(PHL_Background back, PHL_Background fore)
{
- PHL_DrawSurface(0, 0, backbuffer);
+ PHL_DrawSurface(0, 0, backbuffer);
}
void PHL_UpdateBackground(PHL_Background back, PHL_Background fore)
{
diff --git a/src/sdl/graphics.h b/src/sdl/graphics.h
index 459927d..d3de8bc 100644
--- a/src/sdl/graphics.h
+++ b/src/sdl/graphics.h
@@ -30,6 +30,12 @@ extern PHL_Surface screen;
extern int wantFullscreen;
extern int screenScale;
+extern int deltaX;
+extern int deltaY;
+
+extern int screenW;
+extern int screenH;
+
SDL_Color PHL_NewRGB(uint8_t r, uint8_t g, uint8_t b);
/*
{