From 85cd4b67c3bf91c306ef255e097b5e719fbddfb7 Mon Sep 17 00:00:00 2001 From: Hermann Kraus Date: Tue, 10 Aug 2010 12:05:38 +0000 Subject: [PATCH] Get full fontsize information. --- include/mapnik/font_engine_freetype.hpp | 32 ++++++++++++++----------- include/mapnik/placement_finder.hpp | 2 +- src/glyph_symbolizer.cpp | 6 ++--- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/include/mapnik/font_engine_freetype.hpp b/include/mapnik/font_engine_freetype.hpp index 7b2fabb2b..c0f644a12 100644 --- a/include/mapnik/font_engine_freetype.hpp +++ b/include/mapnik/font_engine_freetype.hpp @@ -142,7 +142,12 @@ private: class MAPNIK_DECL font_face_set : private boost::noncopyable { public: - typedef std::pair dimension_t; + class dimension_t { + public: + dimension_t(unsigned width_, int ymax_, int ymin_) : width(width_), height(ymax_-ymin_), ymin(ymin_) {} + unsigned width, height; + int ymin; + }; font_face_set(void) : faces_() {} @@ -194,21 +199,20 @@ public: error = FT_Load_Glyph (face, glyph->get_index(), FT_LOAD_NO_HINTING); if ( error ) - return dimension_t(0, 0); + return dimension_t(0, 0, 0); error = FT_Get_Glyph(face->glyph, &image); if ( error ) - return dimension_t(0, 0); + return dimension_t(0, 0, 0); FT_Glyph_Get_CBox(image, ft_glyph_bbox_pixels, &glyph_bbox); FT_Done_Glyph(image); unsigned tempx = face->glyph->advance.x >> 6; - unsigned tempy = glyph_bbox.yMax - glyph_bbox.yMin; //std::clog << "glyph: " << glyph_index << " x: " << tempx << " y: " << tempy << std::endl; - return dimension_t(tempx, tempy); + return dimension_t(tempx, glyph_bbox.yMax, glyph_bbox.yMin); } void get_string_info(string_info & info) @@ -237,9 +241,9 @@ public: do { UChar ch = text[logicalStart++]; dimension_t char_dim = character_dimensions(ch); - info.add_info(ch, char_dim.first, char_dim.second); - width += char_dim.first; - height = char_dim.second > height ? char_dim.second : height; + info.add_info(ch, char_dim.width, char_dim.height); + width += char_dim.width; + height = char_dim.height > height ? char_dim.height : height; } while (--length > 0); } @@ -271,9 +275,9 @@ public: for (int j=0;j height ? char_dim.second : height; + info.add_info(shaped[j], char_dim.width, char_dim.height); + width += char_dim.width; + height = char_dim.height > height ? char_dim.height : height; } } } else { @@ -281,9 +285,9 @@ public: for (int j=0;j height ? char_dim.second : height; + info.add_info(arabic[j], char_dim.width, char_dim.height); + width += char_dim.width; + height = char_dim.height > height ? char_dim.height : height; } } } diff --git a/include/mapnik/placement_finder.hpp b/include/mapnik/placement_finder.hpp index a4d70f9df..88df08ab1 100644 --- a/include/mapnik/placement_finder.hpp +++ b/include/mapnik/placement_finder.hpp @@ -47,7 +47,7 @@ struct placement : boost::noncopyable ~placement(); - string_info & info; + string_info & info; // should only be used for finding placement. doesn't necessarily match placements.vertex() values position displacement_; label_placement_e label_placement; diff --git a/src/glyph_symbolizer.cpp b/src/glyph_symbolizer.cpp index 33452006d..c93cb755b 100644 --- a/src/glyph_symbolizer.cpp +++ b/src/glyph_symbolizer.cpp @@ -31,9 +31,9 @@ text_path_ptr glyph_symbolizer::get_text_path(face_set_ptr const& faces, } character_info ci = info.at(0); - std::pair cdim = faces->character_dimensions(ci.character); - double cwidth = static_cast(cdim.first)/2.0; - double cheight = static_cast(cdim.second)/2.0; + font_face_set::dimension_t cdim = faces->character_dimensions(ci.character); + double cwidth = static_cast(cdim.width)/2.0; + double cheight = static_cast(cdim.height)/2.0; double xoff = cwidth*cos(angle) - cheight*sin(angle); double yoff = cwidth*sin(angle) + cheight*cos(angle);