/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkCodec.h" #include "SkColorTable.h" #include "SkPngChunkReader.h" #include "SkEncodedFormat.h" #include "SkImageInfo.h" #include "SkRefCnt.h" #include "SkSwizzler.h" #include "png.h" #if PNG_LIBPNG_VER_MAJOR > 1 || (PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR >= 5) class SkStream; class SkPngCodec : public SkCodec { public: static bool IsPng(const char*, size_t); // Assume IsPng was called and returned true. static SkCodec* NewFromStream(SkStream*, SkPngChunkReader* = NULL); virtual ~SkPngCodec(); protected: SkPngCodec(int width, int height, const SkEncodedInfo&, SkStream*, SkPngChunkReader*, png_structp, png_infop, int bitDepth, sk_sp); Result onGetPixels(const SkImageInfo&, void*, size_t, const Options&, SkPMColor*, int*, int*) override; SkEncodedFormat onGetEncodedFormat() const override { return kPNG_SkEncodedFormat; } bool onRewind() override; uint32_t onGetFillValue(SkColorType) const override; // Helper to set up swizzler and color table. Also calls png_read_update_info. bool initializeSwizzler(const SkImageInfo& requestedInfo, const Options&, SkPMColor*, int* ctableCount); SkSampler* getSampler(bool createIfNecessary) override { SkASSERT(fSwizzler); return fSwizzler; } png_structp png_ptr() { return fPng_ptr; } png_infop info_ptr() { return fInfo_ptr; } SkSwizzler* swizzler() { return fSwizzler; } /** * Pass available input to libpng to process it. * * libpng will call any relevant callbacks installed. This will continue decoding * until it reaches the end of the file, or until a callback tells libpng to stop. */ void processData(); Result onStartIncrementalDecode(const SkImageInfo& dstInfo, void* pixels, size_t rowBytes, const SkCodec::Options&, SkPMColor* ctable, int* ctableCount) override; Result onIncrementalDecode(int*) override; private: SkAutoTUnref fPngChunkReader; png_structp fPng_ptr; png_infop fInfo_ptr; SkAutoTUnref fColorTable; // May be unpremul. SkAutoTDelete fSwizzler; const int fBitDepth; bool createColorTable(SkColorType dstColorType, bool premultiply, int* ctableCount); void destroyReadStruct(); virtual Result decodeAllRows(void* dst, size_t rowBytes, int* rowsDecoded) = 0; virtual void setRange(int firstRow, int lastRow, void* dst, size_t rowBytes) = 0; virtual Result decode(int* rowsDecoded) = 0; typedef SkCodec INHERITED; }; #else #undef SK_HAS_PNG_LIBRARY #endif