blob: 25fde0a781bb8dd0a7c44e8cabddac32498ece37 [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
reed680fb9e2014-08-26 09:08:04 -070011#include "SkBitmapCache.h"
halcanary@google.com36d08c52013-12-05 14:00:03 +000012#include "SkImageInfo.h"
13#include "SkImageGenerator.h"
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +000014#include "SkPixelRef.h"
15
16class SkColorTable;
17
18/**
19 * PixelRef which defers decoding until SkBitmap::lockPixels() is
20 * called. Caches the decoded images in the global
21 * SkScaledImageCache. When the pixels are unlocked, this cache may
22 * or be destroyed before the next lock. If so, onLockPixels will
23 * attempt to re-decode.
24 *
halcanary@google.com36d08c52013-12-05 14:00:03 +000025 * Decoding is handled by the SkImageGenerator
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +000026 */
27class SkCachingPixelRef : public SkPixelRef {
28public:
mtklein2766c002015-06-26 11:45:03 -070029
halcanary@google.com36d08c52013-12-05 14:00:03 +000030 /**
31 * Takes ownership of SkImageGenerator. If this method fails for
32 * whatever reason, it will return false and immediatetely delete
33 * the generator. If it succeeds, it will modify destination
34 * bitmap.
35 *
36 * If Install fails or when the SkCachingPixelRef that is
37 * installed into destination is destroyed, it will call
38 * SkDELETE() on the generator. Therefore, generator should be
39 * allocated with SkNEW() or SkNEW_ARGS().
40 */
41 static bool Install(SkImageGenerator* gen, SkBitmap* dst);
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +000042
43protected:
halcanary@google.com36d08c52013-12-05 14:00:03 +000044 virtual ~SkCachingPixelRef();
mtklein36352bf2015-03-25 18:17:31 -070045 bool onNewLockPixels(LockRec*) override;
46 void onUnlockPixels() override;
47 bool onLockPixelsAreWritable() const override { return false; }
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +000048
mtklein36352bf2015-03-25 18:17:31 -070049 SkData* onRefEncodedData() override {
halcanary@google.com36d08c52013-12-05 14:00:03 +000050 return fImageGenerator->refEncodedData();
51 }
reed9a9eae22014-07-07 14:32:06 -070052
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +000053private:
halcanary@google.com36d08c52013-12-05 14:00:03 +000054 SkImageGenerator* const fImageGenerator;
55 bool fErrorInDecoding;
halcanary@google.com36d08c52013-12-05 14:00:03 +000056 const size_t fRowBytes;
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +000057
reed680fb9e2014-08-26 09:08:04 -070058 SkBitmap fLockedBitmap;
59
reed@google.combf790232013-12-13 19:45:58 +000060 SkCachingPixelRef(const SkImageInfo&, SkImageGenerator*, size_t rowBytes);
61
commit-bot@chromium.org6e3e4222013-11-06 10:08:30 +000062 typedef SkPixelRef INHERITED;
63};
64
65#endif // SkCachingPixelRef_DEFINED