DisplayListRenderer.cpp 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#define LOG_TAG "OpenGLRenderer"
184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h"
204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::DisplayListRenderer():
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mHeap(HEAP_BLOCK_SIZE), mWriter(MIN_WRITER_SIZE) {
304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mBitmapIndex = mMatrixIndex = mPaintIndex = 1;
314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mPathHeap = NULL;
324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (mPathHeap) {
404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap->unref();
414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap = NULL;
424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mBitmaps.reset();
454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mMatrices.reset();
464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mPaints.reset();
474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mHeap.reset();
504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mRCRecorder.reset();
524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mTFRecorder.reset();
534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::acquireContext() {
604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(AcquireContext);
614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::acquireContext();
624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::releaseContext() {
654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(ReleaseContext);
664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::releaseContext();
674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(Save);
714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(Restore);
774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(RestoreToCount);
824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(saveCount);
834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        const SkPaint* p, int flags) {
884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(SaveLayer);
894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::saveLayer(left, top, right, bottom, p, flags);
934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(Translate);
974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(Rotate);
1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
1044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
1054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(Scale);
1094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
1104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
1114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(SetMatrix);
1154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
1164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
1174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(ConcatMatrix);
1214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
1224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
1234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
1264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(ClipRect);
1284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
1294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
1304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
1314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
1344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        const SkPaint* paint) {
1354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(DrawBitmap);
1364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
1374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
1384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::drawBitmap(bitmap, left, top, paint);
1404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, const SkMatrix* matrix,
1434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        const SkPaint* paint) {
1444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(DrawBitmapMatrix);
1454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
1464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
1474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::drawBitmap(bitmap, matrix, paint);
1494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
1524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
1534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float dstRight, float dstBottom, const SkPaint* paint) {
1544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(DrawBitmapRect);
1554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
1564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
1574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
1584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom,
1604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            dstLeft, dstTop, dstRight, dstBottom, paint);
1614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
1644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        uint32_t width, uint32_t height, float left, float top, float right, float bottom,
1654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        const SkPaint* paint) {
1664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(DrawPatch);
1674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
1684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
1694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
1704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
1714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::drawPatch(bitmap, xDivs, yDivs, width, height,
1734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            left, top, right, bottom, paint);
1744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(DrawColor);
1784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
1794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
1804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::drawColor(color, mode);
1814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
1844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        const SkPaint* paint) {
1854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(DrawRect);
1864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
1874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::drawRect(left, top, right, bottom, paint);
1894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
1924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(DrawPath);
1934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
1944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::drawPath(path, paint);
1964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawLines(float* points, int count, const SkPaint* paint) {
1994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(DrawLines);
2004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
2014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
2024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::drawLines(points, count, paint);
2034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
2064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float x, float y, SkPaint* paint) {
2074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(DrawText);
2084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addText(text, bytesCount);
2094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(count);
2104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(x, y);
2114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
2124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::drawText(text, bytesCount, count, x, y, paint);
2134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
2164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(ResetShader);
2174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::resetShader();
2184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
2214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    // TODO: Implement
2224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setupShader(shader);
2234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
2264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(ResetColorFilter);
2274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::resetColorFilter();
2284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
2314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    // TODO: Implement
2324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setupColorFilter(filter);
2334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
2364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(ResetShadow);
2374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::resetShadow();
2384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
2414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addOp(SetupShadow);
2424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
2434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
2444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
2454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setupShadow(radius, dx, dy, color);
2464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
2494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Recording management
2504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
2514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::find(SkTDArray<const SkFlatPaint*>& paints, const SkPaint* paint) {
2534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (paint == NULL) {
2544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return 0;
2554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkFlatPaint* flat = SkFlatPaint::Flatten(&mHeap, *paint, mPaintIndex,
2584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            &mRCRecorder, &mTFRecorder);
2594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int index = SkTSearch<SkFlatData>((const SkFlatData**) paints.begin(),
2604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            paints.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare);
2614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (index >= 0) {
2624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        (void) mHeap.unalloc(flat);
2634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return paints[index]->index();
2644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    index = ~index;
2674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    *paints.insert(index) = flat;
2684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return mPaintIndex++;
2694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::find(SkTDArray<const SkFlatMatrix*>& matrices, const SkMatrix* matrix) {
2724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (matrix == NULL) {
2734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return 0;
2744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkFlatMatrix* flat = SkFlatMatrix::Flatten(&mHeap, *matrix, mMatrixIndex);
2774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int index = SkTSearch<SkFlatData>((const SkFlatData**) matrices.begin(),
2784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            matrices.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare);
2794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (index >= 0) {
2804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        (void) mHeap.unalloc(flat);
2814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return matrices[index]->index();
2824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    index = ~index;
2844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    *matrices.insert(index) = flat;
2854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return mMatrixIndex++;
2864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::find(SkTDArray<const SkFlatBitmap*>& bitmaps, const SkBitmap& bitmap) {
2894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkFlatBitmap* flat = SkFlatBitmap::Flatten(&mHeap, bitmap, mBitmapIndex, &mRCRecorder);
2904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int index = SkTSearch<SkFlatData>((const SkFlatData**) bitmaps.begin(),
2914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            bitmaps.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare);
2924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (index >= 0) {
2934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        (void) mHeap.unalloc(flat);
2944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return bitmaps[index]->index();
2954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    index = ~index;
2974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    *bitmaps.insert(index) = flat;
2984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return mBitmapIndex++;
2994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
3024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
303