X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=cl_screen.c;h=4629e4923e87b454976a7e769e9cd07b2c26d36f;hb=5bf9e87c9090ee6f6742d9774a141a7e7a3c7d31;hp=650c64dce2b281e9c7390dda05a00e17f5116614;hpb=9c6deef2a013d5fb3d7a807874e76f6256b28b8a;p=xonotic%2Fdarkplaces.git diff --git a/cl_screen.c b/cl_screen.c index 650c64dc..4629e492 100644 --- a/cl_screen.c +++ b/cl_screen.c @@ -14,11 +14,12 @@ cvar_t scr_centertime = {0, "scr_centertime","2"}; cvar_t scr_showram = {CVAR_SAVE, "showram","1"}; cvar_t scr_showturtle = {CVAR_SAVE, "showturtle","0"}; cvar_t scr_showpause = {CVAR_SAVE, "showpause","1"}; +cvar_t scr_showbrand = {0, "showbrand","0"}; cvar_t scr_printspeed = {0, "scr_printspeed","8"}; cvar_t vid_conwidth = {CVAR_SAVE, "vid_conwidth", "640"}; cvar_t vid_conheight = {CVAR_SAVE, "vid_conheight", "480"}; cvar_t vid_pixelaspect = {CVAR_SAVE, "vid_pixelaspect", "1"}; -cvar_t scr_screenshot_jpeg = {CVAR_SAVE, "scr_screenshot_jpeg","0"}; +cvar_t scr_screenshot_jpeg = {CVAR_SAVE, "scr_screenshot_jpeg","1"}; cvar_t scr_screenshot_jpeg_quality = {CVAR_SAVE, "scr_screenshot_jpeg_quality","0.9"}; cvar_t scr_screenshot_gamma = {CVAR_SAVE, "scr_screenshot_gamma","2.2"}; cvar_t scr_screenshot_name = {0, "scr_screenshot_name","dp"}; @@ -45,6 +46,114 @@ static void R_Envmap_f (void); // backend void R_ClearScreen(void); +// color tag printing +static vec4_t string_colors[] = +{ + // Quake3 colors + // LordHavoc: why on earth is cyan before magenta in Quake3? + // LordHavoc: note: Doom3 uses white for [0] and [7] + {0.0, 0.0, 0.0, 1.0}, // black + {1.0, 0.0, 0.0, 1.0}, // red + {0.0, 1.0, 0.0, 1.0}, // green + {1.0, 1.0, 0.0, 1.0}, // yellow + {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 + // [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.0, 1.0, 0.0, 1.0}, + //{0.0, 0.0, 1.0, 1.0}, + //{1.0, 1.0, 0.0, 1.0}, + //{0.0, 1.0, 1.0, 1.0}, + //{1.0, 0.0, 1.0, 1.0}, + //{0.1, 0.1, 0.1, 1.0} +}; + +#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; + int len; + int colorindex; + const char *start, *current; + + if( !outcolor || *outcolor == -1 ) { + colorindex = STRING_COLOR_DEFAULT; + } else { + colorindex = *outcolor; + } + color = string_colors[colorindex]; + + if( maxlen < 1) + len = (int)strlen( text ); + else + 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; + } + // 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 >= (int)STRING_COLORS_COUNT ) { + // undo the last operation + colorindex /= 10; + break; + } + current++; + len--; + } while( len > 0 && '0' <= *current && *current <= '9' ); + // set the color + color = string_colors[colorindex]; + // we jump over the color tag + start = current; + } + } + // 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; + } +} + /* =============================================================================== @@ -91,6 +200,7 @@ void SCR_DrawCenterString (void) int l; int x, y; int remaining; + int color; // the finale prints the characters one at a time if (cl.intermission) @@ -106,6 +216,7 @@ void SCR_DrawCenterString (void) else y = 48; + color = -1; do { // scan the width of the line @@ -117,7 +228,7 @@ void SCR_DrawCenterString (void) { if (remaining < l) l = remaining; - DrawQ_String(x, y, start, l, 8, 8, 1, 1, 1, 1, 0); + DrawQ_ColoredString(x, y, start, l, 8, 8, 1, 1, 1, 1, 0, &color); remaining -= l; if (remaining <= 0) return; @@ -220,9 +331,61 @@ void SCR_DrawPause (void) DrawQ_Pic ((vid_conwidth.integer - pic->width)/2, (vid_conheight.integer - pic->height)/2, "gfx/pause", 0, 0, 1, 1, 1, 1, 0); } +/* +============== +SCR_DrawBrand +============== +*/ +void SCR_DrawBrand (void) +{ + cachepic_t *pic; + float x, y; + if (!scr_showbrand.value) + return; + pic = Draw_CachePic ("gfx/brand", true); + switch ((int)scr_showbrand.value) + { + case 1: // bottom left + x = 0; + y = vid_conheight.integer - pic->height; + break; + case 2: // bottom centre + x = (vid_conwidth.integer - pic->width) / 2; + y = vid_conheight.integer - pic->height; + break; + case 3: // bottom right + x = vid_conwidth.integer - pic->width; + y = vid_conheight.integer - pic->height; + break; + case 4: // centre right + x = vid_conwidth.integer - pic->width; + y = (vid_conheight.integer - pic->height) / 2; + break; + case 5: // top right + x = vid_conwidth.integer - pic->width; + y = 0; + break; + case 6: // top centre + x = (vid_conwidth.integer - pic->width) / 2; + y = 0; + break; + case 7: // top left + x = 0; + y = 0; + break; + case 8: // centre left + x = 0; + y = (vid_conheight.integer - pic->height) / 2; + break; + default: + return; + } + + DrawQ_Pic (x, y, "gfx/brand", 0, 0, 1, 1, 1, 1, 0); +} //============================================================================= @@ -325,7 +488,7 @@ void R_TimeReport(char *desc) 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; @@ -459,6 +622,7 @@ void CL_Screen_Init(void) Cvar_RegisterVariable (&scr_showram); Cvar_RegisterVariable (&scr_showturtle); Cvar_RegisterVariable (&scr_showpause); + Cvar_RegisterVariable (&scr_showbrand); Cvar_RegisterVariable (&scr_centertime); Cvar_RegisterVariable (&scr_printspeed); Cvar_RegisterVariable (&vid_conwidth); @@ -502,7 +666,7 @@ void DrawQ_String_Real(float x, float y, const char *string, int maxlen, float s 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--); @@ -541,6 +705,8 @@ void DrawQ_String(float x, float y, const char *string, int maxlen, float scalex DrawQ_String_Real(x,y,string,maxlen,scalex,scaley,red,green,blue,alpha,flags); } + + void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags) { DrawQ_SuperPic(x,y,NULL,w,h,0,0,red,green,blue,alpha,1,0,red,green,blue,alpha,0,1,red,green,blue,alpha,1,1,red,green,blue,alpha,flags); @@ -833,7 +999,7 @@ void SCR_CaptureVideo_EndVideo(void) // finish the wave file if (cl_capturevideo_soundfile) { - i = FS_Tell (cl_capturevideo_soundfile); + i = (int)FS_Tell (cl_capturevideo_soundfile); //"RIFF", (int) unknown (chunk size), "WAVE", //"fmt ", (int) 16 (chunk size), (short) format 1 (uncompressed PCM), (short) 2 channels, (int) unknown rate, (int) unknown bytes per second, (short) 4 bytes per sample (channels * bytes per channel), (short) 16 bits per channel //"data", (int) unknown (chunk size) @@ -977,7 +1143,7 @@ void SCR_CaptureVideo_SoundFrame(qbyte *bufstereo16le, size_t length, int rate) if (!cl_capturevideo_soundfile) return; cl_capturevideo_soundrate = rate; - if (FS_Write (cl_capturevideo_soundfile, bufstereo16le, 4 * length) < 4 * length) + if (FS_Write (cl_capturevideo_soundfile, bufstereo16le, 4 * length) < (fs_offset_t)(4 * length)) { Cvar_SetValueQuick(&cl_capturevideo, 0); Con_Printf("video sound saving failed on frame %i, out of disk space? stopping video capture.\n", cl_capturevideo_frame); @@ -1298,6 +1464,8 @@ void CL_UpdateScreen(void) SCR_DrawConsole(); + SCR_DrawBrand(); + SCR_UpdateScreen(); }