blob: e8dcc83f59f071861de6e6d5b93c9b8eaf3e0ddb [file] [log] [blame]
msarett9bde9182015-03-25 05:27:48 -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 "SkCodec.h"
9#include "SkImageInfo.h"
10#include "SkStream.h"
11#include "SkTypes.h"
12
13/*
14 * This class implements the decoding for bmp images
15 */
16class SkIcoCodec : public SkCodec {
17public:
scroggodb30be22015-12-08 18:54:13 -080018 static bool IsIco(const void*, size_t);
msarett9bde9182015-03-25 05:27:48 -070019
20 /*
21 * Assumes IsIco was called and returned true
22 * Creates an Ico decoder
23 * Reads enough of the stream to determine the image format
24 */
25 static SkCodec* NewFromStream(SkStream*);
26
27protected:
28
29 /*
30 * Chooses the best dimensions given the desired scale
31 */
mtklein36352bf2015-03-25 18:17:31 -070032 SkISize onGetScaledDimensions(float desiredScale) const override;
msarett9bde9182015-03-25 05:27:48 -070033
scroggoe7fc14b2015-10-02 13:14:46 -070034 bool onDimensionsSupported(const SkISize&) override;
35
msarett9bde9182015-03-25 05:27:48 -070036 /*
37 * Initiates the Ico decode
38 */
msarette6dd0042015-10-09 11:07:34 -070039 Result onGetPixels(const SkImageInfo& dstInfo, void* dst, size_t dstRowBytes, const Options&,
40 SkPMColor*, int*, int*) override;
msarett9bde9182015-03-25 05:27:48 -070041
Hal Canarydb683012016-11-23 08:55:18 -070042 SkEncodedImageFormat onGetEncodedFormat() const override {
43 return SkEncodedImageFormat::kICO;
msarett9bde9182015-03-25 05:27:48 -070044 }
45
msarettbe8216a2015-12-04 08:00:50 -080046 SkScanlineOrder onGetScanlineOrder() const override;
47
msarett9bde9182015-03-25 05:27:48 -070048private:
49
msarettbe8216a2015-12-04 08:00:50 -080050 Result onStartScanlineDecode(const SkImageInfo& dstInfo, const SkCodec::Options& options,
51 SkPMColor inputColorPtr[], int* inputColorCount) override;
52
53 int onGetScanlines(void* dst, int count, size_t rowBytes) override;
54
55 bool onSkipScanlines(int count) override;
56
scroggo8e6c7ad2016-09-16 08:20:38 -070057 Result onStartIncrementalDecode(const SkImageInfo& dstInfo, void* pixels, size_t rowBytes,
58 const SkCodec::Options&, SkPMColor*, int*) override;
59
60 Result onIncrementalDecode(int* rowsDecoded) override;
61
msarettbe8216a2015-12-04 08:00:50 -080062 SkSampler* getSampler(bool createIfNecessary) override;
63
64 /*
65 * Searches fEmbeddedCodecs for a codec that matches requestedSize.
66 * The search starts at startIndex and ends when an appropriate codec
67 * is found, or we have reached the end of the array.
68 *
69 * @return the index of the matching codec or -1 if there is no
70 * matching codec between startIndex and the end of
71 * the array.
72 */
73 int chooseCodec(const SkISize& requestedSize, int startIndex);
74
msarett9bde9182015-03-25 05:27:48 -070075 /*
76 * Constructor called by NewFromStream
77 * @param embeddedCodecs codecs for the embedded images, takes ownership
78 */
msarettc30c4182016-04-20 11:53:35 -070079 SkIcoCodec(int width, int height, const SkEncodedInfo& info,
Ben Wagner145dbcd2016-11-03 14:40:50 -040080 SkTArray<std::unique_ptr<SkCodec>, true>* embeddedCodecs, sk_sp<SkColorSpace> colorSpace);
msarett9bde9182015-03-25 05:27:48 -070081
Ben Wagner145dbcd2016-11-03 14:40:50 -040082 std::unique_ptr<SkTArray<std::unique_ptr<SkCodec>, true>> fEmbeddedCodecs;
msarettbe8216a2015-12-04 08:00:50 -080083
84 // Only used by the scanline decoder. onStartScanlineDecode() will set
85 // fCurrScanlineCodec to one of the fEmbeddedCodecs, if it can find a
86 // codec of the appropriate size. We will use fCurrScanlineCodec for
87 // subsequent calls to onGetScanlines() or onSkipScanlines().
88 // fCurrScanlineCodec is owned by this class, but should not be an
Ben Wagner145dbcd2016-11-03 14:40:50 -040089 // std::unique_ptr. It will be deleted by the destructor of fEmbeddedCodecs.
msarettbe8216a2015-12-04 08:00:50 -080090 SkCodec* fCurrScanlineCodec;
msarett9bde9182015-03-25 05:27:48 -070091
scroggo8e6c7ad2016-09-16 08:20:38 -070092 // Only used by incremental decoder. onStartIncrementalDecode() will set
93 // fCurrIncrementalCodec to one of the fEmbeddedCodecs, if it can find a
94 // codec of the appropriate size. We will use fCurrIncrementalCodec for
95 // subsequent calls to incrementalDecode().
96 // fCurrIncrementalCodec is owned by this class, but should not be an
Ben Wagner145dbcd2016-11-03 14:40:50 -040097 // std::unique_ptr. It will be deleted by the destructor of fEmbeddedCodecs.
scroggo8e6c7ad2016-09-16 08:20:38 -070098 SkCodec* fCurrIncrementalCodec;
99
msarett9bde9182015-03-25 05:27:48 -0700100 typedef SkCodec INHERITED;
101};