A implementation of a simple bomberman game

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player

Fork of rtos_basic by mbed official

Committer:
apcastelein
Date:
Mon Oct 31 19:33:11 2016 +0000
Revision:
7:12f7fd2b1a13
Published bomberman game;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
apcastelein 7:12f7fd2b1a13 1 #include "myBMP.h"
apcastelein 7:12f7fd2b1a13 2
apcastelein 7:12f7fd2b1a13 3 int BitDepth = 1;
apcastelein 7:12f7fd2b1a13 4 int Width = 1;
apcastelein 7:12f7fd2b1a13 5 int Height = 1;
apcastelein 7:12f7fd2b1a13 6 RGBApixel *Colors;
apcastelein 7:12f7fd2b1a13 7
apcastelein 7:12f7fd2b1a13 8 bool SafeFread( char* buffer, int size, int number, FILE* fp )
apcastelein 7:12f7fd2b1a13 9 {
apcastelein 7:12f7fd2b1a13 10 using namespace std;
apcastelein 7:12f7fd2b1a13 11 int ItemsRead;
apcastelein 7:12f7fd2b1a13 12 if( feof(fp) )
apcastelein 7:12f7fd2b1a13 13 { return false; }
apcastelein 7:12f7fd2b1a13 14 ItemsRead = (int) fread( buffer , size , number , fp );
apcastelein 7:12f7fd2b1a13 15 if( ItemsRead < number )
apcastelein 7:12f7fd2b1a13 16 { return false; }
apcastelein 7:12f7fd2b1a13 17 return true;
apcastelein 7:12f7fd2b1a13 18 }
apcastelein 7:12f7fd2b1a13 19
apcastelein 7:12f7fd2b1a13 20 bool Read32bitRow(int x, int y, ebmpBYTE* Buffer, int BufferSize, int Row, uLCD_4DGL *lcd)
apcastelein 7:12f7fd2b1a13 21 {
apcastelein 7:12f7fd2b1a13 22 int i;
apcastelein 7:12f7fd2b1a13 23 char Colors[4];
apcastelein 7:12f7fd2b1a13 24 if( Width*4 > BufferSize )
apcastelein 7:12f7fd2b1a13 25 { return false; }
apcastelein 7:12f7fd2b1a13 26 for( i=0 ; i < Width ; i++ )
apcastelein 7:12f7fd2b1a13 27 {
apcastelein 7:12f7fd2b1a13 28 memcpy( (char*) &(Colors), (char*) Buffer+4*i, 4 );
apcastelein 7:12f7fd2b1a13 29 //Blue, Green, Red, Alpha
apcastelein 7:12f7fd2b1a13 30 int color = 0x00000000 | (Colors[2] << 16) | (Colors[1] << 8) | (Colors[0]);
apcastelein 7:12f7fd2b1a13 31 (*lcd).pixel(x+i,y+Row,color);
apcastelein 7:12f7fd2b1a13 32 }
apcastelein 7:12f7fd2b1a13 33 return true;
apcastelein 7:12f7fd2b1a13 34 }
apcastelein 7:12f7fd2b1a13 35
apcastelein 7:12f7fd2b1a13 36 bool Read24bitRow(int x, int y, ebmpBYTE* Buffer, int BufferSize, int Row, uLCD_4DGL *lcd)
apcastelein 7:12f7fd2b1a13 37 {
apcastelein 7:12f7fd2b1a13 38 int i;
apcastelein 7:12f7fd2b1a13 39 char Colors[4];
apcastelein 7:12f7fd2b1a13 40 if( Width*3 > BufferSize )
apcastelein 7:12f7fd2b1a13 41 { return false; }
apcastelein 7:12f7fd2b1a13 42 for( i=0 ; i < Width ; i++ )
apcastelein 7:12f7fd2b1a13 43 {
apcastelein 7:12f7fd2b1a13 44 memcpy( (char*) &(Colors), (char*) Buffer+3*i, 3 );
apcastelein 7:12f7fd2b1a13 45 //Blue, Green, Red, Alpha
apcastelein 7:12f7fd2b1a13 46 int color = 0x00000000 | (Colors[2] << 16) | (Colors[1] << 8) | (Colors[0]);
apcastelein 7:12f7fd2b1a13 47 (*lcd).pixel(x+i,y+Row,color);
apcastelein 7:12f7fd2b1a13 48 }
apcastelein 7:12f7fd2b1a13 49 return true;
apcastelein 7:12f7fd2b1a13 50 }
apcastelein 7:12f7fd2b1a13 51
apcastelein 7:12f7fd2b1a13 52 RGBApixel GetColor( int ColorNumber)
apcastelein 7:12f7fd2b1a13 53 {
apcastelein 7:12f7fd2b1a13 54 RGBApixel Output;
apcastelein 7:12f7fd2b1a13 55 Output.Red = 255;
apcastelein 7:12f7fd2b1a13 56 Output.Green = 255;
apcastelein 7:12f7fd2b1a13 57 Output.Blue = 255;
apcastelein 7:12f7fd2b1a13 58 Output.Alpha = 0;
apcastelein 7:12f7fd2b1a13 59
apcastelein 7:12f7fd2b1a13 60 if( BitDepth != 1 && BitDepth != 4 && BitDepth != 8 )
apcastelein 7:12f7fd2b1a13 61 {
apcastelein 7:12f7fd2b1a13 62 return Output;
apcastelein 7:12f7fd2b1a13 63 }
apcastelein 7:12f7fd2b1a13 64 if( !Colors )
apcastelein 7:12f7fd2b1a13 65 {
apcastelein 7:12f7fd2b1a13 66 return Output;
apcastelein 7:12f7fd2b1a13 67 }
apcastelein 7:12f7fd2b1a13 68 Output = Colors[ColorNumber];
apcastelein 7:12f7fd2b1a13 69 return Output;
apcastelein 7:12f7fd2b1a13 70 }
apcastelein 7:12f7fd2b1a13 71
apcastelein 7:12f7fd2b1a13 72 bool Read8bitRow(int x, int y, ebmpBYTE* Buffer, int BufferSize, int Row, uLCD_4DGL *lcd)
apcastelein 7:12f7fd2b1a13 73 {
apcastelein 7:12f7fd2b1a13 74 int i;
apcastelein 7:12f7fd2b1a13 75 if( Width > BufferSize )
apcastelein 7:12f7fd2b1a13 76 { return false; }
apcastelein 7:12f7fd2b1a13 77 for( i=0 ; i < Width ; i++ )
apcastelein 7:12f7fd2b1a13 78 {
apcastelein 7:12f7fd2b1a13 79 int Index = Buffer[i];
apcastelein 7:12f7fd2b1a13 80 //Blue, Green, Red, Alpha
apcastelein 7:12f7fd2b1a13 81 RGBApixel colors = GetColor(Index);
apcastelein 7:12f7fd2b1a13 82 int color = 0x00000000 | (colors.Red<< 16) | (colors.Blue << 8) | (colors.Green);
apcastelein 7:12f7fd2b1a13 83 (*lcd).pixel(x+i,y+Row,color);
apcastelein 7:12f7fd2b1a13 84 }
apcastelein 7:12f7fd2b1a13 85 return true;
apcastelein 7:12f7fd2b1a13 86 }
apcastelein 7:12f7fd2b1a13 87
apcastelein 7:12f7fd2b1a13 88 bool Read4bitRow(int x, int y, ebmpBYTE* Buffer, int BufferSize, int Row, uLCD_4DGL *lcd)
apcastelein 7:12f7fd2b1a13 89 {
apcastelein 7:12f7fd2b1a13 90 int Shifts[2] = {4 ,0 };
apcastelein 7:12f7fd2b1a13 91 int Masks[2] = {240,15};
apcastelein 7:12f7fd2b1a13 92
apcastelein 7:12f7fd2b1a13 93 int i=0;
apcastelein 7:12f7fd2b1a13 94 int j;
apcastelein 7:12f7fd2b1a13 95 int k=0;
apcastelein 7:12f7fd2b1a13 96 if( Width > 2*BufferSize )
apcastelein 7:12f7fd2b1a13 97 { return false; }
apcastelein 7:12f7fd2b1a13 98 while( i < Width )
apcastelein 7:12f7fd2b1a13 99 {
apcastelein 7:12f7fd2b1a13 100 j=0;
apcastelein 7:12f7fd2b1a13 101 while( j < 2 && i < Width )
apcastelein 7:12f7fd2b1a13 102 {
apcastelein 7:12f7fd2b1a13 103 int Index = (int) ( (Buffer[k]&Masks[j]) >> Shifts[j]);
apcastelein 7:12f7fd2b1a13 104 RGBApixel colors = GetColor(Index);
apcastelein 7:12f7fd2b1a13 105 int color = 0x00000000 | (colors.Red<< 16) | (colors.Blue << 8) | (colors.Green);
apcastelein 7:12f7fd2b1a13 106 (*lcd).pixel(x+i,y+Row,color);
apcastelein 7:12f7fd2b1a13 107 i++; j++;
apcastelein 7:12f7fd2b1a13 108 }
apcastelein 7:12f7fd2b1a13 109 k++;
apcastelein 7:12f7fd2b1a13 110 }
apcastelein 7:12f7fd2b1a13 111 return true;
apcastelein 7:12f7fd2b1a13 112 }
apcastelein 7:12f7fd2b1a13 113 bool Read1bitRow(int x, int y, ebmpBYTE* Buffer, int BufferSize, int Row, uLCD_4DGL *lcd)
apcastelein 7:12f7fd2b1a13 114 {
apcastelein 7:12f7fd2b1a13 115 int Shifts[8] = {7 ,6 ,5 ,4 ,3,2,1,0};
apcastelein 7:12f7fd2b1a13 116 int Masks[8] = {128,64,32,16,8,4,2,1};
apcastelein 7:12f7fd2b1a13 117
apcastelein 7:12f7fd2b1a13 118 int i=0;
apcastelein 7:12f7fd2b1a13 119 int j;
apcastelein 7:12f7fd2b1a13 120 int k=0;
apcastelein 7:12f7fd2b1a13 121
apcastelein 7:12f7fd2b1a13 122 if( Width > 8*BufferSize )
apcastelein 7:12f7fd2b1a13 123 { return false; }
apcastelein 7:12f7fd2b1a13 124 while( i < Width )
apcastelein 7:12f7fd2b1a13 125 {
apcastelein 7:12f7fd2b1a13 126 j=0;
apcastelein 7:12f7fd2b1a13 127 while( j < 8 && i < Width )
apcastelein 7:12f7fd2b1a13 128 {
apcastelein 7:12f7fd2b1a13 129 int Index = (int) ( (Buffer[k]&Masks[j]) >> Shifts[j]);
apcastelein 7:12f7fd2b1a13 130 RGBApixel colors = GetColor(Index);
apcastelein 7:12f7fd2b1a13 131 int color = 0x00000000 | (colors.Red<< 16) | (colors.Blue << 8) | (colors.Green);
apcastelein 7:12f7fd2b1a13 132 (*lcd).pixel(x+i,y+Row,color);
apcastelein 7:12f7fd2b1a13 133 i++; j++;
apcastelein 7:12f7fd2b1a13 134 }
apcastelein 7:12f7fd2b1a13 135 k++;
apcastelein 7:12f7fd2b1a13 136 }
apcastelein 7:12f7fd2b1a13 137 return true;
apcastelein 7:12f7fd2b1a13 138 }
apcastelein 7:12f7fd2b1a13 139
apcastelein 7:12f7fd2b1a13 140 int TellNumberOfColors( int BitDepth )
apcastelein 7:12f7fd2b1a13 141 {
apcastelein 7:12f7fd2b1a13 142 int output = 1 << BitDepth;
apcastelein 7:12f7fd2b1a13 143 if( BitDepth == 32 )
apcastelein 7:12f7fd2b1a13 144 { output = 1 << 24; }
apcastelein 7:12f7fd2b1a13 145 return output;
apcastelein 7:12f7fd2b1a13 146 }
apcastelein 7:12f7fd2b1a13 147
apcastelein 7:12f7fd2b1a13 148 bool ReadBMPFromFile(int x, int y, const char* FileName, RGBApixel *Colors, uLCD_4DGL *lcd)
apcastelein 7:12f7fd2b1a13 149 {
apcastelein 7:12f7fd2b1a13 150 FILE* fp = fopen( FileName, "rb" );
apcastelein 7:12f7fd2b1a13 151 if( fp == NULL )
apcastelein 7:12f7fd2b1a13 152 {
apcastelein 7:12f7fd2b1a13 153 return false;
apcastelein 7:12f7fd2b1a13 154 }
apcastelein 7:12f7fd2b1a13 155
apcastelein 7:12f7fd2b1a13 156 // read the file header
apcastelein 7:12f7fd2b1a13 157
apcastelein 7:12f7fd2b1a13 158 BMFH bmfh;
apcastelein 7:12f7fd2b1a13 159 bool NotCorrupted = true;
apcastelein 7:12f7fd2b1a13 160
apcastelein 7:12f7fd2b1a13 161 NotCorrupted &= SafeFread( (char*) &(bmfh.bfType) , sizeof(ebmpWORD), 1, fp);
apcastelein 7:12f7fd2b1a13 162
apcastelein 7:12f7fd2b1a13 163 bool IsBitmap = false;
apcastelein 7:12f7fd2b1a13 164
apcastelein 7:12f7fd2b1a13 165 if( bmfh.bfType == 19778 )
apcastelein 7:12f7fd2b1a13 166 { IsBitmap = true; }
apcastelein 7:12f7fd2b1a13 167
apcastelein 7:12f7fd2b1a13 168 if( !IsBitmap )
apcastelein 7:12f7fd2b1a13 169 {
apcastelein 7:12f7fd2b1a13 170 fclose( fp );
apcastelein 7:12f7fd2b1a13 171 return false;
apcastelein 7:12f7fd2b1a13 172 }
apcastelein 7:12f7fd2b1a13 173
apcastelein 7:12f7fd2b1a13 174 NotCorrupted &= SafeFread( (char*) &(bmfh.bfSize) , sizeof(ebmpDWORD) , 1, fp);
apcastelein 7:12f7fd2b1a13 175 NotCorrupted &= SafeFread( (char*) &(bmfh.bfReserved1) , sizeof(ebmpWORD) , 1, fp);
apcastelein 7:12f7fd2b1a13 176 NotCorrupted &= SafeFread( (char*) &(bmfh.bfReserved2) , sizeof(ebmpWORD) , 1, fp);
apcastelein 7:12f7fd2b1a13 177 NotCorrupted &= SafeFread( (char*) &(bmfh.bfOffBits) , sizeof(ebmpDWORD) , 1 , fp);
apcastelein 7:12f7fd2b1a13 178
apcastelein 7:12f7fd2b1a13 179 // read the info header
apcastelein 7:12f7fd2b1a13 180
apcastelein 7:12f7fd2b1a13 181 BMIH bmih;
apcastelein 7:12f7fd2b1a13 182
apcastelein 7:12f7fd2b1a13 183 NotCorrupted &= SafeFread( (char*) &(bmih.biSize) , sizeof(ebmpDWORD) , 1 , fp);
apcastelein 7:12f7fd2b1a13 184 NotCorrupted &= SafeFread( (char*) &(bmih.biWidth) , sizeof(ebmpDWORD) , 1 , fp);
apcastelein 7:12f7fd2b1a13 185 NotCorrupted &= SafeFread( (char*) &(bmih.biHeight) , sizeof(ebmpDWORD) , 1 , fp);
apcastelein 7:12f7fd2b1a13 186 NotCorrupted &= SafeFread( (char*) &(bmih.biPlanes) , sizeof(ebmpWORD) , 1, fp);
apcastelein 7:12f7fd2b1a13 187 NotCorrupted &= SafeFread( (char*) &(bmih.biBitCount) , sizeof(ebmpWORD) , 1, fp);
apcastelein 7:12f7fd2b1a13 188
apcastelein 7:12f7fd2b1a13 189 NotCorrupted &= SafeFread( (char*) &(bmih.biCompression) , sizeof(ebmpDWORD) , 1 , fp);
apcastelein 7:12f7fd2b1a13 190 NotCorrupted &= SafeFread( (char*) &(bmih.biSizeImage) , sizeof(ebmpDWORD) , 1 , fp);
apcastelein 7:12f7fd2b1a13 191 NotCorrupted &= SafeFread( (char*) &(bmih.biXPelsPerMeter) , sizeof(ebmpDWORD) , 1 , fp);
apcastelein 7:12f7fd2b1a13 192 NotCorrupted &= SafeFread( (char*) &(bmih.biYPelsPerMeter) , sizeof(ebmpDWORD) , 1 , fp);
apcastelein 7:12f7fd2b1a13 193 NotCorrupted &= SafeFread( (char*) &(bmih.biClrUsed) , sizeof(ebmpDWORD) , 1 , fp);
apcastelein 7:12f7fd2b1a13 194 NotCorrupted &= SafeFread( (char*) &(bmih.biClrImportant) , sizeof(ebmpDWORD) , 1 , fp);
apcastelein 7:12f7fd2b1a13 195
apcastelein 7:12f7fd2b1a13 196 // a safety catch: if any of the header information didn't read properly, abort
apcastelein 7:12f7fd2b1a13 197 // future idea: check to see if at least most is self-consistent
apcastelein 7:12f7fd2b1a13 198
apcastelein 7:12f7fd2b1a13 199 if( !NotCorrupted )
apcastelein 7:12f7fd2b1a13 200 {
apcastelein 7:12f7fd2b1a13 201 fclose(fp);
apcastelein 7:12f7fd2b1a13 202 return false;
apcastelein 7:12f7fd2b1a13 203 }
apcastelein 7:12f7fd2b1a13 204
apcastelein 7:12f7fd2b1a13 205 // if bmih.biCompression 1 or 2, then the file is RLE compressed
apcastelein 7:12f7fd2b1a13 206
apcastelein 7:12f7fd2b1a13 207 if( bmih.biCompression == 1 || bmih.biCompression == 2 )
apcastelein 7:12f7fd2b1a13 208 {
apcastelein 7:12f7fd2b1a13 209 fclose(fp);
apcastelein 7:12f7fd2b1a13 210 return false;
apcastelein 7:12f7fd2b1a13 211 }
apcastelein 7:12f7fd2b1a13 212
apcastelein 7:12f7fd2b1a13 213 // if bmih.biCompression > 3, then something strange is going on
apcastelein 7:12f7fd2b1a13 214 // it's probably an OS2 bitmap file.
apcastelein 7:12f7fd2b1a13 215
apcastelein 7:12f7fd2b1a13 216 if( bmih.biCompression > 3 )
apcastelein 7:12f7fd2b1a13 217 {
apcastelein 7:12f7fd2b1a13 218 fclose(fp);
apcastelein 7:12f7fd2b1a13 219 return false;
apcastelein 7:12f7fd2b1a13 220 }
apcastelein 7:12f7fd2b1a13 221
apcastelein 7:12f7fd2b1a13 222 if( bmih.biCompression == 3 && bmih.biBitCount != 16 )
apcastelein 7:12f7fd2b1a13 223 {
apcastelein 7:12f7fd2b1a13 224 fclose(fp);
apcastelein 7:12f7fd2b1a13 225 return false;
apcastelein 7:12f7fd2b1a13 226 }
apcastelein 7:12f7fd2b1a13 227
apcastelein 7:12f7fd2b1a13 228 // set the bit depth
apcastelein 7:12f7fd2b1a13 229
apcastelein 7:12f7fd2b1a13 230 int TempBitDepth = (int) bmih.biBitCount;
apcastelein 7:12f7fd2b1a13 231 if( TempBitDepth != 1 && TempBitDepth != 4
apcastelein 7:12f7fd2b1a13 232 && TempBitDepth != 8 && TempBitDepth != 16
apcastelein 7:12f7fd2b1a13 233 && TempBitDepth != 24 && TempBitDepth != 32 )
apcastelein 7:12f7fd2b1a13 234 {
apcastelein 7:12f7fd2b1a13 235 fclose(fp);
apcastelein 7:12f7fd2b1a13 236 return false;
apcastelein 7:12f7fd2b1a13 237 }
apcastelein 7:12f7fd2b1a13 238 BitDepth = (int)bmih.biBitCount;
apcastelein 7:12f7fd2b1a13 239 // set the size
apcastelein 7:12f7fd2b1a13 240
apcastelein 7:12f7fd2b1a13 241 if( (int) bmih.biWidth <= 0 || (int) bmih.biHeight <= 0 )
apcastelein 7:12f7fd2b1a13 242 {
apcastelein 7:12f7fd2b1a13 243 fclose(fp);
apcastelein 7:12f7fd2b1a13 244 return false;
apcastelein 7:12f7fd2b1a13 245 }
apcastelein 7:12f7fd2b1a13 246 Width = (int) bmih.biWidth;
apcastelein 7:12f7fd2b1a13 247 Height = (int) bmih.biHeight;
apcastelein 7:12f7fd2b1a13 248 // some preliminaries
apcastelein 7:12f7fd2b1a13 249
apcastelein 7:12f7fd2b1a13 250 double dBytesPerPixel = ( (double) BitDepth ) / 8.0;
apcastelein 7:12f7fd2b1a13 251 double dBytesPerRow = dBytesPerPixel * (Width+0.0);
apcastelein 7:12f7fd2b1a13 252 dBytesPerRow = ceil(dBytesPerRow);
apcastelein 7:12f7fd2b1a13 253
apcastelein 7:12f7fd2b1a13 254 int BytePaddingPerRow = 4 - ( (int) (dBytesPerRow) )% 4;
apcastelein 7:12f7fd2b1a13 255 if( BytePaddingPerRow == 4 )
apcastelein 7:12f7fd2b1a13 256 { BytePaddingPerRow = 0; }
apcastelein 7:12f7fd2b1a13 257
apcastelein 7:12f7fd2b1a13 258 // if < 16 bits, read the palette
apcastelein 7:12f7fd2b1a13 259
apcastelein 7:12f7fd2b1a13 260 if( BitDepth < 16 )
apcastelein 7:12f7fd2b1a13 261 {
apcastelein 7:12f7fd2b1a13 262 // determine the number of colors specified in the
apcastelein 7:12f7fd2b1a13 263 // color table
apcastelein 7:12f7fd2b1a13 264
apcastelein 7:12f7fd2b1a13 265 int NumberOfColorsToRead = ((int) bmfh.bfOffBits - 54 )/4;
apcastelein 7:12f7fd2b1a13 266 if( NumberOfColorsToRead > (1 << BitDepth) )
apcastelein 7:12f7fd2b1a13 267 { NumberOfColorsToRead = (1 << BitDepth); }
apcastelein 7:12f7fd2b1a13 268
apcastelein 7:12f7fd2b1a13 269 int n;
apcastelein 7:12f7fd2b1a13 270 for( n=0; n < NumberOfColorsToRead ; n++ )
apcastelein 7:12f7fd2b1a13 271 {
apcastelein 7:12f7fd2b1a13 272 SafeFread( (char*) &(Colors[n]) , 4 , 1 , fp);
apcastelein 7:12f7fd2b1a13 273 }
apcastelein 7:12f7fd2b1a13 274 for( n=NumberOfColorsToRead ; n < TellNumberOfColors(BitDepth) ; n++ )
apcastelein 7:12f7fd2b1a13 275 {
apcastelein 7:12f7fd2b1a13 276 RGBApixel wh;
apcastelein 7:12f7fd2b1a13 277 wh.Red = 255;
apcastelein 7:12f7fd2b1a13 278 wh.Green = 255;
apcastelein 7:12f7fd2b1a13 279 wh.Blue = 255;
apcastelein 7:12f7fd2b1a13 280 wh.Alpha = 0;
apcastelein 7:12f7fd2b1a13 281 Colors[n] = wh;
apcastelein 7:12f7fd2b1a13 282 }
apcastelein 7:12f7fd2b1a13 283 }
apcastelein 7:12f7fd2b1a13 284
apcastelein 7:12f7fd2b1a13 285 // skip blank data if bfOffBits so indicates
apcastelein 7:12f7fd2b1a13 286
apcastelein 7:12f7fd2b1a13 287 int BytesToSkip = bmfh.bfOffBits - 54;;
apcastelein 7:12f7fd2b1a13 288 if( BitDepth < 16 )
apcastelein 7:12f7fd2b1a13 289 { BytesToSkip -= 4*(1 << BitDepth); }
apcastelein 7:12f7fd2b1a13 290 if( BitDepth == 16 && bmih.biCompression == 3 )
apcastelein 7:12f7fd2b1a13 291 { BytesToSkip -= 3*4; }
apcastelein 7:12f7fd2b1a13 292 if( BytesToSkip < 0 )
apcastelein 7:12f7fd2b1a13 293 { BytesToSkip = 0; }
apcastelein 7:12f7fd2b1a13 294 if( BytesToSkip > 0 && BitDepth != 16 )
apcastelein 7:12f7fd2b1a13 295 {
apcastelein 7:12f7fd2b1a13 296 ebmpBYTE* TempSkipBYTE;
apcastelein 7:12f7fd2b1a13 297 TempSkipBYTE = new ebmpBYTE [BytesToSkip];
apcastelein 7:12f7fd2b1a13 298 SafeFread( (char*) TempSkipBYTE , BytesToSkip , 1 , fp);
apcastelein 7:12f7fd2b1a13 299 delete [] TempSkipBYTE;
apcastelein 7:12f7fd2b1a13 300 }
apcastelein 7:12f7fd2b1a13 301
apcastelein 7:12f7fd2b1a13 302 // This code reads 1, 4, 8, 24, and 32-bpp files
apcastelein 7:12f7fd2b1a13 303 // with a more-efficient buffered technique.
apcastelein 7:12f7fd2b1a13 304
apcastelein 7:12f7fd2b1a13 305 int i,j;
apcastelein 7:12f7fd2b1a13 306 if( BitDepth != 16 )
apcastelein 7:12f7fd2b1a13 307 {
apcastelein 7:12f7fd2b1a13 308 int BufferSize = (int) ( (Width*BitDepth) / 8.0 );
apcastelein 7:12f7fd2b1a13 309 while( 8*BufferSize < Width*BitDepth )
apcastelein 7:12f7fd2b1a13 310 { BufferSize++; }
apcastelein 7:12f7fd2b1a13 311 while( BufferSize % 4 )
apcastelein 7:12f7fd2b1a13 312 { BufferSize++; }
apcastelein 7:12f7fd2b1a13 313 ebmpBYTE* Buffer;
apcastelein 7:12f7fd2b1a13 314 Buffer = new ebmpBYTE [BufferSize];
apcastelein 7:12f7fd2b1a13 315 j= Height-1;
apcastelein 7:12f7fd2b1a13 316 while( j > -1 )
apcastelein 7:12f7fd2b1a13 317 {
apcastelein 7:12f7fd2b1a13 318 int BytesRead = (int) fread( (char*) Buffer, 1, BufferSize, fp );
apcastelein 7:12f7fd2b1a13 319 if( BytesRead < BufferSize )
apcastelein 7:12f7fd2b1a13 320 {
apcastelein 7:12f7fd2b1a13 321 j = -1;
apcastelein 7:12f7fd2b1a13 322 }
apcastelein 7:12f7fd2b1a13 323 else
apcastelein 7:12f7fd2b1a13 324 {
apcastelein 7:12f7fd2b1a13 325 bool Success = false;
apcastelein 7:12f7fd2b1a13 326 if( BitDepth == 1 )
apcastelein 7:12f7fd2b1a13 327 { Success = Read1bitRow(x,y, Buffer, BufferSize, j , lcd); }
apcastelein 7:12f7fd2b1a13 328 if( BitDepth == 4 )
apcastelein 7:12f7fd2b1a13 329 { Success = Read4bitRow(x,y, Buffer, BufferSize, j , lcd); }
apcastelein 7:12f7fd2b1a13 330 if( BitDepth == 8 )
apcastelein 7:12f7fd2b1a13 331 { Success = Read8bitRow(x,y, Buffer, BufferSize, j , lcd); }
apcastelein 7:12f7fd2b1a13 332 if( BitDepth == 24 )
apcastelein 7:12f7fd2b1a13 333 { Success = Read24bitRow(x,y, Buffer, BufferSize, j , lcd); }
apcastelein 7:12f7fd2b1a13 334 if( BitDepth == 32 )
apcastelein 7:12f7fd2b1a13 335 { Success = Read32bitRow(x,y, Buffer, BufferSize, j , lcd); }
apcastelein 7:12f7fd2b1a13 336 if( !Success )
apcastelein 7:12f7fd2b1a13 337 {
apcastelein 7:12f7fd2b1a13 338 j = -1;
apcastelein 7:12f7fd2b1a13 339 }
apcastelein 7:12f7fd2b1a13 340 }
apcastelein 7:12f7fd2b1a13 341 j--;
apcastelein 7:12f7fd2b1a13 342 }
apcastelein 7:12f7fd2b1a13 343 delete [] Buffer;
apcastelein 7:12f7fd2b1a13 344 }
apcastelein 7:12f7fd2b1a13 345
apcastelein 7:12f7fd2b1a13 346 if( BitDepth == 16 )
apcastelein 7:12f7fd2b1a13 347 {
apcastelein 7:12f7fd2b1a13 348 int DataBytes = Width*2;
apcastelein 7:12f7fd2b1a13 349 int PaddingBytes = ( 4 - DataBytes % 4 ) % 4;
apcastelein 7:12f7fd2b1a13 350
apcastelein 7:12f7fd2b1a13 351 // set the default mask
apcastelein 7:12f7fd2b1a13 352
apcastelein 7:12f7fd2b1a13 353 ebmpWORD BlueMask = 31; // bits 12-16
apcastelein 7:12f7fd2b1a13 354 ebmpWORD GreenMask = 992; // bits 7-11
apcastelein 7:12f7fd2b1a13 355 ebmpWORD RedMask = 31744; // bits 2-6
apcastelein 7:12f7fd2b1a13 356
apcastelein 7:12f7fd2b1a13 357 // read the bit fields, if necessary, to
apcastelein 7:12f7fd2b1a13 358 // override the default 5-5-5 mask
apcastelein 7:12f7fd2b1a13 359
apcastelein 7:12f7fd2b1a13 360 if( bmih.biCompression != 0 )
apcastelein 7:12f7fd2b1a13 361 {
apcastelein 7:12f7fd2b1a13 362 // read the three bit masks
apcastelein 7:12f7fd2b1a13 363
apcastelein 7:12f7fd2b1a13 364 ebmpWORD TempMaskWORD;
apcastelein 7:12f7fd2b1a13 365
apcastelein 7:12f7fd2b1a13 366 SafeFread( (char*) &RedMask , 2 , 1 , fp );
apcastelein 7:12f7fd2b1a13 367 SafeFread( (char*) &TempMaskWORD , 2, 1, fp );
apcastelein 7:12f7fd2b1a13 368
apcastelein 7:12f7fd2b1a13 369 SafeFread( (char*) &GreenMask , 2 , 1 , fp );
apcastelein 7:12f7fd2b1a13 370 SafeFread( (char*) &TempMaskWORD , 2, 1, fp );
apcastelein 7:12f7fd2b1a13 371
apcastelein 7:12f7fd2b1a13 372 SafeFread( (char*) &BlueMask , 2 , 1 , fp );
apcastelein 7:12f7fd2b1a13 373 SafeFread( (char*) &TempMaskWORD , 2, 1, fp );
apcastelein 7:12f7fd2b1a13 374 }
apcastelein 7:12f7fd2b1a13 375
apcastelein 7:12f7fd2b1a13 376 // read and skip any meta data
apcastelein 7:12f7fd2b1a13 377
apcastelein 7:12f7fd2b1a13 378 if( BytesToSkip > 0 )
apcastelein 7:12f7fd2b1a13 379 {
apcastelein 7:12f7fd2b1a13 380 ebmpBYTE* TempSkipBYTE;
apcastelein 7:12f7fd2b1a13 381 TempSkipBYTE = new ebmpBYTE [BytesToSkip];
apcastelein 7:12f7fd2b1a13 382 SafeFread( (char*) TempSkipBYTE , BytesToSkip , 1 , fp);
apcastelein 7:12f7fd2b1a13 383 delete [] TempSkipBYTE;
apcastelein 7:12f7fd2b1a13 384 }
apcastelein 7:12f7fd2b1a13 385
apcastelein 7:12f7fd2b1a13 386 // determine the red, green and blue shifts
apcastelein 7:12f7fd2b1a13 387
apcastelein 7:12f7fd2b1a13 388 int GreenShift = 0;
apcastelein 7:12f7fd2b1a13 389 ebmpWORD TempShiftWORD = GreenMask;
apcastelein 7:12f7fd2b1a13 390 while( TempShiftWORD > 31 )
apcastelein 7:12f7fd2b1a13 391 { TempShiftWORD = TempShiftWORD>>1; GreenShift++; }
apcastelein 7:12f7fd2b1a13 392 int BlueShift = 0;
apcastelein 7:12f7fd2b1a13 393 TempShiftWORD = BlueMask;
apcastelein 7:12f7fd2b1a13 394 while( TempShiftWORD > 31 )
apcastelein 7:12f7fd2b1a13 395 { TempShiftWORD = TempShiftWORD>>1; BlueShift++; }
apcastelein 7:12f7fd2b1a13 396 int RedShift = 0;
apcastelein 7:12f7fd2b1a13 397 TempShiftWORD = RedMask;
apcastelein 7:12f7fd2b1a13 398 while( TempShiftWORD > 31 )
apcastelein 7:12f7fd2b1a13 399 { TempShiftWORD = TempShiftWORD>>1; RedShift++; }
apcastelein 7:12f7fd2b1a13 400
apcastelein 7:12f7fd2b1a13 401 // read the actual pixels
apcastelein 7:12f7fd2b1a13 402
apcastelein 7:12f7fd2b1a13 403 for( j=Height-1 ; j >= 0 ; j-- )
apcastelein 7:12f7fd2b1a13 404 {
apcastelein 7:12f7fd2b1a13 405 i=0;
apcastelein 7:12f7fd2b1a13 406 int ReadNumber = 0;
apcastelein 7:12f7fd2b1a13 407 while( ReadNumber < DataBytes )
apcastelein 7:12f7fd2b1a13 408 {
apcastelein 7:12f7fd2b1a13 409 ebmpWORD TempWORD;
apcastelein 7:12f7fd2b1a13 410 SafeFread( (char*) &TempWORD , 2 , 1 , fp );
apcastelein 7:12f7fd2b1a13 411 ReadNumber += 2;
apcastelein 7:12f7fd2b1a13 412
apcastelein 7:12f7fd2b1a13 413 ebmpWORD Red = RedMask & TempWORD;
apcastelein 7:12f7fd2b1a13 414 ebmpWORD Green = GreenMask & TempWORD;
apcastelein 7:12f7fd2b1a13 415 ebmpWORD Blue = BlueMask & TempWORD;
apcastelein 7:12f7fd2b1a13 416
apcastelein 7:12f7fd2b1a13 417 ebmpBYTE BlueBYTE = (ebmpBYTE) 8*(Blue>>BlueShift);
apcastelein 7:12f7fd2b1a13 418 ebmpBYTE GreenBYTE = (ebmpBYTE) 8*(Green>>GreenShift);
apcastelein 7:12f7fd2b1a13 419 ebmpBYTE RedBYTE = (ebmpBYTE) 8*(Red>>RedShift);
apcastelein 7:12f7fd2b1a13 420
apcastelein 7:12f7fd2b1a13 421 int color = 0x00000000 | (RedBYTE << 16) | (GreenBYTE << 8) | (BlueBYTE);
apcastelein 7:12f7fd2b1a13 422 (*lcd).pixel(x+i,y+j,color);
apcastelein 7:12f7fd2b1a13 423 i++;
apcastelein 7:12f7fd2b1a13 424 }
apcastelein 7:12f7fd2b1a13 425 ReadNumber = 0;
apcastelein 7:12f7fd2b1a13 426 while( ReadNumber < PaddingBytes )
apcastelein 7:12f7fd2b1a13 427 {
apcastelein 7:12f7fd2b1a13 428 ebmpBYTE TempBYTE;
apcastelein 7:12f7fd2b1a13 429 SafeFread( (char*) &TempBYTE , 1, 1, fp);
apcastelein 7:12f7fd2b1a13 430 ReadNumber++;
apcastelein 7:12f7fd2b1a13 431 }
apcastelein 7:12f7fd2b1a13 432 }
apcastelein 7:12f7fd2b1a13 433
apcastelein 7:12f7fd2b1a13 434 }
apcastelein 7:12f7fd2b1a13 435
apcastelein 7:12f7fd2b1a13 436 fclose(fp);
apcastelein 7:12f7fd2b1a13 437 return true;
apcastelein 7:12f7fd2b1a13 438 }
apcastelein 7:12f7fd2b1a13 439
apcastelein 7:12f7fd2b1a13 440
apcastelein 7:12f7fd2b1a13 441 BMIH::BMIH()
apcastelein 7:12f7fd2b1a13 442 {
apcastelein 7:12f7fd2b1a13 443 biPlanes = 1;
apcastelein 7:12f7fd2b1a13 444 biCompression = 0;
apcastelein 7:12f7fd2b1a13 445 biXPelsPerMeter = DefaultXPelsPerMeter;
apcastelein 7:12f7fd2b1a13 446 biYPelsPerMeter = DefaultYPelsPerMeter;
apcastelein 7:12f7fd2b1a13 447 biClrUsed = 0;
apcastelein 7:12f7fd2b1a13 448 biClrImportant = 0;
apcastelein 7:12f7fd2b1a13 449 }
apcastelein 7:12f7fd2b1a13 450
apcastelein 7:12f7fd2b1a13 451 BMFH::BMFH()
apcastelein 7:12f7fd2b1a13 452 {
apcastelein 7:12f7fd2b1a13 453 bfType = 19778;
apcastelein 7:12f7fd2b1a13 454 bfReserved1 = 0;
apcastelein 7:12f7fd2b1a13 455 bfReserved2 = 0;
apcastelein 7:12f7fd2b1a13 456 }