DisplayListRenderer.h revision d34dd71800d9a1077e58c3b7f2511c46848da417
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#define TRANSLATION 0x0001 53a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define ROTATION 0x0002 54a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define ROTATION_3D 0x0004 55a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define SCALE 0x0008 56a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define PIVOT 0x0010 57a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 59b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list 604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 62b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer; 63b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/** 65b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Replays recorded drawing commands. 664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */ 67b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayList { 684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic: 69b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy DisplayList(const DisplayListRenderer& recorder); 707953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API ~DisplayList(); 714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 72ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file 73ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy // when modifying this file 744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy enum Op { 7504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy // Non-drawing operations 762b1847ea60650a9f68372abe860415f18b55081dRomain Guy Save = 0, 774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Restore, 784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy RestoreToCount, 794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SaveLayer, 805b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy SaveLayerAlpha, 814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Translate, 824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Rotate, 834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Scale, 84807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy Skew, 854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetMatrix, 864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ConcatMatrix, 874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ClipRect, 8804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy // Drawing operations 890fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy DrawDisplayList, 906c319ca1275c8db892c39b48fc54864c949f9171Romain Guy DrawLayer, 914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawBitmap, 924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawBitmapMatrix, 934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawBitmapRect, 945a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy DrawBitmapMesh, 954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawPatch, 964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawColor, 974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawRect, 9801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy DrawRoundRect, 9901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy DrawCircle, 100c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy DrawOval, 1018b2f5267f16c295f12faab810527cd6311997e34Romain Guy DrawArc, 1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawPath, 1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawLines, 104ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy DrawPoints, 1054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawText, 106325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy DrawTextOnPath, 107eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy DrawPosText, 1084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ResetShader, 1094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetupShader, 1104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ResetColorFilter, 1114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetupColorFilter, 1124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ResetShadow, 113ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy SetupShadow, 1145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy ResetPaintFilter, 1155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SetupPaintFilter, 116daf98e941e140e8739458126640183b9f296a2abChet Haase DrawGLFunction, 1174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy }; 1184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 11933f6beb10f98e8ba96250e284876d607055d278dRomain Guy // See flags defined in DisplayList.java 12033f6beb10f98e8ba96250e284876d607055d278dRomain Guy enum ReplayFlag { 12133f6beb10f98e8ba96250e284876d607055d278dRomain Guy kReplayFlag_ClipChildren = 0x1 12233f6beb10f98e8ba96250e284876d607055d278dRomain Guy }; 12333f6beb10f98e8ba96250e284876d607055d278dRomain Guy 124ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy static const char* OP_NAMES[]; 125ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 1261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase void setViewProperties(OpenGLRenderer& renderer, uint32_t level); 127a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void outputViewProperties(OpenGLRenderer& renderer, char* indent); 128a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 1297953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API size_t getSize(); 130bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy ANDROID_API static void destroyDisplayListDeferred(DisplayList* displayList); 131bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy ANDROID_API static void outputLogBuffer(int fd); 132bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy 133bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false); 13465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 1351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase status_t replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level = 0); 136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 137ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase void output(OpenGLRenderer& renderer, uint32_t level = 0); 138ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 13904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy void setRenderable(bool renderable) { 14004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mIsRenderable = renderable; 14104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy } 14204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 14304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy bool isRenderable() const { 14404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy return mIsRenderable; 14504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy } 14604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 14713631f3da855f200a151e7837ed9f6b079622b58Romain Guy void setName(const char* name) { 14813631f3da855f200a151e7837ed9f6b079622b58Romain Guy if (name) { 14913631f3da855f200a151e7837ed9f6b079622b58Romain Guy mName.setTo(name); 15013631f3da855f200a151e7837ed9f6b079622b58Romain Guy } 15113631f3da855f200a151e7837ed9f6b079622b58Romain Guy } 15213631f3da855f200a151e7837ed9f6b079622b58Romain Guy 153a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setClipChildren(bool clipChildren) { 154a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mClipChildren = clipChildren; 155a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 156a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 1579420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase void setStaticMatrix(SkMatrix* matrix) { 1589420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase delete mStaticMatrix; 1599420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix = new SkMatrix(*matrix); 1609420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase } 1619420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase 1629420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase void setAnimationMatrix(SkMatrix* matrix) { 1639420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase delete mAnimationMatrix; 1649420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase if (matrix) { 1659420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mAnimationMatrix = new SkMatrix(*matrix); 1669420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase } else { 1679420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mAnimationMatrix = NULL; 1689420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase } 1699420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase } 1709420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase 171a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setAlpha(float alpha) { 172a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (alpha != mAlpha) { 173a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mAlpha = alpha; 174a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMultipliedAlpha = (int)(255 * alpha); 175a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 176a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 177a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 178db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase void setHasOverlappingRendering(bool hasOverlappingRendering) { 179db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase mHasOverlappingRendering = hasOverlappingRendering; 180db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase } 181db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 182a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setTranslationX(float translationX) { 183a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (translationX != mTranslationX) { 184a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTranslationX = translationX; 185a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 186a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mTranslationX, 0) && ALMOST_EQUAL(mTranslationY, 0)) { 187a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~TRANSLATION; 188a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 189a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= TRANSLATION; 190a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 191a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 192a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 193a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 194a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setTranslationY(float translationY) { 195a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (translationY != mTranslationY) { 196a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTranslationY = translationY; 197a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 198a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mTranslationX, 0) && ALMOST_EQUAL(mTranslationY, 0)) { 199a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~TRANSLATION; 200a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 201a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= TRANSLATION; 202a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 203a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 204a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 205a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 206a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setRotation(float rotation) { 207a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (rotation != mRotation) { 208a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRotation = rotation; 209a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 210a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mRotation, 0)) { 211a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~ROTATION; 212a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 213a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= ROTATION; 214a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 215a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 216a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 217a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 218a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setRotationX(float rotationX) { 219a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (rotationX != mRotationX) { 220a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRotationX = rotationX; 221a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 222a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mRotationX, 0) && ALMOST_EQUAL(mRotationY, 0)) { 223a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~ROTATION_3D; 224a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 225a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= ROTATION_3D; 226a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 227a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 228a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 229a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 230a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setRotationY(float rotationY) { 231a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (rotationY != mRotationY) { 232a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRotationY = rotationY; 233a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 234a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mRotationX, 0) && ALMOST_EQUAL(mRotationY, 0)) { 235a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~ROTATION_3D; 236a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 237a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= ROTATION_3D; 238a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 239a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 240a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 241a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 242a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setScaleX(float scaleX) { 243a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (scaleX != mScaleX) { 244a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mScaleX = scaleX; 245a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 246a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mScaleX, 1) && ALMOST_EQUAL(mScaleY, 1)) { 247a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~SCALE; 248a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 249a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= SCALE; 250a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 251a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 252a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 253a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 254a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setScaleY(float scaleY) { 255a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (scaleY != mScaleY) { 256a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mScaleY = scaleY; 257a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 258a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mScaleX, 1) && ALMOST_EQUAL(mScaleY, 1)) { 259a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~SCALE; 260a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 261a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= SCALE; 262a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 263a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 264a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 265a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 266a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setPivotX(float pivotX) { 267a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotX = pivotX; 268a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 269a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mPivotX, 0) && ALMOST_EQUAL(mPivotY, 0)) { 270a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~PIVOT; 271a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 272a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= PIVOT; 273a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 274a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotExplicitlySet = true; 275a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 276a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 277a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setPivotY(float pivotY) { 278a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotY = pivotY; 279a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 280a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (ALMOST_EQUAL(mPivotX, 0) && ALMOST_EQUAL(mPivotY, 0)) { 281a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags &= ~PIVOT; 282a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 283a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags |= PIVOT; 284a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 285a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotExplicitlySet = true; 286a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 287a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 288a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setCameraDistance(float distance) { 289a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (distance != mCameraDistance) { 290a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mCameraDistance = distance; 291a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 292a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (!mTransformCamera) { 293a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera = new Sk3DView(); 294a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix3D = new SkMatrix(); 295a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 296a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->setCameraLocation(0, 0, distance); 297a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 298a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 299a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 300a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setLeft(int left) { 301a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (left != mLeft) { 302a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mLeft = left; 303a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mWidth = mRight - mLeft; 304a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 305a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 306a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 307a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 308a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 309a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 310a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setTop(int top) { 311a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (top != mTop) { 312a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTop = top; 313a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mHeight = mBottom - mTop; 314a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 315a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 316a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 317a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 318a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 319a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 320a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setRight(int right) { 321a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (right != mRight) { 322a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRight = right; 323a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mWidth = mRight - mLeft; 324a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 325a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 326a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 327a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 328a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 329a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 330a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setBottom(int bottom) { 331a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (bottom != mBottom) { 332a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mBottom = bottom; 333a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mHeight = mBottom - mTop; 334a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 335a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 336a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 337a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 338a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 339a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 340a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setLeftTop(int left, int top) { 341a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (left != mLeft || top != mTop) { 342a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mLeft = left; 343a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTop = top; 344a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mWidth = mRight - mLeft; 345a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mHeight = mBottom - mTop; 346a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 347a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 348a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 349a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 350a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 351a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 352a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setLeftTopRightBottom(int left, int top, int right, int bottom) { 353a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (left != mLeft || top != mTop || right != mRight || bottom != mBottom) { 354a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mLeft = left; 355a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTop = top; 356a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRight = right; 357a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mBottom = bottom; 358a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mWidth = mRight - mLeft; 359a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mHeight = mBottom - mTop; 360a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 361a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 362a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 363a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 364a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 365a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 366a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void offsetLeftRight(int offset) { 367a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (offset != 0) { 368a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mLeft += offset; 369a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRight += offset; 370a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 371a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 372a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 373a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 374a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 375a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 376a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void offsetTopBottom(int offset) { 377a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (offset != 0) { 378a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTop += offset; 379a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mBottom += offset; 380a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) { 381a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = true; 382a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 383a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 384a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 385a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 386a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setCaching(bool caching) { 387a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mCaching = caching; 388a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 389a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 3901271e2cc80b01d577e9db339459ef0222bb9320dChet Haase int getWidth() { 3911271e2cc80b01d577e9db339459ef0222bb9320dChet Haase return mWidth; 3921271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 3931271e2cc80b01d577e9db339459ef0222bb9320dChet Haase 3941271e2cc80b01d577e9db339459ef0222bb9320dChet Haase int getHeight() { 3951271e2cc80b01d577e9db339459ef0222bb9320dChet Haase return mHeight; 3961271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 3971271e2cc80b01d577e9db339459ef0222bb9320dChet Haase 398b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate: 399b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy void init(); 400b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 401a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void initProperties(); 402a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 403d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase void clearResources(); 404d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase 405a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void updateMatrix(); 406a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 407b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy class TextContainer { 408b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy public: 409b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t length() const { 410b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mByteLength; 411b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 412b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 413b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const char* text() const { 414b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return (const char*) mText; 415b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 416b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 417b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t mByteLength; 418b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const char* mText; 419b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy }; 420b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 421b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkBitmap* getBitmap() { 4225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkBitmap*) getInt(); 4235c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 4245c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 4255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkiaShader* getShader() { 4265c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkiaShader*) getInt(); 427b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 428b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 429ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase SkiaColorFilter* getColorFilter() { 430ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase return (SkiaColorFilter*) getInt(); 431ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase } 432ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase 43333f6beb10f98e8ba96250e284876d607055d278dRomain Guy inline int32_t getIndex() { 434b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mReader.readInt(); 435b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 436b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 43733f6beb10f98e8ba96250e284876d607055d278dRomain Guy inline int32_t getInt() { 438b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mReader.readInt(); 439b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 440b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 4417b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy inline uint32_t getUInt() { 4427b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy return mReader.readU32(); 4437b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy } 4447b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy 445b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkMatrix* getMatrix() { 4465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkMatrix*) getInt(); 447b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 448b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 449b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkPath* getPath() { 4502fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy return (SkPath*) getInt(); 451b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 452b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 4535ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* getPaint(OpenGLRenderer& renderer) { 4545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy return renderer.filterPaint((SkPaint*) getInt()); 455b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 456b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 4570fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy DisplayList* getDisplayList() { 4580fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy return (DisplayList*) getInt(); 4590fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 4600fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 461b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy inline float getFloat() { 462b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mReader.readScalar(); 463b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 464b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 465b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* getInts(uint32_t& count) { 466b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy count = getInt(); 467b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return (int32_t*) mReader.skip(count * sizeof(int32_t)); 468b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 469b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 4704bb942083a0d4db746adf95349108dd8ef842e32Romain Guy uint32_t* getUInts(int8_t& count) { 4714bb942083a0d4db746adf95349108dd8ef842e32Romain Guy count = getInt(); 4724bb942083a0d4db746adf95349108dd8ef842e32Romain Guy return (uint32_t*) mReader.skip(count * sizeof(uint32_t)); 4734bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 4744bb942083a0d4db746adf95349108dd8ef842e32Romain Guy 47533f6beb10f98e8ba96250e284876d607055d278dRomain Guy float* getFloats(int32_t& count) { 476b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy count = getInt(); 477b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return (float*) mReader.skip(count * sizeof(float)); 478b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 479b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 480b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy void getText(TextContainer* text) { 481b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t length = text->mByteLength = getInt(); 482b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy text->mText = (const char*) mReader.skip(length); 483b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 484b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 4855c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Vector<SkBitmap*> mBitmapResources; 486ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase Vector<SkiaColorFilter*> mFilterResources; 487b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 488d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkPaint*> mPaints; 4892fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy Vector<SkPath*> mPaths; 490d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase SortedVector<SkPath*> mSourcePaths; 491d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkMatrix*> mMatrices; 49224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy Vector<SkiaShader*> mShaders; 493d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 494b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mutable SkFlattenableReadBuffer mReader; 49565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 49665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy size_t mSize; 49704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 49804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy bool mIsRenderable; 49913631f3da855f200a151e7837ed9f6b079622b58Romain Guy 50013631f3da855f200a151e7837ed9f6b079622b58Romain Guy String8 mName; 501a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 502a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase // View properties 503a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bool mClipChildren; 504a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float mAlpha; 505a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase int mMultipliedAlpha; 506db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase bool mHasOverlappingRendering; 507a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float mTranslationX, mTranslationY; 508a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float mRotation, mRotationX, mRotationY; 509a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float mScaleX, mScaleY; 510a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float mPivotX, mPivotY; 511a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float mCameraDistance; 512a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase int mLeft, mTop, mRight, mBottom; 513a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase int mWidth, mHeight; 514a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase int mPrevWidth, mPrevHeight; 515a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bool mPivotExplicitlySet; 516a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bool mMatrixDirty; 517a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bool mMatrixIsIdentity; 518a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase uint32_t mMatrixFlags; 519a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase SkMatrix* mTransformMatrix; 520a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase Sk3DView* mTransformCamera; 521a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase SkMatrix* mTransformMatrix3D; 5229420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase SkMatrix* mStaticMatrix; 5239420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase SkMatrix* mAnimationMatrix; 524a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bool mCaching; 525b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}; 526b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 527b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 528b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer 529b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 530b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 531b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/** 532b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback. 533b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */ 534b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer { 535b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic: 5367953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API DisplayListRenderer(); 5377953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual ~DisplayListRenderer(); 538b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 5397953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API DisplayList* getDisplayList(DisplayList* displayList); 5405977baa1fa24125c148a72699b53e62abaf08960Chet Haase 5417953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setViewport(int width, int height); 5427953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque); 5437953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void finish(); 544b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 5456554943a1dd6854c0f4976900956e556767b49e1Romain Guy virtual status_t callDrawGLFunction(Functor *functor, Rect& dirty); 5464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5477953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void interrupt(); 5487953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resume(); 549daf98e941e140e8739458126640183b9f296a2abChet Haase 5507953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int save(int flags); 5517953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void restore(); 5527953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void restoreToCount(int saveCount); 5534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5547953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int saveLayer(float left, float top, float right, float bottom, 5555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* p, int flags); 5567953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int saveLayerAlpha(float left, float top, float right, float bottom, 5575b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy int alpha, int flags); 5584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5597953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void translate(float dx, float dy); 5607953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void rotate(float degrees); 5617953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void scale(float sx, float sy); 5627953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void skew(float sx, float sy); 5634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5647953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setMatrix(SkMatrix* matrix); 5657953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void concatMatrix(SkMatrix* matrix); 5664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5677953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op); 5684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5691271e2cc80b01d577e9db339459ef0222bb9320dChet Haase virtual status_t drawDisplayList(DisplayList* displayList, Rect& dirty, int32_t flags, 5701271e2cc80b01d577e9db339459ef0222bb9320dChet Haase uint32_t level = 0); 5717953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawLayer(Layer* layer, float x, float y, SkPaint* paint); 5727953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint); 5737953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint); 5747953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, 5754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 5765c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float dstRight, float dstBottom, SkPaint* paint); 5777953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight, 5785a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy float* vertices, int* colors, SkPaint* paint); 5797953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs, 5804bb942083a0d4db746adf95349108dd8ef842e32Romain Guy const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors, 5815c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float left, float top, float right, float bottom, SkPaint* paint); 5827953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawColor(int color, SkXfermode::Mode mode); 5837953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawRect(float left, float top, float right, float bottom, SkPaint* paint); 5847953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawRoundRect(float left, float top, float right, float bottom, 58501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy float rx, float ry, SkPaint* paint); 5867953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawCircle(float x, float y, float radius, SkPaint* paint); 5877953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawOval(float left, float top, float right, float bottom, SkPaint* paint); 5887953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawArc(float left, float top, float right, float bottom, 5898b2f5267f16c295f12faab810527cd6311997e34Romain Guy float startAngle, float sweepAngle, bool useCenter, SkPaint* paint); 5907953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawPath(SkPath* path, SkPaint* paint); 5917953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawLines(float* points, int count, SkPaint* paint); 5927953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawPoints(float* points, int count, SkPaint* paint); 5937953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawText(const char* text, int bytesCount, int count, float x, float y, 594acdd4b9c4b03bc6660274ab878731383adb5bca5Romain Guy SkPaint* paint, float length = -1.0f); 595325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy virtual void drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path, 596325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float hOffset, float vOffset, SkPaint* paint); 597eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions, 598eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy SkPaint* paint); 5994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 6007953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resetShader(); 6017953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setupShader(SkiaShader* shader); 6024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 6037953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resetColorFilter(); 6047953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setupColorFilter(SkiaColorFilter* filter); 6054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 6067953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resetShadow(); 6077953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setupShadow(float radius, float dx, float dy, int color); 6084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 6095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy virtual void resetPaintFilter(); 6105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy virtual void setupPaintFilter(int clearBits, int setBits); 6115ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 6127953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API void reset(); 6134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 614b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkWriter32& writeStream() const { 615b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mWriter; 616b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 617b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 6185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase const Vector<SkBitmap*>& getBitmapResources() const { 6195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return mBitmapResources; 620b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 621b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 622d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy const Vector<SkiaColorFilter*>& getFilterResources() const { 623d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy return mFilterResources; 624d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 625d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 62624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy const Vector<SkiaShader*>& getShaders() const { 62724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy return mShaders; 628b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 629b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 630d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkPaint*>& getPaints() const { 631d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return mPaints; 6325c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 6335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 6342fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy const Vector<SkPath*>& getPaths() const { 6352fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy return mPaths; 6362fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 6372fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 638d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase const SortedVector<SkPath*>& getSourcePaths() const { 639d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase return mSourcePaths; 640d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 641d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 642d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkMatrix*>& getMatrices() const { 643d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return mMatrices; 644b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 645b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 6464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate: 64727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy void insertRestoreToCount() { 64827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy if (mRestoreSaveCount >= 0) { 64927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mWriter.writeInt(DisplayList::RestoreToCount); 65027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy addInt(mRestoreSaveCount); 65127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = -1; 65227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy } 65327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy } 65427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 65533f6beb10f98e8ba96250e284876d607055d278dRomain Guy void insertTranlate() { 65633f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (mHasTranslate) { 65733f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (mTranslateX != 0.0f || mTranslateY != 0.0f) { 65833f6beb10f98e8ba96250e284876d607055d278dRomain Guy mWriter.writeInt(DisplayList::Translate); 65933f6beb10f98e8ba96250e284876d607055d278dRomain Guy addPoint(mTranslateX, mTranslateY); 66033f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateX = mTranslateY = 0.0f; 66133f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 66233f6beb10f98e8ba96250e284876d607055d278dRomain Guy mHasTranslate = false; 66333f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 66433f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 66533f6beb10f98e8ba96250e284876d607055d278dRomain Guy 66633f6beb10f98e8ba96250e284876d607055d278dRomain Guy inline void addOp(const DisplayList::Op drawOp) { 66727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy insertRestoreToCount(); 66833f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 6694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(drawOp); 67004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList; 6714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 6724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 67333f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* addOp(const DisplayList::Op drawOp, const bool reject) { 67433f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertRestoreToCount(); 67533f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 67633f6beb10f98e8ba96250e284876d607055d278dRomain Guy mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList; 67733f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (reject) { 67833f6beb10f98e8ba96250e284876d607055d278dRomain Guy mWriter.writeInt(OP_MAY_BE_SKIPPED_MASK | drawOp); 679ad1daaa87b793af30f3dd67a0f3cd5c0fd6ac0c1Romain Guy mWriter.writeInt(0xdeaddead); 680390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy mBufferSize = mWriter.size(); 681390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy return mWriter.peek32(mBufferSize - sizeof(int32_t)); 68233f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 68333f6beb10f98e8ba96250e284876d607055d278dRomain Guy mWriter.writeInt(drawOp); 68433f6beb10f98e8ba96250e284876d607055d278dRomain Guy return NULL; 68533f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 68633f6beb10f98e8ba96250e284876d607055d278dRomain Guy 68733f6beb10f98e8ba96250e284876d607055d278dRomain Guy inline void addSkip(uint32_t* location) { 68833f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (location) { 689390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy *location = (int32_t) (mWriter.size() - mBufferSize); 69033f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 69133f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 69233f6beb10f98e8ba96250e284876d607055d278dRomain Guy 69333f6beb10f98e8ba96250e284876d607055d278dRomain Guy inline void addInt(int32_t value) { 6944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(value); 6954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 6964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 6977b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy inline void addSize(uint32_t w, uint32_t h) { 6987b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy mWriter.writeInt(w); 6997b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy mWriter.writeInt(h); 7007b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy } 7017b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy 7024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void addInts(const int32_t* values, uint32_t count) { 703b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWriter.writeInt(count); 7044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy for (uint32_t i = 0; i < count; i++) { 7054bb942083a0d4db746adf95349108dd8ef842e32Romain Guy mWriter.writeInt(values[i]); 7064bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 7074bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 7084bb942083a0d4db746adf95349108dd8ef842e32Romain Guy 7094bb942083a0d4db746adf95349108dd8ef842e32Romain Guy void addUInts(const uint32_t* values, int8_t count) { 7104bb942083a0d4db746adf95349108dd8ef842e32Romain Guy mWriter.writeInt(count); 7114bb942083a0d4db746adf95349108dd8ef842e32Romain Guy for (int8_t i = 0; i < count; i++) { 7124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(values[i]); 7134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addFloat(float value) { 7174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(value); 7184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 72033f6beb10f98e8ba96250e284876d607055d278dRomain Guy void addFloats(const float* values, int32_t count) { 721b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWriter.writeInt(count); 72233f6beb10f98e8ba96250e284876d607055d278dRomain Guy for (int32_t i = 0; i < count; i++) { 7234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(values[i]); 7244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addPoint(float x, float y) { 7284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(x); 7294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(y); 7304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addBounds(float left, float top, float right, float bottom) { 7334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(left); 7344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(top); 7354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(right); 7364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(bottom); 7374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addText(const void* text, size_t byteLength) { 7404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(byteLength); 7414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writePad(text, byteLength); 7424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7442fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy inline void addPath(SkPath* path) { 7452fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy if (!path) { 7462fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy addInt((int) NULL); 7472fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy return; 7482fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 7492fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 7502fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy SkPath* pathCopy = mPathMap.valueFor(path); 7512fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) { 752b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy pathCopy = new SkPath(*path); 7534bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy pathCopy->setSourcePath(path); 75496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 75596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mPathMap.replaceValueFor(path, pathCopy); 756b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy mPaths.add(pathCopy); 7574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 758d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase if (mSourcePaths.indexOf(path) < 0) { 759d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase Caches::getInstance().resourceCache.incrementRefcount(path); 760d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase mSourcePaths.add(path); 761d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 7622fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 7632fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy addInt((int) pathCopy); 7644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addPaint(SkPaint* paint) { 76724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy if (!paint) { 7680fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) NULL); 769d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return; 770d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 7710fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 77222d418437e44587cb0fba4353515719453269189Romain Guy SkPaint* paintCopy = mPaintMap.valueFor(paint); 773d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) { 774d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase paintCopy = new SkPaint(*paint); 77596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 77696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mPaintMap.replaceValueFor(paint, paintCopy); 777d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaints.add(paintCopy); 778d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 7790fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 7800fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) paintCopy); 7810fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 7820fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 7830fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy inline void addDisplayList(DisplayList* displayList) { 7840fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy // TODO: To be safe, the display list should be ref-counted in the 7850fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy // resources cache, but we rely on the caller (UI toolkit) to 7860fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy // do the right thing for now 7870fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) displayList); 7884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7905c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addMatrix(SkMatrix* matrix) { 791d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Copying the matrix is cheap and prevents against the user changing the original 792d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // matrix before the operation that uses it 793f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy SkMatrix* copy = new SkMatrix(*matrix); 794f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy addInt((int) copy); 795f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy mMatrices.add(copy); 7964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 7974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 7985c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addBitmap(SkBitmap* bitmap) { 799d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Note that this assumes the bitmap is immutable. There are cases this won't handle 800d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // correctly, such as creating the bitmap from scratch, drawing with it, changing its 801d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // contents, and drawing again. The only fix would be to always copy it the first time, 802d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // which doesn't seem worth the extra cycles for this unlikely case. 8030fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) bitmap); 8045c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mBitmapResources.add(bitmap); 805d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy Caches::getInstance().resourceCache.incrementRefcount(bitmap); 8065c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 8074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 8085c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addShader(SkiaShader* shader) { 80924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy if (!shader) { 81024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy addInt((int) NULL); 81124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy return; 81224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy } 81324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 81424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy SkiaShader* shaderCopy = mShaderMap.valueFor(shader); 81524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy // TODO: We also need to handle generation ID changes in compose shaders 8161f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) { 81724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy shaderCopy = shader->copy(); 81896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 81996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mShaderMap.replaceValueFor(shader, shaderCopy); 8201f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy mShaders.add(shaderCopy); 82143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy Caches::getInstance().resourceCache.incrementRefcount(shaderCopy); 82224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy } 82324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 82424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy addInt((int) shaderCopy); 8254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 8264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 827ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase inline void addColorFilter(SkiaColorFilter* colorFilter) { 8280fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) colorFilter); 829ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase mFilterResources.add(colorFilter); 830d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy Caches::getInstance().resourceCache.incrementRefcount(colorFilter); 831ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase } 832ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase 8335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Vector<SkBitmap*> mBitmapResources; 834ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase Vector<SkiaColorFilter*> mFilterResources; 8354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 836d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkPaint*> mPaints; 8370fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap; 83824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 8392fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy Vector<SkPath*> mPaths; 8402fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy DefaultKeyedVector<SkPath*, SkPath*> mPathMap; 8412fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 842d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase SortedVector<SkPath*> mSourcePaths; 843d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 84424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy Vector<SkiaShader*> mShaders; 84524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap; 84624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 847d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkMatrix*> mMatrices; 848d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 8494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkWriter32 mWriter; 850390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy uint32_t mBufferSize; 8514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 85227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy int mRestoreSaveCount; 85333f6beb10f98e8ba96250e284876d607055d278dRomain Guy 85433f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateX; 85533f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateY; 85633f6beb10f98e8ba96250e284876d607055d278dRomain Guy bool mHasTranslate; 85733f6beb10f98e8ba96250e284876d607055d278dRomain Guy 85804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy bool mHasDrawOps; 85927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 860b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy friend class DisplayList; 861b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 8624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer 8634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 8644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 8654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 8664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 8675b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 868