11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#include "SkMallocPixelRef.h" 940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#include "SkBitmap.h" 1040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#include "SkFlattenable.h" 1140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 1240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek SollenbergerSkMallocPixelRef::SkMallocPixelRef(void* storage, size_t size, 1340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger SkColorTable* ctable) { 1440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger if (NULL == storage) { 1540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger storage = sk_malloc_throw(size); 1640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger } 1740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fStorage = storage; 1840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fSize = size; 1940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fCTable = ctable; 2040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger SkSafeRef(ctable); 21f1a1e8d5528d123890c9e86f672084b86c69dcfeDerek Sollenberger 22f1a1e8d5528d123890c9e86f672084b86c69dcfeDerek Sollenberger this->setPreLocked(fStorage, fCTable); 2340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 2440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 2540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek SollenbergerSkMallocPixelRef::~SkMallocPixelRef() { 2640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger SkSafeUnref(fCTable); 2740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger sk_free(fStorage); 2840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 2940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 3040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergervoid* SkMallocPixelRef::onLockPixels(SkColorTable** ct) { 3140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger *ct = fCTable; 3240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger return fStorage; 3340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 3440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 3540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergervoid SkMallocPixelRef::onUnlockPixels() { 3640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // nothing to do 3740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 3840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 3940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergervoid SkMallocPixelRef::flatten(SkFlattenableWriteBuffer& buffer) const { 4040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger this->INHERITED::flatten(buffer); 4140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 4240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger buffer.write32(fSize); 4340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger buffer.writePad(fStorage, fSize); 4440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger if (fCTable) { 4540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger buffer.writeBool(true); 4640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fCTable->flatten(buffer); 4740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger } else { 4840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger buffer.writeBool(false); 4940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger } 5040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 5140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 5240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek SollenbergerSkMallocPixelRef::SkMallocPixelRef(SkFlattenableReadBuffer& buffer) 5340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger : INHERITED(buffer, NULL) { 5440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fSize = buffer.readU32(); 5540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fStorage = sk_malloc_throw(fSize); 5640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger buffer.read(fStorage, fSize); 5740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger if (buffer.readBool()) { 5840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fCTable = SkNEW_ARGS(SkColorTable, (buffer)); 5940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger } else { 6040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fCTable = NULL; 6140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger } 62f1a1e8d5528d123890c9e86f672084b86c69dcfeDerek Sollenberger 63f1a1e8d5528d123890c9e86f672084b86c69dcfeDerek Sollenberger this->setPreLocked(fStorage, fCTable); 6440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 6540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 661cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSK_DEFINE_PIXEL_REF_REGISTRAR(SkMallocPixelRef) 67