1 /*
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  */
16 class SkIcoCodec : public SkCodec {
17 public:
18 
19     /*
20      * Checks the start of the stream to see if the image is a Ico or Cur
21      */
22     static bool IsIco(SkStream*);
23 
24     /*
25      * Assumes IsIco was called and returned true
26      * Creates an Ico decoder
27      * Reads enough of the stream to determine the image format
28      */
29     static SkCodec* NewFromStream(SkStream*);
30 
31 protected:
32 
33     /*
34      * Chooses the best dimensions given the desired scale
35      */
36     SkISize onGetScaledDimensions(float desiredScale) const override;
37 
38     /*
39      * Initiates the Ico decode
40      */
41     Result onGetPixels(const SkImageInfo& dstInfo, void* dst,
42                        size_t dstRowBytes, const Options&, SkPMColor*, int*)
43                        override;
44 
onGetEncodedFormat()45     SkEncodedFormat onGetEncodedFormat() const override {
46         return kICO_SkEncodedFormat;
47     }
48 
49 private:
50 
51     /*
52      * Constructor called by NewFromStream
53      * @param embeddedCodecs codecs for the embedded images, takes ownership
54      */
55     SkIcoCodec(const SkImageInfo& srcInfo,
56                SkTArray<SkAutoTDelete<SkCodec>, true>* embeddedCodecs);
57 
58     SkAutoTDelete<SkTArray<SkAutoTDelete<SkCodec>, true>>
59             fEmbeddedCodecs; // owned
60 
61     typedef SkCodec INHERITED;
62 };
63