From 425decdf7e9284d15aa726e3ae96b9942fb0e3ea Mon Sep 17 00:00:00 2001 From: IronClawTrem Date: Sun, 16 Feb 2020 03:40:06 +0000 Subject: create tremded branch --- src/ui/ui_atoms.c | 620 ++++++++++++++++-------------------------------------- 1 file changed, 176 insertions(+), 444 deletions(-) (limited to 'src/ui/ui_atoms.c') diff --git a/src/ui/ui_atoms.c b/src/ui/ui_atoms.c index a3033c4..b70d34d 100644 --- a/src/ui/ui_atoms.c +++ b/src/ui/ui_atoms.c @@ -1,13 +1,14 @@ /* =========================================================================== Copyright (C) 1999-2005 Id Software, Inc. -Copyright (C) 2000-2006 Tim Angus +Copyright (C) 2000-2013 Darklegion Development +Copyright (C) 2015-2019 GrangerHub This file is part of Tremulous. Tremulous is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as -published by the Free Software Foundation; either version 2 of the License, +published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Tremulous is distributed in the hope that it will be @@ -16,8 +17,8 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Tremulous; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +along with Tremulous; if not, see + =========================================================================== */ @@ -28,43 +29,46 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA **********************************************************************/ #include "ui_local.h" -qboolean m_entersound; // after a frame, so caching won't disrupt the sound +qboolean m_entersound; // after a frame, so caching won't disrupt the sound -void QDECL Com_Error( int level, const char *error, ... ) { - va_list argptr; - char text[1024]; +void QDECL Com_Error(int level, const char *error, ...) +{ + va_list argptr; + char text[1024]; - va_start (argptr, error); - vsprintf (text, error, argptr); - va_end (argptr); + va_start(argptr, error); + Q_vsnprintf(text, sizeof(text), error, argptr); + va_end(argptr); - trap_Error( va("%s", text) ); + trap_Error(text); } -void QDECL Com_Printf( const char *msg, ... ) { - va_list argptr; - char text[1024]; +void QDECL Com_Printf(const char *msg, ...) +{ + va_list argptr; + char text[1024]; - va_start (argptr, msg); - vsprintf (text, msg, argptr); - va_end (argptr); + va_start(argptr, msg); + Q_vsnprintf(text, sizeof(text), msg, argptr); + va_end(argptr); - trap_Print( va("%s", text) ); + trap_Print(text); } -qboolean newUI = qfalse; - - /* ================= UI_ClampCvar ================= */ -float UI_ClampCvar( float min, float max, float value ) +float UI_ClampCvar(float min, float max, float value) { - if ( value < min ) return min; - if ( value > max ) return max; - return value; + if (value < min) + return min; + + if (value > max) + return max; + + return value; } /* @@ -72,418 +76,196 @@ float UI_ClampCvar( float min, float max, float value ) UI_StartDemoLoop ================= */ -void UI_StartDemoLoop( void ) { - trap_Cmd_ExecuteText( EXEC_APPEND, "d1\n" ); -} +void UI_StartDemoLoop(void) { trap_Cmd_ExecuteText(EXEC_APPEND, "d1\n"); } -char *UI_Argv( int arg ) { - static char buffer[MAX_STRING_CHARS]; +char *UI_Argv(int arg) +{ + static char buffer[MAX_STRING_CHARS]; - trap_Argv( arg, buffer, sizeof( buffer ) ); + trap_Argv(arg, buffer, sizeof(buffer)); - return buffer; + return buffer; } +char *UI_ConcatArgs(int arg, char *buf, int len) +{ + char *p; + int c; -char *UI_Cvar_VariableString( const char *var_name ) { - static char buffer[MAX_STRING_CHARS]; + if (len <= 0) + return buf; - trap_Cvar_VariableStringBuffer( var_name, buffer, sizeof( buffer ) ); + p = buf; + c = trap_Argc(); - return buffer; -} + for (; arg < c; arg++) + { + char *argp = UI_Argv(arg); + while (*argp && p < &buf[len - 1]) + *p++ = *argp++; + if (p < &buf[len - 2]) + *p++ = ' '; + else + break; + } -void UI_SetBestScores(postGameInfo_t *newInfo, qboolean postGame) { - trap_Cvar_Set("ui_scoreAccuracy", va("%i%%", newInfo->accuracy)); - trap_Cvar_Set("ui_scoreImpressives", va("%i", newInfo->impressives)); - trap_Cvar_Set("ui_scoreExcellents", va("%i", newInfo->excellents)); - trap_Cvar_Set("ui_scoreDefends", va("%i", newInfo->defends)); - trap_Cvar_Set("ui_scoreAssists", va("%i", newInfo->assists)); - trap_Cvar_Set("ui_scoreGauntlets", va("%i", newInfo->gauntlets)); - trap_Cvar_Set("ui_scoreScore", va("%i", newInfo->score)); - trap_Cvar_Set("ui_scorePerfect", va("%i", newInfo->perfects)); - trap_Cvar_Set("ui_scoreTeam", va("%i to %i", newInfo->redScore, newInfo->blueScore)); - trap_Cvar_Set("ui_scoreBase", va("%i", newInfo->baseScore)); - trap_Cvar_Set("ui_scoreTimeBonus", va("%i", newInfo->timeBonus)); - trap_Cvar_Set("ui_scoreSkillBonus", va("%i", newInfo->skillBonus)); - trap_Cvar_Set("ui_scoreShutoutBonus", va("%i", newInfo->shutoutBonus)); - trap_Cvar_Set("ui_scoreTime", va("%02i:%02i", newInfo->time / 60, newInfo->time % 60)); - trap_Cvar_Set("ui_scoreCaptures", va("%i", newInfo->captures)); - if (postGame) { - trap_Cvar_Set("ui_scoreAccuracy2", va("%i%%", newInfo->accuracy)); - trap_Cvar_Set("ui_scoreImpressives2", va("%i", newInfo->impressives)); - trap_Cvar_Set("ui_scoreExcellents2", va("%i", newInfo->excellents)); - trap_Cvar_Set("ui_scoreDefends2", va("%i", newInfo->defends)); - trap_Cvar_Set("ui_scoreAssists2", va("%i", newInfo->assists)); - trap_Cvar_Set("ui_scoreGauntlets2", va("%i", newInfo->gauntlets)); - trap_Cvar_Set("ui_scoreScore2", va("%i", newInfo->score)); - trap_Cvar_Set("ui_scorePerfect2", va("%i", newInfo->perfects)); - trap_Cvar_Set("ui_scoreTeam2", va("%i to %i", newInfo->redScore, newInfo->blueScore)); - trap_Cvar_Set("ui_scoreBase2", va("%i", newInfo->baseScore)); - trap_Cvar_Set("ui_scoreTimeBonus2", va("%i", newInfo->timeBonus)); - trap_Cvar_Set("ui_scoreSkillBonus2", va("%i", newInfo->skillBonus)); - trap_Cvar_Set("ui_scoreShutoutBonus2", va("%i", newInfo->shutoutBonus)); - trap_Cvar_Set("ui_scoreTime2", va("%02i:%02i", newInfo->time / 60, newInfo->time % 60)); - trap_Cvar_Set("ui_scoreCaptures2", va("%i", newInfo->captures)); - } -} + *p = '\0'; -void UI_LoadBestScores(const char *map, int game) { - char fileName[MAX_QPATH]; - fileHandle_t f; - postGameInfo_t newInfo; - memset(&newInfo, 0, sizeof(postGameInfo_t)); - Com_sprintf(fileName, MAX_QPATH, "games/%s_%i.game", map, game); - if (trap_FS_FOpenFile(fileName, &f, FS_READ) >= 0) { - int size = 0; - trap_FS_Read(&size, sizeof(int), f); - if (size == sizeof(postGameInfo_t)) { - trap_FS_Read(&newInfo, sizeof(postGameInfo_t), f); - } - trap_FS_FCloseFile(f); - } - UI_SetBestScores(&newInfo, qfalse); - - Com_sprintf(fileName, MAX_QPATH, "demos/%s_%d.dm_%d", map, game, (int)trap_Cvar_VariableValue("protocol")); - uiInfo.demoAvailable = qfalse; - if (trap_FS_FOpenFile(fileName, &f, FS_READ) >= 0) { - uiInfo.demoAvailable = qtrue; - trap_FS_FCloseFile(f); - } + return buf; } -/* -=============== -UI_ClearScores -=============== -*/ -void UI_ClearScores( void ) { - char gameList[4096]; - char *gameFile; - int i, len, count, size; - fileHandle_t f; - postGameInfo_t newInfo; - - count = trap_FS_GetFileList( "games", "game", gameList, sizeof(gameList) ); - - size = sizeof(postGameInfo_t); - memset(&newInfo, 0, size); - - if (count > 0) { - gameFile = gameList; - for ( i = 0; i < count; i++ ) { - len = strlen(gameFile); - if (trap_FS_FOpenFile(va("games/%s",gameFile), &f, FS_WRITE) >= 0) { - trap_FS_Write(&size, sizeof(int), f); - trap_FS_Write(&newInfo, size, f); - trap_FS_FCloseFile(f); - } - gameFile += len + 1; - } - } +char *UI_Cvar_VariableString(const char *var_name) +{ + static char buffer[MAX_STRING_CHARS]; - UI_SetBestScores(&newInfo, qfalse); + trap_Cvar_VariableStringBuffer(var_name, buffer, sizeof(buffer)); + return buffer; } +static void UI_Cache_f(void) { Display_CacheAll(); } - -static void UI_Cache_f( void ) { - Display_CacheAll(); +static void UI_Menu_f(void) +{ + if (Menu_Count() > 0) + { + trap_Key_SetCatcher(KEYCATCH_UI); + Menus_ActivateByName(UI_Argv(1)); + } } -/* -======================= -UI_CalcPostGameStats -======================= -*/ -static void UI_CalcPostGameStats( void ) { - char map[MAX_QPATH]; - char fileName[MAX_QPATH]; - char info[MAX_INFO_STRING]; - fileHandle_t f; - int size, game, time, adjustedTime; - postGameInfo_t oldInfo; - postGameInfo_t newInfo; - qboolean newHigh = qfalse; - - trap_GetConfigString( CS_SERVERINFO, info, sizeof(info) ); - Q_strncpyz( map, Info_ValueForKey( info, "mapname" ), sizeof(map) ); - game = atoi(Info_ValueForKey(info, "g_gametype")); - - // compose file name - Com_sprintf(fileName, MAX_QPATH, "games/%s_%i.game", map, game); - // see if we have one already - memset(&oldInfo, 0, sizeof(postGameInfo_t)); - if (trap_FS_FOpenFile(fileName, &f, FS_READ) >= 0) { - // if so load it - size = 0; - trap_FS_Read(&size, sizeof(int), f); - if (size == sizeof(postGameInfo_t)) { - trap_FS_Read(&oldInfo, sizeof(postGameInfo_t), f); - } - trap_FS_FCloseFile(f); - } - - newInfo.accuracy = atoi(UI_Argv(3)); - newInfo.impressives = atoi(UI_Argv(4)); - newInfo.excellents = atoi(UI_Argv(5)); - newInfo.defends = atoi(UI_Argv(6)); - newInfo.assists = atoi(UI_Argv(7)); - newInfo.gauntlets = atoi(UI_Argv(8)); - newInfo.baseScore = atoi(UI_Argv(9)); - newInfo.perfects = atoi(UI_Argv(10)); - newInfo.redScore = atoi(UI_Argv(11)); - newInfo.blueScore = atoi(UI_Argv(12)); - time = atoi(UI_Argv(13)); - newInfo.captures = atoi(UI_Argv(14)); - - newInfo.time = (time - trap_Cvar_VariableValue("ui_matchStartTime")) / 1000; - adjustedTime = uiInfo.mapList[ui_currentMap.integer].timeToBeat[game]; - if (newInfo.time < adjustedTime) { - newInfo.timeBonus = (adjustedTime - newInfo.time) * 10; - } else { - newInfo.timeBonus = 0; - } - - if (newInfo.redScore > newInfo.blueScore && newInfo.blueScore <= 0) { - newInfo.shutoutBonus = 100; - } else { - newInfo.shutoutBonus = 0; - } - - newInfo.skillBonus = trap_Cvar_VariableValue("g_spSkill"); - if (newInfo.skillBonus <= 0) { - newInfo.skillBonus = 1; - } - newInfo.score = newInfo.baseScore + newInfo.shutoutBonus + newInfo.timeBonus; - newInfo.score *= newInfo.skillBonus; - - // see if the score is higher for this one - newHigh = (newInfo.redScore > newInfo.blueScore && newInfo.score > oldInfo.score); - - if (newHigh) { - // if so write out the new one - uiInfo.newHighScoreTime = uiInfo.uiDC.realTime + 20000; - if (trap_FS_FOpenFile(fileName, &f, FS_WRITE) >= 0) { - size = sizeof(postGameInfo_t); - trap_FS_Write(&size, sizeof(int), f); - trap_FS_Write(&newInfo, sizeof(postGameInfo_t), f); - trap_FS_FCloseFile(f); +static void UI_CloseMenus_f(void) +{ + if (Menu_Count() > 0) + { + trap_Key_SetCatcher(trap_Key_GetCatcher() & ~KEYCATCH_UI); + trap_Key_ClearStates(); + trap_Cvar_Set("cl_paused", "0"); + Menus_CloseAll(); } - } +} - if (newInfo.time < oldInfo.time) { - uiInfo.newBestTime = uiInfo.uiDC.realTime + 20000; - } +static void UI_MessageMode_f(void) +{ + char *arg = UI_Argv(0); - // put back all the ui overrides - trap_Cvar_Set("capturelimit", UI_Cvar_VariableString("ui_saveCaptureLimit")); - trap_Cvar_Set("fraglimit", UI_Cvar_VariableString("ui_saveFragLimit")); - trap_Cvar_Set("cg_drawTimer", UI_Cvar_VariableString("ui_drawTimer")); - trap_Cvar_Set("g_doWarmup", UI_Cvar_VariableString("ui_doWarmup")); - trap_Cvar_Set("g_Warmup", UI_Cvar_VariableString("ui_Warmup")); - trap_Cvar_Set("sv_pure", UI_Cvar_VariableString("ui_pure")); - trap_Cvar_Set("g_friendlyFire", UI_Cvar_VariableString("ui_friendlyFire")); + trap_Cvar_Set("ui_sayBuffer", ""); - UI_SetBestScores(&newInfo, qtrue); - UI_ShowPostGame(newHigh); + switch (arg[11]) + { + default: + case '\0': + // Global + uiInfo.chatTeam = qfalse; + break; + + case '2': + // Team + uiInfo.chatTeam = qtrue; + break; + } + trap_Key_SetCatcher(KEYCATCH_UI); + Menus_CloseByName("say"); + Menus_CloseByName("say_team"); + if (uiInfo.chatTeam) + Menus_ActivateByName("say_team"); + else + Menus_ActivateByName("say"); } -static void UI_MessageMode_f( void ) +static void UI_Me_f(void) { - char *arg = UI_Argv( 0 ); - - trap_Cvar_Set( "ui_sayBuffer", "" ); - - switch( arg[ 11 ] ) - { - default: - case '\0': - // Global - uiInfo.chatTeam = qfalse; - break; - - case '2': - // Team - uiInfo.chatTeam = qtrue; - break; - } - - trap_Key_SetCatcher( KEYCATCH_UI ); - Menus_CloseByName( "say" ); - Menus_CloseByName( "say_team" ); - - if( uiInfo.chatTeam ) - Menus_ActivateByName( "say_team" ); - else - Menus_ActivateByName( "say" ); + char buf[MAX_SAY_TEXT - 4]; + + UI_ConcatArgs(1, buf, sizeof(buf)); + + trap_Cmd_ExecuteText(EXEC_APPEND, va("say \"/me %s\"\n", buf)); } +struct uicmd { + char *cmd; + void (*function)(void); +} commands[] = +{ + {"closemenus", UI_CloseMenus_f}, + {"me", UI_Me_f}, + {"menu", UI_Menu_f}, + {"messagemode", UI_MessageMode_f}, + {"messagemode2", UI_MessageMode_f}, + {"ui_cache", UI_Cache_f}, + {"ui_load", UI_Load}, + {"ui_report", UI_Report} +}; /* ================= UI_ConsoleCommand ================= */ -qboolean UI_ConsoleCommand( int realTime ) +qboolean UI_ConsoleCommand(int realTime) { - char *cmd; - char *arg1; - - uiInfo.uiDC.frameTime = realTime - uiInfo.uiDC.realTime; - uiInfo.uiDC.realTime = realTime; - - cmd = UI_Argv( 0 ); - - // ensure minimum menu data is available - //Menu_Cache(); - - if ( Q_stricmp (cmd, "ui_test") == 0 ) { - UI_ShowPostGame(qtrue); - } - - if ( Q_stricmp (cmd, "ui_report") == 0 ) { - UI_Report(); - return qtrue; - } - - if ( Q_stricmp (cmd, "ui_load") == 0 ) { - UI_Load(); - return qtrue; - } - - if ( Q_stricmp (cmd, "remapShader") == 0 ) { - if (trap_Argc() == 4) { - char shader1[MAX_QPATH]; - char shader2[MAX_QPATH]; - Q_strncpyz(shader1, UI_Argv(1), sizeof(shader1)); - Q_strncpyz(shader2, UI_Argv(2), sizeof(shader2)); - trap_R_RemapShader(shader1, shader2, UI_Argv(3)); - return qtrue; - } - } - - if ( Q_stricmp (cmd, "postgame") == 0 ) { - UI_CalcPostGameStats(); - return qtrue; - } + struct uicmd *cmd = bsearch(UI_Argv(0), commands, ARRAY_LEN(commands), sizeof(commands[0]), cmdcmp); - if ( Q_stricmp (cmd, "ui_cache") == 0 ) { - UI_Cache_f(); - return qtrue; - } + uiInfo.uiDC.frameTime = realTime - uiInfo.uiDC.realTime; + uiInfo.uiDC.realTime = realTime; - if ( Q_stricmp (cmd, "ui_teamOrders") == 0 ) { - //UI_TeamOrdersMenu_f(); - return qtrue; - } - - if( Q_stricmp ( cmd, "menu" ) == 0 ) - { - arg1 = UI_Argv( 1 ); - - if( Menu_Count( ) > 0 ) + if (cmd) { - trap_Key_SetCatcher( KEYCATCH_UI ); - Menus_ActivateByName( arg1 ); - return qtrue; + cmd->function(); + return qtrue; } - } - - if( Q_stricmp ( cmd, "closemenus" ) == 0 ) - { - if( Menu_Count( ) > 0 ) - { - trap_Key_SetCatcher( trap_Key_GetCatcher( ) & ~KEYCATCH_UI ); - trap_Key_ClearStates( ); - trap_Cvar_Set( "cl_paused", "0" ); - Menus_CloseAll( ); - return qtrue; - } - } - - if( Q_stricmp ( cmd, "messagemode" ) == 0 || - Q_stricmp ( cmd, "messagemode2" ) == 0 ) - { - UI_MessageMode_f(); - return qtrue; - } - - return qfalse; -} -/* -================= -UI_Shutdown -================= -*/ -void UI_Shutdown( void ) { + return qfalse; } -/* -================ -UI_AdjustFrom640 - -Adjusted for resolution and screen aspect ratio -================ -*/ -void UI_AdjustFrom640( float *x, float *y, float *w, float *h ) { - // expect valid pointers -#if 0 - *x = *x * uiInfo.uiDC.scale + uiInfo.uiDC.bias; - *y *= uiInfo.uiDC.scale; - *w *= uiInfo.uiDC.scale; - *h *= uiInfo.uiDC.scale; -#endif - - *x *= uiInfo.uiDC.xscale; - *y *= uiInfo.uiDC.yscale; - *w *= uiInfo.uiDC.xscale; - *h *= uiInfo.uiDC.yscale; +void UI_DrawNamedPic(float x, float y, float width, float height, const char *picname) +{ + qhandle_t hShader; + hShader = trap_R_RegisterShaderNoMip(picname); + UI_AdjustFrom640(&x, &y, &width, &height); + trap_R_DrawStretchPic(x, y, width, height, 0, 0, 1, 1, hShader); } -void UI_DrawNamedPic( float x, float y, float width, float height, const char *picname ) { - qhandle_t hShader; +void UI_DrawHandlePic(float x, float y, float w, float h, qhandle_t hShader) +{ + float s0; + float s1; + float t0; + float t1; + + if (w < 0) + { + // flip about vertical + w = -w; + s0 = 1; + s1 = 0; + } + else + { + s0 = 0; + s1 = 1; + } - hShader = trap_R_RegisterShaderNoMip( picname ); - UI_AdjustFrom640( &x, &y, &width, &height ); - trap_R_DrawStretchPic( x, y, width, height, 0, 0, 1, 1, hShader ); -} + if (h < 0) + { + // flip about horizontal + h = -h; + t0 = 1; + t1 = 0; + } + else + { + t0 = 0; + t1 = 1; + } -void UI_DrawHandlePic( float x, float y, float w, float h, qhandle_t hShader ) { - float s0; - float s1; - float t0; - float t1; - - if( w < 0 ) { // flip about vertical - w = -w; - s0 = 1; - s1 = 0; - } - else { - s0 = 0; - s1 = 1; - } - - if( h < 0 ) { // flip about horizontal - h = -h; - t0 = 1; - t1 = 0; - } - else { - t0 = 0; - t1 = 1; - } - - UI_AdjustFrom640( &x, &y, &w, &h ); - trap_R_DrawStretchPic( x, y, w, h, s0, t0, s1, t1, hShader ); + UI_AdjustFrom640(&x, &y, &w, &h); + trap_R_DrawStretchPic(x, y, w, h, s0, t0, s1, t1, hShader); } /* @@ -493,64 +275,14 @@ UI_FillRect Coordinates are 640*480 virtual values ================= */ -void UI_FillRect( float x, float y, float width, float height, const float *color ) { - trap_R_SetColor( color ); - - UI_AdjustFrom640( &x, &y, &width, &height ); - trap_R_DrawStretchPic( x, y, width, height, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); - - trap_R_SetColor( NULL ); -} - -void UI_DrawSides(float x, float y, float w, float h) { - UI_AdjustFrom640( &x, &y, &w, &h ); - trap_R_DrawStretchPic( x, y, 1, h, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); - trap_R_DrawStretchPic( x + w - 1, y, 1, h, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); -} - -void UI_DrawTopBottom(float x, float y, float w, float h) { - UI_AdjustFrom640( &x, &y, &w, &h ); - trap_R_DrawStretchPic( x, y, w, 1, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); - trap_R_DrawStretchPic( x, y + h - 1, w, 1, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); -} -/* -================ -UI_DrawRect - -Coordinates are 640*480 virtual values -================= -*/ -void UI_DrawRect( float x, float y, float width, float height, const float *color ) { - trap_R_SetColor( color ); - - UI_DrawTopBottom(x, y, width, height); - UI_DrawSides(x, y, width, height); - - trap_R_SetColor( NULL ); -} - -void UI_SetColor( const float *rgba ) { - trap_R_SetColor( rgba ); -} - -void UI_UpdateScreen( void ) { - trap_UpdateScreen(); -} - - -void UI_DrawTextBox (int x, int y, int width, int lines) +void UI_FillRect(float x, float y, float width, float height, const float *color) { - UI_FillRect( x + BIGCHAR_WIDTH/2, y + BIGCHAR_HEIGHT/2, ( width + 1 ) * BIGCHAR_WIDTH, ( lines + 1 ) * BIGCHAR_HEIGHT, colorBlack ); - UI_DrawRect( x + BIGCHAR_WIDTH/2, y + BIGCHAR_HEIGHT/2, ( width + 1 ) * BIGCHAR_WIDTH, ( lines + 1 ) * BIGCHAR_HEIGHT, colorWhite ); -} + trap_R_SetColor(color); -qboolean UI_CursorInRect (int x, int y, int width, int height) -{ - if (uiInfo.uiDC.cursorx < x || - uiInfo.uiDC.cursory < y || - uiInfo.uiDC.cursorx > x+width || - uiInfo.uiDC.cursory > y+height) - return qfalse; + UI_AdjustFrom640(&x, &y, &width, &height); + trap_R_DrawStretchPic(x, y, width, height, 0, 0, 0, 0, uiInfo.uiDC.whiteShader); - return qtrue; + trap_R_SetColor(NULL); } + +void UI_SetColor(const float *rgba) { trap_R_SetColor(rgba); } -- cgit