Liangzhen Lai / Mbed 2 deprecated Orange_Ferrari_board_functional

Dependencies:   DDRO_Farrari mbed

Fork of DDRO_Farrari by Liangzhen Lai

Committer:
liangzhen
Date:
Mon Oct 07 22:58:19 2013 +0000
Revision:
0:84a8bcfbdec9
power sensor tested;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
liangzhen 0:84a8bcfbdec9 1 /*************************************************
liangzhen 0:84a8bcfbdec9 2 * *
liangzhen 0:84a8bcfbdec9 3 * EasyBMP Cross-Platform Windows Bitmap Library *
liangzhen 0:84a8bcfbdec9 4 * *
liangzhen 0:84a8bcfbdec9 5 * Author: Paul Macklin *
liangzhen 0:84a8bcfbdec9 6 * email: macklin01@users.sourceforge.net *
liangzhen 0:84a8bcfbdec9 7 * support: http://easybmp.sourceforge.net *
liangzhen 0:84a8bcfbdec9 8 * *
liangzhen 0:84a8bcfbdec9 9 * file: EasyBMP.cpp *
liangzhen 0:84a8bcfbdec9 10 * date added: 03-31-2006 *
liangzhen 0:84a8bcfbdec9 11 * date modified: 12-01-2006 *
liangzhen 0:84a8bcfbdec9 12 * version: 1.06 *
liangzhen 0:84a8bcfbdec9 13 * *
liangzhen 0:84a8bcfbdec9 14 * License: BSD (revised/modified) *
liangzhen 0:84a8bcfbdec9 15 * Copyright: 2005-6 by the EasyBMP Project *
liangzhen 0:84a8bcfbdec9 16 * *
liangzhen 0:84a8bcfbdec9 17 * description: Actual source file *
liangzhen 0:84a8bcfbdec9 18 * *
liangzhen 0:84a8bcfbdec9 19 *************************************************/
liangzhen 0:84a8bcfbdec9 20
liangzhen 0:84a8bcfbdec9 21 #include "EasyBMP.h"
liangzhen 0:84a8bcfbdec9 22
liangzhen 0:84a8bcfbdec9 23 /* These functions are defined in EasyBMP_DataStructures.h */
liangzhen 0:84a8bcfbdec9 24
liangzhen 0:84a8bcfbdec9 25 int ceildiv(int n, int d)
liangzhen 0:84a8bcfbdec9 26 {
liangzhen 0:84a8bcfbdec9 27 return 1 + ((n - 1) / d);
liangzhen 0:84a8bcfbdec9 28 }
liangzhen 0:84a8bcfbdec9 29
liangzhen 0:84a8bcfbdec9 30 int IntPow( int base, int exponent )
liangzhen 0:84a8bcfbdec9 31 {
liangzhen 0:84a8bcfbdec9 32 int i;
liangzhen 0:84a8bcfbdec9 33 int output = 1;
liangzhen 0:84a8bcfbdec9 34 for( i=0 ; i < exponent ; i++ )
liangzhen 0:84a8bcfbdec9 35 { output *= base; }
liangzhen 0:84a8bcfbdec9 36 return output;
liangzhen 0:84a8bcfbdec9 37 }
liangzhen 0:84a8bcfbdec9 38
liangzhen 0:84a8bcfbdec9 39 BMFH::BMFH()
liangzhen 0:84a8bcfbdec9 40 {
liangzhen 0:84a8bcfbdec9 41 bfType = 19778;
liangzhen 0:84a8bcfbdec9 42 bfReserved1 = 0;
liangzhen 0:84a8bcfbdec9 43 bfReserved2 = 0;
liangzhen 0:84a8bcfbdec9 44 }
liangzhen 0:84a8bcfbdec9 45
liangzhen 0:84a8bcfbdec9 46 BMIH::BMIH()
liangzhen 0:84a8bcfbdec9 47 {
liangzhen 0:84a8bcfbdec9 48 biPlanes = 1;
liangzhen 0:84a8bcfbdec9 49 biCompression = 0;
liangzhen 0:84a8bcfbdec9 50 biXPelsPerMeter = DefaultXPelsPerMeter;
liangzhen 0:84a8bcfbdec9 51 biYPelsPerMeter = DefaultYPelsPerMeter;
liangzhen 0:84a8bcfbdec9 52 biClrUsed = 0;
liangzhen 0:84a8bcfbdec9 53 biClrImportant = 0;
liangzhen 0:84a8bcfbdec9 54 }
liangzhen 0:84a8bcfbdec9 55
liangzhen 0:84a8bcfbdec9 56
liangzhen 0:84a8bcfbdec9 57 /* These functions are defined in EasyBMP_BMP.h */
liangzhen 0:84a8bcfbdec9 58
liangzhen 0:84a8bcfbdec9 59 unsigned char BMP::GetPixel( int i, int j ) const
liangzhen 0:84a8bcfbdec9 60 {
liangzhen 0:84a8bcfbdec9 61 if(PixelsBW[i / 32][j] & ( 0x1 << (31 - i % 32))){
liangzhen 0:84a8bcfbdec9 62 return 1; // white
liangzhen 0:84a8bcfbdec9 63 }else{
liangzhen 0:84a8bcfbdec9 64 return 0; // black
liangzhen 0:84a8bcfbdec9 65 }
liangzhen 0:84a8bcfbdec9 66 }
liangzhen 0:84a8bcfbdec9 67
liangzhen 0:84a8bcfbdec9 68 bool BMP::SetPixel( int i, int j )
liangzhen 0:84a8bcfbdec9 69 {
liangzhen 0:84a8bcfbdec9 70 PixelsR[i / 32][j] |= ( 0x1 << (31 - i % 32));
liangzhen 0:84a8bcfbdec9 71 return true;
liangzhen 0:84a8bcfbdec9 72 }
liangzhen 0:84a8bcfbdec9 73
liangzhen 0:84a8bcfbdec9 74 BMP::BMP()
liangzhen 0:84a8bcfbdec9 75 {
liangzhen 0:84a8bcfbdec9 76 Width = 1;
liangzhen 0:84a8bcfbdec9 77 Height = 1;
liangzhen 0:84a8bcfbdec9 78 BitDepth = 24;
liangzhen 0:84a8bcfbdec9 79 PixelsBW = new unsigned int* [1];
liangzhen 0:84a8bcfbdec9 80 PixelsBW[0] = new unsigned int [1];
liangzhen 0:84a8bcfbdec9 81 PixelsR = new unsigned int* [1];
liangzhen 0:84a8bcfbdec9 82 PixelsR[0] = new unsigned int [1];
liangzhen 0:84a8bcfbdec9 83
liangzhen 0:84a8bcfbdec9 84 Colors = NULL;
liangzhen 0:84a8bcfbdec9 85
liangzhen 0:84a8bcfbdec9 86 XPelsPerMeter = 0;
liangzhen 0:84a8bcfbdec9 87 YPelsPerMeter = 0;
liangzhen 0:84a8bcfbdec9 88
liangzhen 0:84a8bcfbdec9 89 MetaData1 = NULL;
liangzhen 0:84a8bcfbdec9 90 SizeOfMetaData1 = 0;
liangzhen 0:84a8bcfbdec9 91 MetaData2 = NULL;
liangzhen 0:84a8bcfbdec9 92 SizeOfMetaData2 = 0;
liangzhen 0:84a8bcfbdec9 93 }
liangzhen 0:84a8bcfbdec9 94
liangzhen 0:84a8bcfbdec9 95
liangzhen 0:84a8bcfbdec9 96 BMP::~BMP()
liangzhen 0:84a8bcfbdec9 97 {
liangzhen 0:84a8bcfbdec9 98 int i;
liangzhen 0:84a8bcfbdec9 99 for(i=0;i<ceildiv(Width,32);i++)
liangzhen 0:84a8bcfbdec9 100 { delete [] PixelsBW[i]; }
liangzhen 0:84a8bcfbdec9 101 delete [] PixelsBW;
liangzhen 0:84a8bcfbdec9 102
liangzhen 0:84a8bcfbdec9 103 for(i=0;i<ceildiv(Width,32);i++)
liangzhen 0:84a8bcfbdec9 104 { delete [] PixelsR[i]; }
liangzhen 0:84a8bcfbdec9 105 delete [] PixelsR;
liangzhen 0:84a8bcfbdec9 106
liangzhen 0:84a8bcfbdec9 107 if( Colors )
liangzhen 0:84a8bcfbdec9 108 { delete [] Colors; }
liangzhen 0:84a8bcfbdec9 109
liangzhen 0:84a8bcfbdec9 110 if( MetaData1 )
liangzhen 0:84a8bcfbdec9 111 { delete [] MetaData1; }
liangzhen 0:84a8bcfbdec9 112 if( MetaData2 )
liangzhen 0:84a8bcfbdec9 113 { delete [] MetaData2; }
liangzhen 0:84a8bcfbdec9 114 }
liangzhen 0:84a8bcfbdec9 115
liangzhen 0:84a8bcfbdec9 116 // int BMP::TellBitDepth( void ) const
liangzhen 0:84a8bcfbdec9 117 int BMP::TellBitDepth( void )
liangzhen 0:84a8bcfbdec9 118 { return BitDepth; }
liangzhen 0:84a8bcfbdec9 119
liangzhen 0:84a8bcfbdec9 120 // int BMP::TellHeight( void ) const
liangzhen 0:84a8bcfbdec9 121 int BMP::TellHeight( void )
liangzhen 0:84a8bcfbdec9 122 { return Height; }
liangzhen 0:84a8bcfbdec9 123
liangzhen 0:84a8bcfbdec9 124 // int BMP::TellWidth( void ) const
liangzhen 0:84a8bcfbdec9 125 int BMP::TellWidth( void )
liangzhen 0:84a8bcfbdec9 126 { return Width; }
liangzhen 0:84a8bcfbdec9 127
liangzhen 0:84a8bcfbdec9 128 // int BMP::TellNumberOfColors( void ) const
liangzhen 0:84a8bcfbdec9 129 int BMP::TellNumberOfColors( void )
liangzhen 0:84a8bcfbdec9 130 {
liangzhen 0:84a8bcfbdec9 131 int output = IntPow( 2, BitDepth );
liangzhen 0:84a8bcfbdec9 132 return output;
liangzhen 0:84a8bcfbdec9 133 }
liangzhen 0:84a8bcfbdec9 134
liangzhen 0:84a8bcfbdec9 135 bool BMP::SetBitDepth( int NewDepth )
liangzhen 0:84a8bcfbdec9 136 {
liangzhen 0:84a8bcfbdec9 137 using namespace std;
liangzhen 0:84a8bcfbdec9 138 if( NewDepth != 1 && NewDepth != 4)
liangzhen 0:84a8bcfbdec9 139 {
liangzhen 0:84a8bcfbdec9 140 return false;
liangzhen 0:84a8bcfbdec9 141 }
liangzhen 0:84a8bcfbdec9 142
liangzhen 0:84a8bcfbdec9 143 BitDepth = NewDepth;
liangzhen 0:84a8bcfbdec9 144 if( Colors )
liangzhen 0:84a8bcfbdec9 145 { delete [] Colors; }
liangzhen 0:84a8bcfbdec9 146 int NumberOfColors = IntPow( 2, BitDepth );
liangzhen 0:84a8bcfbdec9 147
liangzhen 0:84a8bcfbdec9 148 { Colors = new RGBApixel [NumberOfColors]; }
liangzhen 0:84a8bcfbdec9 149 { CreateStandardColorTable(); }
liangzhen 0:84a8bcfbdec9 150
liangzhen 0:84a8bcfbdec9 151 return true;
liangzhen 0:84a8bcfbdec9 152 }
liangzhen 0:84a8bcfbdec9 153
liangzhen 0:84a8bcfbdec9 154 bool BMP::SetSize(int NewWidth , int NewHeight )
liangzhen 0:84a8bcfbdec9 155 {
liangzhen 0:84a8bcfbdec9 156 using namespace std;
liangzhen 0:84a8bcfbdec9 157 if( NewWidth <= 0 || NewHeight <= 0 )
liangzhen 0:84a8bcfbdec9 158 {
liangzhen 0:84a8bcfbdec9 159 return false;
liangzhen 0:84a8bcfbdec9 160 }
liangzhen 0:84a8bcfbdec9 161
liangzhen 0:84a8bcfbdec9 162 int i,j;
liangzhen 0:84a8bcfbdec9 163
liangzhen 0:84a8bcfbdec9 164 for(i=0;i<ceildiv(Width,32);i++)
liangzhen 0:84a8bcfbdec9 165 { delete [] PixelsBW[i]; }
liangzhen 0:84a8bcfbdec9 166 delete [] PixelsBW;
liangzhen 0:84a8bcfbdec9 167
liangzhen 0:84a8bcfbdec9 168 for(i=0;i<ceildiv(Width,32);i++)
liangzhen 0:84a8bcfbdec9 169 { delete [] PixelsR[i]; }
liangzhen 0:84a8bcfbdec9 170 delete [] PixelsR;
liangzhen 0:84a8bcfbdec9 171
liangzhen 0:84a8bcfbdec9 172 Width = NewWidth;
liangzhen 0:84a8bcfbdec9 173 Height = NewHeight;
liangzhen 0:84a8bcfbdec9 174 PixelsBW = new unsigned int* [ ceildiv(Width,32) ];
liangzhen 0:84a8bcfbdec9 175 PixelsR = new unsigned int* [ ceildiv(Width,32) ];
liangzhen 0:84a8bcfbdec9 176
liangzhen 0:84a8bcfbdec9 177 for(i=0;i<ceildiv(Width,32);i++){
liangzhen 0:84a8bcfbdec9 178 PixelsBW[i] = new unsigned int [ Height ];
liangzhen 0:84a8bcfbdec9 179 PixelsR[i] = new unsigned int [ Height ];
liangzhen 0:84a8bcfbdec9 180 for( j=0 ; j < Height ; j++ ){
liangzhen 0:84a8bcfbdec9 181 PixelsBW[i][j] = 0;
liangzhen 0:84a8bcfbdec9 182 PixelsR[i][j] = 0;
liangzhen 0:84a8bcfbdec9 183 }
liangzhen 0:84a8bcfbdec9 184 }
liangzhen 0:84a8bcfbdec9 185
liangzhen 0:84a8bcfbdec9 186 return true;
liangzhen 0:84a8bcfbdec9 187 }
liangzhen 0:84a8bcfbdec9 188 #include<iostream>
liangzhen 0:84a8bcfbdec9 189
liangzhen 0:84a8bcfbdec9 190 bool BMP::WriteToFile( const char* FileName )
liangzhen 0:84a8bcfbdec9 191 {
liangzhen 0:84a8bcfbdec9 192
liangzhen 0:84a8bcfbdec9 193 using namespace std;
liangzhen 0:84a8bcfbdec9 194
liangzhen 0:84a8bcfbdec9 195 cout << "called" << endl;
liangzhen 0:84a8bcfbdec9 196 if( !EasyBMPcheckDataSize() )
liangzhen 0:84a8bcfbdec9 197 {
liangzhen 0:84a8bcfbdec9 198 return false;
liangzhen 0:84a8bcfbdec9 199 }
liangzhen 0:84a8bcfbdec9 200
liangzhen 0:84a8bcfbdec9 201 FILE* fp = fopen( FileName, "wb" );
liangzhen 0:84a8bcfbdec9 202
liangzhen 0:84a8bcfbdec9 203
liangzhen 0:84a8bcfbdec9 204 if( fp == NULL )
liangzhen 0:84a8bcfbdec9 205 {
liangzhen 0:84a8bcfbdec9 206 cout << "can't write\r\n" << endl;
liangzhen 0:84a8bcfbdec9 207 fclose( fp );
liangzhen 0:84a8bcfbdec9 208 return false;
liangzhen 0:84a8bcfbdec9 209 }
liangzhen 0:84a8bcfbdec9 210
liangzhen 0:84a8bcfbdec9 211 // some preliminaries
liangzhen 0:84a8bcfbdec9 212
liangzhen 0:84a8bcfbdec9 213 double dBytesPerPixel = ( (double) BitDepth ) / 8.0;
liangzhen 0:84a8bcfbdec9 214 double dBytesPerRow = dBytesPerPixel * (Width+0.0);
liangzhen 0:84a8bcfbdec9 215 dBytesPerRow = ceil(dBytesPerRow);
liangzhen 0:84a8bcfbdec9 216
liangzhen 0:84a8bcfbdec9 217 int BytePaddingPerRow = 4 - ( (int) (dBytesPerRow) )% 4;
liangzhen 0:84a8bcfbdec9 218 if( BytePaddingPerRow == 4 )
liangzhen 0:84a8bcfbdec9 219 { BytePaddingPerRow = 0; }
liangzhen 0:84a8bcfbdec9 220
liangzhen 0:84a8bcfbdec9 221 double dActualBytesPerRow = dBytesPerRow + BytePaddingPerRow;
liangzhen 0:84a8bcfbdec9 222
liangzhen 0:84a8bcfbdec9 223 double dTotalPixelBytes = Height * dActualBytesPerRow;
liangzhen 0:84a8bcfbdec9 224
liangzhen 0:84a8bcfbdec9 225 double dPaletteSize = 0;
liangzhen 0:84a8bcfbdec9 226 if( BitDepth == 1 || BitDepth == 4)
liangzhen 0:84a8bcfbdec9 227 { dPaletteSize = IntPow(2,BitDepth)*4.0; }
liangzhen 0:84a8bcfbdec9 228
liangzhen 0:84a8bcfbdec9 229 double dTotalFileSize = 14 + 40 + dPaletteSize + dTotalPixelBytes;
liangzhen 0:84a8bcfbdec9 230
liangzhen 0:84a8bcfbdec9 231 // write the file header
liangzhen 0:84a8bcfbdec9 232
liangzhen 0:84a8bcfbdec9 233 BMFH bmfh;
liangzhen 0:84a8bcfbdec9 234 bmfh.bfSize = (ebmpDWORD) dTotalFileSize;
liangzhen 0:84a8bcfbdec9 235 bmfh.bfReserved1 = 0;
liangzhen 0:84a8bcfbdec9 236 bmfh.bfReserved2 = 0;
liangzhen 0:84a8bcfbdec9 237 bmfh.bfOffBits = (ebmpDWORD) (14+40+dPaletteSize);
liangzhen 0:84a8bcfbdec9 238
liangzhen 0:84a8bcfbdec9 239 fwrite( (char*) &(bmfh.bfType) , sizeof(ebmpWORD) , 1 , fp );
liangzhen 0:84a8bcfbdec9 240 fwrite( (char*) &(bmfh.bfSize) , sizeof(ebmpDWORD) , 1 , fp );
liangzhen 0:84a8bcfbdec9 241 fwrite( (char*) &(bmfh.bfReserved1) , sizeof(ebmpWORD) , 1 , fp );
liangzhen 0:84a8bcfbdec9 242 fwrite( (char*) &(bmfh.bfReserved2) , sizeof(ebmpWORD) , 1 , fp );
liangzhen 0:84a8bcfbdec9 243 fwrite( (char*) &(bmfh.bfOffBits) , sizeof(ebmpDWORD) , 1 , fp );
liangzhen 0:84a8bcfbdec9 244
liangzhen 0:84a8bcfbdec9 245 // write the info header
liangzhen 0:84a8bcfbdec9 246
liangzhen 0:84a8bcfbdec9 247 BMIH bmih;
liangzhen 0:84a8bcfbdec9 248 bmih.biSize = 40;
liangzhen 0:84a8bcfbdec9 249 bmih.biWidth = Width;
liangzhen 0:84a8bcfbdec9 250 bmih.biHeight = Height;
liangzhen 0:84a8bcfbdec9 251 bmih.biPlanes = 1;
liangzhen 0:84a8bcfbdec9 252 bmih.biBitCount = BitDepth;
liangzhen 0:84a8bcfbdec9 253 bmih.biCompression = 0;
liangzhen 0:84a8bcfbdec9 254 bmih.biSizeImage = (ebmpDWORD) dTotalPixelBytes;
liangzhen 0:84a8bcfbdec9 255 if( XPelsPerMeter )
liangzhen 0:84a8bcfbdec9 256 { bmih.biXPelsPerMeter = XPelsPerMeter; }
liangzhen 0:84a8bcfbdec9 257 else
liangzhen 0:84a8bcfbdec9 258 { bmih.biXPelsPerMeter = DefaultXPelsPerMeter; }
liangzhen 0:84a8bcfbdec9 259 if( YPelsPerMeter )
liangzhen 0:84a8bcfbdec9 260 { bmih.biYPelsPerMeter = YPelsPerMeter; }
liangzhen 0:84a8bcfbdec9 261 else
liangzhen 0:84a8bcfbdec9 262 { bmih.biYPelsPerMeter = DefaultYPelsPerMeter; }
liangzhen 0:84a8bcfbdec9 263
liangzhen 0:84a8bcfbdec9 264 bmih.biClrUsed = 0;
liangzhen 0:84a8bcfbdec9 265 bmih.biClrImportant = 0;
liangzhen 0:84a8bcfbdec9 266
liangzhen 0:84a8bcfbdec9 267 // indicates that we'll be using bit fields for 16-bit files
liangzhen 0:84a8bcfbdec9 268 if( BitDepth == 16 )
liangzhen 0:84a8bcfbdec9 269 { bmih.biCompression = 3; }
liangzhen 0:84a8bcfbdec9 270
liangzhen 0:84a8bcfbdec9 271 fwrite( (char*) &(bmih.biSize) , sizeof(ebmpDWORD) , 1 , fp );
liangzhen 0:84a8bcfbdec9 272 fwrite( (char*) &(bmih.biWidth) , sizeof(ebmpDWORD) , 1 , fp );
liangzhen 0:84a8bcfbdec9 273 fwrite( (char*) &(bmih.biHeight) , sizeof(ebmpDWORD) , 1 , fp );
liangzhen 0:84a8bcfbdec9 274 fwrite( (char*) &(bmih.biPlanes) , sizeof(ebmpWORD) , 1 , fp );
liangzhen 0:84a8bcfbdec9 275 fwrite( (char*) &(bmih.biBitCount) , sizeof(ebmpWORD) , 1 , fp );
liangzhen 0:84a8bcfbdec9 276 fwrite( (char*) &(bmih.biCompression) , sizeof(ebmpDWORD) , 1 , fp );
liangzhen 0:84a8bcfbdec9 277 fwrite( (char*) &(bmih.biSizeImage) , sizeof(ebmpDWORD) , 1 , fp );
liangzhen 0:84a8bcfbdec9 278 fwrite( (char*) &(bmih.biXPelsPerMeter) , sizeof(ebmpDWORD) , 1 , fp );
liangzhen 0:84a8bcfbdec9 279 fwrite( (char*) &(bmih.biYPelsPerMeter) , sizeof(ebmpDWORD) , 1 , fp );
liangzhen 0:84a8bcfbdec9 280 fwrite( (char*) &(bmih.biClrUsed) , sizeof(ebmpDWORD) , 1 , fp);
liangzhen 0:84a8bcfbdec9 281 fwrite( (char*) &(bmih.biClrImportant) , sizeof(ebmpDWORD) , 1 , fp);
liangzhen 0:84a8bcfbdec9 282
liangzhen 0:84a8bcfbdec9 283 // write the palette
liangzhen 0:84a8bcfbdec9 284 if( BitDepth == 1 || BitDepth == 4 )
liangzhen 0:84a8bcfbdec9 285 {
liangzhen 0:84a8bcfbdec9 286 int NumberOfColors = IntPow(2,BitDepth);
liangzhen 0:84a8bcfbdec9 287
liangzhen 0:84a8bcfbdec9 288 // if there is no palette, create one
liangzhen 0:84a8bcfbdec9 289 if( !Colors )
liangzhen 0:84a8bcfbdec9 290 {
liangzhen 0:84a8bcfbdec9 291 if( !Colors )
liangzhen 0:84a8bcfbdec9 292 { Colors = new RGBApixel [NumberOfColors]; }
liangzhen 0:84a8bcfbdec9 293 CreateStandardColorTable();
liangzhen 0:84a8bcfbdec9 294 }
liangzhen 0:84a8bcfbdec9 295
liangzhen 0:84a8bcfbdec9 296 int n;
liangzhen 0:84a8bcfbdec9 297 for( n=0 ; n < NumberOfColors ; n++ )
liangzhen 0:84a8bcfbdec9 298 { fwrite( (char*) &(Colors[n]) , 4 , 1 , fp ); }
liangzhen 0:84a8bcfbdec9 299 }
liangzhen 0:84a8bcfbdec9 300
liangzhen 0:84a8bcfbdec9 301 // write the pixels
liangzhen 0:84a8bcfbdec9 302 int j;
liangzhen 0:84a8bcfbdec9 303 {
liangzhen 0:84a8bcfbdec9 304 ebmpBYTE* Buffer;
liangzhen 0:84a8bcfbdec9 305 int BufferSize = (int) ( (Width*BitDepth)/8.0 );
liangzhen 0:84a8bcfbdec9 306 while( 8*BufferSize < Width*BitDepth )
liangzhen 0:84a8bcfbdec9 307 { BufferSize++; }
liangzhen 0:84a8bcfbdec9 308 while( BufferSize % 4 )
liangzhen 0:84a8bcfbdec9 309 { BufferSize++; }
liangzhen 0:84a8bcfbdec9 310
liangzhen 0:84a8bcfbdec9 311 Buffer = new ebmpBYTE [BufferSize];
liangzhen 0:84a8bcfbdec9 312 for( j=0 ; j < BufferSize; j++ )
liangzhen 0:84a8bcfbdec9 313 { Buffer[j] = 0; }
liangzhen 0:84a8bcfbdec9 314
liangzhen 0:84a8bcfbdec9 315 j=Height-1;
liangzhen 0:84a8bcfbdec9 316
liangzhen 0:84a8bcfbdec9 317 while( j > -1 )
liangzhen 0:84a8bcfbdec9 318 {
liangzhen 0:84a8bcfbdec9 319 bool Success = false;
liangzhen 0:84a8bcfbdec9 320 if( BitDepth == 4 )
liangzhen 0:84a8bcfbdec9 321 { Success = Write4bitRow( Buffer, BufferSize, j ); }
liangzhen 0:84a8bcfbdec9 322 if( Success )
liangzhen 0:84a8bcfbdec9 323 {
liangzhen 0:84a8bcfbdec9 324 int BytesWritten = (int) fwrite( (char*) Buffer, 1, BufferSize, fp );
liangzhen 0:84a8bcfbdec9 325 if( BytesWritten != BufferSize )
liangzhen 0:84a8bcfbdec9 326 { Success = false; }
liangzhen 0:84a8bcfbdec9 327 }
liangzhen 0:84a8bcfbdec9 328 if( !Success )
liangzhen 0:84a8bcfbdec9 329 {
liangzhen 0:84a8bcfbdec9 330 j = -1;
liangzhen 0:84a8bcfbdec9 331 }
liangzhen 0:84a8bcfbdec9 332 j--;
liangzhen 0:84a8bcfbdec9 333 }
liangzhen 0:84a8bcfbdec9 334
liangzhen 0:84a8bcfbdec9 335 delete [] Buffer;
liangzhen 0:84a8bcfbdec9 336 }
liangzhen 0:84a8bcfbdec9 337
liangzhen 0:84a8bcfbdec9 338 cout << "done " << endl;
liangzhen 0:84a8bcfbdec9 339 fclose(fp);
liangzhen 0:84a8bcfbdec9 340 return true;
liangzhen 0:84a8bcfbdec9 341 }
liangzhen 0:84a8bcfbdec9 342
liangzhen 0:84a8bcfbdec9 343 bool BMP::ReadFromFile( const char* FileName )
liangzhen 0:84a8bcfbdec9 344 {
liangzhen 0:84a8bcfbdec9 345 using namespace std;
liangzhen 0:84a8bcfbdec9 346 if( !EasyBMPcheckDataSize() )
liangzhen 0:84a8bcfbdec9 347 {
liangzhen 0:84a8bcfbdec9 348 return false;
liangzhen 0:84a8bcfbdec9 349 }
liangzhen 0:84a8bcfbdec9 350
liangzhen 0:84a8bcfbdec9 351 FILE* fp = fopen( FileName, "rb" );
liangzhen 0:84a8bcfbdec9 352 if( fp == NULL )
liangzhen 0:84a8bcfbdec9 353 {
liangzhen 0:84a8bcfbdec9 354
liangzhen 0:84a8bcfbdec9 355 SetBitDepth(1);
liangzhen 0:84a8bcfbdec9 356 SetSize(1,1);
liangzhen 0:84a8bcfbdec9 357 return false;
liangzhen 0:84a8bcfbdec9 358 }
liangzhen 0:84a8bcfbdec9 359
liangzhen 0:84a8bcfbdec9 360 // read the file header
liangzhen 0:84a8bcfbdec9 361
liangzhen 0:84a8bcfbdec9 362 BMFH bmfh;
liangzhen 0:84a8bcfbdec9 363 bool NotCorrupted = true;
liangzhen 0:84a8bcfbdec9 364
liangzhen 0:84a8bcfbdec9 365 NotCorrupted &= SafeFread( (char*) &(bmfh.bfType) , sizeof(ebmpWORD), 1, fp);
liangzhen 0:84a8bcfbdec9 366
liangzhen 0:84a8bcfbdec9 367 bool IsBitmap = false;
liangzhen 0:84a8bcfbdec9 368
liangzhen 0:84a8bcfbdec9 369 if( bmfh.bfType == 19778 )
liangzhen 0:84a8bcfbdec9 370 { IsBitmap = true; }
liangzhen 0:84a8bcfbdec9 371
liangzhen 0:84a8bcfbdec9 372 if( !IsBitmap )
liangzhen 0:84a8bcfbdec9 373 {
liangzhen 0:84a8bcfbdec9 374 fclose( fp );
liangzhen 0:84a8bcfbdec9 375 return false;
liangzhen 0:84a8bcfbdec9 376 }
liangzhen 0:84a8bcfbdec9 377
liangzhen 0:84a8bcfbdec9 378 NotCorrupted &= SafeFread( (char*) &(bmfh.bfSize) , sizeof(ebmpDWORD) , 1, fp);
liangzhen 0:84a8bcfbdec9 379 NotCorrupted &= SafeFread( (char*) &(bmfh.bfReserved1) , sizeof(ebmpWORD) , 1, fp);
liangzhen 0:84a8bcfbdec9 380 NotCorrupted &= SafeFread( (char*) &(bmfh.bfReserved2) , sizeof(ebmpWORD) , 1, fp);
liangzhen 0:84a8bcfbdec9 381 NotCorrupted &= SafeFread( (char*) &(bmfh.bfOffBits) , sizeof(ebmpDWORD) , 1 , fp);
liangzhen 0:84a8bcfbdec9 382
liangzhen 0:84a8bcfbdec9 383 // read the info header
liangzhen 0:84a8bcfbdec9 384
liangzhen 0:84a8bcfbdec9 385 BMIH bmih;
liangzhen 0:84a8bcfbdec9 386
liangzhen 0:84a8bcfbdec9 387 NotCorrupted &= SafeFread( (char*) &(bmih.biSize) , sizeof(ebmpDWORD) , 1 , fp);
liangzhen 0:84a8bcfbdec9 388 NotCorrupted &= SafeFread( (char*) &(bmih.biWidth) , sizeof(ebmpDWORD) , 1 , fp);
liangzhen 0:84a8bcfbdec9 389 NotCorrupted &= SafeFread( (char*) &(bmih.biHeight) , sizeof(ebmpDWORD) , 1 , fp);
liangzhen 0:84a8bcfbdec9 390 NotCorrupted &= SafeFread( (char*) &(bmih.biPlanes) , sizeof(ebmpWORD) , 1, fp);
liangzhen 0:84a8bcfbdec9 391 NotCorrupted &= SafeFread( (char*) &(bmih.biBitCount) , sizeof(ebmpWORD) , 1, fp);
liangzhen 0:84a8bcfbdec9 392
liangzhen 0:84a8bcfbdec9 393 NotCorrupted &= SafeFread( (char*) &(bmih.biCompression) , sizeof(ebmpDWORD) , 1 , fp);
liangzhen 0:84a8bcfbdec9 394 NotCorrupted &= SafeFread( (char*) &(bmih.biSizeImage) , sizeof(ebmpDWORD) , 1 , fp);
liangzhen 0:84a8bcfbdec9 395 NotCorrupted &= SafeFread( (char*) &(bmih.biXPelsPerMeter) , sizeof(ebmpDWORD) , 1 , fp);
liangzhen 0:84a8bcfbdec9 396 NotCorrupted &= SafeFread( (char*) &(bmih.biYPelsPerMeter) , sizeof(ebmpDWORD) , 1 , fp);
liangzhen 0:84a8bcfbdec9 397 NotCorrupted &= SafeFread( (char*) &(bmih.biClrUsed) , sizeof(ebmpDWORD) , 1 , fp);
liangzhen 0:84a8bcfbdec9 398 NotCorrupted &= SafeFread( (char*) &(bmih.biClrImportant) , sizeof(ebmpDWORD) , 1 , fp);
liangzhen 0:84a8bcfbdec9 399
liangzhen 0:84a8bcfbdec9 400 // a safety catch: if any of the header information didn't read properly, abort
liangzhen 0:84a8bcfbdec9 401 // future idea: check to see if at least most is self-consistent
liangzhen 0:84a8bcfbdec9 402
liangzhen 0:84a8bcfbdec9 403 if( !NotCorrupted )
liangzhen 0:84a8bcfbdec9 404 {
liangzhen 0:84a8bcfbdec9 405 SetSize(1,1);
liangzhen 0:84a8bcfbdec9 406 SetBitDepth(1);
liangzhen 0:84a8bcfbdec9 407 fclose(fp);
liangzhen 0:84a8bcfbdec9 408 return false;
liangzhen 0:84a8bcfbdec9 409 }
liangzhen 0:84a8bcfbdec9 410
liangzhen 0:84a8bcfbdec9 411 XPelsPerMeter = bmih.biXPelsPerMeter;
liangzhen 0:84a8bcfbdec9 412 YPelsPerMeter = bmih.biYPelsPerMeter;
liangzhen 0:84a8bcfbdec9 413
liangzhen 0:84a8bcfbdec9 414 // set the bit depth
liangzhen 0:84a8bcfbdec9 415
liangzhen 0:84a8bcfbdec9 416 int TempBitDepth = (int) bmih.biBitCount;
liangzhen 0:84a8bcfbdec9 417 if( TempBitDepth != 1 && TempBitDepth != 4 )
liangzhen 0:84a8bcfbdec9 418 {
liangzhen 0:84a8bcfbdec9 419 SetSize(1,1);
liangzhen 0:84a8bcfbdec9 420 SetBitDepth(1);
liangzhen 0:84a8bcfbdec9 421 fclose(fp);
liangzhen 0:84a8bcfbdec9 422 return false;
liangzhen 0:84a8bcfbdec9 423 }
liangzhen 0:84a8bcfbdec9 424 SetBitDepth( (int) bmih.biBitCount );
liangzhen 0:84a8bcfbdec9 425
liangzhen 0:84a8bcfbdec9 426 // set the size
liangzhen 0:84a8bcfbdec9 427
liangzhen 0:84a8bcfbdec9 428 if( (int) bmih.biWidth <= 0 || (int) bmih.biHeight <= 0 )
liangzhen 0:84a8bcfbdec9 429 {
liangzhen 0:84a8bcfbdec9 430 SetSize(1,1);
liangzhen 0:84a8bcfbdec9 431 SetBitDepth(1);
liangzhen 0:84a8bcfbdec9 432 fclose(fp);
liangzhen 0:84a8bcfbdec9 433 return false;
liangzhen 0:84a8bcfbdec9 434 }
liangzhen 0:84a8bcfbdec9 435 SetSize( (int) bmih.biWidth , (int) bmih.biHeight );
liangzhen 0:84a8bcfbdec9 436
liangzhen 0:84a8bcfbdec9 437 // some preliminaries
liangzhen 0:84a8bcfbdec9 438
liangzhen 0:84a8bcfbdec9 439 double dBytesPerPixel = ( (double) BitDepth ) / 8.0;
liangzhen 0:84a8bcfbdec9 440 double dBytesPerRow = dBytesPerPixel * (Width+0.0);
liangzhen 0:84a8bcfbdec9 441 dBytesPerRow = ceil(dBytesPerRow);
liangzhen 0:84a8bcfbdec9 442
liangzhen 0:84a8bcfbdec9 443 int BytePaddingPerRow = 4 - ( (int) (dBytesPerRow) )% 4;
liangzhen 0:84a8bcfbdec9 444 if( BytePaddingPerRow == 4 )
liangzhen 0:84a8bcfbdec9 445 { BytePaddingPerRow = 0; }
liangzhen 0:84a8bcfbdec9 446
liangzhen 0:84a8bcfbdec9 447 // skip blank data if bfOffBits so indicates
liangzhen 0:84a8bcfbdec9 448
liangzhen 0:84a8bcfbdec9 449 int BytesToSkip = bmfh.bfOffBits - 54;;
liangzhen 0:84a8bcfbdec9 450 if( BitDepth == 16 && bmih.biCompression == 3 )
liangzhen 0:84a8bcfbdec9 451 { BytesToSkip -= 3*4; }
liangzhen 0:84a8bcfbdec9 452 if( BytesToSkip < 0 )
liangzhen 0:84a8bcfbdec9 453 { BytesToSkip = 0; }
liangzhen 0:84a8bcfbdec9 454 if( BytesToSkip > 0 && BitDepth != 16 )
liangzhen 0:84a8bcfbdec9 455 {
liangzhen 0:84a8bcfbdec9 456 ebmpBYTE* TempSkipBYTE;
liangzhen 0:84a8bcfbdec9 457 TempSkipBYTE = new ebmpBYTE [BytesToSkip];
liangzhen 0:84a8bcfbdec9 458 SafeFread( (char*) TempSkipBYTE , BytesToSkip , 1 , fp);
liangzhen 0:84a8bcfbdec9 459 delete [] TempSkipBYTE;
liangzhen 0:84a8bcfbdec9 460 }
liangzhen 0:84a8bcfbdec9 461
liangzhen 0:84a8bcfbdec9 462 // This code reads 1, 4, 8, 24, and 32-bpp files
liangzhen 0:84a8bcfbdec9 463 // with a more-efficient buffered technique.
liangzhen 0:84a8bcfbdec9 464
liangzhen 0:84a8bcfbdec9 465 int j;
liangzhen 0:84a8bcfbdec9 466 if( BitDepth != 16 )
liangzhen 0:84a8bcfbdec9 467 {
liangzhen 0:84a8bcfbdec9 468 int BufferSize = (int) ( (Width*BitDepth) / 8.0 );
liangzhen 0:84a8bcfbdec9 469 while( 8*BufferSize < Width*BitDepth )
liangzhen 0:84a8bcfbdec9 470 { BufferSize++; }
liangzhen 0:84a8bcfbdec9 471 while( BufferSize % 4 )
liangzhen 0:84a8bcfbdec9 472 { BufferSize++; }
liangzhen 0:84a8bcfbdec9 473 ebmpBYTE* Buffer;
liangzhen 0:84a8bcfbdec9 474 Buffer = new ebmpBYTE [BufferSize];
liangzhen 0:84a8bcfbdec9 475 j= Height-1;
liangzhen 0:84a8bcfbdec9 476 while( j > -1 )
liangzhen 0:84a8bcfbdec9 477 {
liangzhen 0:84a8bcfbdec9 478 int BytesRead = (int) fread( (char*) Buffer, 1, BufferSize, fp );
liangzhen 0:84a8bcfbdec9 479 if( BytesRead < BufferSize )
liangzhen 0:84a8bcfbdec9 480 {
liangzhen 0:84a8bcfbdec9 481 j = -1;
liangzhen 0:84a8bcfbdec9 482 }
liangzhen 0:84a8bcfbdec9 483 else
liangzhen 0:84a8bcfbdec9 484 {
liangzhen 0:84a8bcfbdec9 485 bool Success = false;
liangzhen 0:84a8bcfbdec9 486 if( BitDepth == 1 )
liangzhen 0:84a8bcfbdec9 487 { Success = Read1bitRow( Buffer, BufferSize, j ); }
liangzhen 0:84a8bcfbdec9 488 if( !Success )
liangzhen 0:84a8bcfbdec9 489 {
liangzhen 0:84a8bcfbdec9 490 j = -1;
liangzhen 0:84a8bcfbdec9 491 }
liangzhen 0:84a8bcfbdec9 492 }
liangzhen 0:84a8bcfbdec9 493 j--;
liangzhen 0:84a8bcfbdec9 494 }
liangzhen 0:84a8bcfbdec9 495 delete [] Buffer;
liangzhen 0:84a8bcfbdec9 496 }
liangzhen 0:84a8bcfbdec9 497 fclose(fp);
liangzhen 0:84a8bcfbdec9 498 return true;
liangzhen 0:84a8bcfbdec9 499 }
liangzhen 0:84a8bcfbdec9 500
liangzhen 0:84a8bcfbdec9 501 bool BMP::CreateStandardColorTable( void )
liangzhen 0:84a8bcfbdec9 502 {
liangzhen 0:84a8bcfbdec9 503 using namespace std;
liangzhen 0:84a8bcfbdec9 504 if( BitDepth != 1 && BitDepth != 4)
liangzhen 0:84a8bcfbdec9 505 {
liangzhen 0:84a8bcfbdec9 506 return false;
liangzhen 0:84a8bcfbdec9 507 }
liangzhen 0:84a8bcfbdec9 508
liangzhen 0:84a8bcfbdec9 509 if( BitDepth == 1 )
liangzhen 0:84a8bcfbdec9 510 {
liangzhen 0:84a8bcfbdec9 511 int i;
liangzhen 0:84a8bcfbdec9 512 for( i=0 ; i < 2 ; i++ )
liangzhen 0:84a8bcfbdec9 513 {
liangzhen 0:84a8bcfbdec9 514 Colors[i].Red = i*255;
liangzhen 0:84a8bcfbdec9 515 Colors[i].Green = i*255;
liangzhen 0:84a8bcfbdec9 516 Colors[i].Blue = i*255;
liangzhen 0:84a8bcfbdec9 517 Colors[i].Alpha = 0;
liangzhen 0:84a8bcfbdec9 518 }
liangzhen 0:84a8bcfbdec9 519 return true;
liangzhen 0:84a8bcfbdec9 520 }
liangzhen 0:84a8bcfbdec9 521
liangzhen 0:84a8bcfbdec9 522 for(int i=0; i<16; i++){
liangzhen 0:84a8bcfbdec9 523 Colors[i].Red = 0;
liangzhen 0:84a8bcfbdec9 524 Colors[i].Blue = 0;
liangzhen 0:84a8bcfbdec9 525 Colors[i].Green = 0;
liangzhen 0:84a8bcfbdec9 526 Colors[i].Alpha = 0;
liangzhen 0:84a8bcfbdec9 527 }
liangzhen 0:84a8bcfbdec9 528
liangzhen 0:84a8bcfbdec9 529 Colors[1].Red = 255;
liangzhen 0:84a8bcfbdec9 530
liangzhen 0:84a8bcfbdec9 531 Colors[15].Red = 255;
liangzhen 0:84a8bcfbdec9 532 Colors[15].Blue = 255;
liangzhen 0:84a8bcfbdec9 533 Colors[15].Green = 255;
liangzhen 0:84a8bcfbdec9 534
liangzhen 0:84a8bcfbdec9 535 return true;
liangzhen 0:84a8bcfbdec9 536 }
liangzhen 0:84a8bcfbdec9 537
liangzhen 0:84a8bcfbdec9 538 bool SafeFread( char* buffer, int size, int number, FILE* fp )
liangzhen 0:84a8bcfbdec9 539 {
liangzhen 0:84a8bcfbdec9 540 using namespace std;
liangzhen 0:84a8bcfbdec9 541 int ItemsRead;
liangzhen 0:84a8bcfbdec9 542 if( feof(fp) )
liangzhen 0:84a8bcfbdec9 543 { return false; }
liangzhen 0:84a8bcfbdec9 544 ItemsRead = (int) fread( buffer , size , number , fp );
liangzhen 0:84a8bcfbdec9 545 if( ItemsRead < number )
liangzhen 0:84a8bcfbdec9 546 { return false; }
liangzhen 0:84a8bcfbdec9 547 return true;
liangzhen 0:84a8bcfbdec9 548 }
liangzhen 0:84a8bcfbdec9 549
liangzhen 0:84a8bcfbdec9 550 #include<iostream>
liangzhen 0:84a8bcfbdec9 551 bool BMP::Read1bitRow( ebmpBYTE* Buffer, int BufferSize, int Row )
liangzhen 0:84a8bcfbdec9 552 {
liangzhen 0:84a8bcfbdec9 553 using namespace std;
liangzhen 0:84a8bcfbdec9 554 if( Width > 8*BufferSize )
liangzhen 0:84a8bcfbdec9 555 { return false; }
liangzhen 0:84a8bcfbdec9 556
liangzhen 0:84a8bcfbdec9 557 int i=0;
liangzhen 0:84a8bcfbdec9 558 for(i=0; i < BufferSize; i++){
liangzhen 0:84a8bcfbdec9 559 PixelsBW[i/4][Row] |= Buffer[i] << (8 * (3 - i%4));
liangzhen 0:84a8bcfbdec9 560 }
liangzhen 0:84a8bcfbdec9 561 return true;
liangzhen 0:84a8bcfbdec9 562 }
liangzhen 0:84a8bcfbdec9 563
liangzhen 0:84a8bcfbdec9 564 bool BMP::Write4bitRow( ebmpBYTE* Buffer, int BufferSize, int Row )
liangzhen 0:84a8bcfbdec9 565 {
liangzhen 0:84a8bcfbdec9 566 int PositionWeights[2] = {16,1};
liangzhen 0:84a8bcfbdec9 567
liangzhen 0:84a8bcfbdec9 568 int i=0;
liangzhen 0:84a8bcfbdec9 569 int j;
liangzhen 0:84a8bcfbdec9 570 int k=0;
liangzhen 0:84a8bcfbdec9 571 if( Width > 2*BufferSize )
liangzhen 0:84a8bcfbdec9 572 { return false; }
liangzhen 0:84a8bcfbdec9 573 while( i < Width )
liangzhen 0:84a8bcfbdec9 574 {
liangzhen 0:84a8bcfbdec9 575 j=0;
liangzhen 0:84a8bcfbdec9 576 int Index = 0;
liangzhen 0:84a8bcfbdec9 577 while( j < 2 && i < Width )
liangzhen 0:84a8bcfbdec9 578 {
liangzhen 0:84a8bcfbdec9 579 int closest = 0; // black
liangzhen 0:84a8bcfbdec9 580 if(PixelsBW[i / 32][Row] & ( 0x1 << (31 - i % 32))){
liangzhen 0:84a8bcfbdec9 581 closest = 15; // white
liangzhen 0:84a8bcfbdec9 582 }
liangzhen 0:84a8bcfbdec9 583 if(PixelsR[i / 32][Row] & ( 0x1 << (31 - i % 32))){
liangzhen 0:84a8bcfbdec9 584 closest = 1; // red
liangzhen 0:84a8bcfbdec9 585 }
liangzhen 0:84a8bcfbdec9 586 Index += ( PositionWeights[j]* closest );
liangzhen 0:84a8bcfbdec9 587 i++; j++;
liangzhen 0:84a8bcfbdec9 588 }
liangzhen 0:84a8bcfbdec9 589 Buffer[k] = (ebmpBYTE) Index;
liangzhen 0:84a8bcfbdec9 590 k++;
liangzhen 0:84a8bcfbdec9 591 }
liangzhen 0:84a8bcfbdec9 592 return true;
liangzhen 0:84a8bcfbdec9 593 }
liangzhen 0:84a8bcfbdec9 594
liangzhen 0:84a8bcfbdec9 595 bool EasyBMPcheckDataSize( void )
liangzhen 0:84a8bcfbdec9 596 {
liangzhen 0:84a8bcfbdec9 597 using namespace std;
liangzhen 0:84a8bcfbdec9 598 bool ReturnValue = true;
liangzhen 0:84a8bcfbdec9 599 if( sizeof( ebmpBYTE ) != 1 )
liangzhen 0:84a8bcfbdec9 600 {
liangzhen 0:84a8bcfbdec9 601 ReturnValue = false;
liangzhen 0:84a8bcfbdec9 602 }
liangzhen 0:84a8bcfbdec9 603 if( sizeof( ebmpWORD ) != 2 )
liangzhen 0:84a8bcfbdec9 604 {
liangzhen 0:84a8bcfbdec9 605 ReturnValue = false;
liangzhen 0:84a8bcfbdec9 606 }
liangzhen 0:84a8bcfbdec9 607 if( sizeof( ebmpDWORD ) != 4 )
liangzhen 0:84a8bcfbdec9 608 {
liangzhen 0:84a8bcfbdec9 609 ReturnValue = false;
liangzhen 0:84a8bcfbdec9 610 }
liangzhen 0:84a8bcfbdec9 611 return ReturnValue;
liangzhen 0:84a8bcfbdec9 612 }