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