| OLD | NEW | 
|     1 /* |     1 /* | 
|     2  * Copyright 2011 Google Inc. |     2  * Copyright 2011 Google Inc. | 
|     3  * |     3  * | 
|     4  * Use of this source code is governed by a BSD-style license that can be |     4  * Use of this source code is governed by a BSD-style license that can be | 
|     5  * found in the LICENSE file. |     5  * found in the LICENSE file. | 
|     6  */ |     6  */ | 
|     7  |     7  | 
|     8 #include "SkPictureRecord.h" |     8 #include "SkPictureRecord.h" | 
|     9 #include "SkTSearch.h" |     9 #include "SkTSearch.h" | 
|    10 #include "SkPixelRef.h" |    10 #include "SkPixelRef.h" | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
|    36     , fPaints(&fFlattenableHeap) |    36     , fPaints(&fFlattenableHeap) | 
|    37     , fRecordFlags(flags) { |    37     , fRecordFlags(flags) { | 
|    38 #ifdef SK_DEBUG_SIZE |    38 #ifdef SK_DEBUG_SIZE | 
|    39     fPointBytes = fRectBytes = fTextBytes = 0; |    39     fPointBytes = fRectBytes = fTextBytes = 0; | 
|    40     fPointWrites = fRectWrites = fTextWrites = 0; |    40     fPointWrites = fRectWrites = fTextWrites = 0; | 
|    41 #endif |    41 #endif | 
|    42  |    42  | 
|    43     fBitmapHeap = SkNEW(SkBitmapHeap); |    43     fBitmapHeap = SkNEW(SkBitmapHeap); | 
|    44     fFlattenableHeap.setBitmapStorage(fBitmapHeap); |    44     fFlattenableHeap.setBitmapStorage(fBitmapHeap); | 
|    45     fPathHeap = NULL;   // lazy allocate |    45     fPathHeap = NULL;   // lazy allocate | 
 |    46 #ifndef SK_COLLAPSE_MATRIX_CLIP_STATE | 
|    46     fFirstSavedLayerIndex = kNoSavedLayerIndex; |    47     fFirstSavedLayerIndex = kNoSavedLayerIndex; | 
 |    48 #endif | 
|    47  |    49  | 
|    48     fInitialSaveCount = kNoInitialSave; |    50     fInitialSaveCount = kNoInitialSave; | 
 |    51  | 
 |    52 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |    53     fMCMgr.init(this); | 
 |    54 #endif | 
|    49 } |    55 } | 
|    50  |    56  | 
|    51 SkPictureRecord::~SkPictureRecord() { |    57 SkPictureRecord::~SkPictureRecord() { | 
|    52     SkSafeUnref(fBitmapHeap); |    58     SkSafeUnref(fBitmapHeap); | 
|    53     SkSafeUnref(fPathHeap); |    59     SkSafeUnref(fPathHeap); | 
|    54     SkSafeUnref(fBoundingHierarchy); |    60     SkSafeUnref(fBoundingHierarchy); | 
|    55     SkSafeUnref(fStateTree); |    61     SkSafeUnref(fStateTree); | 
|    56     fFlattenableHeap.setBitmapStorage(NULL); |    62     fFlattenableHeap.setBitmapStorage(NULL); | 
|    57     fPictureRefs.unrefAll(); |    63     fPictureRefs.unrefAll(); | 
|    58 } |    64 } | 
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   132     SkASSERT(0 != gPaintOffsets[op]);   // really shouldn't be calling this meth
      od |   138     SkASSERT(0 != gPaintOffsets[op]);   // really shouldn't be calling this meth
      od | 
|   133     return gPaintOffsets[op] * sizeof(uint32_t) + overflow; |   139     return gPaintOffsets[op] * sizeof(uint32_t) + overflow; | 
|   134 } |   140 } | 
|   135  |   141  | 
|   136 SkBaseDevice* SkPictureRecord::setDevice(SkBaseDevice* device) { |   142 SkBaseDevice* SkPictureRecord::setDevice(SkBaseDevice* device) { | 
|   137     SkDEBUGFAIL("eeek, don't try to change the device on a recording canvas"); |   143     SkDEBUGFAIL("eeek, don't try to change the device on a recording canvas"); | 
|   138     return this->INHERITED::setDevice(device); |   144     return this->INHERITED::setDevice(device); | 
|   139 } |   145 } | 
|   140  |   146  | 
|   141 int SkPictureRecord::save(SaveFlags flags) { |   147 int SkPictureRecord::save(SaveFlags flags) { | 
 |   148  | 
 |   149 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   150     fMCMgr.save(flags); | 
 |   151 #else | 
|   142     // record the offset to us, making it non-positive to distinguish a save |   152     // record the offset to us, making it non-positive to distinguish a save | 
|   143     // from a clip entry. |   153     // from a clip entry. | 
|   144     fRestoreOffsetStack.push(-(int32_t)fWriter.bytesWritten()); |   154     fRestoreOffsetStack.push(-(int32_t)fWriter.bytesWritten()); | 
|   145     this->recordSave(flags); |   155     this->recordSave(flags); | 
 |   156 #endif | 
|   146     return this->INHERITED::save(flags); |   157     return this->INHERITED::save(flags); | 
|   147 } |   158 } | 
|   148  |   159  | 
|   149 void SkPictureRecord::recordSave(SaveFlags flags) { |   160 void SkPictureRecord::recordSave(SaveFlags flags) { | 
|   150     // op + flags |   161     // op + flags | 
|   151     uint32_t size = kSaveSize; |   162     uint32_t size = kSaveSize; | 
|   152     size_t initialOffset = this->addDraw(SAVE, &size); |   163     size_t initialOffset = this->addDraw(SAVE, &size); | 
|   153     this->addInt(flags); |   164     this->addInt(flags); | 
|   154  |   165  | 
|   155     this->validate(initialOffset, size); |   166     this->validate(initialOffset, size); | 
|   156 } |   167 } | 
|   157  |   168  | 
|   158 int SkPictureRecord::saveLayer(const SkRect* bounds, const SkPaint* paint, |   169 int SkPictureRecord::saveLayer(const SkRect* bounds, const SkPaint* paint, | 
|   159                                SaveFlags flags) { |   170                                SaveFlags flags) { | 
 |   171  | 
 |   172     int count; | 
 |   173 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   174     count = fMCMgr.saveLayer(bounds, paint, flags); | 
 |   175 #else | 
|   160     // record the offset to us, making it non-positive to distinguish a save |   176     // record the offset to us, making it non-positive to distinguish a save | 
|   161     // from a clip entry. |   177     // from a clip entry. | 
|   162     fRestoreOffsetStack.push(-(int32_t)fWriter.bytesWritten()); |   178     fRestoreOffsetStack.push(-(int32_t)fWriter.bytesWritten()); | 
|   163     this->recordSaveLayer(bounds, paint, flags); |   179     this->recordSaveLayer(bounds, paint, flags); | 
|   164     if (kNoSavedLayerIndex == fFirstSavedLayerIndex) { |   180     if (kNoSavedLayerIndex == fFirstSavedLayerIndex) { | 
|   165         fFirstSavedLayerIndex = fRestoreOffsetStack.count(); |   181         fFirstSavedLayerIndex = fRestoreOffsetStack.count(); | 
|   166     } |   182     } | 
 |   183 #endif | 
|   167  |   184  | 
|   168     /*  Don't actually call INHERITED::saveLayer, because that will try to alloc
      ate |   185     /*  Don't actually call INHERITED::saveLayer, because that will try to alloc
      ate | 
|   169         an offscreen device (potentially very big) which we don't actually need |   186         an offscreen device (potentially very big) which we don't actually need | 
|   170         at this time (and may not be able to afford since during record our |   187         at this time (and may not be able to afford since during record our | 
|   171         clip starts out the size of the picture, which is often much larger |   188         clip starts out the size of the picture, which is often much larger | 
|   172         than the size of the actual device we'll use during playback). |   189         than the size of the actual device we'll use during playback). | 
|   173      */ |   190      */ | 
|   174     int count = this->INHERITED::save(flags); |   191     count = this->INHERITED::save(flags); | 
|   175     this->clipRectBounds(bounds, flags, NULL); |   192     this->clipRectBounds(bounds, flags, NULL); | 
|   176     return count; |   193     return count; | 
|   177 } |   194 } | 
|   178  |   195  | 
|   179 void SkPictureRecord::recordSaveLayer(const SkRect* bounds, const SkPaint* paint
      , |   196 void SkPictureRecord::recordSaveLayer(const SkRect* bounds, const SkPaint* paint
      , | 
|   180                                     SaveFlags flags) { |   197                                       SaveFlags flags) { | 
|   181     // op + bool for 'bounds' |   198     // op + bool for 'bounds' | 
|   182     uint32_t size = 2 * kUInt32Size; |   199     uint32_t size = 2 * kUInt32Size; | 
|   183     if (NULL != bounds) { |   200     if (NULL != bounds) { | 
|   184         size += sizeof(*bounds); // + rect |   201         size += sizeof(*bounds); // + rect | 
|   185     } |   202     } | 
|   186     // + paint index + flags |   203     // + paint index + flags | 
|   187     size += 2 * kUInt32Size; |   204     size += 2 * kUInt32Size; | 
|   188  |   205  | 
|   189     SkASSERT(kSaveLayerNoBoundsSize == size || kSaveLayerWithBoundsSize == size)
      ; |   206     SkASSERT(kSaveLayerNoBoundsSize == size || kSaveLayerWithBoundsSize == size)
      ; | 
|   190  |   207  | 
|   191     size_t initialOffset = this->addDraw(SAVE_LAYER, &size); |   208     size_t initialOffset = this->addDraw(SAVE_LAYER, &size); | 
|   192     this->addRectPtr(bounds); |   209     this->addRectPtr(bounds); | 
|   193     SkASSERT(initialOffset+getPaintOffset(SAVE_LAYER, size) == fWriter.bytesWrit
      ten()); |   210     SkASSERT(initialOffset+getPaintOffset(SAVE_LAYER, size) == fWriter.bytesWrit
      ten()); | 
|   194     this->addPaintPtr(paint); |   211     this->addPaintPtr(paint); | 
|   195     this->addInt(flags); |   212     this->addInt(flags); | 
|   196  |   213  | 
|   197     this->validate(initialOffset, size); |   214     this->validate(initialOffset, size); | 
|   198 } |   215 } | 
|   199  |   216  | 
|   200 bool SkPictureRecord::isDrawingToLayer() const { |   217 bool SkPictureRecord::isDrawingToLayer() const { | 
 |   218 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   219     return fMCMgr.isDrawingToLayer(); | 
 |   220 #else | 
|   201     return fFirstSavedLayerIndex != kNoSavedLayerIndex; |   221     return fFirstSavedLayerIndex != kNoSavedLayerIndex; | 
 |   222 #endif | 
|   202 } |   223 } | 
|   203  |   224  | 
|   204 /* |   225 /* | 
|   205  * Read the op code from 'offset' in 'writer' and extract the size too. |   226  * Read the op code from 'offset' in 'writer' and extract the size too. | 
|   206  */ |   227  */ | 
|   207 static DrawType peek_op_and_size(SkWriter32* writer, int32_t offset, uint32_t* s
      ize) { |   228 static DrawType peek_op_and_size(SkWriter32* writer, int32_t offset, uint32_t* s
      ize) { | 
|   208     uint32_t peek = writer->read32At(offset); |   229     uint32_t peek = writer->read32At(offset); | 
|   209  |   230  | 
|   210     uint32_t op; |   231     uint32_t op; | 
|   211     UNPACK_8_24(peek, op, *size); |   232     UNPACK_8_24(peek, op, *size); | 
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   570 } |   591 } | 
|   571  |   592  | 
|   572 void SkPictureRecord::restore() { |   593 void SkPictureRecord::restore() { | 
|   573     // FIXME: SkDeferredCanvas needs to be refactored to respect |   594     // FIXME: SkDeferredCanvas needs to be refactored to respect | 
|   574     // save/restore balancing so that the following test can be |   595     // save/restore balancing so that the following test can be | 
|   575     // turned on permanently. |   596     // turned on permanently. | 
|   576 #if 0 |   597 #if 0 | 
|   577     SkASSERT(fRestoreOffsetStack.count() > 1); |   598     SkASSERT(fRestoreOffsetStack.count() > 1); | 
|   578 #endif |   599 #endif | 
|   579  |   600  | 
 |   601 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   602     if (fMCMgr.getSaveCount() == 1) { | 
 |   603         return; | 
 |   604     } | 
 |   605  | 
 |   606     // TODO: don't write the restore to the op stream for normal saves | 
 |   607     fMCMgr.restore(); | 
 |   608 #else | 
|   580     // check for underflow |   609     // check for underflow | 
|   581     if (fRestoreOffsetStack.count() == 0) { |   610     if (fRestoreOffsetStack.count() == 0) { | 
|   582         return; |   611         return; | 
|   583     } |   612     } | 
|   584  |   613  | 
|   585     if (fRestoreOffsetStack.count() == fFirstSavedLayerIndex) { |   614     if (fRestoreOffsetStack.count() == fFirstSavedLayerIndex) { | 
|   586         fFirstSavedLayerIndex = kNoSavedLayerIndex; |   615         fFirstSavedLayerIndex = kNoSavedLayerIndex; | 
|   587     } |   616     } | 
|   588  |   617  | 
|   589     size_t opt = 0; |   618     size_t opt = 0; | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|   602         } |   631         } | 
|   603     } |   632     } | 
|   604  |   633  | 
|   605     if ((fRecordFlags & SkPicture::kDisableRecordOptimizations_RecordingFlag) || |   634     if ((fRecordFlags & SkPicture::kDisableRecordOptimizations_RecordingFlag) || | 
|   606         SK_ARRAY_COUNT(gPictureRecordOpts) == opt) { |   635         SK_ARRAY_COUNT(gPictureRecordOpts) == opt) { | 
|   607         // No optimization fired so add the RESTORE |   636         // No optimization fired so add the RESTORE | 
|   608         this->recordRestore(); |   637         this->recordRestore(); | 
|   609     } |   638     } | 
|   610  |   639  | 
|   611     fRestoreOffsetStack.pop(); |   640     fRestoreOffsetStack.pop(); | 
 |   641 #endif | 
|   612  |   642  | 
|   613     return this->INHERITED::restore(); |   643     return this->INHERITED::restore(); | 
|   614 } |   644 } | 
|   615  |   645  | 
|   616 void SkPictureRecord::recordRestore() { |   646 void SkPictureRecord::recordRestore(bool fillInSkips) { | 
|   617     uint32_t initialOffset, size; |   647     uint32_t initialOffset, size; | 
|   618     this->fillRestoreOffsetPlaceholdersForCurrentStackLevel((uint32_t)fWriter.by
      tesWritten()); |   648     if (fillInSkips) { | 
 |   649         this->fillRestoreOffsetPlaceholdersForCurrentStackLevel((uint32_t)fWrite
      r.bytesWritten()); | 
 |   650     } | 
|   619     size = 1 * kUInt32Size; // RESTORE consists solely of 1 op code |   651     size = 1 * kUInt32Size; // RESTORE consists solely of 1 op code | 
|   620     initialOffset = this->addDraw(RESTORE, &size); |   652     initialOffset = this->addDraw(RESTORE, &size); | 
|   621     this->validate(initialOffset, size); |   653     this->validate(initialOffset, size); | 
|   622 } |   654 } | 
|   623  |   655  | 
|   624 bool SkPictureRecord::translate(SkScalar dx, SkScalar dy) { |   656 bool SkPictureRecord::translate(SkScalar dx, SkScalar dy) { | 
 |   657 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   658     fMCMgr.translate(dx, dy); | 
 |   659 #else | 
|   625     // op + dx + dy |   660     // op + dx + dy | 
|   626     uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); |   661     uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); | 
|   627     size_t initialOffset = this->addDraw(TRANSLATE, &size); |   662     size_t initialOffset = this->addDraw(TRANSLATE, &size); | 
|   628     this->addScalar(dx); |   663     this->addScalar(dx); | 
|   629     this->addScalar(dy); |   664     this->addScalar(dy); | 
|   630     this->validate(initialOffset, size); |   665     this->validate(initialOffset, size); | 
 |   666 #endif | 
|   631     return this->INHERITED::translate(dx, dy); |   667     return this->INHERITED::translate(dx, dy); | 
|   632 } |   668 } | 
|   633  |   669  | 
|   634 bool SkPictureRecord::scale(SkScalar sx, SkScalar sy) { |   670 bool SkPictureRecord::scale(SkScalar sx, SkScalar sy) { | 
 |   671  | 
 |   672 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   673     fMCMgr.scale(sx, sy); | 
 |   674 #else | 
|   635     // op + sx + sy |   675     // op + sx + sy | 
|   636     uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); |   676     uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); | 
|   637     size_t initialOffset = this->addDraw(SCALE, &size); |   677     size_t initialOffset = this->addDraw(SCALE, &size); | 
|   638     this->addScalar(sx); |   678     this->addScalar(sx); | 
|   639     this->addScalar(sy); |   679     this->addScalar(sy); | 
|   640     this->validate(initialOffset, size); |   680     this->validate(initialOffset, size); | 
 |   681 #endif | 
|   641     return this->INHERITED::scale(sx, sy); |   682     return this->INHERITED::scale(sx, sy); | 
|   642 } |   683 } | 
|   643  |   684  | 
|   644 bool SkPictureRecord::rotate(SkScalar degrees) { |   685 bool SkPictureRecord::rotate(SkScalar degrees) { | 
 |   686  | 
 |   687 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   688     fMCMgr.rotate(degrees); | 
 |   689 #else | 
|   645     // op + degrees |   690     // op + degrees | 
|   646     uint32_t size = 1 * kUInt32Size + sizeof(SkScalar); |   691     uint32_t size = 1 * kUInt32Size + sizeof(SkScalar); | 
|   647     size_t initialOffset = this->addDraw(ROTATE, &size); |   692     size_t initialOffset = this->addDraw(ROTATE, &size); | 
|   648     this->addScalar(degrees); |   693     this->addScalar(degrees); | 
|   649     this->validate(initialOffset, size); |   694     this->validate(initialOffset, size); | 
 |   695 #endif | 
|   650     return this->INHERITED::rotate(degrees); |   696     return this->INHERITED::rotate(degrees); | 
|   651 } |   697 } | 
|   652  |   698  | 
|   653 bool SkPictureRecord::skew(SkScalar sx, SkScalar sy) { |   699 bool SkPictureRecord::skew(SkScalar sx, SkScalar sy) { | 
 |   700  | 
 |   701 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   702     fMCMgr.skew(sx, sy); | 
 |   703 #else | 
|   654     // op + sx + sy |   704     // op + sx + sy | 
|   655     uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); |   705     uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); | 
|   656     size_t initialOffset = this->addDraw(SKEW, &size); |   706     size_t initialOffset = this->addDraw(SKEW, &size); | 
|   657     this->addScalar(sx); |   707     this->addScalar(sx); | 
|   658     this->addScalar(sy); |   708     this->addScalar(sy); | 
|   659     this->validate(initialOffset, size); |   709     this->validate(initialOffset, size); | 
 |   710 #endif | 
|   660     return this->INHERITED::skew(sx, sy); |   711     return this->INHERITED::skew(sx, sy); | 
|   661 } |   712 } | 
|   662  |   713  | 
|   663 bool SkPictureRecord::concat(const SkMatrix& matrix) { |   714 bool SkPictureRecord::concat(const SkMatrix& matrix) { | 
 |   715  | 
 |   716 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   717     fMCMgr.concat(matrix); | 
 |   718 #else | 
|   664     this->recordConcat(matrix); |   719     this->recordConcat(matrix); | 
 |   720 #endif | 
|   665     return this->INHERITED::concat(matrix); |   721     return this->INHERITED::concat(matrix); | 
|   666 } |   722 } | 
|   667  |   723  | 
|   668 void SkPictureRecord::recordConcat(const SkMatrix& matrix) { |   724 void SkPictureRecord::recordConcat(const SkMatrix& matrix) { | 
|   669     this->validate(fWriter.bytesWritten(), 0); |   725     this->validate(fWriter.bytesWritten(), 0); | 
|   670     // op + matrix |   726     // op + matrix | 
|   671     uint32_t size = kUInt32Size + matrix.writeToMemory(NULL); |   727     uint32_t size = kUInt32Size + matrix.writeToMemory(NULL); | 
|   672     size_t initialOffset = this->addDraw(CONCAT, &size); |   728     size_t initialOffset = this->addDraw(CONCAT, &size); | 
|   673     this->addMatrix(matrix); |   729     this->addMatrix(matrix); | 
|   674     this->validate(initialOffset, size); |   730     this->validate(initialOffset, size); | 
|   675 } |   731 } | 
|   676  |   732  | 
|   677 void SkPictureRecord::setMatrix(const SkMatrix& matrix) { |   733 void SkPictureRecord::setMatrix(const SkMatrix& matrix) { | 
 |   734  | 
 |   735 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   736     fMCMgr.setMatrix(matrix); | 
 |   737 #else | 
|   678     this->validate(fWriter.bytesWritten(), 0); |   738     this->validate(fWriter.bytesWritten(), 0); | 
|   679     // op + matrix |   739     // op + matrix | 
|   680     uint32_t size = kUInt32Size + matrix.writeToMemory(NULL); |   740     uint32_t size = kUInt32Size + matrix.writeToMemory(NULL); | 
|   681     size_t initialOffset = this->addDraw(SET_MATRIX, &size); |   741     size_t initialOffset = this->addDraw(SET_MATRIX, &size); | 
|   682     this->addMatrix(matrix); |   742     this->addMatrix(matrix); | 
|   683     this->validate(initialOffset, size); |   743     this->validate(initialOffset, size); | 
 |   744 #endif | 
|   684     this->INHERITED::setMatrix(matrix); |   745     this->INHERITED::setMatrix(matrix); | 
|   685 } |   746 } | 
|   686  |   747  | 
|   687 static bool regionOpExpands(SkRegion::Op op) { |   748 static bool regionOpExpands(SkRegion::Op op) { | 
|   688     switch (op) { |   749     switch (op) { | 
|   689         case SkRegion::kUnion_Op: |   750         case SkRegion::kUnion_Op: | 
|   690         case SkRegion::kXOR_Op: |   751         case SkRegion::kXOR_Op: | 
|   691         case SkRegion::kReverseDifference_Op: |   752         case SkRegion::kReverseDifference_Op: | 
|   692         case SkRegion::kReplace_Op: |   753         case SkRegion::kReplace_Op: | 
|   693             return true; |   754             return true; | 
|   694         case SkRegion::kIntersect_Op: |   755         case SkRegion::kIntersect_Op: | 
|   695         case SkRegion::kDifference_Op: |   756         case SkRegion::kDifference_Op: | 
|   696             return false; |   757             return false; | 
|   697         default: |   758         default: | 
|   698             SkDEBUGFAIL("unknown region op"); |   759             SkDEBUGFAIL("unknown region op"); | 
|   699             return false; |   760             return false; | 
|   700     } |   761     } | 
|   701 } |   762 } | 
|   702  |   763  | 
 |   764 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   765 void SkPictureRecord::fillRestoreOffsetPlaceholdersForCurrentStackLevel(uint32_t
       restoreOffset) { | 
 |   766     fMCMgr.fillInSkips(&fWriter, restoreOffset); | 
 |   767 } | 
 |   768 #else | 
|   703 void SkPictureRecord::fillRestoreOffsetPlaceholdersForCurrentStackLevel(uint32_t
       restoreOffset) { |   769 void SkPictureRecord::fillRestoreOffsetPlaceholdersForCurrentStackLevel(uint32_t
       restoreOffset) { | 
|   704     int32_t offset = fRestoreOffsetStack.top(); |   770     int32_t offset = fRestoreOffsetStack.top(); | 
|   705     while (offset > 0) { |   771     while (offset > 0) { | 
|   706         uint32_t peek = fWriter.read32At(offset); |   772         uint32_t peek = fWriter.read32At(offset); | 
|   707         fWriter.write32At(offset, restoreOffset); |   773         fWriter.write32At(offset, restoreOffset); | 
|   708         offset = peek; |   774         offset = peek; | 
|   709     } |   775     } | 
|   710  |   776  | 
|   711 #ifdef SK_DEBUG |   777 #ifdef SK_DEBUG | 
|   712     // assert that the final offset value points to a save verb |   778     // assert that the final offset value points to a save verb | 
|   713     uint32_t opSize; |   779     uint32_t opSize; | 
|   714     DrawType drawOp = peek_op_and_size(&fWriter, -offset, &opSize); |   780     DrawType drawOp = peek_op_and_size(&fWriter, -offset, &opSize); | 
|   715     SkASSERT(SAVE == drawOp || SAVE_LAYER == drawOp); |   781     SkASSERT(SAVE == drawOp || SAVE_LAYER == drawOp); | 
|   716 #endif |   782 #endif | 
|   717 } |   783 } | 
 |   784 #endif | 
|   718  |   785  | 
|   719 void SkPictureRecord::beginRecording() { |   786 void SkPictureRecord::beginRecording() { | 
|   720     // we have to call this *after* our constructor, to ensure that it gets |   787     // we have to call this *after* our constructor, to ensure that it gets | 
|   721     // recorded. This is balanced by restoreToCount() call from endRecording, |   788     // recorded. This is balanced by restoreToCount() call from endRecording, | 
|   722     // which in-turn calls our overridden restore(), so those get recorded too. |   789     // which in-turn calls our overridden restore(), so those get recorded too. | 
|   723     fInitialSaveCount = this->save(kMatrixClip_SaveFlag); |   790     fInitialSaveCount = this->save(kMatrixClip_SaveFlag); | 
|   724 } |   791 } | 
|   725  |   792  | 
|   726 void SkPictureRecord::endRecording() { |   793 void SkPictureRecord::endRecording() { | 
|   727     SkASSERT(kNoInitialSave != fInitialSaveCount); |   794     SkASSERT(kNoInitialSave != fInitialSaveCount); | 
|   728     this->restoreToCount(fInitialSaveCount); |   795     this->restoreToCount(fInitialSaveCount); | 
 |   796 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   797     fMCMgr.finish(); | 
 |   798 #endif | 
|   729 } |   799 } | 
|   730  |   800  | 
 |   801 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   802 int SkPictureRecord::recordRestoreOffsetPlaceholder(SkRegion::Op op) { | 
 |   803     size_t offset = fWriter.bytesWritten(); | 
 |   804     this->addInt(-1); | 
 |   805     return offset; | 
 |   806 } | 
 |   807 #else | 
|   731 int SkPictureRecord::recordRestoreOffsetPlaceholder(SkRegion::Op op) { |   808 int SkPictureRecord::recordRestoreOffsetPlaceholder(SkRegion::Op op) { | 
|   732     if (fRestoreOffsetStack.isEmpty()) { |   809     if (fRestoreOffsetStack.isEmpty()) { | 
|   733         return -1; |   810         return -1; | 
|   734     } |   811     } | 
|   735  |   812  | 
|   736     // The RestoreOffset field is initially filled with a placeholder |   813     // The RestoreOffset field is initially filled with a placeholder | 
|   737     // value that points to the offset of the previous RestoreOffset |   814     // value that points to the offset of the previous RestoreOffset | 
|   738     // in the current stack level, thus forming a linked list so that |   815     // in the current stack level, thus forming a linked list so that | 
|   739     // the restore offsets can be filled in when the corresponding |   816     // the restore offsets can be filled in when the corresponding | 
|   740     // restore command is recorded. |   817     // restore command is recorded. | 
|   741     int32_t prevOffset = fRestoreOffsetStack.top(); |   818     int32_t prevOffset = fRestoreOffsetStack.top(); | 
|   742  |   819  | 
|   743     if (regionOpExpands(op)) { |   820     if (regionOpExpands(op)) { | 
|   744         // Run back through any previous clip ops, and mark their offset to |   821         // Run back through any previous clip ops, and mark their offset to | 
|   745         // be 0, disabling their ability to trigger a jump-to-restore, otherwise |   822         // be 0, disabling their ability to trigger a jump-to-restore, otherwise | 
|   746         // they could hide this clips ability to expand the clip (i.e. go from |   823         // they could hide this clips ability to expand the clip (i.e. go from | 
|   747         // empty to non-empty). |   824         // empty to non-empty). | 
|   748         this->fillRestoreOffsetPlaceholdersForCurrentStackLevel(0); |   825         this->fillRestoreOffsetPlaceholdersForCurrentStackLevel(0); | 
|   749  |   826  | 
|   750         // Reset the pointer back to the previous clip so that subsequent |   827         // Reset the pointer back to the previous clip so that subsequent | 
|   751         // restores don't overwrite the offsets we just cleared. |   828         // restores don't overwrite the offsets we just cleared. | 
|   752         prevOffset = 0; |   829         prevOffset = 0; | 
|   753     } |   830     } | 
|   754  |   831  | 
|   755     size_t offset = fWriter.bytesWritten(); |   832     size_t offset = fWriter.bytesWritten(); | 
|   756     this->addInt(prevOffset); |   833     this->addInt(prevOffset); | 
|   757     fRestoreOffsetStack.top() = offset; |   834     fRestoreOffsetStack.top() = offset; | 
|   758     return offset; |   835     return offset; | 
|   759 } |   836 } | 
 |   837 #endif | 
|   760  |   838  | 
|   761 bool SkPictureRecord::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) { |   839 bool SkPictureRecord::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) { | 
 |   840  | 
 |   841 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   842     fMCMgr.clipRect(rect, op, doAA); | 
 |   843 #else | 
|   762     this->recordClipRect(rect, op, doAA); |   844     this->recordClipRect(rect, op, doAA); | 
 |   845 #endif | 
|   763     return this->INHERITED::clipRect(rect, op, doAA); |   846     return this->INHERITED::clipRect(rect, op, doAA); | 
|   764 } |   847 } | 
|   765  |   848  | 
|   766 int SkPictureRecord::recordClipRect(const SkRect& rect, SkRegion::Op op, bool do
      AA) { |   849 int SkPictureRecord::recordClipRect(const SkRect& rect, SkRegion::Op op, bool do
      AA) { | 
|   767  |  | 
|   768     // id + rect + clip params |   850     // id + rect + clip params | 
|   769     uint32_t size = 1 * kUInt32Size + sizeof(rect) + 1 * kUInt32Size; |   851     uint32_t size = 1 * kUInt32Size + sizeof(rect) + 1 * kUInt32Size; | 
 |   852 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   853     size += kUInt32Size;    // + restore offset | 
 |   854 #else | 
|   770     // recordRestoreOffsetPlaceholder doesn't always write an offset |   855     // recordRestoreOffsetPlaceholder doesn't always write an offset | 
|   771     if (!fRestoreOffsetStack.isEmpty()) { |   856     if (!fRestoreOffsetStack.isEmpty()) { | 
|   772         // + restore offset |   857         // + restore offset | 
|   773         size += kUInt32Size; |   858         size += kUInt32Size; | 
|   774     } |   859     } | 
|   775  |   860 #endif | 
|   776     size_t initialOffset = this->addDraw(CLIP_RECT, &size); |   861     size_t initialOffset = this->addDraw(CLIP_RECT, &size); | 
|   777     this->addRect(rect); |   862     this->addRect(rect); | 
|   778     this->addInt(ClipParams_pack(op, doAA)); |   863     this->addInt(ClipParams_pack(op, doAA)); | 
|   779     int offset = this->recordRestoreOffsetPlaceholder(op); |   864     int offset = this->recordRestoreOffsetPlaceholder(op); | 
|   780  |   865  | 
|   781     this->validate(initialOffset, size); |   866     this->validate(initialOffset, size); | 
|   782     return offset; |   867     return offset; | 
|   783 } |   868 } | 
|   784  |   869  | 
|   785 bool SkPictureRecord::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA
      ) { |   870 bool SkPictureRecord::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA
      ) { | 
|   786     if (rrect.isRect()) { |   871     if (rrect.isRect()) { | 
|   787         return this->SkPictureRecord::clipRect(rrect.getBounds(), op, doAA); |   872         return this->SkPictureRecord::clipRect(rrect.getBounds(), op, doAA); | 
|   788     } |   873     } | 
|   789  |   874  | 
 |   875 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   876     fMCMgr.clipRRect(rrect, op, doAA); | 
 |   877 #else | 
|   790     this->recordClipRRect(rrect, op, doAA); |   878     this->recordClipRRect(rrect, op, doAA); | 
 |   879 #endif | 
|   791     if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) { |   880     if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) { | 
|   792         return this->updateClipConservativelyUsingBounds(rrect.getBounds(), op, 
      false); |   881         return this->updateClipConservativelyUsingBounds(rrect.getBounds(), op, 
      false); | 
|   793     } else { |   882     } else { | 
|   794         return this->INHERITED::clipRRect(rrect, op, doAA); |   883         return this->INHERITED::clipRRect(rrect, op, doAA); | 
|   795     } |   884     } | 
|   796 } |   885 } | 
|   797  |   886  | 
|   798 int SkPictureRecord::recordClipRRect(const SkRRect& rrect, SkRegion::Op op, bool
       doAA) { |   887 int SkPictureRecord::recordClipRRect(const SkRRect& rrect, SkRegion::Op op, bool
       doAA) { | 
|   799  |  | 
|   800     // op + rrect + clip params |   888     // op + rrect + clip params | 
|   801     uint32_t size = 1 * kUInt32Size + SkRRect::kSizeInMemory + 1 * kUInt32Size; |   889     uint32_t size = 1 * kUInt32Size + SkRRect::kSizeInMemory + 1 * kUInt32Size; | 
 |   890 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   891     size += kUInt32Size;    // + restore offset | 
 |   892 #else | 
|   802     // recordRestoreOffsetPlaceholder doesn't always write an offset |   893     // recordRestoreOffsetPlaceholder doesn't always write an offset | 
|   803     if (!fRestoreOffsetStack.isEmpty()) { |   894     if (!fRestoreOffsetStack.isEmpty()) { | 
|   804         // + restore offset |   895         // + restore offset | 
|   805         size += kUInt32Size; |   896         size += kUInt32Size; | 
|   806     } |   897     } | 
 |   898 #endif | 
|   807     size_t initialOffset = this->addDraw(CLIP_RRECT, &size); |   899     size_t initialOffset = this->addDraw(CLIP_RRECT, &size); | 
|   808     this->addRRect(rrect); |   900     this->addRRect(rrect); | 
|   809     this->addInt(ClipParams_pack(op, doAA)); |   901     this->addInt(ClipParams_pack(op, doAA)); | 
|   810     int offset = recordRestoreOffsetPlaceholder(op); |   902     int offset = recordRestoreOffsetPlaceholder(op); | 
|   811  |  | 
|   812     this->validate(initialOffset, size); |   903     this->validate(initialOffset, size); | 
|   813     return offset; |   904     return offset; | 
|   814 } |   905 } | 
|   815  |   906  | 
|   816 bool SkPictureRecord::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) { |   907 bool SkPictureRecord::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) { | 
|   817  |   908  | 
|   818     SkRect r; |   909     SkRect r; | 
|   819     if (!path.isInverseFillType() && path.isRect(&r)) { |   910     if (!path.isInverseFillType() && path.isRect(&r)) { | 
|   820         return this->clipRect(r, op, doAA); |   911         return this->clipRect(r, op, doAA); | 
|   821     } |   912     } | 
|   822  |   913  | 
 |   914 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   915     fMCMgr.clipPath(path, op, doAA); | 
 |   916 #else | 
|   823     int pathID = this->addPathToHeap(path); |   917     int pathID = this->addPathToHeap(path); | 
|   824     this->recordClipPath(pathID, op, doAA); |   918     this->recordClipPath(pathID, op, doAA); | 
 |   919 #endif | 
|   825  |   920  | 
|   826     if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) { |   921     if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) { | 
|   827         return this->updateClipConservativelyUsingBounds(path.getBounds(), op, |   922         return this->updateClipConservativelyUsingBounds(path.getBounds(), op, | 
|   828                                                          path.isInverseFillType(
      )); |   923                                                          path.isInverseFillType(
      )); | 
|   829     } else { |   924     } else { | 
|   830         return this->INHERITED::clipPath(path, op, doAA); |   925         return this->INHERITED::clipPath(path, op, doAA); | 
|   831     } |   926     } | 
|   832 } |   927 } | 
|   833  |   928  | 
|   834 int SkPictureRecord::recordClipPath(int pathID, SkRegion::Op op, bool doAA) { |   929 int SkPictureRecord::recordClipPath(int pathID, SkRegion::Op op, bool doAA) { | 
|   835  |  | 
|   836     // op + path index + clip params |   930     // op + path index + clip params | 
|   837     uint32_t size = 3 * kUInt32Size; |   931     uint32_t size = 3 * kUInt32Size; | 
 |   932 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   933     size += kUInt32Size;    // + restore offset | 
 |   934 #else | 
|   838     // recordRestoreOffsetPlaceholder doesn't always write an offset |   935     // recordRestoreOffsetPlaceholder doesn't always write an offset | 
|   839     if (!fRestoreOffsetStack.isEmpty()) { |   936     if (!fRestoreOffsetStack.isEmpty()) { | 
|   840         // + restore offset |   937         // + restore offset | 
|   841         size += kUInt32Size; |   938         size += kUInt32Size; | 
|   842     } |   939     } | 
 |   940 #endif | 
|   843     size_t initialOffset = this->addDraw(CLIP_PATH, &size); |   941     size_t initialOffset = this->addDraw(CLIP_PATH, &size); | 
|   844     this->addInt(pathID); |   942     this->addInt(pathID); | 
|   845     this->addInt(ClipParams_pack(op, doAA)); |   943     this->addInt(ClipParams_pack(op, doAA)); | 
|   846     int offset = recordRestoreOffsetPlaceholder(op); |   944     int offset = recordRestoreOffsetPlaceholder(op); | 
|   847  |  | 
|   848     this->validate(initialOffset, size); |   945     this->validate(initialOffset, size); | 
|   849     return offset; |   946     return offset; | 
|   850 } |   947 } | 
|   851  |   948  | 
|   852 bool SkPictureRecord::clipRegion(const SkRegion& region, SkRegion::Op op) { |   949 bool SkPictureRecord::clipRegion(const SkRegion& region, SkRegion::Op op) { | 
 |   950  | 
 |   951 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   952     fMCMgr.clipRegion(region, op); | 
 |   953 #else | 
|   853     this->recordClipRegion(region, op); |   954     this->recordClipRegion(region, op); | 
 |   955 #endif | 
|   854     return this->INHERITED::clipRegion(region, op); |   956     return this->INHERITED::clipRegion(region, op); | 
|   855 } |   957 } | 
|   856  |   958  | 
|   857 int SkPictureRecord::recordClipRegion(const SkRegion& region, SkRegion::Op op) { |   959 int SkPictureRecord::recordClipRegion(const SkRegion& region, SkRegion::Op op) { | 
|   858     // op + clip params + region |   960     // op + clip params + region | 
|   859     uint32_t size = 2 * kUInt32Size + region.writeToMemory(NULL); |   961     uint32_t size = 2 * kUInt32Size + region.writeToMemory(NULL); | 
 |   962 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   963     size += kUInt32Size;    // + restore offset | 
 |   964 #else | 
|   860     // recordRestoreOffsetPlaceholder doesn't always write an offset |   965     // recordRestoreOffsetPlaceholder doesn't always write an offset | 
|   861     if (!fRestoreOffsetStack.isEmpty()) { |   966     if (!fRestoreOffsetStack.isEmpty()) { | 
|   862         // + restore offset |   967         // + restore offset | 
|   863         size += kUInt32Size; |   968         size += kUInt32Size; | 
|   864     } |   969     } | 
 |   970 #endif | 
|   865     size_t initialOffset = this->addDraw(CLIP_REGION, &size); |   971     size_t initialOffset = this->addDraw(CLIP_REGION, &size); | 
|   866     this->addRegion(region); |   972     this->addRegion(region); | 
|   867     this->addInt(ClipParams_pack(op, false)); |   973     this->addInt(ClipParams_pack(op, false)); | 
|   868     int offset = this->recordRestoreOffsetPlaceholder(op); |   974     int offset = this->recordRestoreOffsetPlaceholder(op); | 
|   869  |   975  | 
|   870     this->validate(initialOffset, size); |   976     this->validate(initialOffset, size); | 
|   871     return offset; |   977     return offset; | 
|   872 } |   978 } | 
|   873  |   979  | 
|   874 void SkPictureRecord::clear(SkColor color) { |   980 void SkPictureRecord::clear(SkColor color) { | 
 |   981  | 
 |   982 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   983     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |   984 #endif | 
 |   985  | 
|   875     // op + color |   986     // op + color | 
|   876     uint32_t size = 2 * kUInt32Size; |   987     uint32_t size = 2 * kUInt32Size; | 
|   877     size_t initialOffset = this->addDraw(DRAW_CLEAR, &size); |   988     size_t initialOffset = this->addDraw(DRAW_CLEAR, &size); | 
|   878     this->addInt(color); |   989     this->addInt(color); | 
|   879     this->validate(initialOffset, size); |   990     this->validate(initialOffset, size); | 
|   880 } |   991 } | 
|   881  |   992  | 
|   882 void SkPictureRecord::drawPaint(const SkPaint& paint) { |   993 void SkPictureRecord::drawPaint(const SkPaint& paint) { | 
 |   994  | 
 |   995 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |   996     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |   997 #endif | 
 |   998  | 
|   883     // op + paint index |   999     // op + paint index | 
|   884     uint32_t size = 2 * kUInt32Size; |  1000     uint32_t size = 2 * kUInt32Size; | 
|   885     size_t initialOffset = this->addDraw(DRAW_PAINT, &size); |  1001     size_t initialOffset = this->addDraw(DRAW_PAINT, &size); | 
|   886     SkASSERT(initialOffset+getPaintOffset(DRAW_PAINT, size) == fWriter.bytesWrit
      ten()); |  1002     SkASSERT(initialOffset+getPaintOffset(DRAW_PAINT, size) == fWriter.bytesWrit
      ten()); | 
|   887     this->addPaint(paint); |  1003     this->addPaint(paint); | 
|   888     this->validate(initialOffset, size); |  1004     this->validate(initialOffset, size); | 
|   889 } |  1005 } | 
|   890  |  1006  | 
|   891 void SkPictureRecord::drawPoints(PointMode mode, size_t count, const SkPoint pts
      [], |  1007 void SkPictureRecord::drawPoints(PointMode mode, size_t count, const SkPoint pts
      [], | 
|   892                                  const SkPaint& paint) { |  1008                                  const SkPaint& paint) { | 
 |  1009  | 
 |  1010 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1011     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1012 #endif | 
 |  1013  | 
|   893     // op + paint index + mode + count + point data |  1014     // op + paint index + mode + count + point data | 
|   894     uint32_t size = 4 * kUInt32Size + count * sizeof(SkPoint); |  1015     uint32_t size = 4 * kUInt32Size + count * sizeof(SkPoint); | 
|   895     size_t initialOffset = this->addDraw(DRAW_POINTS, &size); |  1016     size_t initialOffset = this->addDraw(DRAW_POINTS, &size); | 
|   896     SkASSERT(initialOffset+getPaintOffset(DRAW_POINTS, size) == fWriter.bytesWri
      tten()); |  1017     SkASSERT(initialOffset+getPaintOffset(DRAW_POINTS, size) == fWriter.bytesWri
      tten()); | 
|   897     this->addPaint(paint); |  1018     this->addPaint(paint); | 
|   898     this->addInt(mode); |  1019     this->addInt(mode); | 
|   899     this->addInt(count); |  1020     this->addInt(count); | 
|   900     fWriter.writeMul4(pts, count * sizeof(SkPoint)); |  1021     fWriter.writeMul4(pts, count * sizeof(SkPoint)); | 
|   901     this->validate(initialOffset, size); |  1022     this->validate(initialOffset, size); | 
|   902 } |  1023 } | 
|   903  |  1024  | 
|   904 void SkPictureRecord::drawOval(const SkRect& oval, const SkPaint& paint) { |  1025 void SkPictureRecord::drawOval(const SkRect& oval, const SkPaint& paint) { | 
 |  1026  | 
 |  1027 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1028     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1029 #endif | 
 |  1030  | 
|   905     // op + paint index + rect |  1031     // op + paint index + rect | 
|   906     uint32_t size = 2 * kUInt32Size + sizeof(oval); |  1032     uint32_t size = 2 * kUInt32Size + sizeof(oval); | 
|   907     size_t initialOffset = this->addDraw(DRAW_OVAL, &size); |  1033     size_t initialOffset = this->addDraw(DRAW_OVAL, &size); | 
|   908     SkASSERT(initialOffset+getPaintOffset(DRAW_OVAL, size) == fWriter.bytesWritt
      en()); |  1034     SkASSERT(initialOffset+getPaintOffset(DRAW_OVAL, size) == fWriter.bytesWritt
      en()); | 
|   909     this->addPaint(paint); |  1035     this->addPaint(paint); | 
|   910     this->addRect(oval); |  1036     this->addRect(oval); | 
|   911     this->validate(initialOffset, size); |  1037     this->validate(initialOffset, size); | 
|   912 } |  1038 } | 
|   913  |  1039  | 
|   914 void SkPictureRecord::drawRect(const SkRect& rect, const SkPaint& paint) { |  1040 void SkPictureRecord::drawRect(const SkRect& rect, const SkPaint& paint) { | 
 |  1041  | 
 |  1042 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1043     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1044 #endif | 
 |  1045  | 
|   915     // op + paint index + rect |  1046     // op + paint index + rect | 
|   916     uint32_t size = 2 * kUInt32Size + sizeof(rect); |  1047     uint32_t size = 2 * kUInt32Size + sizeof(rect); | 
|   917     size_t initialOffset = this->addDraw(DRAW_RECT, &size); |  1048     size_t initialOffset = this->addDraw(DRAW_RECT, &size); | 
|   918     SkASSERT(initialOffset+getPaintOffset(DRAW_RECT, size) == fWriter.bytesWritt
      en()); |  1049     SkASSERT(initialOffset+getPaintOffset(DRAW_RECT, size) == fWriter.bytesWritt
      en()); | 
|   919     this->addPaint(paint); |  1050     this->addPaint(paint); | 
|   920     this->addRect(rect); |  1051     this->addRect(rect); | 
|   921     this->validate(initialOffset, size); |  1052     this->validate(initialOffset, size); | 
|   922 } |  1053 } | 
|   923  |  1054  | 
|   924 void SkPictureRecord::drawRRect(const SkRRect& rrect, const SkPaint& paint) { |  1055 void SkPictureRecord::drawRRect(const SkRRect& rrect, const SkPaint& paint) { | 
 |  1056  | 
 |  1057 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1058     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1059 #endif | 
 |  1060  | 
|   925     if (rrect.isRect()) { |  1061     if (rrect.isRect()) { | 
|   926         this->SkPictureRecord::drawRect(rrect.getBounds(), paint); |  1062         this->SkPictureRecord::drawRect(rrect.getBounds(), paint); | 
|   927     } else if (rrect.isOval()) { |  1063     } else if (rrect.isOval()) { | 
|   928         this->SkPictureRecord::drawOval(rrect.getBounds(), paint); |  1064         this->SkPictureRecord::drawOval(rrect.getBounds(), paint); | 
|   929     } else { |  1065     } else { | 
|   930         // op + paint index + rrect |  1066         // op + paint index + rrect | 
|   931         uint32_t initialOffset, size; |  1067         uint32_t initialOffset, size; | 
|   932         size = 2 * kUInt32Size + SkRRect::kSizeInMemory; |  1068         size = 2 * kUInt32Size + SkRRect::kSizeInMemory; | 
|   933         initialOffset = this->addDraw(DRAW_RRECT, &size); |  1069         initialOffset = this->addDraw(DRAW_RRECT, &size); | 
|   934         SkASSERT(initialOffset+getPaintOffset(DRAW_RRECT, size) == fWriter.bytes
      Written()); |  1070         SkASSERT(initialOffset+getPaintOffset(DRAW_RRECT, size) == fWriter.bytes
      Written()); | 
|   935         this->addPaint(paint); |  1071         this->addPaint(paint); | 
|   936         this->addRRect(rrect); |  1072         this->addRRect(rrect); | 
|   937         this->validate(initialOffset, size); |  1073         this->validate(initialOffset, size); | 
|   938     } |  1074     } | 
|   939 } |  1075 } | 
|   940  |  1076  | 
|   941 void SkPictureRecord::drawPath(const SkPath& path, const SkPaint& paint) { |  1077 void SkPictureRecord::drawPath(const SkPath& path, const SkPaint& paint) { | 
 |  1078  | 
 |  1079 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1080     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1081 #endif | 
 |  1082  | 
|   942     // op + paint index + path index |  1083     // op + paint index + path index | 
|   943     uint32_t size = 3 * kUInt32Size; |  1084     uint32_t size = 3 * kUInt32Size; | 
|   944     size_t initialOffset = this->addDraw(DRAW_PATH, &size); |  1085     size_t initialOffset = this->addDraw(DRAW_PATH, &size); | 
|   945     SkASSERT(initialOffset+getPaintOffset(DRAW_PATH, size) == fWriter.bytesWritt
      en()); |  1086     SkASSERT(initialOffset+getPaintOffset(DRAW_PATH, size) == fWriter.bytesWritt
      en()); | 
|   946     this->addPaint(paint); |  1087     this->addPaint(paint); | 
|   947     this->addPath(path); |  1088     this->addPath(path); | 
|   948     this->validate(initialOffset, size); |  1089     this->validate(initialOffset, size); | 
|   949 } |  1090 } | 
|   950  |  1091  | 
|   951 void SkPictureRecord::drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar
       top, |  1092 void SkPictureRecord::drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar
       top, | 
|   952                                  const SkPaint* paint = NULL) { |  1093                                  const SkPaint* paint = NULL) { | 
|   953     if (bitmap.drawsNothing()) { |  1094     if (bitmap.drawsNothing()) { | 
|   954         return; |  1095         return; | 
|   955     } |  1096     } | 
 |  1097  | 
 |  1098 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1099     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1100 #endif | 
 |  1101  | 
|   956     // op + paint index + bitmap index + left + top |  1102     // op + paint index + bitmap index + left + top | 
|   957     uint32_t size = 3 * kUInt32Size + 2 * sizeof(SkScalar); |  1103     uint32_t size = 3 * kUInt32Size + 2 * sizeof(SkScalar); | 
|   958     size_t initialOffset = this->addDraw(DRAW_BITMAP, &size); |  1104     size_t initialOffset = this->addDraw(DRAW_BITMAP, &size); | 
|   959     SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP, size) == fWriter.bytesWri
      tten()); |  1105     SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP, size) == fWriter.bytesWri
      tten()); | 
|   960     this->addPaintPtr(paint); |  1106     this->addPaintPtr(paint); | 
|   961     this->addBitmap(bitmap); |  1107     this->addBitmap(bitmap); | 
|   962     this->addScalar(left); |  1108     this->addScalar(left); | 
|   963     this->addScalar(top); |  1109     this->addScalar(top); | 
|   964     this->validate(initialOffset, size); |  1110     this->validate(initialOffset, size); | 
|   965 } |  1111 } | 
|   966  |  1112  | 
|   967 void SkPictureRecord::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect*
       src, |  1113 void SkPictureRecord::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect*
       src, | 
|   968                                            const SkRect& dst, const SkPaint* pai
      nt, |  1114                                            const SkRect& dst, const SkPaint* pai
      nt, | 
|   969                                            DrawBitmapRectFlags flags) { |  1115                                            DrawBitmapRectFlags flags) { | 
|   970     if (bitmap.drawsNothing()) { |  1116     if (bitmap.drawsNothing()) { | 
|   971         return; |  1117         return; | 
|   972     } |  1118     } | 
 |  1119  | 
 |  1120 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1121     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1122 #endif | 
|   973     // id + paint index + bitmap index + bool for 'src' + flags |  1123     // id + paint index + bitmap index + bool for 'src' + flags | 
|   974     uint32_t size = 5 * kUInt32Size; |  1124     uint32_t size = 5 * kUInt32Size; | 
|   975     if (NULL != src) { |  1125     if (NULL != src) { | 
|   976         size += sizeof(*src);   // + rect |  1126         size += sizeof(*src);   // + rect | 
|   977     } |  1127     } | 
|   978     size += sizeof(dst);        // + rect |  1128     size += sizeof(dst);        // + rect | 
|   979  |  1129  | 
|   980     size_t initialOffset = this->addDraw(DRAW_BITMAP_RECT_TO_RECT, &size); |  1130     size_t initialOffset = this->addDraw(DRAW_BITMAP_RECT_TO_RECT, &size); | 
|   981     SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_RECT_TO_RECT, size) |  1131     SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_RECT_TO_RECT, size) | 
|   982              == fWriter.bytesWritten()); |  1132              == fWriter.bytesWritten()); | 
|   983     this->addPaintPtr(paint); |  1133     this->addPaintPtr(paint); | 
|   984     this->addBitmap(bitmap); |  1134     this->addBitmap(bitmap); | 
|   985     this->addRectPtr(src);  // may be null |  1135     this->addRectPtr(src);  // may be null | 
|   986     this->addRect(dst); |  1136     this->addRect(dst); | 
|   987     this->addInt(flags); |  1137     this->addInt(flags); | 
|   988     this->validate(initialOffset, size); |  1138     this->validate(initialOffset, size); | 
|   989 } |  1139 } | 
|   990  |  1140  | 
|   991 void SkPictureRecord::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m
      atrix, |  1141 void SkPictureRecord::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m
      atrix, | 
|   992                                        const SkPaint* paint) { |  1142                                        const SkPaint* paint) { | 
|   993     if (bitmap.drawsNothing()) { |  1143     if (bitmap.drawsNothing()) { | 
|   994         return; |  1144         return; | 
|   995     } |  1145     } | 
 |  1146  | 
 |  1147 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1148     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1149 #endif | 
 |  1150  | 
|   996     // id + paint index + bitmap index + matrix |  1151     // id + paint index + bitmap index + matrix | 
|   997     uint32_t size = 3 * kUInt32Size + matrix.writeToMemory(NULL); |  1152     uint32_t size = 3 * kUInt32Size + matrix.writeToMemory(NULL); | 
|   998     size_t initialOffset = this->addDraw(DRAW_BITMAP_MATRIX, &size); |  1153     size_t initialOffset = this->addDraw(DRAW_BITMAP_MATRIX, &size); | 
|   999     SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_MATRIX, size) == fWriter.b
      ytesWritten()); |  1154     SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_MATRIX, size) == fWriter.b
      ytesWritten()); | 
|  1000     this->addPaintPtr(paint); |  1155     this->addPaintPtr(paint); | 
|  1001     this->addBitmap(bitmap); |  1156     this->addBitmap(bitmap); | 
|  1002     this->addMatrix(matrix); |  1157     this->addMatrix(matrix); | 
|  1003     this->validate(initialOffset, size); |  1158     this->validate(initialOffset, size); | 
|  1004 } |  1159 } | 
|  1005  |  1160  | 
|  1006 void SkPictureRecord::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& cent
      er, |  1161 void SkPictureRecord::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& cent
      er, | 
|  1007                                      const SkRect& dst, const SkPaint* paint) { |  1162                                      const SkRect& dst, const SkPaint* paint) { | 
|  1008     if (bitmap.drawsNothing()) { |  1163     if (bitmap.drawsNothing()) { | 
|  1009         return; |  1164         return; | 
|  1010     } |  1165     } | 
 |  1166  | 
 |  1167 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1168     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1169 #endif | 
 |  1170  | 
|  1011     // op + paint index + bitmap id + center + dst rect |  1171     // op + paint index + bitmap id + center + dst rect | 
|  1012     uint32_t size = 3 * kUInt32Size + sizeof(center) + sizeof(dst); |  1172     uint32_t size = 3 * kUInt32Size + sizeof(center) + sizeof(dst); | 
|  1013     size_t initialOffset = this->addDraw(DRAW_BITMAP_NINE, &size); |  1173     size_t initialOffset = this->addDraw(DRAW_BITMAP_NINE, &size); | 
|  1014     SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_NINE, size) == fWriter.byt
      esWritten()); |  1174     SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_NINE, size) == fWriter.byt
      esWritten()); | 
|  1015     this->addPaintPtr(paint); |  1175     this->addPaintPtr(paint); | 
|  1016     this->addBitmap(bitmap); |  1176     this->addBitmap(bitmap); | 
|  1017     this->addIRect(center); |  1177     this->addIRect(center); | 
|  1018     this->addRect(dst); |  1178     this->addRect(dst); | 
|  1019     this->validate(initialOffset, size); |  1179     this->validate(initialOffset, size); | 
|  1020 } |  1180 } | 
|  1021  |  1181  | 
|  1022 void SkPictureRecord::drawSprite(const SkBitmap& bitmap, int left, int top, |  1182 void SkPictureRecord::drawSprite(const SkBitmap& bitmap, int left, int top, | 
|  1023                                  const SkPaint* paint = NULL) { |  1183                                  const SkPaint* paint = NULL) { | 
|  1024     if (bitmap.drawsNothing()) { |  1184     if (bitmap.drawsNothing()) { | 
|  1025         return; |  1185         return; | 
|  1026     } |  1186     } | 
 |  1187  | 
 |  1188 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1189     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1190 #endif | 
 |  1191  | 
|  1027     // op + paint index + bitmap index + left + top |  1192     // op + paint index + bitmap index + left + top | 
|  1028     uint32_t size = 5 * kUInt32Size; |  1193     uint32_t size = 5 * kUInt32Size; | 
|  1029     size_t initialOffset = this->addDraw(DRAW_SPRITE, &size); |  1194     size_t initialOffset = this->addDraw(DRAW_SPRITE, &size); | 
|  1030     SkASSERT(initialOffset+getPaintOffset(DRAW_SPRITE, size) == fWriter.bytesWri
      tten()); |  1195     SkASSERT(initialOffset+getPaintOffset(DRAW_SPRITE, size) == fWriter.bytesWri
      tten()); | 
|  1031     this->addPaintPtr(paint); |  1196     this->addPaintPtr(paint); | 
|  1032     this->addBitmap(bitmap); |  1197     this->addBitmap(bitmap); | 
|  1033     this->addInt(left); |  1198     this->addInt(left); | 
|  1034     this->addInt(top); |  1199     this->addInt(top); | 
|  1035     this->validate(initialOffset, size); |  1200     this->validate(initialOffset, size); | 
|  1036 } |  1201 } | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|  1049  |  1214  | 
|  1050 void SkPictureRecord::addFontMetricsTopBottom(const SkPaint& paint, const SkFlat
      Data& flat, |  1215 void SkPictureRecord::addFontMetricsTopBottom(const SkPaint& paint, const SkFlat
      Data& flat, | 
|  1051                                               SkScalar minY, SkScalar maxY) { |  1216                                               SkScalar minY, SkScalar maxY) { | 
|  1052     WriteTopBot(paint, flat); |  1217     WriteTopBot(paint, flat); | 
|  1053     this->addScalar(flat.topBot()[0] + minY); |  1218     this->addScalar(flat.topBot()[0] + minY); | 
|  1054     this->addScalar(flat.topBot()[1] + maxY); |  1219     this->addScalar(flat.topBot()[1] + maxY); | 
|  1055 } |  1220 } | 
|  1056  |  1221  | 
|  1057 void SkPictureRecord::drawText(const void* text, size_t byteLength, SkScalar x, |  1222 void SkPictureRecord::drawText(const void* text, size_t byteLength, SkScalar x, | 
|  1058                       SkScalar y, const SkPaint& paint) { |  1223                       SkScalar y, const SkPaint& paint) { | 
 |  1224  | 
 |  1225 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1226     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1227 #endif | 
 |  1228  | 
|  1059     bool fast = !paint.isVerticalText() && paint.canComputeFastBounds(); |  1229     bool fast = !paint.isVerticalText() && paint.canComputeFastBounds(); | 
|  1060  |  1230  | 
|  1061     // op + paint index + length + 'length' worth of chars + x + y |  1231     // op + paint index + length + 'length' worth of chars + x + y | 
|  1062     uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 2 * sizeof(SkScalar
      ); |  1232     uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 2 * sizeof(SkScalar
      ); | 
|  1063     if (fast) { |  1233     if (fast) { | 
|  1064         size += 2 * sizeof(SkScalar); // + top & bottom |  1234         size += 2 * sizeof(SkScalar); // + top & bottom | 
|  1065     } |  1235     } | 
|  1066  |  1236  | 
|  1067     DrawType op = fast ? DRAW_TEXT_TOP_BOTTOM : DRAW_TEXT; |  1237     DrawType op = fast ? DRAW_TEXT_TOP_BOTTOM : DRAW_TEXT; | 
|  1068     size_t initialOffset = this->addDraw(op, &size); |  1238     size_t initialOffset = this->addDraw(op, &size); | 
|  1069     SkASSERT(initialOffset+getPaintOffset(op, size) == fWriter.bytesWritten()); |  1239     SkASSERT(initialOffset+getPaintOffset(op, size) == fWriter.bytesWritten()); | 
|  1070     const SkFlatData* flatPaintData = addPaint(paint); |  1240     const SkFlatData* flatPaintData = addPaint(paint); | 
|  1071     SkASSERT(flatPaintData); |  1241     SkASSERT(flatPaintData); | 
|  1072     this->addText(text, byteLength); |  1242     this->addText(text, byteLength); | 
|  1073     this->addScalar(x); |  1243     this->addScalar(x); | 
|  1074     this->addScalar(y); |  1244     this->addScalar(y); | 
|  1075     if (fast) { |  1245     if (fast) { | 
|  1076         this->addFontMetricsTopBottom(paint, *flatPaintData, y, y); |  1246         this->addFontMetricsTopBottom(paint, *flatPaintData, y, y); | 
|  1077     } |  1247     } | 
|  1078     this->validate(initialOffset, size); |  1248     this->validate(initialOffset, size); | 
|  1079 } |  1249 } | 
|  1080  |  1250  | 
|  1081 void SkPictureRecord::drawPosText(const void* text, size_t byteLength, |  1251 void SkPictureRecord::drawPosText(const void* text, size_t byteLength, | 
|  1082                          const SkPoint pos[], const SkPaint& paint) { |  1252                          const SkPoint pos[], const SkPaint& paint) { | 
 |  1253  | 
 |  1254 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1255     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1256 #endif | 
 |  1257  | 
|  1083     size_t points = paint.countText(text, byteLength); |  1258     size_t points = paint.countText(text, byteLength); | 
|  1084     if (0 == points) |  1259     if (0 == points) | 
|  1085         return; |  1260         return; | 
|  1086  |  1261  | 
|  1087     bool canUseDrawH = true; |  1262     bool canUseDrawH = true; | 
|  1088     SkScalar minY = pos[0].fY; |  1263     SkScalar minY = pos[0].fY; | 
|  1089     SkScalar maxY = pos[0].fY; |  1264     SkScalar maxY = pos[0].fY; | 
|  1090     // check if the caller really should have used drawPosTextH() |  1265     // check if the caller really should have used drawPosTextH() | 
|  1091     { |  1266     { | 
|  1092         const SkScalar firstY = pos[0].fY; |  1267         const SkScalar firstY = pos[0].fY; | 
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1159     fPointBytes += fWriter.bytesWritten() - start; |  1334     fPointBytes += fWriter.bytesWritten() - start; | 
|  1160     fPointWrites += points; |  1335     fPointWrites += points; | 
|  1161 #endif |  1336 #endif | 
|  1162     this->validate(initialOffset, size); |  1337     this->validate(initialOffset, size); | 
|  1163 } |  1338 } | 
|  1164  |  1339  | 
|  1165 void SkPictureRecord::drawPosTextH(const void* text, size_t byteLength, |  1340 void SkPictureRecord::drawPosTextH(const void* text, size_t byteLength, | 
|  1166                           const SkScalar xpos[], SkScalar constY, |  1341                           const SkScalar xpos[], SkScalar constY, | 
|  1167                           const SkPaint& paint) { |  1342                           const SkPaint& paint) { | 
|  1168  |  1343  | 
 |  1344 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1345     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1346 #endif | 
 |  1347  | 
|  1169     const SkFlatData* flatPaintData = this->getFlatPaintData(paint); |  1348     const SkFlatData* flatPaintData = this->getFlatPaintData(paint); | 
|  1170     this->drawPosTextHImpl(text, byteLength, xpos, constY, paint, flatPaintData)
      ; |  1349     this->drawPosTextHImpl(text, byteLength, xpos, constY, paint, flatPaintData)
      ; | 
|  1171 } |  1350 } | 
|  1172  |  1351  | 
|  1173 void SkPictureRecord::drawPosTextHImpl(const void* text, size_t byteLength, |  1352 void SkPictureRecord::drawPosTextHImpl(const void* text, size_t byteLength, | 
|  1174                           const SkScalar xpos[], SkScalar constY, |  1353                           const SkScalar xpos[], SkScalar constY, | 
|  1175                           const SkPaint& paint, const SkFlatData* flatPaintData)
       { |  1354                           const SkPaint& paint, const SkFlatData* flatPaintData)
       { | 
|  1176     size_t points = paint.countText(text, byteLength); |  1355     size_t points = paint.countText(text, byteLength); | 
|  1177     if (0 == points) |  1356     if (0 == points) | 
|  1178         return; |  1357         return; | 
| (...skipping 26 matching lines...) Expand all  Loading... | 
|  1205 #ifdef SK_DEBUG_SIZE |  1384 #ifdef SK_DEBUG_SIZE | 
|  1206     fPointBytes += fWriter.bytesWritten() - start; |  1385     fPointBytes += fWriter.bytesWritten() - start; | 
|  1207     fPointWrites += points; |  1386     fPointWrites += points; | 
|  1208 #endif |  1387 #endif | 
|  1209     this->validate(initialOffset, size); |  1388     this->validate(initialOffset, size); | 
|  1210 } |  1389 } | 
|  1211  |  1390  | 
|  1212 void SkPictureRecord::drawTextOnPath(const void* text, size_t byteLength, |  1391 void SkPictureRecord::drawTextOnPath(const void* text, size_t byteLength, | 
|  1213                             const SkPath& path, const SkMatrix* matrix, |  1392                             const SkPath& path, const SkMatrix* matrix, | 
|  1214                             const SkPaint& paint) { |  1393                             const SkPaint& paint) { | 
 |  1394  | 
 |  1395 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1396     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1397 #endif | 
 |  1398  | 
|  1215     // op + paint index + length + 'length' worth of data + path index + matrix |  1399     // op + paint index + length + 'length' worth of data + path index + matrix | 
|  1216     const SkMatrix& m = matrix ? *matrix : SkMatrix::I(); |  1400     const SkMatrix& m = matrix ? *matrix : SkMatrix::I(); | 
|  1217     uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + kUInt32Size + m.wri
      teToMemory(NULL); |  1401     uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + kUInt32Size + m.wri
      teToMemory(NULL); | 
|  1218     size_t initialOffset = this->addDraw(DRAW_TEXT_ON_PATH, &size); |  1402     size_t initialOffset = this->addDraw(DRAW_TEXT_ON_PATH, &size); | 
|  1219     SkASSERT(initialOffset+getPaintOffset(DRAW_TEXT_ON_PATH, size) == fWriter.by
      tesWritten()); |  1403     SkASSERT(initialOffset+getPaintOffset(DRAW_TEXT_ON_PATH, size) == fWriter.by
      tesWritten()); | 
|  1220     this->addPaint(paint); |  1404     this->addPaint(paint); | 
|  1221     this->addText(text, byteLength); |  1405     this->addText(text, byteLength); | 
|  1222     this->addPath(path); |  1406     this->addPath(path); | 
|  1223     this->addMatrix(m); |  1407     this->addMatrix(m); | 
|  1224     this->validate(initialOffset, size); |  1408     this->validate(initialOffset, size); | 
|  1225 } |  1409 } | 
|  1226  |  1410  | 
|  1227 void SkPictureRecord::drawPicture(SkPicture& picture) { |  1411 void SkPictureRecord::drawPicture(SkPicture& picture) { | 
 |  1412  | 
 |  1413 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1414     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1415 #endif | 
 |  1416  | 
|  1228     // op + picture index |  1417     // op + picture index | 
|  1229     uint32_t size = 2 * kUInt32Size; |  1418     uint32_t size = 2 * kUInt32Size; | 
|  1230     size_t initialOffset = this->addDraw(DRAW_PICTURE, &size); |  1419     size_t initialOffset = this->addDraw(DRAW_PICTURE, &size); | 
|  1231     this->addPicture(picture); |  1420     this->addPicture(picture); | 
|  1232     this->validate(initialOffset, size); |  1421     this->validate(initialOffset, size); | 
|  1233 } |  1422 } | 
|  1234  |  1423  | 
|  1235 void SkPictureRecord::drawVertices(VertexMode vmode, int vertexCount, |  1424 void SkPictureRecord::drawVertices(VertexMode vmode, int vertexCount, | 
|  1236                           const SkPoint vertices[], const SkPoint texs[], |  1425                           const SkPoint vertices[], const SkPoint texs[], | 
|  1237                           const SkColor colors[], SkXfermode* xfer, |  1426                           const SkColor colors[], SkXfermode* xfer, | 
|  1238                           const uint16_t indices[], int indexCount, |  1427                           const uint16_t indices[], int indexCount, | 
|  1239                           const SkPaint& paint) { |  1428                           const SkPaint& paint) { | 
 |  1429  | 
 |  1430 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1431     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1432 #endif | 
 |  1433  | 
|  1240     uint32_t flags = 0; |  1434     uint32_t flags = 0; | 
|  1241     if (texs) { |  1435     if (texs) { | 
|  1242         flags |= DRAW_VERTICES_HAS_TEXS; |  1436         flags |= DRAW_VERTICES_HAS_TEXS; | 
|  1243     } |  1437     } | 
|  1244     if (colors) { |  1438     if (colors) { | 
|  1245         flags |= DRAW_VERTICES_HAS_COLORS; |  1439         flags |= DRAW_VERTICES_HAS_COLORS; | 
|  1246     } |  1440     } | 
|  1247     if (indexCount > 0) { |  1441     if (indexCount > 0) { | 
|  1248         flags |= DRAW_VERTICES_HAS_INDICES; |  1442         flags |= DRAW_VERTICES_HAS_INDICES; | 
|  1249     } |  1443     } | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1289     } |  1483     } | 
|  1290     if (flags & DRAW_VERTICES_HAS_XFER) { |  1484     if (flags & DRAW_VERTICES_HAS_XFER) { | 
|  1291         SkXfermode::Mode mode = SkXfermode::kModulate_Mode; |  1485         SkXfermode::Mode mode = SkXfermode::kModulate_Mode; | 
|  1292         (void)xfer->asMode(&mode); |  1486         (void)xfer->asMode(&mode); | 
|  1293         this->addInt(mode); |  1487         this->addInt(mode); | 
|  1294     } |  1488     } | 
|  1295     this->validate(initialOffset, size); |  1489     this->validate(initialOffset, size); | 
|  1296 } |  1490 } | 
|  1297  |  1491  | 
|  1298 void SkPictureRecord::drawData(const void* data, size_t length) { |  1492 void SkPictureRecord::drawData(const void* data, size_t length) { | 
 |  1493  | 
 |  1494 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 
 |  1495     fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 
 |  1496 #endif | 
 |  1497  | 
|  1299     // op + length + 'length' worth of data |  1498     // op + length + 'length' worth of data | 
|  1300     uint32_t size = 2 * kUInt32Size + SkAlign4(length); |  1499     uint32_t size = 2 * kUInt32Size + SkAlign4(length); | 
|  1301     size_t initialOffset = this->addDraw(DRAW_DATA, &size); |  1500     size_t initialOffset = this->addDraw(DRAW_DATA, &size); | 
|  1302     this->addInt(length); |  1501     this->addInt(length); | 
|  1303     fWriter.writePad(data, length); |  1502     fWriter.writePad(data, length); | 
|  1304     this->validate(initialOffset, size); |  1503     this->validate(initialOffset, size); | 
|  1305 } |  1504 } | 
|  1306  |  1505  | 
|  1307 void SkPictureRecord::beginCommentGroup(const char* description) { |  1506 void SkPictureRecord::beginCommentGroup(const char* description) { | 
|  1308     // op/size + length of string + \0 terminated chars |  1507     // op/size + length of string + \0 terminated chars | 
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1579 void SkPictureRecord::validateRegions() const { |  1778 void SkPictureRecord::validateRegions() const { | 
|  1580     int count = fRegions.count(); |  1779     int count = fRegions.count(); | 
|  1581     SkASSERT((unsigned) count < 0x1000); |  1780     SkASSERT((unsigned) count < 0x1000); | 
|  1582     for (int index = 0; index < count; index++) { |  1781     for (int index = 0; index < count; index++) { | 
|  1583         const SkFlatData* region = fRegions[index]; |  1782         const SkFlatData* region = fRegions[index]; | 
|  1584         SkASSERT(region); |  1783         SkASSERT(region); | 
|  1585 //        region->validate(); |  1784 //        region->validate(); | 
|  1586     } |  1785     } | 
|  1587 } |  1786 } | 
|  1588 #endif |  1787 #endif | 
| OLD | NEW |