/* * 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 <SkCamera.h> #include <SkDrawable.h> #include <SkMatrix.h> #include <private/hwui/DrawGlInfo.h> #include <utils/KeyedVector.h> #include <utils/LinearAllocator.h> #include <utils/RefBase.h> #include <utils/SortedVector.h> #include <utils/String8.h> #include <cutils/compiler.h> #include <androidfw/ResourceTypes.h> #include "Debug.h" #include "CanvasProperty.h" #include "GlFunctorLifecycleListener.h" #include "Matrix.h" #include "RenderProperties.h" #include "TreeInfo.h" #include "hwui/Bitmap.h" #include <vector> 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<Chunk>& getChunks() const { return chunks; } const LsaVector<BaseOpType*>& getOps() const { return ops; } const LsaVector<NodeOpType*>& getChildren() const { return children; } const LsaVector<sk_sp<Bitmap>>& 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<void(RenderNode*)> updateFn); virtual bool prepareListAndChildren(TreeObserver& observer, TreeInfo& info, bool functorsNeedLayer, std::function<void(RenderNode*, TreeObserver&, TreeInfo&, bool)> childFn); virtual void output(std::ostream& output, uint32_t level); protected: // allocator into which all ops and LsaVector arrays allocated LinearAllocator allocator; LinearStdAllocator<void*> stdAllocator; private: LsaVector<Chunk> chunks; LsaVector<BaseOpType*> ops; // list of Ops referring to RenderNode children for quick, non-drawing traversal LsaVector<NodeOpType*> children; // Resources - Skia objects + 9 patches referred to by this DisplayList LsaVector<sk_sp<Bitmap>> bitmapResources; LsaVector<const SkPath*> pathResources; LsaVector<const Res_png_9patch*> patchResources; LsaVector<std::unique_ptr<const SkPaint>> paints; LsaVector<std::unique_ptr<const SkRegion>> regions; LsaVector< sp<VirtualLightRefBase> > referenceHolders; // List of functors LsaVector<FunctorContainer> 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<VectorDrawableRoot*> vectorDrawables; void cleanupResources(); }; }; // namespace uirenderer }; // namespace android