@@ -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 }
0 commit comments