diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp index 01be1e0149..b477093743 100644 --- a/src/gfx_layout.cpp +++ b/src/gfx_layout.cpp @@ -22,7 +22,7 @@ /** Cache of ParagraphLayout lines. */ -Layouter::LineCache Layouter::linecache; +Layouter::LineCache *Layouter::linecache; /** Cache of Font instances. */ 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) { + if (linecache == NULL) { + /* Create linecache on first access to avoid trouble with initialisation order of static variables. */ + linecache = new LineCache(); + } + LineCacheKey key; key.state_before = state; 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() { - linecache.clear(); + if (linecache != NULL) linecache->clear(); } /** @@ -569,6 +574,8 @@ void Layouter::ResetLineCache() */ void Layouter::ReduceLineCache() { - /* TODO LRU cache would be fancy, but not exactly necessary */ - if (linecache.size() > 4096) ResetLineCache(); + if (linecache != NULL) { + /* TODO LRU cache would be fancy, but not exactly necessary */ + if (linecache->size() > 4096) ResetLineCache(); + } } diff --git a/src/gfx_layout.h b/src/gfx_layout.h index 1215954cb4..c252d15ebd 100644 --- a/src/gfx_layout.h +++ b/src/gfx_layout.h @@ -198,7 +198,7 @@ class Layouter : public AutoDeleteSmallVector { ~LineCacheItem() { delete layout; } }; typedef std::map LineCache; - static LineCache linecache; + static LineCache *linecache; static LineCacheItem &GetCachedParagraphLayout(const char *str, size_t len, const FontState &state);