1 2 /* 3 * Copyright 2007 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #ifndef IMAGE_CODEC_BMPDECODERHELPER_H__ 11 #define IMAGE_CODEC_BMPDECODERHELPER_H__ 12 13 /////////////////////////////////////////////////////////////////////////////// 14 // this section is my current "glue" between google3 code and android. 15 // will be fixed soon 16 17 #include "SkTypes.h" 18 #include <limits.h> 19 #define DISALLOW_EVIL_CONSTRUCTORS(name) 20 #define CHECK(predicate) SkASSERT(predicate) 21 typedef uint8_t uint8; 22 typedef uint32_t uint32; 23 24 template <typename T> class scoped_array { 25 private: 26 T* ptr_; 27 scoped_array(scoped_array const&); 28 scoped_array& operator=(const scoped_array&); 29 30 public: 31 explicit scoped_array(T* p = 0) : ptr_(p) {} 32 ~scoped_array() { 33 delete[] ptr_; 34 } 35 36 void reset(T* p = 0) { 37 if (p != ptr_) { 38 delete[] ptr_; 39 ptr_ = p; 40 } 41 } 42 43 T& operator[](int i) const { 44 return ptr_[i]; 45 } 46 }; 47 48 /////////////////////////////////////////////////////////////////////////////// 49 50 namespace image_codec { 51 52 class BmpDecoderCallback { 53 public: 54 BmpDecoderCallback() { } 55 virtual ~BmpDecoderCallback() {} 56 57 /** 58 * This is called once for an image. It is passed the width and height and 59 * should return the address of a buffer that is large enough to store 60 * all of the resulting pixels (widht * height * 3 bytes). If it returns NULL, 61 * then the decoder will abort, but return true, as the caller has received 62 * valid dimensions. 63 */ 64 virtual uint8* SetSize(int width, int height) = 0; 65 66 private: 67 DISALLOW_EVIL_CONSTRUCTORS(BmpDecoderCallback); 68 }; 69 70 class BmpDecoderHelper { 71 public: 72 BmpDecoderHelper() { } 73 ~BmpDecoderHelper() { } 74 bool DecodeImage(const char* data, 75 size_t len, 76 int max_pixels, 77 BmpDecoderCallback* callback); 78 79 private: 80 DISALLOW_EVIL_CONSTRUCTORS(BmpDecoderHelper); 81 82 void DoRLEDecode(); 83 void DoStandardDecode(); 84 void PutPixel(int x, int y, uint8 col); 85 86 int GetInt(); 87 int GetShort(); 88 uint8 GetByte(); 89 int CalcShiftRight(uint32 mask); 90 int CalcShiftLeft(uint32 mask); 91 92 const uint8* data_; 93 size_t pos_; 94 size_t len_; 95 int width_; 96 int height_; 97 int bpp_; 98 int pixelPad_; 99 int rowPad_; 100 scoped_array<uint8> colTab_; 101 uint32 redBits_; 102 uint32 greenBits_; 103 uint32 blueBits_; 104 int redShiftRight_; 105 int greenShiftRight_; 106 int blueShiftRight_; 107 int redShiftLeft_; 108 int greenShiftLeft_; 109 int blueShiftLeft_; 110 uint8* output_; 111 bool inverted_; 112 }; 113 114 } // namespace 115 116 #endif 117