From 0c0db5c4c7f509ac631dacd9375e007388abcf92 Mon Sep 17 00:00:00 2001 From: frosch Date: Sun, 7 Jul 2013 12:07:06 +0000 Subject: (svn r25574) -Fix (r25570): Trouble with initialisation order of static members of Layouter and FontCache. --- src/gfx_layout.cpp | 17 ++++++++++++----- src/gfx_layout.h | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp index 01be1e014..b47709374 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 1215954cb..c252d15eb 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); -- cgit v1.2.3-54-g00ecf