2 #include "render_config_cache.h"
3 #include "gdipp_lib/helper.h"
4 #include "gdipp_lib/scoped_rw_lock.h"
9 render_config_cache::render_config_cache(const config_file
&file
)
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();
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();
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
);
51 rcs
= _default_config
;
52 _cache
.insert(std::pair
<uint32_t, const render_config_static
*>(trait
, 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();
66 if (config_iter
->first
.is_satisfied(bold
, italic
, height
, font_name
))
67 return config_iter
->second
;