mirror of
https://github.com/thunderbrewhq/thunderbrew
synced 2025-04-16 10:04:42 +03:00
fix(screen): build layer visibility rects in correct order
This commit is contained in:
parent
6e48b775aa
commit
7beaf8d992
@ -31,24 +31,14 @@ int32_t OnPaint(const void* a1, void* a2) {
|
|||||||
// return 1;
|
// return 1;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
CILayer* layer;
|
|
||||||
|
|
||||||
CSRgn rgn;
|
CSRgn rgn;
|
||||||
|
|
||||||
SRgnCreate(&rgn.m_handle, 0);
|
SRgnCreate(&rgn.m_handle, 0);
|
||||||
|
|
||||||
RECTF baseRect;
|
RECTF baseRect = { 0.0f, 0.0f, 1.0f, 1.0f };
|
||||||
|
|
||||||
baseRect.left = 0.0f;
|
|
||||||
baseRect.bottom = 0.0f;
|
|
||||||
baseRect.right = 1.0f;
|
|
||||||
baseRect.top = 1.0f;
|
|
||||||
|
|
||||||
SRgnCombineRectf(rgn.m_handle, &baseRect, nullptr, 2);
|
SRgnCombineRectf(rgn.m_handle, &baseRect, nullptr, 2);
|
||||||
|
|
||||||
layer = s_zOrderList.Head();
|
// Walk the layer list backward (highest z-order to lowest) to establish visibility rects
|
||||||
|
for (auto layer = s_zOrderList.Tail(); layer; layer = layer->zorderlink.Prev()) {
|
||||||
while (layer) {
|
|
||||||
SRgnGetBoundingRectf(rgn.m_handle, &layer->visible);
|
SRgnGetBoundingRectf(rgn.m_handle, &layer->visible);
|
||||||
|
|
||||||
layer->visible.left = std::max(layer->visible.left, layer->rect.left);
|
layer->visible.left = std::max(layer->visible.left, layer->rect.left);
|
||||||
@ -59,8 +49,6 @@ int32_t OnPaint(const void* a1, void* a2) {
|
|||||||
if (!(layer->flags & 0x1)) {
|
if (!(layer->flags & 0x1)) {
|
||||||
SRgnCombineRectf(rgn.m_handle, &layer->rect, nullptr, 4);
|
SRgnCombineRectf(rgn.m_handle, &layer->rect, nullptr, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
layer = layer->zorderlink.Next();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SRgnDelete(rgn.m_handle);
|
SRgnDelete(rgn.m_handle);
|
||||||
@ -69,9 +57,8 @@ int32_t OnPaint(const void* a1, void* a2) {
|
|||||||
float minX, maxX, minY, maxY, minZ, maxZ;
|
float minX, maxX, minY, maxY, minZ, maxZ;
|
||||||
GxXformViewport(minX, maxX, minY, maxY, minZ, maxZ);
|
GxXformViewport(minX, maxX, minY, maxY, minZ, maxZ);
|
||||||
|
|
||||||
layer = s_zOrderList.Head();
|
// Walk the layer list forward (lowest z-order to highest) to paint visible layers
|
||||||
|
for (auto layer = s_zOrderList.Head(); layer; layer = layer->zorderlink.Next()) {
|
||||||
while (layer) {
|
|
||||||
if (layer->visible.right > layer->visible.left && layer->visible.top > layer->visible.bottom) {
|
if (layer->visible.right > layer->visible.left && layer->visible.top > layer->visible.bottom) {
|
||||||
if (layer->flags & 0x4) {
|
if (layer->flags & 0x4) {
|
||||||
GxXformSetViewport(
|
GxXformSetViewport(
|
||||||
@ -117,8 +104,6 @@ int32_t OnPaint(const void* a1, void* a2) {
|
|||||||
Screen::s_elapsedSec
|
Screen::s_elapsedSec
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
layer = layer->zorderlink.Next();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore viewport
|
// Restore viewport
|
||||||
|
Loading…
Reference in New Issue
Block a user