OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "SkAnnotation.h" | 9 #include "SkAnnotation.h" |
10 #include "SkBitmapHeap.h" | 10 #include "SkBitmapHeap.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 case kColorFilter_PaintFlat: return paint.getColorFilter(); | 46 case kColorFilter_PaintFlat: return paint.getColorFilter(); |
47 case kDrawLooper_PaintFlat: return paint.getLooper(); | 47 case kDrawLooper_PaintFlat: return paint.getLooper(); |
48 case kMaskFilter_PaintFlat: return paint.getMaskFilter(); | 48 case kMaskFilter_PaintFlat: return paint.getMaskFilter(); |
49 case kPathEffect_PaintFlat: return paint.getPathEffect(); | 49 case kPathEffect_PaintFlat: return paint.getPathEffect(); |
50 case kRasterizer_PaintFlat: return paint.getRasterizer(); | 50 case kRasterizer_PaintFlat: return paint.getRasterizer(); |
51 case kShader_PaintFlat: return paint.getShader(); | 51 case kShader_PaintFlat: return paint.getShader(); |
52 case kImageFilter_PaintFlat: return paint.getImageFilter(); | 52 case kImageFilter_PaintFlat: return paint.getImageFilter(); |
53 case kXfermode_PaintFlat: return paint.getXfermode(); | 53 case kXfermode_PaintFlat: return paint.getXfermode(); |
54 } | 54 } |
55 SkDEBUGFAIL("never gets here"); | 55 SkDEBUGFAIL("never gets here"); |
56 return NULL; | 56 return nullptr; |
57 } | 57 } |
58 | 58 |
59 static size_t writeTypeface(SkWriter32* writer, SkTypeface* typeface) { | 59 static size_t writeTypeface(SkWriter32* writer, SkTypeface* typeface) { |
60 SkASSERT(typeface); | 60 SkASSERT(typeface); |
61 SkDynamicMemoryWStream stream; | 61 SkDynamicMemoryWStream stream; |
62 typeface->serialize(&stream); | 62 typeface->serialize(&stream); |
63 size_t size = stream.getOffset(); | 63 size_t size = stream.getOffset(); |
64 if (writer) { | 64 if (writer) { |
65 writer->write32(SkToU32(size)); | 65 writer->write32(SkToU32(size)); |
66 SkAutoDataUnref data(stream.copyToData()); | 66 SkAutoDataUnref data(stream.copyToData()); |
67 writer->writePad(data->data(), size); | 67 writer->writePad(data->data(), size); |
68 } | 68 } |
69 return 4 + SkAlign4(size); | 69 return 4 + SkAlign4(size); |
70 } | 70 } |
71 | 71 |
72 /////////////////////////////////////////////////////////////////////////////// | 72 /////////////////////////////////////////////////////////////////////////////// |
73 | 73 |
74 class FlattenableHeap : public SkFlatController { | 74 class FlattenableHeap : public SkFlatController { |
75 public: | 75 public: |
76 FlattenableHeap(int numFlatsToKeep, SkNamedFactorySet* fset, bool isCrossPro
cess) | 76 FlattenableHeap(int numFlatsToKeep, SkNamedFactorySet* fset, bool isCrossPro
cess) |
77 : INHERITED(isCrossProcess ? SkWriteBuffer::kCrossProcess_Flag : 0) | 77 : INHERITED(isCrossProcess ? SkWriteBuffer::kCrossProcess_Flag : 0) |
78 , fNumFlatsToKeep(numFlatsToKeep) { | 78 , fNumFlatsToKeep(numFlatsToKeep) { |
79 SkASSERT((isCrossProcess && fset != NULL) || (!isCrossProcess && NULL ==
fset)); | 79 SkASSERT((isCrossProcess && fset != nullptr) || (!isCrossProcess && null
ptr == fset)); |
80 if (isCrossProcess) { | 80 if (isCrossProcess) { |
81 this->setNamedFactorySet(fset); | 81 this->setNamedFactorySet(fset); |
82 } | 82 } |
83 } | 83 } |
84 | 84 |
85 ~FlattenableHeap() { | 85 ~FlattenableHeap() { |
86 fPointers.freeAll(); | 86 fPointers.freeAll(); |
87 } | 87 } |
88 | 88 |
89 void* allocThrow(size_t bytes) override; | 89 void* allocThrow(size_t bytes) override; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 if (potential->index() == fFlatsThatMustBeKept[j]) { | 143 if (potential->index() == fFlatsThatMustBeKept[j]) { |
144 mustKeep = true; | 144 mustKeep = true; |
145 break; | 145 break; |
146 } | 146 } |
147 } | 147 } |
148 if (!mustKeep) { | 148 if (!mustKeep) { |
149 return potential; | 149 return potential; |
150 } | 150 } |
151 } | 151 } |
152 } | 152 } |
153 return NULL; | 153 return nullptr; |
154 } | 154 } |
155 | 155 |
156 /////////////////////////////////////////////////////////////////////////////// | 156 /////////////////////////////////////////////////////////////////////////////// |
157 | 157 |
158 struct SkFlattenableTraits { | 158 struct SkFlattenableTraits { |
159 static void Flatten(SkWriteBuffer& buffer, const SkFlattenable& flattenable)
{ | 159 static void Flatten(SkWriteBuffer& buffer, const SkFlattenable& flattenable)
{ |
160 buffer.writeFlattenable(&flattenable); | 160 buffer.writeFlattenable(&flattenable); |
161 } | 161 } |
162 // No need to define unflatten if we never call it. | 162 // No need to define unflatten if we never call it. |
163 }; | 163 }; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 fBitmapShuttle->removeCanvas(); | 222 fBitmapShuttle->removeCanvas(); |
223 } | 223 } |
224 fDone = true; | 224 fDone = true; |
225 } | 225 } |
226 | 226 |
227 void flushRecording(bool detachCurrentBlock); | 227 void flushRecording(bool detachCurrentBlock); |
228 size_t freeMemoryIfPossible(size_t bytesToFree); | 228 size_t freeMemoryIfPossible(size_t bytesToFree); |
229 | 229 |
230 size_t storageAllocatedForRecording() { | 230 size_t storageAllocatedForRecording() { |
231 size_t bytesAllocated = 0; | 231 size_t bytesAllocated = 0; |
232 if (NULL != fBitmapHeap) { | 232 if (nullptr != fBitmapHeap) { |
233 bytesAllocated += fBitmapHeap->bytesAllocated(); | 233 bytesAllocated += fBitmapHeap->bytesAllocated(); |
234 } | 234 } |
235 if (NULL != fImageHeap) { | 235 if (nullptr != fImageHeap) { |
236 bytesAllocated += fImageHeap->bytesInCache(); | 236 bytesAllocated += fImageHeap->bytesInCache(); |
237 } | 237 } |
238 return bytesAllocated; | 238 return bytesAllocated; |
239 } | 239 } |
240 | 240 |
241 /** | 241 /** |
242 * Flatten an SkBitmap to send to the reader, where it will be referenced | 242 * Flatten an SkBitmap to send to the reader, where it will be referenced |
243 * according to slot. | 243 * according to slot. |
244 */ | 244 */ |
245 bool shuttleBitmap(const SkBitmap&, int32_t slot); | 245 bool shuttleBitmap(const SkBitmap&, int32_t slot); |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 private: | 368 private: |
369 SkGPipeCanvas* fCanvas; | 369 SkGPipeCanvas* fCanvas; |
370 }; | 370 }; |
371 friend class AutoPipeNotify; | 371 friend class AutoPipeNotify; |
372 | 372 |
373 typedef SkCanvas INHERITED; | 373 typedef SkCanvas INHERITED; |
374 }; | 374 }; |
375 | 375 |
376 void SkGPipeCanvas::flattenFactoryNames() { | 376 void SkGPipeCanvas::flattenFactoryNames() { |
377 const char* name; | 377 const char* name; |
378 while ((name = fFactorySet->getNextAddedFactoryName()) != NULL) { | 378 while ((name = fFactorySet->getNextAddedFactoryName()) != nullptr) { |
379 size_t len = strlen(name); | 379 size_t len = strlen(name); |
380 if (this->needOpBytes(SkWriter32::WriteStringSize(name, len))) { | 380 if (this->needOpBytes(SkWriter32::WriteStringSize(name, len))) { |
381 this->writeOp(kDef_Factory_DrawOp); | 381 this->writeOp(kDef_Factory_DrawOp); |
382 fWriter.writeString(name, len); | 382 fWriter.writeString(name, len); |
383 } | 383 } |
384 } | 384 } |
385 } | 385 } |
386 | 386 |
387 bool SkGPipeCanvas::shuttleBitmap(const SkBitmap& bm, int32_t slot) { | 387 bool SkGPipeCanvas::shuttleBitmap(const SkBitmap& bm, int32_t slot) { |
388 SkASSERT(shouldFlattenBitmaps(fFlags)); | 388 SkASSERT(shouldFlattenBitmaps(fFlags)); |
389 SkWriteBuffer buffer; | 389 SkWriteBuffer buffer; |
390 buffer.setNamedFactoryRecorder(fFactorySet); | 390 buffer.setNamedFactoryRecorder(fFactorySet); |
391 buffer.writeBitmap(bm); | 391 buffer.writeBitmap(bm); |
392 this->flattenFactoryNames(); | 392 this->flattenFactoryNames(); |
393 size_t size = buffer.bytesWritten(); | 393 size_t size = buffer.bytesWritten(); |
394 if (this->needOpBytes(size)) { | 394 if (this->needOpBytes(size)) { |
395 this->writeOp(kDef_Bitmap_DrawOp, 0, slot); | 395 this->writeOp(kDef_Bitmap_DrawOp, 0, slot); |
396 void* dst = static_cast<void*>(fWriter.reserve(size)); | 396 void* dst = static_cast<void*>(fWriter.reserve(size)); |
397 buffer.writeToMemory(dst); | 397 buffer.writeToMemory(dst); |
398 return true; | 398 return true; |
399 } | 399 } |
400 return false; | 400 return false; |
401 } | 401 } |
402 | 402 |
403 // return 0 for NULL (or unflattenable obj), or index-base-1 | 403 // return 0 for nullptr (or unflattenable obj), or index-base-1 |
404 // return ~(index-base-1) if an old flattenable was replaced | 404 // return ~(index-base-1) if an old flattenable was replaced |
405 int SkGPipeCanvas::flattenToIndex(SkFlattenable* obj, PaintFlats paintflat) { | 405 int SkGPipeCanvas::flattenToIndex(SkFlattenable* obj, PaintFlats paintflat) { |
406 SkASSERT(!fDone && fBitmapHeap != NULL); | 406 SkASSERT(!fDone && fBitmapHeap != nullptr); |
407 if (NULL == obj) { | 407 if (nullptr == obj) { |
408 return 0; | 408 return 0; |
409 } | 409 } |
410 | 410 |
411 fBitmapHeap->deferAddingOwners(); | 411 fBitmapHeap->deferAddingOwners(); |
412 bool added, replaced; | 412 bool added, replaced; |
413 const SkFlatData* flat = fFlatDictionary.findAndReplace(*obj, fFlattenableHe
ap.flatToReplace(), | 413 const SkFlatData* flat = fFlatDictionary.findAndReplace(*obj, fFlattenableHe
ap.flatToReplace(), |
414 &added, &replaced); | 414 &added, &replaced); |
415 fBitmapHeap->endAddingOwnersDeferral(added); | 415 fBitmapHeap->endAddingOwnersDeferral(added); |
416 int index = flat->index(); | 416 int index = flat->index(); |
417 if (added) { | 417 if (added) { |
(...skipping 17 matching lines...) Expand all Loading... |
435 #define MIN_BLOCK_SIZE (16 * 1024) | 435 #define MIN_BLOCK_SIZE (16 * 1024) |
436 #define BITMAPS_TO_KEEP 5 | 436 #define BITMAPS_TO_KEEP 5 |
437 #define FLATTENABLES_TO_KEEP 10 | 437 #define FLATTENABLES_TO_KEEP 10 |
438 | 438 |
439 SkGPipeCanvas::SkGPipeCanvas(SkGPipeController* controller, | 439 SkGPipeCanvas::SkGPipeCanvas(SkGPipeController* controller, |
440 SkWriter32* writer, | 440 SkWriter32* writer, |
441 uint32_t flags, | 441 uint32_t flags, |
442 uint32_t width, | 442 uint32_t width, |
443 uint32_t height) | 443 uint32_t height) |
444 : SkCanvas(width, height) | 444 : SkCanvas(width, height) |
445 , fFactorySet(is_cross_process(flags) ? new SkNamedFactorySet : NULL) | 445 , fFactorySet(is_cross_process(flags) ? new SkNamedFactorySet : nullptr) |
446 , fWriter(*writer) | 446 , fWriter(*writer) |
447 , fFlags(flags) | 447 , fFlags(flags) |
448 , fFlattenableHeap(FLATTENABLES_TO_KEEP, fFactorySet, is_cross_process(flags
)) | 448 , fFlattenableHeap(FLATTENABLES_TO_KEEP, fFactorySet, is_cross_process(flags
)) |
449 , fFlatDictionary(&fFlattenableHeap) { | 449 , fFlatDictionary(&fFlattenableHeap) { |
450 fController = controller; | 450 fController = controller; |
451 fDone = false; | 451 fDone = false; |
452 fBlockSize = 0; // need first block from controller | 452 fBlockSize = 0; // need first block from controller |
453 fBytesNotified = 0; | 453 fBytesNotified = 0; |
454 sk_bzero(fCurrFlatIndex, sizeof(fCurrFlatIndex)); | 454 sk_bzero(fCurrFlatIndex, sizeof(fCurrFlatIndex)); |
455 | 455 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
494 needed += 4; // size of DrawOp atom | 494 needed += 4; // size of DrawOp atom |
495 needed = SkAlign4(needed); | 495 needed = SkAlign4(needed); |
496 if (fWriter.bytesWritten() + needed > fBlockSize) { | 496 if (fWriter.bytesWritten() + needed > fBlockSize) { |
497 // Before we wipe out any data that has already been written, read it ou
t. | 497 // Before we wipe out any data that has already been written, read it ou
t. |
498 this->doNotify(); | 498 this->doNotify(); |
499 | 499 |
500 // If we're going to allocate a new block, allocate enough to make it wo
rthwhile. | 500 // If we're going to allocate a new block, allocate enough to make it wo
rthwhile. |
501 needed = SkTMax<size_t>(MIN_BLOCK_SIZE, needed); | 501 needed = SkTMax<size_t>(MIN_BLOCK_SIZE, needed); |
502 | 502 |
503 void* block = fController->requestBlock(needed, &fBlockSize); | 503 void* block = fController->requestBlock(needed, &fBlockSize); |
504 if (NULL == block) { | 504 if (nullptr == block) { |
505 // Do not notify the readers, which would call this function again. | 505 // Do not notify the readers, which would call this function again. |
506 this->finish(false); | 506 this->finish(false); |
507 return false; | 507 return false; |
508 } | 508 } |
509 SkASSERT(SkIsAlign4(fBlockSize)); | 509 SkASSERT(SkIsAlign4(fBlockSize)); |
510 fWriter.reset(block, fBlockSize); | 510 fWriter.reset(block, fBlockSize); |
511 fBytesNotified = 0; | 511 fBytesNotified = 0; |
512 } | 512 } |
513 return true; | 513 return true; |
514 } | 514 } |
515 | 515 |
516 uint32_t SkGPipeCanvas::getTypefaceID(SkTypeface* face) { | 516 uint32_t SkGPipeCanvas::getTypefaceID(SkTypeface* face) { |
517 uint32_t id = 0; // 0 means default/null typeface | 517 uint32_t id = 0; // 0 means default/null typeface |
518 if (face) { | 518 if (face) { |
519 id = fTypefaceSet.find(face); | 519 id = fTypefaceSet.find(face); |
520 if (0 == id) { | 520 if (0 == id) { |
521 id = fTypefaceSet.add(face); | 521 id = fTypefaceSet.add(face); |
522 size_t size = writeTypeface(NULL, face); | 522 size_t size = writeTypeface(nullptr, face); |
523 if (this->needOpBytes(size)) { | 523 if (this->needOpBytes(size)) { |
524 this->writeOp(kDef_Typeface_DrawOp); | 524 this->writeOp(kDef_Typeface_DrawOp); |
525 writeTypeface(&fWriter, face); | 525 writeTypeface(&fWriter, face); |
526 } | 526 } |
527 } | 527 } |
528 } | 528 } |
529 return id; | 529 return id; |
530 } | 530 } |
531 | 531 |
532 /////////////////////////////////////////////////////////////////////////////// | 532 /////////////////////////////////////////////////////////////////////////////// |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
589 | 589 |
590 void SkGPipeCanvas::recordScale(const SkMatrix& m) { | 590 void SkGPipeCanvas::recordScale(const SkMatrix& m) { |
591 if (this->needOpBytes(2 * sizeof(SkScalar))) { | 591 if (this->needOpBytes(2 * sizeof(SkScalar))) { |
592 this->writeOp(kScale_DrawOp); | 592 this->writeOp(kScale_DrawOp); |
593 fWriter.writeScalar(m.getScaleX()); | 593 fWriter.writeScalar(m.getScaleX()); |
594 fWriter.writeScalar(m.getScaleY()); | 594 fWriter.writeScalar(m.getScaleY()); |
595 } | 595 } |
596 } | 596 } |
597 | 597 |
598 void SkGPipeCanvas::recordConcat(const SkMatrix& m) { | 598 void SkGPipeCanvas::recordConcat(const SkMatrix& m) { |
599 if (this->needOpBytes(m.writeToMemory(NULL))) { | 599 if (this->needOpBytes(m.writeToMemory(nullptr))) { |
600 this->writeOp(kConcat_DrawOp); | 600 this->writeOp(kConcat_DrawOp); |
601 fWriter.writeMatrix(m); | 601 fWriter.writeMatrix(m); |
602 } | 602 } |
603 } | 603 } |
604 | 604 |
605 void SkGPipeCanvas::didConcat(const SkMatrix& matrix) { | 605 void SkGPipeCanvas::didConcat(const SkMatrix& matrix) { |
606 if (!matrix.isIdentity()) { | 606 if (!matrix.isIdentity()) { |
607 NOTIFY_SETUP(this); | 607 NOTIFY_SETUP(this); |
608 switch (matrix.getType()) { | 608 switch (matrix.getType()) { |
609 case SkMatrix::kTranslate_Mask: | 609 case SkMatrix::kTranslate_Mask: |
610 this->recordTranslate(matrix); | 610 this->recordTranslate(matrix); |
611 break; | 611 break; |
612 case SkMatrix::kScale_Mask: | 612 case SkMatrix::kScale_Mask: |
613 this->recordScale(matrix); | 613 this->recordScale(matrix); |
614 break; | 614 break; |
615 default: | 615 default: |
616 this->recordConcat(matrix); | 616 this->recordConcat(matrix); |
617 break; | 617 break; |
618 } | 618 } |
619 } | 619 } |
620 | 620 |
621 this->INHERITED::didConcat(matrix); | 621 this->INHERITED::didConcat(matrix); |
622 } | 622 } |
623 | 623 |
624 void SkGPipeCanvas::didSetMatrix(const SkMatrix& matrix) { | 624 void SkGPipeCanvas::didSetMatrix(const SkMatrix& matrix) { |
625 NOTIFY_SETUP(this); | 625 NOTIFY_SETUP(this); |
626 if (this->needOpBytes(matrix.writeToMemory(NULL))) { | 626 if (this->needOpBytes(matrix.writeToMemory(nullptr))) { |
627 this->writeOp(kSetMatrix_DrawOp); | 627 this->writeOp(kSetMatrix_DrawOp); |
628 fWriter.writeMatrix(matrix); | 628 fWriter.writeMatrix(matrix); |
629 } | 629 } |
630 this->INHERITED::didSetMatrix(matrix); | 630 this->INHERITED::didSetMatrix(matrix); |
631 } | 631 } |
632 | 632 |
633 void SkGPipeCanvas::onClipRect(const SkRect& rect, SkRegion::Op rgnOp, | 633 void SkGPipeCanvas::onClipRect(const SkRect& rect, SkRegion::Op rgnOp, |
634 ClipEdgeStyle edgeStyle) { | 634 ClipEdgeStyle edgeStyle) { |
635 NOTIFY_SETUP(this); | 635 NOTIFY_SETUP(this); |
636 if (this->needOpBytes(sizeof(SkRect))) { | 636 if (this->needOpBytes(sizeof(SkRect))) { |
(...skipping 17 matching lines...) Expand all Loading... |
654 } | 654 } |
655 this->writeOp(kClipRRect_DrawOp, flags, rgnOp); | 655 this->writeOp(kClipRRect_DrawOp, flags, rgnOp); |
656 fWriter.writeRRect(rrect); | 656 fWriter.writeRRect(rrect); |
657 } | 657 } |
658 this->INHERITED::onClipRRect(rrect, rgnOp, edgeStyle); | 658 this->INHERITED::onClipRRect(rrect, rgnOp, edgeStyle); |
659 } | 659 } |
660 | 660 |
661 void SkGPipeCanvas::onClipPath(const SkPath& path, SkRegion::Op rgnOp, | 661 void SkGPipeCanvas::onClipPath(const SkPath& path, SkRegion::Op rgnOp, |
662 ClipEdgeStyle edgeStyle) { | 662 ClipEdgeStyle edgeStyle) { |
663 NOTIFY_SETUP(this); | 663 NOTIFY_SETUP(this); |
664 if (this->needOpBytes(path.writeToMemory(NULL))) { | 664 if (this->needOpBytes(path.writeToMemory(nullptr))) { |
665 unsigned flags = 0; | 665 unsigned flags = 0; |
666 if (kSoft_ClipEdgeStyle == edgeStyle) { | 666 if (kSoft_ClipEdgeStyle == edgeStyle) { |
667 flags = kClip_HasAntiAlias_DrawOpFlag; | 667 flags = kClip_HasAntiAlias_DrawOpFlag; |
668 } | 668 } |
669 this->writeOp(kClipPath_DrawOp, flags, rgnOp); | 669 this->writeOp(kClipPath_DrawOp, flags, rgnOp); |
670 fWriter.writePath(path); | 670 fWriter.writePath(path); |
671 } | 671 } |
672 // we just pass on the bounds of the path | 672 // we just pass on the bounds of the path |
673 this->INHERITED::onClipRect(path.getBounds(), rgnOp, edgeStyle); | 673 this->INHERITED::onClipRect(path.getBounds(), rgnOp, edgeStyle); |
674 } | 674 } |
675 | 675 |
676 void SkGPipeCanvas::onClipRegion(const SkRegion& region, SkRegion::Op rgnOp) { | 676 void SkGPipeCanvas::onClipRegion(const SkRegion& region, SkRegion::Op rgnOp) { |
677 NOTIFY_SETUP(this); | 677 NOTIFY_SETUP(this); |
678 if (this->needOpBytes(region.writeToMemory(NULL))) { | 678 if (this->needOpBytes(region.writeToMemory(nullptr))) { |
679 this->writeOp(kClipRegion_DrawOp, 0, rgnOp); | 679 this->writeOp(kClipRegion_DrawOp, 0, rgnOp); |
680 fWriter.writeRegion(region); | 680 fWriter.writeRegion(region); |
681 } | 681 } |
682 this->INHERITED::onClipRegion(region, rgnOp); | 682 this->INHERITED::onClipRegion(region, rgnOp); |
683 } | 683 } |
684 | 684 |
685 /////////////////////////////////////////////////////////////////////////////// | 685 /////////////////////////////////////////////////////////////////////////////// |
686 | 686 |
687 void SkGPipeCanvas::onDrawPaint(const SkPaint& paint) { | 687 void SkGPipeCanvas::onDrawPaint(const SkPaint& paint) { |
688 NOTIFY_SETUP(this); | 688 NOTIFY_SETUP(this); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
739 if (this->needOpBytes(kSizeOfFlatRRect * 2)) { | 739 if (this->needOpBytes(kSizeOfFlatRRect * 2)) { |
740 this->writeOp(kDrawDRRect_DrawOp); | 740 this->writeOp(kDrawDRRect_DrawOp); |
741 fWriter.writeRRect(outer); | 741 fWriter.writeRRect(outer); |
742 fWriter.writeRRect(inner); | 742 fWriter.writeRRect(inner); |
743 } | 743 } |
744 } | 744 } |
745 | 745 |
746 void SkGPipeCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { | 746 void SkGPipeCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { |
747 NOTIFY_SETUP(this); | 747 NOTIFY_SETUP(this); |
748 this->writePaint(paint); | 748 this->writePaint(paint); |
749 if (this->needOpBytes(path.writeToMemory(NULL))) { | 749 if (this->needOpBytes(path.writeToMemory(nullptr))) { |
750 this->writeOp(kDrawPath_DrawOp); | 750 this->writeOp(kDrawPath_DrawOp); |
751 fWriter.writePath(path); | 751 fWriter.writePath(path); |
752 } | 752 } |
753 } | 753 } |
754 | 754 |
755 bool SkGPipeCanvas::commonDrawBitmap(const SkBitmap& bm, DrawOps op, | 755 bool SkGPipeCanvas::commonDrawBitmap(const SkBitmap& bm, DrawOps op, |
756 unsigned flags, | 756 unsigned flags, |
757 size_t opBytesNeeded, | 757 size_t opBytesNeeded, |
758 const SkPaint* paint) { | 758 const SkPaint* paint) { |
759 if (fDone) { | 759 if (fDone) { |
760 return false; | 760 return false; |
761 } | 761 } |
762 | 762 |
763 if (paint != NULL) { | 763 if (paint != nullptr) { |
764 flags |= kDrawBitmap_HasPaint_DrawOpFlag; | 764 flags |= kDrawBitmap_HasPaint_DrawOpFlag; |
765 this->writePaint(*paint); | 765 this->writePaint(*paint); |
766 } | 766 } |
767 // This needs to run first so its calls to needOpBytes() and its writes | 767 // This needs to run first so its calls to needOpBytes() and its writes |
768 // don't interlace with the needOpBytes() and write below. | 768 // don't interlace with the needOpBytes() and write below. |
769 SkASSERT(fBitmapHeap != NULL); | 769 SkASSERT(fBitmapHeap != nullptr); |
770 int32_t bitmapIndex = fBitmapHeap->insert(bm); | 770 int32_t bitmapIndex = fBitmapHeap->insert(bm); |
771 if (SkBitmapHeap::INVALID_SLOT == bitmapIndex) { | 771 if (SkBitmapHeap::INVALID_SLOT == bitmapIndex) { |
772 return false; | 772 return false; |
773 } | 773 } |
774 | 774 |
775 if (this->needOpBytes(opBytesNeeded)) { | 775 if (this->needOpBytes(opBytesNeeded)) { |
776 this->writeOp(op, flags, bitmapIndex); | 776 this->writeOp(op, flags, bitmapIndex); |
777 return true; | 777 return true; |
778 } | 778 } |
779 return false; | 779 return false; |
780 } | 780 } |
781 | 781 |
782 void SkGPipeCanvas::onDrawBitmap(const SkBitmap& bm, SkScalar left, SkScalar top
, | 782 void SkGPipeCanvas::onDrawBitmap(const SkBitmap& bm, SkScalar left, SkScalar top
, |
783 const SkPaint* paint) { | 783 const SkPaint* paint) { |
784 NOTIFY_SETUP(this); | 784 NOTIFY_SETUP(this); |
785 size_t opBytesNeeded = sizeof(SkScalar) * 2; | 785 size_t opBytesNeeded = sizeof(SkScalar) * 2; |
786 | 786 |
787 if (this->commonDrawBitmap(bm, kDrawBitmap_DrawOp, 0, opBytesNeeded, paint))
{ | 787 if (this->commonDrawBitmap(bm, kDrawBitmap_DrawOp, 0, opBytesNeeded, paint))
{ |
788 fWriter.writeScalar(left); | 788 fWriter.writeScalar(left); |
789 fWriter.writeScalar(top); | 789 fWriter.writeScalar(top); |
790 } | 790 } |
791 } | 791 } |
792 | 792 |
793 void SkGPipeCanvas::onDrawBitmapRect(const SkBitmap& bm, const SkRect* src, cons
t SkRect& dst, | 793 void SkGPipeCanvas::onDrawBitmapRect(const SkBitmap& bm, const SkRect* src, cons
t SkRect& dst, |
794 const SkPaint* paint, SrcRectConstraint con
straint) { | 794 const SkPaint* paint, SrcRectConstraint con
straint) { |
795 NOTIFY_SETUP(this); | 795 NOTIFY_SETUP(this); |
796 size_t opBytesNeeded = sizeof(SkRect); | 796 size_t opBytesNeeded = sizeof(SkRect); |
797 bool hasSrc = src != NULL; | 797 bool hasSrc = src != nullptr; |
798 unsigned flags; | 798 unsigned flags; |
799 if (hasSrc) { | 799 if (hasSrc) { |
800 flags = kDrawBitmap_HasSrcRect_DrawOpFlag; | 800 flags = kDrawBitmap_HasSrcRect_DrawOpFlag; |
801 opBytesNeeded += sizeof(int32_t) * 4; | 801 opBytesNeeded += sizeof(int32_t) * 4; |
802 } else { | 802 } else { |
803 flags = 0; | 803 flags = 0; |
804 } | 804 } |
805 if (kFast_SrcRectConstraint == constraint) { | 805 if (kFast_SrcRectConstraint == constraint) { |
806 flags |= kDrawBitmap_Bleed_DrawOpFlag; | 806 flags |= kDrawBitmap_Bleed_DrawOpFlag; |
807 } | 807 } |
(...skipping 29 matching lines...) Expand all Loading... |
837 fWriter.write32(top); | 837 fWriter.write32(top); |
838 } | 838 } |
839 } | 839 } |
840 | 840 |
841 bool SkGPipeCanvas::commonDrawImage(const SkImage* image, DrawOps op, unsigned f
lags, | 841 bool SkGPipeCanvas::commonDrawImage(const SkImage* image, DrawOps op, unsigned f
lags, |
842 size_t opBytesNeeded, const SkPaint* paint)
{ | 842 size_t opBytesNeeded, const SkPaint* paint)
{ |
843 if (fDone) { | 843 if (fDone) { |
844 return false; | 844 return false; |
845 } | 845 } |
846 | 846 |
847 if (paint != NULL) { | 847 if (paint != nullptr) { |
848 flags |= kDrawBitmap_HasPaint_DrawOpFlag; | 848 flags |= kDrawBitmap_HasPaint_DrawOpFlag; |
849 this->writePaint(*paint); | 849 this->writePaint(*paint); |
850 } | 850 } |
851 // This needs to run first so its calls to needOpBytes() and its writes | 851 // This needs to run first so its calls to needOpBytes() and its writes |
852 // don't interlace with the needOpBytes() and write below. | 852 // don't interlace with the needOpBytes() and write below. |
853 int32_t slot = fImageHeap->insert(image); | 853 int32_t slot = fImageHeap->insert(image); |
854 SkASSERT(slot != 0); | 854 SkASSERT(slot != 0); |
855 if (this->needOpBytes(opBytesNeeded)) { | 855 if (this->needOpBytes(opBytesNeeded)) { |
856 this->writeOp(op, flags, slot); | 856 this->writeOp(op, flags, slot); |
857 return true; | 857 return true; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
909 fWriter.writeScalar(y); | 909 fWriter.writeScalar(y); |
910 } | 910 } |
911 } | 911 } |
912 } | 912 } |
913 | 913 |
914 void SkGPipeCanvas::onDrawPosText(const void* text, size_t byteLength, const SkP
oint pos[], | 914 void SkGPipeCanvas::onDrawPosText(const void* text, size_t byteLength, const SkP
oint pos[], |
915 const SkPaint& paint) { | 915 const SkPaint& paint) { |
916 if (byteLength) { | 916 if (byteLength) { |
917 NOTIFY_SETUP(this); | 917 NOTIFY_SETUP(this); |
918 this->writePaint(paint); | 918 this->writePaint(paint); |
919 int count = paint.textToGlyphs(text, byteLength, NULL); | 919 int count = paint.textToGlyphs(text, byteLength, nullptr); |
920 if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkPo
int))) { | 920 if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkPo
int))) { |
921 this->writeOp(kDrawPosText_DrawOp); | 921 this->writeOp(kDrawPosText_DrawOp); |
922 fWriter.write32(SkToU32(byteLength)); | 922 fWriter.write32(SkToU32(byteLength)); |
923 fWriter.writePad(text, byteLength); | 923 fWriter.writePad(text, byteLength); |
924 fWriter.write32(count); | 924 fWriter.write32(count); |
925 fWriter.write(pos, count * sizeof(SkPoint)); | 925 fWriter.write(pos, count * sizeof(SkPoint)); |
926 } | 926 } |
927 } | 927 } |
928 } | 928 } |
929 | 929 |
930 void SkGPipeCanvas::onDrawPosTextH(const void* text, size_t byteLength, const Sk
Scalar xpos[], | 930 void SkGPipeCanvas::onDrawPosTextH(const void* text, size_t byteLength, const Sk
Scalar xpos[], |
931 SkScalar constY, const SkPaint& paint) { | 931 SkScalar constY, const SkPaint& paint) { |
932 if (byteLength) { | 932 if (byteLength) { |
933 NOTIFY_SETUP(this); | 933 NOTIFY_SETUP(this); |
934 this->writePaint(paint); | 934 this->writePaint(paint); |
935 int count = paint.textToGlyphs(text, byteLength, NULL); | 935 int count = paint.textToGlyphs(text, byteLength, nullptr); |
936 if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkSc
alar) + 4)) { | 936 if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkSc
alar) + 4)) { |
937 this->writeOp(kDrawPosTextH_DrawOp); | 937 this->writeOp(kDrawPosTextH_DrawOp); |
938 fWriter.write32(SkToU32(byteLength)); | 938 fWriter.write32(SkToU32(byteLength)); |
939 fWriter.writePad(text, byteLength); | 939 fWriter.writePad(text, byteLength); |
940 fWriter.write32(count); | 940 fWriter.write32(count); |
941 fWriter.write(xpos, count * sizeof(SkScalar)); | 941 fWriter.write(xpos, count * sizeof(SkScalar)); |
942 fWriter.writeScalar(constY); | 942 fWriter.writeScalar(constY); |
943 } | 943 } |
944 } | 944 } |
945 } | 945 } |
946 | 946 |
947 void SkGPipeCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const
SkPath& path, | 947 void SkGPipeCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const
SkPath& path, |
948 const SkMatrix* matrix, const SkPaint& pain
t) { | 948 const SkMatrix* matrix, const SkPaint& pain
t) { |
949 if (byteLength) { | 949 if (byteLength) { |
950 NOTIFY_SETUP(this); | 950 NOTIFY_SETUP(this); |
951 unsigned flags = 0; | 951 unsigned flags = 0; |
952 size_t size = 4 + SkAlign4(byteLength) + path.writeToMemory(NULL); | 952 size_t size = 4 + SkAlign4(byteLength) + path.writeToMemory(nullptr); |
953 if (matrix) { | 953 if (matrix) { |
954 flags |= kDrawTextOnPath_HasMatrix_DrawOpFlag; | 954 flags |= kDrawTextOnPath_HasMatrix_DrawOpFlag; |
955 size += matrix->writeToMemory(NULL); | 955 size += matrix->writeToMemory(nullptr); |
956 } | 956 } |
957 this->writePaint(paint); | 957 this->writePaint(paint); |
958 if (this->needOpBytes(size)) { | 958 if (this->needOpBytes(size)) { |
959 this->writeOp(kDrawTextOnPath_DrawOp, flags, 0); | 959 this->writeOp(kDrawTextOnPath_DrawOp, flags, 0); |
960 | 960 |
961 fWriter.write32(SkToU32(byteLength)); | 961 fWriter.write32(SkToU32(byteLength)); |
962 fWriter.writePad(text, byteLength); | 962 fWriter.writePad(text, byteLength); |
963 | 963 |
964 fWriter.writePath(path); | 964 fWriter.writePath(path); |
965 if (matrix) { | 965 if (matrix) { |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1207 } | 1207 } |
1208 } | 1208 } |
1209 | 1209 |
1210 void SkGPipeCanvas::resetImageHeap() { | 1210 void SkGPipeCanvas::resetImageHeap() { |
1211 if (fImageHeap) { | 1211 if (fImageHeap) { |
1212 fImageHeap->reset(); | 1212 fImageHeap->reset(); |
1213 } | 1213 } |
1214 } | 1214 } |
1215 | 1215 |
1216 size_t SkGPipeCanvas::freeMemoryIfPossible(size_t bytesToFree) { | 1216 size_t SkGPipeCanvas::freeMemoryIfPossible(size_t bytesToFree) { |
1217 return (NULL == fBitmapHeap) ? 0 : fBitmapHeap->freeMemoryIfPossible(bytesTo
Free); | 1217 return (nullptr == fBitmapHeap) ? 0 : fBitmapHeap->freeMemoryIfPossible(byte
sToFree); |
1218 } | 1218 } |
1219 | 1219 |
1220 /////////////////////////////////////////////////////////////////////////////// | 1220 /////////////////////////////////////////////////////////////////////////////// |
1221 | 1221 |
1222 template <typename T> uint32_t castToU32(T value) { | 1222 template <typename T> uint32_t castToU32(T value) { |
1223 union { | 1223 union { |
1224 T fSrc; | 1224 T fSrc; |
1225 uint32_t fDst; | 1225 uint32_t fDst; |
1226 } data; | 1226 } data; |
1227 data.fSrc = value; | 1227 data.fSrc = value; |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1340 fWriter.write(storage, size); | 1340 fWriter.write(storage, size); |
1341 for (size_t i = 0; i < size/4; i++) { | 1341 for (size_t i = 0; i < size/4; i++) { |
1342 // SkDebugf("[%d] %08X\n", i, storage[i]); | 1342 // SkDebugf("[%d] %08X\n", i, storage[i]); |
1343 } | 1343 } |
1344 } | 1344 } |
1345 | 1345 |
1346 // | 1346 // |
1347 // Do these after we've written kPaintOp_DrawOp | 1347 // Do these after we've written kPaintOp_DrawOp |
1348 | 1348 |
1349 if (base.getAnnotation() != paint.getAnnotation()) { | 1349 if (base.getAnnotation() != paint.getAnnotation()) { |
1350 if (NULL == paint.getAnnotation()) { | 1350 if (nullptr == paint.getAnnotation()) { |
1351 if (this->needOpBytes()) { | 1351 if (this->needOpBytes()) { |
1352 this->writeOp(kSetAnnotation_DrawOp, 0, 0); | 1352 this->writeOp(kSetAnnotation_DrawOp, 0, 0); |
1353 } | 1353 } |
1354 } else { | 1354 } else { |
1355 SkWriteBuffer buffer; | 1355 SkWriteBuffer buffer; |
1356 paint.getAnnotation()->writeToBuffer(buffer); | 1356 paint.getAnnotation()->writeToBuffer(buffer); |
1357 const size_t size = buffer.bytesWritten(); | 1357 const size_t size = buffer.bytesWritten(); |
1358 if (this->needOpBytes(size)) { | 1358 if (this->needOpBytes(size)) { |
1359 this->writeOp(kSetAnnotation_DrawOp, 0, SkToU32(size)); | 1359 this->writeOp(kSetAnnotation_DrawOp, 0, SkToU32(size)); |
1360 buffer.writeToMemory(fWriter.reserve(size)); | 1360 buffer.writeToMemory(fWriter.reserve(size)); |
(...skipping 20 matching lines...) Expand all Loading... |
1381 fCanvas->resetImageHeap(); | 1381 fCanvas->resetImageHeap(); |
1382 // Other caches are self-purging with a small MRU pool | 1382 // Other caches are self-purging with a small MRU pool |
1383 // We could purge them as well, but it is not clear whether | 1383 // We could purge them as well, but it is not clear whether |
1384 // that would be a win. | 1384 // that would be a win. |
1385 } | 1385 } |
1386 | 1386 |
1387 /////////////////////////////////////////////////////////////////////////////// | 1387 /////////////////////////////////////////////////////////////////////////////// |
1388 | 1388 |
1389 SkGPipeWriter::SkGPipeWriter() | 1389 SkGPipeWriter::SkGPipeWriter() |
1390 : fWriter(0) { | 1390 : fWriter(0) { |
1391 fCanvas = NULL; | 1391 fCanvas = nullptr; |
1392 } | 1392 } |
1393 | 1393 |
1394 SkGPipeWriter::~SkGPipeWriter() { | 1394 SkGPipeWriter::~SkGPipeWriter() { |
1395 this->endRecording(); | 1395 this->endRecording(); |
1396 } | 1396 } |
1397 | 1397 |
1398 SkCanvas* SkGPipeWriter::startRecording(SkGPipeController* controller, uint32_t
flags, | 1398 SkCanvas* SkGPipeWriter::startRecording(SkGPipeController* controller, uint32_t
flags, |
1399 uint32_t width, uint32_t height) { | 1399 uint32_t width, uint32_t height) { |
1400 if (NULL == fCanvas) { | 1400 if (nullptr == fCanvas) { |
1401 fWriter.reset(NULL, 0); | 1401 fWriter.reset(nullptr, 0); |
1402 fCanvas = new SkGPipeCanvas(controller, &fWriter, flags, width, height); | 1402 fCanvas = new SkGPipeCanvas(controller, &fWriter, flags, width, height); |
1403 } | 1403 } |
1404 controller->setCanvas(fCanvas); | 1404 controller->setCanvas(fCanvas); |
1405 return fCanvas; | 1405 return fCanvas; |
1406 } | 1406 } |
1407 | 1407 |
1408 void SkGPipeWriter::endRecording() { | 1408 void SkGPipeWriter::endRecording() { |
1409 if (fCanvas) { | 1409 if (fCanvas) { |
1410 fCanvas->finish(true); | 1410 fCanvas->finish(true); |
1411 fCanvas->unref(); | 1411 fCanvas->unref(); |
1412 fCanvas = NULL; | 1412 fCanvas = nullptr; |
1413 } | 1413 } |
1414 } | 1414 } |
1415 | 1415 |
1416 void SkGPipeWriter::flushRecording(bool detachCurrentBlock) { | 1416 void SkGPipeWriter::flushRecording(bool detachCurrentBlock) { |
1417 if (fCanvas) { | 1417 if (fCanvas) { |
1418 fCanvas->flushRecording(detachCurrentBlock); | 1418 fCanvas->flushRecording(detachCurrentBlock); |
1419 } | 1419 } |
1420 } | 1420 } |
1421 | 1421 |
1422 size_t SkGPipeWriter::freeMemoryIfPossible(size_t bytesToFree) { | 1422 size_t SkGPipeWriter::freeMemoryIfPossible(size_t bytesToFree) { |
1423 if (fCanvas) { | 1423 if (fCanvas) { |
1424 return fCanvas->freeMemoryIfPossible(bytesToFree); | 1424 return fCanvas->freeMemoryIfPossible(bytesToFree); |
1425 } | 1425 } |
1426 return 0; | 1426 return 0; |
1427 } | 1427 } |
1428 | 1428 |
1429 size_t SkGPipeWriter::storageAllocatedForRecording() const { | 1429 size_t SkGPipeWriter::storageAllocatedForRecording() const { |
1430 return NULL == fCanvas ? 0 : fCanvas->storageAllocatedForRecording(); | 1430 return nullptr == fCanvas ? 0 : fCanvas->storageAllocatedForRecording(); |
1431 } | 1431 } |
1432 | 1432 |
1433 /////////////////////////////////////////////////////////////////////////////// | 1433 /////////////////////////////////////////////////////////////////////////////// |
1434 | 1434 |
1435 BitmapShuttle::BitmapShuttle(SkGPipeCanvas* canvas) { | 1435 BitmapShuttle::BitmapShuttle(SkGPipeCanvas* canvas) { |
1436 SkASSERT(canvas != NULL); | 1436 SkASSERT(canvas != nullptr); |
1437 fCanvas = canvas; | 1437 fCanvas = canvas; |
1438 fCanvas->ref(); | 1438 fCanvas->ref(); |
1439 } | 1439 } |
1440 | 1440 |
1441 BitmapShuttle::~BitmapShuttle() { | 1441 BitmapShuttle::~BitmapShuttle() { |
1442 this->removeCanvas(); | 1442 this->removeCanvas(); |
1443 } | 1443 } |
1444 | 1444 |
1445 bool BitmapShuttle::insert(const SkBitmap& bitmap, int32_t slot) { | 1445 bool BitmapShuttle::insert(const SkBitmap& bitmap, int32_t slot) { |
1446 SkASSERT(fCanvas != NULL); | 1446 SkASSERT(fCanvas != nullptr); |
1447 return fCanvas->shuttleBitmap(bitmap, slot); | 1447 return fCanvas->shuttleBitmap(bitmap, slot); |
1448 } | 1448 } |
1449 | 1449 |
1450 void BitmapShuttle::removeCanvas() { | 1450 void BitmapShuttle::removeCanvas() { |
1451 if (NULL == fCanvas) { | 1451 if (nullptr == fCanvas) { |
1452 return; | 1452 return; |
1453 } | 1453 } |
1454 fCanvas->unref(); | 1454 fCanvas->unref(); |
1455 fCanvas = NULL; | 1455 fCanvas = nullptr; |
1456 } | 1456 } |
1457 | 1457 |
1458 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 1458 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
1459 | 1459 |
1460 SkImageHeap::SkImageHeap() : fBytesInCache (0) {} | 1460 SkImageHeap::SkImageHeap() : fBytesInCache (0) {} |
1461 | 1461 |
1462 SkImageHeap::~SkImageHeap() { | 1462 SkImageHeap::~SkImageHeap() { |
1463 fArray.unrefAll(); | 1463 fArray.unrefAll(); |
1464 } | 1464 } |
1465 | 1465 |
(...skipping 20 matching lines...) Expand all Loading... |
1486 int32_t slot = this->find(img); | 1486 int32_t slot = this->find(img); |
1487 if (slot) { | 1487 if (slot) { |
1488 return slot; | 1488 return slot; |
1489 } | 1489 } |
1490 // TODO: SkImage does not expose bytes per pixel, 4 is just a best guess. | 1490 // TODO: SkImage does not expose bytes per pixel, 4 is just a best guess. |
1491 fBytesInCache += img->width() * img->height() * 4; | 1491 fBytesInCache += img->width() * img->height() * 4; |
1492 *fArray.append() = SkRef(img); | 1492 *fArray.append() = SkRef(img); |
1493 return fArray.count(); // slot is always index+1 | 1493 return fArray.count(); // slot is always index+1 |
1494 } | 1494 } |
1495 | 1495 |
OLD | NEW |