(svn r15803) -Codechange: use the new text drawing API for multicenter

-Fix (r15800): off-by-one w.r.t. offsets
This commit is contained in:
rubidium 2009-03-22 09:34:06 +00:00
parent 70d0f8857e
commit e74dc1e1d6
9 changed files with 40 additions and 69 deletions

View File

@ -144,7 +144,7 @@ struct CheatWindow : Window {
virtual void OnPaint()
{
this->DrawWidgets();
DrawStringMultiCenter(200, 25, STR_CHEATS_WARNING, width - 50);
DrawStringMultiLine(20, this->width - 40, 15, 45, STR_CHEATS_WARNING, SA_CENTER);
for (int i = 0, x = 0, y = 45; i != lengthof(_cheats_ui); i++) {
const CheatEntry *ce = &_cheats_ui[i];

View File

@ -1312,7 +1312,7 @@ struct CompanyWindow : Window
/* "xxx (Manager)" */
SetDParam(0, c->index);
DrawStringMultiCenter(48, 141, STR_7037_PRESIDENT, MAX_LENGTH_PRESIDENT_NAME_PIXELS);
DrawStringMultiLine(48 - MAX_LENGTH_PRESIDENT_NAME_PIXELS / 2, 48 + MAX_LENGTH_PRESIDENT_NAME_PIXELS / 2, 135, 157, STR_7037_PRESIDENT, SA_CENTER);
/* "Inaugurated:" */
SetDParam(0, c->inaugurated_year);
@ -1489,7 +1489,7 @@ struct BuyCompanyWindow : Window {
SetDParam(0, c->index);
SetDParam(1, c->bankrupt_value);
DrawStringMultiCenter(214, 65, STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT, 238);
DrawStringMultiLine(95, 333, 26, 116, STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT, SA_CENTER);
}
virtual void OnClick(Point pt, int widget)

View File

@ -80,7 +80,7 @@ struct EnginePreviewWindow : Window {
EngineID engine = this->window_number;
SetDParam(0, GetEngineCategoryName(engine));
DrawStringMultiLine(this->widget[EPW_BACKGROUND].left + 2, this->widget[EPW_BACKGROUND].right - 2, 14, 74, STR_8101_WE_HAVE_JUST_DESIGNED_A, SA_CENTER);
DrawStringMultiLine(this->widget[EPW_BACKGROUND].left + 2, this->widget[EPW_BACKGROUND].right - 2, 18, 80, STR_8101_WE_HAVE_JUST_DESIGNED_A, SA_CENTER);
SetDParam(0, engine);
DrawString(this->widget[EPW_BACKGROUND].left + 2, this->widget[EPW_BACKGROUND].right - 2, 80, STR_ENGINE_NAME, TC_BLACK, SA_CENTER);
@ -89,7 +89,7 @@ struct EnginePreviewWindow : Window {
int width = this->width;
dei->engine_proc(width >> 1, 100, engine, 0);
dei->info_proc(engine, this->widget[EPW_BACKGROUND].left + 26, this->widget[EPW_BACKGROUND].right - 26, 100, 160);
dei->info_proc(engine, this->widget[EPW_BACKGROUND].left + 26, this->widget[EPW_BACKGROUND].right - 26, 100, 170);
}
virtual void OnClick(Point pt, int widget)
@ -211,16 +211,16 @@ void DrawNewsNewVehicleAvail(Window *w, const NewsItem *ni)
const DrawEngineInfo *dei = &_draw_engine_list[GetEngine(engine)->type];
SetDParam(0, GetEngineCategoryName(engine));
DrawStringMultiLine(1, w->width - 2, 0, 40, STR_NEW_VEHICLE_NOW_AVAILABLE, SA_CENTER);
DrawStringMultiLine(1, w->width - 2, 0, 56, STR_NEW_VEHICLE_NOW_AVAILABLE, SA_CENTER);
GfxFillRect(25, 56, w->width - 25, w->height - 2, 10);
SetDParam(0, engine);
DrawStringMultiLine(1, w->width - 2, 40, 74, STR_NEW_VEHICLE_TYPE, SA_CENTER);
DrawStringMultiLine(1, w->width - 2, 56, 88, STR_NEW_VEHICLE_TYPE, SA_CENTER);
dei->engine_proc(w->width >> 1, 88, engine, 0);
GfxFillRect(25, 56, w->width - 56, 112, PALETTE_TO_STRUCT_GREY, FILLRECT_RECOLOUR);
dei->info_proc(engine, 26, w->width - 26, 100, 160);
dei->info_proc(engine, 26, w->width - 26, 100, 170);
}

View File

@ -637,7 +637,7 @@ int DrawStringMultiLine(int left, int right, int top, int bottom, StringID str,
total_height = (num + 1) * mt;
}
int y = (align == SA_CENTER) ? (bottom + top - num * mt) / 2 : top;
int y = (align == SA_CENTER) ? (bottom + top - total_height + 1) / 2 : top;
const char *src = buffer;
for (;;) {
@ -652,7 +652,7 @@ int DrawStringMultiLine(int left, int right, int top, int bottom, StringID str,
y += mt;
if (--num < 0) {
_cur_fontsize = FS_NORMAL;
return y + mt;
return y;
}
break;
} else if (c == SCC_SETX) {
@ -664,16 +664,6 @@ int DrawStringMultiLine(int left, int right, int top, int bottom, StringID str,
}
}
/** Draw a given string with the centre around the given (x,y) coordinates
* @param x Centre the string around this pixel width
* @param y Centre the string around this pixel height
* @param str String to draw
* @param maxw Maximum width the string can have before it is wrapped */
void DrawStringMultiCenter(int x, int y, StringID str, int maxw)
{
DrawStringMultiLine(x - maxw / 2, x + maxw / 2, y - 1024, y + 1024, str, SA_CENTER);
}
/** Return the string dimension in pixels. The height and width are returned
* in a single Dimension value. TINYFONT, BIGFONT modifiers are only
* supported as the first character of the string. The returned dimensions

View File

@ -108,7 +108,6 @@ Dimension GetStringBoundingBox(const char *str);
uint32 FormatStringLinebreaks(char *str, int maxw);
int GetStringHeight(StringID str, int maxw);
void LoadStringWidthTable();
void DrawStringMultiCenter(int x, int y, StringID str, int maxw);
/**
* Let the dirty blocks repainting by the video driver.

View File

@ -102,11 +102,11 @@ struct EndGameWindow : EndGameHighScoreBaseWindow {
SetDParam(0, c->index);
SetDParam(1, c->index);
SetDParam(2, EndGameGetPerformanceTitleFromValue(c->old_economy[0].performance_history));
DrawStringMultiCenter(x + (640 / 2), y + 107, STR_021C_OF_ACHIEVES_STATUS, 640);
DrawStringMultiLine(x, x + 640, y + 140, y + 206, STR_021C_OF_ACHIEVES_STATUS, SA_CENTER);
} else {
SetDParam(0, c->index);
SetDParam(1, EndGameGetPerformanceTitleFromValue(c->old_economy[0].performance_history));
DrawStringMultiCenter(x + (640 / 2), y + 157, STR_021B_ACHIEVES_STATUS, 640);
DrawStringMultiLine(x, x + 640, y + 90, y + 210, STR_021B_ACHIEVES_STATUS, SA_CENTER);
}
}
};
@ -144,7 +144,7 @@ struct HighScoreWindow : EndGameHighScoreBaseWindow {
SetDParam(0, ORIGINAL_END_YEAR);
SetDParam(1, this->window_number + STR_6801_EASY);
DrawStringMultiCenter(x + (640 / 2), y + 62, !_networking ? STR_0211_TOP_COMPANIES_WHO_REACHED : STR_TOP_COMPANIES_NETWORK_GAME, 500);
DrawStringMultiLine(x + 70, x + 570, y, y + 140, !_networking ? STR_0211_TOP_COMPANIES_WHO_REACHED : STR_TOP_COMPANIES_NETWORK_GAME, SA_CENTER);
/* Draw Highscore peepz */
for (uint8 i = 0; i < lengthof(_highscore_table[0]); i++) {

View File

@ -89,11 +89,9 @@ public:
y += i == 0 ? 16 : 12;
}
y += 6;
if (!StrEmpty(this->landinfo_data[LAND_INFO_MULTICENTER_LINE])) {
SetDParamStr(0, this->landinfo_data[LAND_INFO_MULTICENTER_LINE]);
DrawStringMultiCenter(150, y, STR_JUST_RAW_STRING, this->width - 4);
DrawStringMultiLine(this->widget[LIW_BACKGROUND].left + 2, this->widget[LIW_BACKGROUND].right - 2, y, y + 22, STR_JUST_RAW_STRING, SA_CENTER);
}
}
@ -436,7 +434,7 @@ private:
StringID message_2;
bool show_company_manager_face;
int y[2];
int y[4];
public:
ErrmsgWindow(Point pt, int width, int height, StringID msg1, StringID msg2, const Widget *widget, bool show_company_manager_face) :
@ -454,22 +452,23 @@ public:
assert(msg2 != INVALID_STRING_ID);
int h2 = 3 + GetStringHeight(msg2, width - 2); // msg2 is printed first
int h1 = (msg1 == INVALID_STRING_ID) ? 0 : 3 + GetStringHeight(msg1, width - 2);
int h2 = GetStringHeight(msg2, width - 2); // msg2 is printed first
int h1 = (msg1 == INVALID_STRING_ID) ? 0 : GetStringHeight(msg1, width - 2);
SwitchToNormalRefStack();
int h = 15 + h1 + h2;
int h = 20 + h1 + h2;
height = max<int>(height, h);
if (msg1 == INVALID_STRING_ID) {
/* only 1 line will be printed */
y[1] = (height - 15) / 2 + 15 - 5;
y[2] = 14 + 1;
y[3] = height - 1;
} else {
int over = (height - h) / 4;
y[1] = 15 + h2 / 2 + 1 - 5 + over;
y[0] = height - 3 - h1 / 2 - 5 - over;
int over = (height - 16 - h1 - h2) / 2;
y[1] = height - 1;
y[0] = y[1] - h1 - over;
y[2] = 14 + 1;
y[3] = y[2] + h2 + over;
}
this->FindWindowPlacementAndResize(width, height);
@ -492,8 +491,8 @@ public:
DrawCompanyManagerFace(c->face, c->colour, 2, 16);
}
DrawStringMultiCenter(this->width - 120, y[1], this->message_2, this->width - 2);
if (this->message_1 != INVALID_STRING_ID) DrawStringMultiCenter(this->width - 120, y[0], this->message_1, this->width - 2);
DrawStringMultiLine(1, this->width - 1, y[2], y[3] , this->message_2, SA_CENTER);
if (this->message_1 != INVALID_STRING_ID) DrawStringMultiLine(1, this->width - 1, y[0], y[1], this->message_1, SA_CENTER);
/* Switch back to the normal text ref. stack for NewGRF texts */
SwitchToNormalRefStack();
@ -664,7 +663,7 @@ struct TooltipsWindow : public Window
for (uint arg = 0; arg < this->paramcount; arg++) {
SetDParam(arg, this->params[arg]);
}
DrawStringMultiCenter((this->width >> 1), (this->height >> 1) - 5, this->string_id, this->width - 2);
DrawStringMultiLine(1, this->width - 1, 0, this->height, this->string_id, SA_CENTER);
}
virtual void OnMouseLoop()
@ -1279,7 +1278,7 @@ struct QueryWindow : public Window {
this->DrawWidgets();
CopyInDParam(0, this->params, lengthof(this->params));
DrawStringMultiCenter(this->width / 2, (this->height / 2) - 10, this->message, this->width - 2);
DrawStringMultiLine(1, this->width - 1, 14, 62, this->message, SA_CENTER);
}
virtual void OnClick(Point pt, int widget)

View File

@ -136,7 +136,7 @@ public:
SetDParamStr(0, this->name);
SetDParam(1, this->downloaded_files);
SetDParam(2, this->total_files);
DrawStringMultiCenter(this->width / 2, 50, STR_CONTENT_DOWNLOAD_FILE, this->width);
DrawStringMultiLine(this->widget[NCDSWW_BACKGROUND].left + 2, this->widget[NCDSWW_BACKGROUND].right - 2, 43, 67, STR_CONTENT_DOWNLOAD_FILE, SA_CENTER);
} else {
DrawString(this->widget[NCDSWW_BACKGROUND].left + 2, this->widget[NCDSWW_BACKGROUND].right - 2, 50, STR_CONTENT_DOWNLOAD_INITIALISE, TC_GREY, SA_CENTER);
}
@ -435,7 +435,7 @@ public:
if (this->selected == NULL) return;
/* And fill the rest of the details when there's information to place there */
DrawStringMultiCenter((this->widget[NCLWW_DETAILS].left + this->widget[NCLWW_DETAILS].right) / 2, this->widget[NCLWW_DETAILS].top + 32, STR_CONTENT_DETAIL_SUBTITLE_UNSELECTED + this->selected->state, this->widget[NCLWW_DETAILS].right - this->widget[NCLWW_DETAILS].left - 10);
DrawStringMultiLine(this->widget[NCLWW_DETAILS].left + 5, this->widget[NCLWW_DETAILS].right - 5, this->widget[NCLWW_DETAILS].top + 25, this->widget[NCLWW_DETAILS].top + 50, STR_CONTENT_DETAIL_SUBTITLE_UNSELECTED + this->selected->state, SA_CENTER);
/* Also show the total download size, so keep some space from the bottom */
const uint max_y = this->widget[NCLWW_DETAILS].bottom - 15;

