direct2d push/pop 轴对齐剪辑的顺序是否应该与 push/pop 层一起保留

问题描述 投票:0回答:1

在 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(...)
c++ winapi direct2d
1个回答
0
投票

我刚刚尝试了第二种方法,它给了我来自

HRESULT
的以下
EndDraw
错误:0x88990014映射到
D2DERR_POP_CALL_DID_NOT_MATCH_PUSH
并且文档解释:

应用程序试图在剪辑位于顶部时从堆栈中弹出图层,或者在图层位于顶部时从堆栈中弹出剪辑。

所以问题的答案是:是的剪辑和层的顺序必须保留

© www.soinside.com 2019 - 2024. All rights reserved.