diff options
Diffstat (limited to 'libs/litehtml/src/el_text.cpp')
-rw-r--r-- | libs/litehtml/src/el_text.cpp | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/libs/litehtml/src/el_text.cpp b/libs/litehtml/src/el_text.cpp new file mode 100644 index 0000000000..5a1dffb69e --- /dev/null +++ b/libs/litehtml/src/el_text.cpp @@ -0,0 +1,140 @@ +#include "html.h" +#include "el_text.h" +#include "render_item.h" + +litehtml::el_text::el_text(const char* text, const document::ptr& doc) : element(doc) +{ + if(text) + { + m_text = text; + } + m_use_transformed = false; + m_draw_spaces = true; + css_w().set_display(display_inline_text); +} + +void litehtml::el_text::get_content_size( size& sz, int /*max_width*/ ) +{ + sz = m_size; +} + +void litehtml::el_text::get_text( string& text ) +{ + text += m_text; +} + +void litehtml::el_text::compute_styles(bool /*recursive*/) +{ + element::ptr el_parent = parent(); + if (el_parent) + { + css_w().set_line_height(el_parent->css().get_line_height()); + css_w().set_font(el_parent->css().get_font()); + css_w().set_font_metrics(el_parent->css().get_font_metrics()); + css_w().set_white_space(el_parent->css().get_white_space()); + css_w().set_text_transform(el_parent->css().get_text_transform()); + } + css_w().set_display(display_inline_text); + css_w().set_float(float_none); + + if(m_css.get_text_transform() != text_transform_none) + { + m_transformed_text = m_text; + m_use_transformed = true; + get_document()->container()->transform_text(m_transformed_text, m_css.get_text_transform()); + } else + { + m_use_transformed = false; + } + + element::ptr p = parent(); + while(p && p->css().get_display() == display_inline) + { + if(p->css().get_position() == element_position_relative) + { + css_w().set_offsets(p->css().get_offsets()); + css_w().set_position(element_position_relative); + break; + } + p = p->parent(); + } + if(p) + { + css_w().set_position(element_position_static); + } + + if(is_white_space()) + { + m_transformed_text = " "; + m_use_transformed = true; + } else + { + if(m_text == "\t") + { + m_transformed_text = " "; + m_use_transformed = true; + } + if(m_text == "\n" || m_text == "\r") + { + m_transformed_text = ""; + m_use_transformed = true; + } + } + + font_metrics fm; + uint_ptr font = 0; + if (el_parent) + { + font = el_parent->css().get_font(); + fm = el_parent->css().get_font_metrics(); + } + if(is_break() || !font) + { + m_size.height = 0; + m_size.width = 0; + } else + { + m_size.height = fm.height; + m_size.width = get_document()->container()->text_width(m_use_transformed ? m_transformed_text.c_str() : m_text.c_str(), font); + } + m_draw_spaces = fm.draw_spaces; +} + +void litehtml::el_text::draw(uint_ptr hdc, int x, int y, const position *clip, const std::shared_ptr<render_item> &ri) +{ + if(is_white_space() && !m_draw_spaces) + { + return; + } + + position pos = ri->pos(); + pos.x += x; + pos.y += y; + + if(pos.does_intersect(clip)) + { + element::ptr el_parent = parent(); + if (el_parent) + { + document::ptr doc = get_document(); + + uint_ptr font = el_parent->css().get_font(); + if(font) + { + web_color color = el_parent->css().get_color(); + doc->container()->draw_text(hdc, m_use_transformed ? m_transformed_text.c_str() : m_text.c_str(), font, + color, pos); + } + } + } +} + +litehtml::string litehtml::el_text::dump_get_name() +{ + return "text: \"" + get_escaped_string(m_text) + "\""; +} + +std::vector<std::tuple<litehtml::string, litehtml::string>> litehtml::el_text::dump_get_attrs() +{ + return std::vector<std::tuple<string, string>>(); +} |