DisplayListRenderer.h revision c1cd9ba335b293f11e1082447ef08e474710a05f
12bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber/*
22bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Copyright (C) 2010 The Android Open Source Project
32bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber *
42bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
52bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * you may not use this file except in compliance with the License.
62bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * You may obtain a copy of the License at
72bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber *
82bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
92bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber *
102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Unless required by applicable law or agreed to in writing, software
112bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
122bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * See the License for the specific language governing permissions and
142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * limitations under the License.
152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber */
162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#ifndef ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
182bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#define ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
192bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
202bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkChunkAlloc.h>
212bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkFlattenable.h>
222bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkMatrix.h>
232bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkPaint.h>
242bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkPath.h>
252bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkPictureFlat.h>
262bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkRefCnt.h>
272bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkTDArray.h>
282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkTSearch.h>
292bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
302bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include "OpenGLRenderer.h"
312bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
322bfdd428c56c7524d1a11979f200a1762866032dAndreas Hubernamespace android {
332bfdd428c56c7524d1a11979f200a1762866032dAndreas Hubernamespace uirenderer {
342bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
352bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber///////////////////////////////////////////////////////////////////////////////
362bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber// Defines
372bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber///////////////////////////////////////////////////////////////////////////////
382bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
392bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#define MIN_WRITER_SIZE 16384
402bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#define HEAP_BLOCK_SIZE 4096
41ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber
42bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber// Debug
43ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber#if DEBUG_DISPLAY_LIST
442bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    #define DISPLAY_LIST_LOGD(...) LOGD(__VA_ARGS__)
452bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#else
462bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    #define DISPLAY_LIST_LOGD(...)
472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#endif
482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber///////////////////////////////////////////////////////////////////////////////
502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber// Helpers
512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber///////////////////////////////////////////////////////////////////////////////
522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberclass PathHeap: public SkRefCnt {
542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberpublic:
552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    PathHeap();
562bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    PathHeap(SkFlattenableReadBuffer& buffer);
572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    ~PathHeap();
582bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
592bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    int append(const SkPath& path);
602bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
612bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    int count() const { return mPaths.count(); }
622bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    SkPath& operator[](int index) const {
642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return *mPaths[index];
652bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
662bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void flatten(SkFlattenableWriteBuffer& buffer) const;
682bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
692bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberprivate:
702bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    SkChunkAlloc mHeap;
712bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    SkTDArray<SkPath*> mPaths;
722bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber};
732bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
742bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber///////////////////////////////////////////////////////////////////////////////
752bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber// Display list
762bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber///////////////////////////////////////////////////////////////////////////////
772bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
782bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberclass DisplayListRenderer;
792bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
802bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber/**
812bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Replays recorded drawing commands.
822bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber */
832bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberclass DisplayList {
842bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberpublic:
852bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    DisplayList(const DisplayListRenderer& recorder);
862bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    ~DisplayList();
872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
882bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file
892bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    //            when modifying this file
902bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    enum Op {
912bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        AcquireContext = 0,
922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        ReleaseContext,
932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        Save,
942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        Restore,
952bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        RestoreToCount,
962bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        SaveLayer,
972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        SaveLayerAlpha,
98840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        Translate,
992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        Rotate,
1002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        Scale,
1012bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        Skew,
1022bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        SetMatrix,
1032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        ConcatMatrix,
1042bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        ClipRect,
1052bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        DrawDisplayList,
1062bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        DrawLayer,
1072bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        DrawBitmap,
108bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        DrawBitmapMatrix,
109bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        DrawBitmapRect,
110bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        DrawBitmapMesh,
111bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        DrawPatch,
112bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        DrawColor,
113bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        DrawRect,
114bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        DrawRoundRect,
115bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        DrawCircle,
116bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        DrawOval,
117bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        DrawPath,
118bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        DrawLines,
119bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        DrawText,
120bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        ResetShader,
121bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        SetupShader,
122bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        ResetColorFilter,
123bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        SetupColorFilter,
124bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        ResetShadow,
125bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        SetupShadow,
126bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    };
127bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
128bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    static const char* OP_NAMES[];
129bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
130bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    void initFromDisplayListRenderer(const DisplayListRenderer& recorder);
131bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
132bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    void replay(OpenGLRenderer& renderer, uint32_t level = 0);
133bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
134bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huberprivate:
135bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    void init();
136bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
1372bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    class TextContainer {
1382bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    public:
139bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        size_t length() const {
140bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber            return mByteLength;
141bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        }
142bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
143bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        const char* text() const {
144bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber            return (const char*) mText;
145bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        }
146bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
1472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        size_t mByteLength;
1482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        const char* mText;
1492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    };
1502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    SkBitmap* getBitmap() {
1522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return (SkBitmap*) getInt();
1532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    SkiaShader* getShader() {
1562bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return (SkiaShader*) getInt();
1572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1582bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1592bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    SkiaColorFilter* getColorFilter() {
1602bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return (SkiaColorFilter*) getInt();
1612bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1622bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    inline int getIndex() {
1642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return mReader.readInt();
1652bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1662bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    inline int getInt() {
1682bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return mReader.readInt();
1692bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1702bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1712bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    SkMatrix* getMatrix() {
1722bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return (SkMatrix*) getInt();
1732bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1742bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1752bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    SkPath* getPath() {
1762bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return &(*mPathHeap)[getInt() - 1];
1772bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1782bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1792bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    SkPaint* getPaint() {
1802bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return (SkPaint*) getInt();
1812bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1822bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1832bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    DisplayList* getDisplayList() {
1842bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return (DisplayList*) getInt();
1852bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1862bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    inline float getFloat() {
188ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber        return mReader.readScalar();
189ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber    }
190ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber
191ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber    int32_t* getInts(uint32_t& count) {
192ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber        count = getInt();
193ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber        return (int32_t*) mReader.skip(count * sizeof(int32_t));
194ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber    }
195ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber
196ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber    uint32_t* getUInts(int8_t& count) {
1972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        count = getInt();
198ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber        return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
1992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
2002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2012bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    float* getFloats(int& count) {
2022bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        count = getInt();
2032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return (float*) mReader.skip(count * sizeof(float));
2042bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
2052bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2062bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void getText(TextContainer* text) {
2072bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        size_t length = text->mByteLength = getInt();
2082bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        text->mText = (const char*) mReader.skip(length);
2092bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
2102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2112bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    PathHeap* mPathHeap;
2122bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    Vector<SkBitmap*> mBitmapResources;
2142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    Vector<SkiaColorFilter*> mFilterResources;
2152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    Vector<SkPaint*> mPaints;
217ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber    Vector<SkMatrix*> mMatrices;
218ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber    Vector<SkiaShader*> mShaders;
219ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber
220ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber    mutable SkFlattenableReadBuffer mReader;
221ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber
222ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber    SkRefCntPlayback mRCPlayback;
223ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber    SkTypefacePlayback mTFPlayback;
224ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber};
225ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber
226ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber///////////////////////////////////////////////////////////////////////////////
227ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber// Renderer
228ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber///////////////////////////////////////////////////////////////////////////////
229ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber
230ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber/**
2312bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Records drawing commands in a display list for latter playback.
2322bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber */
2332bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberclass DisplayListRenderer: public OpenGLRenderer {
2342bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberpublic:
2352bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    DisplayListRenderer();
2362bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    ~DisplayListRenderer();
2372bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2382bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    DisplayList* getDisplayList();
2392bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2402bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void setViewport(int width, int height);
2412bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void prepare(bool opaque);
2422bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void finish();
2432bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2442bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void acquireContext();
2452bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void releaseContext();
2462bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    int save(int flags);
2482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void restore();
2492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void restoreToCount(int saveCount);
250bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
2512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    int saveLayer(float left, float top, float right, float bottom,
2522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            SkPaint* p, int flags);
2532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    int saveLayerAlpha(float left, float top, float right, float bottom,
2542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                int alpha, int flags);
2552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2562bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void translate(float dx, float dy);
2572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void rotate(float degrees);
2582bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void scale(float sx, float sy);
2592bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void skew(float sx, float sy);
2602d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber
2612d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    void setMatrix(SkMatrix* matrix);
2622bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void concatMatrix(SkMatrix* matrix);
2632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
2652bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
266df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    void drawDisplayList(DisplayList* displayList, uint32_t level = 0);
2672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
2682bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
2692bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
2701906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber    void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
2711906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber            float srcRight, float srcBottom, float dstLeft, float dstTop,
2721906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber            float dstRight, float dstBottom, SkPaint* paint);
2732bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
2742bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            float* vertices, int* colors, SkPaint* paint);
2752bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
2762bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
2771906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber            float left, float top, float right, float bottom, SkPaint* paint);
2781906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber    void drawColor(int color, SkXfermode::Mode mode);
279c9d1696d214d2175327067ccc1991bcb36976404Andreas Huber    void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
280c9d1696d214d2175327067ccc1991bcb36976404Andreas Huber    void drawRoundRect(float left, float top, float right, float bottom,
281c9d1696d214d2175327067ccc1991bcb36976404Andreas Huber            float rx, float ry, SkPaint* paint);
2821906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber    void drawCircle(float x, float y, float radius, SkPaint* paint);
2831906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber    void drawOval(float left, float top, float right, float bottom, SkPaint* paint);
2842bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void drawPath(SkPath* path, SkPaint* paint);
2851906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber    void drawLines(float* points, int count, SkPaint* paint);
2861906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber    void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint);
2872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2881906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber    void resetShader();
2892bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void setupShader(SkiaShader* shader);
2902bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2912bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void resetColorFilter();
2922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void setupColorFilter(SkiaColorFilter* filter);
2932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void resetShadow();
2952bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void setupShadow(float radius, float dx, float dy, int color);
2962bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void reset();
2982bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    const SkWriter32& writeStream() const {
3002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return mWriter;
3012bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3022bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    const Vector<SkBitmap*>& getBitmapResources() const {
3042bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return mBitmapResources;
3052bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3062bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3072bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    const Vector<SkiaShader*>& getShaders() const {
3082bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return mShaders;
3092bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3112bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    const Vector<SkPaint*>& getPaints() const {
3122bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return mPaints;
3132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    const Vector<SkMatrix*>& getMatrices() const {
3162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return mMatrices;
3172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3182bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3192bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    const Vector<SkiaColorFilter*>& getFilterResources() const {
3202bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return mFilterResources;
3212bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3222bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3232bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberprivate:
3242bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void insertRestoreToCount() {
3252bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        if (mRestoreSaveCount >= 0) {
3262bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            mWriter.writeInt(DisplayList::RestoreToCount);
3272bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            addInt(mRestoreSaveCount);
3282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            mRestoreSaveCount = -1;
3292bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        }
3302bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3312bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3322bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    inline void addOp(DisplayList::Op drawOp) {
3332bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        insertRestoreToCount();
3342bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mWriter.writeInt(drawOp);
3352bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3362bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3372bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    inline void addInt(int value) {
3382bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mWriter.writeInt(value);
3392bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3402bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3412bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void addInts(const int32_t* values, uint32_t count) {
3422bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mWriter.writeInt(count);
3432bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        for (uint32_t i = 0; i < count; i++) {
3442bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            mWriter.writeInt(values[i]);
3452bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        }
3461906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber    }
3472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void addUInts(const uint32_t* values, int8_t count) {
3492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mWriter.writeInt(count);
3502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        for (int8_t i = 0; i < count; i++) {
3512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            mWriter.writeInt(values[i]);
3522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        }
3532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    inline void addFloat(float value) {
3562bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mWriter.writeScalar(value);
3572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3582bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3592bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void addFloats(const float* values, int count) {
3602bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mWriter.writeInt(count);
3612bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        for (int i = 0; i < count; i++) {
3622bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            mWriter.writeScalar(values[i]);
3632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        }
3642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3652bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3662bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    inline void addPoint(float x, float y) {
3672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mWriter.writeScalar(x);
3682bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mWriter.writeScalar(y);
3692bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3702bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3712bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    inline void addBounds(float left, float top, float right, float bottom) {
3722bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mWriter.writeScalar(left);
3732bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mWriter.writeScalar(top);
3741906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber        mWriter.writeScalar(right);
3752bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mWriter.writeScalar(bottom);
3762bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3772bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3782bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    inline void addText(const void* text, size_t byteLength) {
3792bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mWriter.writeInt(byteLength);
3802bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mWriter.writePad(text, byteLength);
3812bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3822bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3832bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    inline void addPath(const SkPath* path) {
3842bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        if (mPathHeap == NULL) {
3852bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            mPathHeap = new PathHeap();
3862bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        }
3872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        addInt(mPathHeap->append(*path));
3882bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3892bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3902bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    inline void addPaint(SkPaint* paint) {
3912bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        if (!paint) {
3922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            addInt((int) NULL);
3932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            return;
3942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        }
3952bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3962bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        SkPaint* paintCopy =  mPaintMap.valueFor(paint);
3972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
3982bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            paintCopy = new SkPaint(*paint);
3992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            mPaintMap.add(paint, paintCopy);
4002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            mPaints.add(paintCopy);
4012bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        }
4022bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
4032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        addInt((int) paintCopy);
4042bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
4052bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
4062bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    inline void addDisplayList(DisplayList* displayList) {
4072bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        // TODO: To be safe, the display list should be ref-counted in the
4082bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        //       resources cache, but we rely on the caller (UI toolkit) to
4092bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        //       do the right thing for now
4102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        addInt((int) displayList);
4112bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
4122bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
4132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    inline void addMatrix(SkMatrix* matrix) {
4142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        // Copying the matrix is cheap and prevents against the user changing the original
4152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        // matrix before the operation that uses it
4162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        addInt((int) new SkMatrix(*matrix));
4172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
4182bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
4192bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    inline void addBitmap(SkBitmap* bitmap) {
4202bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        // Note that this assumes the bitmap is immutable. There are cases this won't handle
4212bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
422        // contents, and drawing again. The only fix would be to always copy it the first time,
423        // which doesn't seem worth the extra cycles for this unlikely case.
424        addInt((int) bitmap);
425        mBitmapResources.add(bitmap);
426        Caches& caches = Caches::getInstance();
427        caches.resourceCache.incrementRefcount(bitmap);
428    }
429
430    inline void addShader(SkiaShader* shader) {
431        if (!shader) {
432            addInt((int) NULL);
433            return;
434        }
435
436        SkiaShader* shaderCopy = mShaderMap.valueFor(shader);
437        // TODO: We also need to handle generation ID changes in compose shaders
438        if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) {
439            shaderCopy = shader->copy();
440            mShaderMap.add(shader, shaderCopy);
441            mShaders.add(shaderCopy);
442            Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
443        }
444
445        addInt((int) shaderCopy);
446    }
447
448    inline void addColorFilter(SkiaColorFilter* colorFilter) {
449        addInt((int) colorFilter);
450        mFilterResources.add(colorFilter);
451        Caches& caches = Caches::getInstance();
452        caches.resourceCache.incrementRefcount(colorFilter);
453    }
454
455    SkChunkAlloc mHeap;
456
457    Vector<SkBitmap*> mBitmapResources;
458    Vector<SkiaColorFilter*> mFilterResources;
459
460    Vector<SkPaint*> mPaints;
461    DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
462
463    Vector<SkiaShader*> mShaders;
464    DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap;
465
466    Vector<SkMatrix*> mMatrices;
467
468    PathHeap* mPathHeap;
469    SkWriter32 mWriter;
470
471    SkRefCntRecorder mRCRecorder;
472    SkRefCntRecorder mTFRecorder;
473
474    DisplayList *mDisplayList;
475
476    int mRestoreSaveCount;
477
478    friend class DisplayList;
479
480}; // class DisplayListRenderer
481
482}; // namespace uirenderer
483}; // namespace android
484
485#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
486