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