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 static bool IsIco(const void*, size_t); 19 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 27 protected: 28 29 /* 30 * Chooses the best dimensions given the desired scale 31 */ 32 SkISize onGetScaledDimensions(float desiredScale) const override; 33 34 bool onDimensionsSupported(const SkISize&) override; 35 36 /* 37 * Initiates the Ico decode 38 */ 39 Result onGetPixels(const SkImageInfo& dstInfo, void* dst, size_t dstRowBytes, const Options&, 40 SkPMColor*, int*, int*) override; 41 42 SkEncodedFormat onGetEncodedFormat() const override { 43 return kICO_SkEncodedFormat; 44 } 45 46 SkScanlineOrder onGetScanlineOrder() const override; 47 48 private: 49 50 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 57 SkSampler* getSampler(bool createIfNecessary) override; 58 59 /* 60 * Searches fEmbeddedCodecs for a codec that matches requestedSize. 61 * The search starts at startIndex and ends when an appropriate codec 62 * is found, or we have reached the end of the array. 63 * 64 * @return the index of the matching codec or -1 if there is no 65 * matching codec between startIndex and the end of 66 * the array. 67 */ 68 int chooseCodec(const SkISize& requestedSize, int startIndex); 69 70 /* 71 * Constructor called by NewFromStream 72 * @param embeddedCodecs codecs for the embedded images, takes ownership 73 */ 74 SkIcoCodec(const SkImageInfo& srcInfo, SkTArray<SkAutoTDelete<SkCodec>, true>* embeddedCodecs); 75 76 SkAutoTDelete<SkTArray<SkAutoTDelete<SkCodec>, true>> fEmbeddedCodecs; // owned 77 78 // Only used by the scanline decoder. onStartScanlineDecode() will set 79 // fCurrScanlineCodec to one of the fEmbeddedCodecs, if it can find a 80 // codec of the appropriate size. We will use fCurrScanlineCodec for 81 // subsequent calls to onGetScanlines() or onSkipScanlines(). 82 // fCurrScanlineCodec is owned by this class, but should not be an 83 // SkAutoTDelete. It will be deleted by the destructor of fEmbeddedCodecs. 84 SkCodec* fCurrScanlineCodec; 85 86 typedef SkCodec INHERITED; 87 }; 88