123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- /*
- * Copyright 2015 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- #ifndef SkIcoCodec_DEFINED
- #define SkIcoCodec_DEFINED
- #include "include/codec/SkCodec.h"
- #include "include/core/SkImageInfo.h"
- #include "include/core/SkStream.h"
- #include "include/core/SkTypes.h"
- #include "include/private/SkTArray.h"
- /*
- * This class implements the decoding for bmp images
- */
- class SkIcoCodec : public SkCodec {
- public:
- static bool IsIco(const void*, size_t);
- /*
- * Assumes IsIco was called and returned true
- * Creates an Ico decoder
- * Reads enough of the stream to determine the image format
- */
- static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
- protected:
- /*
- * Chooses the best dimensions given the desired scale
- */
- SkISize onGetScaledDimensions(float desiredScale) const override;
- bool onDimensionsSupported(const SkISize&) override;
- /*
- * Initiates the Ico decode
- */
- Result onGetPixels(const SkImageInfo& dstInfo, void* dst, size_t dstRowBytes, const Options&,
- int*) override;
- SkEncodedImageFormat onGetEncodedFormat() const override {
- return SkEncodedImageFormat::kICO;
- }
- SkScanlineOrder onGetScanlineOrder() const override;
- bool conversionSupported(const SkImageInfo&, bool, bool) override {
- // This will be checked by the embedded codec.
- return true;
- }
- // Handled by the embedded codec.
- bool usesColorXform() const override { return false; }
- private:
- Result onStartScanlineDecode(const SkImageInfo& dstInfo,
- const SkCodec::Options& options) override;
- int onGetScanlines(void* dst, int count, size_t rowBytes) override;
- bool onSkipScanlines(int count) override;
- Result onStartIncrementalDecode(const SkImageInfo& dstInfo, void* pixels, size_t rowBytes,
- const SkCodec::Options&) override;
- Result onIncrementalDecode(int* rowsDecoded) override;
- SkSampler* getSampler(bool createIfNecessary) override;
- /*
- * Searches fEmbeddedCodecs for a codec that matches requestedSize.
- * The search starts at startIndex and ends when an appropriate codec
- * is found, or we have reached the end of the array.
- *
- * @return the index of the matching codec or -1 if there is no
- * matching codec between startIndex and the end of
- * the array.
- */
- int chooseCodec(const SkISize& requestedSize, int startIndex);
- /*
- * Constructor called by NewFromStream
- * @param embeddedCodecs codecs for the embedded images, takes ownership
- */
- SkIcoCodec(SkEncodedInfo&& info, SkTArray<std::unique_ptr<SkCodec>, true>* embeddedCodecs);
- std::unique_ptr<SkTArray<std::unique_ptr<SkCodec>, true>> fEmbeddedCodecs;
- // fCurrCodec is owned by this class, but should not be an
- // std::unique_ptr. It will be deleted by the destructor of fEmbeddedCodecs.
- SkCodec* fCurrCodec;
- typedef SkCodec INHERITED;
- };
- #endif // SkIcoCodec_DEFINED
|