16e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org/* 26e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org * Copyright 2013 Google Inc. 36e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org * 46e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 56e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org * found in the LICENSE file. 66e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org */ 76e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org 86e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org#ifndef SkCachingPixelRef_DEFINED 96e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org#define SkCachingPixelRef_DEFINED 106e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org 11680fb9e8f10d24b5fe35c90338de37c57392f1aareed#include "SkBitmapCache.h" 1236d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com#include "SkImageInfo.h" 1336d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com#include "SkImageGenerator.h" 146e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org#include "SkPixelRef.h" 156e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org 166e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.orgclass SkColorTable; 176e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org 186e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org/** 196e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org * PixelRef which defers decoding until SkBitmap::lockPixels() is 206e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org * called. Caches the decoded images in the global 216e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org * SkScaledImageCache. When the pixels are unlocked, this cache may 226e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org * or be destroyed before the next lock. If so, onLockPixels will 236e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org * attempt to re-decode. 246e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org * 2536d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com * Decoding is handled by the SkImageGenerator 266e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org */ 276e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.orgclass SkCachingPixelRef : public SkPixelRef { 286e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.orgpublic: 29227c24673196f5f06bee85e7e9aa067be90e1359commit-bot@chromium.org SK_DECLARE_INST_COUNT(SkCachingPixelRef) 3036d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com /** 3136d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com * Takes ownership of SkImageGenerator. If this method fails for 3236d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com * whatever reason, it will return false and immediatetely delete 3336d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com * the generator. If it succeeds, it will modify destination 3436d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com * bitmap. 3536d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com * 3636d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com * If Install fails or when the SkCachingPixelRef that is 3736d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com * installed into destination is destroyed, it will call 3836d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com * SkDELETE() on the generator. Therefore, generator should be 3936d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com * allocated with SkNEW() or SkNEW_ARGS(). 4036d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com */ 4136d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com static bool Install(SkImageGenerator* gen, SkBitmap* dst); 426e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org 436e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.orgprotected: 4436d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com virtual ~SkCachingPixelRef(); 45d0419b1fe781ed21d4aa0dc80df6b3e79ed37e46reed@google.com virtual bool onNewLockPixels(LockRec*) SK_OVERRIDE; 466e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org virtual void onUnlockPixels() SK_OVERRIDE; 476e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org virtual bool onLockPixelsAreWritable() const SK_OVERRIDE { return false; } 486e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org 4936d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com virtual SkData* onRefEncodedData() SK_OVERRIDE { 5036d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com return fImageGenerator->refEncodedData(); 5136d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com } 529a9eae21ed5235869702a66d6decddd6643792c3reed 536e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.orgprivate: 5436d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com SkImageGenerator* const fImageGenerator; 5536d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com bool fErrorInDecoding; 5636d08c5c90c7607cd559769f7a9c2b3364eeba85halcanary@google.com const size_t fRowBytes; 576e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org 58680fb9e8f10d24b5fe35c90338de37c57392f1aareed SkBitmap fLockedBitmap; 59680fb9e8f10d24b5fe35c90338de37c57392f1aareed 60bf790232f6d94b54239dbc210d8beee7411ca458reed@google.com SkCachingPixelRef(const SkImageInfo&, SkImageGenerator*, size_t rowBytes); 61bf790232f6d94b54239dbc210d8beee7411ca458reed@google.com 626e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org typedef SkPixelRef INHERITED; 636e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org}; 646e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org 656e3e42296b0d7a93325146d9c9a7e23ef90760fecommit-bot@chromium.org#endif // SkCachingPixelRef_DEFINED 66