Use One-Time Initialization for glyph run caching to avoid duplicate glyph run genera...
[gdipp.git] / gdipp_config / render_config_cache.cpp
blobf49a054c21d93e0123e02579fb626412ff552ecf
1 #include "stdafx.h"
2 #include "render_config_cache.h"
3 #include "gdipp_lib/helper.h"
4 #include "gdipp_lib/scoped_rw_lock.h"
6 namespace gdipp
9 render_config_cache::render_config_cache(const config_file &file)
11 if (file.empty())
12 return;
14 const pugi::xml_document *config_xml_doc = reinterpret_cast<const pugi::xml_document *>(file.get_config_xml());
15 const pugi::xpath_node_set render_font_nodes = config_xml_doc->select_nodes(L"/gdipp/server/render/font");
16 for (pugi::xpath_node_set::const_iterator node_iter = render_font_nodes.begin(); node_iter != render_font_nodes.end(); ++node_iter)
18 const pugi::xml_node curr_node = node_iter->node();
19 const config cfg(&curr_node);
20 const font_config_criteria curr_criteria(&curr_node);
21 render_config_static *curr_rcs = new render_config_static();
22 curr_rcs->parse(cfg);
23 _configs.push_back(std::pair<font_config_criteria, const render_config_static *>(curr_criteria, curr_rcs));
26 _default_config = new render_config_static();
29 render_config_cache::~render_config_cache()
31 delete _default_config;
33 for (std::list<std::pair<font_config_criteria, const render_config_static *>>::const_iterator config_iter = _configs.begin();
34 config_iter != _configs.end();
35 ++config_iter)
36 delete config_iter->second;
39 const render_config_static *render_config_cache::get_font_render_config(bool bold, bool italic, LONG height, const wchar_t *font_name)
41 const uint32_t trait = get_render_config_trait(bold, italic, height, font_name);
42 std::map<uint32_t, const render_config_static *>::const_iterator config_iter = _cache.find(trait);
43 if (config_iter == _cache.end())
45 const scoped_rw_lock lock_w(scoped_rw_lock::CONFIG_RENDER_CACHE, false);
46 config_iter = _cache.find(trait);
47 if (config_iter == _cache.end())
49 const render_config_static *rcs = find_font_render_config(bold, italic, height, font_name);
50 if (rcs == NULL)
51 rcs = _default_config;
52 _cache.insert(std::pair<uint32_t, const render_config_static *>(trait, rcs));
53 return rcs;
57 return config_iter->second;
60 const render_config_static *render_config_cache::find_font_render_config(bool bold, bool italic, LONG height, const wchar_t *font_name) const
62 for (std::list<std::pair<font_config_criteria, const render_config_static *>>::const_iterator config_iter = _configs.begin();
63 config_iter != _configs.end();
64 ++config_iter)
66 if (config_iter->first.is_satisfied(bold, italic, height, font_name))
67 return config_iter->second;
70 return NULL;