blob: 4a0387ddf8e1b827f836c6ee49f6c7c860ac2d7b [file] [log] [blame]
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkCachingPixelRef_DEFINED
9#define SkCachingPixelRef_DEFINED
10
halcanary@google.com36d08c52013-12-05 14:00:03 +000011#include "SkImageInfo.h"
12#include "SkImageGenerator.h"
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +000013#include "SkPixelRef.h"
14
15class SkColorTable;
16
17/**
18 * PixelRef which defers decoding until SkBitmap::lockPixels() is
19 * called. Caches the decoded images in the global
20 * SkScaledImageCache. When the pixels are unlocked, this cache may
21 * or be destroyed before the next lock. If so, onLockPixels will
22 * attempt to re-decode.
23 *
halcanary@google.com36d08c52013-12-05 14:00:03 +000024 * Decoding is handled by the SkImageGenerator
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +000025 */
26class SkCachingPixelRef : public SkPixelRef {
27public:
halcanary@google.com36d08c52013-12-05 14:00:03 +000028 /**
29 * Takes ownership of SkImageGenerator. If this method fails for
30 * whatever reason, it will return false and immediatetely delete
31 * the generator. If it succeeds, it will modify destination
32 * bitmap.
33 *
34 * If Install fails or when the SkCachingPixelRef that is
35 * installed into destination is destroyed, it will call
36 * SkDELETE() on the generator. Therefore, generator should be
37 * allocated with SkNEW() or SkNEW_ARGS().
38 */
39 static bool Install(SkImageGenerator* gen, SkBitmap* dst);
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +000040
41protected:
halcanary@google.com36d08c52013-12-05 14:00:03 +000042 virtual ~SkCachingPixelRef();
reed@google.com398337b2013-12-11 21:22:39 +000043 virtual void* onLockPixels(SkColorTable** colorTable) SK_OVERRIDE;
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +000044 virtual void onUnlockPixels() SK_OVERRIDE;
45 virtual bool onLockPixelsAreWritable() const SK_OVERRIDE { return false; }
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +000046
halcanary@google.com36d08c52013-12-05 14:00:03 +000047 virtual SkData* onRefEncodedData() SK_OVERRIDE {
48 return fImageGenerator->refEncodedData();
49 }
50 // No need to flatten this object. When flattening an SkBitmap,
51 // SkOrderedWriteBuffer will check the encoded data and write that
52 // instead.
53 // Future implementations of SkFlattenableWriteBuffer will need to
54 // special case for onRefEncodedData as well.
55 SK_DECLARE_UNFLATTENABLE_OBJECT()
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +000056
57private:
halcanary@google.com36d08c52013-12-05 14:00:03 +000058 SkImageGenerator* const fImageGenerator;
59 bool fErrorInDecoding;
60 void* fScaledCacheId;
reed@google.com398337b2013-12-11 21:22:39 +000061 const SkImageInfo fInfo;
halcanary@google.com36d08c52013-12-05 14:00:03 +000062 const size_t fRowBytes;
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +000063
halcanary@google.com36d08c52013-12-05 14:00:03 +000064 SkCachingPixelRef(SkImageGenerator* imageGenerator,
65 const SkImageInfo& info,
66 size_t rowBytes);
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +000067 typedef SkPixelRef INHERITED;
68};
69
70#endif // SkCachingPixelRef_DEFINED