Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(270)

Unified Diff: include/codec/SkScanlineDecoder.h

Issue 1365313002: Merge SkCodec with SkScanlineDecoder (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Skip ICO in SkScaledCodec for now Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/codec/SkScaledCodec.h ('k') | resources/plane_interlaced.png » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « include/codec/SkScaledCodec.h ('k') | resources/plane_interlaced.png » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698