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) 21typedef uint8_t uint8; 22typedef uint32_t uint32; 23 24template <typename T> class scoped_array { 25private: 26 T* ptr_; 27 scoped_array(scoped_array const&); 28 scoped_array& operator=(const scoped_array&); 29 30public: 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 50namespace image_codec { 51 52class 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 70class 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