unigi.platform.sdl1/graphics.c

125 lines
4.1 KiB
C

SDL_Surface * unigi_platform_surface;
uint8_t * unigi_platform_pixels1;
uint16_t * unigi_platform_pixels2;
uint32_t * unigi_platform_pixels4;
unigi_type_error unigi_window_create(unigi_type_resolution resolution, char * title) {
unigi_platform_surface = SDL_SetVideoMode(resolution.width,resolution.height,resolution.depth,SDL_SWSURFACE);
if (unigi_platform_surface == NULL) {
printf("[unigi] Could not initialize window: SDL -> %s\n",SDL_GetError());
return 1;
}
unigi_platform_pixels1 = (uint8_t *)(unigi_platform_surface->pixels);
unigi_platform_pixels2 = (uint16_t *)(unigi_platform_surface->pixels);
unigi_platform_pixels4 = (uint32_t *)(unigi_platform_surface->pixels);
SDL_WM_SetCaption(title,NULL);
return 0;
}
uint8_t * unigi_platform_palette1;
uint16_t * unigi_platform_palette2;
uint32_t * unigi_platform_palette4;
uint8_t unigi_platform_info_depth_bytes;
static inline void unigi_platform_color_16_to_32(unigi_type_color color,uint8_t * a,uint8_t * r, uint8_t * g, uint8_t * b) {
*a = (color >> 12) & 0xF;
*a = *a << 4;
*r = (color >> 8) & 0xF;
*r = *r << 4;
*g = (color >> 4) & 0xF;
*g = *g << 4;
*b = color & 0xF;
*b = *b << 4;
}
unigi_type_error unigi_graphics_init() {
uint8_t r; uint8_t g; uint8_t b;
unigi_type_color color;
uint32_t color_platform;
uint8_t * color_platform8 = (uint8_t *)&color_platform;
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
printf("[unigi] Could not initialize video: SDL -> %s\n",SDL_GetError());
return 1;
}
const SDL_VideoInfo * video_info = SDL_GetVideoInfo();
SDL_PixelFormat * video_format = video_info->vfmt;
unigi_type_resolution_depth bpp = video_format->BitsPerPixel;
unigi_platform_info_depth_bytes = bpp;
while (unigi_platform_info_depth_bytes % 8 != 0) { ++unigi_platform_info_depth_bytes; }
unigi_platform_info_depth_bytes = unigi_platform_info_depth_bytes / 8;
unigi_platform_palette1 = malloc(4096 * unigi_platform_info_depth_bytes);
if (unigi_platform_palette1 == NULL) {
printf("[unigi] Could not initialize video: unigi -> palette malloc failed\n");
return 1;
}
unigi_platform_palette2 = (uint16_t *)unigi_platform_palette1;
unigi_platform_palette4 = (uint32_t *)unigi_platform_palette1;
color = 0;
while (color < 4096) {
unigi_platform_color_16_to_32(color,&r,&r,&g,&b);
color_platform = SDL_MapRGBA(video_format,r,g,b,255);
unigi_type_resolution_depth i;
for(i = 0; i < unigi_platform_info_depth_bytes; i++)
{
unigi_platform_palette1[(color * unigi_platform_info_depth_bytes) + i] = color_platform8[i];
}
++color;
}
return 0;
}
static inline void unigi_graphics_draw(unigi_type_resolution_1d_coord index, unigi_type_color color) {
color = color & 0x0FFF;
if (unigi_platform_info_depth_bytes < 3) {
if (unigi_platform_info_depth_bytes == 1) {
unigi_platform_pixels1[index] = unigi_platform_palette1[color];
} else {
unigi_platform_pixels2[index] = unigi_platform_palette2[color];
}
} else {
if (unigi_platform_info_depth_bytes == 3) {
memcpy(
unigi_platform_pixels1 + (index * 3),
unigi_platform_palette1 + (color * 3),
3
);
} else {
unigi_platform_pixels4[index] = unigi_platform_palette4[color];
}
}
}
static inline void unigi_graphics_blit(unigi_type_resolution_1d_coord index, unigi_type_color * pixels, unigi_type_resolution_1d_coord length) {
unigi_type_resolution_1d_coord i;
if (unigi_platform_info_depth_bytes == 1) {
for (i = 0; i < length; i++) {
unigi_platform_pixels1[index + i] = unigi_platform_palette1[pixels[i] & 0x0FFF];
}
} else if (unigi_platform_info_depth_bytes == 2) {
for (i = 0; i < length; i++) {
unigi_platform_pixels2[index + i] = unigi_platform_palette2[pixels[i] & 0x0FFF];
}
} else if (unigi_platform_info_depth_bytes == 3) {
for (i = 0; i < length; i++) {
memcpy(
unigi_platform_pixels1 + ((index + i) * 3),
unigi_platform_palette1 + ((pixels[i] & 0x0FFF) * 3),
3
);
}
} else if (unigi_platform_info_depth_bytes == 4) {
for (i = 0; i < length; i++) {
unigi_platform_pixels4[index + i] = unigi_platform_palette4[pixels[i] & 0x0FFF];
}
}
}
void unigi_graphics_flush() {
SDL_Flip(unigi_platform_surface);
}