Chromium Code Reviews| 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 "SkBitmapDevice.h" | 10 #include "SkBitmapDevice.h" |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 221 // Break them all by destroying the final link to this SkGPipeCanvas . | 221 // Break them all by destroying the final link to this SkGPipeCanvas . |
| 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 return (NULL == fBitmapHeap) ? 0 : fBitmapHeap->bytesAllocated(); | 231 size_t bytesAllocated = 0; |
| 232 if (NULL != fBitmapHeap) { | |
| 233 bytesAllocated += fBitmapHeap->bytesAllocated(); | |
| 234 } | |
| 235 if (NULL != fImageHeap) { | |
| 236 bytesAllocated += fImageHeap->bytesInCache(); | |
| 237 } | |
| 238 return bytesAllocated; | |
| 232 } | 239 } |
| 233 | 240 |
| 234 void beginCommentGroup(const char* description) override; | 241 void beginCommentGroup(const char* description) override; |
| 235 void addComment(const char* kywd, const char* value) override; | 242 void addComment(const char* kywd, const char* value) override; |
| 236 void endCommentGroup() override; | 243 void endCommentGroup() override; |
| 237 | 244 |
| 238 /** | 245 /** |
| 239 * Flatten an SkBitmap to send to the reader, where it will be referenced | 246 * Flatten an SkBitmap to send to the reader, where it will be referenced |
| 240 * according to slot. | 247 * according to slot. |
| 241 */ | 248 */ |
| 242 bool shuttleBitmap(const SkBitmap&, int32_t slot); | 249 bool shuttleBitmap(const SkBitmap&, int32_t slot); |
| 243 | 250 |
| 251 void resetImageHeap(); | |
| 252 | |
| 244 protected: | 253 protected: |
| 245 void willSave() override; | 254 void willSave() override; |
| 246 SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) ov erride; | 255 SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) ov erride; |
| 247 void willRestore() override; | 256 void willRestore() override; |
| 248 | 257 |
| 249 void didConcat(const SkMatrix&) override; | 258 void didConcat(const SkMatrix&) override; |
| 250 void didSetMatrix(const SkMatrix&) override; | 259 void didSetMatrix(const SkMatrix&) override; |
| 251 | 260 |
| 252 void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override; | 261 void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override; |
| 253 void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, | 262 void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, |
| (...skipping 896 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1150 } | 1159 } |
| 1151 | 1160 |
| 1152 void SkGPipeCanvas::flushRecording(bool detachCurrentBlock) { | 1161 void SkGPipeCanvas::flushRecording(bool detachCurrentBlock) { |
| 1153 this->doNotify(); | 1162 this->doNotify(); |
| 1154 if (detachCurrentBlock) { | 1163 if (detachCurrentBlock) { |
| 1155 // force a new block to be requested for the next recorded command | 1164 // force a new block to be requested for the next recorded command |
| 1156 fBlockSize = 0; | 1165 fBlockSize = 0; |
| 1157 } | 1166 } |
| 1158 } | 1167 } |
| 1159 | 1168 |
| 1169 void SkGPipeCanvas::resetImageHeap() { | |
| 1170 if (fImageHeap) { | |
| 1171 fImageHeap->reset(); | |
| 1172 } | |
| 1173 } | |
| 1174 | |
| 1160 size_t SkGPipeCanvas::freeMemoryIfPossible(size_t bytesToFree) { | 1175 size_t SkGPipeCanvas::freeMemoryIfPossible(size_t bytesToFree) { |
| 1161 return (NULL == fBitmapHeap) ? 0 : fBitmapHeap->freeMemoryIfPossible(bytesTo Free); | 1176 return (NULL == fBitmapHeap) ? 0 : fBitmapHeap->freeMemoryIfPossible(bytesTo Free); |
| 1162 } | 1177 } |
| 1163 | 1178 |
| 1164 /////////////////////////////////////////////////////////////////////////////// | 1179 /////////////////////////////////////////////////////////////////////////////// |
| 1165 | 1180 |
| 1166 template <typename T> uint32_t castToU32(T value) { | 1181 template <typename T> uint32_t castToU32(T value) { |
| 1167 union { | 1182 union { |
| 1168 T fSrc; | 1183 T fSrc; |
| 1169 uint32_t fDst; | 1184 uint32_t fDst; |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1313 #include "SkGPipe.h" | 1328 #include "SkGPipe.h" |
| 1314 | 1329 |
| 1315 SkGPipeController::~SkGPipeController() { | 1330 SkGPipeController::~SkGPipeController() { |
| 1316 SkSafeUnref(fCanvas); | 1331 SkSafeUnref(fCanvas); |
| 1317 } | 1332 } |
| 1318 | 1333 |
| 1319 void SkGPipeController::setCanvas(SkGPipeCanvas* canvas) { | 1334 void SkGPipeController::setCanvas(SkGPipeCanvas* canvas) { |
| 1320 SkRefCnt_SafeAssign(fCanvas, canvas); | 1335 SkRefCnt_SafeAssign(fCanvas, canvas); |
| 1321 } | 1336 } |
| 1322 | 1337 |
| 1338 void SkGPipeController::purgeCaches() | |
| 1339 { | |
| 1340 fCanvas->resetImageHeap(); | |
| 1341 // Other caches are self-purging with a small MRU pool | |
| 1342 // We could purge them as well, but it is not clear whether | |
| 1343 // that would be a win. | |
| 1344 } | |
| 1345 | |
| 1323 /////////////////////////////////////////////////////////////////////////////// | 1346 /////////////////////////////////////////////////////////////////////////////// |
| 1324 | 1347 |
| 1325 SkGPipeWriter::SkGPipeWriter() | 1348 SkGPipeWriter::SkGPipeWriter() |
| 1326 : fWriter(0) { | 1349 : fWriter(0) { |
| 1327 fCanvas = NULL; | 1350 fCanvas = NULL; |
| 1328 } | 1351 } |
| 1329 | 1352 |
| 1330 SkGPipeWriter::~SkGPipeWriter() { | 1353 SkGPipeWriter::~SkGPipeWriter() { |
| 1331 this->endRecording(); | 1354 this->endRecording(); |
| 1332 } | 1355 } |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1386 void BitmapShuttle::removeCanvas() { | 1409 void BitmapShuttle::removeCanvas() { |
| 1387 if (NULL == fCanvas) { | 1410 if (NULL == fCanvas) { |
| 1388 return; | 1411 return; |
| 1389 } | 1412 } |
| 1390 fCanvas->unref(); | 1413 fCanvas->unref(); |
| 1391 fCanvas = NULL; | 1414 fCanvas = NULL; |
| 1392 } | 1415 } |
| 1393 | 1416 |
| 1394 //////////////////////////////////////////////////////////////////////////////// /////////////////// | 1417 //////////////////////////////////////////////////////////////////////////////// /////////////////// |
| 1395 | 1418 |
| 1396 SkImageHeap::SkImageHeap() {} | 1419 SkImageHeap::SkImageHeap() : fBytesInCache (0) {} |
| 1397 | 1420 |
| 1398 SkImageHeap::~SkImageHeap() { | 1421 SkImageHeap::~SkImageHeap() { |
| 1399 fArray.unrefAll(); | 1422 fArray.unrefAll(); |
| 1400 } | 1423 } |
| 1401 | 1424 |
| 1425 void SkImageHeap::reset() { | |
| 1426 fArray.unrefAll(); | |
| 1427 fArray.rewind(); | |
| 1428 fBytesInCache = 0; | |
| 1429 } | |
| 1430 | |
| 1402 const SkImage* SkImageHeap::get(int32_t slot) const { | 1431 const SkImage* SkImageHeap::get(int32_t slot) const { |
| 1403 SkASSERT(slot > 0); | 1432 SkASSERT(slot > 0); |
| 1404 return fArray[slot - 1]; | 1433 return fArray[slot - 1]; |
| 1405 } | 1434 } |
| 1406 | 1435 |
| 1407 int32_t SkImageHeap::find(const SkImage* img) const { | 1436 int32_t SkImageHeap::find(const SkImage* img) const { |
| 1408 int index = fArray.find(img); | 1437 int index = fArray.find(img); |
| 1409 if (index >= 0) { | 1438 if (index >= 0) { |
| 1410 return index + 1; // found | 1439 return index + 1; // found |
| 1411 } | 1440 } |
| 1412 return 0; // not found | 1441 return 0; // not found |
| 1413 } | 1442 } |
| 1414 | 1443 |
| 1415 int32_t SkImageHeap::insert(const SkImage* img) { | 1444 int32_t SkImageHeap::insert(const SkImage* img) { |
| 1416 int32_t slot = this->find(img); | 1445 int32_t slot = this->find(img); |
| 1417 if (slot) { | 1446 if (slot) { |
| 1418 return slot; | 1447 return slot; |
| 1419 } | 1448 } |
| 1449 // TODO: SkImage does not expose bytes per pixel, 4 is just a best guess. | |
| 1450 fBytesInCache += img->width() * img->height() * 4; | |
| 1420 *fArray.append() = SkRef(img); | 1451 *fArray.append() = SkRef(img); |
| 1452 printf("Images reff'ed: %d \n", fArray.count()); | |
|
reed1
2015/06/04 13:20:39
EEEEK!
| |
| 1421 return fArray.count(); // slot is always index+1 | 1453 return fArray.count(); // slot is always index+1 |
| 1422 } | 1454 } |
| 1423 | 1455 |
| OLD | NEW |