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 #include "SkMallocPixelRef.h" | 8 #include "SkMallocPixelRef.h" |
| 9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkFlattenableBuffers.h" | 10 #include "SkFlattenableBuffers.h" |
| 11 #include "SkImageGenerator.h" | |
| 11 | 12 |
| 12 SkMallocPixelRef::SkMallocPixelRef(void* storage, size_t size, | 13 SkMallocPixelRef::SkMallocPixelRef(void* storage, size_t size, |
| 13 SkColorTable* ctable, bool ownPixels) { | 14 SkColorTable* ctable, bool ownPixels) { |
| 14 if (NULL == storage) { | 15 if (NULL == storage) { |
| 15 SkASSERT(ownPixels); | 16 SkASSERT(ownPixels); |
| 16 storage = sk_malloc_throw(size); | 17 storage = sk_malloc_throw(size); |
| 17 } | 18 } |
| 18 fStorage = storage; | 19 fStorage = storage; |
| 19 fSize = size; | 20 fSize = size; |
| 20 fCTable = ctable; | 21 fCTable = ctable; |
| 21 SkSafeRef(ctable); | 22 SkSafeRef(ctable); |
| 22 fOwnPixels = ownPixels; | 23 fOwnPixels = ownPixels; |
| 23 | 24 |
| 24 this->setPreLocked(fStorage, fCTable); | 25 this->setPreLocked(fStorage, fCTable); |
| 25 } | 26 } |
| 26 | 27 |
| 27 SkMallocPixelRef::~SkMallocPixelRef() { | 28 SkMallocPixelRef::~SkMallocPixelRef() { |
| 28 SkSafeUnref(fCTable); | 29 SkSafeUnref(fCTable); |
| 29 if (fOwnPixels) { | 30 if (fOwnPixels) { |
| 30 sk_free(fStorage); | 31 sk_free(fStorage); |
| 31 } | 32 } |
| 32 } | 33 } |
| 33 | 34 |
| 35 bool SkMallocPixelRef::Install(SkImageGenerator* generator, | |
| 36 SkBitmap* destination) { | |
| 37 SkASSERT(generator != NULL); | |
| 38 SkAutoTDelete<SkImageGenerator> autodel(generator); | |
| 39 // Always gets deleted by this function. | |
| 40 SkImageInfo info; | |
| 41 SkBitmap tmp; | |
| 42 if ((NULL == generator) | |
| 43 || (!generator->getInfo(&info)) | |
| 44 || (!tmp.setConfig(info, 0))) { | |
| 45 return false; | |
| 46 } | |
| 47 size_t rowBytes = tmp.rowBytes(); | |
| 48 size_t size = tmp.getSize(); | |
| 49 void* pixels = sk_malloc_throw(size); | |
|
reed1
2013/11/25 18:06:56
Can we change this to sk_malloc_flags() so we can
| |
| 50 if (!generator->getPixels(info, pixels, rowBytes)) { | |
| 51 sk_free(pixels); | |
| 52 return false; | |
| 53 } | |
| 54 SkAutoTUnref<SkMallocPixelRef> ref(SkNEW_ARGS(SkMallocPixelRef, | |
| 55 (pixels, size, NULL, true))); | |
| 56 *destination = tmp; // copy config, size, rowbytes. | |
| 57 destination->setPixelRef(ref); | |
| 58 destination->lockPixels(); // Since we're already allocated, we lock | |
| 59 // right away, just like HeapAllocator. | |
| 60 return true; | |
| 61 } | |
| 62 | |
| 34 void* SkMallocPixelRef::onLockPixels(SkColorTable** ct) { | 63 void* SkMallocPixelRef::onLockPixels(SkColorTable** ct) { |
| 35 *ct = fCTable; | 64 *ct = fCTable; |
| 36 return fStorage; | 65 return fStorage; |
| 37 } | 66 } |
| 38 | 67 |
| 39 void SkMallocPixelRef::onUnlockPixels() { | 68 void SkMallocPixelRef::onUnlockPixels() { |
| 40 // nothing to do | 69 // nothing to do |
| 41 } | 70 } |
| 42 | 71 |
| 43 void SkMallocPixelRef::flatten(SkFlattenableWriteBuffer& buffer) const { | 72 void SkMallocPixelRef::flatten(SkFlattenableWriteBuffer& buffer) const { |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 57 buffer.readByteArray(fStorage, fSize); | 86 buffer.readByteArray(fStorage, fSize); |
| 58 if (buffer.readBool()) { | 87 if (buffer.readBool()) { |
| 59 fCTable = SkNEW_ARGS(SkColorTable, (buffer)); | 88 fCTable = SkNEW_ARGS(SkColorTable, (buffer)); |
| 60 } else { | 89 } else { |
| 61 fCTable = NULL; | 90 fCTable = NULL; |
| 62 } | 91 } |
| 63 fOwnPixels = true; | 92 fOwnPixels = true; |
| 64 | 93 |
| 65 this->setPreLocked(fStorage, fCTable); | 94 this->setPreLocked(fStorage, fCTable); |
| 66 } | 95 } |
| OLD | NEW |