3#pragma warning(disable: 4100)
4#elif defined(__clang__)
5#pragma clang diagnostic ignored "-Wunused-parameter"
13litehtml::box_type litehtml::block_box::get_type()
18int litehtml::block_box::height()
20 return m_element->height();
23int litehtml::block_box::width()
25 return m_element->width();
28void litehtml::block_box::add_element(
const element::ptr &el)
34void litehtml::block_box::finish(
bool last_box)
36 if(!m_element)
return;
37 m_element->apply_relative_shift(m_box_right - m_box_left);
40bool litehtml::block_box::can_hold(
const element::ptr &el, white_space ws)
42 if(m_element || el->is_inline_box())
49bool litehtml::block_box::is_empty()
58int litehtml::block_box::baseline()
62 return m_element->get_base_line();
67void litehtml::block_box::get_elements( elements_vector& els )
69 els.push_back(m_element);
72int litehtml::block_box::top_margin()
74 if(m_element && m_element->collapse_top_margin())
76 return m_element->m_margins.top;
81int litehtml::block_box::bottom_margin()
83 if(m_element && m_element->collapse_bottom_margin())
85 return m_element->m_margins.bottom;
90void litehtml::block_box::y_shift(
int shift )
95 m_element->m_pos.y += shift;
99void litehtml::block_box::new_width(
int left,
int right, elements_vector& els )
106litehtml::box_type litehtml::line_box::get_type()
111int litehtml::line_box::height()
116int litehtml::line_box::width()
121void litehtml::line_box::add_element(
const element::ptr &el)
126 if( (m_items.empty() && el->is_white_space()) || el->is_break() )
129 }
else if(el->is_white_space())
131 if (have_last_space())
141 m_items.push_back(el);
145 int el_shift_left = el->get_inline_shift_left();
146 int el_shift_right = el->get_inline_shift_right();
148 el->m_pos.x = m_box_left + m_width + el_shift_left + el->content_margins_left();
149 el->m_pos.y = m_box_top + el->content_margins_top();
150 m_width += el->width() + el_shift_left + el_shift_right;
155void litehtml::line_box::finish(
bool last_box)
157 if( is_empty() || (!is_empty() && last_box && is_break_only()) )
163 for(
auto i = m_items.rbegin(); i != m_items.rend(); i++)
165 if((*i)->is_white_space() || (*i)->is_break())
170 m_width -= (*i)->width();
178 int base_line = m_font_metrics.base_line();
179 int line_height = m_line_height;
184 case text_align_right:
185 if(m_width < (m_box_right - m_box_left))
187 add_x = (m_box_right - m_box_left) - m_width;
190 case text_align_center:
191 if(m_width < (m_box_right - m_box_left))
193 add_x = ((m_box_right - m_box_left) - m_width) / 2;
202 for(
const auto& el : m_items)
204 if(el->get_display() == display_inline_text)
208 base_line = std::max(base_line, fm.base_line());
209 line_height = std::max(line_height, el->line_height());
210 m_height = std::max(m_height, fm.height);
212 el->m_pos.x += add_x;
217 base_line += (line_height - m_height) / 2;
220 m_height = line_height;
225 for (
const auto& el : m_items)
227 if(el->get_display() == display_inline_text)
231 el->m_pos.y = m_height - base_line - fm.ascent;
234 switch(el->get_vertical_align())
239 el->m_pos.y = m_height - base_line - el->height() + el->get_base_line() + el->content_margins_top();
242 el->m_pos.y = y1 + el->content_margins_top();
245 el->m_pos.y = m_height - base_line - m_font_metrics.ascent + el->content_margins_top();
248 el->m_pos.y = m_height - base_line - m_font_metrics.x_height / 2 - el->height() / 2 + el->content_margins_top();
251 el->m_pos.y = y2 - el->height() + el->content_margins_top();
254 el->m_pos.y = m_height - base_line + m_font_metrics.descent - el->height() + el->content_margins_top();
257 y1 = std::min(y1, el->top());
258 y2 = std::max(y2, el->bottom());
264 for (
const auto& el : m_items)
267 el->m_pos.y += m_box_top;
268 if(el->get_display() != display_inline_text)
270 switch(el->get_vertical_align())
273 el->m_pos.y = m_box_top + el->content_margins_top();
276 el->m_pos.y = m_box_top + (y2 - y1) - el->height() + el->content_margins_top();
299 el->apply_relative_shift(m_box_right - m_box_left);
302 m_baseline = (base_line - y1) - (m_height - line_height);
305bool litehtml::line_box::can_hold(
const element::ptr &el, white_space ws)
307 if(!el->is_inline_box())
return false;
314 if(ws == white_space_nowrap || ws == white_space_pre)
319 if(m_box_left + m_width + el->width() + el->get_inline_shift_left() + el->get_inline_shift_right() > m_box_right)
327bool litehtml::line_box::have_last_space()
330 for (
auto i = m_items.rbegin(); i != m_items.rend() && !ret; i++)
332 if((*i)->is_white_space() || (*i)->is_break())
343bool litehtml::line_box::is_empty()
345 if(m_items.empty())
return true;
346 for (
auto i = m_items.rbegin(); i != m_items.rend(); i++)
348 if(!(*i)->m_skip || (*i)->is_break())
356int litehtml::line_box::baseline()
361void litehtml::line_box::get_elements( elements_vector& els )
363 els.insert(els.begin(), m_items.begin(), m_items.end());
366int litehtml::line_box::top_margin()
371int litehtml::line_box::bottom_margin()
376void litehtml::line_box::y_shift(
int shift )
379 for (
auto& el : m_items)
381 el->m_pos.y += shift;
385bool litehtml::line_box::is_break_only()
387 if(m_items.empty())
return true;
389 if(m_items.front()->is_break())
391 for (
auto& el : m_items)
403void litehtml::line_box::new_width(
int left,
int right, elements_vector& els )
405 int add = left - m_box_left;
411 auto remove_begin = m_items.end();
412 for (
auto i = m_items.begin() + 1; i != m_items.end(); i++)
414 element::ptr el = (*i);
418 if(m_box_left + m_width + el->width() + el->get_inline_shift_right() + el->get_inline_shift_left() > m_box_right)
425 m_width += el->width() + el->get_inline_shift_right() + el->get_inline_shift_left();
429 if(remove_begin != m_items.end())
431 els.insert(els.begin(), remove_begin, m_items.end());
432 m_items.erase(remove_begin, m_items.end());
434 for(
const auto& el : els)