Skip to content

Commit

Permalink
Refactor: Removed all arguments from FR_DrawText that are now in the …
Browse files Browse the repository at this point in the history
…font

renderer attribute stack. Refactored callers to configure attribute state.

Fixed: Map name displayed while the automap is open is now drawn with no
additional effects, like the rest of the hud.

Changed: Important game messages (e.g., those produced when attempting to
quit the game) are now considered to be part of the menu subsystem. These
messages are now drawn with the same attributes as the rest of the menu.
  • Loading branch information
danij-deng committed Jun 12, 2011
1 parent fac9131 commit 067dcdc
Show file tree
Hide file tree
Showing 18 changed files with 77 additions and 63 deletions.
8 changes: 4 additions & 4 deletions doomsday/engine/api/dd_bitmapfont.h
Expand Up @@ -99,12 +99,12 @@ void FR_SetGlitterStrength(float value);
/**
* Text: A block of possibly formatted and/or multi-line text.
*/
void FR_DrawText(const char* string, int x, int y, fontid_t defFont, int defAlignFlags, short defFlags, float defLeading, int defTracking, float defGlitter, float defShadow, boolean defCase);
void FR_DrawText(const char* string, int x, int y, int defAlignFlags, short defFlags, boolean defCase);

// Utility routines:
void FR_TextDimensions(int* width, int* height, const char* string, fontid_t defFont);
int FR_TextWidth(const char* string, fontid_t defFont);
int FR_TextHeight(const char* string, fontid_t defFont);
void FR_TextDimensions(int* width, int* height, const char* string);
int FR_TextWidth(const char* string);
int FR_TextHeight(const char* string);

