• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 #ifndef ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
18 #define ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
19 
20 #include <SkChunkAlloc.h>
21 #include <SkFlattenable.h>
22 #include <SkMatrix.h>
23 #include <SkCamera.h>
24 #include <SkPaint.h>
25 #include <SkPath.h>
26 #include <SkRefCnt.h>
27 #include <SkTDArray.h>
28 #include <SkTSearch.h>
29 
30 #include <cutils/compiler.h>
31 
32 #include "DisplayListLogBuffer.h"
33 #include "OpenGLRenderer.h"
34 
35 namespace android {
36 namespace uirenderer {
37 
38 ///////////////////////////////////////////////////////////////////////////////
39 // Defines
40 ///////////////////////////////////////////////////////////////////////////////
41 
42 #define MIN_WRITER_SIZE 4096
43 #define OP_MAY_BE_SKIPPED_MASK 0xff000000
44 
45 // Debug
46 #if DEBUG_DISPLAY_LIST
47     #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__)
48 #else
49     #define DISPLAY_LIST_LOGD(...)
50 #endif
51 
52 #define TRANSLATION 0x0001
53 #define ROTATION    0x0002
54 #define ROTATION_3D 0x0004
55 #define SCALE       0x0008
56 #define PIVOT       0x0010
57 
58 ///////////////////////////////////////////////////////////////////////////////
59 // Display list
60 ///////////////////////////////////////////////////////////////////////////////
61 
62 class DisplayListRenderer;
63 
64 /**
65  * Replays recorded drawing commands.
66  */
67 class DisplayList {
68 public:
69     DisplayList(const DisplayListRenderer& recorder);
70     ANDROID_API ~DisplayList();
71 
72     // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file
73     //            when modifying this file
74     enum Op {
75         // Non-drawing operations
76         Save = 0,
77         Restore,
78         RestoreToCount,
79         SaveLayer,
80         SaveLayerAlpha,
81         Translate,
82         Rotate,
83         Scale,
84         Skew,
85         SetMatrix,
86         ConcatMatrix,
87         ClipRect,
88         // Drawing operations
89         DrawDisplayList,
90         DrawLayer,
91         DrawBitmap,
92         DrawBitmapMatrix,
93         DrawBitmapRect,
94         DrawBitmapData,
95         DrawBitmapMesh,
96         DrawPatch,
97         DrawColor,
98         DrawRect,
99         DrawRoundRect,
100         DrawCircle,
101         DrawOval,
102         DrawArc,
103         DrawPath,
104         DrawLines,
105         DrawPoints,
106         DrawTextOnPath,
107         DrawPosText,
108         DrawText,
109         ResetShader,
110         SetupShader,
111         ResetColorFilter,
112         SetupColorFilter,
113         ResetShadow,
114         SetupShadow,
115         ResetPaintFilter,
116         SetupPaintFilter,
117         DrawGLFunction,
118     };
119 
120     // See flags defined in DisplayList.java
121     enum ReplayFlag {
122         kReplayFlag_ClipChildren = 0x1
123     };
124 
125     static const char* OP_NAMES[];
126 
127     void setViewProperties(OpenGLRenderer& renderer, uint32_t level);
128     void outputViewProperties(OpenGLRenderer& renderer, char* indent);
129 
130     ANDROID_API size_t getSize();
131     ANDROID_API static void destroyDisplayListDeferred(DisplayList* displayList);
132     ANDROID_API static void outputLogBuffer(int fd);
133 
134     void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false);
135 
136     status_t replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level = 0);
137 
138     void output(OpenGLRenderer& renderer, uint32_t level = 0);
139 
140     ANDROID_API void reset();
141 
setRenderable(bool renderable)142     void setRenderable(bool renderable) {
143         mIsRenderable = renderable;
144     }
145 
isRenderable()146     bool isRenderable() const {
147         return mIsRenderable;
148     }
149 
setName(const char * name)150     void setName(const char* name) {
151         if (name) {
152             mName.setTo(name);
153         }
154     }
155 
setClipChildren(bool clipChildren)156     void setClipChildren(bool clipChildren) {
157         mClipChildren = clipChildren;
158     }
159 
setStaticMatrix(SkMatrix * matrix)160     void setStaticMatrix(SkMatrix* matrix) {
161         delete mStaticMatrix;
162         mStaticMatrix = new SkMatrix(*matrix);
163     }
164 
setAnimationMatrix(SkMatrix * matrix)165     void setAnimationMatrix(SkMatrix* matrix) {
166         delete mAnimationMatrix;
167         if (matrix) {
168             mAnimationMatrix = new SkMatrix(*matrix);
169         } else {
170             mAnimationMatrix = NULL;
171         }
172     }
173 
setAlpha(float alpha)174     void setAlpha(float alpha) {
175         alpha = fminf(1.0f, fmaxf(0.0f, alpha));
176         if (alpha != mAlpha) {
177             mAlpha = alpha;
178             mMultipliedAlpha = (int) (255 * alpha);
179         }
180     }
181 
setHasOverlappingRendering(bool hasOverlappingRendering)182     void setHasOverlappingRendering(bool hasOverlappingRendering) {
183         mHasOverlappingRendering = hasOverlappingRendering;
184     }
185 
setTranslationX(float translationX)186     void setTranslationX(float translationX) {
187         if (translationX != mTranslationX) {
188             mTranslationX = translationX;
189             mMatrixDirty = true;
190             if (mTranslationX == 0.0f && mTranslationY == 0.0f) {
191                 mMatrixFlags &= ~TRANSLATION;
192             } else {
193                 mMatrixFlags |= TRANSLATION;
194             }
195         }
196     }
197 
setTranslationY(float translationY)198     void setTranslationY(float translationY) {
199         if (translationY != mTranslationY) {
200             mTranslationY = translationY;
201             mMatrixDirty = true;
202             if (mTranslationX == 0.0f && mTranslationY == 0.0f) {
203                 mMatrixFlags &= ~TRANSLATION;
204             } else {
205                 mMatrixFlags |= TRANSLATION;
206             }
207         }
208     }
209 
setRotation(float rotation)210     void setRotation(float rotation) {
211         if (rotation != mRotation) {
212             mRotation = rotation;
213             mMatrixDirty = true;
214             if (mRotation == 0.0f) {
215                 mMatrixFlags &= ~ROTATION;
216             } else {
217                 mMatrixFlags |= ROTATION;
218             }
219         }
220     }
221 
setRotationX(float rotationX)222     void setRotationX(float rotationX) {
223         if (rotationX != mRotationX) {
224             mRotationX = rotationX;
225             mMatrixDirty = true;
226             if (mRotationX == 0.0f && mRotationY == 0.0f) {
227                 mMatrixFlags &= ~ROTATION_3D;
228             } else {
229                 mMatrixFlags |= ROTATION_3D;
230             }
231         }
232     }
233 
setRotationY(float rotationY)234     void setRotationY(float rotationY) {
235         if (rotationY != mRotationY) {
236             mRotationY = rotationY;
237             mMatrixDirty = true;
238             if (mRotationX == 0.0f && mRotationY == 0.0f) {
239                 mMatrixFlags &= ~ROTATION_3D;
240             } else {
241                 mMatrixFlags |= ROTATION_3D;
242             }
243         }
244     }
245 
setScaleX(float scaleX)246     void setScaleX(float scaleX) {
247         if (scaleX != mScaleX) {
248             mScaleX = scaleX;
249             mMatrixDirty = true;
250             if (mScaleX == 1.0f && mScaleY == 1.0f) {
251                 mMatrixFlags &= ~SCALE;
252             } else {
253                 mMatrixFlags |= SCALE;
254             }
255         }
256     }
257 
setScaleY(float scaleY)258     void setScaleY(float scaleY) {
259         if (scaleY != mScaleY) {
260             mScaleY = scaleY;
261             mMatrixDirty = true;
262             if (mScaleX == 1.0f && mScaleY == 1.0f) {
263                 mMatrixFlags &= ~SCALE;
264             } else {
265                 mMatrixFlags |= SCALE;
266             }
267         }
268     }
269 
setPivotX(float pivotX)270     void setPivotX(float pivotX) {
271         mPivotX = pivotX;
272         mMatrixDirty = true;
273         if (mPivotX == 0.0f && mPivotY == 0.0f) {
274             mMatrixFlags &= ~PIVOT;
275         } else {
276             mMatrixFlags |= PIVOT;
277         }
278         mPivotExplicitlySet = true;
279     }
280 
setPivotY(float pivotY)281     void setPivotY(float pivotY) {
282         mPivotY = pivotY;
283         mMatrixDirty = true;
284         if (mPivotX == 0.0f && mPivotY == 0.0f) {
285             mMatrixFlags &= ~PIVOT;
286         } else {
287             mMatrixFlags |= PIVOT;
288         }
289         mPivotExplicitlySet = true;
290     }
291 
setCameraDistance(float distance)292     void setCameraDistance(float distance) {
293         if (distance != mCameraDistance) {
294             mCameraDistance = distance;
295             mMatrixDirty = true;
296             if (!mTransformCamera) {
297                 mTransformCamera = new Sk3DView();
298                 mTransformMatrix3D = new SkMatrix();
299             }
300             mTransformCamera->setCameraLocation(0, 0, distance);
301         }
302     }
303 
setLeft(int left)304     void setLeft(int left) {
305         if (left != mLeft) {
306             mLeft = left;
307             mWidth = mRight - mLeft;
308             if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
309                 mMatrixDirty = true;
310             }
311         }
312     }
313 
setTop(int top)314     void setTop(int top) {
315         if (top != mTop) {
316             mTop = top;
317             mHeight = mBottom - mTop;
318             if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
319                 mMatrixDirty = true;
320             }
321         }
322     }
323 
setRight(int right)324     void setRight(int right) {
325         if (right != mRight) {
326             mRight = right;
327             mWidth = mRight - mLeft;
328             if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
329                 mMatrixDirty = true;
330             }
331         }
332     }
333 
setBottom(int bottom)334     void setBottom(int bottom) {
335         if (bottom != mBottom) {
336             mBottom = bottom;
337             mHeight = mBottom - mTop;
338             if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
339                 mMatrixDirty = true;
340             }
341         }
342     }
343 
setLeftTop(int left,int top)344     void setLeftTop(int left, int top) {
345         if (left != mLeft || top != mTop) {
346             mLeft = left;
347             mTop = top;
348             mWidth = mRight - mLeft;
349             mHeight = mBottom - mTop;
350             if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
351                 mMatrixDirty = true;
352             }
353         }
354     }
355 
setLeftTopRightBottom(int left,int top,int right,int bottom)356     void setLeftTopRightBottom(int left, int top, int right, int bottom) {
357         if (left != mLeft || top != mTop || right != mRight || bottom != mBottom) {
358             mLeft = left;
359             mTop = top;
360             mRight = right;
361             mBottom = bottom;
362             mWidth = mRight - mLeft;
363             mHeight = mBottom - mTop;
364             if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
365                 mMatrixDirty = true;
366             }
367         }
368     }
369 
offsetLeftRight(int offset)370     void offsetLeftRight(int offset) {
371         if (offset != 0) {
372             mLeft += offset;
373             mRight += offset;
374             if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
375                 mMatrixDirty = true;
376             }
377         }
378     }
379 
offsetTopBottom(int offset)380     void offsetTopBottom(int offset) {
381         if (offset != 0) {
382             mTop += offset;
383             mBottom += offset;
384             if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
385                 mMatrixDirty = true;
386             }
387         }
388     }
389 
setCaching(bool caching)390     void setCaching(bool caching) {
391         mCaching = caching;
392     }
393 
getWidth()394     int getWidth() {
395         return mWidth;
396     }
397 
getHeight()398     int getHeight() {
399         return mHeight;
400     }
401 
402 private:
403     void init();
404 
405     void clearResources();
406 
407     void updateMatrix();
408 
409     class TextContainer {
410     public:
length()411         size_t length() const {
412             return mByteLength;
413         }
414 
text()415         const char* text() const {
416             return (const char*) mText;
417         }
418 
419         size_t mByteLength;
420         const char* mText;
421     };
422 
getBitmap()423     SkBitmap* getBitmap() {
424         return (SkBitmap*) getInt();
425     }
426 
getBitmapData()427     SkBitmap* getBitmapData() {
428         return (SkBitmap*) getInt();
429     }
430 
getShader()431     SkiaShader* getShader() {
432         return (SkiaShader*) getInt();
433     }
434 
getColorFilter()435     SkiaColorFilter* getColorFilter() {
436         return (SkiaColorFilter*) getInt();
437     }
438 
getIndex()439     inline int32_t getIndex() {
440         return mReader.readInt();
441     }
442 
getInt()443     inline int32_t getInt() {
444         return mReader.readInt();
445     }
446 
getUInt()447     inline uint32_t getUInt() {
448         return mReader.readU32();
449     }
450 
getMatrix()451     SkMatrix* getMatrix() {
452         return (SkMatrix*) getInt();
453     }
454 
getPath()455     SkPath* getPath() {
456         return (SkPath*) getInt();
457     }
458 
getPaint(OpenGLRenderer & renderer)459     SkPaint* getPaint(OpenGLRenderer& renderer) {
460         return renderer.filterPaint((SkPaint*) getInt());
461     }
462 
getDisplayList()463     DisplayList* getDisplayList() {
464         return (DisplayList*) getInt();
465     }
466 
getFloat()467     inline float getFloat() {
468         return mReader.readScalar();
469     }
470 
getInts(uint32_t & count)471     int32_t* getInts(uint32_t& count) {
472         count = getInt();
473         return (int32_t*) mReader.skip(count * sizeof(int32_t));
474     }
475 
getUInts(int8_t & count)476     uint32_t* getUInts(int8_t& count) {
477         count = getInt();
478         return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
479     }
480 
getFloats(int32_t & count)481     float* getFloats(int32_t& count) {
482         count = getInt();
483         return (float*) mReader.skip(count * sizeof(float));
484     }
485 
getText(TextContainer * text)486     void getText(TextContainer* text) {
487         size_t length = text->mByteLength = getInt();
488         text->mText = (const char*) mReader.skip(length);
489     }
490 
491     Vector<SkBitmap*> mBitmapResources;
492     Vector<SkBitmap*> mOwnedBitmapResources;
493     Vector<SkiaColorFilter*> mFilterResources;
494 
495     Vector<SkPaint*> mPaints;
496     Vector<SkPath*> mPaths;
497     SortedVector<SkPath*> mSourcePaths;
498     Vector<SkMatrix*> mMatrices;
499     Vector<SkiaShader*> mShaders;
500     Vector<Layer*> mLayers;
501 
502     mutable SkFlattenableReadBuffer mReader;
503 
504     size_t mSize;
505 
506     bool mIsRenderable;
507     uint32_t mFunctorCount;
508 
509     String8 mName;
510 
511     // View properties
512     bool mClipChildren;
513     float mAlpha;
514     int mMultipliedAlpha;
515     bool mHasOverlappingRendering;
516     float mTranslationX, mTranslationY;
517     float mRotation, mRotationX, mRotationY;
518     float mScaleX, mScaleY;
519     float mPivotX, mPivotY;
520     float mCameraDistance;
521     int mLeft, mTop, mRight, mBottom;
522     int mWidth, mHeight;
523     int mPrevWidth, mPrevHeight;
524     bool mPivotExplicitlySet;
525     bool mMatrixDirty;
526     bool mMatrixIsIdentity;
527     uint32_t mMatrixFlags;
528     SkMatrix* mTransformMatrix;
529     Sk3DView* mTransformCamera;
530     SkMatrix* mTransformMatrix3D;
531     SkMatrix* mStaticMatrix;
532     SkMatrix* mAnimationMatrix;
533     bool mCaching;
534 };
535 
536 ///////////////////////////////////////////////////////////////////////////////
537 // Renderer
538 ///////////////////////////////////////////////////////////////////////////////
539 
540 /**
541  * Records drawing commands in a display list for latter playback.
542  */
543 class DisplayListRenderer: public OpenGLRenderer {
544 public:
545     ANDROID_API DisplayListRenderer();
546     virtual ~DisplayListRenderer();
547 
548     ANDROID_API DisplayList* getDisplayList(DisplayList* displayList);
549 
550     virtual bool isDeferred();
551 
552     virtual void setViewport(int width, int height);
553     virtual status_t prepareDirty(float left, float top, float right, float bottom, bool opaque);
554     virtual void finish();
555 
556     virtual status_t callDrawGLFunction(Functor *functor, Rect& dirty);
557 
558     virtual void interrupt();
559     virtual void resume();
560 
561     virtual int save(int flags);
562     virtual void restore();
563     virtual void restoreToCount(int saveCount);
564 
565     virtual int saveLayer(float left, float top, float right, float bottom,
566             SkPaint* p, int flags);
567     virtual int saveLayerAlpha(float left, float top, float right, float bottom,
568                 int alpha, int flags);
569 
570     virtual void translate(float dx, float dy);
571     virtual void rotate(float degrees);
572     virtual void scale(float sx, float sy);
573     virtual void skew(float sx, float sy);
574 
575     virtual void setMatrix(SkMatrix* matrix);
576     virtual void concatMatrix(SkMatrix* matrix);
577 
578     virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
579 
580     virtual status_t drawDisplayList(DisplayList* displayList, Rect& dirty, int32_t flags,
581             uint32_t level = 0);
582     virtual status_t drawLayer(Layer* layer, float x, float y, SkPaint* paint);
583     virtual status_t drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
584     virtual status_t drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
585     virtual status_t drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
586             float srcRight, float srcBottom, float dstLeft, float dstTop,
587             float dstRight, float dstBottom, SkPaint* paint);
588     virtual status_t drawBitmapData(SkBitmap* bitmap, float left, float top, SkPaint* paint);
589     virtual status_t drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
590             float* vertices, int* colors, SkPaint* paint);
591     virtual status_t drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
592             const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
593             float left, float top, float right, float bottom, SkPaint* paint);
594     virtual status_t drawColor(int color, SkXfermode::Mode mode);
595     virtual status_t drawRect(float left, float top, float right, float bottom, SkPaint* paint);
596     virtual status_t drawRoundRect(float left, float top, float right, float bottom,
597             float rx, float ry, SkPaint* paint);
598     virtual status_t drawCircle(float x, float y, float radius, SkPaint* paint);
599     virtual status_t drawOval(float left, float top, float right, float bottom, SkPaint* paint);
600     virtual status_t drawArc(float left, float top, float right, float bottom,
601             float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
602     virtual status_t drawPath(SkPath* path, SkPaint* paint);
603     virtual status_t drawLines(float* points, int count, SkPaint* paint);
604     virtual status_t drawPoints(float* points, int count, SkPaint* paint);
605     virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
606             float hOffset, float vOffset, SkPaint* paint);
607     virtual status_t drawPosText(const char* text, int bytesCount, int count,
608             const float* positions, SkPaint* paint);
609     virtual status_t drawText(const char* text, int bytesCount, int count,
610             float x, float y, const float* positions, SkPaint* paint, float length);
611 
612     virtual void resetShader();
613     virtual void setupShader(SkiaShader* shader);
614 
615     virtual void resetColorFilter();
616     virtual void setupColorFilter(SkiaColorFilter* filter);
617 
618     virtual void resetShadow();
619     virtual void setupShadow(float radius, float dx, float dy, int color);
620 
621     virtual void resetPaintFilter();
622     virtual void setupPaintFilter(int clearBits, int setBits);
623 
624     ANDROID_API void reset();
625 
writeStream()626     const SkWriter32& writeStream() const {
627         return mWriter;
628     }
629 
getBitmapResources()630     const Vector<SkBitmap*>& getBitmapResources() const {
631         return mBitmapResources;
632     }
633 
getOwnedBitmapResources()634     const Vector<SkBitmap*>& getOwnedBitmapResources() const {
635         return mOwnedBitmapResources;
636     }
637 
getFilterResources()638     const Vector<SkiaColorFilter*>& getFilterResources() const {
639         return mFilterResources;
640     }
641 
getShaders()642     const Vector<SkiaShader*>& getShaders() const {
643         return mShaders;
644     }
645 
getPaints()646     const Vector<SkPaint*>& getPaints() const {
647         return mPaints;
648     }
649 
getPaths()650     const Vector<SkPath*>& getPaths() const {
651         return mPaths;
652     }
653 
getSourcePaths()654     const SortedVector<SkPath*>& getSourcePaths() const {
655         return mSourcePaths;
656     }
657 
getLayers()658     const Vector<Layer*>& getLayers() const {
659         return mLayers;
660     }
661 
getMatrices()662     const Vector<SkMatrix*>& getMatrices() const {
663         return mMatrices;
664     }
665 
getFunctorCount()666     uint32_t getFunctorCount() const {
667         return mFunctorCount;
668     }
669 
670 private:
insertRestoreToCount()671     void insertRestoreToCount() {
672         if (mRestoreSaveCount >= 0) {
673             mWriter.writeInt(DisplayList::RestoreToCount);
674             addInt(mRestoreSaveCount);
675             mRestoreSaveCount = -1;
676         }
677     }
678 
insertTranlate()679     void insertTranlate() {
680         if (mHasTranslate) {
681             if (mTranslateX != 0.0f || mTranslateY != 0.0f) {
682                 mWriter.writeInt(DisplayList::Translate);
683                 addPoint(mTranslateX, mTranslateY);
684                 mTranslateX = mTranslateY = 0.0f;
685             }
686             mHasTranslate = false;
687         }
688     }
689 
addOp(const DisplayList::Op drawOp)690     inline void addOp(const DisplayList::Op drawOp) {
691         insertRestoreToCount();
692         insertTranlate();
693         mWriter.writeInt(drawOp);
694         mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList;
695     }
696 
addOp(const DisplayList::Op drawOp,const bool reject)697     uint32_t* addOp(const DisplayList::Op drawOp, const bool reject) {
698         insertRestoreToCount();
699         insertTranlate();
700         mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList;
701         if (reject) {
702             mWriter.writeInt(OP_MAY_BE_SKIPPED_MASK | drawOp);
703             mWriter.writeInt(0xdeaddead);
704             mBufferSize = mWriter.size();
705             return mWriter.peek32(mBufferSize - sizeof(int32_t));
706         }
707         mWriter.writeInt(drawOp);
708         return NULL;
709     }
710 
addSkip(uint32_t * location)711     inline void addSkip(uint32_t* location) {
712         if (location) {
713             *location = (int32_t) (mWriter.size() - mBufferSize);
714         }
715     }
716 
addInt(int32_t value)717     inline void addInt(int32_t value) {
718         mWriter.writeInt(value);
719     }
720 
addSize(uint32_t w,uint32_t h)721     inline void addSize(uint32_t w, uint32_t h) {
722         mWriter.writeInt(w);
723         mWriter.writeInt(h);
724     }
725 
addInts(const int32_t * values,uint32_t count)726     void addInts(const int32_t* values, uint32_t count) {
727         mWriter.writeInt(count);
728         mWriter.write(values, count * sizeof(int32_t));
729     }
730 
addUInts(const uint32_t * values,int8_t count)731     void addUInts(const uint32_t* values, int8_t count) {
732         mWriter.writeInt(count);
733         mWriter.write(values, count * sizeof(uint32_t));
734     }
735 
addFloat(float value)736     inline void addFloat(float value) {
737         mWriter.writeScalar(value);
738     }
739 
addFloats(const float * values,int32_t count)740     void addFloats(const float* values, int32_t count) {
741         mWriter.writeInt(count);
742         mWriter.write(values, count * sizeof(float));
743     }
744 
addPoint(float x,float y)745     inline void addPoint(float x, float y) {
746         mWriter.writeScalar(x);
747         mWriter.writeScalar(y);
748     }
749 
addBounds(float left,float top,float right,float bottom)750     inline void addBounds(float left, float top, float right, float bottom) {
751         mWriter.writeScalar(left);
752         mWriter.writeScalar(top);
753         mWriter.writeScalar(right);
754         mWriter.writeScalar(bottom);
755     }
756 
addText(const void * text,size_t byteLength)757     inline void addText(const void* text, size_t byteLength) {
758         mWriter.writeInt(byteLength);
759         mWriter.writePad(text, byteLength);
760     }
761 
addPath(SkPath * path)762     inline void addPath(SkPath* path) {
763         if (!path) {
764             addInt((int) NULL);
765             return;
766         }
767 
768         SkPath* pathCopy = mPathMap.valueFor(path);
769         if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) {
770             pathCopy = new SkPath(*path);
771             pathCopy->setSourcePath(path);
772             // replaceValueFor() performs an add if the entry doesn't exist
773             mPathMap.replaceValueFor(path, pathCopy);
774             mPaths.add(pathCopy);
775         }
776         if (mSourcePaths.indexOf(path) < 0) {
777             mCaches.resourceCache.incrementRefcount(path);
778             mSourcePaths.add(path);
779         }
780 
781         addInt((int) pathCopy);
782     }
783 
addPaint(SkPaint * paint)784     inline SkPaint* addPaint(SkPaint* paint) {
785         if (!paint) {
786             addInt((int) NULL);
787             return paint;
788         }
789 
790         SkPaint* paintCopy = mPaintMap.valueFor(paint);
791         if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
792             paintCopy = new SkPaint(*paint);
793             // replaceValueFor() performs an add if the entry doesn't exist
794             mPaintMap.replaceValueFor(paint, paintCopy);
795             mPaints.add(paintCopy);
796         }
797 
798         addInt((int) paintCopy);
799 
800         return paintCopy;
801     }
802 
addDisplayList(DisplayList * displayList)803     inline void addDisplayList(DisplayList* displayList) {
804         // TODO: To be safe, the display list should be ref-counted in the
805         //       resources cache, but we rely on the caller (UI toolkit) to
806         //       do the right thing for now
807         addInt((int) displayList);
808     }
809 
addMatrix(SkMatrix * matrix)810     inline void addMatrix(SkMatrix* matrix) {
811         // Copying the matrix is cheap and prevents against the user changing the original
812         // matrix before the operation that uses it
813         SkMatrix* copy = new SkMatrix(*matrix);
814         addInt((int) copy);
815         mMatrices.add(copy);
816     }
817 
addLayer(Layer * layer)818     inline void addLayer(Layer* layer) {
819         addInt((int) layer);
820         mLayers.add(layer);
821         mCaches.resourceCache.incrementRefcount(layer);
822     }
823 
addBitmap(SkBitmap * bitmap)824     inline void addBitmap(SkBitmap* bitmap) {
825         // Note that this assumes the bitmap is immutable. There are cases this won't handle
826         // correctly, such as creating the bitmap from scratch, drawing with it, changing its
827         // contents, and drawing again. The only fix would be to always copy it the first time,
828         // which doesn't seem worth the extra cycles for this unlikely case.
829         addInt((int) bitmap);
830         mBitmapResources.add(bitmap);
831         mCaches.resourceCache.incrementRefcount(bitmap);
832     }
833 
addBitmapData(SkBitmap * bitmap)834     void addBitmapData(SkBitmap* bitmap) {
835         addInt((int) bitmap);
836         mOwnedBitmapResources.add(bitmap);
837         mCaches.resourceCache.incrementRefcount(bitmap);
838     }
839 
addShader(SkiaShader * shader)840     inline void addShader(SkiaShader* shader) {
841         if (!shader) {
842             addInt((int) NULL);
843             return;
844         }
845 
846         SkiaShader* shaderCopy = mShaderMap.valueFor(shader);
847         // TODO: We also need to handle generation ID changes in compose shaders
848         if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) {
849             shaderCopy = shader->copy();
850             // replaceValueFor() performs an add if the entry doesn't exist
851             mShaderMap.replaceValueFor(shader, shaderCopy);
852             mShaders.add(shaderCopy);
853             mCaches.resourceCache.incrementRefcount(shaderCopy);
854         }
855 
856         addInt((int) shaderCopy);
857     }
858 
addColorFilter(SkiaColorFilter * colorFilter)859     inline void addColorFilter(SkiaColorFilter* colorFilter) {
860         addInt((int) colorFilter);
861         mFilterResources.add(colorFilter);
862         mCaches.resourceCache.incrementRefcount(colorFilter);
863     }
864 
865     Vector<SkBitmap*> mBitmapResources;
866     Vector<SkBitmap*> mOwnedBitmapResources;
867     Vector<SkiaColorFilter*> mFilterResources;
868 
869     Vector<SkPaint*> mPaints;
870     DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
871 
872     Vector<SkPath*> mPaths;
873     DefaultKeyedVector<SkPath*, SkPath*> mPathMap;
874 
875     SortedVector<SkPath*> mSourcePaths;
876 
877     Vector<SkiaShader*> mShaders;
878     DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap;
879 
880     Vector<SkMatrix*> mMatrices;
881 
882     Vector<Layer*> mLayers;
883 
884     uint32_t mBufferSize;
885 
886     int mRestoreSaveCount;
887 
888     Caches& mCaches;
889     SkWriter32 mWriter;
890 
891     float mTranslateX;
892     float mTranslateY;
893     bool mHasTranslate;
894     bool mHasDrawOps;
895 
896     uint32_t mFunctorCount;
897 
898     friend class DisplayList;
899 
900 }; // class DisplayListRenderer
901 
902 }; // namespace uirenderer
903 }; // namespace android
904 
905 #endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
906