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