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