Index: src/codec/SkPngCodec.h |
diff --git a/src/codec/SkPngCodec.h b/src/codec/SkPngCodec.h |
index a4c20c708f16e73684c1e013241b9f7fafd700b1..e3059ba0d55422b4442a3e4a1e42bedecef3453a 100644 |
--- a/src/codec/SkPngCodec.h |
+++ b/src/codec/SkPngCodec.h |
@@ -14,6 +14,13 @@ |
#include "SkRefCnt.h" |
#include "SkSwizzler.h" |
+// FIXME (scroggo): GOOGLE3 is currently using an outdated version of libpng, |
+// so we need to work around the lack of the method png_process_data_pause. |
+// This code will be unnecessary once we update GOOGLE3. It would make more |
+// sense to condition this on the version of libpng being used, but we do not |
+// know that here because png.h is only included by the cpp file. |
+#define SK_GOOGLE3_PNG_HACK |
+ |
class SkStream; |
class SkPngCodec : public SkCodec { |
@@ -39,25 +46,50 @@ protected: |
void* fPtr; |
}; |
+ SkPngCodec(const SkEncodedInfo&, const SkImageInfo&, SkStream*, SkPngChunkReader*, |
+ void* png_ptr, void* info_ptr, int bitDepth); |
+ |
Result onGetPixels(const SkImageInfo&, void*, size_t, const Options&, SkPMColor*, int*, int*) |
override; |
SkEncodedFormat onGetEncodedFormat() const override { return kPNG_SkEncodedFormat; } |
bool onRewind() override; |
uint64_t onGetFillValue(const SkImageInfo&) const override; |
- // Helper to set up swizzler, color xforms, and color table. Also calls png_read_update_info. |
- bool initializeXforms(const SkImageInfo& dstInfo, const Options&, SkPMColor* colorPtr, |
- int* colorCount); |
- void initializeSwizzler(const SkImageInfo& dstInfo, const Options&); |
SkSampler* getSampler(bool createIfNecessary) override; |
- void allocateStorage(const SkImageInfo& dstInfo); |
- void applyXformRow(void* dst, const void* src, SkColorType, SkAlphaType, int width); |
+ void applyXformRow(void* dst, const void* src); |
- virtual int readRows(const SkImageInfo& dstInfo, void* dst, size_t rowBytes, int count, |
- int startRow) = 0; |
+ voidp png_ptr() { return fPng_ptr; } |
+ voidp info_ptr() { return fInfo_ptr; } |
- SkPngCodec(const SkEncodedInfo&, const SkImageInfo&, SkStream*, SkPngChunkReader*, |
- void* png_ptr, void* info_ptr, int, int); |
+ SkSwizzler* swizzler() { return fSwizzler; } |
+ |
+ // Initialize variables used by applyXformRow. |
+ void initializeXformAlphaAndWidth(); |
+ |
+ /** |
+ * 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(); |
+ |
+#ifdef SK_GOOGLE3_PNG_HACK |
+ // In libpng 1.2.56, png_process_data_pause does not exist, so when we wanted to |
+ // read the header, we may have read too far. In that case, we need to delete the |
+ // png_ptr and info_ptr and recreate them. This method does that (and attaches the |
+ // chunk reader. |
+ bool rereadHeaderIfNecessary(); |
+ |
+ // This method sets up the new png_ptr/info_ptr (created in rereadHeaderIfNecessary) |
+ // the way we set up the old one the first time in AutoCleanPng.decodeBounds's callback. |
+ void rereadInfoCallback(); |
+#endif |
+ |
+ Result onStartIncrementalDecode(const SkImageInfo& dstInfo, void* pixels, size_t rowBytes, |
+ const SkCodec::Options&, |
+ SkPMColor* ctable, int* ctableCount) override; |
+ Result onIncrementalDecode(int*) override; |
SkAutoTUnref<SkPngChunkReader> fPngChunkReader; |
voidp fPng_ptr; |
@@ -68,12 +100,8 @@ protected: |
SkAutoTDelete<SkSwizzler> fSwizzler; |
std::unique_ptr<SkColorSpaceXform> fColorXform; |
SkAutoTMalloc<uint8_t> fStorage; |
- uint8_t* fSwizzlerSrcRow; |
uint32_t* fColorXformSrcRow; |
- size_t fSrcRowBytes; |
- |
- const int fNumberPasses; |
- int fBitDepth; |
+ const int fBitDepth; |
private: |
@@ -89,9 +117,24 @@ private: |
}; |
bool createColorTable(const SkImageInfo& dstInfo, int* ctableCount); |
+ // Helper to set up swizzler, color xforms, and color table. Also calls png_read_update_info. |
+ bool initializeXforms(const SkImageInfo& dstInfo, const Options&, SkPMColor* colorPtr, |
+ int* colorCount); |
+ void initializeSwizzler(const SkImageInfo& dstInfo, const Options&); |
+ void allocateStorage(const SkImageInfo& dstInfo); |
void destroyReadStruct(); |
- XformMode fXformMode; |
+ 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; |
+ |
+ XformMode fXformMode; |
+ SkAlphaType fXformAlphaType; |
+ int fXformWidth; |
+ |
+#ifdef SK_GOOGLE3_PNG_HACK |
+ bool fNeedsToRereadHeader; |
+#endif |
typedef SkCodec INHERITED; |
}; |