phantasia

Phantasia - 2D SDL3 RPG prototype.
git clone git://git.beep.wimdupont.com/phantasia.git
Log | Files | Refs | README | LICENSE

render_sdl.c (2652B)


      1 #include "engine/sdl.h"
      2 
      3 #if PH_USE_SDL
      4 struct PhRenderer {
      5 	SDL_Renderer *target;
      6 	SDL_Texture *textures[PH_MAX_ASSETS];
      7 	int texture_count;
      8 };
      9 
     10 PhRenderer *
     11 ph_render_sdl_create(SDL_Renderer *target, const PhAssetDef *defs, int count)
     12 {
     13 	PhRenderer *renderer;
     14 	int i;
     15 
     16 	if (!target || count < 0 || count > PH_MAX_ASSETS || (count && !defs)) return NULL;
     17 	renderer = SDL_calloc(1, sizeof(*renderer));
     18 	if (!renderer) return NULL;
     19 	renderer->target = target;
     20 	renderer->texture_count = count;
     21 	for (i = 0; i < count; ++i) {
     22 		SDL_Surface *surface;
     23 
     24 		if (!defs[i].path) continue;
     25 		surface = SDL_LoadBMP(defs[i].path);
     26 		if (!surface) goto fail;
     27 		if (!SDL_SetSurfaceColorKey(surface, true, SDL_MapSurfaceRGB(surface,
     28 				defs[i].key.r, defs[i].key.g, defs[i].key.b))) {
     29 			SDL_DestroySurface(surface);
     30 			goto fail;
     31 		}
     32 		renderer->textures[i] = SDL_CreateTextureFromSurface(target, surface);
     33 		SDL_DestroySurface(surface);
     34 		if (!renderer->textures[i]) goto fail;
     35 	}
     36 	return renderer;
     37 fail:
     38 	ph_render_destroy(renderer);
     39 	return NULL;
     40 }
     41 
     42 void
     43 ph_render_destroy(PhRenderer *renderer)
     44 {
     45 	int i;
     46 
     47 	if (!renderer) return;
     48 	for (i = 0; i < renderer->texture_count; ++i)
     49 		SDL_DestroyTexture(renderer->textures[i]);
     50 	SDL_free(renderer);
     51 }
     52 
     53 int
     54 ph_render_has_asset(const PhRenderer *renderer, int asset_id)
     55 {
     56 	return renderer && asset_id >= 0 && asset_id < renderer->texture_count &&
     57 		renderer->textures[asset_id] != NULL;
     58 }
     59 
     60 void
     61 ph_render_color(PhRenderer *renderer, PhColor color)
     62 {
     63 	SDL_SetRenderDrawColor(renderer->target, color.r, color.g, color.b, color.a);
     64 }
     65 
     66 void
     67 ph_render_clear(PhRenderer *renderer)
     68 {
     69 	SDL_RenderClear(renderer->target);
     70 }
     71 
     72 void
     73 ph_render_fill(PhRenderer *renderer, PhRect rect)
     74 {
     75 	SDL_FRect native = { rect.x, rect.y, rect.w, rect.h };
     76 
     77 	SDL_RenderFillRect(renderer->target, &native);
     78 }
     79 
     80 void
     81 ph_render_outline(PhRenderer *renderer, PhRect rect)
     82 {
     83 	SDL_FRect native = { rect.x, rect.y, rect.w, rect.h };
     84 
     85 	SDL_RenderRect(renderer->target, &native);
     86 }
     87 
     88 void
     89 ph_render_text(PhRenderer *renderer, float x, float y, const char *text)
     90 {
     91 	SDL_RenderDebugText(renderer->target, x, y, text);
     92 }
     93 
     94 void
     95 ph_render_present(PhRenderer *renderer)
     96 {
     97 	SDL_RenderPresent(renderer->target);
     98 }
     99 
    100 void
    101 ph_render_texture(PhRenderer *renderer, int asset_id, PhRect src, PhRect dst,
    102 	PhFlip flip)
    103 {
    104 	SDL_FRect source = { src.x, src.y, src.w, src.h };
    105 	SDL_FRect destination = { dst.x, dst.y, dst.w, dst.h };
    106 
    107 	if (!ph_render_has_asset(renderer, asset_id)) return;
    108 	SDL_RenderTextureRotated(renderer->target, renderer->textures[asset_id],
    109 		&source, &destination, 0.0, NULL,
    110 		flip == PH_FLIP_HORIZONTAL ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE);
    111 }
    112 #endif