OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2007 The Android Open Source Project | 3 * Copyright 2007 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 // Author: cevans@google.com (Chris Evans) | 9 // Author: cevans@google.com (Chris Evans) |
10 | 10 |
11 #include "bmpdecoderhelper.h" | 11 #include "bmpdecoderhelper.h" |
12 | 12 |
13 namespace image_codec { | 13 namespace image_codec { |
14 | 14 |
15 static const int kBmpHeaderSize = 14; | 15 static const int kBmpHeaderSize = 14; |
16 static const int kBmpInfoSize = 40; | 16 static const int kBmpInfoSize = 40; |
17 static const int kBmpOS2InfoSize = 12; | 17 static const int kBmpOS2InfoSize = 12; |
18 static const int kMaxDim = SHRT_MAX / 2; | 18 static const int kMaxDim = SHRT_MAX / 2; |
19 | 19 |
20 bool BmpDecoderHelper::DecodeImage(const char* p, | 20 bool BmpDecoderHelper::DecodeImage(const char* p, |
21 int len, | 21 size_t len, |
22 int max_pixels, | 22 int max_pixels, |
23 BmpDecoderCallback* callback) { | 23 BmpDecoderCallback* callback) { |
24 data_ = reinterpret_cast<const uint8*>(p); | 24 data_ = reinterpret_cast<const uint8*>(p); |
25 pos_ = 0; | 25 pos_ = 0; |
26 len_ = len; | 26 len_ = len; |
27 inverted_ = true; | 27 inverted_ = true; |
28 // Parse the header structure. | 28 // Parse the header structure. |
29 if (len < kBmpHeaderSize + 4) { | 29 if (len < kBmpHeaderSize + 4) { |
30 return false; | 30 return false; |
31 } | 31 } |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 return true; | 175 return true; |
176 } | 176 } |
177 | 177 |
178 void BmpDecoderHelper::DoRLEDecode() { | 178 void BmpDecoderHelper::DoRLEDecode() { |
179 static const uint8 RLE_ESCAPE = 0; | 179 static const uint8 RLE_ESCAPE = 0; |
180 static const uint8 RLE_EOL = 0; | 180 static const uint8 RLE_EOL = 0; |
181 static const uint8 RLE_EOF = 1; | 181 static const uint8 RLE_EOF = 1; |
182 static const uint8 RLE_DELTA = 2; | 182 static const uint8 RLE_DELTA = 2; |
183 int x = 0; | 183 int x = 0; |
184 int y = height_ - 1; | 184 int y = height_ - 1; |
185 while (pos_ < len_ - 1) { | 185 while (pos_ + 1 < len_) { |
186 uint8 cmd = GetByte(); | 186 uint8 cmd = GetByte(); |
187 if (cmd != RLE_ESCAPE) { | 187 if (cmd != RLE_ESCAPE) { |
188 uint8 pixels = GetByte(); | 188 uint8 pixels = GetByte(); |
189 int num = 0; | 189 int num = 0; |
190 uint8 col = pixels; | 190 uint8 col = pixels; |
191 while (cmd-- && x < width_) { | 191 while (cmd-- && x < width_) { |
192 if (bpp_ == 4) { | 192 if (bpp_ == 4) { |
193 if (num & 1) { | 193 if (num & 1) { |
194 col = pixels & 0xf; | 194 col = pixels & 0xf; |
195 } else { | 195 } else { |
196 col = pixels >> 4; | 196 col = pixels >> 4; |
197 } | 197 } |
198 } | 198 } |
199 PutPixel(x++, y, col); | 199 PutPixel(x++, y, col); |
200 num++; | 200 num++; |
201 } | 201 } |
202 } else { | 202 } else { |
203 cmd = GetByte(); | 203 cmd = GetByte(); |
204 if (cmd == RLE_EOF) { | 204 if (cmd == RLE_EOF) { |
205 return; | 205 return; |
206 } else if (cmd == RLE_EOL) { | 206 } else if (cmd == RLE_EOL) { |
207 x = 0; | 207 x = 0; |
208 y--; | 208 y--; |
209 if (y < 0) { | 209 if (y < 0) { |
210 return; | 210 return; |
211 } | 211 } |
212 } else if (cmd == RLE_DELTA) { | 212 } else if (cmd == RLE_DELTA) { |
213 if (pos_ < len_ - 1) { | 213 if (pos_ + 1 < len_) { |
214 uint8 dx = GetByte(); | 214 uint8 dx = GetByte(); |
215 uint8 dy = GetByte(); | 215 uint8 dy = GetByte(); |
216 x += dx; | 216 x += dx; |
217 if (x > width_) { | 217 if (x > width_) { |
218 x = width_; | 218 x = width_; |
219 } | 219 } |
220 y -= dy; | 220 y -= dy; |
221 if (y < 0) { | 221 if (y < 0) { |
222 return; | 222 return; |
223 } | 223 } |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 mask >>= 1; | 360 mask >>= 1; |
361 } | 361 } |
362 while (mask != 0 && !(mask & 0x80)) { | 362 while (mask != 0 && !(mask & 0x80)) { |
363 mask <<= 1; | 363 mask <<= 1; |
364 ret++; | 364 ret++; |
365 } | 365 } |
366 return ret; | 366 return ret; |
367 } | 367 } |
368 | 368 |
369 } // namespace image_codec | 369 } // namespace image_codec |
OLD | NEW |