diff --git a/benchmark/test_face_ptr_creation.cpp b/benchmark/test_face_ptr_creation.cpp index ec6dff823..9e3aa9567 100644 --- a/benchmark/test_face_ptr_creation.cpp +++ b/benchmark/test_face_ptr_creation.cpp @@ -11,12 +11,17 @@ public: { std::size_t count = 0; std::size_t expected_count = mapnik::freetype_engine::face_names().size(); - mapnik::freetype_engine engine; mapnik::freetype_engine::font_file_mapping_type font_file_mapping; mapnik::freetype_engine::font_memory_cache_type font_cache; + mapnik::font_library library; for (std::string const& name : mapnik::freetype_engine::face_names()) { - mapnik::face_ptr f = engine.create_face(name,engine.get_library(),font_file_mapping,font_cache); + mapnik::face_ptr f = mapnik::freetype_engine::create_face(name, + library, + font_file_mapping, + font_cache, + mapnik::freetype_engine::get_mapping(), + mapnik::freetype_engine::get_cache()); if (f) ++count; } return count == expected_count; @@ -27,12 +32,17 @@ public: for (unsigned i=0;i const& engine, face_ptr const& face); + cairo_face(std::shared_ptr const& library, face_ptr const& face); ~cairo_face(); cairo_font_face_t * face() const; private: class handle { public: - handle(std::shared_ptr const& engine, face_ptr const& face) - : engine_(engine), face_(face) {} + handle(std::shared_ptr const& library, face_ptr const& face) + : library_(library), face_(face) {} private: - std::shared_ptr engine_; + std::shared_ptr library_; face_ptr face_; }; @@ -109,12 +109,12 @@ using cairo_face_ptr = std::shared_ptr; class cairo_face_manager : private mapnik::noncopyable { public: - cairo_face_manager(std::shared_ptr engine); + cairo_face_manager(std::shared_ptr library); cairo_face_ptr get_face(face_ptr face); private: using cairo_face_cache = std::map; - std::shared_ptr font_engine_; + std::shared_ptr font_library_; cairo_face_cache cache_; }; diff --git a/include/mapnik/font_engine_freetype.hpp b/include/mapnik/font_engine_freetype.hpp index dd1b603bc..301babb97 100644 --- a/include/mapnik/font_engine_freetype.hpp +++ b/include/mapnik/font_engine_freetype.hpp @@ -70,13 +70,13 @@ public: static bool register_fonts(std::string const& dir, bool recurse = false); static std::vector face_names(); static font_file_mapping_type const& get_mapping(); + static font_memory_cache_type & get_cache(); static face_ptr create_face(std::string const& family_name, font_library & library, font_file_mapping_type const& font_file_mapping, - freetype_engine::font_memory_cache_type const& font_cache); - stroker_ptr create_stroker(); - virtual ~freetype_engine(); - freetype_engine(); + freetype_engine::font_memory_cache_type const& font_cache, + font_file_mapping_type const& global_font_file_mapping, + freetype_engine::font_memory_cache_type & global_memory_fonts); static bool register_font_impl(std::string const& file_name, font_library & libary, font_file_mapping_type & font_file_mapping); @@ -84,14 +84,11 @@ public: font_library & libary, font_file_mapping_type & font_file_mapping, bool recurse = false); - font_library & get_library() - { - return library_; - } + virtual ~freetype_engine(); + freetype_engine(); private: static bool register_font_impl(std::string const& file_name, FT_LibraryRec_ * library); static bool register_fonts_impl(std::string const& dir, FT_LibraryRec_ * library, bool recurse = false); - font_library library_; #ifdef MAPNIK_THREADSAFE static std::mutex mutex_; #endif @@ -104,28 +101,20 @@ class MAPNIK_DECL face_manager : private mapnik::noncopyable using face_ptr_cache_type = std::map; public: - face_manager(freetype_engine & engine, + face_manager(font_library & library, freetype_engine::font_file_mapping_type const& font_file_mapping, - freetype_engine::font_memory_cache_type const& font_cache) - : engine_(engine), - stroker_(engine_.create_stroker()), - face_ptr_cache_(), - library_(engine_.get_library()), - font_file_mapping_(font_file_mapping), - font_memory_cache_(font_cache) {} - + freetype_engine::font_memory_cache_type const& font_cache); face_ptr get_face(std::string const& name); face_set_ptr get_face_set(std::string const& name); face_set_ptr get_face_set(font_set const& fset); face_set_ptr get_face_set(std::string const& name, boost::optional fset); inline stroker_ptr get_stroker() { return stroker_; } private: - freetype_engine & engine_; - stroker_ptr stroker_; face_ptr_cache_type face_ptr_cache_; font_library & library_; freetype_engine::font_file_mapping_type const& font_file_mapping_; freetype_engine::font_memory_cache_type const& font_memory_cache_; + stroker_ptr stroker_; }; using face_manager_freetype = face_manager; diff --git a/include/mapnik/renderer_common.hpp b/include/mapnik/renderer_common.hpp index c080b768c..45b70f8a7 100644 --- a/include/mapnik/renderer_common.hpp +++ b/include/mapnik/renderer_common.hpp @@ -55,8 +55,8 @@ struct renderer_common : private mapnik::noncopyable double scale_factor_; attributes vars_; // TODO: dirty hack for cairo renderer, figure out how to remove this - std::shared_ptr shared_font_engine_; - freetype_engine & font_engine_; + std::shared_ptr shared_font_library_; + font_library & font_library_; face_manager_freetype font_manager_; box2d query_extent_; view_transform t_; diff --git a/include/mapnik/renderer_common/process_group_symbolizer.hpp b/include/mapnik/renderer_common/process_group_symbolizer.hpp index 8dd044b4c..774296f13 100644 --- a/include/mapnik/renderer_common/process_group_symbolizer.hpp +++ b/include/mapnik/renderer_common/process_group_symbolizer.hpp @@ -57,8 +57,8 @@ struct virtual_renderer_common : private mapnik::noncopyable height_(common.height_), scale_factor_(common.scale_factor_), vars_(common.vars_), - shared_font_engine_(common.shared_font_engine_), - font_engine_(*shared_font_engine_), + shared_font_library_(common.shared_font_library_), + font_library_(*shared_font_library_), font_manager_(common.font_manager_), query_extent_(common.query_extent_), t_(common.t_), @@ -69,8 +69,8 @@ struct virtual_renderer_common : private mapnik::noncopyable double & scale_factor_; attributes & vars_; // TODO: dirty hack for cairo renderer, figure out how to remove this - std::shared_ptr & shared_font_engine_; - freetype_engine & font_engine_; + std::shared_ptr & shared_font_library_; + font_library & font_library_; face_manager_freetype & font_manager_; box2d & query_extent_; view_transform & t_; diff --git a/src/cairo/cairo_context.cpp b/src/cairo/cairo_context.cpp index 681e74358..9e570785c 100644 --- a/src/cairo/cairo_context.cpp +++ b/src/cairo/cairo_context.cpp @@ -32,12 +32,12 @@ #include namespace mapnik { -cairo_face::cairo_face(std::shared_ptr const& engine, face_ptr const& face) +cairo_face::cairo_face(std::shared_ptr const& library, face_ptr const& face) : face_(face) { static cairo_user_data_key_t key; c_face_ = cairo_ft_font_face_create_for_ft_face(face->get_face(), FT_LOAD_NO_HINTING); - cairo_font_face_set_user_data(c_face_, &key, new handle(engine, face), destroy); + cairo_font_face_set_user_data(c_face_, &key, new handle(library, face), destroy); } cairo_face::~cairo_face() @@ -508,8 +508,8 @@ void cairo_context::add_text(glyph_positions_ptr path, } -cairo_face_manager::cairo_face_manager(std::shared_ptr font_engine) - : font_engine_(font_engine) +cairo_face_manager::cairo_face_manager(std::shared_ptr font_library) + : font_library_(font_library) { } @@ -524,7 +524,7 @@ cairo_face_ptr cairo_face_manager::get_face(face_ptr face) } else { - entry = std::make_shared(font_engine_, face); + entry = std::make_shared(font_library_, face); cache_.emplace(face, entry); } return entry; diff --git a/src/cairo/cairo_renderer.cpp b/src/cairo/cairo_renderer.cpp index 57b80d252..088c314c8 100644 --- a/src/cairo/cairo_renderer.cpp +++ b/src/cairo/cairo_renderer.cpp @@ -58,7 +58,7 @@ cairo_renderer::cairo_renderer(Map const& m, m_(m), context_(cairo), common_(m, attributes(), offset_x, offset_y, m.width(), m.height(), scale_factor), - face_manager_(common_.shared_font_engine_) + face_manager_(common_.shared_font_library_) { setup(m); } @@ -75,7 +75,7 @@ cairo_renderer::cairo_renderer(Map const& m, m_(m), context_(cairo), common_(m, req, vars, offset_x, offset_y, req.width(), req.height(), scale_factor), - face_manager_(common_.shared_font_engine_) + face_manager_(common_.shared_font_library_) { setup(m); } @@ -91,7 +91,7 @@ cairo_renderer::cairo_renderer(Map const& m, m_(m), context_(cairo), common_(m, attributes(), offset_x, offset_y, m.width(), m.height(), scale_factor, detector), - face_manager_(common_.shared_font_engine_) + face_manager_(common_.shared_font_library_) { setup(m); } diff --git a/src/font_engine_freetype.cpp b/src/font_engine_freetype.cpp index 09d9e3079..a9b93871b 100644 --- a/src/font_engine_freetype.cpp +++ b/src/font_engine_freetype.cpp @@ -52,9 +52,7 @@ extern "C" namespace mapnik { -freetype_engine::freetype_engine() - : library_() {} - +freetype_engine::freetype_engine() {} freetype_engine::~freetype_engine() {} bool freetype_engine::is_font_file(std::string const& file_name) @@ -256,11 +254,17 @@ freetype_engine::font_file_mapping_type const& freetype_engine::get_mapping() return global_font_file_mapping_; } +freetype_engine::font_memory_cache_type & freetype_engine::get_cache() +{ + return global_memory_fonts_; +} face_ptr freetype_engine::create_face(std::string const& family_name, font_library & library, freetype_engine::font_file_mapping_type const& font_file_mapping, - freetype_engine::font_memory_cache_type const& font_cache) + freetype_engine::font_memory_cache_type const& font_cache, + freetype_engine::font_file_mapping_type const& global_font_file_mapping, + freetype_engine::font_memory_cache_type & global_memory_fonts) { bool found_font_file = false; font_file_mapping_type::const_iterator itr = font_file_mapping.find(family_name); @@ -277,7 +281,6 @@ face_ptr freetype_engine::create_face(std::string const& family_name, static_cast(mem_font_itr->second.second), // size itr->second.first, // face index &face); - if (!error) return std::make_shared(face); } // we don't add to cache here because the map and its font_cache @@ -287,8 +290,8 @@ face_ptr freetype_engine::create_face(std::string const& family_name, else { // otherwise search global registry - itr = global_font_file_mapping_.find(family_name); - if (itr != global_font_file_mapping_.end()) + itr = global_font_file_mapping.find(family_name); + if (itr != global_font_file_mapping.end()) { auto mem_font_itr = global_memory_fonts_.find(itr->second.second); // if font already in memory, use it @@ -300,7 +303,6 @@ face_ptr freetype_engine::create_face(std::string const& family_name, static_cast(mem_font_itr->second.second), // size itr->second.first, // face index &face); - if (!error) return std::make_shared(face); } found_font_file = true; @@ -334,16 +336,22 @@ face_ptr freetype_engine::create_face(std::string const& family_name, return face_ptr(); } -stroker_ptr freetype_engine::create_stroker() -{ - FT_Stroker s; - FT_Error error = FT_Stroker_New(library_.get(), &s); - if (!error) - { - return std::make_shared(s); - } - return stroker_ptr(); -} + +face_manager::face_manager(font_library & library, + freetype_engine::font_file_mapping_type const& font_file_mapping, + freetype_engine::font_memory_cache_type const& font_cache) + : face_ptr_cache_(), + library_(library), + font_file_mapping_(font_file_mapping), + font_memory_cache_(font_cache) + { + FT_Stroker s; + FT_Error error = FT_Stroker_New(library_.get(), &s); + if (!error) + { + stroker_ = std::make_shared(s); + } + } face_ptr face_manager::get_face(std::string const& name) { @@ -354,7 +362,12 @@ face_ptr face_manager::get_face(std::string const& name) } else { - face_ptr face = engine_.create_face(name,library_,font_file_mapping_,font_memory_cache_); + face_ptr face = freetype_engine::create_face(name, + library_, + font_file_mapping_, + font_memory_cache_, + freetype_engine::get_mapping(), + freetype_engine::get_cache()); if (face) { face_ptr_cache_.emplace(name,face); diff --git a/src/load_map.cpp b/src/load_map.cpp index b74013b72..f0c034f22 100644 --- a/src/load_map.cpp +++ b/src/load_map.cpp @@ -87,7 +87,8 @@ public: map_parser(Map & map, bool strict, std::string const& filename = "") : strict_(strict), filename_(filename), - font_manager_(font_engine_,map.get_font_file_mapping(),map.get_font_memory_cache()), + font_library_(), + font_manager_(font_library_,map.get_font_file_mapping(),map.get_font_memory_cache()), xml_base_path_() {} @@ -129,7 +130,7 @@ private: bool strict_; std::string filename_; std::map datasource_templates_; - freetype_engine font_engine_; + font_library font_library_; face_manager_freetype font_manager_; std::map file_sources_; std::map fontsets_; diff --git a/src/renderer_common.cpp b/src/renderer_common.cpp index 9811ad1b0..17111bb73 100644 --- a/src/renderer_common.cpp +++ b/src/renderer_common.cpp @@ -36,9 +36,9 @@ renderer_common::renderer_common(Map const& map, unsigned width, unsigned height height_(height), scale_factor_(scale_factor), vars_(vars), - shared_font_engine_(std::make_shared()), - font_engine_(*shared_font_engine_), - font_manager_(font_engine_,map.get_font_file_mapping(),map.get_font_memory_cache()), + shared_font_library_(std::make_shared()), + font_library_(*shared_font_library_), + font_manager_(font_library_,map.get_font_file_mapping(),map.get_font_memory_cache()), query_extent_(), t_(t), detector_(detector)