diff options
| author | George Hazan <george.hazan@gmail.com> | 2025-04-28 15:48:45 +0300 |
|---|---|---|
| committer | George Hazan <george.hazan@gmail.com> | 2025-04-28 15:48:45 +0300 |
| commit | e29db0c3414f6da69d7e11505819346fed9267a3 (patch) | |
| tree | 67310fd9ce926aaeb0101a7bf79dfe30ff8eba33 /libs/litehtml/src/render_item.cpp | |
| parent | 24da6586bfdb3e41cc8240e41162b016e10b68c3 (diff) | |
update for litehtml
Diffstat (limited to 'libs/litehtml/src/render_item.cpp')
| -rw-r--r-- | libs/litehtml/src/render_item.cpp | 65 |
1 files changed, 42 insertions, 23 deletions
diff --git a/libs/litehtml/src/render_item.cpp b/libs/litehtml/src/render_item.cpp index 5ec65ab049..3794807a4f 100644 --- a/libs/litehtml/src/render_item.cpp +++ b/libs/litehtml/src/render_item.cpp @@ -1,8 +1,8 @@ -#include "html.h" #include "render_item.h" #include "document.h" #include <typeinfo> -#include <utf8_strings.h> +#include "document_container.h" +#include "types.h" litehtml::render_item::render_item(std::shared_ptr<element> _src_el) : m_element(std::move(_src_el)), @@ -46,7 +46,6 @@ int litehtml::render_item::render(int x, int y, const containing_block_context& if(src_el()->is_block_formatting_context() || ! fmt_ctx) { formatting_context fmt; - fmt.push_position(content_left, content_top); ret = _render(x, y, containing_block_size, &fmt, second_pass); fmt.apply_relative_shift(containing_block_size); } else @@ -243,8 +242,8 @@ bool litehtml::render_item::fetch_positioned() void litehtml::render_item::render_positioned(render_type rt) { - position wnd_position; - src_el()->get_document()->container()->get_client_rect(wnd_position); + position view_port; + src_el()->get_document()->container()->get_viewport(view_port); element_position el_position; bool process; @@ -275,8 +274,8 @@ void litehtml::render_item::render_positioned(render_type rt) containing_block_context containing_block_size; if(el_position == element_position_fixed || (is_root() && !src_el()->is_positioned())) { - containing_block_size.height = wnd_position.height; - containing_block_size.width = wnd_position.width; + containing_block_size.height = view_port.height; + containing_block_size.width = view_port.width; } else { containing_block_size.height = m_pos.height + m_padding.height(); @@ -648,8 +647,8 @@ void litehtml::render_item::render_positioned(render_type rt) if(el_position == element_position_fixed) { - position fixed_pos; - el->get_redraw_box(fixed_pos); + position fixed_pos = el->pos(); + el->get_redraw_box(fixed_pos); src_el()->get_document()->add_fixed_box(fixed_pos); } } @@ -832,12 +831,10 @@ void litehtml::render_item::draw_children(uint_ptr hdc, int x, int y, const posi if (el->src_el()->is_positioned() && el->src_el()->css().get_z_index() == zindex) { if (el->src_el()->css().get_position() == element_position_fixed) - { - position browser_wnd; - doc->container()->get_client_rect(browser_wnd); - - el->src_el()->draw(hdc, browser_wnd.x, browser_wnd.y, clip, el); - el->draw_stacking_context(hdc, browser_wnd.x, browser_wnd.y, clip, true); + { + // Fixed elements position is always relative to the (0,0) + el->src_el()->draw(hdc, 0, 0, clip, el); + el->draw_stacking_context(hdc, 0, 0, clip, true); } else { @@ -1129,17 +1126,39 @@ void litehtml::render_item::get_rendering_boxes( position::vector& redraw_boxes) if(src_el()->css().get_position() != element_position_fixed) { - auto cur_el = parent(); + auto cur_el = parent(); + int add_x = 0; + int add_y = 0; + while(cur_el) - { - for(auto& box : redraw_boxes) - { - box.x += cur_el->m_pos.x; - box.y += cur_el->m_pos.y; - } + { + if(cur_el->css().get_position() == element_position_fixed) + { + position view_port; + src_el()->get_document()->container()->get_viewport(view_port); + add_x += cur_el->m_pos.x + view_port.left(); + add_y += cur_el->m_pos.y + view_port.top(); + break; + } + add_x += cur_el->m_pos.x; + add_y += cur_el->m_pos.y; cur_el = cur_el->parent(); } - } + for(auto& box : redraw_boxes) + { + box.x += add_x; + box.y += add_y; + } + } else + { + position view_port; + src_el()->get_document()->container()->get_viewport(view_port); + for(auto& box : redraw_boxes) + { + box.x += view_port.left(); + box.y += view_port.top(); + } + } } void litehtml::render_item::dump(litehtml::dumper& cout) |
