SkMallocPixelRef.cpp revision 0daa1adb03b4b1fc11d854cb7754416ac05a31e8
1
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8#include "SkMallocPixelRef.h"
9#include "SkBitmap.h"
10#include "SkFlattenableBuffers.h"
11
12SkMallocPixelRef::SkMallocPixelRef(void* storage, size_t size,
13                                   SkColorTable* ctable, bool ownPixels) {
14    if (NULL == storage) {
15        SkASSERT(ownPixels);
16        storage = sk_malloc_throw(size);
17    }
18    fStorage = storage;
19    fSize = size;
20    fCTable = ctable;
21    SkSafeRef(ctable);
22    fOwnPixels = ownPixels;
23
24    this->setPreLocked(fStorage, fCTable);
25}
26
27SkMallocPixelRef::~SkMallocPixelRef() {
28    SkSafeUnref(fCTable);
29    if (fOwnPixels) {
30        sk_free(fStorage);
31    }
32}
33
34void* SkMallocPixelRef::onLockPixels(SkColorTable** ct) {
35    *ct = fCTable;
36    return fStorage;
37}
38
39void SkMallocPixelRef::onUnlockPixels() {
40    // nothing to do
41}
42
43void SkMallocPixelRef::flatten(SkFlattenableWriteBuffer& buffer) const {
44    this->INHERITED::flatten(buffer);
45
46    buffer.writeByteArray(fStorage, fSize);
47    buffer.writeBool(fCTable != NULL);
48    if (fCTable) {
49        fCTable->writeToBuffer(buffer);
50    }
51}
52
53SkMallocPixelRef::SkMallocPixelRef(SkFlattenableReadBuffer& buffer)
54        : INHERITED(buffer, NULL) {
55    fSize = buffer.getArrayCount();
56    fStorage = sk_malloc_throw(fSize);
57    buffer.readByteArray(fStorage, fSize);
58    if (buffer.readBool()) {
59        fCTable = SkNEW_ARGS(SkColorTable, (buffer));
60    } else {
61        fCTable = NULL;
62    }
63    fOwnPixels = true;
64
65    this->setPreLocked(fStorage, fCTable);
66}
67