blob: 71e672b841f8887fc12c1a54064493892123069c [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
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 */
reed@android.com49099b22010-09-09 16:07:53 +00008#include "SkMallocPixelRef.h"
9#include "SkBitmap.h"
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000010#include "SkFlattenableBuffers.h"
reed@android.com49099b22010-09-09 16:07:53 +000011
12SkMallocPixelRef::SkMallocPixelRef(void* storage, size_t size,
djsollen@google.comc84b8332012-07-27 13:41:44 +000013 SkColorTable* ctable, bool ownPixels) {
reed@android.com49099b22010-09-09 16:07:53 +000014 if (NULL == storage) {
djsollen@google.comc84b8332012-07-27 13:41:44 +000015 SkASSERT(ownPixels);
reed@android.com49099b22010-09-09 16:07:53 +000016 storage = sk_malloc_throw(size);
17 }
18 fStorage = storage;
19 fSize = size;
20 fCTable = ctable;
reed@google.com82065d62011-02-07 15:30:46 +000021 SkSafeRef(ctable);
djsollen@google.comc84b8332012-07-27 13:41:44 +000022 fOwnPixels = ownPixels;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000023
reed@google.comff0da4f2012-05-17 13:14:52 +000024 this->setPreLocked(fStorage, fCTable);
reed@android.com49099b22010-09-09 16:07:53 +000025}
26
27SkMallocPixelRef::~SkMallocPixelRef() {
28 SkSafeUnref(fCTable);
djsollen@google.comc84b8332012-07-27 13:41:44 +000029 if (fOwnPixels) {
30 sk_free(fStorage);
31 }
reed@android.com49099b22010-09-09 16:07:53 +000032}
33
34void* SkMallocPixelRef::onLockPixels(SkColorTable** ct) {
35 *ct = fCTable;
36 return fStorage;
37}
38
39void SkMallocPixelRef::onUnlockPixels() {
40 // nothing to do
41}
42
djsollen@google.com54924242012-03-29 15:18:04 +000043void SkMallocPixelRef::flatten(SkFlattenableWriteBuffer& buffer) const {
reed@android.com49099b22010-09-09 16:07:53 +000044 this->INHERITED::flatten(buffer);
45
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000046 buffer.writeByteArray(fStorage, fSize);
47 buffer.writeBool(fCTable != NULL);
reed@android.com49099b22010-09-09 16:07:53 +000048 if (fCTable) {
djsollen@google.com64a0ec32012-06-12 15:17:27 +000049 buffer.writeFlattenable(fCTable);
reed@android.com49099b22010-09-09 16:07:53 +000050 }
51}
52
reed@google.com82065d62011-02-07 15:30:46 +000053SkMallocPixelRef::SkMallocPixelRef(SkFlattenableReadBuffer& buffer)
54 : INHERITED(buffer, NULL) {
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000055 fSize = buffer.getArrayCount();
reed@android.com49099b22010-09-09 16:07:53 +000056 fStorage = sk_malloc_throw(fSize);
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000057 buffer.readByteArray(fStorage);
reed@android.com49099b22010-09-09 16:07:53 +000058 if (buffer.readBool()) {
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000059 fCTable = buffer.readFlattenableT<SkColorTable>();
reed@android.com49099b22010-09-09 16:07:53 +000060 } else {
61 fCTable = NULL;
62 }
djsollen@google.comc84b8332012-07-27 13:41:44 +000063 fOwnPixels = true;
reed@google.comff0da4f2012-05-17 13:14:52 +000064
65 this->setPreLocked(fStorage, fCTable);
reed@android.com49099b22010-09-09 16:07:53 +000066}
67
djsollen@google.com5370cd92012-03-28 20:47:01 +000068SK_DEFINE_FLATTENABLE_REGISTRAR(SkMallocPixelRef)