Skip to content

Commit 185e77c

Browse files
committed
Batch text rendering per palette offset
1 parent 5e76088 commit 185e77c

File tree

7 files changed

+49
-24
lines changed

7 files changed

+49
-24
lines changed

src/console/console.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ void console_output_render(void) {
197197
lines++;
198198
} else {
199199
// TODO add word wrapping?
200-
text_render_char(&tconf, TEXT_DEFAULT, x, y + con->ypos - 100, c);
200+
text_render_char(&tconf, TEXT_DEFAULT, x, y + con->ypos - 100, c, false);
201201
x += font_small.w;
202202
}
203203
}

src/engine.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,6 @@ void engine_run(engine_init_flags *init_flags) {
240240
// Render scene
241241
uint64_t frame_dt = SDL_GetTicks64() - frame_start;
242242
frame_start = SDL_GetTicks64();
243-
//debugf("s:%llu dt:%llu\n", frame_start, frame_dt);
244243
if(!visual_debugger) {
245244
dynamic_wait += frame_dt;
246245
static_wait += frame_dt;

src/game/gui/text_render.c

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ void text_defaults(text_settings *settings) {
1919
settings->strip_trailing_whitespace = false;
2020
}
2121

22-
int text_render_char(const text_settings *settings, text_mode state, int x, int y, char ch) {
22+
int text_render_char(const text_settings *settings, text_mode state, int x, int y, char ch, bool shadow) {
2323
// Make sure code is valid
2424
int code = ch - 32;
2525
surface **sur = NULL;
@@ -46,14 +46,18 @@ int text_render_char(const text_settings *settings, text_mode state, int x, int
4646
}
4747

4848
// Handle shadows if necessary
49-
if(settings->shadow & TEXT_SHADOW_RIGHT)
50-
video_draw_offset(*sur, x + 1, y, settings->cshadow, 255);
51-
if(settings->shadow & TEXT_SHADOW_LEFT)
52-
video_draw_offset(*sur, x - 1, y, settings->cshadow, 255);
53-
if(settings->shadow & TEXT_SHADOW_BOTTOM)
54-
video_draw_offset(*sur, x, y + 1, settings->cshadow, 255);
55-
if(settings->shadow & TEXT_SHADOW_TOP)
56-
video_draw_offset(*sur, x, y - 1, settings->cshadow, 255);
49+
if (shadow != false) {
50+
if(settings->shadow & TEXT_SHADOW_RIGHT)
51+
video_draw_offset(*sur, x + 1, y, settings->cshadow, 255);
52+
if(settings->shadow & TEXT_SHADOW_LEFT)
53+
video_draw_offset(*sur, x - 1, y, settings->cshadow, 255);
54+
if(settings->shadow & TEXT_SHADOW_BOTTOM)
55+
video_draw_offset(*sur, x, y + 1, settings->cshadow, 255);
56+
if(settings->shadow & TEXT_SHADOW_TOP)
57+
video_draw_offset(*sur, x, y - 1, settings->cshadow, 255);
58+
59+
return (*sur)->w;
60+
}
5761

5862
int color;
5963
switch(state) {
@@ -305,14 +309,39 @@ void text_render(const text_settings *settings, text_mode mode, int x, int y, in
305309
}
306310

307311
int w = 0;
308-
// Render characters
312+
int mxstart = mx;
313+
int mystart = my;
314+
int kstart = k;
315+
316+
// Render shadow characters.
317+
for(; k < line_len; k++) {
318+
// Skip line endings.
319+
if(text[ptr + k] == '\n')
320+
continue;
321+
322+
// Render character
323+
w = text_render_char(settings, mode, mx + start_x, my + start_y, text[ptr + k], true);
324+
325+
// Render to the right direction
326+
if(settings->direction == TEXT_HORIZONTAL) {
327+
mx += w + settings->cspacing;
328+
} else {
329+
my += charh;
330+
}
331+
}
332+
333+
// Render regular color characters.
334+
w = 0;
335+
mx = mxstart;
336+
my = mystart;
337+
k = kstart;
309338
for(; k < line_len; k++) {
310339
// Skip line endings.
311340
if(text[ptr + k] == '\n')
312341
continue;
313342

314343
// Render character
315-
w = text_render_char(settings, mode, mx + start_x, my + start_y, text[ptr + k]);
344+
w = text_render_char(settings, mode, mx + start_x, my + start_y, text[ptr + k], false);
316345

317346
// Render to the right direction
318347
if(settings->direction == TEXT_HORIZONTAL) {
@@ -322,6 +351,7 @@ void text_render(const text_settings *settings, text_mode mode, int x, int y, in
322351
}
323352
}
324353

354+
325355
ptr += advance;
326356
line++;
327357
}

src/game/gui/text_render.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ typedef struct {
8080
void text_defaults(text_settings *settings);
8181
int text_find_max_strlen(const text_settings *settings, int max_chars, const char *ptr);
8282
int text_find_line_count(const text_settings *settings, int cols, int rows, int len, const char *text);
83-
int text_render_char(const text_settings *settings, text_mode mode, int x, int y, char ch);
83+
int text_render_char(const text_settings *settings, text_mode mode, int x, int y, char ch, bool shadow);
8484
void text_render(const text_settings *settings, text_mode mode, int x, int y, int w, int h, const char *text);
8585
int text_char_width(const text_settings *settings);
8686
int text_width(const text_settings *settings, const char *text);

src/resources/bk.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ void bk_create(bk *b, void *src) {
2929
// Copy info structs
3030
hashmap_create(&b->infos);
3131
bk_info tmp_bk_info;
32-
for (int i = 0; i < 50; i++) {
33-
if (sdbk->anims[i] != NULL) {
32+
for(int i = 0; i < 50; i++) {
33+
if(sdbk->anims[i] != NULL) {
3434
bk_info_create(&tmp_bk_info, &b->sprites, (void*)sdbk->anims[i], i);
3535
hashmap_iput(&b->infos, i, &tmp_bk_info, sizeof(bk_info));
3636
}
@@ -64,7 +64,7 @@ void bk_free(bk *b) {
6464
iterator it;
6565
hashmap_iter_begin(&b->infos, &it);
6666
hashmap_pair* pair = NULL;
67-
while ((pair = iter_next(&it)) != NULL) {
67+
while((pair = iter_next(&it)) != NULL) {
6868
bk_info_free((bk_info*)pair->value);
6969
}
7070
hashmap_free(&b->infos);

src/video/surface.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ enum
2020
SUB_METHOD_MIRROR
2121
};
2222

23-
typedef unsigned int SDL_RendererFlip;
24-
2523
void surface_create(surface *sur, int w, int h, int transparent);
2624
void surface_create_from(surface *dst, const surface *src);
2725
void surface_create_from_vga(surface *sur, const sd_vga_image *src, int transparent);

tools/fonttool/main.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
#include <stdint.h>
1616
#include <string.h>
1717

18-
#define EMPTY_INDEX 0
19-
2018
SDL_Surface *render_text(sd_font *font, const char *text, int area_w) {
2119
// Vars
2220
unsigned int rmask, gmask, bmask, amask;
@@ -58,7 +56,7 @@ SDL_Surface *render_text(sd_font *font, const char *text, int area_w) {
5856
dst.h = font->h;
5957
sd_rgba_image_create(&img, font->h, font->h);
6058
for(int i = 0; i < slen; i++) {
61-
sd_font_decode(font, &img, text[i] - 32, 64, 128, 64);
59+
sd_font_decode_rgb(font, &img, text[i] - 32, 64, 128, 64);
6260
memcpy(tmp->pixels, img.data, 4 * font->h * font->h);
6361
dst.y = i / char_w * font->h;
6462
dst.x = i % char_w * font->h;
@@ -77,7 +75,7 @@ void export_to(sd_font *font, const char *filename, int split) {
7775
sd_rgba_image ch_img;
7876
sd_rgba_image_create(&ch_img, font->h, font->h);
7977
for(int i = 32; i < 256; i++) {
80-
sd_font_decode(font, &ch_img, (char)(i - 32), 0, 0, 0);
78+
sd_font_decode_rgb(font, &ch_img, (char)(i - 32), 0, 0, 0);
8179
sprintf(path, "%s/uni%04x.png", filename, i);
8280
int ret = sd_rgba_image_to_png(&ch_img, path);
8381
if(ret != SD_SUCCESS) {
@@ -93,7 +91,7 @@ void export_to(sd_font *font, const char *filename, int split) {
9391
for(int i = 32; i < 256; i++) {
9492
int x = i % 16;
9593
int y = i / 16;
96-
sd_font_decode(font, &ch_img, (char)(i - 32), 0, 0, 0);
94+
sd_font_decode_rgb(font, &ch_img, (char)(i - 32), 0, 0, 0);
9795
sd_rgba_image_blit(&dst_img, &ch_img, x * font->h, y * font->h);
9896
}
9997
sd_rgba_image_free(&ch_img);

0 commit comments

Comments
 (0)