窗口裁减
1.屏幕中有一个窗口A,窗口A中有一个转动的直线。(例如时钟里的秒针) 这时候有一个窗口B叠加在A上 当直线继续变化时:被B挡住的部分不能显示,暴露的必须显示。实现方法:将A备份到内存中,将变化的图形写到内存中,
将暴露的矩形部分cp到显示区域。 看复杂的图形 另外一种情况,只有A,B,
当B移动后要暴露以前被B遮挡的部分 这就要计算出,窗口在被各种遮挡的情况下,计算出自己暴露的部分。
将这些暴露的部分,用很多矩形组合表示出来。 不知道目前有没有比较好的方法。 做ETK++双缓冲时(0.1.7版本后)类似上述情况时,
所有更新区域用ERegion(多个矩形组合),
并对EView的响应作如下两种处理:
1. 一般情况下,最后更新时需要更新的区域都合成为一个矩形
并裁减去Sibling的遮罩区域后的ERect传给EView->Draw
2.当EView指定E_UPDATE_WITH_REGION时上述传递参数
及裁减过程均使用ERegion
对于EWindow的暴露回调,为加快速度均最后合成一个矩形区域
并整体把EView已经绘制好的缓冲区一股脑写上去
某些地方仍大有可改进的地方... ETK++代码何时开放?或者你能讲解一下Etk上述几种情况的实现.? 保存有效区域的理论还是蛮简单的
这边有篇我写的文档,比较粗的描述了一下. 在我描述的第三个图,连接如下:
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=download&id=28816
图中B,C覆盖了A,
A中可视区域应该为3个矩形。怎么计算这个矩形呢?
我看了,你的文档,并没有描述这一部分。 当然,现实中,B,C的位置并不固定,或者还有更多的窗口会覆盖在A上面。
那么怎么计算出类似被暴露的矩形。 假设C在B之下(比如Z轴空间)。那久首先将A的Rect 和 C的相交。
去除相交部分,得到的就是两个可见的rect, 然后再把可见rect和B的rect相交
相交算法可以参考minigui的那个文档 看这张图,
当媒体播放器在最底层,有4个窗口覆盖在上面。
这时正在播放媒体。
窗口程序只能更新暴露的部分。
那么就算计算那些区域被暴露了。
怎么计算呢? 那么这种方法就有些复杂了。
你说的方法,我也想过。不知道有没有更好的方法。