Skip to content

Commit 0a1b32a

Browse files
committed
Rendering refactoring
* max_width argument removed from _render function * added render_width into containing_block_context structure. This member should be used to render element instead of max_width * _render protected function is replaced with render function * apply auto-margins from parent element. Auto margins must not be applied inside render function
1 parent 46bbc0a commit 0a1b32a

18 files changed

+285
-253
lines changed

include/litehtml/render_item.h

Lines changed: 26 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,8 @@ namespace litehtml
2626
bool m_skip;
2727
std::vector<std::shared_ptr<render_item>> m_positioned;
2828

29-
virtual int _render(int x, int y, int max_width, const containing_block_context &containing_block_size, bool second_pass) { return 0; }
3029
containing_block_context calculate_containing_block_context(const containing_block_context& cb_context);
31-
void calc_cb_length(const css_length& len,
32-
int percent_base,
33-
int& out_value,
34-
containing_block_context::cbc_value_type& out_type) const;
30+
void calc_cb_length(const css_length& len, int percent_base, containing_block_context::typed_int& out_value) const;
3531

3632
public:
3733
explicit render_item(std::shared_ptr<element> src_el);
@@ -233,7 +229,7 @@ namespace litehtml
233229

234230
int box_sizing_width() const
235231
{
236-
return box_sizing_left() + border_right();
232+
return box_sizing_left() + box_sizing_left();
237233
}
238234

239235
int box_sizing_top() const
@@ -248,7 +244,7 @@ namespace litehtml
248244

249245
int box_sizing_height() const
250246
{
251-
return box_sizing_top() + border_bottom();
247+
return box_sizing_top() + box_sizing_bottom();
252248
}
253249

254250
void parent(const std::shared_ptr<render_item>& par)
@@ -272,10 +268,10 @@ namespace litehtml
272268
ri->parent(shared_from_this());
273269
}
274270

275-
int render(int x, int y, int max_width, const containing_block_context& containing_block_size)
276-
{
277-
return _render(x, y, max_width, containing_block_size, false);
278-
}
271+
virtual int render(int x, int y, const containing_block_context& containing_block_size, bool second_pass = false)
272+
{
273+
return 0;
274+
}
279275

