A simple 256-color palette viewer.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

80 lines
2.3 KiB

/* video.c - Initializes and updates the window. */
#include <stdlib.h>
#include "log.h"
#include "video.h"
int tex_width, tex_height, wnd_width, wnd_height;
Uint32 *pixels;
SDL_Window *window = NULL;
SDL_Renderer *renderer = NULL;
SDL_Texture *texture = NULL;
void video_close() {
lprint(INFO, "Closing video subsystem");
SDL_DestroyTexture(texture);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_QuitSubSystem(SDL_INIT_VIDEO);
}
int video_init(const char *title, int render_width, int render_height,
int window_width, int window_height) {
tex_width = render_width;
tex_height = render_height;
wnd_width = window_width;
wnd_height = window_height;
SDL_Init(SDL_INIT_VIDEO);
lprint(INFO, "Initializing video (%ix%i surface, %ix%i window)...",
tex_width, tex_height, wnd_width, wnd_height);
/* Create an SDL window. */
lprint(DEBUG, "Creating window");
window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, window_width, window_height, 0);
if(window == NULL) {
lprint(ERROR, "Error creating window: %s", SDL_GetError());
return 1;
}
/* Create the renderer. */
lprint(DEBUG, "Creating hardware accelerated renderer");
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if(renderer == NULL) {
/* Attempt to fall back to software rendering. */
lprint(WARN, "Failed to create hardware accelerated renderer: %s", SDL_GetError());
lprint(WARN, "Attempting to create a software renderer");
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE | SDL_RENDERER_PRESENTVSYNC);
if(renderer == NULL) {
lprint(ERROR, "Error creating renderer: %s", SDL_GetError());
return 1;
}
}
/* Create an ARGB8888 texture. */
lprint(DEBUG, "Creating texture");
texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STREAMING, tex_width, tex_height);
if(texture == NULL) {
lprint(ERROR, "Error creating texture: %s", SDL_GetError());
return 1;
}
pixels = malloc(sizeof(Uint32) * tex_width * tex_height);
lprint(INFO, "Video subsystem initialized successfully");
return 0;
}
void video_update() {
SDL_UpdateTexture(texture, NULL, pixels, tex_width * sizeof(Uint32));
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
}