]> git.lizzy.rs Git - nothing.git/commitdiff
Make Sprite_font transparent
authorrexim <reximkut@gmail.com>
Sun, 8 Dec 2019 17:56:31 +0000 (00:56 +0700)
committerrexim <reximkut@gmail.com>
Sun, 8 Dec 2019 17:56:31 +0000 (00:56 +0700)
src/game.c
src/game/camera.c
src/game/camera.h
src/game/level_picker.c
src/game/level_picker.h
src/game/sprite_font.c
src/game/sprite_font.h
src/ui/console.h
src/ui/list_selector.c
src/ui/list_selector.h

index 818af559dff78f58acb40cdbef7059ee8588373b..97bf63b0e280bdc15f4d91267cd86acd2aab5048 100644 (file)
@@ -32,7 +32,7 @@ typedef struct Game {
     Lt *lt;
 
     Game_state state;
-    Sprite_font *font;
+    Sprite_font font;
     LevelPicker *level_picker;
     LevelEditor *level_editor;
     Credits *credits;
@@ -68,21 +68,13 @@ Game *create_game(const char *level_folder,
     }
     game->lt = lt;
 
-    game->font = PUSH_LT(
-        lt,
-        create_sprite_font_from_file(
-            "./assets/images/charmap-oldschool.bmp",
-            renderer),
-        destroy_sprite_font);
-    if (game->font == NULL) {
-        RETURN_LT(lt, NULL);
-    }
+    game->font.texture = load_bmp_font_texture(
+        renderer,
+        "./assets/images/charmap-oldschool.bmp");
 
     game->level_picker = PUSH_LT(
         lt,
-        create_level_picker(
-            game->font,
-            level_folder),
+        create_level_picker(level_folder),
         destroy_level_picker);
     if (game->level_picker == NULL) {
         RETURN_LT(lt, NULL);
index fe05bbe403d142b7becb893598ac9bf51a19f9f8..6d37f883c210cdb39d389aaae59d5b691c7ebc83 100644 (file)
@@ -25,10 +25,9 @@ static SDL_Color camera_sdl_color(const Camera *camera, Color color)
 }
 
 Camera create_camera(SDL_Renderer *renderer,
-                     Sprite_font *font)
+                     Sprite_font font)
 {
     trace_assert(renderer);
-    trace_assert(font);
 
     Camera camera = {
         .scale = 1.0f,
@@ -176,7 +175,7 @@ int camera_render_text(const Camera *camera,
     const Vec2f screen_position = camera_point(camera, position);
 
     if (sprite_font_render_text(
-            camera->font,
+            &camera->font,
             camera->renderer,
             screen_position,
             vec(size.x * scale.x * camera->scale, size.y * scale.y * camera->scale),
@@ -446,7 +445,7 @@ int camera_render_text_screen(const Camera *camera,
     trace_assert(text);
 
     return sprite_font_render_text(
-        camera->font,
+        &camera->font,
         camera->renderer,
         position,
         size,
@@ -512,11 +511,6 @@ int camera_draw_thicc_rect_screen(const Camera *camera,
     return 0;
 }
 
-const Sprite_font *camera_font(const Camera *camera)
-{
-    return camera->font;
-}
-
 int camera_draw_line(const Camera *camera,
                      Vec2f begin, Vec2f end,
                      Color color)
index 71943de9eb4468b6a82aebe2a40574d976d97cfd..7d2cb96781b80dcb85e9ee810aad4a235c50fd4b 100644 (file)
@@ -15,11 +15,11 @@ typedef struct {
     Vec2f position;
     float scale;
     SDL_Renderer *renderer;
-    Sprite_font *font;
+    Sprite_font font;
 } Camera;
 
 Camera create_camera(SDL_Renderer *renderer,
-                     Sprite_font *font);
+                     Sprite_font font);
 
 int camera_clear_background(const Camera *camera,
                             Color color);
@@ -99,6 +99,4 @@ int camera_fill_rect_screen(const Camera *camera,
                             Rect rect,
                             Color color);
 
-const Sprite_font *camera_font(const Camera *camera);
-
 #endif  // CAMERA_H_
index 64147df0f4461da5cd196bf2b849193a66d53c16..95fcca40ca846570ba43929f92e54b618efc3b35 100644 (file)
@@ -26,7 +26,7 @@ struct LevelPicker
     ListSelector *list_selector;
 };
 
-LevelPicker *create_level_picker(const Sprite_font *sprite_font, const char *dirpath)
+LevelPicker *create_level_picker(const char *dirpath)
 {
     trace_assert(dirpath);
 
@@ -62,7 +62,6 @@ LevelPicker *create_level_picker(const Sprite_font *sprite_font, const char *dir
     level_picker->list_selector = PUSH_LT(
         lt,
         create_list_selector(
-            sprite_font,
             level_folder_titles(level_picker->level_folder),
             level_folder_count(level_picker->level_folder),
             vec(5.0f, 5.0f),
@@ -101,7 +100,7 @@ int level_picker_render(const LevelPicker *level_picker,
         return -1;
     }
 
-    if (list_selector_render(level_picker->list_selector, camera->renderer) < 0) {
+    if (list_selector_render(camera, level_picker->list_selector) < 0) {
         return -1;
     }
 
index 70bd89602d8e7ffb7b212d667e976807a7f980df..ec20f5093baadcb27bb1003c47c62b7fd57e2b5c 100644 (file)
@@ -4,11 +4,11 @@
 #include <SDL.h>
 
 #include "game/camera.h"
+#include "game/sprite_font.h"
 
 typedef struct LevelPicker LevelPicker;
-typedef struct Sprite_font Sprite_font;
 
-LevelPicker *create_level_picker(const Sprite_font *sprite_font, const char *dirpath);
+LevelPicker *create_level_picker(const char *dirpath);
 void destroy_level_picker(LevelPicker *level_picker);
 
 int level_picker_render(const LevelPicker *level_picker,
index de785e80199ad7b1970fe5054697135fbe4e4b9c..7842eeb12c46e4543f96ff8978f5ddde3931b688 100644 (file)
 
 struct Sprite_font
 {
-    Lt *lt;
     SDL_Texture *texture;
 };
 
-Sprite_font *create_sprite_font_from_file(const char *bmp_file_path,
-                                            SDL_Renderer *renderer)
+static inline
+void *scp(void *ptr)
 {
-    trace_assert(bmp_file_path);
-    trace_assert(renderer);
-
-    Lt *lt = create_lt();
-
-    Sprite_font * const sprite_font = PUSH_LT(lt, nth_calloc(1, sizeof(Sprite_font)), free);
-    if (sprite_font == NULL) {
-        RETURN_LT(lt, NULL);
+    if (ptr == NULL) {
+        log_fail("SDL error: %s\n", SDL_GetError());
+        trace_assert(0 && "SDL error");
     }
 
-    SDL_Surface * const surface = PUSH_LT(lt, SDL_LoadBMP(bmp_file_path), SDL_FreeSurface);
-    if (surface == NULL) {
-        log_fail("Could not load %s: %s\n", bmp_file_path, SDL_GetError());
-        RETURN_LT(lt, NULL);
-    }
+    return ptr;
+}
 
-    if (SDL_SetColorKey(surface,
-                        SDL_TRUE,
-                        SDL_MapRGB(surface->format,
-                                   0, 0, 0)) < 0) {
-        log_fail("SDL_SetColorKey: %s\n", SDL_GetError());
-        RETURN_LT(lt, NULL);
+static inline
+int scc(int code)
+{
+    if (code < 0) {
+        log_fail("SDL error: %s\n", SDL_GetError());
+        trace_assert(0 && "SDL error");
     }
 
-    sprite_font->texture = PUSH_LT(
-        lt,
-        SDL_CreateTextureFromSurface(renderer, surface),
-        SDL_DestroyTexture);
-    if (sprite_font->texture == NULL) {
-        log_fail("SDL_CreateTextureFromSurface: %s\n", SDL_GetError());
-        RETURN_LT(lt, NULL);
-    }
+    return code;
+}
+
+SDL_Texture *load_bmp_font_texture(SDL_Renderer *renderer,
+                                   const char *bmp_file_path)
+{
+    trace_assert(renderer);
+    trace_assert(bmp_file_path);
 
-    SDL_FreeSurface(RELEASE_LT(lt, surface));
+    SDL_Surface *surface = scp(SDL_LoadBMP(bmp_file_path));
+    scc(SDL_SetColorKey(
+            surface,
+            SDL_TRUE,
+            SDL_MapRGB(surface->format,
+                       0, 0, 0)));
 
-    sprite_font->lt = lt;
+    SDL_Texture *result =
+        scp(SDL_CreateTextureFromSurface(renderer, surface));
 
-    return sprite_font;
-}
+    SDL_FreeSurface(surface);
 
-void destroy_sprite_font(Sprite_font *sprite_font)
-{
-    trace_assert(sprite_font);
-    RETURN_LT0(sprite_font->lt);
+    return result;
 }
 
 static SDL_Rect sprite_font_char_rect(const Sprite_font *sprite_font, char x)
index b09d5c70966c9c6e83d44a32e09e26672bedf6ca..138a34ba5bb2d019509cf06440dec9625fe7c5b8 100644 (file)
@@ -8,11 +8,12 @@
 #define FONT_CHAR_WIDTH 7
 #define FONT_CHAR_HEIGHT 9
 
-typedef struct Sprite_font Sprite_font;
+typedef struct {
+    SDL_Texture *texture;
+} Sprite_font;
 
-Sprite_font *create_sprite_font_from_file(const char *bmp_file_path,
-                                            SDL_Renderer *renderer);
-void destroy_sprite_font(Sprite_font *sprite_font);
+SDL_Texture *load_bmp_font_texture(SDL_Renderer *renderer,
+                                   const char *bmp_file_path);
 
 int sprite_font_render_text(const Sprite_font *sprite_font,
                             SDL_Renderer *renderer,
index 648fe33a551c02f0975ca70fe0072fd0de3db47c..afa87038d60ecc26fae2ca1995df24b2faa7bc1c 100644 (file)
@@ -2,9 +2,9 @@
 #define CONSOLE_H_
 
 #include <SDL.h>
+#include "game/sprite_font.h"
 
 typedef struct Console Console;
-typedef struct Sprite_font Sprite_font;
 typedef struct Game Game;
 
 Console *create_console(Game *game);
index e0dac5bbc682369f8e6003b5db3153147d9b00a5..bd84e46a1339f42d996d58285f129a8c5bc46164 100644 (file)
@@ -16,7 +16,6 @@
 struct ListSelector
 {
     Lt *lt;
-    const Sprite_font *sprite_font;
     const char **items;
     size_t count;
     size_t cursor;
@@ -26,8 +25,7 @@ struct ListSelector
     float padding_bottom;
 };
 
-ListSelector *create_list_selector(const Sprite_font *sprite_font,
-                                   const char *items[],
+ListSelector *create_list_selector(const char *items[],
                                    size_t count,
                                    Vec2f font_scale,
                                    float padding_bottom)
@@ -42,7 +40,6 @@ ListSelector *create_list_selector(const Sprite_font *sprite_font,
     }
     list_selector->lt = lt;
 
-    list_selector->sprite_font = sprite_font;
     list_selector->items = items;
     list_selector->count = count;
     list_selector->cursor = 0;
@@ -60,11 +57,11 @@ void destroy_list_selector(ListSelector *list_selector)
     RETURN_LT0(list_selector->lt);
 }
 
-int list_selector_render(const ListSelector *list_selector,
-                         SDL_Renderer *renderer)
+int list_selector_render(const Camera *camera,
+                         const ListSelector *list_selector)
 {
+    trace_assert(camera);
     trace_assert(list_selector);
-    trace_assert(renderer);
 
     for (size_t i = 0; i < list_selector->count; ++i) {
         const Vec2f current_position = vec_sum(
@@ -72,8 +69,8 @@ int list_selector_render(const ListSelector *list_selector,
             vec(0.0f, (float) i * ((float) FONT_CHAR_HEIGHT * list_selector->font_scale.y + list_selector->padding_bottom)));
 
         if (sprite_font_render_text(
-                list_selector->sprite_font,
-                renderer,
+                &camera->font,
+                camera->renderer,
                 current_position,
                 list_selector->font_scale,
                 rgba(1.0f, 1.0f, 1.0f, 1.0f),
@@ -87,11 +84,11 @@ int list_selector_render(const ListSelector *list_selector,
                     current_position,
                     list_selector->font_scale,
                     strlen(list_selector->items[i])));
-            if (SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255) < 0) {
+            if (SDL_SetRenderDrawColor(camera->renderer, 255, 255, 255, 255) < 0) {
                 return -1;
             }
 
-            if (SDL_RenderDrawRect(renderer, &boundary_box) < 0) {
+            if (SDL_RenderDrawRect(camera->renderer, &boundary_box) < 0) {
                 return -1;
             }
         }
index e9d4e9a373e6c4c86af6c8084ba524db9128d89b..124d854347a74df31685782f3d06dceb5f68824a 100644 (file)
@@ -1,18 +1,21 @@
 #ifndef LIST_SELECTOR_H_
 #define LIST_SELECTOR_H_
 
+#include "game/camera.h"
+
 typedef struct ListSelector ListSelector;
 
-ListSelector *create_list_selector(const Sprite_font *sprite_font,
-                                   const char *items[],
+ListSelector *create_list_selector(const char *items[],
                                    size_t count,
                                    Vec2f font_scale,
                                    float padding_bottom);
 void destroy_list_selector(ListSelector *list_selector);
 
-int list_selector_render(const ListSelector *list_selector,
-                         SDL_Renderer *renderer);
-Vec2f list_selector_size(const ListSelector *list_selector, Vec2f font_scale, float padding_bottom);
+int list_selector_render(const Camera *camera,
+                         const ListSelector *list_selector);
+Vec2f list_selector_size(const ListSelector *list_selector,
+                         Vec2f font_scale,
+                         float padding_bottom);
 
 int list_selector_update(ListSelector *list_selector, float delta_time);
 int list_selector_event(ListSelector *list_selector, const SDL_Event *event);