diff --git a/benchmark/test_font_registration.cpp b/benchmark/test_font_registration.cpp new file mode 100644 index 000000000..2c57ac328 --- /dev/null +++ b/benchmark/test_font_registration.cpp @@ -0,0 +1,26 @@ +#include "bench_framework.hpp" +#include +#include +#include + +class test : public benchmark::test_case +{ +public: + test(mapnik::parameters const& params) + : test_case(params) {} + bool validate() const + { + return mapnik::freetype_engine::register_fonts("./fonts", true); + } + void operator()() const + { + unsigned long count = 0; + for (unsigned i=0;i(stream->descriptor.pointer); + file->seekg(offset, std::ios::beg); + file->read((char*)buffer, count); + return file->gcount(); +} + +void ft_close_cb(FT_Stream stream) { + std::ifstream * file = static_cast(stream->descriptor.pointer); + file->close(); +} + bool freetype_engine::register_font(std::string const& file_name) { #ifdef MAPNIK_THREADSAFE mutex::scoped_lock lock(mutex_); #endif + + std::ifstream file(file_name.c_str() , std::ios::binary); + if (!file.good()) { + std::ostringstream s; + s << "Unable to open font file '" << file_name << "' "; + throw std::runtime_error(s.str().c_str()); + } + FT_Library library = 0; FT_Error error = FT_Init_FreeType(&library); if (error) @@ -101,6 +122,24 @@ bool freetype_engine::register_font(std::string const& file_name) } FT_Face face = 0; + FT_Open_Args args; + FT_StreamRec streamRec; + memset(&args, 0, sizeof(args)); + memset(&streamRec, 0, sizeof(streamRec)); + std::streampos beg = file.tellg(); + file.seekg (0, std::ios::end); + std::streampos end = file.tellg(); + std::size_t file_size = end - beg; + file.seekg (0, std::ios::beg); + + streamRec.base = 0; + streamRec.pos = 0; + streamRec.size = file_size; + streamRec.descriptor.pointer = &file; + streamRec.read = ft_read_cb; + streamRec.close = ft_close_cb; + args.flags = FT_OPEN_STREAM; + args.stream = &streamRec; int num_faces = 0; bool success = false; // some font files have multiple fonts in a file @@ -108,7 +147,7 @@ bool freetype_engine::register_font(std::string const& file_name) // see the FT_FaceRec in freetype.h for ( int i = 0; face == 0 || i < num_faces; i++ ) { // if face is null then this is the first face - error = FT_New_Face (library,file_name.c_str(),i,&face); + error = FT_Open_Face(library, &args, i, &face); if (error) { break;