/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include <layerproto/LayerProtoHeader.h> #include <gui/LayerMetadata.h> #include <math/vec4.h> #include <memory> #include <unordered_map> #include <vector> namespace android { namespace surfaceflinger { class LayerProtoParser { public: class ActiveBuffer { public: uint32_t width; uint32_t height; uint32_t stride; int32_t format; std::string to_string() const; }; class Transform { public: float dsdx; float dtdx; float dsdy; float dtdy; std::string to_string() const; }; class Rect { public: int32_t left; int32_t top; int32_t right; int32_t bottom; std::string to_string() const; }; class FloatRect { public: float left; float top; float right; float bottom; std::string to_string() const; }; class Region { public: uint64_t id; std::vector<Rect> rects; std::string to_string(const char* what) const; }; class Layer { public: int32_t id; std::string name; std::vector<Layer*> children; std::vector<Layer*> relatives; std::string type; LayerProtoParser::Region transparentRegion; LayerProtoParser::Region visibleRegion; LayerProtoParser::Region damageRegion; uint32_t layerStack; int32_t z; float2 position; float2 requestedPosition; int2 size; LayerProtoParser::Rect crop; bool isOpaque; bool invalidate; std::string dataspace; std::string pixelFormat; half4 color; half4 requestedColor; uint32_t flags; Transform transform; Transform requestedTransform; Layer* parent = 0; Layer* zOrderRelativeOf = 0; LayerProtoParser::ActiveBuffer activeBuffer; Transform bufferTransform; int32_t queuedFrames; bool refreshPending; LayerProtoParser::Rect hwcFrame; LayerProtoParser::FloatRect hwcCrop; int32_t hwcTransform; int32_t hwcCompositionType; bool isProtected; float cornerRadius; LayerMetadata metadata; std::string to_string() const; }; class LayerGlobal { public: int2 resolution; std::string colorMode; std::string colorTransform; int32_t globalTransform; }; class LayerTree { public: // all layers in LayersProto and in the original order std::vector<Layer> allLayers; // pointers to top-level layers in allLayers std::vector<Layer*> topLevelLayers; }; static const LayerGlobal generateLayerGlobalInfo(const LayersProto& layersProto); static LayerTree generateLayerTree(const LayersProto& layersProto); static std::string layerTreeToString(const LayerTree& layerTree); private: static std::vector<Layer> generateLayerList(const LayersProto& layersProto); static LayerProtoParser::Layer generateLayer(const LayerProto& layerProto); static LayerProtoParser::Region generateRegion(const RegionProto& regionProto); static LayerProtoParser::Rect generateRect(const RectProto& rectProto); static LayerProtoParser::FloatRect generateFloatRect(const FloatRectProto& rectProto); static LayerProtoParser::Transform generateTransform(const TransformProto& transformProto); static LayerProtoParser::ActiveBuffer generateActiveBuffer( const ActiveBufferProto& activeBufferProto); static void updateChildrenAndRelative(const LayerProto& layerProto, std::unordered_map<int32_t, Layer*>& layerMap); static std::string layerToString(const LayerProtoParser::Layer* layer); }; } // namespace surfaceflinger } // namespace android