DisplayListRenderer.h revision 4aa90573bbf86db0d33a3a790c5dbd0d93b95cfe
14aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/*
24aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Copyright (C) 2010 The Android Open Source Project
34aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
44aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
54aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * you may not use this file except in compliance with the License.
64aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * You may obtain a copy of the License at
74aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
84aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
94aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Unless required by applicable law or agreed to in writing, software
114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * See the License for the specific language governing permissions and
144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * limitations under the License.
154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#ifndef ANDROID_UI_DISPLAY_LIST_RENDERER_H
184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define ANDROID_UI_DISPLAY_LIST_RENDERER_H
194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkChunkAlloc.h>
214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkFlattenable.h>
224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkMatrix.h>
234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPaint.h>
244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPath.h>
254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPictureFlat.h>
264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkRefCnt.h>
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTDArray.h>
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTSearch.h>
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "OpenGLRenderer.h"
314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines
374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define MIN_WRITER_SIZE 16384
404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define HEAP_BLOCK_SIZE 4096
414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Helpers
444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyclass PathHeap: public SkRefCnt {
474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic:
484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    PathHeap(): mHeap(64 * sizeof(SkPath)) {
494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    PathHeap(SkFlattenableReadBuffer& buffer): mHeap(64 * sizeof(SkPath)) {
524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        int count = buffer.readS32();
534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPaths.setCount(count);
554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkPath** ptr = mPaths.begin();
564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkPath* p = (SkPath*) mHeap.allocThrow(count * sizeof(SkPath));
574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (int i = 0; i < count; i++) {
594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            new (p) SkPath;
604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            p->unflatten(buffer);
614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            *ptr++ = p;
624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            p++;
634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    ~PathHeap() {
674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkPath** iter = mPaths.begin();
684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkPath** stop = mPaths.end();
694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        while (iter < stop) {
704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            (*iter)->~SkPath();
714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            iter++;
724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int append(const SkPath& path) {
764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkPath* p = (SkPath*) mHeap.allocThrow(sizeof(SkPath));
774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        new (p) SkPath(path);
784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        *mPaths.append() = p;
794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return mPaths.count();
804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int count() const { return mPaths.count(); }
834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    const SkPath& operator[](int index) const {
854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return *mPaths[index];
864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void flatten(SkFlattenableWriteBuffer& buffer) const {
894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        int count = mPaths.count();
904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        buffer.write32(count);
924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkPath** iter = mPaths.begin();
934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkPath** stop = mPaths.end();
944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        while (iter < stop) {
954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            (*iter)->flatten(buffer);
964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            iter++;
974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkChunkAlloc mHeap;
1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkTDArray<SkPath*> mPaths;
1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy};
1044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
1064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Renderer
1074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
1084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/**
1104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Records drawing commands in a display list for latter playback.
1114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
1124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyclass DisplayListRenderer: public OpenGLRenderer {
1134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic:
1144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    DisplayListRenderer();
1154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    ~DisplayListRenderer();
1164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    enum Op {
1184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        AcquireContext,
1194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ReleaseContext,
1204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Save,
1214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Restore,
1224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        RestoreToCount,
1234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SaveLayer,
1244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SaveLayerAlpha,
1254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Translate,
1264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Rotate,
1274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Scale,
1284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetMatrix,
1294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ConcatMatrix,
1304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ClipRect,
1314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmap,
1324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapMatrix,
1334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapRect,
1344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPatch,
1354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawColor,
1364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawRect,
1374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPath,
1384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawLines,
1394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawText,
1404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShader,
1414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShader,
1424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetColorFilter,
1434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupColorFilter,
1444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShadow,
1454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShadow
1464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
1474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void acquireContext();
1494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void releaseContext();
1504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int save(int flags);
1524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restore();
1534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restoreToCount(int saveCount);
1544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int saveLayer(float left, float top, float right, float bottom,
1564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            const SkPaint* p, int flags);
1574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void translate(float dx, float dy);
1594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void rotate(float degrees);
1604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void scale(float sx, float sy);
1614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setMatrix(SkMatrix* matrix);
1634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void concatMatrix(SkMatrix* matrix);
1644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
1664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawBitmap(SkBitmap* bitmap, float left, float top, const SkPaint* paint);
1684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawBitmap(SkBitmap* bitmap, const SkMatrix* matrix, const SkPaint* paint);
1694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
1704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
1714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float dstRight, float dstBottom, const SkPaint* paint);
1724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
1734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            uint32_t width, uint32_t height, float left, float top, float right, float bottom,
1744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            const SkPaint* paint);
1754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawColor(int color, SkXfermode::Mode mode);
1764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawRect(float left, float top, float right, float bottom, const SkPaint* paint);
1774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPath(SkPath* path, SkPaint* paint);
1784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawLines(float* points, int count, const SkPaint* paint);
1794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint);
1804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShader();
1824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShader(SkiaShader* shader);
1834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetColorFilter();
1854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupColorFilter(SkiaColorFilter* filter);
1864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShadow();
1884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShadow(float radius, float dx, float dy, int color);
1894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void reset();
1914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
1934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addOp(Op drawOp) {
1944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(drawOp);
1954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
1964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addInt(int value) {
1984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(value);
1994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addInts(const int32_t* values, uint32_t count) {
2024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (uint32_t i = 0; i < count; i++) {
2034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeInt(values[i]);
2044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
2054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addFloat(float value) {
2084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(value);
2094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addFloats(const float* values, int count) {
2124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (int i = 0; i < count; i++) {
2134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeScalar(values[i]);
2144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
2154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPoint(float x, float y) {
2184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(x);
2194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(y);
2204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBounds(float left, float top, float right, float bottom) {
2234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(left);
2244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(top);
2254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(right);
2264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(bottom);
2274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addText(const void* text, size_t byteLength) {
2304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(byteLength);
2314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writePad(text, byteLength);
2324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPath(const SkPath* path) {
2354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        if (mPathHeap == NULL) {
2364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mPathHeap = new PathHeap();
2374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
2384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        addInt(mPathHeap->append(*path));
2394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int find(SkTDArray<const SkFlatPaint*>& paints, const SkPaint* paint);
2424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPaint(const SkPaint* paint) {
2444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        addInt(find(mPaints, paint));
2454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int find(SkTDArray<const SkFlatMatrix*>& matrices, const SkMatrix* matrix);
2484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addMatrix(const SkMatrix* matrix) {
2504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        addInt(find(mMatrices, matrix));
2514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int find(SkTDArray<const SkFlatBitmap*>& bitmaps, const SkBitmap& bitmap);
2544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBitmap(const SkBitmap* bitmap) {
2564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        addInt(find(mBitmaps, *bitmap));
2574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkChunkAlloc mHeap;
2604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int mBitmapIndex;
2624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkTDArray<const SkFlatBitmap*> mBitmaps;
2634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int mMatrixIndex;
2654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkTDArray<const SkFlatMatrix*> mMatrices;
2664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int mPaintIndex;
2684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkTDArray<const SkFlatPaint*> mPaints;
2694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    PathHeap* mPathHeap;
2714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkWriter32 mWriter;
2724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkRefCntRecorder mRCRecorder;
2744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkRefCntRecorder mTFRecorder;
2754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
2774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
2794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
2804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#endif // ANDROID_UI_DISPLAY_LIST_RENDERER_H
282