]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_screen.c
strlwr does not exist on Linux
[xonotic/darkplaces.git] / cl_screen.c
index 5be03f47d4a82528ea2842607a9e08e217601bf8..861eed77ccf6b58959142ea896573e859b682d71 100644 (file)
@@ -46,7 +46,7 @@ static void R_Envmap_f (void);
 void R_ClearScreen(void);
 
 // color tag printing
-static vec4_t _draw_colors[] =
+static vec4_t string_colors[] =
 {
        // Quake3 colors
        // LordHavoc: why on earth is cyan before magenta in Quake3?
@@ -70,69 +70,81 @@ static vec4_t _draw_colors[] =
        //{0.1, 0.1, 0.1, 1.0}
 };
 
-#define _draw_colors_count     (sizeof(_draw_colors) / sizeof(vec4_t))
-#define _draw_color_tag                '^'
-#define _draw_color_default 7
+#define STRING_COLORS_COUNT    (sizeof(string_colors) / sizeof(vec4_t))
 
 // color is read and changed in the end
 void DrawQ_ColoredString( float x, float y, const char *text, int maxlen, float scalex, float scaley, float basered, float basegreen, float baseblue, float basealpha, int flags, int *outcolor )
 {
        vec_t *color;
-       const char *first, *last;
        int len;
        int colorindex;
-       
-    if( !outcolor || *outcolor == -1 ) {
-               colorindex = _draw_color_default;
+       const char *start, *current;
+
+       if( !outcolor || *outcolor == -1 ) {
+               colorindex = STRING_COLOR_DEFAULT;
        } else {
                colorindex = *outcolor;
        }
-
-       color = _draw_colors[colorindex];
+       color = string_colors[colorindex];
 
        if( maxlen < 1)
                len = strlen( text );
        else
                len = min( maxlen, (signed) strlen( text ) );
 
-    first = last = text;
-       while( len ) {
-               // iterate until we get the next color tag or reach the end of the text part to draw
-               for( ; len && *last != _draw_color_tag ; len--, last++ )
-                       ;
-               // only draw the partial string if we have read anything
-               if( last != first ) {
-                       // draw the string
-                       DrawQ_String( x, y, first, last - first, scalex, scaley, basered * color[0], basegreen * color[1], baseblue * color[2], basealpha * color[3], flags );
-                       // update x to be at the new start position
-                       x += (last - first) * scalex;
-                       // if we have reached the end, we have finished
-                       if( !len )
+       start = current = text;
+       while( len > 0 ) {
+               // check for color control char
+               if( *current == STRING_COLOR_TAG ) {
+                       // get next char
+                       current++;
+                       len--;
+                       if( len == 0 ) {
                                break;
-               }
-               first = last;
-               // jump over the tag
-               last++;
-               len--;
-               if( len && '0' <= *last && *last <= '9' ) {
-                       colorindex = 0;
-                       while( '0' <= *last && *last <= '9' && len ) {
-                               colorindex = colorindex * 10 + *last - '0';
-                               if( colorindex < _draw_colors_count ) {
-                                       last++;
+                       }
+                       // display the tag char?
+                       if( *current == STRING_COLOR_TAG ) {
+                               // only display one of the two
+                               start = current;
+                               // get the next char
+                               current++;
+                               len--;
+                       } else if( '0' <= *current && *current <= '9' ) {
+                               colorindex = 0;
+                               do {
+                                       colorindex = colorindex * 10 + (*current - '0');
+                                       // only read as long as it makes a valid index
+                                       if( colorindex >= STRING_COLORS_COUNT ) {
+                                               // undo the last operation
+                                               colorindex /= 10;
+                                               break;
+                                       }
+                                       current++;
                                        len--;
-                               } else {
-                                       colorindex /= 10;
-                                       break;
-                               }
+                               } while( len > 0 && '0' <= *current && *current <= '9' );
+                               // set the color
+                               color = string_colors[colorindex];
+                               // we jump over the color tag 
+                               start = current;
                        }
-
-                       color = _draw_colors[colorindex];
-                       // we dont want to display the color tag and the color index
-                       first = last;
+               }
+               // go on and read normal text in until the next control char
+               while( len > 0 && *current != STRING_COLOR_TAG ) {
+                       current++;
+                       len--;
+               }
+               // display the text
+               if( start != current ) {
+                       // draw the string
+                       DrawQ_String( x, y, start, current - start, scalex, scaley, basered * color[0], basegreen * color[1], baseblue * color[2], basealpha * color[3], flags );
+                       // update x to be at the new start position
+                       x += (current - start) * scalex;
+                       // set start accordingly
+                       start = current;
                }
        }
 
+       // return the last colorindex
        if( outcolor ) {
                *outcolor = colorindex;
        }