예제 #1
0
        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;

            case css_units.rem: ret = (int)(_root.get_font_size * (double)val.val); val.set_value(ret, css_units.px); break;

            default: ret = (int)val.val; break;
            }
            return(ret);
        }
예제 #2
0
        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);
        }