Winapi GDI裁剪的实现细节

Winapi GDI裁剪的实现细节,winapi,windows-mobile,gdi,Winapi,Windows Mobile,Gdi,考虑以下代码段: HRGN clip = ::CreateRectRgn(50, 50, 100, 100); ::SelectClipRgn(context, clip); ::Rectangle(context, 0, 0, 50, 50); 微软的剪切实现是否足够智能,可以在调用矩形后立即返回,而不尝试绘制任何内容?我怀疑可能是这样,但在任何地方都找不到确认。的MSDN文档中很少有关于引擎盖下的细节,谷歌搜索到的只是如何使用GDI剪辑 编辑:我突然意识到,我没有指出这是在Windows

考虑以下代码段:

HRGN clip = ::CreateRectRgn(50, 50, 100, 100);
::SelectClipRgn(context, clip);
::Rectangle(context, 0, 0, 50, 50);
微软的剪切实现是否足够智能,可以在调用矩形后立即返回,而不尝试绘制任何内容?我怀疑可能是这样,但在任何地方都找不到确认。的MSDN文档中很少有关于引擎盖下的细节,谷歌搜索到的只是如何使用GDI剪辑


编辑:我突然意识到,我没有指出这是在Windows Mobile上运行的,因此我用于分析的工具集是有限的。

我实际上从书架上拿出了我的Petzold(第二版),并发现,毫不奇怪,剪辑是Windows SDK早期版本中的一个重要功能。当时,出于性能原因,有必要不绘制不可见的对象。我想说的是,GDI剪裁实际上足够聪明,当你在剪裁区域外绘制时,它不会起任何作用。

你可以看到SelectClipRgn()的源代码(Win32 api组,多年前,16或32位)

测试它


附加您喜爱的调试器(Windbg、CDB),并使用跟踪执行路径统计信息。比较::矩形(上下文,0,0,50,50);with::矩形(上下文,0,0,51,51)

我的估计是,它只是在引擎盖下使用一个简单的科恩-萨瑟兰线剪辑,尽管我不确定这一点。但是,如果您有大量屏幕外的数据(不应绘制),则最好使用基于四叉树的更高级别剔除算法,以便在早期阶段将这些对象一起跳过

我很确定SelectClipRgn的源代码不会告诉我实际是如何处理剪辑的,因为剪辑只在我调用Rectangle时发生。还有哪个win32 api组以及大约多少年前是多少年前。