aboutsummaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorGravatar scroggo <scroggo@google.com>2015-11-23 07:20:57 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-11-23 07:20:57 -0800
commit3389e00136188800b98ca69488c0418c374fd78b (patch)
tree6cbb5b6bc005e618daca29be3873f7211780ebbc /include
parenta98419be092cce2a7ef27a09b6fd8065ff709cff (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.h11
-rw-r--r--include/core/SkImageDecoder.h34
-rw-r--r--include/core/SkPngChunkReader.h45
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