diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 56a5d63216..b54927dbdc 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -889,7 +889,7 @@ void DrawEngineList(VehicleType type, int l, int r, int y, const GUIEngineList * int count_width = 0; if (show_count) { replace_icon = GetSpriteSize(SPR_GROUP_REPLACE_ACTIVE); - SetDParamMaxDigits(0, 3); + SetDParamMaxDigits(0, 3, FS_SMALL); count_width = GetStringBoundingBox(STR_TINY_BLACK_COMA).width; } diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index b16e40ae21..1fb9b7c51d 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -600,7 +600,7 @@ struct DepotWindow : Window { uint min_height = 0; if (this->type == VEH_TRAIN) { - SetDParamMaxValue(0, 1000); + SetDParamMaxValue(0, 1000, 0, FS_SMALL); SetDParam(1, 1); this->count_width = GetStringBoundingBox(STR_TINY_BLACK_DECIMAL).width + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; } else { diff --git a/src/gfx.cpp b/src/gfx.cpp index 27f0b90224..704e7155b1 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1621,6 +1621,24 @@ byte GetDigitWidth(FontSize size) return width; } +/** + * Determine the broadest digits for guessing the maximum width of a n-digit number. + * @param [out] front Broadest digit, which is not 0. (Use this digit as first digit for numbers with more than one digit.) + * @param [out] next Broadest digit, including 0. (Use this digit for all digits, except the first one; or for numbers with only one digit.) + * @param size Font of the digit + */ +void GetBroadestDigit(uint *front, uint *next, FontSize size) +{ + int width = -1; + for (char c = '9'; c >= '0'; c--) { + int w = GetCharacterWidth(size, c); + if (w > width) { + width = w; + *next = c - '0'; + if (c != '0') *front = c - '0'; + } + } +} void ScreenSizeChanged() { diff --git a/src/gfx_func.h b/src/gfx_func.h index 3cb3aa1b39..65616e618e 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -150,6 +150,7 @@ bool ToggleFullScreen(bool fs); /* gfx.cpp */ byte GetCharacterWidth(FontSize size, uint32 key); byte GetDigitWidth(FontSize size = FS_NORMAL); +void GetBroadestDigit(uint *front, uint *next, FontSize size = FS_NORMAL); /** * Get height of a character for a given font size. diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index ab264f3a9f..31d15b0e3e 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -504,7 +504,7 @@ public: } } else { /* Draw the label under the data point rather than on the grid line. */ - SetDParamMaxValue(0, this->x_values_start + this->num_on_x_axis * this->x_values_increment); + SetDParamMaxValue(0, this->x_values_start + this->num_on_x_axis * this->x_values_increment, 0, FS_SMALL); x_label_width = GetStringBoundingBox(STR_GRAPH_Y_LABEL_NUMBER).width; } diff --git a/src/group_gui.cpp b/src/group_gui.cpp index 3996ddc187..3da10ac776 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -182,7 +182,7 @@ private: } this->tiny_step_height = max(this->tiny_step_height, this->column_size[VGC_PROFIT].height); - SetDParamMaxValue(0, GroupStatistics::Get(this->vli.company, ALL_GROUP, this->vli.vtype).num_vehicle, 3); + SetDParamMaxValue(0, GroupStatistics::Get(this->vli.company, ALL_GROUP, this->vli.vtype).num_vehicle, 3, FS_SMALL); this->column_size[VGC_NUMBER] = GetStringBoundingBox(STR_TINY_COMMA); this->tiny_step_height = max(this->tiny_step_height, this->column_size[VGC_NUMBER].height); diff --git a/src/saveload/station_sl.cpp b/src/saveload/station_sl.cpp index 9feb1f2742..c87314de44 100644 --- a/src/saveload/station_sl.cpp +++ b/src/saveload/station_sl.cpp @@ -226,7 +226,7 @@ static const SaveLoad _old_station_desc[] = { static uint16 _waiting_acceptance; static uint16 _cargo_source; static uint32 _cargo_source_xy; -static uint16 _cargo_days; +static uint8 _cargo_days; static Money _cargo_feeder_share; static const SaveLoad _station_speclist_desc[] = { diff --git a/src/strgen/strgen_base.cpp b/src/strgen/strgen_base.cpp index adb1de0a5f..8539b49b8c 100644 --- a/src/strgen/strgen_base.cpp +++ b/src/strgen/strgen_base.cpp @@ -723,6 +723,7 @@ void StringReader::HandleString(char *str) WChar c; Utf8Decode(&c, tmp); if (c <= 0x001F || // ASCII control character range + c == 0x200B || // Zero width space (c >= 0xE000 && c <= 0xF8FF) || // Private range (c >= 0xFFF0 && c <= 0xFFFF)) { // Specials range strgen_fatal("Unwanted UTF-8 character U+%04X in sequence '%s'", c, s); diff --git a/src/strings.cpp b/src/strings.cpp index 054ebb5ca7..fcc8df60e1 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -96,28 +96,31 @@ void StringParameters::ShiftParameters(uint amount) * @param max_value The biggest value which shall be displayed. * For the result only the number of digits of \a max_value matter. * @param min_count Minimum number of digits independent of \a max. + * @param size Font of the number */ -void SetDParamMaxValue(uint n, uint64 max_value, uint min_count) +void SetDParamMaxValue(uint n, uint64 max_value, uint min_count, FontSize size) { uint num_digits = 1; while (max_value >= 10) { num_digits++; max_value /= 10; } - SetDParamMaxDigits(n, max(min_count, num_digits)); + SetDParamMaxDigits(n, max(min_count, num_digits), size); } /** * Set DParam n to some number that is suitable for string size computations. * @param n Index of the string parameter. * @param count Number of digits which shall be displayable. + * @param size Font of the number */ -void SetDParamMaxDigits(uint n, uint count) +void SetDParamMaxDigits(uint n, uint count, FontSize size) { - static const uint biggest_digit = 8; ///< Digit with the biggest string width. - uint64 val = biggest_digit; + uint front, next; + GetBroadestDigit(&front, &next, size); + uint64 val = count > 1 ? front : next; for (; count > 1; count--) { - val = 10 * val + biggest_digit; + val = 10 * val + next; } SetDParam(n, val); } diff --git a/src/strings_func.h b/src/strings_func.h index f977b3b3cd..dbdbf2842e 100644 --- a/src/strings_func.h +++ b/src/strings_func.h @@ -155,8 +155,8 @@ static inline void SetDParam(uint n, uint64 v) _global_string_params.SetParam(n, v); } -void SetDParamMaxValue(uint n, uint64 max_value, uint min_count = 0); -void SetDParamMaxDigits(uint n, uint count); +void SetDParamMaxValue(uint n, uint64 max_value, uint min_count = 0, FontSize size = FS_NORMAL); +void SetDParamMaxDigits(uint n, uint count, FontSize size = FS_NORMAL); void SetDParamStr(uint n, const char *str); diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index 7fc8da483d..9bfc356e29 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -200,7 +200,7 @@ struct TimetableWindow : Window { { switch (widget) { case WID_VT_ARRIVAL_DEPARTURE_PANEL: - SetDParamMaxValue(0, MAX_YEAR * DAYS_IN_YEAR); + SetDParamMaxValue(0, MAX_YEAR * DAYS_IN_YEAR, 0, FS_SMALL); this->deparr_time_width = GetStringBoundingBox(STR_JUST_DATE_TINY).width; this->deparr_abbr_width = max(GetStringBoundingBox(STR_TIMETABLE_ARRIVAL_ABBREVIATION).width, GetStringBoundingBox(STR_TIMETABLE_DEPARTURE_ABBREVIATION).width); size->width = WD_FRAMERECT_LEFT + this->deparr_abbr_width + 10 + this->deparr_time_width + WD_FRAMERECT_RIGHT; diff --git a/src/video/sdl_v.cpp b/src/video/sdl_v.cpp index a9b909b82e..736e069ce3 100644 --- a/src/video/sdl_v.cpp +++ b/src/video/sdl_v.cpp @@ -340,6 +340,7 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h) SDL_CALL SDL_QuitSubSystem(SDL_INIT_VIDEO); SDL_CALL SDL_InitSubSystem(SDL_INIT_VIDEO); ClaimMousePointer(); + SetupKeyboard(); } } /* Remember if we wanted a hwpalette. We can't reliably query @@ -649,15 +650,19 @@ const char *VideoDriver_SDL::Start(const char * const *parm) DEBUG(driver, 1, "SDL: using driver '%s'", buf); MarkWholeScreenDirty(); - - SDL_CALL SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); - SDL_CALL SDL_EnableUNICODE(1); + SetupKeyboard(); _draw_threaded = GetDriverParam(parm, "no_threads") == NULL && GetDriverParam(parm, "no_thread") == NULL; return NULL; } +void VideoDriver_SDL::SetupKeyboard() +{ + SDL_CALL SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + SDL_CALL SDL_EnableUNICODE(1); +} + void VideoDriver_SDL::Stop() { SdlClose(SDL_INIT_VIDEO); diff --git a/src/video/sdl_v.h b/src/video/sdl_v.h index 6c69d68d85..66f8bf8564 100644 --- a/src/video/sdl_v.h +++ b/src/video/sdl_v.h @@ -37,6 +37,7 @@ public: private: int PollEvent(); bool CreateMainSurface(uint w, uint h); + void SetupKeyboard(); }; /** Factory for the SDL video driver. */