Use shared pointers for text_layout.
This commit is contained in:
parent
aecd6820c2
commit
6e4915ef83
5 changed files with 15 additions and 7 deletions
|
@ -29,7 +29,6 @@
|
|||
#include <mapnik/feature.hpp>
|
||||
#include <mapnik/marker.hpp>
|
||||
#include <mapnik/marker_cache.hpp>
|
||||
#include <mapnik/text/layout.hpp>
|
||||
#include <mapnik/text_path.hpp>
|
||||
|
||||
//boost
|
||||
|
@ -41,6 +40,9 @@ namespace mapnik {
|
|||
typedef boost::ptr_vector<text_path> placements_type;
|
||||
template <typename DetectorT> class placement_finder;
|
||||
|
||||
class text_layout;
|
||||
typedef boost::shared_ptr<text_layout> text_layout_ptr;
|
||||
|
||||
/** Helper object that does all the TextSymbolizer placment finding
|
||||
* work except actually rendering the object. */
|
||||
template <typename FaceManagerT, typename DetectorT>
|
||||
|
@ -83,7 +85,7 @@ protected:
|
|||
box2d<double> dims_;
|
||||
box2d<double> const& query_extent_;
|
||||
//Processing
|
||||
text_layout layout_;
|
||||
text_layout_ptr layout_;
|
||||
/* Using list instead of vector, because we delete random elements and need iterators to stay valid. */
|
||||
/** Remaining geometries to be processed. */
|
||||
std::list<geometry_type*> geometries_to_process_;
|
||||
|
|
|
@ -67,6 +67,8 @@ private:
|
|||
std::vector<format_run_ptr> runs_;
|
||||
};
|
||||
|
||||
typedef boost::shared_ptr<text_line> text_line_ptr;
|
||||
|
||||
|
||||
class text_layout
|
||||
{
|
||||
|
@ -83,7 +85,7 @@ public:
|
|||
|
||||
private:
|
||||
text_itemizer itemizer;
|
||||
std::list<text_line> lines_;
|
||||
std::vector<text_line_ptr> lines_;
|
||||
std::vector<glyph_info> glyphs_;
|
||||
face_manager_freetype &font_manager_;
|
||||
};
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <mapnik/label_collision_detector.hpp>
|
||||
#include <mapnik/placement_finder.hpp>
|
||||
#include <mapnik/font_engine_freetype.hpp>
|
||||
#include <mapnik/text/layout.hpp>
|
||||
#include "agg_conv_clip_polyline.h"
|
||||
|
||||
namespace mapnik {
|
||||
|
@ -40,7 +41,7 @@ text_symbolizer_helper<FaceManagerT, DetectorT>::text_symbolizer_helper(const te
|
|||
writer_(sym.get_metawriter()),
|
||||
dims_(0, 0, width, height),
|
||||
query_extent_(query_extent),
|
||||
layout_(font_manager),
|
||||
layout_(new text_layout(font_manager)),
|
||||
angle_(0.0),
|
||||
placement_valid_(false),
|
||||
points_on_line_(false),
|
||||
|
@ -251,8 +252,8 @@ bool text_symbolizer_helper<FaceManagerT, DetectorT>::next_placement()
|
|||
placement_valid_ = false;
|
||||
return false;
|
||||
}
|
||||
placement_->properties.process(layout_, feature_);
|
||||
layout_.shape_text();
|
||||
placement_->properties.process(*layout_, feature_);
|
||||
layout_->shape_text();
|
||||
//TODO
|
||||
// info_ = &(text_.get_string_info());
|
||||
if (placement_->properties.orientation)
|
||||
|
|
|
@ -50,8 +50,10 @@ void text_layout::break_lines()
|
|||
void text_layout::shape_text()
|
||||
{
|
||||
UnicodeString const& text = itemizer.get_text();
|
||||
glyphs_.reserve(text.length()); //Preallocate memory
|
||||
uint32_t offset = 0; //in utf16 code points
|
||||
|
||||
glyphs_.reserve(text.length()); //Preallocate memory
|
||||
|
||||
std::list<text_item> const& list = itemizer.itemize();
|
||||
std::list<text_item>::const_iterator itr = list.begin(), end = list.end();
|
||||
for (;itr!=end; itr++)
|
||||
|
|
|
@ -58,6 +58,7 @@ uint32_t text_shaping::process_text(UnicodeString const& text, unsigned start, u
|
|||
hb_buffer_reset(buffer_);
|
||||
|
||||
uint32_t length = text.length();
|
||||
std::cout << "process_text: length: " << length << " start: " << start << " end: " << end << "\n";
|
||||
|
||||
hb_buffer_add_utf16(buffer_, text.getBuffer(), length, start, end-start);
|
||||
hb_buffer_set_direction(buffer_, rtl?HB_DIRECTION_RTL:HB_DIRECTION_LTR);
|
||||
|
|
Loading…
Reference in a new issue