/**
* Text fragments: A single line of unformatted text.
Expand Down
2 changes: 1 addition & 1 deletion doomsday/engine/portable/include/gl_font.h
Expand Up @@ -34,7 +34,7 @@
#define DEFAULT_LEADING (.5)
#define DEFAULT_TRACKING (0)
#define DEFAULT_INITIALCOUNT (0) /// Used for animating type-in effects.
#define DEFAULT_GLITTER_STRENGTH (0)
#define DEFAULT_GLITTER_STRENGTH (.5)
#define DEFAULT_SHADOW_STRENGTH (.5)
#define DEFAULT_SHADOW_XOFFSET (2)
#define DEFAULT_SHADOW_YOFFSET (2)
Expand Down
46 changes: 17 additions & 29 deletions doomsday/engine/portable/src/gl_font.c
Expand Up @@ -1189,15 +1189,16 @@ static void initDrawTextState(drawtextstate_t* state)
fr_state_attributes_t* sat = currentAttributes();
state->font = BitmapFont_Id(fonts[fr.fontIdx]);
glGetFloatv(GL_CURRENT_COLOR, state->color);
state->tracking = DEFAULT_TRACKING;
state->tracking = sat->tracking;
state->glitterStrength = sat->glitterStrength;
state->shadowStrength = sat->shadowStrength;
state->shadowOffsetX = sat->shadowOffsetX;
state->shadowOffsetY = sat->shadowOffsetY;
state->leading = sat->leading;

state->scaleX = state->scaleY = 1;
state->offX = state->offY = 0;
state->angle = 0;
state->glitterStrength = DEFAULT_GLITTER_STRENGTH;
state->shadowStrength = DEFAULT_SHADOW_STRENGTH;
state->shadowOffsetX = DEFAULT_SHADOW_XOFFSET;
state->shadowOffsetY = DEFAULT_SHADOW_YOFFSET;
state->leading = DEFAULT_LEADING;
state->typeIn = true;
state->caseScale = false;
state->caseMod[0].scale = 1;
Expand All @@ -1209,21 +1210,21 @@ static void initDrawTextState(drawtextstate_t* state)
/**
* Draw a string of text controlled by parameter blocks.
*/
void FR_DrawText(const char* inString, int x, int y, fontid_t defFont, int alignFlags,
short textFlags, float defLeading, int defTracking, float defGlitter, float defShadow, boolean defCase)
void FR_DrawText(const char* inString, int x, int y, int alignFlags,
short textFlags, boolean defCase)
{
#define SMALLBUFF_SIZE (80)
#define MAX_FRAGMENTLENGTH (256)

float cx = (float) x, cy = (float) y, width = 0, extraScale;
char smallBuff[SMALLBUFF_SIZE+1], *bigBuff = NULL;
char temp[MAX_FRAGMENTLENGTH+1], *str, *string, *end;
fontid_t origFont = FR_GetCurrentId();
float origColor[4];
drawtextstate_t state;
size_t charCount = 0;
int curCase = -1, lastLineHeight;
size_t len;
fontid_t oldFont = FR_GetCurrentId();

if(!inString || !inString[0])
return;
Expand All @@ -1248,24 +1249,12 @@ void FR_DrawText(const char* inString, int x, int y, fontid_t defFont, int align
initDrawTextState(&state);
memcpy(origColor, state.color, sizeof(origColor));
// Apply defaults:
state.font = defFont;
state.typeIn = (textFlags & DTF_NO_TYPEIN) == 0;
state.glitterStrength = defGlitter;
state.shadowStrength = defShadow;
state.tracking = defTracking;
state.leading = defLeading;
state.caseScale = defCase;

FR_SetFont(state.font);
FR_PushAttrib();
FR_LoadDefaultAttrib();
FR_SetTracking(state.tracking);
FR_SetLeading(state.leading);
FR_SetShadowOffset(state.shadowOffsetX, state.shadowOffsetY);
FR_SetShadowStrength(state.shadowStrength);
FR_SetGlitterStrength(state.glitterStrength);
lastLineHeight = FR_CharHeight('A') * state.scaleY;

lastLineHeight = FR_CharHeight('A') * state.scaleY;
string = str;
while(*string)
{
Expand Down Expand Up @@ -1405,27 +1394,28 @@ void FR_DrawText(const char* inString, int x, int y, fontid_t defFont, int align
free(bigBuff);

FR_PopAttrib();
FR_SetFont(origFont);
glColor4fv(origColor);

#undef MAX_FRAGMENTLENGTH
#undef SMALLBUFF_SIZE
}

void FR_TextDimensions(int* width, int* height, const char* string, fontid_t fontId)
void FR_TextDimensions(int* width, int* height, const char* string)
{
if(!width && !height)
return;
if(width)
*width = FR_TextWidth(string, fontId);
*width = FR_TextWidth(string);
if(height)
*height = FR_TextHeight(string, fontId);
*height = FR_TextHeight(string);
}

/**
* Find the visible width of the whole formatted text block.
* Skips parameter blocks eg "{param}Text" = 4 chars
*/
int FR_TextWidth(const char* string, fontid_t fontId)
int FR_TextWidth(const char* string)
{
fontid_t oldFontId = FR_GetCurrentId();
int w, maxWidth = -1;
Expand All @@ -1436,7 +1426,6 @@ int FR_TextWidth(const char* string, fontid_t fontId)
if(!string || !string[0])
return 0;

FR_SetFont(fontId);
w = 0;
len = strlen(string);
ch = string;
Expand Down Expand Up @@ -1475,7 +1464,7 @@ int FR_TextWidth(const char* string, fontid_t fontId)
* Find the visible height of the whole formatted text block.
* Skips parameter blocks eg "{param}Text" = 4 chars
*/
int FR_TextHeight(const char* string, fontid_t fontId)
int FR_TextHeight(const char* string)
{
fontid_t oldFontId = FR_GetCurrentId();
int h, currentLineHeight;
Expand All @@ -1486,7 +1475,6 @@ int FR_TextHeight(const char* string, fontid_t fontId)
if(!string || !string[0])
return 0;

FR_SetFont(fontId);
currentLineHeight = 0;
len = strlen(string);
h = 0;
Expand Down
1 change: 0 additions & 1 deletion doomsday/plugins/common/include/hu_lib.h
Expand Up @@ -653,7 +653,6 @@ typedef struct mn_rendstate_s {
float pageAlpha;
float textGlitter;
float textShadow;
int textTracking;
float textColors[MENU_COLOR_COUNT][4];
fontid_t textFonts[MENU_FONT_COUNT];
} mn_rendstate_t;
Expand Down
8 changes: 4 additions & 4 deletions doomsday/plugins/common/src/hu_chat.c
Expand Up @@ -373,7 +373,7 @@ void UIChat_Drawer(uiwidget_t* obj, int x, int y)
DGL_Scalef(cfg.msgScale, cfg.msgScale, 1);

FR_SetFont(obj->fontId);
textWidth = FR_TextWidth(text, obj->fontId);
textWidth = FR_TextWidth(text);
cursorWidth = FR_CharWidth('_');

if(cfg.msgAlign == 0)
Expand All @@ -385,7 +385,7 @@ void UIChat_Drawer(uiwidget_t* obj, int x, int y)

DGL_Enable(DGL_TEXTURE_2D);
DGL_Color4f(cfg.hudColor[CR], cfg.hudColor[CG], cfg.hudColor[CB], textAlpha);
FR_DrawText(text, xOffset, 0, obj->fontId, alignFlags, textFlags, .5f, 0, 0, 0, false);
FR_DrawText(text, xOffset, 0, alignFlags, textFlags, false);
if(actualMapTime & 12)
{
FR_DrawChar('_', xOffset + textWidth, 0);
Expand All @@ -409,8 +409,8 @@ void UIChat_UpdateDimensions(uiwidget_t* obj)
return;

FR_SetFont(obj->fontId);
obj->dimensions.width = cfg.msgScale * (FR_TextWidth(text, obj->fontId) + FR_CharWidth('_'));
obj->dimensions.height = cfg.msgScale * (MAX_OF(FR_TextHeight(text, obj->fontId), FR_CharHeight('_')));
obj->dimensions.width = cfg.msgScale * (FR_TextWidth(text) + FR_CharWidth('_'));
obj->dimensions.height = cfg.msgScale * (MAX_OF(FR_TextHeight(text), FR_CharHeight('_')));
}
}

Expand Down
2 changes: 0 additions & 2 deletions doomsday/plugins/common/src/hu_lib.c
Expand Up @@ -589,7 +589,6 @@ void MN_DrawPage(mn_page_t* page, float alpha, boolean showFocusCursor)
rs.pageAlpha = alpha;
rs.textGlitter = cfg.menuTextGlitter;
rs.textShadow = cfg.menuShadow;
rs.textTracking = 0;
for(i = 0; i < MENU_FONT_COUNT; ++i)
{
rs.textFonts[i] = MNPage_PredefinedFont(page, i);
Expand All @@ -601,7 +600,6 @@ void MN_DrawPage(mn_page_t* page, float alpha, boolean showFocusCursor)
}
FR_SetFont(rs.textFonts[0]);
FR_LoadDefaultAttrib();
FR_SetTracking(rs.textTracking);
FR_SetShadowStrength(rs.textShadow);
FR_SetGlitterStrength(rs.textGlitter);

Expand Down
4 changes: 2 additions & 2 deletions doomsday/plugins/common/src/hu_log.c
Expand Up @@ -423,7 +423,7 @@ void UILog_Drawer(uiwidget_t* obj, int xOrigin, int yOrigin)
}

DGL_Color4f(col[CR], col[CG], col[CB], col[CA]);
FR_DrawText(msg->text, 0, y, obj->fontId, alignFlags, textFlags, .5f, 0, 0, 0, false);
FR_DrawText(msg->text, 0, y, alignFlags, textFlags, false);

++drawnMsgCount;
y += lineHeight;
Expand Down Expand Up @@ -517,7 +517,7 @@ void UILog_UpdateDimensions(uiwidget_t* obj)

++drawnMsgCount;

FR_TextDimensions(&lineWidth, NULL, msg->text, FID(GF_FONTA));
FR_TextDimensions(&lineWidth, NULL, msg->text);
if(lineWidth > obj->dimensions.width)
{
obj->dimensions.width = lineWidth;
Expand Down
3 changes: 3 additions & 0 deletions doomsday/plugins/common/src/hu_menu.c
Expand Up @@ -1587,6 +1587,9 @@ cvartemplate_t menuCVars[] = {
{ "menu-colorc-r", 0, CVT_FLOAT, &cfg.menuTextColors[2][CR], 0, 1 },
{ "menu-colorc-g", 0, CVT_FLOAT, &cfg.menuTextColors[2][CG], 0, 1 },
{ "menu-colorc-b", 0, CVT_FLOAT, &cfg.menuTextColors[2][CB], 0, 1 },
{ "menu-colord-r", 0, CVT_FLOAT, &cfg.menuTextColors[3][CR], 0, 1 },
{ "menu-colord-g", 0, CVT_FLOAT, &cfg.menuTextColors[3][CG], 0, 1 },
{ "menu-colord-b", 0, CVT_FLOAT, &cfg.menuTextColors[3][CB], 0, 1 },
{ "menu-glitter", 0, CVT_FLOAT, &cfg.menuTextGlitter, 0, 1 },
{ "menu-fog", 0, CVT_INT, &cfg.hudFog, 0, 5 },
{ "menu-shadow", 0, CVT_FLOAT, &cfg.menuShadow, 0, 1 },
Expand Down
15 changes: 9 additions & 6 deletions doomsday/plugins/common/src/hu_msg.c
Expand Up @@ -190,6 +190,7 @@ static void drawMessage(void)
{
#define LEADING (0)

short textFlags = MN_MergeMenuEffectWithDrawTextFlags(0);
int x = SCREENWIDTH/2, y = SCREENHEIGHT/2;
const char* questionString;

Expand All @@ -202,16 +203,19 @@ static void drawMessage(void)
}

DGL_Enable(DGL_TEXTURE_2D);
DGL_Color4f(cfg.menuTextColors[MENU_COLOR4][CR], cfg.menuTextColors[MENU_COLOR4][CG], cfg.menuTextColors[MENU_COLOR4][CB], 1);
FR_SetFont(FID(GF_FONTA));
FR_LoadDefaultAttrib();
FR_SetLeading(LEADING);
FR_SetShadowStrength(cfg.menuTextGlitter);
FR_SetGlitterStrength(cfg.menuShadow);

DGL_Color4f(cfg.msgColor[CR], cfg.msgColor[CG], cfg.msgColor[CB], 1);
FR_DrawText(msgText, x, y, FID(GF_FONTA), ALIGN_TOP, 0, LEADING, 0, 0, 0, false);
y += FR_TextHeight(msgText, FID(GF_FONTA));
FR_DrawText(msgText, x, y, ALIGN_TOP, textFlags, false);
y += FR_TextHeight(msgText);
// An additional blank line between the message and response prompt.
y += FR_CharHeight('A') * (1+LEADING);

FR_DrawTextFragment2(questionString, x, y, ALIGN_TOP, 0);
FR_DrawTextFragment2(questionString, x, y, ALIGN_TOP, textFlags);
DGL_Disable(DGL_TEXTURE_2D);

#undef LEADING
Expand All @@ -229,11 +233,10 @@ void Hu_MsgDrawer(void)
GL_ConfigureBorderedProjection(&bp, 0, SCREENWIDTH, SCREENHEIGHT, Get(DD_WINDOW_WIDTH), Get(DD_WINDOW_HEIGHT), cfg.menuScaleMode);
GL_BeginBorderedProjection(&bp);

// Scale by the hudScale.
DGL_MatrixMode(DGL_MODELVIEW);
DGL_PushMatrix();
DGL_Translatef(SCREENWIDTH/2, SCREENHEIGHT/2, 0);
DGL_Scalef(cfg.hudScale, cfg.hudScale, 1);
DGL_Scalef(cfg.menuScale, cfg.menuScale, 1);
DGL_Translatef(-(SCREENWIDTH/2), -(SCREENHEIGHT/2), 0);

drawMessage();
Expand Down
9 changes: 7 additions & 2 deletions doomsday/plugins/common/src/hu_stuff.c
Expand Up @@ -1213,7 +1213,12 @@ void WI_DrawPatch5(patchid_t patchId, const char* replacement, int x, int y, int
{
// Use the replacement string.
DGL_Color4f(r, g, b, a);
FR_DrawText(replacement, x, y, fontId, alignFlags, textFlags, .5f, 0, glitter, shadow, false);
FR_SetFont(fontId);
FR_SetLeading(.5f);
FR_SetTracking(0);
FR_SetGlitterStrength(glitter);
FR_SetShadowStrength(shadow);
FR_DrawText(replacement, x, y, alignFlags, textFlags, false);
return;
}

Expand Down Expand Up @@ -1581,7 +1586,7 @@ static void drawMapTitle(void)

FR_LoadDefaultAttrib();

WI_DrawPatch4(pMapNames[mapnum], Hu_ChoosePatchReplacement2(pMapNames[mapnum], lname, false), 0, 0, ALIGN_TOP, 0, 0, FID(GF_FONTB), 1, 1, 1, alpha);
WI_DrawPatch4(pMapNames[mapnum], Hu_ChoosePatchReplacement2(pMapNames[mapnum], lname, false), 0, 0, ALIGN_TOP, 0, DTF_ONLY_SHADOW, FID(GF_FONTB), 1, 1, 1, alpha);

DGL_Disable(DGL_TEXTURE_2D);

Expand Down
3 changes: 3 additions & 0 deletions doomsday/plugins/jdoom/src/d_main.c
Expand Up @@ -243,6 +243,9 @@ void D_PreInit(void)
cfg.menuTextColors[2][CR] = 1;
cfg.menuTextColors[2][CG] = 1;
cfg.menuTextColors[2][CB] = 1;
cfg.menuTextColors[3][CR] = .85f;
cfg.menuTextColors[3][CG] = 0;
cfg.menuTextColors[3][CB] = 0;
cfg.menuSlam = false;
cfg.menuShortcutsEnabled = true;
cfg.menuGameSaveSuggestName = true;
Expand Down
5 changes: 3 additions & 2 deletions doomsday/plugins/jdoom/src/st_stuff.c
Expand Up @@ -2842,7 +2842,7 @@ void MapName_Drawer(uiwidget_t* obj, int x, int y)
DGL_Scalef(scale, scale, 1);

DGL_Enable(DGL_TEXTURE_2D);
WI_DrawPatch4(patch, text, 0, 0, ALIGN_BOTTOMLEFT, 0, 0, obj->fontId, cfg.hudColor[0], cfg.hudColor[1], cfg.hudColor[2], textAlpha);
WI_DrawPatch4(patch, text, 0, 0, ALIGN_BOTTOMLEFT, 0, DTF_NO_EFFECTS, obj->fontId, cfg.hudColor[0], cfg.hudColor[1], cfg.hudColor[2], textAlpha);
DGL_Disable(DGL_TEXTURE_2D);

DGL_MatrixMode(DGL_MODELVIEW);
Expand All @@ -2867,7 +2867,8 @@ void MapName_UpdateDimensions(uiwidget_t* obj)

if(NULL != text)
{
FR_TextDimensions(&obj->dimensions.width, &obj->dimensions.height, text, obj->fontId);
FR_SetFont(obj->fontId);
FR_TextDimensions(&obj->dimensions.width, &obj->dimensions.height, text);
obj->dimensions.width *= scale;
obj->dimensions.height *= scale;
return;
Expand Down
3 changes: 3 additions & 0 deletions doomsday/plugins/jdoom64/src/d_main.c
Expand Up @@ -244,6 +244,9 @@ void D_PreInit(void)
cfg.menuTextColors[2][CR] = 1;
cfg.menuTextColors[2][CG] = 0;
cfg.menuTextColors[2][CB] = 0;
cfg.menuTextColors[3][CR] = 1;
cfg.menuTextColors[3][CG] = 0;
cfg.menuTextColors[3][CB] = 0;
cfg.menuSlam = false;
cfg.menuShortcutsEnabled = true;
cfg.menuGameSaveSuggestName = true;
Expand Down
5 changes: 3 additions & 2 deletions doomsday/plugins/jdoom64/src/st_stuff.c
Expand Up @@ -632,7 +632,7 @@ void MapName_Drawer(uiwidget_t* obj, int x, int y)
DGL_Scalef(scale, scale, 1);

DGL_Enable(DGL_TEXTURE_2D);
WI_DrawPatch4(patch, text, 0, 0, ALIGN_BOTTOMLEFT, 0, 0, obj->fontId, cfg.hudColor[0], cfg.hudColor[1], cfg.hudColor[2], textAlpha);
WI_DrawPatch4(patch, text, 0, 0, ALIGN_BOTTOMLEFT, 0, DTF_NO_EFFECTS, obj->fontId, cfg.hudColor[0], cfg.hudColor[1], cfg.hudColor[2], textAlpha);
DGL_Disable(DGL_TEXTURE_2D);

DGL_MatrixMode(DGL_MODELVIEW);
Expand All @@ -657,7 +657,8 @@ void MapName_Dimensions(uiwidget_t* obj, int* width, int *height)

if(NULL != text)
{
FR_TextDimensions(width, height, text, obj->fontId);
FR_SetFont(obj->fontId);
FR_TextDimensions(width, height, text);
if(NULL != width) *width = *width * scale;
if(NULL != height) *height = *height * scale;
return;
Expand Down
3 changes: 3 additions & 0 deletions doomsday/plugins/jheretic/src/h_main.c
Expand Up @@ -248,6 +248,9 @@ void H_PreInit(void)
cfg.menuTextColors[2][0] = defFontRGB3[0];
cfg.menuTextColors[2][1] = defFontRGB3[1];
cfg.menuTextColors[2][2] = defFontRGB3[2];
cfg.menuTextColors[3][0] = defFontRGB3[0];
cfg.menuTextColors[3][1] = defFontRGB3[1];
cfg.menuTextColors[3][2] = defFontRGB3[2];
cfg.menuSlam = true;
cfg.menuShortcutsEnabled = true;
cfg.menuGameSaveSuggestName = true;
Expand Down
6 changes: 4 additions & 2 deletions doomsday/plugins/jheretic/src/st_stuff.c
Expand Up @@ -2732,7 +2732,8 @@ void MapName_Drawer(uiwidget_t* obj, int x, int y)

DGL_Enable(DGL_TEXTURE_2D);
DGL_Color4f(cfg.hudColor[0], cfg.hudColor[1], cfg.hudColor[2], textAlpha);
FR_DrawText(text, 0, 0, obj->fontId, ALIGN_BOTTOMLEFT, 0, .5f, 0, 0, 0, false);
FR_SetFont(obj->fontId);
FR_DrawText(text, 0, 0, ALIGN_BOTTOMLEFT, DTF_NO_EFFECTS, false);
DGL_Disable(DGL_TEXTURE_2D);

DGL_MatrixMode(DGL_MODELVIEW);
Expand All @@ -2753,7 +2754,8 @@ void MapName_UpdateDimensions(uiwidget_t* obj)
if(NULL == text)
return;

FR_TextDimensions(&obj->dimensions.width, &obj->dimensions.height, text, obj->fontId);
FR_SetFont(obj->fontId);
FR_TextDimensions(&obj->dimensions.width, &obj->dimensions.height, text);
obj->dimensions.width *= scale;
obj->dimensions.height *= scale;
}
Expand Down

0 comments on commit 067dcdc

Please sign in to comment.