diff options
author | msarett <msarett@google.com> | 2015-08-06 15:34:42 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-06 15:34:42 -0700 |
commit | 4ab9d5f1bc6d05c49dc765c3de5ade816f4c968e (patch) | |
tree | ecab1b0e6d12a892197f81a89b3bd1df3e0e7a58 /src/codec/SkBmpCodec.h | |
parent | 74992b579422a5e31fa07705d1f9206e0d919706 (diff) |
Split SkBmpCodec into three separate classes
Will regress behavior on gold on test32bfv4.bmp, where we
will no longer fix transparent decodes.
TODO: Start fixing transparent decodes again, or decide
that we don't want to fix them and remove isTransparent
from SkSwizzler. I think this may become more clear when I
start implementing the scanline decoder.
BUG=skia:
Review URL: https://codereview.chromium.org/1258863008
Diffstat (limited to 'src/codec/SkBmpCodec.h')
-rw-r--r-- | src/codec/SkBmpCodec.h | 148 |
1 files changed, 30 insertions, 118 deletions
diff --git a/src/codec/SkBmpCodec.h b/src/codec/SkBmpCodec.h index 9909945c51..51d0300091 100644 --- a/src/codec/SkBmpCodec.h +++ b/src/codec/SkBmpCodec.h @@ -4,6 +4,8 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ +#ifndef SkBmpCodec_DEFINED +#define SkBmpCodec_DEFINED #include "SkCodec.h" #include "SkColorTable.h" @@ -13,19 +15,15 @@ #include "SkSwizzler.h" #include "SkTypes.h" -// TODO: rename SkCodec_libbmp files to SkBmpCodec /* - * - * This class implements the decoding for bmp images - * + * This class enables code sharing between its bmp codec subclasses. The + * subclasses actually do the work. */ class SkBmpCodec : public SkCodec { public: /* - * * Describes if rows of the input start at the top or bottom of the image - * */ enum RowOrder { kTopDown_RowOrder, @@ -33,161 +31,75 @@ public: }; /* - * * Checks the start of the stream to see if the image is a bmp - * */ static bool IsBmp(SkStream*); /* - * * Assumes IsBmp was called and returned true * Creates a bmp decoder * Reads enough of the stream to determine the image format - * */ static SkCodec* NewFromStream(SkStream*); /* - * * Creates a bmp decoder for a bmp embedded in ico * Reads enough of the stream to determine the image format - * */ static SkCodec* NewFromIco(SkStream*); protected: - /* - * - * Initiates the bmp decode - * - */ - Result onGetPixels(const SkImageInfo& dstInfo, void* dst, - size_t dstRowBytes, const Options&, SkPMColor*, - int*) override; + SkBmpCodec(const SkImageInfo& info, SkStream* stream, uint16_t bitsPerPixel, + RowOrder rowOrder); SkEncodedFormat onGetEncodedFormat() const override { return kBMP_SkEncodedFormat; } -private: - - /* - * - * Used to define the input format of the bmp - * - */ - enum BitmapInputFormat { - kStandard_BitmapInputFormat, - kRLE_BitmapInputFormat, - kBitMask_BitmapInputFormat, - kUnknown_BitmapInputFormat - }; - - /* - * - * Creates the color table - * Sets colorCount to the new color count if it is non-NULL - */ - bool createColorTable(SkAlphaType alphaType, int* colorCount); - /* - * - * Creates a bmp decoder - * Reads enough of the stream to determine the image format - * - */ - static SkCodec* NewFromStream(SkStream*, bool isIco); - - /* - * * Read enough of the stream to initialize the SkBmpCodec. Returns a bool * representing success or failure. If it returned true, and codecOut was * not NULL, it will be set to a new SkBmpCodec. * Does *not* take ownership of the passed in SkStream. - * */ - static bool ReadHeader(SkStream*, bool isIco, SkCodec** codecOut); + static bool ReadHeader(SkStream*, bool inIco, SkCodec** codecOut); /* - * - * Performs the bitmap decoding for bit masks input format - * + * Rewinds the image stream if necessary */ - Result decodeMask(const SkImageInfo& dstInfo, void* dst, - size_t dstRowBytes, const Options& opts); + bool handleRewind(bool inIco); /* - * - * Set an RLE pixel using the color table - * - */ - void setRLEPixel(void* dst, size_t dstRowBytes, - const SkImageInfo& dstInfo, uint32_t x, uint32_t y, - uint8_t index); - /* - * - * Set an RLE24 pixel from R, G, B values - * + * Get the destination row to start filling from + * Used to fill the remainder of the image on incomplete input for bmps + * This is tricky since bmps may be kTopDown or kBottomUp. For kTopDown, + * we start filling from where we left off, but for kBottomUp we start + * filling at the top of the image. */ - void setRLE24Pixel(void* dst, size_t dstRowBytes, - const SkImageInfo& dstInfo, uint32_t x, uint32_t y, - uint8_t red, uint8_t green, uint8_t blue); + void* getDstStartRow(void* dst, size_t dstRowBytes, int32_t y) const; /* - * - * Performs the bitmap decoding for RLE input format - * + * Compute the number of colors in the color table */ - Result decodeRLE(const SkImageInfo& dstInfo, void* dst, - size_t dstRowBytes, const Options& opts); + uint32_t computeNumColors(uint32_t numColors); /* - * - * Performs the bitmap decoding for standard input format - * + * Accessors used by subclasses */ - Result decode(const SkImageInfo& dstInfo, void* dst, size_t dstRowBytes, const Options& opts); + uint16_t bitsPerPixel() const { return fBitsPerPixel; } + RowOrder rowOrder() const { return fRowOrder; } + +private: /* - * - * Creates an instance of the decoder - * Called only by NewFromStream - * - * @param srcInfo contains the source width and height - * @param stream the stream of image data - * @param bitsPerPixel the number of bits used to store each pixel - * @param format the format of the bmp file - * @param masks optional color masks for certain bmp formats, passes - ownership to SkBmpCodec - * @param numColors the number of colors in the color table - * @param bytesPerColor the number of bytes in the stream used to represent - each color in the color table - * @param offset the offset of the image pixel data from the end of the - * headers - * @param rowOrder indicates whether rows are ordered top-down or bottom-up - * @param RLEBytes used only for RLE decodes, as we must decode all - * of the data at once rather than row by row - * it indicates the amount of data left in the stream - * after decoding the headers - * + * Creates a bmp decoder + * Reads enough of the stream to determine the image format */ - SkBmpCodec(const SkImageInfo& srcInfo, SkStream* stream, - uint16_t bitsPerPixel, BitmapInputFormat format, - SkMasks* masks, uint32_t numColors, uint32_t bytesPerColor, - uint32_t offset, RowOrder rowOrder, size_t RLEBytes, - bool isIco); - - // Fields - const uint16_t fBitsPerPixel; - const BitmapInputFormat fInputFormat; - SkAutoTDelete<SkMasks> fMasks; // owned - SkAutoTUnref<SkColorTable> fColorTable; // owned - uint32_t fNumColors; - const uint32_t fBytesPerColor; - const uint32_t fOffset; - const RowOrder fRowOrder; - const size_t fRLEBytes; - const bool fIsIco; + static SkCodec* NewFromStream(SkStream*, bool inIco); + + const uint16_t fBitsPerPixel; + const RowOrder fRowOrder; typedef SkCodec INHERITED; }; + +#endif |