|
沙发
楼主 |
发表于 2016-5-19 21:30:00
|
只看该作者
本帖最后由 ancientcc 于 2016-5-30 21:27 编辑
High DPI是窗口系统一部分,各平台以着自个的方式去实现,以下是Rose实现该子系统要点。首先,Rose在顶层分成两个过程,一是计算标称尺寸,二是渲染内容。
一、计算标称尺寸
首先要明确,calculate_best_size算出的就是显示尺寸。以下是原因。
- 不能简单地在twidget::get_best_size()乘上hdpi_scale计算出显示尺寸。如果当前控件是复合控件中的子控件,它会使复合控件最终出来的尺寸超过hdpi_scale倍数。
- 有些控件希望x、y、width、height中的一些参数不必放大,这种控制放在calculate_best_size之后就很做到了。
公式中的参数需要配置尺寸;公式计算出的值是配置尺寸。
1、cfg配置
计算标称尺寸要考虑的因素很多,当中一个是控件的定义块,定义块中的值都是配置尺寸。
控件 | 字段 | control(所有控件) | window_width/height, default_width/height, max_width/height, text_extra_width/height, text_font_size | slider(滑块) | minimum_positioner_length, maximum_positioner_length, left_offset, right_offset | report(报表) | unit_width, unit_height, gap |
窗口定义中的值是配置尺寸。
父块 | 字段 | 描述 | [column] | border_size | border_size *= hdpi_scale |
提示定义中的值是配置尺寸。
- [tip_definition]
- text_extra_width/height, text_font_size, vertical_gap
- [/tip_definition]
复制代码
2、计算
当控件内容有字符串时,要用它的结果计算标称尺寸,这个结果需要是hdpi_scale整数倍。
SDL_Rect tintegrate::get_size() const
{
......
max_x = posix_ceil2(max_x, gui2::twidget::hdpi_scale);
max_y = posix_ceil2(max_y, gui2::twidget::hdpi_scale);
}
计算场景中的控件,它首先是把屏幕的显示尺寸缩小到配置尺寸,用后者是计算,然后把结果放大到显示尺寸。
- gui/dialogs/theme.cpp
- calculate_relative_loc(const config& cfg, int screen_w, int screen_h)
- screen_w /= hdpi_scale;
- screen_h /= hdpi_scale;
- ......
- relative_loc = create_rect(relative_loc.x * hdpi_scale, relative_loc.y * hdpi_scale, relative_loc.w * hdpi_scale, relative_loc.h * hdpi_scale);
- set_resolution2(const config& cfg, int screen_w, int screen_h)
- screen_w /= hdpi_scale;
- screen_h /= hdpi_scale;
复制代码
二、渲染内容
gui2系统根据标称尺寸确定出渲染尺寸后,要开始渲染内容。
1、cfg配置
图元组成了内容,对每个图元,gui2都支给四个可用于公式的参数。dwidth、dheight、width、height。碰到不要放大的情况时,width/height可能不能被hdpi_scale整除。一个[image]控件,内容是一条高1像素的横线,1不可能被hdpi_scale整除。这意味着width/height必须接收显示尺寸。
图元 | 字段 | 描述 | image | name | hdpi不是1时,它会在文件名加上后缀“@<hdpi_scale>”。举个例子,button2-botleft.png,当hdpi=2时,会先尝试使用button2-botleft@2.png,如果不存在则使用button2-botleft.png。 | text | font_size | font_size *= hdpi_scale |
|
|