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