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