-
Notifications
You must be signed in to change notification settings - Fork 1
/
text_itemizer.hpp
70 lines (63 loc) · 1.57 KB
/
text_itemizer.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#ifndef MAPNIK_TEXT_ITEMIZER_HPP
#define MAPNIK_TEXT_ITEMIZER_HPP
// stl
#include <string>
#include <list>
// ICU
#include <unicode/unistr.h>
#include <unicode/uscript.h>
#include <unicode/ubidi.h>
namespace mapnik
{
struct char_properties
{
std::string face_name;
float text_size;
double character_spacing;
double line_spacing;
};
struct text_item
{
UnicodeString str;
UScriptCode script;
char_properties format;
UBiDiDirection rtl;
text_item(UnicodeString const& str) :
str(str), script(), format(), rtl(UBIDI_LTR)
{
}
};
/** This class splits text into parts which all have the same
* - direction (LTR, RTL)
* - format
* - script (http://en.wikipedia.org/wiki/Scripts_in_Unicode)
**/
class text_itemizer
{
public:
text_itemizer();
void add_text(UnicodeString str, char_properties const& format);
std::list<text_item> const& itemize();
void clear();
UnicodeString const& get_text() { return text; }
private:
template<typename T> struct run
{
run(T data, unsigned limit) : limit(limit), data(data){}
unsigned limit;
T data;
};
typedef run<char_properties> format_run_t;
typedef run<UBiDiDirection> direction_run_t;
typedef run<UScriptCode> script_run_t;
UnicodeString text;
std::list<format_run_t> format_runs;
std::list<direction_run_t> direction_runs;
std::list<script_run_t> script_runs;
void itemize_direction();
void itemize_script();
void create_item_list();
std::list<text_item> output;
};
} //ns mapnik
#endif // TEXT_ITEMIZER_HPP