blob: c01f96be3c4306c1112ed2a71adf9ef96bd72ff8 [file] [log] [blame]
msaretta5783ae2015-09-08 15:35:32 -07001/*
2 * Copyright 2015 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#include "SkBitmap.h"
msarett5cb48852015-11-06 08:56:32 -08009#include "SkBitmapRegionDecoder.h"
scroggo46c57472015-09-30 08:57:13 -070010#include "SkCodec.h"
msaretta5783ae2015-09-08 15:35:32 -070011
12/*
scroggo46c57472015-09-30 08:57:13 -070013 * This class implements SkBitmapRegionDecoder using an SkCodec and
msaretta5783ae2015-09-08 15:35:32 -070014 * an SkCanvas. It uses the scanline decoder to subset the height. It then
15 * will subset the width and scale by drawing to an SkCanvas.
16 */
msarett9a0e3462015-12-11 07:38:50 -080017// FIXME: This class works well as a performance/quality comparison for
18// SkBitmapRegionCodec, but it lacks several capabilities that are
19// required by BitmapRegionDecoder in Android.
20// (1) WEBP decodes - because SkWebpCodec does not have a scanline
21// decoder.
22// (2) Decodes to kGray8 and kIndex8.
23// (3) Decodes to kUnpremul.
24// (4) Correcting an invalid dstColorType. For example, if the
25// client requests kRGB_565 for a non-opaque image, rather than
26// fail, we need to go ahead and decode to kN32.
msarett5cb48852015-11-06 08:56:32 -080027class SkBitmapRegionCanvas : public SkBitmapRegionDecoder {
msaretta5783ae2015-09-08 15:35:32 -070028public:
29
30 /*
31 * Takes ownership of pointer to decoder
32 */
scroggo46c57472015-09-30 08:57:13 -070033 SkBitmapRegionCanvas(SkCodec* decoder);
msaretta5783ae2015-09-08 15:35:32 -070034
msarettcb8d7192015-11-11 13:30:43 -080035 bool decodeRegion(SkBitmap* bitmap, SkBRDAllocator* allocator,
msarett35e5d1b2015-10-27 12:50:25 -070036 const SkIRect& desiredSubset, int sampleSize,
37 SkColorType colorType, bool requireUnpremul) override;
msaretta5783ae2015-09-08 15:35:32 -070038
msarett04965c62015-10-12 10:24:38 -070039 bool conversionSupported(SkColorType colorType) override;
40
msarett3f65e932015-10-27 13:12:59 -070041 SkEncodedFormat getEncodedFormat() override { return fDecoder->getEncodedFormat(); }
42
msaretta5783ae2015-09-08 15:35:32 -070043private:
44
scroggo46c57472015-09-30 08:57:13 -070045 SkAutoTDelete<SkCodec> fDecoder;
msaretta5783ae2015-09-08 15:35:32 -070046
msarett5cb48852015-11-06 08:56:32 -080047 typedef SkBitmapRegionDecoder INHERITED;
msaretta5783ae2015-09-08 15:35:32 -070048
49};