280276
bool have_parent() const
281277
{
@@ -311,7 +307,7 @@ namespace litehtml
311307
bool get_predefined_height(int& p_height, int containing_block_height) const;
312308
void apply_relative_shift(const containing_block_context &containing_block_size);
313309
void calc_outlines( int parent_width );
314-
void calc_auto_margins(int parent_width);
310+
int calc_auto_margins(int parent_width); // returns left margin
315311

316312
virtual std::shared_ptr<render_item> init();
317313
virtual void apply_vertical_align() {}
@@ -369,21 +365,20 @@ namespace litehtml
369365
int_int_cache m_cache_line_left;
370366
int_int_cache m_cache_line_right;
371367

372-
int _render(int x, int y, int max_width, const containing_block_context &containing_block_size, bool second_pass) override;
373-
374368
/**
375369
* Render block content.
376370
*
377371
* @param x - horizontal position of the content
378372
* @param y - vertical position of the content
379-
* @param max_width - maximal width of the content
380373
* @param second_pass - true is this is the second pass.
381374
* @param ret_width - input minimal width.
375+
* @param self_size - defines calculated size of block
382376
* @return return value is the minimal width of the content in block. Must be greater or equal to ret_width parameter
383377
*/
384-
virtual int _render_content(int x, int y, int max_width, bool second_pass, int ret_width, const containing_block_context &containing_block_size) {return ret_width;}
378+
virtual int _render_content(int x, int y, bool second_pass, int ret_width, const containing_block_context &self_size) {return ret_width;}
379+
int render(int x, int y, const containing_block_context &containing_block_size, bool second_pass) override;
385380

386-
int place_float(const std::shared_ptr<render_item> &el, int top, int max_width, const containing_block_context &containing_block_size);
381+
int place_float(const std::shared_ptr<render_item> &el, int top, const containing_block_context &containing_block_size);
387382
int get_floats_height(element_float el_float = float_none) const override;
388383
int get_left_floats_height() const override;
389384
int get_right_floats_height() const override;
@@ -393,7 +388,7 @@ namespace litehtml
393388
void add_float(const std::shared_ptr<render_item> &el, int x, int y) override;
394389
int get_cleared_top(const std::shared_ptr<render_item> &el, int line_top) const;
395390
int find_next_line_top( int top, int width, int def_right ) override;
396-
virtual void fix_line_width(int max_width, element_float flt,
391+
virtual void fix_line_width(element_float flt,
397392
const containing_block_context &containing_block_size)
398393
{}
399394
void update_floats(int dy, const std::shared_ptr<render_item> &_parent) override;
@@ -416,8 +411,8 @@ namespace litehtml
416411
class render_item_block_context : public render_item_block
417412
{
418413
protected:
419-
int _render_content(int x, int y, int max_width, bool second_pass, int ret_width,
420-
const containing_block_context &containing_block_size) override;
414+
int _render_content(int x, int y, bool second_pass, int ret_width,
415+
const containing_block_context &self_size) override;
421416

422417
public:
423418
explicit render_item_block_context(std::shared_ptr<element> src_el) : render_item_block(std::move(src_el))
@@ -455,14 +450,14 @@ namespace litehtml
455450
std::vector<std::unique_ptr<litehtml::line_box> > m_line_boxes;
456451
int m_max_line_width;
457452

458-
int _render_content(int x, int y, int max_width, bool second_pass, int ret_width,
459-
const containing_block_context &containing_block_size) override;
460-
void fix_line_width(int max_width, element_float flt,
461-
const containing_block_context &containing_block_size) override;
453+
int _render_content(int x, int y, bool second_pass, int ret_width,
454+
const containing_block_context &self_size) override;
455+
void fix_line_width(element_float flt,
456+
const containing_block_context &self_size) override;
462457

463-
std::list<std::unique_ptr<line_box_item> > finish_last_box(bool end_of_render, int max_width, const containing_block_context &containing_block_size);
464-
void place_inline(std::unique_ptr<line_box_item> item, int max_width, const containing_block_context &containing_block_size);
465-
int new_box(const std::unique_ptr<line_box_item>& el, int max_width, line_context& line_ctx, const containing_block_context &containing_block_size);
458+
std::list<std::unique_ptr<line_box_item> > finish_last_box(bool end_of_render, const containing_block_context &self_size);
459+
void place_inline(std::unique_ptr<line_box_item> item, const containing_block_context &self_size);
460+
int new_box(const std::unique_ptr<line_box_item>& el, line_context& line_ctx, const containing_block_context &self_size);
466461
void apply_vertical_align() override;
467462
public:
468463
explicit render_item_inline_context(std::shared_ptr<element> src_el) : render_item_block(std::move(src_el)), m_max_line_width(0)
@@ -484,15 +479,14 @@ namespace litehtml
484479
int m_border_spacing_x;
485480
int m_border_spacing_y;
486481

487-
int _render(int x, int y, int max_width, const containing_block_context &containing_block_size, bool second_pass) override;
488-
489482
public:
490483
explicit render_item_table(std::shared_ptr<element> src_el);
491484

492485
std::shared_ptr<render_item> clone() override
493486
{
494487
return std::make_shared<render_item_table>(src_el());
495488
}
489+
int render(int x, int y, const containing_block_context &containing_block_size, bool second_pass) override;
496490
void draw_children(uint_ptr hdc, int x, int y, const position* clip, draw_flag flag, int zindex) override;
497491
int get_draw_vertical_offset() override;
498492
std::shared_ptr<render_item> init() override;
@@ -504,8 +498,6 @@ namespace litehtml
504498
explicit render_item_table_part(std::shared_ptr<element> src_el) : render_item(std::move(src_el))
505499
{}
506500

507-
int _render(int x, int y, int max_width, const containing_block_context &containing_block_size, bool second_pass) override
508-
{return 0;}
509501
std::shared_ptr<render_item> clone() override
510502
{
511503
return std::make_shared<render_item_table_part>(src_el());
@@ -518,8 +510,6 @@ namespace litehtml
518510
explicit render_item_table_row(std::shared_ptr<element> src_el) : render_item(std::move(src_el))
519511
{}
520512

521-
int _render(int x, int y, int max_width, const containing_block_context &containing_block_size, bool second_pass) override
522-
{return 0;}
523513
std::shared_ptr<render_item> clone() override
524514
{
525515
return std::make_shared<render_item_table_row>(src_el());
@@ -532,7 +522,6 @@ namespace litehtml
532522
protected:
533523
position::vector m_boxes;
534524

535-
int _render(int x, int y, int max_width, const containing_block_context &containing_block_size, bool second_pass) override;
536525
public:
537526
explicit render_item_inline(std::shared_ptr<element> src_el) : render_item(std::move(src_el))
538527
{}
@@ -552,13 +541,13 @@ namespace litehtml
552541
class render_item_image : public render_item
553542
{
554543
protected:
555-
int _render(int x, int y, int max_width, const containing_block_context &containing_block_size, bool second_pass) override;
556544
int calc_max_height(int image_height, int containing_block_height);
557545

558546
public:
559547
explicit render_item_image(std::shared_ptr<element> src_el) : render_item(std::move(src_el))
560548
{}
561549

550+
int render(int x, int y, const containing_block_context &containing_block_size, bool second_pass) override;
562551
std::shared_ptr<render_item> clone() override
563552
{
564553
return std::make_shared<render_item_image>(src_el());
@@ -588,8 +577,8 @@ namespace litehtml
588577
protected:
589578
std::list<std::unique_ptr<flex_item>> m_flex_items;
590579

591-
int _render_content(int x, int y, int max_width, bool second_pass, int ret_width,
592-
const containing_block_context &containing_block_size) override;
580+
int _render_content(int x, int y, bool second_pass, int ret_width,
581+
const containing_block_context &self_size) override;
593582

594583
public:
595584
explicit render_item_flex(std::shared_ptr<element> src_el) : render_item_block(std::move(src_el))

include/litehtml/types.h

Lines changed: 56 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -194,34 +194,65 @@ namespace litehtml
194194
cbc_value_type_none, // min/max width/height of containing block is defined as none
195195
};
196196

197-
int width; // width of the containing block
198-
cbc_value_type width_type;
199-
int min_width;
200-
cbc_value_type min_width_type;
201-
int max_width;
202-
cbc_value_type max_width_type;
203-
204-
int height; // height of the containing block
205-
cbc_value_type height_type;
206-
int min_height;
207-
cbc_value_type min_height_type;
208-
int max_height;
209-
cbc_value_type max_height_type;
197+
struct typed_int
198+
{
199+
int value;
200+
cbc_value_type type;
201+
202+
typed_int(int val, cbc_value_type tp)
203+
{
204+
value = val;
205+
type = tp;
206+
}
207+
208+
operator int() const
209+
{
210+
return value;
211+
}
212+
213+
typed_int& operator=(int val)
214+
{
215+
value = val;
216+
return *this;
217+
}
218+
219+
typed_int& operator=(const typed_int& v)
220+
{
221+
value = v.value;
222+
type = v.type;
223+
return *this;
224+
}
225+
};
226+
227+
typed_int width; // width of the containing block
228+
typed_int render_width;
229+
typed_int min_width;
230+
typed_int max_width;
231+
232+
typed_int height; // height of the containing block
233+
typed_int min_height;
234+
typed_int max_height;
210235

211236
containing_block_context() :
212-
width(0),
213-
width_type(cbc_value_type_auto),
214-
min_width(0),
215-
min_width_type(cbc_value_type_none),
216-
max_width(0),
217-
max_width_type(cbc_value_type_none),
218-
height(0),
219-
height_type(cbc_value_type_auto),
220-
min_height(0),
221-
min_height_type(cbc_value_type_none),
222-
max_height(0),
223-
max_height_type(cbc_value_type_none)
237+
width(0, cbc_value_type_auto),
238+
render_width(0, cbc_value_type_auto),
239+
min_width(0, cbc_value_type_none),
240+
max_width(0, cbc_value_type_none),
241+
height(0, cbc_value_type_auto),
242+
min_height(0, cbc_value_type_none),
243+
max_height(0, cbc_value_type_none)
224244
{}
245+
246+
containing_block_context new_width(int w) const
247+
{
248+
containing_block_context ret = *this;
249+
//if(ret.width.type != cbc_value_type_absolute)
250+
{
251+
ret.render_width = w - (ret.width - ret.render_width);
252+
ret.width = w;
253+
}
254+
return ret;
255+
}
225256
};
226257

227258
#define style_display_strings "none;block;inline;inline-block;inline-table;list-item;table;table-caption;table-cell;table-column;table-column-group;table-footer-group;table-header-group;table-row;table-row-group;inline-text;flex;inline-flex"

src/document.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -293,18 +293,18 @@ int litehtml::document::render( int max_width, render_type rt )
293293
position client_rc;
294294
m_container->get_client_rect(client_rc);
295295
containing_block_context cb_context;
296-
cb_context.width = client_rc.width;
297-
cb_context.width_type = containing_block_context::cbc_value_type_absolute;
296+
cb_context.width = max_width;
297+
cb_context.width.type = containing_block_context::cbc_value_type_absolute;
298298
cb_context.height = client_rc.height;
299-
cb_context.height_type = containing_block_context::cbc_value_type_absolute;
299+
cb_context.height.type = containing_block_context::cbc_value_type_absolute;
300300

301301
if(rt == render_fixed_only)
302302
{
303303
m_fixed_boxes.clear();
304304
m_root_render->render_positioned(rt);
305305
} else
306306
{
307-
ret = m_root_render->render(0, 0, max_width, cb_context);
307+
ret = m_root_render->render(0, 0, cb_context);
308308
if(m_root_render->fetch_positioned())
309309
{
310310
m_fixed_boxes.clear();

0 commit comments

Comments
 (0)