#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 &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> litehtml::el_text::dump_get_attrs()
{
return {};
}