summaryrefslogtreecommitdiff
path: root/libs/litehtml/src/render_item.cpp
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2025-04-28 15:48:45 +0300
committerGeorge Hazan <george.hazan@gmail.com>2025-04-28 15:48:45 +0300
commite29db0c3414f6da69d7e11505819346fed9267a3 (patch)
tree67310fd9ce926aaeb0101a7bf79dfe30ff8eba33 /libs/litehtml/src/render_item.cpp
parent24da6586bfdb3e41cc8240e41162b016e10b68c3 (diff)
update for litehtml
Diffstat (limited to 'libs/litehtml/src/render_item.cpp')
-rw-r--r--libs/litehtml/src/render_item.cpp65
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)