| Index: src/lazy/SkDiscardablePixelRef.cpp
|
| diff --git a/src/lazy/SkDiscardablePixelRef.cpp b/src/lazy/SkDiscardablePixelRef.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..327ac544de5ca282c6b50481df5a5d69f52c280a
|
| --- /dev/null
|
| +++ b/src/lazy/SkDiscardablePixelRef.cpp
|
| @@ -0,0 +1,64 @@
|
| +/*
|
| + * Copyright 2013 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "SkDiscardablePixelRef.h"
|
| +#include "SkDiscardableMemory.h"
|
| +
|
| +SkDiscardablePixelRef::SkDiscardablePixelRef(SkImageGenerator* generator,
|
| + const SkImageInfo& info,
|
| + size_t size,
|
| + size_t rowBytes)
|
| + : fGenerator(generator)
|
| + , fDiscardableMemory(NULL)
|
| + , fInfo(info)
|
| + , fSize(size)
|
| + , fRowBytes(rowBytes) {
|
| + SkASSERT(fGenerator != NULL);
|
| + SkASSERT(fSize > 0);
|
| + SkASSERT(fRowBytes > 0);
|
| +}
|
| +
|
| +SkDiscardablePixelRef::~SkDiscardablePixelRef() {
|
| + SkDELETE(fGenerator);
|
| +}
|
| +
|
| +void* SkDiscardablePixelRef::onLockPixels(SkColorTable**) {
|
| + if (fDiscardableMemory != NULL) {
|
| + if (fDiscardableMemory->lock()) {
|
| + return fDiscardableMemory->data();
|
| + }
|
| + fDiscardableMemory = NULL;
|
| + }
|
| + fDiscardableMemory = SkDiscardableMemory::Create(fSize);
|
| + if (NULL == fDiscardableMemory) {
|
| + return NULL; // Memory allocation failed.
|
| + }
|
| + void* pixels = fDiscardableMemory->data();
|
| + if (!fGenerator->getPixels(fInfo, pixels, fRowBytes)) {
|
| + return NULL; // TODO(halcanary) Find out correct thing to do.
|
| + }
|
| + return pixels;
|
| +}
|
| +void SkDiscardablePixelRef::onUnlockPixels() {
|
| + fDiscardableMemory->unlock();
|
| +}
|
| +
|
| +bool SkDiscardablePixelRef::Install(SkImageGenerator* generator, SkBitmap* dst) {
|
| + SkImageInfo info;
|
| + if (!generator->getInfo(&info)) {
|
| + return false;
|
| + }
|
| + if (!dst->setConfig(info, 0)) {
|
| + return false;
|
| + }
|
| + SkAutoTUnref<SkDiscardablePixelRef> ref(SkNEW_ARGS(SkDiscardablePixelRef,
|
| + (generator, info,
|
| + dst->getSize(),
|
| + dst->rowBytes())));
|
| + dst->setPixelRef(ref);
|
| + return true;
|
| +}
|
|
|