Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2010 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
Romain Guy | 5b3b352 | 2010-10-27 18:57:51 -0700 | [diff] [blame] | 17 | #ifndef ANDROID_HWUI_DISPLAY_LIST_RENDERER_H |
| 18 | #define ANDROID_HWUI_DISPLAY_LIST_RENDERER_H |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 19 | |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 20 | #include <SkMatrix.h> |
| 21 | #include <SkPaint.h> |
| 22 | #include <SkPath.h> |
Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 23 | #include <cutils/compiler.h> |
| 24 | |
Chris Craik | 0776a60 | 2013-02-14 15:36:01 -0800 | [diff] [blame] | 25 | #include "DisplayList.h" |
Chet Haase | 9c1e23b | 2011-03-24 10:51:31 -0700 | [diff] [blame] | 26 | #include "DisplayListLogBuffer.h" |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 27 | #include "OpenGLRenderer.h" |
| 28 | |
| 29 | namespace android { |
| 30 | namespace uirenderer { |
| 31 | |
| 32 | /////////////////////////////////////////////////////////////////////////////// |
| 33 | // Defines |
| 34 | /////////////////////////////////////////////////////////////////////////////// |
| 35 | |
Romain Guy | 6d7475d | 2011-07-27 16:28:21 -0700 | [diff] [blame] | 36 | #define MIN_WRITER_SIZE 4096 |
Romain Guy | 33f6beb | 2012-02-16 19:24:51 -0800 | [diff] [blame] | 37 | #define OP_MAY_BE_SKIPPED_MASK 0xff000000 |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 38 | |
Romain Guy | ffac7fc | 2011-01-13 17:21:49 -0800 | [diff] [blame] | 39 | // Debug |
| 40 | #if DEBUG_DISPLAY_LIST |
Steve Block | 5baa3a6 | 2011-12-20 16:23:08 +0000 | [diff] [blame] | 41 | #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__) |
Romain Guy | ffac7fc | 2011-01-13 17:21:49 -0800 | [diff] [blame] | 42 | #else |
| 43 | #define DISPLAY_LIST_LOGD(...) |
| 44 | #endif |
| 45 | |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 46 | /////////////////////////////////////////////////////////////////////////////// |
Romain Guy | b051e89 | 2010-09-28 19:09:36 -0700 | [diff] [blame] | 47 | // Display list |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 48 | /////////////////////////////////////////////////////////////////////////////// |
| 49 | |
Chris Craik | c3566d0 | 2013-02-04 16:16:33 -0800 | [diff] [blame] | 50 | class DeferredDisplayList; |
Romain Guy | b051e89 | 2010-09-28 19:09:36 -0700 | [diff] [blame] | 51 | class DisplayListRenderer; |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 52 | class DisplayListOp; |
| 53 | class DrawOp; |
| 54 | class StateOp; |
| 55 | |
Romain Guy | b051e89 | 2010-09-28 19:09:36 -0700 | [diff] [blame] | 56 | /** |
Chris Craik | d6b65f6 | 2014-01-01 14:45:21 -0800 | [diff] [blame] | 57 | * Records drawing commands in a display list for later playback into an OpenGLRenderer. |
Romain Guy | b051e89 | 2010-09-28 19:09:36 -0700 | [diff] [blame] | 58 | */ |
| 59 | class DisplayListRenderer: public OpenGLRenderer { |
| 60 | public: |
Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 61 | ANDROID_API DisplayListRenderer(); |
| 62 | virtual ~DisplayListRenderer(); |
Romain Guy | b051e89 | 2010-09-28 19:09:36 -0700 | [diff] [blame] | 63 | |
Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 64 | ANDROID_API DisplayList* getDisplayList(DisplayList* displayList); |
Chet Haase | 5977baa | 2011-01-05 18:01:22 -0800 | [diff] [blame] | 65 | |
Chris Craik | 406af02 | 2014-01-02 14:56:40 -0800 | [diff] [blame] | 66 | virtual bool isRecording() const { return true; } |
Romain Guy | 49c5fc0 | 2012-05-15 11:10:01 -0700 | [diff] [blame] | 67 | |
Chris Craik | 14e5130 | 2013-12-30 15:32:54 -0800 | [diff] [blame] | 68 | // ---------------------------------------------------------------------------- |
| 69 | // Frame state operations |
| 70 | // ---------------------------------------------------------------------------- |
Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 71 | virtual void setViewport(int width, int height); |
Romain Guy | 7c25aab | 2012-10-18 15:05:02 -0700 | [diff] [blame] | 72 | virtual status_t prepareDirty(float left, float top, float right, float bottom, bool opaque); |
Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 73 | virtual void finish(); |
Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 74 | virtual void interrupt(); |
| 75 | virtual void resume(); |
Chet Haase | daf98e9 | 2011-01-10 14:10:36 -0800 | [diff] [blame] | 76 | |
Chris Craik | 14e5130 | 2013-12-30 15:32:54 -0800 | [diff] [blame] | 77 | // ---------------------------------------------------------------------------- |
| 78 | // Canvas state operations |
| 79 | // ---------------------------------------------------------------------------- |
| 80 | // Save (layer) |
Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 81 | virtual int save(int flags); |
| 82 | virtual void restore(); |
| 83 | virtual void restoreToCount(int saveCount); |
Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 84 | virtual int saveLayer(float left, float top, float right, float bottom, |
Derek Sollenberger | d44fbe5 | 2014-02-05 16:47:00 -0500 | [diff] [blame] | 85 | const SkPaint* paint, int flags); |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 86 | |
Chris Craik | 14e5130 | 2013-12-30 15:32:54 -0800 | [diff] [blame] | 87 | // Matrix |
Chris Craik | b458942 | 2013-12-26 15:13:13 -0800 | [diff] [blame] | 88 | virtual void translate(float dx, float dy, float dz); |
Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 89 | virtual void rotate(float degrees); |
| 90 | virtual void scale(float sx, float sy); |
| 91 | virtual void skew(float sx, float sy); |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 92 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 93 | virtual void setMatrix(const SkMatrix* matrix); |
| 94 | virtual void concatMatrix(const SkMatrix* matrix); |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 95 | |
Chris Craik | 14e5130 | 2013-12-30 15:32:54 -0800 | [diff] [blame] | 96 | // Clip |
Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 97 | virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op); |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 98 | virtual bool clipPath(const SkPath* path, SkRegion::Op op); |
| 99 | virtual bool clipRegion(const SkRegion* region, SkRegion::Op op); |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 100 | |
Chris Craik | 14e5130 | 2013-12-30 15:32:54 -0800 | [diff] [blame] | 101 | // Misc - should be implemented with SkPaint inspection |
Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 102 | virtual void resetShader(); |
| 103 | virtual void setupShader(SkiaShader* shader); |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 104 | |
Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 105 | virtual void resetColorFilter(); |
| 106 | virtual void setupColorFilter(SkiaColorFilter* filter); |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 107 | |
Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 108 | virtual void resetShadow(); |
| 109 | virtual void setupShadow(float radius, float dx, float dy, int color); |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 110 | |
Romain Guy | 5ff9df6 | 2012-01-23 17:09:05 -0800 | [diff] [blame] | 111 | virtual void resetPaintFilter(); |
| 112 | virtual void setupPaintFilter(int clearBits, int setBits); |
| 113 | |
Chris Craik | 14e5130 | 2013-12-30 15:32:54 -0800 | [diff] [blame] | 114 | // ---------------------------------------------------------------------------- |
| 115 | // Canvas draw operations |
| 116 | // ---------------------------------------------------------------------------- |
| 117 | virtual status_t drawColor(int color, SkXfermode::Mode mode); |
| 118 | |
| 119 | // Bitmap-based |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 120 | virtual status_t drawBitmap(const SkBitmap* bitmap, float left, float top, |
| 121 | const SkPaint* paint); |
| 122 | virtual status_t drawBitmap(const SkBitmap* bitmap, const SkMatrix* matrix, |
| 123 | const SkPaint* paint); |
| 124 | virtual status_t drawBitmap(const SkBitmap* bitmap, float srcLeft, float srcTop, |
Chris Craik | 14e5130 | 2013-12-30 15:32:54 -0800 | [diff] [blame] | 125 | float srcRight, float srcBottom, float dstLeft, float dstTop, |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 126 | float dstRight, float dstBottom, const SkPaint* paint); |
| 127 | virtual status_t drawBitmapData(const SkBitmap* bitmap, float left, float top, |
| 128 | const SkPaint* paint); |
| 129 | virtual status_t drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight, |
| 130 | const float* vertices, const int* colors, const SkPaint* paint); |
| 131 | virtual status_t drawPatch(const SkBitmap* bitmap, const Res_png_9patch* patch, |
| 132 | float left, float top, float right, float bottom, const SkPaint* paint); |
Chris Craik | 14e5130 | 2013-12-30 15:32:54 -0800 | [diff] [blame] | 133 | |
| 134 | // Shapes |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 135 | virtual status_t drawRect(float left, float top, float right, float bottom, |
| 136 | const SkPaint* paint); |
| 137 | virtual status_t drawRects(const float* rects, int count, const SkPaint* paint); |
Chris Craik | 14e5130 | 2013-12-30 15:32:54 -0800 | [diff] [blame] | 138 | virtual status_t drawRoundRect(float left, float top, float right, float bottom, |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 139 | float rx, float ry, const SkPaint* paint); |
| 140 | virtual status_t drawCircle(float x, float y, float radius, const SkPaint* paint); |
| 141 | virtual status_t drawOval(float left, float top, float right, float bottom, |
| 142 | const SkPaint* paint); |
Chris Craik | 14e5130 | 2013-12-30 15:32:54 -0800 | [diff] [blame] | 143 | virtual status_t drawArc(float left, float top, float right, float bottom, |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 144 | float startAngle, float sweepAngle, bool useCenter, const SkPaint* paint); |
| 145 | virtual status_t drawPath(const SkPath* path, const SkPaint* paint); |
| 146 | virtual status_t drawLines(const float* points, int count, const SkPaint* paint); |
| 147 | virtual status_t drawPoints(const float* points, int count, const SkPaint* paint); |
Chris Craik | 14e5130 | 2013-12-30 15:32:54 -0800 | [diff] [blame] | 148 | |
| 149 | // Text |
| 150 | virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y, |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 151 | const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds, |
Chris Craik | 14e5130 | 2013-12-30 15:32:54 -0800 | [diff] [blame] | 152 | DrawOpMode drawOpMode = kDrawOpMode_Immediate); |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 153 | virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, const SkPath* path, |
| 154 | float hOffset, float vOffset, const SkPaint* paint); |
Chris Craik | 14e5130 | 2013-12-30 15:32:54 -0800 | [diff] [blame] | 155 | virtual status_t drawPosText(const char* text, int bytesCount, int count, |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 156 | const float* positions, const SkPaint* paint); |
Chris Craik | 14e5130 | 2013-12-30 15:32:54 -0800 | [diff] [blame] | 157 | |
| 158 | // ---------------------------------------------------------------------------- |
| 159 | // Canvas draw operations - special |
| 160 | // ---------------------------------------------------------------------------- |
| 161 | virtual status_t drawLayer(Layer* layer, float x, float y); |
| 162 | virtual status_t drawDisplayList(DisplayList* displayList, Rect& dirty, |
| 163 | int32_t replayFlags); |
| 164 | |
| 165 | // TODO: rename for consistency |
| 166 | virtual status_t callDrawGLFunction(Functor* functor, Rect& dirty); |
| 167 | |
| 168 | // ---------------------------------------------------------------------------- |
| 169 | // DisplayList / resource management |
| 170 | // ---------------------------------------------------------------------------- |
Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 171 | ANDROID_API void reset(); |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 172 | |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 173 | sp<DisplayListData> getDisplayListData() const { |
| 174 | return mDisplayListData; |
Romain Guy | b051e89 | 2010-09-28 19:09:36 -0700 | [diff] [blame] | 175 | } |
| 176 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 177 | const Vector<const SkBitmap*>& getBitmapResources() const { |
Chet Haase | 5c13d89 | 2010-10-08 08:37:55 -0700 | [diff] [blame] | 178 | return mBitmapResources; |
Romain Guy | b051e89 | 2010-09-28 19:09:36 -0700 | [diff] [blame] | 179 | } |
| 180 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 181 | const Vector<const SkBitmap*>& getOwnedBitmapResources() const { |
Romain Guy | 49c5fc0 | 2012-05-15 11:10:01 -0700 | [diff] [blame] | 182 | return mOwnedBitmapResources; |
| 183 | } |
| 184 | |
Romain Guy | d586ad9 | 2011-06-22 16:14:36 -0700 | [diff] [blame] | 185 | const Vector<SkiaColorFilter*>& getFilterResources() const { |
| 186 | return mFilterResources; |
| 187 | } |
| 188 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 189 | const Vector<const Res_png_9patch*>& getPatchResources() const { |
Romain Guy | e3b0a01 | 2013-06-26 15:45:41 -0700 | [diff] [blame] | 190 | return mPatchResources; |
| 191 | } |
| 192 | |
Romain Guy | 24c0021 | 2011-01-14 15:31:00 -0800 | [diff] [blame] | 193 | const Vector<SkiaShader*>& getShaders() const { |
| 194 | return mShaders; |
Romain Guy | b051e89 | 2010-09-28 19:09:36 -0700 | [diff] [blame] | 195 | } |
| 196 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 197 | const Vector<const SkPaint*>& getPaints() const { |
Chet Haase | d98aa2d | 2010-10-25 15:47:32 -0700 | [diff] [blame] | 198 | return mPaints; |
| 199 | } |
| 200 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 201 | const Vector<const SkPath*>& getPaths() const { |
Romain Guy | 2fc941e | 2011-02-03 15:06:05 -0800 | [diff] [blame] | 202 | return mPaths; |
| 203 | } |
| 204 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 205 | const SortedVector<const SkPath*>& getSourcePaths() const { |
Chet Haase | d34dd71 | 2012-05-02 18:50:34 -0700 | [diff] [blame] | 206 | return mSourcePaths; |
| 207 | } |
| 208 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 209 | const Vector<const SkRegion*>& getRegions() const { |
Romain Guy | 735738c | 2012-12-03 12:34:51 -0800 | [diff] [blame] | 210 | return mRegions; |
| 211 | } |
| 212 | |
Chet Haase | 603f6de | 2012-09-14 15:31:25 -0700 | [diff] [blame] | 213 | const Vector<Layer*>& getLayers() const { |
| 214 | return mLayers; |
| 215 | } |
| 216 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 217 | const Vector<const SkMatrix*>& getMatrices() const { |
Chet Haase | d98aa2d | 2010-10-25 15:47:32 -0700 | [diff] [blame] | 218 | return mMatrices; |
| 219 | } |
| 220 | |
Romain Guy | 54c1a64 | 2012-09-27 17:55:46 -0700 | [diff] [blame] | 221 | uint32_t getFunctorCount() const { |
| 222 | return mFunctorCount; |
| 223 | } |
| 224 | |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 225 | private: |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 226 | void insertRestoreToCount(); |
| 227 | void insertTranslate(); |
Romain Guy | 27454a4 | 2011-01-23 12:01:41 -0800 | [diff] [blame] | 228 | |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 229 | LinearAllocator& alloc() { return mDisplayListData->allocator; } |
| 230 | void addStateOp(StateOp* op); |
Romain Guy | 0f66753 | 2013-03-01 14:31:04 -0800 | [diff] [blame] | 231 | void addDrawOp(DrawOp* op); |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 232 | void addOpInternal(DisplayListOp* op) { |
Romain Guy | 27454a4 | 2011-01-23 12:01:41 -0800 | [diff] [blame] | 233 | insertRestoreToCount(); |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 234 | insertTranslate(); |
| 235 | mDisplayListData->displayListOps.add(op); |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 236 | } |
| 237 | |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 238 | template<class T> |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 239 | inline const T* refBuffer(const T* srcBuffer, int32_t count) { |
| 240 | if (!srcBuffer) return NULL; |
| 241 | |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 242 | T* dstBuffer = (T*) mDisplayListData->allocator.alloc(count * sizeof(T)); |
| 243 | memcpy(dstBuffer, srcBuffer, count * sizeof(T)); |
| 244 | return dstBuffer; |
Romain Guy | 33f6beb | 2012-02-16 19:24:51 -0800 | [diff] [blame] | 245 | } |
| 246 | |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 247 | inline char* refText(const char* text, size_t byteLength) { |
| 248 | return (char*) refBuffer<uint8_t>((uint8_t*)text, byteLength); |
Romain Guy | 33f6beb | 2012-02-16 19:24:51 -0800 | [diff] [blame] | 249 | } |
| 250 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 251 | inline const SkPath* refPath(const SkPath* path) { |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 252 | if (!path) return NULL; |
Romain Guy | 2fc941e | 2011-02-03 15:06:05 -0800 | [diff] [blame] | 253 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 254 | const SkPath* pathCopy = mPathMap.valueFor(path); |
Romain Guy | 2fc941e | 2011-02-03 15:06:05 -0800 | [diff] [blame] | 255 | if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) { |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 256 | SkPath* newPathCopy = new SkPath(*path); |
| 257 | newPathCopy->setSourcePath(path); |
| 258 | |
| 259 | pathCopy = newPathCopy; |
Romain Guy | 96ebc6b | 2012-02-21 18:32:32 -0800 | [diff] [blame] | 260 | // replaceValueFor() performs an add if the entry doesn't exist |
| 261 | mPathMap.replaceValueFor(path, pathCopy); |
Romain Guy | b29cfbf | 2011-03-18 16:24:19 -0700 | [diff] [blame] | 262 | mPaths.add(pathCopy); |
Romain Guy | 2fc941e | 2011-02-03 15:06:05 -0800 | [diff] [blame] | 263 | } |
Chet Haase | d34dd71 | 2012-05-02 18:50:34 -0700 | [diff] [blame] | 264 | if (mSourcePaths.indexOf(path) < 0) { |
Romain Guy | 58ecc20 | 2012-09-07 11:58:36 -0700 | [diff] [blame] | 265 | mCaches.resourceCache.incrementRefcount(path); |
Chet Haase | d34dd71 | 2012-05-02 18:50:34 -0700 | [diff] [blame] | 266 | mSourcePaths.add(path); |
| 267 | } |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 268 | return pathCopy; |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 269 | } |
| 270 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 271 | inline const SkPaint* refPaint(const SkPaint* paint) { |
Romain Guy | 24c0021 | 2011-01-14 15:31:00 -0800 | [diff] [blame] | 272 | if (!paint) { |
Chet Haase | e816bae | 2012-08-09 13:39:02 -0700 | [diff] [blame] | 273 | return paint; |
Chet Haase | d98aa2d | 2010-10-25 15:47:32 -0700 | [diff] [blame] | 274 | } |
Romain Guy | 0fe478e | 2010-11-08 12:08:41 -0800 | [diff] [blame] | 275 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 276 | const SkPaint* paintCopy = mPaintMap.valueFor(paint); |
Chet Haase | d98aa2d | 2010-10-25 15:47:32 -0700 | [diff] [blame] | 277 | if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) { |
| 278 | paintCopy = new SkPaint(*paint); |
Romain Guy | 96ebc6b | 2012-02-21 18:32:32 -0800 | [diff] [blame] | 279 | // replaceValueFor() performs an add if the entry doesn't exist |
| 280 | mPaintMap.replaceValueFor(paint, paintCopy); |
Chet Haase | d98aa2d | 2010-10-25 15:47:32 -0700 | [diff] [blame] | 281 | mPaints.add(paintCopy); |
| 282 | } |
Romain Guy | 0fe478e | 2010-11-08 12:08:41 -0800 | [diff] [blame] | 283 | |
Chet Haase | e816bae | 2012-08-09 13:39:02 -0700 | [diff] [blame] | 284 | return paintCopy; |
Romain Guy | 0fe478e | 2010-11-08 12:08:41 -0800 | [diff] [blame] | 285 | } |
| 286 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 287 | inline const SkRegion* refRegion(const SkRegion* region) { |
Romain Guy | 735738c | 2012-12-03 12:34:51 -0800 | [diff] [blame] | 288 | if (!region) { |
Romain Guy | 735738c | 2012-12-03 12:34:51 -0800 | [diff] [blame] | 289 | return region; |
| 290 | } |
| 291 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 292 | const SkRegion* regionCopy = mRegionMap.valueFor(region); |
Romain Guy | 735738c | 2012-12-03 12:34:51 -0800 | [diff] [blame] | 293 | // TODO: Add generation ID to SkRegion |
| 294 | if (regionCopy == NULL) { |
| 295 | regionCopy = new SkRegion(*region); |
| 296 | // replaceValueFor() performs an add if the entry doesn't exist |
| 297 | mRegionMap.replaceValueFor(region, regionCopy); |
| 298 | mRegions.add(regionCopy); |
| 299 | } |
| 300 | |
Romain Guy | 735738c | 2012-12-03 12:34:51 -0800 | [diff] [blame] | 301 | return regionCopy; |
| 302 | } |
| 303 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 304 | inline const SkMatrix* refMatrix(const SkMatrix* matrix) { |
Romain Guy | 4e7b772 | 2013-07-16 13:47:01 -0700 | [diff] [blame] | 305 | if (matrix) { |
| 306 | // Copying the matrix is cheap and prevents against the user changing |
| 307 | // the original matrix before the operation that uses it |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 308 | const SkMatrix* copy = new SkMatrix(*matrix); |
Romain Guy | 4e7b772 | 2013-07-16 13:47:01 -0700 | [diff] [blame] | 309 | mMatrices.add(copy); |
| 310 | return copy; |
| 311 | } |
| 312 | return matrix; |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 313 | } |
| 314 | |
Romain Guy | ce4a7df | 2013-03-28 11:32:33 -0700 | [diff] [blame] | 315 | inline Layer* refLayer(Layer* layer) { |
| 316 | mLayers.add(layer); |
| 317 | mCaches.resourceCache.incrementRefcount(layer); |
| 318 | return layer; |
| 319 | } |
| 320 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 321 | inline const SkBitmap* refBitmap(const SkBitmap* bitmap) { |
Chet Haase | d98aa2d | 2010-10-25 15:47:32 -0700 | [diff] [blame] | 322 | // Note that this assumes the bitmap is immutable. There are cases this won't handle |
| 323 | // correctly, such as creating the bitmap from scratch, drawing with it, changing its |
| 324 | // contents, and drawing again. The only fix would be to always copy it the first time, |
| 325 | // which doesn't seem worth the extra cycles for this unlikely case. |
Chet Haase | 5c13d89 | 2010-10-08 08:37:55 -0700 | [diff] [blame] | 326 | mBitmapResources.add(bitmap); |
Romain Guy | 58ecc20 | 2012-09-07 11:58:36 -0700 | [diff] [blame] | 327 | mCaches.resourceCache.incrementRefcount(bitmap); |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 328 | return bitmap; |
Chet Haase | 5c13d89 | 2010-10-08 08:37:55 -0700 | [diff] [blame] | 329 | } |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 330 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 331 | inline const SkBitmap* refBitmapData(const SkBitmap* bitmap) { |
Romain Guy | 49c5fc0 | 2012-05-15 11:10:01 -0700 | [diff] [blame] | 332 | mOwnedBitmapResources.add(bitmap); |
Romain Guy | 58ecc20 | 2012-09-07 11:58:36 -0700 | [diff] [blame] | 333 | mCaches.resourceCache.incrementRefcount(bitmap); |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 334 | return bitmap; |
Romain Guy | 49c5fc0 | 2012-05-15 11:10:01 -0700 | [diff] [blame] | 335 | } |
| 336 | |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 337 | inline SkiaShader* refShader(SkiaShader* shader) { |
| 338 | if (!shader) return NULL; |
Romain Guy | 24c0021 | 2011-01-14 15:31:00 -0800 | [diff] [blame] | 339 | |
| 340 | SkiaShader* shaderCopy = mShaderMap.valueFor(shader); |
| 341 | // TODO: We also need to handle generation ID changes in compose shaders |
Romain Guy | 1f1fcb7 | 2011-01-14 15:37:54 -0800 | [diff] [blame] | 342 | if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) { |
Romain Guy | 24c0021 | 2011-01-14 15:31:00 -0800 | [diff] [blame] | 343 | shaderCopy = shader->copy(); |
Romain Guy | 96ebc6b | 2012-02-21 18:32:32 -0800 | [diff] [blame] | 344 | // replaceValueFor() performs an add if the entry doesn't exist |
| 345 | mShaderMap.replaceValueFor(shader, shaderCopy); |
Romain Guy | 1f1fcb7 | 2011-01-14 15:37:54 -0800 | [diff] [blame] | 346 | mShaders.add(shaderCopy); |
Romain Guy | 58ecc20 | 2012-09-07 11:58:36 -0700 | [diff] [blame] | 347 | mCaches.resourceCache.incrementRefcount(shaderCopy); |
Romain Guy | 24c0021 | 2011-01-14 15:31:00 -0800 | [diff] [blame] | 348 | } |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 349 | return shaderCopy; |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 350 | } |
| 351 | |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 352 | inline SkiaColorFilter* refColorFilter(SkiaColorFilter* colorFilter) { |
Chet Haase | ad93c2b | 2010-10-22 16:17:12 -0700 | [diff] [blame] | 353 | mFilterResources.add(colorFilter); |
Romain Guy | 58ecc20 | 2012-09-07 11:58:36 -0700 | [diff] [blame] | 354 | mCaches.resourceCache.incrementRefcount(colorFilter); |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 355 | return colorFilter; |
Chet Haase | ad93c2b | 2010-10-22 16:17:12 -0700 | [diff] [blame] | 356 | } |
| 357 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 358 | inline const Res_png_9patch* refPatch(const Res_png_9patch* patch) { |
Romain Guy | e3b0a01 | 2013-06-26 15:45:41 -0700 | [diff] [blame] | 359 | mPatchResources.add(patch); |
| 360 | mCaches.resourceCache.incrementRefcount(patch); |
| 361 | return patch; |
| 362 | } |
| 363 | |
Chris Craik | f57776b | 2013-10-25 18:30:17 -0700 | [diff] [blame] | 364 | // TODO: move these to DisplayListData |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 365 | Vector<const SkBitmap*> mBitmapResources; |
| 366 | Vector<const SkBitmap*> mOwnedBitmapResources; |
Chet Haase | ad93c2b | 2010-10-22 16:17:12 -0700 | [diff] [blame] | 367 | Vector<SkiaColorFilter*> mFilterResources; |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 368 | Vector<const Res_png_9patch*> mPatchResources; |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 369 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 370 | Vector<const SkPaint*> mPaints; |
| 371 | DefaultKeyedVector<const SkPaint*, const SkPaint*> mPaintMap; |
Romain Guy | 24c0021 | 2011-01-14 15:31:00 -0800 | [diff] [blame] | 372 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 373 | Vector<const SkPath*> mPaths; |
| 374 | DefaultKeyedVector<const SkPath*, const SkPath*> mPathMap; |
Romain Guy | 2fc941e | 2011-02-03 15:06:05 -0800 | [diff] [blame] | 375 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 376 | SortedVector<const SkPath*> mSourcePaths; |
Chet Haase | d34dd71 | 2012-05-02 18:50:34 -0700 | [diff] [blame] | 377 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 378 | Vector<const SkRegion*> mRegions; |
| 379 | DefaultKeyedVector<const SkRegion*, const SkRegion*> mRegionMap; |
Romain Guy | 735738c | 2012-12-03 12:34:51 -0800 | [diff] [blame] | 380 | |
Romain Guy | 24c0021 | 2011-01-14 15:31:00 -0800 | [diff] [blame] | 381 | Vector<SkiaShader*> mShaders; |
| 382 | DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap; |
| 383 | |
Chris Craik | d218a92 | 2014-01-02 17:13:34 -0800 | [diff] [blame] | 384 | Vector<const SkMatrix*> mMatrices; |
Chet Haase | d98aa2d | 2010-10-25 15:47:32 -0700 | [diff] [blame] | 385 | |
Chet Haase | 603f6de | 2012-09-14 15:31:25 -0700 | [diff] [blame] | 386 | Vector<Layer*> mLayers; |
| 387 | |
Romain Guy | 27454a4 | 2011-01-23 12:01:41 -0800 | [diff] [blame] | 388 | int mRestoreSaveCount; |
Romain Guy | 33f6beb | 2012-02-16 19:24:51 -0800 | [diff] [blame] | 389 | |
Romain Guy | 58ecc20 | 2012-09-07 11:58:36 -0700 | [diff] [blame] | 390 | Caches& mCaches; |
Chris Craik | 2af4635 | 2012-11-26 18:30:17 -0800 | [diff] [blame] | 391 | sp<DisplayListData> mDisplayListData; |
Romain Guy | 58ecc20 | 2012-09-07 11:58:36 -0700 | [diff] [blame] | 392 | |
Romain Guy | 33f6beb | 2012-02-16 19:24:51 -0800 | [diff] [blame] | 393 | float mTranslateX; |
| 394 | float mTranslateY; |
| 395 | bool mHasTranslate; |
Romain Guy | 04c9d8c | 2011-08-25 14:01:48 -0700 | [diff] [blame] | 396 | bool mHasDrawOps; |
Romain Guy | 27454a4 | 2011-01-23 12:01:41 -0800 | [diff] [blame] | 397 | |
Romain Guy | 54c1a64 | 2012-09-27 17:55:46 -0700 | [diff] [blame] | 398 | uint32_t mFunctorCount; |
| 399 | |
Romain Guy | b051e89 | 2010-09-28 19:09:36 -0700 | [diff] [blame] | 400 | friend class DisplayList; |
| 401 | |
Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 402 | }; // class DisplayListRenderer |
| 403 | |
| 404 | }; // namespace uirenderer |
| 405 | }; // namespace android |
| 406 | |
Romain Guy | 5b3b352 | 2010-10-27 18:57:51 -0700 | [diff] [blame] | 407 | #endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H |