1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/lazy/SkDiscardablePixelRef.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,99 @@ 1.4 +/* 1.5 + * Copyright 2013 Google Inc. 1.6 + * 1.7 + * Use of this source code is governed by a BSD-style license that can be 1.8 + * found in the LICENSE file. 1.9 + */ 1.10 + 1.11 +#include "SkDiscardablePixelRef.h" 1.12 +#include "SkDiscardableMemory.h" 1.13 +#include "SkImageGenerator.h" 1.14 + 1.15 +SkDiscardablePixelRef::SkDiscardablePixelRef(const SkImageInfo& info, 1.16 + SkImageGenerator* generator, 1.17 + size_t rowBytes, 1.18 + SkDiscardableMemory::Factory* fact) 1.19 + : INHERITED(info) 1.20 + , fGenerator(generator) 1.21 + , fDMFactory(fact) 1.22 + , fRowBytes(rowBytes) 1.23 + , fDiscardableMemory(NULL) 1.24 +{ 1.25 + SkASSERT(fGenerator != NULL); 1.26 + SkASSERT(fRowBytes > 0); 1.27 + // The SkImageGenerator contract requires fGenerator to always 1.28 + // decode the same image on each call to getPixels(). 1.29 + this->setImmutable(); 1.30 + SkSafeRef(fDMFactory); 1.31 +} 1.32 + 1.33 +SkDiscardablePixelRef::~SkDiscardablePixelRef() { 1.34 + if (this->isLocked()) { 1.35 + fDiscardableMemory->unlock(); 1.36 + } 1.37 + SkDELETE(fDiscardableMemory); 1.38 + SkSafeUnref(fDMFactory); 1.39 + SkDELETE(fGenerator); 1.40 +} 1.41 + 1.42 +bool SkDiscardablePixelRef::onNewLockPixels(LockRec* rec) { 1.43 + if (fDiscardableMemory != NULL) { 1.44 + if (fDiscardableMemory->lock()) { 1.45 + rec->fPixels = fDiscardableMemory->data(); 1.46 + rec->fColorTable = NULL; 1.47 + rec->fRowBytes = fRowBytes; 1.48 + return true; 1.49 + } 1.50 + SkDELETE(fDiscardableMemory); 1.51 + fDiscardableMemory = NULL; 1.52 + } 1.53 + 1.54 + const size_t size = this->info().getSafeSize(fRowBytes); 1.55 + 1.56 + if (fDMFactory != NULL) { 1.57 + fDiscardableMemory = fDMFactory->create(size); 1.58 + } else { 1.59 + fDiscardableMemory = SkDiscardableMemory::Create(size); 1.60 + } 1.61 + if (NULL == fDiscardableMemory) { 1.62 + return false; // Memory allocation failed. 1.63 + } 1.64 + 1.65 + void* pixels = fDiscardableMemory->data(); 1.66 + if (!fGenerator->getPixels(this->info(), pixels, fRowBytes)) { 1.67 + fDiscardableMemory->unlock(); 1.68 + SkDELETE(fDiscardableMemory); 1.69 + fDiscardableMemory = NULL; 1.70 + return false; 1.71 + } 1.72 + 1.73 + rec->fPixels = pixels; 1.74 + rec->fColorTable = NULL; 1.75 + rec->fRowBytes = fRowBytes; 1.76 + return true; 1.77 +} 1.78 + 1.79 +void SkDiscardablePixelRef::onUnlockPixels() { 1.80 + fDiscardableMemory->unlock(); 1.81 +} 1.82 + 1.83 +bool SkInstallDiscardablePixelRef(SkImageGenerator* generator, 1.84 + SkBitmap* dst, 1.85 + SkDiscardableMemory::Factory* factory) { 1.86 + SkImageInfo info; 1.87 + SkAutoTDelete<SkImageGenerator> autoGenerator(generator); 1.88 + if ((NULL == autoGenerator.get()) 1.89 + || (!autoGenerator->getInfo(&info)) 1.90 + || (!dst->setConfig(info, 0))) { 1.91 + return false; 1.92 + } 1.93 + SkASSERT(dst->colorType() != kUnknown_SkColorType); 1.94 + if (dst->empty()) { // Use a normal pixelref. 1.95 + return dst->allocPixels(); 1.96 + } 1.97 + SkAutoTUnref<SkDiscardablePixelRef> ref( 1.98 + SkNEW_ARGS(SkDiscardablePixelRef, 1.99 + (info, autoGenerator.detach(), dst->rowBytes(), factory))); 1.100 + dst->setPixelRef(ref); 1.101 + return true; 1.102 +}