asmcos 发表于 2006-6-15 18:08:51

窗口裁减

1.屏幕中有一个窗口A,窗口A中有一个转动的直线。(例如时钟里的秒针)

asmcos 发表于 2006-6-15 18:09:42

这时候有一个窗口B叠加在A上

asmcos 发表于 2006-6-15 18:13:01

当直线继续变化时:被B挡住的部分不能显示,暴露的必须显示。

实现方法:将A备份到内存中,将变化的图形写到内存中,
将暴露的矩形部分cp到显示区域。

asmcos 发表于 2006-6-15 18:14:02

看复杂的图形

asmcos 发表于 2006-6-15 18:15:48

另外一种情况,只有A,B,
当B移动后要暴露以前被B遮挡的部分

asmcos 发表于 2006-6-15 18:17:51

这就要计算出,窗口在被各种遮挡的情况下,计算出自己暴露的部分。
将这些暴露的部分,用很多矩形组合表示出来。

asmcos 发表于 2006-6-15 18:18:16

不知道目前有没有比较好的方法。

AnthonyLee 发表于 2006-6-16 04:18:07

做ETK++双缓冲时(0.1.7版本后)类似上述情况时,
所有更新区域用ERegion(多个矩形组合),

并对EView的响应作如下两种处理:
1. 一般情况下,最后更新时需要更新的区域都合成为一个矩形
并裁减去Sibling的遮罩区域后的ERect传给EView->Draw
2.当EView指定E_UPDATE_WITH_REGION时上述传递参数
及裁减过程均使用ERegion

对于EWindow的暴露回调,为加快速度均最后合成一个矩形区域
并整体把EView已经绘制好的缓冲区一股脑写上去

某些地方仍大有可改进的地方...

asmcos 发表于 2006-6-16 08:26:12

ETK++代码何时开放?或者你能讲解一下Etk上述几种情况的实现.?

muddog 发表于 2006-6-17 10:19:32

保存有效区域的理论还是蛮简单的
这边有篇我写的文档,比较粗的描述了一下.

asmcos 发表于 2006-6-17 18:11:38

在我描述的第三个图,连接如下:
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=download&id=28816

图中B,C覆盖了A,
A中可视区域应该为3个矩形。怎么计算这个矩形呢?
我看了,你的文档,并没有描述这一部分。

asmcos 发表于 2006-6-17 18:24:22

当然,现实中,B,C的位置并不固定,或者还有更多的窗口会覆盖在A上面。
那么怎么计算出类似被暴露的矩形。

muddog 发表于 2006-6-17 18:34:34

假设C在B之下(比如Z轴空间)。那久首先将A的Rect 和 C的相交。
去除相交部分,得到的就是两个可见的rect, 然后再把可见rect和B的rect相交
相交算法可以参考minigui的那个文档

asmcos 发表于 2006-6-17 18:35:08

看这张图,
当媒体播放器在最底层,有4个窗口覆盖在上面。

这时正在播放媒体。

窗口程序只能更新暴露的部分。

那么就算计算那些区域被暴露了。

怎么计算呢?

asmcos 发表于 2006-6-17 18:39:19

那么这种方法就有些复杂了。

你说的方法,我也想过。不知道有没有更好的方法。
页: [1] 2 3 4
查看完整版本: 窗口裁减