| 839 | } else if (_scaleY > 0.0f && _scaleY != 1.0f) { |
| 840 | clipRect.y /= _scaleY; |
| 841 | clipRect.height /= _scaleY; |
| 842 | } |
| 843 | |
| 844 | if (_scrollState != nullptr) { |
| 845 | _scrollState->resolveClipRect(clipRect); |
| 846 | } |
| 847 | } |
| 848 | } |
| 849 | |
| 850 | changed = setVisibleInViewport(visibleInViewport); |
| 851 | |
| 852 | if (changed) { |
| 853 | if (shouldReceiveVisibilityUpdates()) { |
| 854 | auto* visibilityObserver = _viewNodeTree->getViewNodesVisibilityObserver(); |
| 855 | if (visibilityObserver != nullptr) { |
| 856 | visibilityObserver->onViewNodeVisibilityChanged(_rawId, visibleInViewport); |
| 857 | } |
| 858 | } |
| 859 | } |
| 860 | |
| 861 | if (clipRect != getCalculatedViewport()) { |
| 862 | setCalculatedViewport(clipRect); |
| 863 | // if the viewport changed, we need to re-calculate all viewports for the children. |
| 864 | childrenNeedsUpdate = true; |
| 865 | viewportChanged = true; |
| 866 | changed = true; |
| 867 | |
| 868 | if (shouldReceiveVisibilityUpdates()) { |
| 869 | auto* visibilityObserver = _viewNodeTree->getViewNodesVisibilityObserver(); |
| 870 | if (visibilityObserver != nullptr) { |
| 871 | visibilityObserver->onViewNodeViewportChanged(_rawId, clipRect); |
| 872 | } |
| 873 | } |
| 874 | } |
| 875 | } |
| 876 | |
| 877 | if (childrenNeedsUpdate) { |
| 878 | auto isVisible = isVisibleInViewport(); |
| 879 | |
| 880 | if (_childrenIndexer != nullptr) { |
| 881 | // Use our childrenIndexer if we have one, which will efficiently find the elements which |
| 882 | // have become visible or invisible |
| 883 | auto result = _childrenIndexer->findChildrenVisibility(getCalculatedViewport()); |
| 884 | for (auto* childViewNode : *result.invisibleChildren) { |
| 885 | changed |= |
| 886 | childViewNode->doUpdateVisibility(getCalculatedViewport(), viewportChanged, false, visitedNodes); |
| 887 | } |
| 888 | for (auto* childViewNode : *result.visibleChildren) { |
| 889 | changed |= childViewNode->doUpdateVisibility( |
| 890 | getCalculatedViewport(), viewportChanged, isVisible, visitedNodes); |
| 891 | } |