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