View File

@ -53,7 +53,7 @@ static void DrawNewsBankrupcy(Window *w, const NewsItem *ni)
GfxFillRect(3, 23, 3 + 91, 23 + 118, PALETTE_TO_STRUCT_GREY, FILLRECT_RECOLOUR);
SetDParamStr(0, cni->president_name);
DrawStringMultiCenter(49, 148, STR_JUST_RAW_STRING, 94);
DrawStringMultiLine(49 - MAX_LENGTH_PRESIDENT_NAME_PIXELS / 2, 49 + MAX_LENGTH_PRESIDENT_NAME_PIXELS / 2, 141, 169, STR_JUST_RAW_STRING, SA_CENTER);
switch (ni->subtype) {
case NS_COMPANY_TROUBLE:
@ -61,11 +61,7 @@ static void DrawNewsBankrupcy(Window *w, const NewsItem *ni)
SetDParam(0, ni->params[2]);
DrawStringMultiCenter(
((w->width - 101) >> 1) + 98,
90,
STR_7057_WILL_BE_SOLD_OFF_OR_DECLARED,
w->width - 101);
DrawStringMultiLine(100, w->width - 2, 20, 169, STR_7057_WILL_BE_SOLD_OFF_OR_DECLARED, SA_CENTER);
break;
case NS_COMPANY_MERGER:
@ -73,32 +69,20 @@ static void DrawNewsBankrupcy(Window *w, const NewsItem *ni)
SetDParam(0, ni->params[2]);
SetDParam(1, ni->params[3]);
SetDParam(2, ni->params[4]);
DrawStringMultiCenter(
((w->width - 101) >> 1) + 98,
90,
ni->params[4] == 0 ? STR_707F_HAS_BEEN_TAKEN_OVER_BY : STR_705A_HAS_BEEN_SOLD_TO_FOR,
w->width - 101);
DrawStringMultiLine(100, w->width - 2, 20, 169, ni->params[4] == 0 ? STR_707F_HAS_BEEN_TAKEN_OVER_BY : STR_705A_HAS_BEEN_SOLD_TO_FOR, SA_CENTER);
break;
case NS_COMPANY_BANKRUPT:
DrawString(0, w->width, 1, STR_705C_BANKRUPT, TC_FROMSTRING, SA_CENTER);
SetDParam(0, ni->params[2]);
DrawStringMultiCenter(
((w->width - 101) >> 1) + 98,
90,
STR_705D_HAS_BEEN_CLOSED_DOWN_BY,
w->width - 101);
DrawStringMultiLine(100, w->width - 2, 20, 169, STR_705D_HAS_BEEN_CLOSED_DOWN_BY, SA_CENTER);
break;
case NS_COMPANY_NEW:
DrawString(0, w->width, 1, STR_705E_NEW_TRANSPORT_COMPANY_LAUNCHED, TC_FROMSTRING, SA_CENTER);
SetDParam(0, ni->params[2]);
SetDParam(1, ni->params[3]);
DrawStringMultiCenter(
((w->width - 101) >> 1) + 98,
90,
STR_705F_STARTS_CONSTRUCTION_NEAR,
w->width - 101);
DrawStringMultiLine(100, w->width - 2, 20, 169, STR_705F_STARTS_CONSTRUCTION_NEAR, SA_CENTER);
break;
default:
@ -220,8 +204,7 @@ struct NewsWindow : Window {
if (!(this->ni->flags & NF_VIEWPORT)) {
CopyInDParam(0, this->ni->params, lengthof(this->ni->params));
DrawStringMultiCenter(215, display_mode == NM_NORMAL ? 76 : 56,
this->ni->string_id, this->width - 4);
DrawStringMultiLine(2, this->width - 2, 20, this->height, this->ni->string_id, SA_CENTER);
} else {
/* Back up transparency options to draw news view */
TransparencyOptionBits to_backup = _transparency_opt;
@ -237,7 +220,7 @@ struct NewsWindow : Window {
);
CopyInDParam(0, this->ni->params, lengthof(this->ni->params));
DrawStringMultiCenter(this->width / 2, 20, this->ni->string_id, this->width - 4);
DrawStringMultiLine(2, this->width - 2, 0, 58, this->ni->string_id, SA_CENTER);
}
break;
}
@ -246,11 +229,11 @@ struct NewsWindow : Window {
this->DrawWidgets();
if (!(this->ni->flags & NF_VIEWPORT)) {
CopyInDParam(0, this->ni->params, lengthof(this->ni->params));
DrawStringMultiCenter(140, 38, this->ni->string_id, 276);
DrawStringMultiLine(2, 278, 38, this->ni->string_id, SA_CENTER);
} else {
this->DrawViewport();
CopyInDParam(0, this->ni->params, lengthof(this->ni->params));
DrawStringMultiCenter(this->width / 2, this->height - 16, this->ni->string_id, this->width - 4);
DrawStringMultiLine(2, this->width - 2, 64, this->height, this->ni->string_id, SA_CENTER);
}
break;
}