mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-08-20 21:19:10 +00:00
Compare commits
6 Commits
79c1492a73
...
b4b2fad8e0
Author | SHA1 | Date | |
---|---|---|---|
b4b2fad8e0 | |||
fce9361bf2 | |||
5cd81a980e | |||
80ddcb9d7d | |||
bbbf2b5282 | |||
|
6bf214af6e |
@@ -17,6 +17,7 @@
|
|||||||
#include "string_func.h"
|
#include "string_func.h"
|
||||||
#include "strings_func.h"
|
#include "strings_func.h"
|
||||||
#include "gfx_func.h"
|
#include "gfx_func.h"
|
||||||
|
#include "gfx_layout.h"
|
||||||
#include "settings_type.h"
|
#include "settings_type.h"
|
||||||
#include "console_func.h"
|
#include "console_func.h"
|
||||||
#include "rev.h"
|
#include "rev.h"
|
||||||
@@ -348,10 +349,10 @@ struct IConsoleWindow : Window
|
|||||||
{
|
{
|
||||||
int delta = std::min<int>(this->width - this->line_offset - _iconsole_cmdline.pixels - ICON_RIGHT_BORDERWIDTH, 0);
|
int delta = std::min<int>(this->width - this->line_offset - _iconsole_cmdline.pixels - ICON_RIGHT_BORDERWIDTH, 0);
|
||||||
|
|
||||||
Point p1 = GetCharPosInString(_iconsole_cmdline.buf, from, FS_NORMAL);
|
const auto p1 = GetCharPosInString(_iconsole_cmdline.buf, from, FS_NORMAL);
|
||||||
Point p2 = from != to ? GetCharPosInString(_iconsole_cmdline.buf, to, FS_NORMAL) : p1;
|
const auto p2 = from != to ? GetCharPosInString(_iconsole_cmdline.buf, to, FS_NORMAL) : p1;
|
||||||
|
|
||||||
Rect r = {this->line_offset + delta + p1.x, this->height - this->line_height, this->line_offset + delta + p2.x, this->height};
|
Rect r = {this->line_offset + delta + p1.left, this->height - this->line_height, this->line_offset + delta + p2.right, this->height};
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -489,7 +489,7 @@ bool TarScanner::AddFile(const std::string &filename, size_t, [[maybe_unused]] c
|
|||||||
|
|
||||||
_tar_list[this->subdir][filename] = std::string{};
|
_tar_list[this->subdir][filename] = std::string{};
|
||||||
|
|
||||||
std::string filename_base = std::filesystem::path(filename).filename().string();
|
std::string filename_base = FS2OTTD(std::filesystem::path(OTTD2FS(filename)).filename());
|
||||||
SimplifyFileName(filename_base);
|
SimplifyFileName(filename_base);
|
||||||
|
|
||||||
TarHeader th;
|
TarHeader th;
|
||||||
|
@@ -386,7 +386,7 @@ void ReconsiderGameScriptLanguage()
|
|||||||
{
|
{
|
||||||
if (_current_data == nullptr) return;
|
if (_current_data == nullptr) return;
|
||||||
|
|
||||||
std::string language = _current_language->file.stem().string();
|
std::string language = FS2OTTD(_current_language->file.stem());
|
||||||
for (auto &p : _current_data->compiled_strings) {
|
for (auto &p : _current_data->compiled_strings) {
|
||||||
if (p.language == language) {
|
if (p.language == language) {
|
||||||
_current_data->cur_language = &p;
|
_current_data->cur_language = &p;
|
||||||
|
39
src/gfx.cpp
39
src/gfx.cpp
@@ -605,9 +605,9 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left,
|
|||||||
/* Not a valid glyph (empty) */
|
/* Not a valid glyph (empty) */
|
||||||
if (glyph == 0xFFFF) continue;
|
if (glyph == 0xFFFF) continue;
|
||||||
|
|
||||||
int begin_x = positions[i].x + left - offset_x;
|
int begin_x = positions[i].left + left - offset_x;
|
||||||
int end_x = positions[i + 1].x + left - offset_x - 1;
|
int end_x = positions[i].right + left - offset_x;
|
||||||
int top = positions[i].y + y;
|
int top = positions[i].top + y;
|
||||||
|
|
||||||
/* Truncated away. */
|
/* Truncated away. */
|
||||||
if (truncation && (begin_x < min_x || end_x > max_x)) continue;
|
if (truncation && (begin_x < min_x || end_x > max_x)) continue;
|
||||||
@@ -895,39 +895,6 @@ Dimension GetStringListBoundingBox(std::span<const StringID> list, FontSize font
|
|||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the leading corner of a character in a single-line string relative
|
|
||||||
* to the start of the string.
|
|
||||||
* @param str String containing the character.
|
|
||||||
* @param ch Pointer to the character in the string.
|
|
||||||
* @param start_fontsize Font size to start the text with.
|
|
||||||
* @return Upper left corner of the glyph associated with the character.
|
|
||||||
*/
|
|
||||||
Point GetCharPosInString(std::string_view str, const char *ch, FontSize start_fontsize)
|
|
||||||
{
|
|
||||||
/* Ensure "ch" is inside "str" or at the exact end. */
|
|
||||||
assert(ch >= str.data() && (ch - str.data()) <= static_cast<ptrdiff_t>(str.size()));
|
|
||||||
auto it_ch = str.begin() + (ch - str.data());
|
|
||||||
|
|
||||||
Layouter layout(str, INT32_MAX, start_fontsize);
|
|
||||||
return layout.GetCharPosition(it_ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the character from a string that is drawn at a specific position.
|
|
||||||
* @param str String to test.
|
|
||||||
* @param x Position relative to the start of the string.
|
|
||||||
* @param start_fontsize Font size to start the text with.
|
|
||||||
* @return Index of the character position or -1 if there is no character at the position.
|
|
||||||
*/
|
|
||||||
ptrdiff_t GetCharAtPosition(std::string_view str, int x, FontSize start_fontsize)
|
|
||||||
{
|
|
||||||
if (x < 0) return -1;
|
|
||||||
|
|
||||||
Layouter layout(str, INT32_MAX, start_fontsize);
|
|
||||||
return layout.GetCharAtPosition(x, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw single character horizontally centered around (x,y)
|
* Draw single character horizontally centered around (x,y)
|
||||||
* @param c Character (glyph) to draw
|
* @param c Character (glyph) to draw
|
||||||
|
@@ -142,8 +142,6 @@ int GetStringLineCount(StringID str, int maxw);
|
|||||||
Dimension GetStringMultiLineBoundingBox(StringID str, const Dimension &suggestion);
|
Dimension GetStringMultiLineBoundingBox(StringID str, const Dimension &suggestion);
|
||||||
Dimension GetStringMultiLineBoundingBox(std::string_view str, const Dimension &suggestion);
|
Dimension GetStringMultiLineBoundingBox(std::string_view str, const Dimension &suggestion);
|
||||||
void LoadStringWidthTable(bool monospace = false);
|
void LoadStringWidthTable(bool monospace = false);
|
||||||
Point GetCharPosInString(std::string_view str, const char *ch, FontSize start_fontsize = FS_NORMAL);
|
|
||||||
ptrdiff_t GetCharAtPosition(std::string_view str, int x, FontSize start_fontsize = FS_NORMAL);
|
|
||||||
|
|
||||||
void DrawDirtyBlocks();
|
void DrawDirtyBlocks();
|
||||||
void AddDirtyBlock(int left, int top, int right, int bottom);
|
void AddDirtyBlock(int left, int top, int right, int bottom);
|
||||||
|
@@ -225,7 +225,7 @@ static bool IsConsumedFormattingCode(char32_t ch)
|
|||||||
* @return Upper left corner of the character relative to the start of the string.
|
* @return Upper left corner of the character relative to the start of the string.
|
||||||
* @note Will only work right for single-line strings.
|
* @note Will only work right for single-line strings.
|
||||||
*/
|
*/
|
||||||
Point Layouter::GetCharPosition(std::string_view::const_iterator ch) const
|
ParagraphLayouter::Position Layouter::GetCharPosition(std::string_view::const_iterator ch) const
|
||||||
{
|
{
|
||||||
const auto &line = this->front();
|
const auto &line = this->front();
|
||||||
|
|
||||||
@@ -245,8 +245,8 @@ Point Layouter::GetCharPosition(std::string_view::const_iterator ch) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Initial position, returned if character not found. */
|
/* Initial position, returned if character not found. */
|
||||||
const Point initial_position = {_current_text_dir == TD_LTR ? 0 : line->GetWidth(), 0};
|
const ParagraphLayouter::Position initial_position = Point{_current_text_dir == TD_LTR ? 0 : line->GetWidth(), 0};
|
||||||
const Point *position = &initial_position;
|
const ParagraphLayouter::Position *position = &initial_position;
|
||||||
|
|
||||||
/* We couldn't find the code point index. */
|
/* We couldn't find the code point index. */
|
||||||
if (str != ch) return *position;
|
if (str != ch) return *position;
|
||||||
@@ -303,8 +303,8 @@ ptrdiff_t Layouter::GetCharAtPosition(int x, size_t line_index) const
|
|||||||
/* Not a valid glyph (empty). */
|
/* Not a valid glyph (empty). */
|
||||||
if (glyphs[i] == 0xFFFF) continue;
|
if (glyphs[i] == 0xFFFF) continue;
|
||||||
|
|
||||||
int begin_x = positions[i].x;
|
int begin_x = positions[i].left;
|
||||||
int end_x = positions[i + 1].x;
|
int end_x = positions[i].right + 1;
|
||||||
|
|
||||||
if (IsInsideMM(x, begin_x, end_x)) {
|
if (IsInsideMM(x, begin_x, end_x)) {
|
||||||
/* Found our glyph, now convert to UTF-8 string index. */
|
/* Found our glyph, now convert to UTF-8 string index. */
|
||||||
@@ -409,3 +409,36 @@ void Layouter::ReduceLineCache()
|
|||||||
if (linecache->size() > 4096) ResetLineCache();
|
if (linecache->size() > 4096) ResetLineCache();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the leading corner of a character in a single-line string relative
|
||||||
|
* to the start of the string.
|
||||||
|
* @param str String containing the character.
|
||||||
|
* @param ch Pointer to the character in the string.
|
||||||
|
* @param start_fontsize Font size to start the text with.
|
||||||
|
* @return Upper left corner of the glyph associated with the character.
|
||||||
|
*/
|
||||||
|
ParagraphLayouter::Position GetCharPosInString(std::string_view str, const char *ch, FontSize start_fontsize)
|
||||||
|
{
|
||||||
|
/* Ensure "ch" is inside "str" or at the exact end. */
|
||||||
|
assert(ch >= str.data() && (ch - str.data()) <= static_cast<ptrdiff_t>(str.size()));
|
||||||
|
auto it_ch = str.begin() + (ch - str.data());
|
||||||
|
|
||||||
|
Layouter layout(str, INT32_MAX, start_fontsize);
|
||||||
|
return layout.GetCharPosition(it_ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the character from a string that is drawn at a specific position.
|
||||||
|
* @param str String to test.
|
||||||
|
* @param x Position relative to the start of the string.
|
||||||
|
* @param start_fontsize Font size to start the text with.
|
||||||
|
* @return Index of the character position or -1 if there is no character at the position.
|
||||||
|
*/
|
||||||
|
ptrdiff_t GetCharAtPosition(std::string_view str, int x, FontSize start_fontsize)
|
||||||
|
{
|
||||||
|
if (x < 0) return -1;
|
||||||
|
|
||||||
|
Layouter layout(str, INT32_MAX, start_fontsize);
|
||||||
|
return layout.GetCharAtPosition(x, 0);
|
||||||
|
}
|
||||||
|
@@ -90,16 +90,29 @@ class ParagraphLayouter {
|
|||||||
public:
|
public:
|
||||||
virtual ~ParagraphLayouter() = default;
|
virtual ~ParagraphLayouter() = default;
|
||||||
|
|
||||||
|
/** Position of a glyph within a VisualRun. */
|
||||||
|
class Position {
|
||||||
|
public:
|
||||||
|
int16_t left; ///< Left-most position of glyph.
|
||||||
|
int16_t right; ///< Right-most position of glyph.
|
||||||
|
int16_t top; ///< Top-most position of glyph.
|
||||||
|
|
||||||
|
constexpr inline Position(int16_t left, int16_t right, int16_t top) : left(left), right(right), top(top) { }
|
||||||
|
|
||||||
|
/** Conversion from a single point to a Position. */
|
||||||
|
constexpr inline Position(const Point &pt) : left(pt.x), right(pt.x), top(pt.y) { }
|
||||||
|
};
|
||||||
|
|
||||||
/** Visual run contains data about the bit of text with the same font. */
|
/** Visual run contains data about the bit of text with the same font. */
|
||||||
class VisualRun {
|
class VisualRun {
|
||||||
public:
|
public:
|
||||||
virtual ~VisualRun() = default;
|
virtual ~VisualRun() = default;
|
||||||
virtual const Font *GetFont() const = 0;
|
virtual const Font *GetFont() const = 0;
|
||||||
virtual int GetGlyphCount() const = 0;
|
virtual int GetGlyphCount() const = 0;
|
||||||
virtual const std::vector<GlyphID> &GetGlyphs() const = 0;
|
virtual std::span<const GlyphID> GetGlyphs() const = 0;
|
||||||
virtual const std::vector<Point> &GetPositions() const = 0;
|
virtual std::span<const Position> GetPositions() const = 0;
|
||||||
virtual int GetLeading() const = 0;
|
virtual int GetLeading() const = 0;
|
||||||
virtual const std::vector<int> &GetGlyphToCharMap() const = 0;
|
virtual std::span<const int> GetGlyphToCharMap() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** A single line worth of VisualRuns. */
|
/** A single line worth of VisualRuns. */
|
||||||
@@ -176,7 +189,7 @@ public:
|
|||||||
|
|
||||||
Layouter(std::string_view str, int maxw = INT32_MAX, FontSize fontsize = FS_NORMAL);
|
Layouter(std::string_view str, int maxw = INT32_MAX, FontSize fontsize = FS_NORMAL);
|
||||||
Dimension GetBounds();
|
Dimension GetBounds();
|
||||||
Point GetCharPosition(std::string_view::const_iterator ch) const;
|
ParagraphLayouter::Position GetCharPosition(std::string_view::const_iterator ch) const;
|
||||||
ptrdiff_t GetCharAtPosition(int x, size_t line_index) const;
|
ptrdiff_t GetCharAtPosition(int x, size_t line_index) const;
|
||||||
|
|
||||||
static void Initialize();
|
static void Initialize();
|
||||||
@@ -185,4 +198,7 @@ public:
|
|||||||
static void ReduceLineCache();
|
static void ReduceLineCache();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ParagraphLayouter::Position GetCharPosInString(std::string_view str, const char *ch, FontSize start_fontsize = FS_NORMAL);
|
||||||
|
ptrdiff_t GetCharAtPosition(std::string_view str, int x, FontSize start_fontsize = FS_NORMAL);
|
||||||
|
|
||||||
#endif /* GFX_LAYOUT_H */
|
#endif /* GFX_LAYOUT_H */
|
||||||
|
@@ -40,7 +40,7 @@ public:
|
|||||||
/** Visual run contains data about the bit of text with the same font. */
|
/** Visual run contains data about the bit of text with the same font. */
|
||||||
class FallbackVisualRun : public ParagraphLayouter::VisualRun {
|
class FallbackVisualRun : public ParagraphLayouter::VisualRun {
|
||||||
std::vector<GlyphID> glyphs; ///< The glyphs we're drawing.
|
std::vector<GlyphID> glyphs; ///< The glyphs we're drawing.
|
||||||
std::vector<Point> positions; ///< The positions of the glyphs.
|
std::vector<Position> positions; ///< The positions of the glyphs.
|
||||||
std::vector<int> glyph_to_char; ///< The char index of the glyphs.
|
std::vector<int> glyph_to_char; ///< The char index of the glyphs.
|
||||||
|
|
||||||
Font *font; ///< The font used to layout these.
|
Font *font; ///< The font used to layout these.
|
||||||
@@ -49,10 +49,10 @@ public:
|
|||||||
FallbackVisualRun(Font *font, const char32_t *chars, int glyph_count, int char_offset, int x);
|
FallbackVisualRun(Font *font, const char32_t *chars, int glyph_count, int char_offset, int x);
|
||||||
const Font *GetFont() const override { return this->font; }
|
const Font *GetFont() const override { return this->font; }
|
||||||
int GetGlyphCount() const override { return static_cast<int>(this->glyphs.size()); }
|
int GetGlyphCount() const override { return static_cast<int>(this->glyphs.size()); }
|
||||||
const std::vector<GlyphID> &GetGlyphs() const override { return this->glyphs; }
|
std::span<const GlyphID> GetGlyphs() const override { return this->glyphs; }
|
||||||
const std::vector<Point> &GetPositions() const override { return this->positions; }
|
std::span<const Position> GetPositions() const override { return this->positions; }
|
||||||
int GetLeading() const override { return this->GetFont()->fc->GetHeight(); }
|
int GetLeading() const override { return this->GetFont()->fc->GetHeight(); }
|
||||||
const std::vector<int> &GetGlyphToCharMap() const override { return this->glyph_to_char; }
|
std::span<const int> GetGlyphToCharMap() const override { return this->glyph_to_char; }
|
||||||
};
|
};
|
||||||
|
|
||||||
/** A single line worth of VisualRuns. */
|
/** A single line worth of VisualRuns. */
|
||||||
@@ -116,25 +116,22 @@ FallbackParagraphLayout::FallbackVisualRun::FallbackVisualRun(Font *font, const
|
|||||||
|
|
||||||
this->glyphs.reserve(char_count);
|
this->glyphs.reserve(char_count);
|
||||||
this->glyph_to_char.reserve(char_count);
|
this->glyph_to_char.reserve(char_count);
|
||||||
|
this->positions.reserve(char_count);
|
||||||
/* Positions contains the location of the begin of each of the glyphs, and the end of the last one. */
|
|
||||||
this->positions.reserve(char_count + 1);
|
|
||||||
|
|
||||||
int advance = x;
|
int advance = x;
|
||||||
for (int i = 0; i < char_count; i++) {
|
for (int i = 0; i < char_count; i++) {
|
||||||
const GlyphID &glyph_id = this->glyphs.emplace_back(font->fc->MapCharToGlyph(chars[i]));
|
const GlyphID &glyph_id = this->glyphs.emplace_back(font->fc->MapCharToGlyph(chars[i]));
|
||||||
|
int x_advance = font->fc->GetGlyphWidth(glyph_id);
|
||||||
if (isbuiltin) {
|
if (isbuiltin) {
|
||||||
this->positions.emplace_back(advance, font->fc->GetAscender()); // Apply sprite font's ascender.
|
this->positions.emplace_back(advance, advance + x_advance - 1, font->fc->GetAscender()); // Apply sprite font's ascender.
|
||||||
} else if (chars[i] >= SCC_SPRITE_START && chars[i] <= SCC_SPRITE_END) {
|
} else if (chars[i] >= SCC_SPRITE_START && chars[i] <= SCC_SPRITE_END) {
|
||||||
this->positions.emplace_back(advance, (font->fc->GetHeight() - ScaleSpriteTrad(FontCache::GetDefaultFontHeight(font->fc->GetSize()))) / 2); // Align sprite font to centre
|
this->positions.emplace_back(advance, advance + x_advance - 1, (font->fc->GetHeight() - ScaleSpriteTrad(FontCache::GetDefaultFontHeight(font->fc->GetSize()))) / 2); // Align sprite font to centre
|
||||||
} else {
|
} else {
|
||||||
this->positions.emplace_back(advance, 0); // No ascender adjustment.
|
this->positions.emplace_back(advance, advance + x_advance - 1, 0); // No ascender adjustment.
|
||||||
}
|
}
|
||||||
advance += font->fc->GetGlyphWidth(glyph_id);
|
advance += x_advance;
|
||||||
this->glyph_to_char.push_back(char_offset + i);
|
this->glyph_to_char.push_back(char_offset + i);
|
||||||
}
|
}
|
||||||
/* End-of-run position. */
|
|
||||||
this->positions.emplace_back(advance, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -165,7 +162,9 @@ int FallbackParagraphLayout::FallbackLine::GetWidth() const
|
|||||||
* the last run gives us the end of the line and thus the width.
|
* the last run gives us the end of the line and thus the width.
|
||||||
*/
|
*/
|
||||||
const auto &run = this->GetVisualRun(this->CountRuns() - 1);
|
const auto &run = this->GetVisualRun(this->CountRuns() - 1);
|
||||||
return run.GetPositions().back().x;
|
const auto &positions = run.GetPositions();
|
||||||
|
if (positions.empty()) return 0;
|
||||||
|
return positions.back().right + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -45,7 +45,7 @@ public:
|
|||||||
std::vector<GlyphID> glyphs; ///< The glyphs of the run. Valid after Shape() is called.
|
std::vector<GlyphID> glyphs; ///< The glyphs of the run. Valid after Shape() is called.
|
||||||
std::vector<int> advance; ///< The advance (width) of the glyphs. Valid after Shape() is called.
|
std::vector<int> advance; ///< The advance (width) of the glyphs. Valid after Shape() is called.
|
||||||
std::vector<int> glyph_to_char; ///< The mapping from glyphs to characters. Valid after Shape() is called.
|
std::vector<int> glyph_to_char; ///< The mapping from glyphs to characters. Valid after Shape() is called.
|
||||||
std::vector<Point> positions; ///< The positions of the glyphs. Valid after Shape() is called.
|
std::vector<ParagraphLayouter::Position> positions; ///< The positions of the glyphs. Valid after Shape() is called.
|
||||||
int total_advance = 0; ///< The total advance of the run. Valid after Shape() is called.
|
int total_advance = 0; ///< The total advance of the run. Valid after Shape() is called.
|
||||||
|
|
||||||
ICURun(int start, int length, UBiDiLevel level, UScriptCode script = USCRIPT_UNKNOWN, Font *font = nullptr) : start(start), length(length), level(level), script(script), font(font) {}
|
ICURun(int start, int length, UBiDiLevel level, UScriptCode script = USCRIPT_UNKNOWN, Font *font = nullptr) : start(start), length(length), level(level), script(script), font(font) {}
|
||||||
@@ -62,7 +62,7 @@ public:
|
|||||||
class ICUVisualRun : public ParagraphLayouter::VisualRun {
|
class ICUVisualRun : public ParagraphLayouter::VisualRun {
|
||||||
private:
|
private:
|
||||||
std::vector<GlyphID> glyphs;
|
std::vector<GlyphID> glyphs;
|
||||||
std::vector<Point> positions;
|
std::vector<Position> positions;
|
||||||
std::vector<int> glyph_to_char;
|
std::vector<int> glyph_to_char;
|
||||||
|
|
||||||
int total_advance;
|
int total_advance;
|
||||||
@@ -71,9 +71,9 @@ public:
|
|||||||
public:
|
public:
|
||||||
ICUVisualRun(const ICURun &run, int x);
|
ICUVisualRun(const ICURun &run, int x);
|
||||||
|
|
||||||
const std::vector<GlyphID> &GetGlyphs() const override { return this->glyphs; }
|
std::span<const GlyphID> GetGlyphs() const override { return this->glyphs; }
|
||||||
const std::vector<Point> &GetPositions() const override { return this->positions; }
|
std::span<const Position> GetPositions() const override { return this->positions; }
|
||||||
const std::vector<int> &GetGlyphToCharMap() const override { return this->glyph_to_char; }
|
std::span<const int> GetGlyphToCharMap() const override { return this->glyph_to_char; }
|
||||||
|
|
||||||
const Font *GetFont() const override { return this->font; }
|
const Font *GetFont() const override { return this->font; }
|
||||||
int GetLeading() const override { return this->font->fc->GetHeight(); }
|
int GetLeading() const override { return this->font->fc->GetHeight(); }
|
||||||
@@ -136,8 +136,8 @@ ICUParagraphLayout::ICUVisualRun::ICUVisualRun(const ICURun &run, int x) :
|
|||||||
this->positions.reserve(run.positions.size());
|
this->positions.reserve(run.positions.size());
|
||||||
|
|
||||||
/* Copy positions, moving x coordinate by x offset. */
|
/* Copy positions, moving x coordinate by x offset. */
|
||||||
for (const Point &pt : run.positions) {
|
for (const auto &pos : run.positions) {
|
||||||
this->positions.emplace_back(pt.x + x, pt.y);
|
this->positions.emplace_back(pos.left + x, pos.right + x, pos.top);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,7 +179,7 @@ void ICURun::Shape(UChar *buff, size_t buff_length)
|
|||||||
/* Reserve space, as we already know the size. */
|
/* Reserve space, as we already know the size. */
|
||||||
this->glyphs.reserve(glyph_count);
|
this->glyphs.reserve(glyph_count);
|
||||||
this->glyph_to_char.reserve(glyph_count);
|
this->glyph_to_char.reserve(glyph_count);
|
||||||
this->positions.reserve(glyph_count + 1);
|
this->positions.reserve(glyph_count);
|
||||||
this->advance.reserve(glyph_count);
|
this->advance.reserve(glyph_count);
|
||||||
|
|
||||||
/* Prepare the glyphs/position. ICUVisualRun will give the position an offset if needed. */
|
/* Prepare the glyphs/position. ICUVisualRun will give the position an offset if needed. */
|
||||||
@@ -189,14 +189,13 @@ void ICURun::Shape(UChar *buff, size_t buff_length)
|
|||||||
|
|
||||||
if (buff[glyph_info[i].cluster] >= SCC_SPRITE_START && buff[glyph_info[i].cluster] <= SCC_SPRITE_END && glyph_info[i].codepoint == 0) {
|
if (buff[glyph_info[i].cluster] >= SCC_SPRITE_START && buff[glyph_info[i].cluster] <= SCC_SPRITE_END && glyph_info[i].codepoint == 0) {
|
||||||
auto glyph = this->font->fc->MapCharToGlyph(buff[glyph_info[i].cluster]);
|
auto glyph = this->font->fc->MapCharToGlyph(buff[glyph_info[i].cluster]);
|
||||||
|
|
||||||
this->glyphs.push_back(glyph);
|
|
||||||
this->positions.emplace_back(advance, (this->font->fc->GetHeight() - ScaleSpriteTrad(FontCache::GetDefaultFontHeight(this->font->fc->GetSize()))) / 2); // Align sprite font to centre
|
|
||||||
x_advance = this->font->fc->GetGlyphWidth(glyph);
|
x_advance = this->font->fc->GetGlyphWidth(glyph);
|
||||||
|
this->glyphs.push_back(glyph);
|
||||||
|
this->positions.emplace_back(advance, advance + x_advance - 1, (this->font->fc->GetHeight() - ScaleSpriteTrad(FontCache::GetDefaultFontHeight(this->font->fc->GetSize()))) / 2); // Align sprite font to centre
|
||||||
} else {
|
} else {
|
||||||
this->glyphs.push_back(glyph_info[i].codepoint);
|
|
||||||
this->positions.emplace_back(glyph_pos[i].x_offset / FONT_SCALE + advance, glyph_pos[i].y_offset / FONT_SCALE);
|
|
||||||
x_advance = glyph_pos[i].x_advance / FONT_SCALE;
|
x_advance = glyph_pos[i].x_advance / FONT_SCALE;
|
||||||
|
this->glyphs.push_back(glyph_info[i].codepoint);
|
||||||
|
this->positions.emplace_back(glyph_pos[i].x_offset / FONT_SCALE + advance, glyph_pos[i].x_offset / FONT_SCALE + advance + x_advance - 1, glyph_pos[i].y_offset / FONT_SCALE);
|
||||||
}
|
}
|
||||||
|
|
||||||
this->glyph_to_char.push_back(glyph_info[i].cluster);
|
this->glyph_to_char.push_back(glyph_info[i].cluster);
|
||||||
@@ -204,9 +203,6 @@ void ICURun::Shape(UChar *buff, size_t buff_length)
|
|||||||
advance += x_advance;
|
advance += x_advance;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End-of-run position. */
|
|
||||||
this->positions.emplace_back(advance, 0);
|
|
||||||
|
|
||||||
/* Track the total advancement we made. */
|
/* Track the total advancement we made. */
|
||||||
this->total_advance = advance;
|
this->total_advance = advance;
|
||||||
|
|
||||||
|
@@ -647,7 +647,7 @@ STR_UNITS_PERIODS :{NUM}{NBSP}okre
|
|||||||
|
|
||||||
# Common window strings
|
# Common window strings
|
||||||
STR_LIST_FILTER_TITLE :{BLACK}Filtr:
|
STR_LIST_FILTER_TITLE :{BLACK}Filtr:
|
||||||
STR_LIST_FILTER_OSKTITLE :{BLACK}Wpisz jedno lub więcej słów kluczowych, aby przefiltrować listę
|
STR_LIST_FILTER_OSKTITLE :{BLACK}Wpisz jedno lub więcej słów, aby przefiltrować listę
|
||||||
STR_LIST_FILTER_TOOLTIP :{BLACK}Wpisz jedno lub więcej słów kluczowych, aby przefiltrować listę
|
STR_LIST_FILTER_TOOLTIP :{BLACK}Wpisz jedno lub więcej słów kluczowych, aby przefiltrować listę
|
||||||
|
|
||||||
STR_TOOLTIP_GROUP_ORDER :{BLACK}Wybierz kolejność grupowania
|
STR_TOOLTIP_GROUP_ORDER :{BLACK}Wybierz kolejność grupowania
|
||||||
@@ -690,7 +690,7 @@ STR_BUTTON_OK :{BLACK}OK
|
|||||||
|
|
||||||
# On screen keyboard window
|
# On screen keyboard window
|
||||||
STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\qwertyuiop[]asdfghjkl;' zxcvbnm,./ .
|
STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\qwertyuiop[]asdfghjkl;' zxcvbnm,./ .
|
||||||
STR_OSK_KEYBOARD_LAYOUT_CAPS :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:" ZXCVBNM<>? .
|
STR_OSK_KEYBOARD_LAYOUT_CAPS :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:" ZXCVBNM<>? .
|
||||||
|
|
||||||
# Measurement tooltip
|
# Measurement tooltip
|
||||||
STR_MEASURE_LENGTH :{BLACK}Długość: {NUM}
|
STR_MEASURE_LENGTH :{BLACK}Długość: {NUM}
|
||||||
@@ -1009,7 +1009,7 @@ STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Pokaż s
|
|||||||
|
|
||||||
# Graph key window
|
# Graph key window
|
||||||
STR_GRAPH_KEY_CAPTION :{WHITE}Legenda do wykresów firm
|
STR_GRAPH_KEY_CAPTION :{WHITE}Legenda do wykresów firm
|
||||||
STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Kliknij tutaj aby wł./wył. wyświetlanie danych firmy na wykresie
|
STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Kliknij tutaj, aby przełączyć wyświetlanie wykresu firmy
|
||||||
|
|
||||||
# Company league window
|
# Company league window
|
||||||
STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Ranking firm
|
STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Ranking firm
|
||||||
@@ -3120,7 +3120,7 @@ STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG}
|
|||||||
STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Średni czas podróży: {UNITS_DAYS_OR_SECONDS}
|
STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Średni czas podróży: {UNITS_DAYS_OR_SECONDS}
|
||||||
|
|
||||||
# Base for station construction window(s)
|
# Base for station construction window(s)
|
||||||
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Podświetlaj zasięg
|
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Podświetlanie zasięgu
|
||||||
STR_STATION_BUILD_COVERAGE_OFF :{BLACK}Wył.
|
STR_STATION_BUILD_COVERAGE_OFF :{BLACK}Wył.
|
||||||
STR_STATION_BUILD_COVERAGE_ON :{BLACK}Wł.
|
STR_STATION_BUILD_COVERAGE_ON :{BLACK}Wł.
|
||||||
STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Nie podświetlaj zasięgu projektowanej stacji
|
STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Nie podświetlaj zasięgu projektowanej stacji
|
||||||
@@ -3173,8 +3173,8 @@ STR_WAYPOINT_CAPTION :{WHITE}Posterun
|
|||||||
STR_STATION_BUILD_RAIL_CAPTION :{WHITE}Wybór stacji
|
STR_STATION_BUILD_RAIL_CAPTION :{WHITE}Wybór stacji
|
||||||
STR_STATION_BUILD_ORIENTATION :{BLACK}Ukierunkowanie
|
STR_STATION_BUILD_ORIENTATION :{BLACK}Ukierunkowanie
|
||||||
STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Wybierz ukierunkowanie stacji
|
STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Wybierz ukierunkowanie stacji
|
||||||
STR_STATION_BUILD_NUMBER_OF_TRACKS :{BLACK}Ilość peronów
|
STR_STATION_BUILD_NUMBER_OF_TRACKS :{BLACK}Liczba peronów
|
||||||
STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP :{BLACK}Wybierz ilość peronów na stacji
|
STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP :{BLACK}Wybierz liczbę peronów stacji
|
||||||
STR_STATION_BUILD_PLATFORM_LENGTH :{BLACK}Długość peronu
|
STR_STATION_BUILD_PLATFORM_LENGTH :{BLACK}Długość peronu
|
||||||
STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP :{BLACK}Wybierz długość stacji
|
STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP :{BLACK}Wybierz długość stacji
|
||||||
STR_STATION_BUILD_DRAG_DROP :{BLACK}Przeciągnij i upuść
|
STR_STATION_BUILD_DRAG_DROP :{BLACK}Przeciągnij i upuść
|
||||||
@@ -3643,12 +3643,12 @@ STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Zapisz s
|
|||||||
STR_SAVELOAD_LOAD_SCENARIO :{WHITE}Wczytaj scenariusz
|
STR_SAVELOAD_LOAD_SCENARIO :{WHITE}Wczytaj scenariusz
|
||||||
STR_SAVELOAD_LOAD_HEIGHTMAP :{WHITE}Wczytaj mapę wysokości
|
STR_SAVELOAD_LOAD_HEIGHTMAP :{WHITE}Wczytaj mapę wysokości
|
||||||
STR_SAVELOAD_SAVE_HEIGHTMAP :{WHITE}Zapisz mapę wysokości
|
STR_SAVELOAD_SAVE_HEIGHTMAP :{WHITE}Zapisz mapę wysokości
|
||||||
STR_SAVELOAD_HOME_BUTTON :{BLACK}Kliknij tutaj aby przejść do domyślnego katalogu
|
STR_SAVELOAD_HOME_BUTTON :{BLACK}Kliknij tutaj, aby przejść do domyślnego katalogu zapisów
|
||||||
STR_SAVELOAD_BYTES_FREE :{BLACK}{BYTES} wolnego miejsca
|
STR_SAVELOAD_BYTES_FREE :{BLACK}{BYTES} wolnego miejsca
|
||||||
STR_SAVELOAD_LIST_TOOLTIP :{BLACK}Lista napędów, katalogów i zapisanych gier
|
STR_SAVELOAD_LIST_TOOLTIP :{BLACK}Lista napędów, katalogów i zapisanych gier
|
||||||
STR_SAVELOAD_EDITBOX_TOOLTIP :{BLACK}Obecnie zaznaczona nazwa dla zapisanej gry
|
STR_SAVELOAD_EDITBOX_TOOLTIP :{BLACK}Obecnie wybrana nazwa dla zapisywanej gry
|
||||||
STR_SAVELOAD_DELETE_BUTTON :{BLACK}Usuń
|
STR_SAVELOAD_DELETE_BUTTON :{BLACK}Usuń
|
||||||
STR_SAVELOAD_DELETE_TOOLTIP :{BLACK}Skasuj zaznaczoną zapisaną grę
|
STR_SAVELOAD_DELETE_TOOLTIP :{BLACK}Usuń zaznaczony zapis gry
|
||||||
STR_SAVELOAD_SAVE_BUTTON :{BLACK}Zapisz
|
STR_SAVELOAD_SAVE_BUTTON :{BLACK}Zapisz
|
||||||
STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Zapisz bieżącą grę używając wybranej nazwy
|
STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Zapisz bieżącą grę używając wybranej nazwy
|
||||||
STR_SAVELOAD_LOAD_BUTTON :{BLACK}Wczytaj
|
STR_SAVELOAD_LOAD_BUTTON :{BLACK}Wczytaj
|
||||||
@@ -3664,7 +3664,7 @@ STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Czy na
|
|||||||
STR_SAVELOAD_DIRECTORY :{STRING} (folder)
|
STR_SAVELOAD_DIRECTORY :{STRING} (folder)
|
||||||
STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (folder nadrzędny)
|
STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (folder nadrzędny)
|
||||||
|
|
||||||
STR_SAVELOAD_OSKTITLE :{BLACK}Wprowadź nazwę pod jaką zapisać grę
|
STR_SAVELOAD_OSKTITLE :{BLACK}Wprowadź nazwę dla zapisywanej gry
|
||||||
|
|
||||||
# World generation
|
# World generation
|
||||||
STR_MAPGEN_WORLD_GENERATION_CAPTION :{WHITE}Tworzenie świata
|
STR_MAPGEN_WORLD_GENERATION_CAPTION :{WHITE}Tworzenie świata
|
||||||
@@ -4627,9 +4627,9 @@ STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TOOLTIP :{BLACK}Pokaż l
|
|||||||
|
|
||||||
###length VEHICLE_TYPES
|
###length VEHICLE_TYPES
|
||||||
STR_DEPOT_MASS_STOP_DEPOT_TRAIN_TOOLTIP :{BLACK}Kliknij, aby zatrzymać wszystkie pociągi w hali warsztatów
|
STR_DEPOT_MASS_STOP_DEPOT_TRAIN_TOOLTIP :{BLACK}Kliknij, aby zatrzymać wszystkie pociągi w hali warsztatów
|
||||||
STR_DEPOT_MASS_STOP_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Kliknij aby zatrzymać wszystkie pojazdy w zajezdni
|
STR_DEPOT_MASS_STOP_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Kliknij, aby zatrzymać wszystkie pojazdy w zajezdni
|
||||||
STR_DEPOT_MASS_STOP_DEPOT_SHIP_TOOLTIP :{BLACK}Kliknij aby zatrzymać wszystkie statki w stoczni
|
STR_DEPOT_MASS_STOP_DEPOT_SHIP_TOOLTIP :{BLACK}Kliknij, aby zatrzymać wszystkie statki w stoczni
|
||||||
STR_DEPOT_MASS_STOP_HANGAR_TOOLTIP :{BLACK}Kliknij aby zatrzymać wszystkie samoloty w hangarze
|
STR_DEPOT_MASS_STOP_HANGAR_TOOLTIP :{BLACK}Kliknij, aby zatrzymać wszystkie samoloty w hangarze
|
||||||
|
|
||||||
###length VEHICLE_TYPES
|
###length VEHICLE_TYPES
|
||||||
STR_DEPOT_MASS_START_DEPOT_TRAIN_TOOLTIP :{BLACK}Kliknij, aby uruchomić wszystkie pociągi z warsztatów
|
STR_DEPOT_MASS_START_DEPOT_TRAIN_TOOLTIP :{BLACK}Kliknij, aby uruchomić wszystkie pociągi z warsztatów
|
||||||
|
@@ -310,8 +310,8 @@ STR_BUTTON_CANCEL :{BLACK}Thôi
|
|||||||
STR_BUTTON_OK :{BLACK}Đồng ý
|
STR_BUTTON_OK :{BLACK}Đồng ý
|
||||||
|
|
||||||
# On screen keyboard window
|
# On screen keyboard window
|
||||||
STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\qwertyuiop[]asdfghjkl;' zxcvbnm,./ .
|
STR_OSK_KEYBOARD_LAYOUT :`1234567890-= qwertyuiop[]asdfghjkl;'#\zxcvbnm,./ .
|
||||||
STR_OSK_KEYBOARD_LAYOUT_CAPS :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:" ZXCVBNM<>? .
|
STR_OSK_KEYBOARD_LAYOUT_CAPS :¬!"£$%^&*()_+ QWERTYUIOP{{}}ASDFGHJKL:@~|ZXCVBNM<>? .
|
||||||
|
|
||||||
# Measurement tooltip
|
# Measurement tooltip
|
||||||
STR_MEASURE_LENGTH :{BLACK}Chiều dài: {NUM}
|
STR_MEASURE_LENGTH :{BLACK}Chiều dài: {NUM}
|
||||||
@@ -1498,7 +1498,7 @@ STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Lịch
|
|||||||
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Đồng hồ tính giờ
|
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Đồng hồ tính giờ
|
||||||
|
|
||||||
STR_CONFIG_SETTING_MINUTES_PER_YEAR :Số phút tính cho mỗi năm: {STRING}
|
STR_CONFIG_SETTING_MINUTES_PER_YEAR :Số phút tính cho mỗi năm: {STRING}
|
||||||
STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Chọn số phút trong mỗi lịch năm. Mặc định là 12 phút/năm. Đặt bằng 0 để ngưng lịch thời gian. Tuỳ chọn này sẽ không ảnh hưởng đến việc giả lập kinh tế trong trò chơi, và nó chỉ sẵn có khi sử dụng đồng hồ giữ nhịp
|
STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Chọn số phút tương ứng với một năm trong trò chơi. Mặc định là 12 phút. Đặt bằng 0 để ngưng đọng thời gian. Tăng giá trị này có thể làm chậm việc ra mắt những mẫu phương tiện, nhà cửa, và những cơ sở hạ tầng khác. Giá trị này không làm ảnh hưởng tới tốc độ của phương tiện hoặc nền kinh tế trong trò chơi, ngoại trừ lạm phát. Thiết lập này chỉ được dùng khi sử dụng đồng hồ tính giờ
|
||||||
|
|
||||||
STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
|
STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
|
||||||
###setting-zero-is-special
|
###setting-zero-is-special
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
#include "landscape.h"
|
#include "landscape.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "gui.h"
|
#include "gui.h"
|
||||||
|
#include "gfx_layout.h"
|
||||||
#include "command_func.h"
|
#include "command_func.h"
|
||||||
#include "company_func.h"
|
#include "company_func.h"
|
||||||
#include "town.h"
|
#include "town.h"
|
||||||
@@ -901,10 +902,10 @@ Rect QueryString::GetBoundingRect(const Window *w, WidgetID wid, const char *fro
|
|||||||
r = ScrollEditBoxTextRect(r, *tb);
|
r = ScrollEditBoxTextRect(r, *tb);
|
||||||
|
|
||||||
/* Get location of first and last character. */
|
/* Get location of first and last character. */
|
||||||
Point p1 = GetCharPosInString(tb->buf, from, FS_NORMAL);
|
const auto p1 = GetCharPosInString(tb->buf, from, FS_NORMAL);
|
||||||
Point p2 = from != to ? GetCharPosInString(tb->buf, to, FS_NORMAL) : p1;
|
const auto p2 = from != to ? GetCharPosInString(tb->buf, to, FS_NORMAL) : p1;
|
||||||
|
|
||||||
return { Clamp(r.left + p1.x, r.left, r.right), r.top, Clamp(r.left + p2.x, r.left, r.right), r.bottom };
|
return { Clamp(r.left + p1.left, r.left, r.right), r.top, Clamp(r.left + p2.right, r.left, r.right), r.bottom };
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -578,7 +578,7 @@ int openttd_main(std::span<char * const> arguments)
|
|||||||
if (mgo.opt != nullptr) {
|
if (mgo.opt != nullptr) {
|
||||||
_file_to_saveload.name = mgo.opt;
|
_file_to_saveload.name = mgo.opt;
|
||||||
|
|
||||||
std::string extension = std::filesystem::path(_file_to_saveload.name).extension().string();
|
std::string extension = FS2OTTD(std::filesystem::path(OTTD2FS(_file_to_saveload.name)).extension());
|
||||||
auto [ft, _] = FiosGetSavegameListCallback(SLO_LOAD, _file_to_saveload.name, extension);
|
auto [ft, _] = FiosGetSavegameListCallback(SLO_LOAD, _file_to_saveload.name, extension);
|
||||||
if (ft == FIOS_TYPE_INVALID) {
|
if (ft == FIOS_TYPE_INVALID) {
|
||||||
std::tie(ft, _) = FiosGetScenarioListCallback(SLO_LOAD, _file_to_saveload.name, extension);
|
std::tie(ft, _) = FiosGetScenarioListCallback(SLO_LOAD, _file_to_saveload.name, extension);
|
||||||
@@ -612,7 +612,7 @@ int openttd_main(std::span<char * const> arguments)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string extension = std::filesystem::path(mgo.opt).extension().string();
|
std::string extension = FS2OTTD(std::filesystem::path(OTTD2FS(mgo.opt)).extension());
|
||||||
auto [_, title] = FiosGetSavegameListCallback(SLO_LOAD, mgo.opt, extension);
|
auto [_, title] = FiosGetSavegameListCallback(SLO_LOAD, mgo.opt, extension);
|
||||||
|
|
||||||
_load_check_data.Clear();
|
_load_check_data.Clear();
|
||||||
|
@@ -71,7 +71,7 @@ public:
|
|||||||
class CoreTextVisualRun : public ParagraphLayouter::VisualRun {
|
class CoreTextVisualRun : public ParagraphLayouter::VisualRun {
|
||||||
private:
|
private:
|
||||||
std::vector<GlyphID> glyphs;
|
std::vector<GlyphID> glyphs;
|
||||||
std::vector<Point> positions;
|
std::vector<Position> positions;
|
||||||
std::vector<int> glyph_to_char;
|
std::vector<int> glyph_to_char;
|
||||||
|
|
||||||
int total_advance = 0;
|
int total_advance = 0;
|
||||||
@@ -81,9 +81,9 @@ public:
|
|||||||
CoreTextVisualRun(CTRunRef run, Font *font, const CoreTextParagraphLayoutFactory::CharType *buff);
|
CoreTextVisualRun(CTRunRef run, Font *font, const CoreTextParagraphLayoutFactory::CharType *buff);
|
||||||
CoreTextVisualRun(CoreTextVisualRun &&other) = default;
|
CoreTextVisualRun(CoreTextVisualRun &&other) = default;
|
||||||
|
|
||||||
const std::vector<GlyphID> &GetGlyphs() const override { return this->glyphs; }
|
std::span<const GlyphID> GetGlyphs() const override { return this->glyphs; }
|
||||||
const std::vector<Point> &GetPositions() const override { return this->positions; }
|
std::span<const Position> GetPositions() const override { return this->positions; }
|
||||||
const std::vector<int> &GetGlyphToCharMap() const override { return this->glyph_to_char; }
|
std::span<const int> GetGlyphToCharMap() const override { return this->glyph_to_char; }
|
||||||
|
|
||||||
const Font *GetFont() const override { return this->font; }
|
const Font *GetFont() const override { return this->font; }
|
||||||
int GetLeading() const override { return this->font->fc->GetHeight(); }
|
int GetLeading() const override { return this->font->fc->GetHeight(); }
|
||||||
@@ -241,7 +241,9 @@ CoreTextParagraphLayout::CoreTextVisualRun::CoreTextVisualRun(CTRunRef run, Font
|
|||||||
|
|
||||||
CGPoint pts[this->glyphs.size()];
|
CGPoint pts[this->glyphs.size()];
|
||||||
CTRunGetPositions(run, CFRangeMake(0, 0), pts);
|
CTRunGetPositions(run, CFRangeMake(0, 0), pts);
|
||||||
this->positions.reserve(this->glyphs.size() + 1);
|
CGSize advs[this->glyphs.size()];
|
||||||
|
CTRunGetAdvances(run, CFRangeMake(0, 0), advs);
|
||||||
|
this->positions.reserve(this->glyphs.size());
|
||||||
|
|
||||||
/* Convert glyph array to our data type. At the same time, substitute
|
/* Convert glyph array to our data type. At the same time, substitute
|
||||||
* the proper glyphs for our private sprite glyphs. */
|
* the proper glyphs for our private sprite glyphs. */
|
||||||
@@ -251,15 +253,13 @@ CoreTextParagraphLayout::CoreTextVisualRun::CoreTextVisualRun(CTRunRef run, Font
|
|||||||
if (buff[this->glyph_to_char[i]] >= SCC_SPRITE_START && buff[this->glyph_to_char[i]] <= SCC_SPRITE_END && (gl[i] == 0 || gl[i] == 3)) {
|
if (buff[this->glyph_to_char[i]] >= SCC_SPRITE_START && buff[this->glyph_to_char[i]] <= SCC_SPRITE_END && (gl[i] == 0 || gl[i] == 3)) {
|
||||||
/* A glyph of 0 indidicates not found, while apparently 3 is what char 0xFFFC maps to. */
|
/* A glyph of 0 indidicates not found, while apparently 3 is what char 0xFFFC maps to. */
|
||||||
this->glyphs[i] = font->fc->MapCharToGlyph(buff[this->glyph_to_char[i]]);
|
this->glyphs[i] = font->fc->MapCharToGlyph(buff[this->glyph_to_char[i]]);
|
||||||
this->positions.emplace_back(pts[i].x, (font->fc->GetHeight() - ScaleSpriteTrad(FontCache::GetDefaultFontHeight(font->fc->GetSize()))) / 2); // Align sprite font to centre
|
this->positions.emplace_back(pts[i].x, pts[i].x + advs[i].width - 1, (font->fc->GetHeight() - ScaleSpriteTrad(FontCache::GetDefaultFontHeight(font->fc->GetSize()))) / 2); // Align sprite font to centre
|
||||||
} else {
|
} else {
|
||||||
this->glyphs[i] = gl[i];
|
this->glyphs[i] = gl[i];
|
||||||
this->positions.emplace_back(pts[i].x, pts[i].y);
|
this->positions.emplace_back(pts[i].x, pts[i].x + advs[i].width - 1, pts[i].y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this->total_advance = (int)std::ceil(CTRunGetTypographicBounds(run, CFRangeMake(0, 0), nullptr, nullptr, nullptr));
|
this->total_advance = (int)std::ceil(CTRunGetTypographicBounds(run, CFRangeMake(0, 0), nullptr, nullptr, nullptr));
|
||||||
/* End-of-run position. */
|
|
||||||
this->positions.emplace_back(this->positions.front().x + this->total_advance, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -74,7 +74,7 @@ public:
|
|||||||
class UniscribeVisualRun : public ParagraphLayouter::VisualRun {
|
class UniscribeVisualRun : public ParagraphLayouter::VisualRun {
|
||||||
private:
|
private:
|
||||||
std::vector<GlyphID> glyphs;
|
std::vector<GlyphID> glyphs;
|
||||||
std::vector<Point> positions;
|
std::vector<Position> positions;
|
||||||
std::vector<WORD> char_to_glyph;
|
std::vector<WORD> char_to_glyph;
|
||||||
|
|
||||||
int start_pos;
|
int start_pos;
|
||||||
@@ -88,9 +88,9 @@ public:
|
|||||||
UniscribeVisualRun(const UniscribeRun &range, int x);
|
UniscribeVisualRun(const UniscribeRun &range, int x);
|
||||||
UniscribeVisualRun(UniscribeVisualRun &&other) noexcept;
|
UniscribeVisualRun(UniscribeVisualRun &&other) noexcept;
|
||||||
|
|
||||||
const std::vector<GlyphID> &GetGlyphs() const override { return this->glyphs; }
|
std::span<const GlyphID> GetGlyphs() const override { return this->glyphs; }
|
||||||
const std::vector<Point> &GetPositions() const override { return this->positions; }
|
std::span<const Position> GetPositions() const override { return this->positions; }
|
||||||
const std::vector<int> &GetGlyphToCharMap() const override;
|
std::span<const int> GetGlyphToCharMap() const override;
|
||||||
|
|
||||||
const Font *GetFont() const override { return this->font; }
|
const Font *GetFont() const override { return this->font; }
|
||||||
int GetLeading() const override { return this->font->fc->GetHeight(); }
|
int GetLeading() const override { return this->font->fc->GetHeight(); }
|
||||||
@@ -474,16 +474,15 @@ int UniscribeParagraphLayout::UniscribeLine::GetWidth() const
|
|||||||
UniscribeParagraphLayout::UniscribeVisualRun::UniscribeVisualRun(const UniscribeRun &range, int x) : glyphs(range.ft_glyphs), char_to_glyph(range.char_to_glyph), start_pos(range.pos), total_advance(range.total_advance), font(range.font)
|
UniscribeParagraphLayout::UniscribeVisualRun::UniscribeVisualRun(const UniscribeRun &range, int x) : glyphs(range.ft_glyphs), char_to_glyph(range.char_to_glyph), start_pos(range.pos), total_advance(range.total_advance), font(range.font)
|
||||||
{
|
{
|
||||||
this->num_glyphs = (int)glyphs.size();
|
this->num_glyphs = (int)glyphs.size();
|
||||||
this->positions.reserve(this->num_glyphs + 1);
|
this->positions.reserve(this->num_glyphs);
|
||||||
|
|
||||||
int advance = x;
|
int advance = x;
|
||||||
for (int i = 0; i < this->num_glyphs; i++) {
|
for (int i = 0; i < this->num_glyphs; i++) {
|
||||||
this->positions.emplace_back(range.offsets[i].du + advance, range.offsets[i].dv);
|
int x_advance = range.advances[i];
|
||||||
|
this->positions.emplace_back(range.offsets[i].du + advance - 1, range.offsets[i].du + advance + x_advance, range.offsets[i].dv);
|
||||||
|
|
||||||
advance += range.advances[i];
|
advance += x_advance;
|
||||||
}
|
}
|
||||||
/* End-of-run position. */
|
|
||||||
this->positions.emplace_back(advance, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UniscribeParagraphLayout::UniscribeVisualRun::UniscribeVisualRun(UniscribeVisualRun&& other) noexcept
|
UniscribeParagraphLayout::UniscribeVisualRun::UniscribeVisualRun(UniscribeVisualRun&& other) noexcept
|
||||||
@@ -493,7 +492,7 @@ UniscribeParagraphLayout::UniscribeVisualRun::UniscribeVisualRun(UniscribeVisual
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::vector<int> &UniscribeParagraphLayout::UniscribeVisualRun::GetGlyphToCharMap() const
|
std::span<const int> UniscribeParagraphLayout::UniscribeVisualRun::GetGlyphToCharMap() const
|
||||||
{
|
{
|
||||||
if (this->glyph_to_char.empty()) {
|
if (this->glyph_to_char.empty()) {
|
||||||
this->glyph_to_char.resize(this->GetGlyphCount());
|
this->glyph_to_char.resize(this->GetGlyphCount());
|
||||||
|
@@ -245,7 +245,7 @@ static bool _ValidateSignatureFile(const std::string &filename)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string dirname = std::filesystem::path(filename).parent_path().string();
|
std::string dirname = FS2OTTD(std::filesystem::path(OTTD2FS(filename)).parent_path());
|
||||||
|
|
||||||
for (auto &signature : signatures["files"]) {
|
for (auto &signature : signatures["files"]) {
|
||||||
const std::string sig_filename = dirname + PATHSEPCHAR + signature["filename"].get<std::string>();
|
const std::string sig_filename = dirname + PATHSEPCHAR + signature["filename"].get<std::string>();
|
||||||
|
@@ -1904,7 +1904,7 @@ bool ReadLanguagePack(const LanguageMetadata *lang)
|
|||||||
{
|
{
|
||||||
/* Current language pack */
|
/* Current language pack */
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
std::unique_ptr<LanguagePack, LanguagePackDeleter> lang_pack(reinterpret_cast<LanguagePack *>(ReadFileToMem(lang->file.string(), len, 1U << 20).release()));
|
std::unique_ptr<LanguagePack, LanguagePackDeleter> lang_pack(reinterpret_cast<LanguagePack *>(ReadFileToMem(FS2OTTD(lang->file), len, 1U << 20).release()));
|
||||||
if (!lang_pack) return false;
|
if (!lang_pack) return false;
|
||||||
|
|
||||||
/* End of read data (+ terminating zero added in ReadFileToMem()) */
|
/* End of read data (+ terminating zero added in ReadFileToMem()) */
|
||||||
@@ -1953,7 +1953,7 @@ bool ReadLanguagePack(const LanguageMetadata *lang)
|
|||||||
|
|
||||||
_current_language = lang;
|
_current_language = lang;
|
||||||
_current_text_dir = (TextDirection)_current_language->text_dir;
|
_current_text_dir = (TextDirection)_current_language->text_dir;
|
||||||
_config_language_file = _current_language->file.filename().string();
|
_config_language_file = FS2OTTD(_current_language->file.filename());
|
||||||
SetCurrentGrfLangID(_current_language->newgrflangid);
|
SetCurrentGrfLangID(_current_language->newgrflangid);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@@ -2079,13 +2079,13 @@ static void FillLanguageList(const std::string &path)
|
|||||||
if (dir_entry.path().extension() != ".lng") continue;
|
if (dir_entry.path().extension() != ".lng") continue;
|
||||||
|
|
||||||
LanguageMetadata lmd;
|
LanguageMetadata lmd;
|
||||||
lmd.file = FS2OTTD(dir_entry.path());
|
lmd.file = dir_entry.path();
|
||||||
|
|
||||||
/* Check whether the file is of the correct version */
|
/* Check whether the file is of the correct version */
|
||||||
if (!GetLanguageFileHeader(lmd.file.string(), &lmd)) {
|
if (!GetLanguageFileHeader(FS2OTTD(lmd.file), &lmd)) {
|
||||||
Debug(misc, 3, "{} is not a valid language file", lmd.file);
|
Debug(misc, 3, "{} is not a valid language file", FS2OTTD(lmd.file));
|
||||||
} else if (GetLanguage(lmd.newgrflangid) != nullptr) {
|
} else if (GetLanguage(lmd.newgrflangid) != nullptr) {
|
||||||
Debug(misc, 3, "{}'s language ID is already known", lmd.file);
|
Debug(misc, 3, "{}'s language ID is already known", FS2OTTD(lmd.file));
|
||||||
} else {
|
} else {
|
||||||
_languages.push_back(lmd);
|
_languages.push_back(lmd);
|
||||||
}
|
}
|
||||||
@@ -2119,7 +2119,7 @@ void InitializeLanguagePacks()
|
|||||||
/* We are trying to find a default language. The priority is by
|
/* We are trying to find a default language. The priority is by
|
||||||
* configuration file, local environment and last, if nothing found,
|
* configuration file, local environment and last, if nothing found,
|
||||||
* English. */
|
* English. */
|
||||||
if (_config_language_file == lng.file.filename()) {
|
if (_config_language_file == FS2OTTD(lng.file.filename())) {
|
||||||
chosen_language = &lng;
|
chosen_language = &lng;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2139,7 +2139,7 @@ void InitializeLanguagePacks()
|
|||||||
chosen_language = (language_fallback != nullptr) ? language_fallback : en_GB_fallback;
|
chosen_language = (language_fallback != nullptr) ? language_fallback : en_GB_fallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ReadLanguagePack(chosen_language)) UserError("Can't read language pack '{}'", chosen_language->file);
|
if (!ReadLanguagePack(chosen_language)) UserError("Can't read language pack '{}'", FS2OTTD(chosen_language->file));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -258,7 +258,7 @@ void SurveyConfiguration(nlohmann::json &survey)
|
|||||||
{
|
{
|
||||||
survey["network"] = _networking ? (_network_server ? "server" : "client") : "no";
|
survey["network"] = _networking ? (_network_server ? "server" : "client") : "no";
|
||||||
if (_current_language != nullptr) {
|
if (_current_language != nullptr) {
|
||||||
survey["language"]["filename"] = _current_language->file.filename().string();
|
survey["language"]["filename"] = FS2OTTD(_current_language->file.filename());
|
||||||
survey["language"]["name"] = _current_language->name;
|
survey["language"]["name"] = _current_language->name;
|
||||||
survey["language"]["isocode"] = _current_language->isocode;
|
survey["language"]["isocode"] = _current_language->isocode;
|
||||||
}
|
}
|
||||||
|
@@ -14,6 +14,7 @@
|
|||||||
#include "strings_func.h"
|
#include "strings_func.h"
|
||||||
#include "gfx_type.h"
|
#include "gfx_type.h"
|
||||||
#include "gfx_func.h"
|
#include "gfx_func.h"
|
||||||
|
#include "gfx_layout.h"
|
||||||
#include "window_func.h"
|
#include "window_func.h"
|
||||||
#include "core/alloc_func.hpp"
|
#include "core/alloc_func.hpp"
|
||||||
|
|
||||||
@@ -308,15 +309,18 @@ void Textbuf::UpdateWidth()
|
|||||||
/** Update pixel position of the caret. */
|
/** Update pixel position of the caret. */
|
||||||
void Textbuf::UpdateCaretPosition()
|
void Textbuf::UpdateCaretPosition()
|
||||||
{
|
{
|
||||||
this->caretxoffs = this->chars > 1 ? GetCharPosInString(this->buf, this->buf + this->caretpos, FS_NORMAL).x : 0;
|
const auto pos = GetCharPosInString(this->buf, this->buf + this->caretpos, FS_NORMAL);
|
||||||
|
this->caretxoffs = _current_text_dir == TD_LTR ? pos.left : pos.right;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Update pixel positions of the marked text area. */
|
/** Update pixel positions of the marked text area. */
|
||||||
void Textbuf::UpdateMarkedText()
|
void Textbuf::UpdateMarkedText()
|
||||||
{
|
{
|
||||||
if (this->markend != 0) {
|
if (this->markend != 0) {
|
||||||
this->markxoffs = GetCharPosInString(this->buf, this->buf + this->markpos, FS_NORMAL).x;
|
const auto pos = GetCharPosInString(this->buf, this->buf + this->markpos, FS_NORMAL);
|
||||||
this->marklength = GetCharPosInString(this->buf, this->buf + this->markend, FS_NORMAL).x - this->markxoffs;
|
const auto end = GetCharPosInString(this->buf, this->buf + this->markend, FS_NORMAL);
|
||||||
|
this->markxoffs = std::min(pos.left, end.left);
|
||||||
|
this->marklength = std::max(pos.right, end.right) - this->markxoffs;
|
||||||
} else {
|
} else {
|
||||||
this->markxoffs = this->marklength = 0;
|
this->markxoffs = this->marklength = 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user