blob: 65b0180f98fb6d46710bc1c3c6d36f8c1a499b26 [file] [log] [blame]
msarett4ab9d5f2015-08-06 15:34:42 -07001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkBmpCodec.h"
9#include "SkColorTable.h"
10#include "SkImageInfo.h"
11#include "SkTypes.h"
12
13/*
14 * This class implements the decoding for bmp images that use an RLE encoding
15 */
16class SkBmpRLECodec : public SkBmpCodec {
17public:
18
19 /*
20 * Creates an instance of the decoder
21 *
22 * Called only by SkBmpCodec::NewFromStream
23 * There should be no other callers despite this being public
24 *
25 * @param srcInfo contains the source width and height
26 * @param stream the stream of encoded image data
27 * @param bitsPerPixel the number of bits used to store each pixel
28 * @param numColors the number of colors in the color table
29 * @param bytesPerColor the number of bytes in the stream used to represent
30 each color in the color table
31 * @param offset the offset of the image pixel data from the end of the
32 * headers
33 * @param rowOrder indicates whether rows are ordered top-down or bottom-up
34 * @param RLEBytes indicates the amount of data left in the stream
35 * after decoding the headers
36 */
37 SkBmpRLECodec(const SkImageInfo& srcInfo, SkStream* stream,
38 uint16_t bitsPerPixel, uint32_t numColors,
39 uint32_t bytesPerColor, uint32_t offset,
40 SkBmpCodec::RowOrder rowOrder, size_t RLEBytes);
41
42protected:
43
44 Result onGetPixels(const SkImageInfo& dstInfo, void* dst,
45 size_t dstRowBytes, const Options&, SkPMColor*,
46 int*) override;
47
48private:
49
50 /*
51 * Creates the color table
halcanary96fcdcc2015-08-27 07:41:13 -070052 * Sets colorCount to the new color count if it is non-nullptr
msarett4ab9d5f2015-08-06 15:34:42 -070053 */
54 bool createColorTable(int* colorCount);
55
56 bool initializeStreamBuffer();
57
58 /*
msarettd0375bc2015-08-12 08:08:56 -070059 * Before signalling kIncompleteInput, we should attempt to load the
60 * stream buffer with additional data.
61 *
62 * @return the number of bytes remaining in the stream buffer after
63 * attempting to read more bytes from the stream
64 */
65 size_t checkForMoreData();
66
67 /*
msarett4ab9d5f2015-08-06 15:34:42 -070068 * Set an RLE pixel using the color table
69 */
70 void setPixel(void* dst, size_t dstRowBytes,
71 const SkImageInfo& dstInfo, uint32_t x, uint32_t y,
72 uint8_t index);
73 /*
74 * Set an RLE24 pixel from R, G, B values
75 */
76 void setRGBPixel(void* dst, size_t dstRowBytes,
77 const SkImageInfo& dstInfo, uint32_t x, uint32_t y,
78 uint8_t red, uint8_t green, uint8_t blue);
79
80 /*
81 * Performs the bitmap decoding for RLE input format
82 */
83 Result decode(const SkImageInfo& dstInfo, void* dst,
84 size_t dstRowBytes, const Options& opts);
85
86 SkAutoTUnref<SkColorTable> fColorTable; // owned
87 const uint32_t fNumColors;
88 const uint32_t fBytesPerColor;
89 const uint32_t fOffset;
90 SkAutoTDeleteArray<uint8_t> fStreamBuffer;
91 size_t fRLEBytes;
92 uint32_t fCurrRLEByte;
93
94 typedef SkBmpCodec INHERITED;
95};