Index: include/codec/SkScanlineDecoder.h |
diff --git a/include/codec/SkScanlineDecoder.h b/include/codec/SkScanlineDecoder.h |
deleted file mode 100644 |
index 61184d644a15d9043e2fef92f3aa1e54a01e21e8..0000000000000000000000000000000000000000 |
--- a/include/codec/SkScanlineDecoder.h |
+++ /dev/null |
@@ -1,288 +0,0 @@ |
-/* |
- * 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 SkScanlineDecoder_DEFINED |
-#define SkScanlineDecoder_DEFINED |
- |
-#include "../private/SkTemplates.h" |
-#include "SkCodec.h" |
-#include "SkImageInfo.h" |
-#include "SkTypes.h" |
- |
-class SkScanlineDecoder : public SkNoncopyable { |
-public: |
- /** |
- * If this stream represents an encoded image that we know how to decode |
- * in scanlines, return an SkScanlineDecoder that can decode it. Otherwise |
- * return NULL. |
- * |
- * start() must be called in order to decode any scanlines. |
- * |
- * If NULL is returned, the stream is deleted immediately. Otherwise, the |
- * SkScanlineDecoder takes ownership of it, and will delete it when done |
- * with it. |
- */ |
- static SkScanlineDecoder* NewFromStream(SkStream*); |
- |
- /** |
- * Similar to NewFromStream, but reads from an SkData. |
- * |
- * Will take a ref if it returns a scanline decoder, else will not affect |
- * the data. |
- */ |
- static SkScanlineDecoder* NewFromData(SkData*); |
- |
- /** |
- * Clean up after reading/skipping scanlines. |
- * |
- * It is possible that not all scanlines will have been read/skipped. In |
- * fact, in the case of subset decodes, it is likely that there will be |
- * scanlines at the bottom of the image that have been ignored. |
- */ |
- virtual ~SkScanlineDecoder() {} |
- |
- /** |
- * Return a size that approximately supports the desired scale factor. |
- * The codec may not be able to scale efficiently to the exact scale |
- * factor requested, so return a size that approximates that scale. |
- * The returned value is the codec's suggestion for the closest valid |
- * scale that it can natively support |
- * FIXME: share this with SkCodec |
- */ |
- SkISize getScaledDimensions(float desiredScale) { |
- return this->onGetScaledDimensions(desiredScale); |
- } |
- |
- /** |
- * Returns the default info, corresponding to the encoded data. |
- */ |
- const SkImageInfo& getInfo() { return fSrcInfo; } |
- |
- /** |
- * Initialize on the first scanline, with the specified options. |
- * |
- * This must be called in order to call getScanlnies or skipScanlines. If |
- * it has been called before, this will require rewinding the stream. |
- * |
- * @param dstInfo Info of the destination. If the dimensions do not match |
- * those of getInfo, this implies a scale. |
- * @param options Contains decoding options, including if memory is zero |
- * initialized. |
- * @param ctable A pointer to a color table. When dstInfo.colorType() is |
- * kIndex8, this should be non-NULL and have enough storage for 256 |
- * colors. The color table will be populated after decoding the palette. |
- * @param ctableCount A pointer to the size of the color table. When |
- * dstInfo.colorType() is kIndex8, this should be non-NULL. It will |
- * be modified to the true size of the color table (<= 256) after |
- * decoding the palette. |
- * @return Enum representing success or reason for failure. |
- */ |
- SkCodec::Result start(const SkImageInfo& dstInfo, const SkCodec::Options* options, |
- SkPMColor ctable[], int* ctableCount); |
- |
- /** |
- * Simplified version of start() that asserts that info is NOT |
- * kIndex8_SkColorType and uses the default Options. |
- */ |
- SkCodec::Result start(const SkImageInfo& dstInfo); |
- |
- /** |
- * Write the next countLines scanlines into dst. |
- * |
- * Not valid to call before calling start(). |
- * |
- * @param dst Must be non-null, and large enough to hold countLines |
- * scanlines of size rowBytes. |
- * @param countLines Number of lines to write. |
- * @param rowBytes Number of bytes per row. Must be large enough to hold |
- * a scanline based on the SkImageInfo used to create this object. |
- */ |
- SkCodec::Result getScanlines(void* dst, int countLines, size_t rowBytes) { |
- SkASSERT(!fDstInfo.isEmpty()); |
- if ((rowBytes < fDstInfo.minRowBytes() && countLines > 1 ) || countLines <= 0 |
- || fCurrScanline + countLines > fDstInfo.height()) { |
- return SkCodec::kInvalidParameters; |
- } |
- const SkCodec::Result result = this->onGetScanlines(dst, countLines, rowBytes); |
- fCurrScanline += countLines; |
- return result; |
- } |
- |
- /** |
- * Skip count scanlines. |
- * |
- * Not valid to call before calling start(). |
- * |
- * The default version just calls onGetScanlines and discards the dst. |
- * NOTE: If skipped lines are the only lines with alpha, this default |
- * will make reallyHasAlpha return true, when it could have returned |
- * false. |
- */ |
- SkCodec::Result skipScanlines(int countLines) { |
- SkASSERT(!fDstInfo.isEmpty()); |
- if (fCurrScanline + countLines > fDstInfo.height()) { |
- // Arguably, we could just skip the scanlines which are remaining, |
- // and return kSuccess. We choose to return invalid so the client |
- // can catch their bug. |
- return SkCodec::kInvalidParameters; |
- } |
- const SkCodec::Result result = this->onSkipScanlines(countLines); |
- fCurrScanline += countLines; |
- return result; |
- } |
- |
- /** |
- * Some images may initially report that they have alpha due to the format |
- * of the encoded data, but then never use any colors which have alpha |
- * less than 100%. This function can be called *after* decoding to |
- * determine if such an image truly had alpha. Calling it before decoding |
- * is undefined. |
- * FIXME: see skbug.com/3582. |
- */ |
- bool reallyHasAlpha() const { |
- return this->onReallyHasAlpha(); |
- } |
- |
- /** |
- * Format of the encoded data. |
- */ |
- SkEncodedFormat getEncodedFormat() const { return this->onGetEncodedFormat(); } |
- |
- /** |
- * The order in which rows are output from the scanline decoder is not the |
- * same for all variations of all image types. This explains the possible |
- * output row orderings. |
- */ |
- enum SkScanlineOrder { |
- /* |
- * By far the most common, this indicates that the image can be decoded |
- * reliably using the scanline decoder, and that rows will be output in |
- * the logical order. |
- */ |
- kTopDown_SkScanlineOrder, |
- |
- /* |
- * This indicates that the scanline decoder reliably outputs rows, but |
- * they will be returned in reverse order. If the scanline format is |
- * kBottomUp, the getY() API can be used to determine the actual |
- * y-coordinate of the next output row, but the client is not forced |
- * to take advantage of this, given that it's not too tough to keep |
- * track independently. |
- * |
- * For full image decodes, it is safe to get all of the scanlines at |
- * once, since the decoder will handle inverting the rows as it |
- * decodes. |
- * |
- * For subset decodes and sampling, it is simplest to get and skip |
- * scanlines one at a time, using the getY() API. It is possible to |
- * ask for larger chunks at a time, but this should be used with |
- * caution. As with full image decodes, the decoder will handle |
- * inverting the requested rows, but rows will still be delivered |
- * starting from the bottom of the image. |
- * |
- * Upside down bmps are an example. |
- */ |
- kBottomUp_SkScanlineOrder, |
- |
- /* |
- * This indicates that the scanline decoder reliably outputs rows, but |
- * they will not be in logical order. If the scanline format is |
- * kOutOfOrder, the getY() API should be used to determine the actual |
- * y-coordinate of the next output row. |
- * |
- * For this scanline ordering, it is advisable to get and skip |
- * scanlines one at a time. |
- * |
- * Interlaced gifs are an example. |
- */ |
- kOutOfOrder_SkScanlineOrder, |
- |
- /* |
- * Indicates that the entire image must be decoded in order to output |
- * any amount of scanlines. In this case, it is a REALLY BAD IDEA to |
- * request scanlines 1-by-1 or in small chunks. The client should |
- * determine which scanlines are needed and ask for all of them in |
- * a single call to getScanlines(). |
- * |
- * Interlaced pngs are an example. |
- */ |
- kNone_SkScanlineOrder, |
- }; |
- |
- /** |
- * An enum representing the order in which scanlines will be returned by |
- * the scanline decoder. |
- */ |
- SkScanlineOrder getScanlineOrder() const { return this->onGetScanlineOrder(); } |
- |
- /** |
- * Returns the y-coordinate of the next row to be returned by the scanline |
- * decoder. This will be overridden in the case of |
- * kOutOfOrder_SkScanlineOrder and should be unnecessary in the case of |
- * kNone_SkScanlineOrder. |
- */ |
- int getY() const { |
- SkASSERT(kNone_SkScanlineOrder != this->getScanlineOrder()); |
- return this->onGetY(); |
- } |
- |
-protected: |
- SkScanlineDecoder(const SkImageInfo& srcInfo) |
- : fSrcInfo(srcInfo) |
- , fDstInfo() |
- , fOptions() |
- , fCurrScanline(0) {} |
- |
- virtual SkISize onGetScaledDimensions(float /* desiredScale */) { |
- // By default, scaling is not supported. |
- return this->getInfo().dimensions(); |
- } |
- |
- virtual SkEncodedFormat onGetEncodedFormat() const = 0; |
- |
- virtual bool onReallyHasAlpha() const { return false; } |
- |
- /** |
- * Most images types will be kTopDown and will not need to override this function. |
- */ |
- virtual SkScanlineOrder onGetScanlineOrder() const { return kTopDown_SkScanlineOrder; } |
- |
- /** |
- * Most images will be kTopDown and will not need to override this function. |
- */ |
- virtual int onGetY() const { return fCurrScanline; } |
- |
- const SkImageInfo& dstInfo() const { return fDstInfo; } |
- |
- const SkCodec::Options& options() const { return fOptions; } |
- |
-private: |
- const SkImageInfo fSrcInfo; |
- SkImageInfo fDstInfo; |
- SkCodec::Options fOptions; |
- int fCurrScanline; |
- |
- virtual SkCodec::Result onStart(const SkImageInfo& dstInfo, |
- const SkCodec::Options& options, |
- SkPMColor ctable[], int* ctableCount) = 0; |
- |
- // Naive default version just calls onGetScanlines on temp memory. |
- virtual SkCodec::Result onSkipScanlines(int countLines) { |
- SkAutoMalloc storage(fDstInfo.minRowBytes()); |
- // Note that we pass 0 to rowBytes so we continue to use the same memory. |
- // Also note that while getScanlines checks that rowBytes is big enough, |
- // onGetScanlines bypasses that check. |
- // Calling the virtual method also means we do not double count |
- // countLines. |
- return this->onGetScanlines(storage.get(), countLines, 0); |
- } |
- |
- virtual SkCodec::Result onGetScanlines(void* dst, int countLines, |
- size_t rowBytes) = 0; |
- |
-}; |
-#endif // SkScanlineDecoder_DEFINED |