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_colors1[index] = unigi_platform_palette1[color]; } else { unigi_platform_colors2[index] = unigi_platform_palette2[color]; } } else { if (unigi_platform_info_depth_bytes == 3) { memcpy( unigi_platform_colors1 + (index * 3), unigi_platform_palette1 + (color * 3), 3 ); } else { unigi_platform_colors4[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_colors1[index + i] = unigi_platform_palette1[pixels[i] & 0x0FFF]; } } else if (unigi_platform_info_depth_bytes == 2) { for (i = 0; i < length; i++) { unigi_platform_colors2[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_colors1 + ((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_colors4[index + i] = unigi_platform_palette4[pixels[i] & 0x0FFF]; } } } void unigi_graphics_flush() { SDL_Flip(unigi_platform_surface); }