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?
{0.0, 0.0, 1.0, 1.0}, // blue
{0.0, 1.0, 1.0, 1.0}, // cyan
{1.0, 0.0, 1.0, 1.0}, // magenta
- {1.0, 1.0, 1.0, 1.0} // white
+ {1.0, 1.0, 1.0, 1.0}, // white
+ // [515]'s BX_COLOREDTEXT extension
+ {1.0, 1.0, 1.0, 0.5}, // half transparent
+ {0.5, 0.5, 0.5, 1.0} // half brightness
// Black's color table
//{1.0, 1.0, 1.0, 1.0},
//{1.0, 0.0, 0.0, 1.0},
//{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 );
+ len = (int)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 )
+ len = min( maxlen, (int) strlen( text ) );
+
+ 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;
}
t = (int) ((r_timereport_current - r_timereport_temp) * 1000000.0);
dpsnprintf(tempbuf, sizeof(tempbuf), "%8i %s", t, desc);
- length = strlen(tempbuf);
+ length = (int)strlen(tempbuf);
while (length < 20)
tempbuf[length++] = ' ';
tempbuf[length] = 0;
if (alpha < (1.0f / 255.0f))
return;
if (maxlen < 1)
- len = strlen(string);
+ len = (int)strlen(string);
else
for (len = 0;len < maxlen && string[len];len++);
for (;len > 0 && string[0] == ' ';string++, x += scalex, len--);