在 direct2d 中有两种类型的剪辑:与
PushAxisAlignedClip
和 PopAxisAlignedClip
一起使用的轴对齐剪辑和与 PushLayer
和 PopLayer
一起使用的图层剪辑。文档说,每次调用 PushAxisAlignedClip
必须与调用 PopAxisAlignedClip
以及 PushLayer
和 PopLayer
相同,但我没有发现任何关于使用两个剪辑时推送/弹出顺序的信息.
我想做的是保存当前渲染状态,如果矩形没有圆角,使用
PushAxisAlignedClip
推送一些剪辑,如果有任何圆角,则使用PushAxisAlignedClip
,当我完成时,我使用弹出所有剪辑PopAxisAlignedClip
和 PopLayer
.
我想到了两种弹出层的方法:
1- 在每次推送时,我都会存储一个标志以记住它是轴对齐的剪辑还是图层,并在弹出时以相反的顺序迭代标志。这个标志商店的一个很好的例子是
std::vector<bool>
2- 必须计算一个用于对齐的轴剪辑,一个用于图层并在推送时增加。弹出时,我将调用
PopAxisAlignedClip
次对齐的剪辑计数器和 PopLayer
次层计数器。
我问的是第二种方法,因为我不必维护标志状态来跟踪推送层的类型。对齐剪辑的顺序必须保留层的顺序吗?换句话说,我可以使用类似这样的演示代码吗:
render_target->PushAxisAlignedClip(...)
render_target->PushLayer(...)
// some drawing code
render_target->PopAxisAlignedClip(...)
render_target->PopLayer(...)
我刚刚尝试了第二种方法,它给了我来自
HRESULT
的以下EndDraw
错误:0x88990014映射到D2DERR_POP_CALL_DID_NOT_MATCH_PUSH
并且文档解释:
应用程序试图在剪辑位于顶部时从堆栈中弹出图层,或者在图层位于顶部时从堆栈中弹出剪辑。
所以问题的答案是:是的剪辑和层的顺序必须保留