diff options
author | 2015-11-23 07:20:57 -0800 | |
---|---|---|
committer | 2015-11-23 07:20:57 -0800 | |
commit | 3389e00136188800b98ca69488c0418c374fd78b (patch) | |
tree | 6cbb5b6bc005e618daca29be3873f7211780ebbc /include | |
parent | a98419be092cce2a7ef27a09b6fd8065ff709cff (diff) |
Add SkPngChunkReader.
This class allows a client of SkCodec to read chunks in the data
stream that are not recognized by libpng. This is used by Android
to specify ninepatch data.
Taken from SkImageDecoder::Peeker. Modify the name of the class
and its method to be more specific to their use. Make
SkImageDecoder::Peeker a subclass of the new class, to help stage
the change in Android.
Add a test to verify that it works.
BUG=skia:4574
BUG=skia:3257
Review URL: https://codereview.chromium.org/1040453002
Diffstat (limited to 'include')
-rw-r--r-- | include/codec/SkCodec.h | 11 | ||||
-rw-r--r-- | include/core/SkImageDecoder.h | 34 | ||||
-rw-r--r-- | include/core/SkPngChunkReader.h | 45 |
3 files changed, 71 insertions, 19 deletions
diff --git a/include/codec/SkCodec.h b/include/codec/SkCodec.h index d90fea8ced..dffab6b377 100644 --- a/include/codec/SkCodec.h +++ b/include/codec/SkCodec.h @@ -17,6 +17,7 @@ #include "SkTypes.h" class SkData; +class SkPngChunkReader; class SkSampler; /** @@ -28,18 +29,24 @@ public: * If this stream represents an encoded image that we know how to decode, * return an SkCodec that can decode it. Otherwise return NULL. * + * If SkPngChunkReader is not NULL, take a ref and pass it to libpng if + * the image is a png. + * * If NULL is returned, the stream is deleted immediately. Otherwise, the * SkCodec takes ownership of it, and will delete it when done with it. */ - static SkCodec* NewFromStream(SkStream*); + static SkCodec* NewFromStream(SkStream*, SkPngChunkReader* = NULL); /** * If this data represents an encoded image that we know how to decode, * return an SkCodec that can decode it. Otherwise return NULL. * + * If SkPngChunkReader is not NULL, take a ref and pass it to libpng if + * the image is a png. + * * Will take a ref if it returns a codec, else will not affect the data. */ - static SkCodec* NewFromData(SkData*); + static SkCodec* NewFromData(SkData*, SkPngChunkReader* = NULL); virtual ~SkCodec(); diff --git a/include/core/SkImageDecoder.h b/include/core/SkImageDecoder.h index 144878c166..30323b59ee 100644 --- a/include/core/SkImageDecoder.h +++ b/include/core/SkImageDecoder.h @@ -10,11 +10,14 @@ #include "SkBitmap.h" #include "SkImage.h" +#include "SkPngChunkReader.h" #include "SkRect.h" #include "SkRefCnt.h" #include "SkTRegistry.h" #include "SkTypes.h" +//#define SK_LEGACY_PEEKER + class SkStream; class SkStreamRewindable; @@ -126,23 +129,20 @@ public: */ bool getRequireUnpremultipliedColors() const { return fRequireUnpremultipliedColors; } - /** \class Peeker - - Base class for optional callbacks to retrieve meta/chunk data out of - an image as it is being decoded. - */ - class Peeker : public SkRefCnt { +#ifdef SK_LEGACY_PEEKER + // Android subclasses SkImageDecoder::Peeker, which has been changed into SkPngChunkReader. + // Temporarily use this class until Android can be updated to directly inherit from + // SkPngChunkReader. + class Peeker : public SkPngChunkReader { public: - /** Return true to continue decoding, or false to indicate an error, which - will cause the decoder to not return the image. - */ + bool readChunk(const char tag[], const void* data, size_t length) final { + return this->peek(tag, data, length); + } virtual bool peek(const char tag[], const void* data, size_t length) = 0; - private: - typedef SkRefCnt INHERITED; }; - - Peeker* getPeeker() const { return fPeeker; } - Peeker* setPeeker(Peeker*); +#endif + SkPngChunkReader* getPeeker() const { return fPeeker; } + SkPngChunkReader* setPeeker(SkPngChunkReader*); /** * By default, the codec will try to comply with the "pref" colortype @@ -229,8 +229,8 @@ public: to allocate the memory from a cache, volatile memory, or even from an existing bitmap's memory. - If a Peeker is installed via setPeeker, it may be used to peek into - meta data during the decode. + If an SkPngChunkReader is installed via setPeeker, it may be used to + peek into meta data during the decode. */ Result decode(SkStream*, SkBitmap* bitmap, SkColorType pref, Mode); Result decode(SkStream* stream, SkBitmap* bitmap, Mode mode) { @@ -350,7 +350,7 @@ protected: SkColorType getPrefColorType(SrcDepth, bool hasAlpha) const; private: - Peeker* fPeeker; + SkPngChunkReader* fPeeker; SkBitmap::Allocator* fAllocator; int fSampleSize; SkColorType fDefaultPref; // use if fUsePrefTable is false diff --git a/include/core/SkPngChunkReader.h b/include/core/SkPngChunkReader.h new file mode 100644 index 0000000000..f424dd8cfc --- /dev/null +++ b/include/core/SkPngChunkReader.h @@ -0,0 +1,45 @@ +/* + * 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 SkPngChunkReader_DEFINED +#define SkPngChunkReader_DEFINED + +#include "SkTypes.h" +#include "SkRefCnt.h" + +/** + * SkPngChunkReader + * + * Base class for optional callbacks to retrieve meta/chunk data out of a PNG + * encoded image as it is being decoded. + * Used by SkImageDecoder and SkCodec. + */ +class SkPngChunkReader : public SkRefCnt { +public: + /** + * This will be called by the decoder when it sees an unknown chunk. + * + * Use by SkCodec: + * Depending on the location of the unknown chunks, this callback may be + * called by + * - the factory (NewFromStream/NewFromData) + * - getPixels + * - startScanlineDecode + * - the first call to getScanlines/skipScanlines + * The callback may be called from a different thread (e.g. if the SkCodec + * is passed to another thread), and it may be called multiple times, if + * the SkCodec is used multiple times. + * + * @param tag Name for this type of chunk. + * @param data Data to be interpreted by the subclass. + * @param length Number of bytes of data in the chunk. + * @return true to continue decoding, or false to indicate an error, which + * will cause the decoder to not return the image. + */ + virtual bool readChunk(const char tag[], const void* data, size_t length) = 0; +}; +#endif // SkPngChunkReader_DEFINED |