diff options
| author | erdgeist <erdgeist@bauklotz.fritz.box> | 2018-04-02 01:38:07 +0200 | 
|---|---|---|
| committer | erdgeist <erdgeist@bauklotz.fritz.box> | 2018-04-02 01:38:07 +0200 | 
| commit | 57bd5755394aeb965f3339e4bd523edbe6986be1 (patch) | |
| tree | 7c1dc465a098c7a78af3d7298a7d0a020e5ad318 | |
| parent | fa0cb86eec43978054f9db295a77449d6b83ba43 (diff) | |
Rework display framework
| -rw-r--r-- | display.c | 69 | ||||
| -rw-r--r-- | display.h | 6 | 
2 files changed, 44 insertions, 31 deletions
| @@ -2,9 +2,12 @@ | |||
| 2 | #include "SDL2/SDL2_gfxPrimitives.h" | 2 | #include "SDL2/SDL2_gfxPrimitives.h" | 
| 3 | #include <SDL2/SDL_ttf.h> | 3 | #include <SDL2/SDL_ttf.h> | 
| 4 | 4 | ||
| 5 | #include "GenBkBasB.h" | ||
| 6 | #include "display.h" | 5 | #include "display.h" | 
| 7 | 6 | ||
| 7 | #define FONT_NAME(suffix) SourceCodePro_Semibold ## suffix | ||
| 8 | extern unsigned char FONT_NAME(_ttf[]); | ||
| 9 | extern unsigned int FONT_NAME(_ttf_len); | ||
| 10 | |||
| 8 | #define display_measure_text(text,w,h) TTF_SizeText(font,(text),(w),(h)) | 11 | #define display_measure_text(text,w,h) TTF_SizeText(font,(text),(w),(h)) | 
| 9 | enum { FONT_SIZE = 28 }; | 12 | enum { FONT_SIZE = 28 }; | 
| 10 | 13 | ||
| @@ -39,7 +42,7 @@ display_init(int screen_width, int screen_height, int harfe_width, int harfe_hei | |||
| 39 | SDL_RenderClear(renderer); | 42 | SDL_RenderClear(renderer); | 
| 40 | 43 | ||
| 41 | TTF_Init(); | 44 | TTF_Init(); | 
| 42 | font_file = SDL_RWFromConstMem(GenBkBasB_ttf, GenBkBasB_ttf_len); | 45 | font_file = SDL_RWFromConstMem( FONT_NAME(_ttf), FONT_NAME(_ttf_len) ); | 
| 43 | font = TTF_OpenFontRW(font_file, 1, FONT_SIZE); | 46 | font = TTF_OpenFontRW(font_file, 1, FONT_SIZE); | 
| 44 | 47 | ||
| 45 | g_scale_factor = (double)harfe_height / (double)screen_height; | 48 | g_scale_factor = (double)harfe_height / (double)screen_height; | 
| @@ -108,17 +111,22 @@ display_line_color(int x0, int y0, int x1, int y1, int color) | |||
| 108 | SDL_RenderDrawLine(renderer, x0, y0, x1, y1); | 111 | SDL_RenderDrawLine(renderer, x0, y0, x1, y1); | 
| 109 | } | 112 | } | 
| 110 | 113 | ||
| 111 | void | 114 | static void | 
| 112 | display_rect_color(int x, int y, int width, int height, int color) | 115 | display_rect_color_static(int x, int y, int width, int height, int color) | 
| 113 | { | 116 | { | 
| 114 | SDL_Rect r; | 117 | SDL_Rect r; | 
| 115 | r.x = x; | 118 | r.x = x; | 
| 116 | r.y = g_screen_height - y; | 119 | r.y = y; | 
| 117 | r.w = width; | 120 | r.w = width; | 
| 118 | r.h = height; | 121 | r.h = height; | 
| 119 | SDL_SetRenderDrawColor(renderer, (color >> 24) & 255, (color >> 16) & 255, (color >> 8) & 255, 255); | 122 | SDL_SetRenderDrawColor(renderer, (color >> 24) & 255, (color >> 16) & 255, (color >> 8) & 255, 255); | 
| 120 | SDL_RenderFillRect(renderer, &r); | 123 | SDL_RenderFillRect(renderer, &r); | 
| 121 | } | 124 | } | 
| 125 | void | ||
| 126 | display_rect_color(int x, int y, int width, int height, int color) | ||
| 127 | { | ||
| 128 | display_rect_color_static(x, g_screen_height - y, width, height, color); | ||
| 129 | } | ||
| 122 | 130 | ||
| 123 | void | 131 | void | 
| 124 | display_redraw() | 132 | display_redraw() | 
| @@ -126,10 +134,9 @@ display_redraw() | |||
| 126 | SDL_RenderPresent(renderer); | 134 | SDL_RenderPresent(renderer); | 
| 127 | } | 135 | } | 
| 128 | 136 | ||
| 129 | void | 137 | static void | 
| 130 | display_text(char *text, int x, int y, int color) | 138 | display_text_static(char const *text, int x, int y, int color) | 
| 131 | { | 139 | { | 
| 132 | y = g_screen_height - y; | ||
| 133 | SDL_Color s_color = { 255 & (color>>24), 255 & (color>>16), 255 & (color>>8) }; | 140 | SDL_Color s_color = { 255 & (color>>24), 255 & (color>>16), 255 & (color>>8) }; | 
| 134 | SDL_Surface *sText = TTF_RenderText_Solid(font, text, s_color); | 141 | SDL_Surface *sText = TTF_RenderText_Solid(font, text, s_color); | 
| 135 | SDL_Rect rect = {x, y, sText->w, sText->h}; | 142 | SDL_Rect rect = {x, y, sText->w, sText->h}; | 
| @@ -139,20 +146,41 @@ display_text(char *text, int x, int y, int color) | |||
| 139 | SDL_DestroyTexture(texture); | 146 | SDL_DestroyTexture(texture); | 
| 140 | SDL_FreeSurface(sText); | 147 | SDL_FreeSurface(sText); | 
| 141 | } | 148 | } | 
| 149 | void | ||
| 150 | display_text(char const *text, int x, int y, int color) | ||
| 151 | { | ||
| 152 | display_text_static(text, x, g_screen_height - y, color); | ||
| 153 | } | ||
| 142 | 154 | ||
| 143 | void | 155 | void | 
| 144 | display_textbox(int min_x, int pos, int max_x, int max_pos, char *text, int color) | 156 | display_textbox(int min_x, int pos, int max_x, int max_pos, char const *text, int color) | 
| 145 | { | 157 | { | 
| 146 | int w, h, min_y, item_height; | 158 | int w, h, min_y, item_height; | 
| 147 | 159 | ||
| 148 | display_measure_text("#", &w, &h); | 160 | display_measure_text("#", &w, &h); | 
| 149 | item_height = 3 * h / 2; | 161 | item_height = 3 * h / 2; | 
| 150 | min_y = (g_screen_height - item_height * max_pos) / 2 + pos * item_height; | 162 | min_y = pos * item_height + 4; | 
| 163 | |||
| 164 | display_rect_color_static(min_x, min_y, max_x - min_x, item_height - 4, color); | ||
| 151 | 165 | ||
| 152 | //boxColor(screen, min_x, min_y, max_x, min_y + item_height, color); | ||
| 153 | //rectangleColor(screen, min_x, min_y, max_x, min_y + item_height, 0xffffffff); | ||
| 154 | display_measure_text(text, &w, &h); | 166 | display_measure_text(text, &w, &h); | 
| 155 | display_text(text, min_x + (max_x - min_x - w) / 2, min_y + (item_height - h) / 2, 0xffffffff); | 167 | // display_text(text, min_x + (max_x - min_x - w) / 2, min_y + (item_height - h) / 2, 0xffffffff); | 
| 168 | display_text_static(text, min_x + 8, min_y + (item_height - h) / 2, 0xffffffff); | ||
| 169 | } | ||
| 170 | |||
| 171 | int | ||
| 172 | display_test_menu_click(int y) | ||
| 173 | { | ||
| 174 | int w, h, min_y, item_height; | ||
| 175 | |||
| 176 | y -= 4; | ||
| 177 | if (y<0) | ||
| 178 | return -1; | ||
| 179 | |||
| 180 | display_measure_text( "#", &w, &h ); | ||
| 181 | item_height = 3 * h / 2; | ||
| 182 | |||
| 183 | return y / item_height; | ||
| 156 | } | 184 | } | 
| 157 | 185 | ||
| 158 | void | 186 | void | 
| @@ -174,18 +202,3 @@ display_messagebox_yesno(char *title, char *info) { | |||
| 174 | return buttonid == 1; | 202 | return buttonid == 1; | 
| 175 | } | 203 | } | 
| 176 | 204 | ||
| 177 | int | ||
| 178 | display_test_menu_click(int y, int max_pos) | ||
| 179 | { | ||
| 180 | int w, h, min_y, item_height; | ||
| 181 | |||
| 182 | /* | ||
| 183 | display_measure_text( "#", &w, &h ); | ||
| 184 | item_height = 3 * h / 2; | ||
| 185 | min_y = ( g_screen_height - item_height * max_pos ) / 2; | ||
| 186 | if( y < min_y ) return -1; | ||
| 187 | if( y > min_y + item_height * max_pos ) return -1; | ||
| 188 | return ( y - min_y ) / item_height; | ||
| 189 | */ | ||
| 190 | return 0; | ||
| 191 | } | ||
| @@ -13,9 +13,9 @@ void display_circle(int x, int y, int w); | |||
| 13 | void display_circle_color(int x, int y, int w, int color); | 13 | void display_circle_color(int x, int y, int w, int color); | 
| 14 | void display_rect_color(int x, int y, int width, int height, int color); | 14 | void display_rect_color(int x, int y, int width, int height, int color); | 
| 15 | 15 | ||
| 16 | void display_text(char *text, int x, int y, int color); | 16 | void display_text(char const *text, int x, int y, int color); | 
| 17 | void display_textbox(int min_x, int pos, int max_x, int max_pos, char *text, int color); | 17 | void display_textbox(int min_x, int pos, int max_x, int max_pos, char const *text, int color); | 
| 18 | int display_test_menu_click(int y, int max_pos); | 18 | int display_test_menu_click(int y); | 
| 19 | void display_messagebox(char *title, char *info); | 19 | void display_messagebox(char *title, char *info); | 
| 20 | int display_messagebox_yesno(char *title, char *info); | 20 | int display_messagebox_yesno(char *title, char *info); | 
| 21 | 21 | ||
