2 // VIDEO.CPP: SDL/local hardware specific video routines
6 // JLH = James Hammons <jlhamm@acm.org>
9 // --- ---------- ------------------------------------------------------------
10 // JLH 01/04/2006 Added changelog ;-)
11 // JLH 01/20/2006 Cut out unnecessary buffering
15 #include <string.h> // Why??? (for memset, etc... Lazy!) Dunno why, but this just strikes me as wrong...
18 #include "apple2-icon-64x64.h"
23 // Exported global variables (actually, these are LOCAL global variables, EXPORTED...)
25 static SDL_Window * sdlWindow = NULL;
26 SDL_Renderer * sdlRenderer = NULL;
27 static SDL_Texture * sdlTexture = NULL;
28 uint32_t scrBuffer[VIRTUAL_SCREEN_WIDTH * VIRTUAL_SCREEN_HEIGHT * sizeof(uint32_t)];
32 // Prime SDL and create surfaces
36 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_AUDIO | SDL_INIT_TIMER | SDL_INIT_NOPARACHUTE) != 0)
38 WriteLog("Video: Could not initialize the SDL library: %s\n", SDL_GetError());
42 int retVal = SDL_CreateWindowAndRenderer(VIRTUAL_SCREEN_WIDTH * 2, VIRTUAL_SCREEN_HEIGHT * 2, SDL_WINDOW_OPENGL, &sdlWindow, &sdlRenderer);
46 WriteLog("Video: Could not window and/or renderer: %s\n", SDL_GetError());
50 // Make the scaled rendering look smoother.
51 SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");
52 // SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "nearest");
53 SDL_RenderSetLogicalSize(sdlRenderer, VIRTUAL_SCREEN_WIDTH, VIRTUAL_SCREEN_HEIGHT);
55 // Set the application's icon & title...
56 SDL_Surface * iconSurface = SDL_CreateRGBSurfaceFrom(icon, 64, 64, 32, 64*4, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000);
57 SDL_SetWindowIcon(sdlWindow, iconSurface);
58 SDL_FreeSurface(iconSurface);
59 SDL_SetWindowTitle(sdlWindow, "Apple2 Emulator");
61 sdlTexture = SDL_CreateTexture(sdlRenderer,
62 SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STREAMING,
63 VIRTUAL_SCREEN_WIDTH, VIRTUAL_SCREEN_HEIGHT);
65 WriteLog("Video: Successfully initialized.\n");
71 // Free various SDL components
75 WriteLog("Video: Shutting down SDL...\n");
77 WriteLog("Video: Done.\n");
82 // Render the screen buffer to the primary screen surface
84 void RenderScreenBuffer(void)
86 SDL_UpdateTexture(sdlTexture, NULL, scrBuffer, VIRTUAL_SCREEN_WIDTH * sizeof(Uint32));
87 SDL_RenderClear(sdlRenderer);
88 SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, NULL);
93 // Fullscreen <-> window switching
95 void ToggleFullScreen(void)
97 settings.fullscreen = !settings.fullscreen;
99 int retVal = SDL_SetWindowFullscreen(sdlWindow, (settings.fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0));
100 SDL_ShowCursor(settings.fullscreen ? 0 : 1);
103 WriteLog("Video::ToggleFullScreen: SDL error = %s\n", SDL_GetError());