/* * Copyright (C) 2013 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 #include #include #include #include #include #include #include #include #include #include #include "Debug.h" #include "CanvasProperty.h" #include "GlFunctorLifecycleListener.h" #include "Matrix.h" #include "RenderProperties.h" #include "TreeInfo.h" #include "hwui/Bitmap.h" #include class SkBitmap; class SkPaint; class SkPath; class SkRegion; namespace android { namespace uirenderer { class Rect; class Layer; struct RecordedOp; struct RenderNodeOp; typedef RecordedOp BaseOpType; typedef RenderNodeOp NodeOpType; namespace VectorDrawable { class Tree; }; typedef uirenderer::VectorDrawable::Tree VectorDrawableRoot; struct FunctorContainer { Functor* functor; GlFunctorLifecycleListener* listener; }; /** * Data structure that holds the list of commands used in display list stream */ class DisplayList { friend class RecordingCanvas; public: struct Chunk { // range of included ops in DisplayList::ops() size_t beginOpIndex; size_t endOpIndex; // range of included children in DisplayList::children() size_t beginChildIndex; size_t endChildIndex; // whether children with non-zero Z in the chunk should be reordered bool reorderChildren; // clip at the beginning of a reorder section, applied to reordered children const ClipBase* reorderClip; }; DisplayList(); virtual ~DisplayList(); // index of DisplayListOp restore, after which projected descendants should be drawn int projectionReceiveIndex; const LsaVector& getChunks() const { return chunks; } const LsaVector& getOps() const { return ops; } const LsaVector& getChildren() const { return children; } const LsaVector>& getBitmapResources() const { return bitmapResources; } size_t addChild(NodeOpType* childOp); void ref(VirtualLightRefBase* prop) { referenceHolders.push_back(prop); } size_t getUsedSize() { return allocator.usedSize(); } virtual bool isEmpty() const { return ops.empty(); } virtual bool hasFunctor() const { return !functors.empty(); } virtual bool hasVectorDrawables() const { return !vectorDrawables.empty(); } virtual bool isSkiaDL() const { return false; } virtual bool reuseDisplayList(RenderNode* node, renderthread::CanvasContext* context) { return false; } virtual void syncContents(); virtual void updateChildren(std::function updateFn); virtual bool prepareListAndChildren(TreeObserver& observer, TreeInfo& info, bool functorsNeedLayer, std::function childFn); virtual void output(std::ostream& output, uint32_t level); protected: // allocator into which all ops and LsaVector arrays allocated LinearAllocator allocator; LinearStdAllocator stdAllocator; private: LsaVector chunks; LsaVector ops; // list of Ops referring to RenderNode children for quick, non-drawing traversal LsaVector children; // Resources - Skia objects + 9 patches referred to by this DisplayList LsaVector> bitmapResources; LsaVector pathResources; LsaVector patchResources; LsaVector> paints; LsaVector> regions; LsaVector< sp > referenceHolders; // List of functors LsaVector functors; // List of VectorDrawables that need to be notified of pushStaging. Note that this list gets nothing // but a callback during sync DisplayList, unlike the list of functors defined above, which // gets special treatment exclusive for webview. LsaVector vectorDrawables; void cleanupResources(); }; }; // namespace uirenderer }; // namespace android