11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2007 The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef IMAGE_CODEC_BMPDECODERHELPER_H__
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define IMAGE_CODEC_BMPDECODERHELPER_H__
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// this section is my current "glue" between google3 code and android.
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// will be fixed soon
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTypes.h"
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include <limits.h>
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DISALLOW_EVIL_CONSTRUCTORS(name)
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECK(predicate)  SkASSERT(predicate)
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projecttypedef uint8_t uint8;
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projecttypedef uint32_t uint32;
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projecttemplate <typename T> class scoped_array {
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  T* ptr_;
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  scoped_array(scoped_array const&);
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  scoped_array& operator=(const scoped_array&);
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  explicit scoped_array(T* p = 0) : ptr_(p) {}
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  ~scoped_array() {
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    delete[] ptr_;
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  }
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  void reset(T* p = 0) {
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (p != ptr_) {
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project      delete[] ptr_;
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project      ptr_ = p;
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  }
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  T& operator[](int i) const {
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return ptr_[i];
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  }
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectnamespace image_codec {
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass BmpDecoderCallback {
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project public:
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  BmpDecoderCallback() { }
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  virtual ~BmpDecoderCallback() {}
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  /**
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project   * This is called once for an image. It is passed the width and height and
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project   * should return the address of a buffer that is large enough to store
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project   * all of the resulting pixels (widht * height * 3 bytes). If it returns NULL,
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project   * then the decoder will abort, but return true, as the caller has received
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project   * valid dimensions.
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project   */
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  virtual uint8* SetSize(int width, int height) = 0;
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project private:
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  DISALLOW_EVIL_CONSTRUCTORS(BmpDecoderCallback);
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass BmpDecoderHelper {
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project public:
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  BmpDecoderHelper() { }
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  ~BmpDecoderHelper() { }
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  bool DecodeImage(const char* data,
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                   int len,
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                   int max_pixels,
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                   BmpDecoderCallback* callback);
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project private:
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  DISALLOW_EVIL_CONSTRUCTORS(BmpDecoderHelper);
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  void DoRLEDecode();
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  void DoStandardDecode();
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  void PutPixel(int x, int y, uint8 col);
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int GetInt();
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int GetShort();
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  uint8 GetByte();
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int CalcShiftRight(uint32 mask);
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int CalcShiftLeft(uint32 mask);
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  const uint8* data_;
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int pos_;
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int len_;
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int width_;
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int height_;
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int bpp_;
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int pixelPad_;
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int rowPad_;
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  scoped_array<uint8> colTab_;
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  uint32 redBits_;
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  uint32 greenBits_;
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  uint32 blueBits_;
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int redShiftRight_;
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int greenShiftRight_;
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int blueShiftRight_;
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int redShiftLeft_;
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int greenShiftLeft_;
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  int blueShiftLeft_;
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  uint8* output_;
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project  bool inverted_;
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} // namespace
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
117