mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r25574) -Fix (r25570): Trouble with initialisation order of static members of Layouter and FontCache.
This commit is contained in:
parent
51f0d11ee3
commit
0c0db5c4c7
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
|
|
||||||
/** Cache of ParagraphLayout lines. */
|
/** Cache of ParagraphLayout lines. */
|
||||||
Layouter::LineCache Layouter::linecache;
|
Layouter::LineCache *Layouter::linecache;
|
||||||
|
|
||||||
/** Cache of Font instances. */
|
/** Cache of Font instances. */
|
||||||
Layouter::FontColourMap Layouter::fonts[FS_END];
|
Layouter::FontColourMap Layouter::fonts[FS_END];
|
||||||
|
@ -550,10 +550,15 @@ void Layouter::ResetFontCache(FontSize size)
|
||||||
*/
|
*/
|
||||||
Layouter::LineCacheItem &Layouter::GetCachedParagraphLayout(const char *str, size_t len, const FontState &state)
|
Layouter::LineCacheItem &Layouter::GetCachedParagraphLayout(const char *str, size_t len, const FontState &state)
|
||||||
{
|
{
|
||||||
|
if (linecache == NULL) {
|
||||||
|
/* Create linecache on first access to avoid trouble with initialisation order of static variables. */
|
||||||
|
linecache = new LineCache();
|
||||||
|
}
|
||||||
|
|
||||||
LineCacheKey key;
|
LineCacheKey key;
|
||||||
key.state_before = state;
|
key.state_before = state;
|
||||||
key.str.assign(str, len);
|
key.str.assign(str, len);
|
||||||
return linecache[key];
|
return (*linecache)[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -561,7 +566,7 @@ Layouter::LineCacheItem &Layouter::GetCachedParagraphLayout(const char *str, siz
|
||||||
*/
|
*/
|
||||||
void Layouter::ResetLineCache()
|
void Layouter::ResetLineCache()
|
||||||
{
|
{
|
||||||
linecache.clear();
|
if (linecache != NULL) linecache->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -569,6 +574,8 @@ void Layouter::ResetLineCache()
|
||||||
*/
|
*/
|
||||||
void Layouter::ReduceLineCache()
|
void Layouter::ReduceLineCache()
|
||||||
{
|
{
|
||||||
/* TODO LRU cache would be fancy, but not exactly necessary */
|
if (linecache != NULL) {
|
||||||
if (linecache.size() > 4096) ResetLineCache();
|
/* TODO LRU cache would be fancy, but not exactly necessary */
|
||||||
|
if (linecache->size() > 4096) ResetLineCache();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -198,7 +198,7 @@ class Layouter : public AutoDeleteSmallVector<ParagraphLayout::Line *, 4> {
|
||||||
~LineCacheItem() { delete layout; }
|
~LineCacheItem() { delete layout; }
|
||||||
};
|
};
|
||||||
typedef std::map<LineCacheKey, LineCacheItem> LineCache;
|
typedef std::map<LineCacheKey, LineCacheItem> LineCache;
|
||||||
static LineCache linecache;
|
static LineCache *linecache;
|
||||||
|
|
||||||
static LineCacheItem &GetCachedParagraphLayout(const char *str, size_t len, const FontState &state);
|
static LineCacheItem &GetCachedParagraphLayout(const char *str, size_t len, const FontState &state);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue