Chromium Code Reviews| 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 26 matching lines...) Expand all Loading... | |
| 37 , fRecordFlags(flags) | 37 , fRecordFlags(flags) |
| 38 , fOptsEnabled(true) { | 38 , fOptsEnabled(true) { |
| 39 #ifdef SK_DEBUG_SIZE | 39 #ifdef SK_DEBUG_SIZE |
| 40 fPointBytes = fRectBytes = fTextBytes = 0; | 40 fPointBytes = fRectBytes = fTextBytes = 0; |
| 41 fPointWrites = fRectWrites = fTextWrites = 0; | 41 fPointWrites = fRectWrites = fTextWrites = 0; |
| 42 #endif | 42 #endif |
| 43 | 43 |
| 44 fBitmapHeap = SkNEW(SkBitmapHeap); | 44 fBitmapHeap = SkNEW(SkBitmapHeap); |
| 45 fFlattenableHeap.setBitmapStorage(fBitmapHeap); | 45 fFlattenableHeap.setBitmapStorage(fBitmapHeap); |
| 46 fPathHeap = NULL; // lazy allocate | 46 fPathHeap = NULL; // lazy allocate |
| 47 fBitmapUseOffsets = NULL; // lazy allocate | |
| 48 | |
| 47 #ifndef SK_COLLAPSE_MATRIX_CLIP_STATE | 49 #ifndef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 48 fFirstSavedLayerIndex = kNoSavedLayerIndex; | 50 fFirstSavedLayerIndex = kNoSavedLayerIndex; |
| 49 #endif | 51 #endif |
| 50 | 52 |
| 51 fInitialSaveCount = kNoInitialSave; | 53 fInitialSaveCount = kNoInitialSave; |
| 52 | 54 |
| 53 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 55 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 54 fMCMgr.init(this); | 56 fMCMgr.init(this); |
| 55 #endif | 57 #endif |
| 56 } | 58 } |
| 57 | 59 |
| 58 SkPictureRecord::~SkPictureRecord() { | 60 SkPictureRecord::~SkPictureRecord() { |
| 59 SkSafeUnref(fBitmapHeap); | 61 SkSafeUnref(fBitmapHeap); |
| 60 SkSafeUnref(fPathHeap); | 62 SkSafeUnref(fPathHeap); |
| 63 SkSafeUnref(fBitmapUseOffsets); | |
| 61 SkSafeUnref(fBoundingHierarchy); | 64 SkSafeUnref(fBoundingHierarchy); |
| 62 SkSafeUnref(fStateTree); | 65 SkSafeUnref(fStateTree); |
| 63 fFlattenableHeap.setBitmapStorage(NULL); | 66 fFlattenableHeap.setBitmapStorage(NULL); |
| 64 fPictureRefs.unrefAll(); | 67 fPictureRefs.unrefAll(); |
| 65 } | 68 } |
| 66 | 69 |
| 67 /////////////////////////////////////////////////////////////////////////////// | 70 /////////////////////////////////////////////////////////////////////////////// |
| 68 | 71 |
| 69 // Return the offset of the paint inside a given op's byte stream. A zero | 72 // Return the offset of the paint inside a given op's byte stream. A zero |
| 70 // return value means there is no paint (and you really shouldn't be calling | 73 // return value means there is no paint (and you really shouldn't be calling |
| (...skipping 1047 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1118 | 1121 |
| 1119 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1122 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1120 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1123 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1121 #endif | 1124 #endif |
| 1122 | 1125 |
| 1123 // op + paint index + bitmap index + left + top | 1126 // op + paint index + bitmap index + left + top |
| 1124 uint32_t size = 3 * kUInt32Size + 2 * sizeof(SkScalar); | 1127 uint32_t size = 3 * kUInt32Size + 2 * sizeof(SkScalar); |
| 1125 size_t initialOffset = this->addDraw(DRAW_BITMAP, &size); | 1128 size_t initialOffset = this->addDraw(DRAW_BITMAP, &size); |
| 1126 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP, size) == fWriter.bytesWri tten()); | 1129 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP, size) == fWriter.bytesWri tten()); |
| 1127 this->addPaintPtr(paint); | 1130 this->addPaintPtr(paint); |
| 1128 this->addBitmap(bitmap); | 1131 int bitmapID = this->addBitmap(bitmap); |
| 1129 this->addScalar(left); | 1132 this->addScalar(left); |
| 1130 this->addScalar(top); | 1133 this->addScalar(top); |
| 1131 this->validate(initialOffset, size); | 1134 this->validate(initialOffset, size); |
| 1135 this->trackBitmapUse(bitmapID, initialOffset); | |
| 1132 } | 1136 } |
| 1133 | 1137 |
| 1134 void SkPictureRecord::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src, | 1138 void SkPictureRecord::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src, |
| 1135 const SkRect& dst, const SkPaint* pai nt, | 1139 const SkRect& dst, const SkPaint* pai nt, |
| 1136 DrawBitmapRectFlags flags) { | 1140 DrawBitmapRectFlags flags) { |
| 1137 if (bitmap.drawsNothing()) { | 1141 if (bitmap.drawsNothing()) { |
| 1138 return; | 1142 return; |
| 1139 } | 1143 } |
| 1140 | 1144 |
| 1141 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1145 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1142 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1146 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1143 #endif | 1147 #endif |
| 1144 // id + paint index + bitmap index + bool for 'src' + flags | 1148 // id + paint index + bitmap index + bool for 'src' + flags |
| 1145 uint32_t size = 5 * kUInt32Size; | 1149 uint32_t size = 5 * kUInt32Size; |
| 1146 if (NULL != src) { | 1150 if (NULL != src) { |
| 1147 size += sizeof(*src); // + rect | 1151 size += sizeof(*src); // + rect |
| 1148 } | 1152 } |
| 1149 size += sizeof(dst); // + rect | 1153 size += sizeof(dst); // + rect |
| 1150 | 1154 |
| 1151 size_t initialOffset = this->addDraw(DRAW_BITMAP_RECT_TO_RECT, &size); | 1155 size_t initialOffset = this->addDraw(DRAW_BITMAP_RECT_TO_RECT, &size); |
| 1152 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_RECT_TO_RECT, size) | 1156 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_RECT_TO_RECT, size) |
| 1153 == fWriter.bytesWritten()); | 1157 == fWriter.bytesWritten()); |
| 1154 this->addPaintPtr(paint); | 1158 this->addPaintPtr(paint); |
| 1155 this->addBitmap(bitmap); | 1159 int bitmapID = this->addBitmap(bitmap); |
| 1156 this->addRectPtr(src); // may be null | 1160 this->addRectPtr(src); // may be null |
| 1157 this->addRect(dst); | 1161 this->addRect(dst); |
| 1158 this->addInt(flags); | 1162 this->addInt(flags); |
| 1159 this->validate(initialOffset, size); | 1163 this->validate(initialOffset, size); |
| 1164 this->trackBitmapUse(bitmapID, initialOffset); | |
| 1160 } | 1165 } |
| 1161 | 1166 |
| 1162 void SkPictureRecord::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m atrix, | 1167 void SkPictureRecord::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m atrix, |
| 1163 const SkPaint* paint) { | 1168 const SkPaint* paint) { |
| 1164 if (bitmap.drawsNothing()) { | 1169 if (bitmap.drawsNothing()) { |
| 1165 return; | 1170 return; |
| 1166 } | 1171 } |
| 1167 | 1172 |
| 1168 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1173 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1169 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1174 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1170 #endif | 1175 #endif |
| 1171 | 1176 |
| 1172 // id + paint index + bitmap index + matrix | 1177 // id + paint index + bitmap index + matrix |
| 1173 uint32_t size = 3 * kUInt32Size + matrix.writeToMemory(NULL); | 1178 uint32_t size = 3 * kUInt32Size + matrix.writeToMemory(NULL); |
| 1174 size_t initialOffset = this->addDraw(DRAW_BITMAP_MATRIX, &size); | 1179 size_t initialOffset = this->addDraw(DRAW_BITMAP_MATRIX, &size); |
| 1175 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_MATRIX, size) == fWriter.b ytesWritten()); | 1180 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_MATRIX, size) == fWriter.b ytesWritten()); |
| 1176 this->addPaintPtr(paint); | 1181 this->addPaintPtr(paint); |
| 1177 this->addBitmap(bitmap); | 1182 int bitmapID = this->addBitmap(bitmap); |
| 1178 this->addMatrix(matrix); | 1183 this->addMatrix(matrix); |
| 1179 this->validate(initialOffset, size); | 1184 this->validate(initialOffset, size); |
| 1185 this->trackBitmapUse(bitmapID, initialOffset); | |
| 1180 } | 1186 } |
| 1181 | 1187 |
| 1182 void SkPictureRecord::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& cent er, | 1188 void SkPictureRecord::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& cent er, |
| 1183 const SkRect& dst, const SkPaint* paint) { | 1189 const SkRect& dst, const SkPaint* paint) { |
| 1184 if (bitmap.drawsNothing()) { | 1190 if (bitmap.drawsNothing()) { |
| 1185 return; | 1191 return; |
| 1186 } | 1192 } |
| 1187 | 1193 |
| 1188 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1194 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1189 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1195 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1190 #endif | 1196 #endif |
| 1191 | 1197 |
| 1192 // op + paint index + bitmap id + center + dst rect | 1198 // op + paint index + bitmap id + center + dst rect |
| 1193 uint32_t size = 3 * kUInt32Size + sizeof(center) + sizeof(dst); | 1199 uint32_t size = 3 * kUInt32Size + sizeof(center) + sizeof(dst); |
| 1194 size_t initialOffset = this->addDraw(DRAW_BITMAP_NINE, &size); | 1200 size_t initialOffset = this->addDraw(DRAW_BITMAP_NINE, &size); |
| 1195 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_NINE, size) == fWriter.byt esWritten()); | 1201 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_NINE, size) == fWriter.byt esWritten()); |
| 1196 this->addPaintPtr(paint); | 1202 this->addPaintPtr(paint); |
| 1197 this->addBitmap(bitmap); | 1203 int bitmapID = this->addBitmap(bitmap); |
| 1198 this->addIRect(center); | 1204 this->addIRect(center); |
| 1199 this->addRect(dst); | 1205 this->addRect(dst); |
| 1200 this->validate(initialOffset, size); | 1206 this->validate(initialOffset, size); |
| 1207 this->trackBitmapUse(bitmapID, initialOffset); | |
| 1201 } | 1208 } |
| 1202 | 1209 |
| 1203 void SkPictureRecord::drawSprite(const SkBitmap& bitmap, int left, int top, | 1210 void SkPictureRecord::drawSprite(const SkBitmap& bitmap, int left, int top, |
| 1204 const SkPaint* paint = NULL) { | 1211 const SkPaint* paint = NULL) { |
| 1205 if (bitmap.drawsNothing()) { | 1212 if (bitmap.drawsNothing()) { |
| 1206 return; | 1213 return; |
| 1207 } | 1214 } |
| 1208 | 1215 |
| 1209 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1216 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1210 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1217 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1211 #endif | 1218 #endif |
| 1212 | 1219 |
| 1213 // op + paint index + bitmap index + left + top | 1220 // op + paint index + bitmap index + left + top |
| 1214 uint32_t size = 5 * kUInt32Size; | 1221 uint32_t size = 5 * kUInt32Size; |
| 1215 size_t initialOffset = this->addDraw(DRAW_SPRITE, &size); | 1222 size_t initialOffset = this->addDraw(DRAW_SPRITE, &size); |
| 1216 SkASSERT(initialOffset+getPaintOffset(DRAW_SPRITE, size) == fWriter.bytesWri tten()); | 1223 SkASSERT(initialOffset+getPaintOffset(DRAW_SPRITE, size) == fWriter.bytesWri tten()); |
| 1217 this->addPaintPtr(paint); | 1224 this->addPaintPtr(paint); |
| 1218 this->addBitmap(bitmap); | 1225 int bitmapID = this->addBitmap(bitmap); |
| 1219 this->addInt(left); | 1226 this->addInt(left); |
| 1220 this->addInt(top); | 1227 this->addInt(top); |
| 1221 this->validate(initialOffset, size); | 1228 this->validate(initialOffset, size); |
| 1229 this->trackBitmapUse(bitmapID, initialOffset); | |
| 1222 } | 1230 } |
| 1223 | 1231 |
| 1224 void SkPictureRecord::ComputeFontMetricsTopBottom(const SkPaint& paint, SkScalar topbot[2]) { | 1232 void SkPictureRecord::ComputeFontMetricsTopBottom(const SkPaint& paint, SkScalar topbot[2]) { |
| 1225 SkPaint::FontMetrics metrics; | 1233 SkPaint::FontMetrics metrics; |
| 1226 paint.getFontMetrics(&metrics); | 1234 paint.getFontMetrics(&metrics); |
| 1227 SkRect bounds; | 1235 SkRect bounds; |
| 1228 // construct a rect so we can see any adjustments from the paint. | 1236 // construct a rect so we can see any adjustments from the paint. |
| 1229 // we use 0,1 for left,right, just so the rect isn't empty | 1237 // we use 0,1 for left,right, just so the rect isn't empty |
| 1230 bounds.set(0, metrics.fTop, SK_Scalar1, metrics.fBottom); | 1238 bounds.set(0, metrics.fTop, SK_Scalar1, metrics.fBottom); |
| 1231 (void)paint.computeFastBounds(bounds, &bounds); | 1239 (void)paint.computeFastBounds(bounds, &bounds); |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1605 | 1613 |
| 1606 this->validate(initialOffset, size); | 1614 this->validate(initialOffset, size); |
| 1607 } | 1615 } |
| 1608 | 1616 |
| 1609 /////////////////////////////////////////////////////////////////////////////// | 1617 /////////////////////////////////////////////////////////////////////////////// |
| 1610 | 1618 |
| 1611 SkSurface* SkPictureRecord::onNewSurface(const SkImageInfo& info) { | 1619 SkSurface* SkPictureRecord::onNewSurface(const SkImageInfo& info) { |
| 1612 return SkSurface::NewPicture(info.fWidth, info.fHeight); | 1620 return SkSurface::NewPicture(info.fWidth, info.fHeight); |
| 1613 } | 1621 } |
| 1614 | 1622 |
| 1615 void SkPictureRecord::addBitmap(const SkBitmap& bitmap) { | 1623 void SkPictureRecord::trackBitmapUse(int bitmapID, size_t offset) { |
| 1624 #ifndef SK_ALLOW_BITMAP_TRACKING | |
| 1625 return; | |
| 1626 #endif | |
| 1627 | |
| 1628 if (!(fRecordFlags & SkPicture::kOptimizeForClippedPlayback_RecordingFlag)) { | |
| 1629 return; | |
| 1630 } | |
| 1631 | |
| 1632 if (SkBitmapHeap::INVALID_SLOT == bitmapID) { | |
|
mtklein
2014/03/06 16:20:38
Is this something we can also SkASSERT doesn't hap
robertphillips
2014/03/06 20:18:26
addBitmap can return this value so we need this ch
| |
| 1633 return; | |
| 1634 } | |
| 1635 | |
| 1636 if (NULL == fBitmapUseOffsets) { | |
| 1637 fBitmapUseOffsets = SkNEW(SkOffsetTable); | |
| 1638 } | |
| 1639 | |
| 1640 fBitmapUseOffsets->add(bitmapID, offset); | |
| 1641 } | |
| 1642 | |
| 1643 int SkPictureRecord::addBitmap(const SkBitmap& bitmap) { | |
| 1616 const int index = fBitmapHeap->insert(bitmap); | 1644 const int index = fBitmapHeap->insert(bitmap); |
| 1617 // In debug builds, a bad return value from insert() will crash, allowing fo r debugging. In | 1645 // In debug builds, a bad return value from insert() will crash, allowing fo r debugging. In |
| 1618 // release builds, the invalid value will be recorded so that the reader wil l know that there | 1646 // release builds, the invalid value will be recorded so that the reader wil l know that there |
| 1619 // was a problem. | 1647 // was a problem. |
| 1620 SkASSERT(index != SkBitmapHeap::INVALID_SLOT); | 1648 SkASSERT(index != SkBitmapHeap::INVALID_SLOT); |
| 1621 this->addInt(index); | 1649 this->addInt(index); |
| 1650 return index; | |
| 1622 } | 1651 } |
| 1623 | 1652 |
| 1624 void SkPictureRecord::addMatrix(const SkMatrix& matrix) { | 1653 void SkPictureRecord::addMatrix(const SkMatrix& matrix) { |
| 1625 fWriter.writeMatrix(matrix); | 1654 fWriter.writeMatrix(matrix); |
| 1626 } | 1655 } |
| 1627 | 1656 |
| 1628 const SkFlatData* SkPictureRecord::getFlatPaintData(const SkPaint& paint) { | 1657 const SkFlatData* SkPictureRecord::getFlatPaintData(const SkPaint& paint) { |
| 1629 return fPaints.findAndReturnFlat(paint); | 1658 return fPaints.findAndReturnFlat(paint); |
| 1630 } | 1659 } |
| 1631 | 1660 |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1854 void SkPictureRecord::validateRegions() const { | 1883 void SkPictureRecord::validateRegions() const { |
| 1855 int count = fRegions.count(); | 1884 int count = fRegions.count(); |
| 1856 SkASSERT((unsigned) count < 0x1000); | 1885 SkASSERT((unsigned) count < 0x1000); |
| 1857 for (int index = 0; index < count; index++) { | 1886 for (int index = 0; index < count; index++) { |
| 1858 const SkFlatData* region = fRegions[index]; | 1887 const SkFlatData* region = fRegions[index]; |
| 1859 SkASSERT(region); | 1888 SkASSERT(region); |
| 1860 // region->validate(); | 1889 // region->validate(); |
| 1861 } | 1890 } |
| 1862 } | 1891 } |
| 1863 #endif | 1892 #endif |
| OLD | NEW |