/* ================== SCR_DrawSmallString[Color] Draws a multi-colored string with a drop shadow, optionally forcing to a fixed color. Coordinates are at 640 by 480 virtual resolution ================== */ void SCR_DrawSmallStringExt( int x, int y, const char *string, float *setColor, qboolean forceColor ) { vec4_t color; const char *s; int xx; const bool use102color = MV_USE102COLOR; // draw the colored text s = string; xx = x; re.SetColor( setColor ); while ( *s ) { if ( Q_IsColorString( s ) || (use102color && Q_IsColorString_1_02( s ))) { if ( !forceColor ) { Com_Memcpy( color, g_color_table[ColorIndex(*(s+1))], sizeof( color ) ); color[3] = setColor[3]; re.SetColor( color ); } s += 2; continue; } SCR_DrawSmallChar( xx, y, *s ); xx += SMALLCHAR_WIDTH; s++; } re.SetColor( NULL ); }
/* ================== SCR_DrawBigString[Color] Draws a multi-colored string with a drop shadow, optionally forcing to a fixed color. Coordinates are at 640 by 480 virtual resolution ================== */ void SCR_DrawStringExt( int x, int y, float size, const char *string, float *setColor, qboolean forceColor ) { vec4_t color; const char *s; int xx; const bool use102color = MV_USE102COLOR; // draw the drop shadow color[0] = color[1] = color[2] = 0; color[3] = setColor[3]; re.SetColor( color ); s = string; xx = x; while ( *s ) { if ( Q_IsColorString( s ) || (use102color && Q_IsColorString_1_02( s ))) { s += 2; continue; } SCR_DrawChar( xx+2, y+2, size, *s ); xx += size; s++; } // draw the colored text s = string; xx = x; re.SetColor( setColor ); while ( *s ) { if ( Q_IsColorString( s ) || (use102color && Q_IsColorString_1_02( s ))) { if ( !forceColor ) { Com_Memcpy( color, g_color_table[ColorIndex(*(s+1))], sizeof( color ) ); color[3] = setColor[3]; re.SetColor( color ); } s += 2; continue; } SCR_DrawChar( xx, y, size, *s ); xx += size; s++; } re.SetColor( NULL ); }
/* ** SCR_Strlen -- skips color escape codes */ static int SCR_Strlen( const char *str ) { const char *s = str; int count = 0; const bool use102color = MV_USE102COLOR; while ( *s ) { if ( Q_IsColorString( s ) || (use102color && Q_IsColorString_1_02( s ))) { s += 2; } else { count++; s++; } } return count; }
/* ================= Sys_AnsiColorPrint Transform Q3 colour codes to ANSI escape sequences ================= */ void Sys_AnsiColorPrint( const char *msg, bool extendedColors ) { static char buffer[MAXPRINTMSG]; int length = 0; static int q3ToAnsi[Q_COLOR_BITS+1] = { 30, // COLOR_BLACK 31, // COLOR_RED 32, // COLOR_GREEN 33, // COLOR_YELLOW 34, // COLOR_BLUE 36, // COLOR_CYAN 35, // COLOR_MAGENTA 0, // COLOR_WHITE }; const bool use102col = MV_USE102COLOR; while ( *msg ) { if ( Q_IsColorString( msg ) || (use102col && Q_IsColorString_1_02(msg)) || (extendedColors && Q_IsColorString_Extended(msg)) || *msg == '\n' ) { // First empty the buffer if ( length > 0 ) { buffer[length] = '\0'; fputs( buffer, stderr ); length = 0; } if ( *msg == '\n' ) { // Issue a reset and then the newline fputs( "\033[0m\n", stderr ); msg++; } else { // Print the color code int colIndex = (extendedColors ? ColorIndex_Extended(*(msg+1)) : ColorIndex(*(msg+1))); if ( colIndex >= (int)ARRAY_LEN(q3ToAnsi) ) colIndex = COLOR_JK2MV_FALLBACK; Com_sprintf( buffer, sizeof( buffer ), "\033[%dm", q3ToAnsi[colIndex] ); fputs( buffer, stderr ); msg += 2; } } else { if ( length >= MAXPRINTMSG - 1 ) break; buffer[length] = *msg; length++; msg++; } } // Empty anything still left in the buffer if ( length > 0 ) { buffer[length] = '\0'; fputs( buffer, stderr ); } }