SkIcoCodec.h revision a2b4bdce8cfd1a91407595a25683ecff982af22e
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 */ 16class SkIcoCodec : public SkCodec { 17public: 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 27protected: 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 48private: 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 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 62 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 75 /* 76 * Constructor called by NewFromStream 77 * @param embeddedCodecs codecs for the embedded images, takes ownership 78 */ 79 SkIcoCodec(int width, int height, const SkEncodedInfo& info, 80 SkTArray<std::unique_ptr<SkCodec>, true>* embeddedCodecs, sk_sp<SkColorSpace> colorSpace); 81 82 std::unique_ptr<SkTArray<std::unique_ptr<SkCodec>, true>> fEmbeddedCodecs; 83 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 89 // std::unique_ptr. It will be deleted by the destructor of fEmbeddedCodecs. 90 SkCodec* fCurrScanlineCodec; 91 92 // 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 97 // std::unique_ptr. It will be deleted by the destructor of fEmbeddedCodecs. 98 SkCodec* fCurrIncrementalCodec; 99 100 typedef SkCodec INHERITED; 101}; 102