DisplayListRenderer.h revision db8c9a6a4d9bf8c39f834b25611926caf21380f6
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 175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkChunkAlloc.h> 214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkFlattenable.h> 224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkMatrix.h> 23a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#include <SkCamera.h> 244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPaint.h> 254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPath.h> 264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkRefCnt.h> 274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTDArray.h> 284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTSearch.h> 294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 307953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h> 317953745dd565167113f8cbfc461bc0521d32d870Romain Guy 329c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h" 334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "OpenGLRenderer.h" 344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines 404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 426d7475d666baefaa3ba9f0dcee25238739454241Romain Guy#define MIN_WRITER_SIZE 4096 4333f6beb10f98e8ba96250e284876d607055d278dRomain Guy#define OP_MAY_BE_SKIPPED_MASK 0xff000000 444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug 46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST 475baa3a62a97544669fba6d65a11c07f252e654ddSteve Block #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__) 48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else 49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy #define DISPLAY_LIST_LOGD(...) 50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif 51ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 52a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// Set to 1 to enable native processing of View properties. 0 by default. Eventually this 53a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// will go away and we will always use this approach for accelerated apps. 548d56b0e1d24f7392314df4be6503af395a843696Chet Haase#define USE_DISPLAY_LIST_PROPERTIES 1 55a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 56a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define TRANSLATION 0x0001 57a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define ROTATION 0x0002 58a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define ROTATION_3D 0x0004 59a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define SCALE 0x0008 60a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define PIVOT 0x0010 61a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 63b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list 644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 66b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer; 67b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/** 69b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Replays recorded drawing commands. 704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */ 71b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayList { 724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic: 73b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy DisplayList(const DisplayListRenderer& recorder); 747953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API ~DisplayList(); 754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 76ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file 77ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy // when modifying this file 784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy enum Op { 7904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy // Non-drawing operations 802b1847ea60650a9f68372abe860415f18b55081dRomain Guy Save = 0, 814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Restore, 824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy RestoreToCount, 834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SaveLayer, 845b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy SaveLayerAlpha, 854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Translate, 864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Rotate, 874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Scale, 88807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy Skew, 894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetMatrix, 904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ConcatMatrix, 914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ClipRect, 9204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy // Drawing operations 930fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy DrawDisplayList, 946c319ca1275c8db892c39b48fc54864c949f9171Romain Guy DrawLayer, 954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawBitmap, 964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawBitmapMatrix, 974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawBitmapRect, 985a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy DrawBitmapMesh, 994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawPatch, 1004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawColor, 1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawRect, 10201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy DrawRoundRect, 10301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy DrawCircle, 104c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy DrawOval, 1058b2f5267f16c295f12faab810527cd6311997e34Romain Guy DrawArc, 1064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawPath, 1074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawLines, 108ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy DrawPoints, 1094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawText, 110325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy DrawTextOnPath, 111eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy DrawPosText, 1124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ResetShader, 1134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetupShader, 1144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ResetColorFilter, 1154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetupColorFilter, 1164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ResetShadow, 117ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy SetupShadow, 1185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy ResetPaintFilter, 1195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SetupPaintFilter, 120daf98e941e140e8739458126640183b9f296a2abChet Haase DrawGLFunction, 1214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy }; 1224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 12333f6beb10f98e8ba96250e284876d607055d278dRomain Guy // See flags defined in DisplayList.java 12433f6beb10f98e8ba96250e284876d607055d278dRomain Guy enum ReplayFlag { 12533f6beb10f98e8ba96250e284876d607055d278dRomain Guy kReplayFlag_ClipChildren = 0x1 12633f6beb10f98e8ba96250e284876d607055d278dRomain Guy }; 12733f6beb10f98e8ba96250e284876d607055d278dRomain Guy 128ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy static const char* OP_NAMES[]; 129ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 130a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setViewProperties(OpenGLRenderer& renderer, uint32_t width, uint32_t height, 131a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase uint32_t level); 132a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void outputViewProperties(OpenGLRenderer& renderer, char* indent); 133a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 1347953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API size_t getSize(); 135bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy ANDROID_API static void destroyDisplayListDeferred(DisplayList* displayList); 136bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy ANDROID_API static void outputLogBuffer(int fd); 137bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy 138bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false); 13965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 1406554943a1dd6854c0f4976900956e556767b49e1Romain Guy status_t replay(OpenGLRenderer& renderer, uint32_t width, uint32_t height, 141a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase Rect& dirty, int32_t flags, uint32_t level = 0); 142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 143ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase void output(OpenGLRenderer& renderer, uint32_t level = 0); 144ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 14504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy void setRenderable(bool renderable) { 14604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mIsRenderable = renderable; 14704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy } 14804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 14904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy bool isRenderable() const { 15004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy return mIsRenderable; 15104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy } 15204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 15313631f3da855f200a151e7837ed9f6b079622b58Romain Guy void setName(const char* name) { 15413631f3da855f200a151e7837ed9f6b079622b58Romain Guy if (name) { 15513631f3da855f200a151e7837ed9f6b079622b58Romain Guy mName.setTo(name); 15613631f3da855f200a151e7837ed9f6b079622b58Romain Guy } 15713631f3da855f200a151e7837ed9f6b079622b58Romain Guy } 15813631f3da855f200a151e7837ed9f6b079622b58Romain Guy 159a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setClipChildren(bool clipChildren) { 160a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mClipChildren = clipChildren; 161a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 162a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 1639420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase void setStaticMatrix(SkMatrix* matrix) { 1649420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase delete mStaticMatrix; 1659420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix = new SkMatrix(*matrix); 1669420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase } 1679420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase 1689420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase void setAnimationMatrix(SkMatrix* matrix) { 1699420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase delete mAnimationMatrix; 1709420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase if (matrix) { 1719420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mAnimationMatrix = new SkMatrix(*matrix); 1729420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase } else { 1739420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mAnimationMatrix = NULL; 1749420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase } 1759420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase } 1769420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase 177a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setAlpha(float alpha) { 178a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (alpha != mAlpha) { 179a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mAlpha = alpha; 180a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMultipliedAlpha = (int)(255 * alpha); 181a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 182a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 183a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 184db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase void setHasOverlappingRendering(bool hasOverlappingRendering) { 185db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase mHasOverlappingRendering = hasOverlappingRendering; 186db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase } 187db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 188a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setTranslationX(float translationX) { 189a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (translationX != mTranslationX) { 190a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTranslationX = translationX; 191a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 192a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mTranslationX, 0) && ALMOST_EQUAL(mTranslationY, 0)) { 193a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~TRANSLATION; 194a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 195a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= TRANSLATION; 196a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 197a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 198a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 199a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 200a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setTranslationY(float translationY) { 201a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (translationY != mTranslationY) { 202a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTranslationY = translationY; 203a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 204a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mTranslationX, 0) && ALMOST_EQUAL(mTranslationY, 0)) { 205a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~TRANSLATION; 206a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 207a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= TRANSLATION; 208a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 209a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 210a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 211a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 212a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setRotation(float rotation) { 213a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (rotation != mRotation) { 214a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRotation = rotation; 215a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 216a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mRotation, 0)) { 217a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~ROTATION; 218a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 219a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= ROTATION; 220a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 221a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 222a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 223a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 224a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setRotationX(float rotationX) { 225a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (rotationX != mRotationX) { 226a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRotationX = rotationX; 227a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 228a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mRotationX, 0) && ALMOST_EQUAL(mRotationY, 0)) { 229a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~ROTATION_3D; 230a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 231a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= ROTATION_3D; 232a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 233a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 234a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 235a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 236a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setRotationY(float rotationY) { 237a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (rotationY != mRotationY) { 238a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRotationY = rotationY; 239a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 240a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mRotationX, 0) && ALMOST_EQUAL(mRotationY, 0)) { 241a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~ROTATION_3D; 242a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 243a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= ROTATION_3D; 244a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 245a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 246a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 247a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 248a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setScaleX(float scaleX) { 249a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (scaleX != mScaleX) { 250a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mScaleX = scaleX; 251a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 252a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mScaleX, 1) && ALMOST_EQUAL(mScaleY, 1)) { 253a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~SCALE; 254a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 255a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= SCALE; 256a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 257a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 258a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 259a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 260a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setScaleY(float scaleY) { 261a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (scaleY != mScaleY) { 262a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mScaleY = scaleY; 263a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 264a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mScaleX, 1) && ALMOST_EQUAL(mScaleY, 1)) { 265a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~SCALE; 266a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 267a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= SCALE; 268a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 269a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 270a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 271a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 272a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setPivotX(float pivotX) { 273a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotX = pivotX; 274a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 275a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mPivotX, 0) && ALMOST_EQUAL(mPivotY, 0)) { 276a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~PIVOT; 277a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 278a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= PIVOT; 279a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 280a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotExplicitlySet = true; 281a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 282a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 283a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setPivotY(float pivotY) { 284a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotY = pivotY; 285a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 286a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mPivotX, 0) && ALMOST_EQUAL(mPivotY, 0)) { 287a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~PIVOT; 288a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 289a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= PIVOT; 290a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 291a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotExplicitlySet = true; 292a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 293a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 294a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setCameraDistance(float distance) { 295a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (distance != mCameraDistance) { 296a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mCameraDistance = distance; 297a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 298a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (!mTransformCamera) { 299a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera = new Sk3DView(); 300a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix3D = new SkMatrix(); 301a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 302a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->setCameraLocation(0, 0, distance); 303a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 304a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 305a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 306a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setLeft(int left) { 307a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (left != mLeft) { 308a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mLeft = left; 309a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mWidth = mRight - mLeft; 310a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 311a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 312a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 313a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 314a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 315a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 316a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setTop(int top) { 317a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (top != mTop) { 318a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTop = top; 319a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mHeight = mBottom - mTop; 320a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 321a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 322a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 323a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 324a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 325a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 326a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setRight(int right) { 327a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (right != mRight) { 328a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRight = right; 329a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mWidth = mRight - mLeft; 330a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 331a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 332a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 333a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 334a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 335a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 336a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setBottom(int bottom) { 337a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (bottom != mBottom) { 338a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mBottom = bottom; 339a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mHeight = mBottom - mTop; 340a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 341a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 342a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 343a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 344a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 345a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 346a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setLeftTop(int left, int top) { 347a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (left != mLeft || top != mTop) { 348a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mLeft = left; 349a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTop = top; 350a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mWidth = mRight - mLeft; 351a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mHeight = mBottom - mTop; 352a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 353a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 354a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 355a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 356a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 357a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 358a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setLeftTopRightBottom(int left, int top, int right, int bottom) { 359a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (left != mLeft || top != mTop || right != mRight || bottom != mBottom) { 360a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mLeft = left; 361a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTop = top; 362a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRight = right; 363a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mBottom = bottom; 364a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mWidth = mRight - mLeft; 365a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mHeight = mBottom - mTop; 366a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 367a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 368a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 369a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 370a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 371a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 372a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void offsetLeftRight(int offset) { 373a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (offset != 0) { 374a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mLeft += offset; 375a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRight += offset; 376a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 377a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 378a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 379a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 380a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 381a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 382a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void offsetTopBottom(int offset) { 383a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (offset != 0) { 384a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTop += offset; 385a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mBottom += offset; 386a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 387a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 388a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 389a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 390a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 391a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 392a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setCaching(bool caching) { 393a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mCaching = caching; 394a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 395a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 396b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate: 397b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy void init(); 398b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 399a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void initProperties(); 400a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 401d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase void clearResources(); 402d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase 403a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void updateMatrix(); 404a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 405b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy class TextContainer { 406b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy public: 407b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t length() const { 408b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mByteLength; 409b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 410b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 411b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const char* text() const { 412b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return (const char*) mText; 413b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 414b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 415b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t mByteLength; 416b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const char* mText; 417b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy }; 418b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 419b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkBitmap* getBitmap() { 4205c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkBitmap*) getInt(); 4215c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 4225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 4235c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkiaShader* getShader() { 4245c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkiaShader*) getInt(); 425b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 426b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 427ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase SkiaColorFilter* getColorFilter() { 428ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase return (SkiaColorFilter*) getInt(); 429ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase } 430ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase 43133f6beb10f98e8ba96250e284876d607055d278dRomain Guy inline int32_t getIndex() { 432b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mReader.readInt(); 433b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 434b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 43533f6beb10f98e8ba96250e284876d607055d278dRomain Guy inline int32_t getInt() { 436b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mReader.readInt(); 437b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 438b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 4397b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy inline uint32_t getUInt() { 4407b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy return mReader.readU32(); 4417b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy } 4427b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy 443b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkMatrix* getMatrix() { 4445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkMatrix*) getInt(); 445b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 446b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 447b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkPath* getPath() { 4482fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy return (SkPath*) getInt(); 449b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 450b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 4515ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* getPaint(OpenGLRenderer& renderer) { 4525ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy return renderer.filterPaint((SkPaint*) getInt()); 453b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 454b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 4550fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy DisplayList* getDisplayList() { 4560fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy return (DisplayList*) getInt(); 4570fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 4580fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 459b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy inline float getFloat() { 460b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mReader.readScalar(); 461b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 462b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 463b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* getInts(uint32_t& count) { 464b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy count = getInt(); 465b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return (int32_t*) mReader.skip(count * sizeof(int32_t)); 466b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 467b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 4684bb942083a0d4db746adf95349108dd8ef842e32Romain Guy uint32_t* getUInts(int8_t& count) { 4694bb942083a0d4db746adf95349108dd8ef842e32Romain Guy count = getInt(); 4704bb942083a0d4db746adf95349108dd8ef842e32Romain Guy return (uint32_t*) mReader.skip(count * sizeof(uint32_t)); 4714bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 4724bb942083a0d4db746adf95349108dd8ef842e32Romain Guy 47333f6beb10f98e8ba96250e284876d607055d278dRomain Guy float* getFloats(int32_t& count) { 474b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy count = getInt(); 475b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return (float*) mReader.skip(count * sizeof(float)); 476b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 477b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 478b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy void getText(TextContainer* text) { 479b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t length = text->mByteLength = getInt(); 480b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy text->mText = (const char*) mReader.skip(length); 481b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 482b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 4835c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Vector<SkBitmap*> mBitmapResources; 484ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase Vector<SkiaColorFilter*> mFilterResources; 485b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 486d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkPaint*> mPaints; 4872fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy Vector<SkPath*> mPaths; 488d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkMatrix*> mMatrices; 48924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy Vector<SkiaShader*> mShaders; 490d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 491b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mutable SkFlattenableReadBuffer mReader; 49265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 49365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy size_t mSize; 49404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 49504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy bool mIsRenderable; 49613631f3da855f200a151e7837ed9f6b079622b58Romain Guy 49713631f3da855f200a151e7837ed9f6b079622b58Romain Guy String8 mName; 498a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 499a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase // View properties 500a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bool mClipChildren; 501a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float mAlpha; 502a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase int mMultipliedAlpha; 503db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase bool mHasOverlappingRendering; 504a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float mTranslationX, mTranslationY; 505a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float mRotation, mRotationX, mRotationY; 506a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float mScaleX, mScaleY; 507a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float mPivotX, mPivotY; 508a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float mCameraDistance; 509a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase int mLeft, mTop, mRight, mBottom; 510a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase int mWidth, mHeight; 511a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase int mPrevWidth, mPrevHeight; 512a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bool mPivotExplicitlySet; 513a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bool mMatrixDirty; 514a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bool mMatrixIsIdentity; 515a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase uint32_t mMatrixFlags; 516a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase SkMatrix* mTransformMatrix; 517a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase Sk3DView* mTransformCamera; 518a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase SkMatrix* mTransformMatrix3D; 5199420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase SkMatrix* mStaticMatrix; 5209420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase SkMatrix* mAnimationMatrix; 521a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bool mCaching; 522b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}; 523b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 524b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 525b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer 526b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 527b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 528b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/** 529b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback. 530b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */ 531b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer { 532b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic: 5337953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API DisplayListRenderer(); 5347953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual ~DisplayListRenderer(); 535b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 5367953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API DisplayList* getDisplayList(DisplayList* displayList); 5375977baa1fa24125c148a72699b53e62abaf08960Chet Haase 5387953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setViewport(int width, int height); 5397953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque); 5407953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void finish(); 541b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 5426554943a1dd6854c0f4976900956e556767b49e1Romain Guy virtual status_t callDrawGLFunction(Functor *functor, Rect& dirty); 5434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5447953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void interrupt(); 5457953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resume(); 546daf98e941e140e8739458126640183b9f296a2abChet Haase 5477953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int save(int flags); 5487953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void restore(); 5497953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void restoreToCount(int saveCount); 5504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5517953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int saveLayer(float left, float top, float right, float bottom, 5525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* p, int flags); 5537953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int saveLayerAlpha(float left, float top, float right, float bottom, 5545b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy int alpha, int flags); 5554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5567953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void translate(float dx, float dy); 5577953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void rotate(float degrees); 5587953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void scale(float sx, float sy); 5597953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void skew(float sx, float sy); 5604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5617953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setMatrix(SkMatrix* matrix); 5627953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void concatMatrix(SkMatrix* matrix); 5634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5647953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op); 5654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5666554943a1dd6854c0f4976900956e556767b49e1Romain Guy virtual status_t drawDisplayList(DisplayList* displayList, uint32_t width, uint32_t height, 56733f6beb10f98e8ba96250e284876d607055d278dRomain Guy Rect& dirty, int32_t flags, uint32_t level = 0); 5687953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawLayer(Layer* layer, float x, float y, SkPaint* paint); 5697953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint); 5707953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint); 5717953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, 5724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 5735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float dstRight, float dstBottom, SkPaint* paint); 5747953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight, 5755a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy float* vertices, int* colors, SkPaint* paint); 5767953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs, 5774bb942083a0d4db746adf95349108dd8ef842e32Romain Guy const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors, 5785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float left, float top, float right, float bottom, SkPaint* paint); 5797953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawColor(int color, SkXfermode::Mode mode); 5807953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawRect(float left, float top, float right, float bottom, SkPaint* paint); 5817953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawRoundRect(float left, float top, float right, float bottom, 58201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy float rx, float ry, SkPaint* paint); 5837953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawCircle(float x, float y, float radius, SkPaint* paint); 5847953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawOval(float left, float top, float right, float bottom, SkPaint* paint); 5857953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawArc(float left, float top, float right, float bottom, 5868b2f5267f16c295f12faab810527cd6311997e34Romain Guy float startAngle, float sweepAngle, bool useCenter, SkPaint* paint); 5877953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawPath(SkPath* path, SkPaint* paint); 5887953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawLines(float* points, int count, SkPaint* paint); 5897953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawPoints(float* points, int count, SkPaint* paint); 5907953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawText(const char* text, int bytesCount, int count, float x, float y, 591acdd4b9c4b03bc6660274ab878731383adb5bca5Romain Guy SkPaint* paint, float length = -1.0f); 592325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy virtual void drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path, 593325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float hOffset, float vOffset, SkPaint* paint); 594eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions, 595eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy SkPaint* paint); 5964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5977953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resetShader(); 5987953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setupShader(SkiaShader* shader); 5994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 6007953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resetColorFilter(); 6017953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setupColorFilter(SkiaColorFilter* filter); 6024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 6037953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resetShadow(); 6047953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setupShadow(float radius, float dx, float dy, int color); 6054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 6065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy virtual void resetPaintFilter(); 6075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy virtual void setupPaintFilter(int clearBits, int setBits); 6085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 6097953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API void reset(); 6104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 611b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkWriter32& writeStream() const { 612b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mWriter; 613b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 614b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 6155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase const Vector<SkBitmap*>& getBitmapResources() const { 6165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return mBitmapResources; 617b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 618b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 619d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy const Vector<SkiaColorFilter*>& getFilterResources() const { 620d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy return mFilterResources; 621d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 622d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 62324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy const Vector<SkiaShader*>& getShaders() const { 62424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy return mShaders; 625b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 626b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 627d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkPaint*>& getPaints() const { 628d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return mPaints; 6295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 6305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 6312fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy const Vector<SkPath*>& getPaths() const { 6322fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy return mPaths; 6332fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 6342fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 635d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkMatrix*>& getMatrices() const { 636d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return mMatrices; 637b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 638b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 6394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate: 64027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy void insertRestoreToCount() { 64127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy if (mRestoreSaveCount >= 0) { 64227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mWriter.writeInt(DisplayList::RestoreToCount); 64327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy addInt(mRestoreSaveCount); 64427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = -1; 64527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy } 64627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy } 64727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 64833f6beb10f98e8ba96250e284876d607055d278dRomain Guy void insertTranlate() { 64933f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (mHasTranslate) { 65033f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (mTranslateX != 0.0f || mTranslateY != 0.0f) { 65133f6beb10f98e8ba96250e284876d607055d278dRomain Guy mWriter.writeInt(DisplayList::Translate); 65233f6beb10f98e8ba96250e284876d607055d278dRomain Guy addPoint(mTranslateX, mTranslateY); 65333f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateX = mTranslateY = 0.0f; 65433f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 65533f6beb10f98e8ba96250e284876d607055d278dRomain Guy mHasTranslate = false; 65633f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 65733f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 65833f6beb10f98e8ba96250e284876d607055d278dRomain Guy 65933f6beb10f98e8ba96250e284876d607055d278dRomain Guy inline void addOp(const DisplayList::Op drawOp) { 66027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy insertRestoreToCount(); 66133f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 6624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(drawOp); 66304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList; 6644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 6654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 66633f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* addOp(const DisplayList::Op drawOp, const bool reject) { 66733f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertRestoreToCount(); 66833f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 66933f6beb10f98e8ba96250e284876d607055d278dRomain Guy mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList; 67033f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (reject) { 67133f6beb10f98e8ba96250e284876d607055d278dRomain Guy mWriter.writeInt(OP_MAY_BE_SKIPPED_MASK | drawOp); 672ad1daaa87b793af30f3dd67a0f3cd5c0fd6ac0c1Romain Guy mWriter.writeInt(0xdeaddead); 673390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy mBufferSize = mWriter.size(); 674390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy return mWriter.peek32(mBufferSize - sizeof(int32_t)); 67533f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 67633f6beb10f98e8ba96250e284876d607055d278dRomain Guy mWriter.writeInt(drawOp); 67733f6beb10f98e8ba96250e284876d607055d278dRomain Guy return NULL; 67833f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 67933f6beb10f98e8ba96250e284876d607055d278dRomain Guy 68033f6beb10f98e8ba96250e284876d607055d278dRomain Guy inline void addSkip(uint32_t* location) { 68133f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (location) { 682390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy *location = (int32_t) (mWriter.size() - mBufferSize); 68333f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 68433f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 68533f6beb10f98e8ba96250e284876d607055d278dRomain Guy 68633f6beb10f98e8ba96250e284876d607055d278dRomain Guy inline void addInt(int32_t value) { 6874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(value); 6884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 6894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 6907b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy inline void addSize(uint32_t w, uint32_t h) { 6917b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy mWriter.writeInt(w); 6927b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy mWriter.writeInt(h); 6937b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy } 6947b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy 6954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void addInts(const int32_t* values, uint32_t count) { 696b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWriter.writeInt(count); 6974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy for (uint32_t i = 0; i < count; i++) { 6984bb942083a0d4db746adf95349108dd8ef842e32Romain Guy mWriter.writeInt(values[i]); 6994bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 7004bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 7014bb942083a0d4db746adf95349108dd8ef842e32Romain Guy 7024bb942083a0d4db746adf95349108dd8ef842e32Romain Guy void addUInts(const uint32_t* values, int8_t count) { 7034bb942083a0d4db746adf95349108dd8ef842e32Romain Guy mWriter.writeInt(count); 7044bb942083a0d4db746adf95349108dd8ef842e32Romain Guy for (int8_t i = 0; i < count; i++) { 7054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(values[i]); 7064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addFloat(float value) { 7104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(value); 7114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 71333f6beb10f98e8ba96250e284876d607055d278dRomain Guy void addFloats(const float* values, int32_t count) { 714b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWriter.writeInt(count); 71533f6beb10f98e8ba96250e284876d607055d278dRomain Guy for (int32_t i = 0; i < count; i++) { 7164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(values[i]); 7174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addPoint(float x, float y) { 7214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(x); 7224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(y); 7234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addBounds(float left, float top, float right, float bottom) { 7264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(left); 7274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(top); 7284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(right); 7294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(bottom); 7304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addText(const void* text, size_t byteLength) { 7334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(byteLength); 7344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writePad(text, byteLength); 7354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7372fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy inline void addPath(SkPath* path) { 7382fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy if (!path) { 7392fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy addInt((int) NULL); 7402fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy return; 7412fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 7422fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 7432fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy SkPath* pathCopy = mPathMap.valueFor(path); 7442fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) { 745b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy pathCopy = new SkPath(*path); 7464bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy pathCopy->setSourcePath(path); 74796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 74896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mPathMap.replaceValueFor(path, pathCopy); 749b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy mPaths.add(pathCopy); 7504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7512fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 7522fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy addInt((int) pathCopy); 7534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addPaint(SkPaint* paint) { 75624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy if (!paint) { 7570fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) NULL); 758d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return; 759d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 7600fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 76122d418437e44587cb0fba4353515719453269189Romain Guy SkPaint* paintCopy = mPaintMap.valueFor(paint); 762d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) { 763d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase paintCopy = new SkPaint(*paint); 76496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 76596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mPaintMap.replaceValueFor(paint, paintCopy); 766d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaints.add(paintCopy); 767d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 7680fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 7690fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) paintCopy); 7700fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 7710fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 7720fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy inline void addDisplayList(DisplayList* displayList) { 7730fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy // TODO: To be safe, the display list should be ref-counted in the 7740fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy // resources cache, but we rely on the caller (UI toolkit) to 7750fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy // do the right thing for now 7760fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) displayList); 7774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addMatrix(SkMatrix* matrix) { 780d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Copying the matrix is cheap and prevents against the user changing the original 781d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // matrix before the operation that uses it 782f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy SkMatrix* copy = new SkMatrix(*matrix); 783f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy addInt((int) copy); 784f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy mMatrices.add(copy); 7854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7875c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addBitmap(SkBitmap* bitmap) { 788d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Note that this assumes the bitmap is immutable. There are cases this won't handle 789d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // correctly, such as creating the bitmap from scratch, drawing with it, changing its 790d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // contents, and drawing again. The only fix would be to always copy it the first time, 791d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // which doesn't seem worth the extra cycles for this unlikely case. 7920fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) bitmap); 7935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mBitmapResources.add(bitmap); 794d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy Caches::getInstance().resourceCache.incrementRefcount(bitmap); 7955c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 7964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7975c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addShader(SkiaShader* shader) { 79824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy if (!shader) { 79924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy addInt((int) NULL); 80024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy return; 80124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy } 80224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 80324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy SkiaShader* shaderCopy = mShaderMap.valueFor(shader); 80424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy // TODO: We also need to handle generation ID changes in compose shaders 8051f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) { 80624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy shaderCopy = shader->copy(); 80796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 80896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mShaderMap.replaceValueFor(shader, shaderCopy); 8091f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy mShaders.add(shaderCopy); 81043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy Caches::getInstance().resourceCache.incrementRefcount(shaderCopy); 81124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy } 81224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 81324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy addInt((int) shaderCopy); 8144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 8154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 816ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase inline void addColorFilter(SkiaColorFilter* colorFilter) { 8170fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) colorFilter); 818ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase mFilterResources.add(colorFilter); 819d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy Caches::getInstance().resourceCache.incrementRefcount(colorFilter); 820ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase } 821ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase 8225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Vector<SkBitmap*> mBitmapResources; 823ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase Vector<SkiaColorFilter*> mFilterResources; 8244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 825d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkPaint*> mPaints; 8260fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap; 82724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 8282fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy Vector<SkPath*> mPaths; 8292fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy DefaultKeyedVector<SkPath*, SkPath*> mPathMap; 8302fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 83124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy Vector<SkiaShader*> mShaders; 83224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap; 83324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 834d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkMatrix*> mMatrices; 835d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 8364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkWriter32 mWriter; 837390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy uint32_t mBufferSize; 8384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 83927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy int mRestoreSaveCount; 84033f6beb10f98e8ba96250e284876d607055d278dRomain Guy 84133f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateX; 84233f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateY; 84333f6beb10f98e8ba96250e284876d607055d278dRomain Guy bool mHasTranslate; 84433f6beb10f98e8ba96250e284876d607055d278dRomain Guy 84504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy bool mHasDrawOps; 84627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 847b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy friend class DisplayList; 848b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 8494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer 8504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 8514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 8524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 8534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 8545b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 855