12047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr/* 22047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr * Copyright (C) 2016 The Android Open Source Project 32047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr * 42047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr * Licensed under the Apache License, Version 2.0 (the "License"); 52047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr * you may not use this file except in compliance with the License. 62047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr * You may obtain a copy of the License at 72047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr * 82047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr * http://www.apache.org/licenses/LICENSE-2.0 92047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr * 102047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr * Unless required by applicable law or agreed to in writing, software 112047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr * distributed under the License is distributed on an "AS IS" BASIS, 122047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr * See the License for the specific language governing permissions and 142047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr * limitations under the License. 152047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr */ 162047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr 172047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr#include "LayerVector.h" 182047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr#include "Layer.h" 192047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr 202047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carrnamespace android { 21412903fce3a93f411c85c54375a1851bfb370400Dan Stoza 22412903fce3a93f411c85c54375a1851bfb370400Dan StozaLayerVector::LayerVector() = default; 23412903fce3a93f411c85c54375a1851bfb370400Dan Stoza 242047fae0cfed99c425dc7333f31d309e5b8ee1baRobert CarrLayerVector::LayerVector(const LayerVector& rhs) : SortedVector<sp<Layer>>(rhs) { 252047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr} 262047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr 27412903fce3a93f411c85c54375a1851bfb370400Dan StozaLayerVector::~LayerVector() = default; 28412903fce3a93f411c85c54375a1851bfb370400Dan Stoza 292047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carrint LayerVector::do_compare(const void* lhs, const void* rhs) const 302047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr{ 312047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr // sort layers per layer-stack, then by z-order and finally by sequence 322047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr const auto& l = *reinterpret_cast<const sp<Layer>*>(lhs); 332047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr const auto& r = *reinterpret_cast<const sp<Layer>*>(rhs); 342047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr 352047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr uint32_t ls = l->getCurrentState().layerStack; 362047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr uint32_t rs = r->getCurrentState().layerStack; 372047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr if (ls != rs) 382047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr return ls - rs; 392047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr 402047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr uint32_t lz = l->getCurrentState().z; 412047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr uint32_t rz = r->getCurrentState().z; 422047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr if (lz != rz) 432047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr return lz - rz; 442047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr 452047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr return l->sequence - r->sequence; 462047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr} 472047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr 48412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid LayerVector::traverseInZOrder(StateSet stateSet, const Visitor& visitor) const { 491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (size_t i = 0; i < size(); i++) { 50db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& layer = (*this)[i]; 51412903fce3a93f411c85c54375a1851bfb370400Dan Stoza auto& state = (stateSet == StateSet::Current) ? layer->getCurrentState() 52412903fce3a93f411c85c54375a1851bfb370400Dan Stoza : layer->getDrawingState(); 53412903fce3a93f411c85c54375a1851bfb370400Dan Stoza if (state.zOrderRelativeOf != nullptr) { 54db66e627ad8904491e384c64f82fc77a939b9705Robert Carr continue; 55db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 56412903fce3a93f411c85c54375a1851bfb370400Dan Stoza layer->traverseInZOrder(stateSet, visitor); 572047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr } 582047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr} 592047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr 60412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid LayerVector::traverseInReverseZOrder(StateSet stateSet, const Visitor& visitor) const { 612047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr for (auto i = static_cast<int64_t>(size()) - 1; i >= 0; i--) { 62db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& layer = (*this)[i]; 63412903fce3a93f411c85c54375a1851bfb370400Dan Stoza auto& state = (stateSet == StateSet::Current) ? layer->getCurrentState() 64412903fce3a93f411c85c54375a1851bfb370400Dan Stoza : layer->getDrawingState(); 65412903fce3a93f411c85c54375a1851bfb370400Dan Stoza if (state.zOrderRelativeOf != nullptr) { 66db66e627ad8904491e384c64f82fc77a939b9705Robert Carr continue; 67db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 68412903fce3a93f411c85c54375a1851bfb370400Dan Stoza layer->traverseInReverseZOrder(stateSet, visitor); 692047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr } 702047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr} 712047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr} // namespace android 72