Cogs.Core
el_text.cpp
1#ifdef _WIN32
2#pragma warning(disable: 4100) // unreferenced formal parameter
3#elif defined(__clang__)
4#pragma clang diagnostic ignored "-Wunused-parameter"
5#endif
6#include "html.h"
7#include "el_text.h"
8#include "document.h"
9
10litehtml::el_text::el_text(const tchar_t* text, const std::shared_ptr<litehtml::document>& doc) : element(doc)
11{
12 if(text)
13 {
14 m_text = text;
15 }
16 m_text_transform = text_transform_none;
17 m_use_transformed = false;
18 m_draw_spaces = true;
19}
20
21litehtml::el_text::~el_text()
22{
23
24}
25
26void litehtml::el_text::get_content_size( size& sz, int max_width )
27{
28 sz = m_size;
29}
30
31void litehtml::el_text::get_text( tstring& text )
32{
33 text += m_text;
34}
35
36const litehtml::tchar_t* litehtml::el_text::get_style_property( const tchar_t* name, bool inherited, const tchar_t* def /*= 0*/ )
37{
38 if(inherited)
39 {
40 element::ptr el_parent = parent();
41 if (el_parent)
42 {
43 return el_parent->get_style_property(name, inherited, def);
44 }
45 }
46 return def;
47}
48
49void litehtml::el_text::parse_styles(bool is_reparse)
50{
51 m_text_transform = (text_transform) value_index(get_style_property(_t("text-transform"), true, _t("none")), text_transform_strings, text_transform_none);
52 if(m_text_transform != text_transform_none)
53 {
54 m_transformed_text = m_text;
55 m_use_transformed = true;
56 get_document()->container()->transform_text(m_transformed_text, m_text_transform);
57 }
58
59 if(is_white_space())
60 {
61 m_transformed_text = _t(" ");
62 m_use_transformed = true;
63 } else
64 {
65 if(m_text == _t("\t"))
66 {
67 m_transformed_text = _t(" ");
68 m_use_transformed = true;
69 }
70 if(m_text == _t("\n") || m_text == _t("\r"))
71 {
72 m_transformed_text = _t("");
73 m_use_transformed = true;
74 }
75 }
76
77 font_metrics fm;
78 uint_ptr font = 0;
79 element::ptr el_parent = parent();
80 if (el_parent)
81 {
82 font = el_parent->get_font(&fm);
83 }
84 if(is_break())
85 {
86 m_size.height = 0;
87 m_size.width = 0;
88 } else
89 {
90 m_size.height = fm.height;
91 m_size.width = get_document()->container()->text_width(m_use_transformed ? m_transformed_text.c_str() : m_text.c_str(), font);
92 }
93 m_draw_spaces = fm.draw_spaces;
94}
95
96int litehtml::el_text::get_base_line()
97{
98 element::ptr el_parent = parent();
99 if (el_parent)
100 {
101 return el_parent->get_base_line();
102 }
103 return 0;
104}
105
106void litehtml::el_text::draw( uint_ptr hdc, int x, int y, const position* clip )
107{
108 if(is_white_space() && !m_draw_spaces)
109 {
110 return;
111 }
112
113 position pos = m_pos;
114 pos.x += x;
115 pos.y += y;
116
117 if(pos.does_intersect(clip))
118 {
119 element::ptr el_parent = parent();
120 if (el_parent)
121 {
122 document::ptr doc = get_document();
123
124 uint_ptr font = el_parent->get_font();
125 litehtml::web_color color = el_parent->get_color(_t("color"), true, doc->get_def_color());
126 doc->container()->draw_text(hdc, m_use_transformed ? m_transformed_text.c_str() : m_text.c_str(), font, color, pos);
127 }
128 }
129}
130
131int litehtml::el_text::line_height() const
132{
133 element::ptr el_parent = parent();
134 if (el_parent)
135 {
136 return el_parent->line_height();
137 }
138 return 0;
139}
140
141litehtml::uint_ptr litehtml::el_text::get_font( font_metrics* fm /*= 0*/ )
142{
143 element::ptr el_parent = parent();
144 if (el_parent)
145 {
146 return el_parent->get_font(fm);
147 }
148 return 0;
149}
150
151litehtml::style_display litehtml::el_text::get_display() const
152{
153 return display_inline_text;
154}
155
156litehtml::white_space litehtml::el_text::get_white_space() const
157{
158 element::ptr el_parent = parent();
159 if (el_parent) return el_parent->get_white_space();
160 return white_space_normal;
161}
162
163litehtml::element_position litehtml::el_text::get_element_position(css_offsets* offsets) const
164{
165 element::ptr p = parent();
166 while(p && p->get_display() == display_inline)
167 {
168 if(p->get_element_position() == element_position_relative)
169 {
170 if(offsets)
171 {
172 *offsets = p->get_css_offsets();
173 }
174 return element_position_relative;
175 }
176 p = p->parent();
177 }
178 return element_position_static;
179}
180
181litehtml::css_offsets litehtml::el_text::get_css_offsets() const
182{
183 element::ptr p = parent();
184 while(p && p->get_display() == display_inline)
185 {
186 if(p->get_element_position() == element_position_relative)
187 {
188 return p->get_css_offsets();
189 }
190 p = p->parent();
191 }
192 return css_offsets();
193}