public int cvt_units(css_length val, int fontSize, int size = 0) { if (val.is_predefined) { return(0); } var ret = 0; switch (val.units) { case css_units.percentage: ret = val.calc_percent(size); break; case css_units.em: ret = (int)Math.Round(val.val * fontSize); val.set_value(ret, css_units.px); break; case css_units.pt: ret = _container.pt_to_px((int)val.val); val.set_value(ret, css_units.px); break; case css_units.@in: ret = _container.pt_to_px((int)(val.val * 72)); val.set_value(ret, css_units.px); break; case css_units.cm: ret = _container.pt_to_px((int)(val.val * 0.3937 * 72)); val.set_value(ret, css_units.px); break; case css_units.mm: ret = _container.pt_to_px((int)(val.val * 0.3937 * 72) / 10); val.set_value(ret, css_units.px); break; case css_units.vw: ret = (int)(_media.width * (double)val.val / 100.0); break; case css_units.vh: ret = (int)(_media.height * (double)val.val / 100.0); break; case css_units.vmin: ret = (int)(Math.Min(_media.height, _media.width) * (double)val.val / 100.0); break; case css_units.vmax: ret = (int)(Math.Max(_media.height, _media.width) * (double)val.val / 100.0); break; default: ret = (int)val.val; break; } return(ret); }
public int calc_table_width(int block_width, bool is_auto, int min_table_width, int max_table_width) { min_table_width = 0; // MIN max_table_width = 0; // MAX var cur_width = 0; var max_w = 0; var min_w = 0; for (var col = 0; col < _cols_count; col++) { min_table_width += _columns[col].min_width; max_table_width += _columns[col].max_width; if (!_columns[col].css_width.is_predefined) { _columns[col].width = _columns[col].css_width.calc_percent(block_width); _columns[col].width = Math.Max(_columns[col].width, _columns[col].min_width); } else { _columns[col].width = _columns[col].min_width; max_w += _columns[col].max_width; min_w += _columns[col].min_width; } cur_width += _columns[col].width; } if (cur_width == block_width) { return(cur_width); } if (cur_width < block_width) { if (cur_width - min_w + max_w <= block_width) { cur_width = 0; for (var col = 0; col < _cols_count; col++) { if (_columns[col].css_width.is_predefined) { _columns[col].width = _columns[col].max_width; } cur_width += _columns[col].width; } if (cur_width == block_width || is_auto) { return(cur_width); } } distribute_width(block_width - cur_width, 0, _cols_count - 1); cur_width = 0; for (var col = 0; col < _cols_count; col++) { cur_width += _columns[col].width; } } else { var fixed_width = 0; var percent = 0F; for (int col = 0; col < _cols_count; col++) { if (!_columns[col].css_width.is_predefined && _columns[col].css_width.units == css_units.percentage) { percent += _columns[col].css_width.val; } else { fixed_width += _columns[col].width; } } var scale = (float)(100.0 / percent); cur_width = 0; for (var col = 0; col < _cols_count; col++) { if (!_columns[col].css_width.is_predefined && _columns[col].css_width.units == css_units.percentage) { var w = new css_length(); w.set_value(_columns[col].css_width.val * scale, css_units.percentage); _columns[col].width = w.calc_percent(block_width - fixed_width); if (_columns[col].width < _columns[col].min_width) { _columns[col].width = _columns[col].min_width; } } cur_width += _columns[col].width; } } return(cur_width); }