SkMallocPixelRef.cpp revision 82065d667f64e232bcde2ad849756a6096fcbe6f
149099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com#include "SkMallocPixelRef.h"
249099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com#include "SkBitmap.h"
349099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com#include "SkFlattenable.h"
449099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com
549099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.comSkMallocPixelRef::SkMallocPixelRef(void* storage, size_t size,
649099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com                                   SkColorTable* ctable) {
749099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    if (NULL == storage) {
849099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com        storage = sk_malloc_throw(size);
949099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    }
1049099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    fStorage = storage;
1149099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    fSize = size;
1249099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    fCTable = ctable;
1382065d667f64e232bcde2ad849756a6096fcbe6freed@google.com    SkSafeRef(ctable);
1449099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com}
1549099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com
1649099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.comSkMallocPixelRef::~SkMallocPixelRef() {
1749099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    SkSafeUnref(fCTable);
1849099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    sk_free(fStorage);
1949099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com}
2049099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com
2149099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.comvoid* SkMallocPixelRef::onLockPixels(SkColorTable** ct) {
2249099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    *ct = fCTable;
2349099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    return fStorage;
2449099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com}
2549099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com
2649099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.comvoid SkMallocPixelRef::onUnlockPixels() {
2749099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    // nothing to do
2849099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com}
2949099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com
3049099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.comvoid SkMallocPixelRef::flatten(SkFlattenableWriteBuffer& buffer) const {
3149099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    this->INHERITED::flatten(buffer);
3249099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com
3349099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    buffer.write32(fSize);
3449099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    buffer.writePad(fStorage, fSize);
3549099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    if (fCTable) {
3649099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com        buffer.writeBool(true);
3749099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com        fCTable->flatten(buffer);
3849099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    } else {
3949099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com        buffer.writeBool(false);
4049099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    }
4149099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com}
4249099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com
4382065d667f64e232bcde2ad849756a6096fcbe6freed@google.comSkMallocPixelRef::SkMallocPixelRef(SkFlattenableReadBuffer& buffer)
4482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com        : INHERITED(buffer, NULL) {
4549099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    fSize = buffer.readU32();
4649099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    fStorage = sk_malloc_throw(fSize);
4749099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    buffer.read(fStorage, fSize);
4849099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    if (buffer.readBool()) {
4949099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com        fCTable = SkNEW_ARGS(SkColorTable, (buffer));
5049099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    } else {
5149099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com        fCTable = NULL;
5249099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com    }
5349099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com}
5449099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com
5549099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.comstatic SkPixelRef::Registrar reg("SkMallocPixelRef",
5649099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com                                 SkMallocPixelRef::Create);
5749099b25367d1b9ef45ccaa7fe370facea6b89bfreed@android.com
58