00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include "MicrosoftMonoBMP_RT.h"
00042
00043
00044 MicrosoftMonoBMP_RT::MicrosoftMonoBMP_RT(const char *filename)
00045 {
00046
00047
00048
00049
00050
00051
00052
00053 set_filename(filename);
00054 FileSize = IMAGE_DATA_OFFSET_M;
00055 ImageWidth = 0;
00056 ImageHeight = 0;
00057 HorizResolution = 0;
00058 VertResolution = 0;
00059 pallete_false_r = PALETTE0_R;
00060 pallete_false_g = PALETTE0_G;
00061 pallete_false_b = PALETTE0_B;
00062 pallete_false_grey = PALETTE0_GREY ;
00063 pallete_true_r = PALETTE1_R;
00064 pallete_true_g = PALETTE1_G;
00065 pallete_true_b = PALETTE1_B;
00066 pallete_true_grey = PALETTE1_GREY ;
00067 file_pnt = NULL;
00068 raw_data = NULL;
00069 }
00070
00071 MicrosoftMonoBMP_RT::~MicrosoftMonoBMP_RT()
00072 {
00073
00074
00075
00076
00077
00078 delete raw_data;
00079 }
00080
00081 void MicrosoftMonoBMP_RT::set_filename(const char *filename)
00082 {
00083
00084
00085
00086
00087
00088 strncpy(file_name, filename, MAX_FILENAME_LEN);
00089
00090
00091 file_name[MAX_FILENAME_LEN] = '\0';
00092 }
00093
00094 bool MicrosoftMonoBMP_RT::set_size(unsigned int width, unsigned int height)
00095 {
00096
00097
00098
00099
00100
00101
00102
00103 bool ret_val ;
00104
00105
00106 delete raw_data ;
00107
00108 ImageWidth = width ;
00109 ImageHeight = height ;
00110
00111 if(allocate_storage()){
00112
00113 ret_val = true ;
00114 }
00115 else{
00116 ret_val = false ;
00117 }
00118
00119 calculate_filesize();
00120
00121 return ret_val ;
00122 }
00123
00124 bool MicrosoftMonoBMP_RT::read_byte(unsigned char *inp_chr)
00125 {
00126
00127
00128
00129
00130
00131
00132 bool ret_val = true ;
00133 int char_read;
00134 if(file_pnt == NULL){
00135
00136 ret_val = false ;
00137 }
00138 else if( (char_read = fgetc(file_pnt)) == EOF){
00139
00140 ret_val = false ;
00141 }
00142 else{
00143
00144 *inp_chr = (unsigned char) char_read ;
00145 }
00146 return ret_val ;
00147 }
00148
00149 bool MicrosoftMonoBMP_RT::read_word(unsigned int *inp_word)
00150 {
00151
00152
00153
00154
00155
00156 unsigned char inp1;
00157 unsigned char inp2;
00158 bool ret_val = true ;
00159
00160 ret_val = read_byte(&inp1);
00161
00162 if(ret_val){
00163
00164 ret_val = read_byte(&inp2);
00165 }
00166
00167 if(ret_val){
00168
00169 *inp_word = inp1 + (((unsigned int)(inp2))<<8) ;
00170 }
00171
00172 return ret_val ;
00173 }
00174
00175 bool MicrosoftMonoBMP_RT::read_dword(unsigned int *inp_word)
00176 {
00177
00178
00179
00180
00181
00182 unsigned char inp1;
00183 unsigned char inp2;
00184 unsigned char inp3;
00185 unsigned char inp4;
00186 bool ret_val = true ;
00187
00188 ret_val = read_byte(&inp1);
00189
00190 if(ret_val){
00191
00192 ret_val = read_byte(&inp2);
00193 }
00194
00195 if(ret_val){
00196
00197 ret_val = read_byte(&inp3);
00198 }
00199
00200 if(ret_val){
00201
00202 ret_val = read_byte(&inp4);
00203 }
00204
00205 if(ret_val){
00206
00207 *inp_word = (unsigned int)inp1 +
00208 (((unsigned int)(inp2))<<8) +
00209 (((unsigned int)(inp3))<<16) +
00210 (((unsigned int)(inp4))<<24) ;
00211 }
00212
00213 return ret_val ;
00214 }
00215
00216
00217
00218 bool MicrosoftMonoBMP_RT::write_byte(char chr)
00219 {
00220
00221
00222
00223
00224
00225 bool ret_val = true ;
00226
00227 if(file_pnt == NULL){
00228
00229 ret_val = false ;
00230 }
00231 else if( fputc((int)chr, file_pnt) == EOF){
00232
00233 ret_val = false ;
00234 }
00235 else{
00236
00237 ret_val = true ;
00238 }
00239
00240 return ret_val ;
00241 }
00242
00243 bool MicrosoftMonoBMP_RT::write_word(unsigned int wrd)
00244 {
00245
00246
00247
00248
00249
00250 unsigned int low_b;
00251 unsigned int hi_b;
00252 bool ret_val = true ;
00253
00254 low_b = wrd&0xFF ;
00255 hi_b = ( wrd >> 8 ) & 0xFF ;
00256
00257 ret_val = write_byte((int)low_b);
00258
00259 if(ret_val){
00260
00261 ret_val = write_byte((int)hi_b);
00262 }
00263
00264 return ret_val ;
00265 }
00266
00267 bool MicrosoftMonoBMP_RT::write_dword(unsigned int wrd)
00268 {
00269
00270
00271
00272
00273
00274 char by1;
00275 char by2;
00276 char by3;
00277 char by4;
00278 bool ret_val = true ;
00279
00280 by1 = wrd&0xFF ;
00281 by2 = ( wrd >> 8 ) & 0xFF ;
00282 by3 = ( wrd >> 16 ) & 0xFF ;
00283 by4 = ( wrd >> 24 ) & 0xFF ;
00284 ret_val = write_byte(by1);
00285
00286 if(ret_val){
00287
00288 ret_val = write_byte(by2);
00289 }
00290
00291 if(ret_val){
00292
00293 ret_val = write_byte(by3);
00294 }
00295
00296 if(ret_val){
00297
00298 ret_val = write_byte(by4);
00299 }
00300
00301 return ret_val ;
00302 }
00303
00304
00305 bool MicrosoftMonoBMP_RT::allocate_storage()
00306 {
00307
00308
00309
00310
00311 unsigned int storage_bytes_per_row;
00312
00313 storage_bytes_per_row = ImageWidth / 8 ;
00314
00315
00316 if(ImageWidth & 0xF){
00317
00318 storage_bytes_per_row++ ;
00319 }
00320
00321 raw_data = new char[storage_bytes_per_row * ImageHeight];
00322
00323 if(raw_data==NULL) return false;
00324 else return true;
00325 }
00326
00327 void MicrosoftMonoBMP_RT::calculate_filesize()
00328 {
00329
00330
00331
00332
00333
00334 unsigned int bytes_per_row;
00335
00336 bytes_per_row = ImageWidth / 8 ;
00337
00338 if(ImageWidth & 0xF){
00339
00340 bytes_per_row++ ;
00341 }
00342
00343 while( bytes_per_row & 0x03 ){
00344
00345 bytes_per_row++ ;
00346 }
00347
00348 FileSize = bytes_per_row * ImageHeight + IMAGE_DATA_OFFSET_M ;
00349 }
00350
00351 bool MicrosoftMonoBMP_RT::read()
00352 {
00353
00354
00355
00356
00357 bool ret_val = true ;
00358 unsigned int bytes_in=0;
00359 unsigned char *d_pointer;
00360 unsigned char pad;
00361 unsigned int line;
00362 unsigned int pixel;
00363
00364 if((file_pnt = fopen(file_name,"rb"))==NULL){
00365
00366 ret_val = false;
00367 }
00368 else{
00369
00370 ret_val &= read_byte(&type1);
00371 ret_val &= read_byte(&type2);
00372 ret_val &= read_dword(&FileSize);
00373 ret_val &= read_dword(&reserved);
00374 ret_val &= read_dword(&data_off);
00375 ret_val &= read_dword(&head_size);
00376 ret_val &= read_dword(&ImageWidth);
00377 ret_val &= read_dword(&ImageHeight);
00378 ret_val &= read_word(&no_planes);
00379 ret_val &= read_word(&bits_per_pixel);
00380 ret_val &= read_dword(&comp_method);
00381 ret_val &= read_dword(&bitmap_size);
00382 ret_val &= read_dword(&HorizResolution);
00383 ret_val &= read_dword(&VertResolution);
00384 ret_val &= read_dword(&no_cols);
00385 ret_val &= read_dword(&no_sig_cols);
00386
00387
00388 ret_val &= read_byte(&pallete_false_b);
00389 ret_val &= read_byte(&pallete_false_g);
00390 ret_val &= read_byte(&pallete_false_r);
00391 ret_val &= read_byte(&pad);
00392 ret_val &= read_byte(&pallete_true_b);
00393 ret_val &= read_byte(&pallete_true_g);
00394 ret_val &= read_byte(&pallete_true_r);
00395 ret_val &= read_byte(&pad);
00396 }
00397 ret_val &= check_header_valid();
00398
00399 if(ret_val){
00400
00401 ret_val = allocate_storage();
00402 }
00403 if(ret_val){
00404
00405 d_pointer = (unsigned char *)raw_data ;
00406
00407 for(line=0 ; line<ImageHeight && ret_val ; line ++){
00408
00409 bytes_in = 0;
00410 for(pixel=0 ; pixel<ImageWidth / 8 && ret_val ; pixel ++){
00411 ret_val &= read_byte(d_pointer++);
00412 bytes_in++;
00413 }
00414
00415 if(ImageWidth & 0xF){
00416
00417 ret_val &= read_byte(d_pointer++);
00418 bytes_in++;
00419 }
00420
00421 while(bytes_in & 0x03){
00422
00423 ret_val &= read_byte(&pad);
00424 bytes_in++;
00425 }
00426 }
00427 }
00428
00429 if( file_pnt == NULL ||
00430 fclose(file_pnt) == EOF ){
00431
00432 ret_val = false ;
00433 }
00434 return ret_val;
00435 }
00436
00437 bool MicrosoftMonoBMP_RT::check_header_valid()
00438 {
00439
00440
00441
00442
00443 bool ret_val ;
00444
00445 if( type1 != 'B' ||
00446 type2 != 'M' ||
00447 data_off != IMAGE_DATA_OFFSET_M ||
00448 head_size != HEADER_SIZE_M ||
00449 no_planes != NO_OF_IMAGE_PLANES_M ||
00450 bits_per_pixel != BITS_PER_PIXEL_M ||
00451 comp_method != COMPRESSION_METHOD_M ){
00452
00453 ret_val = false ;
00454 }
00455 else{
00456 ret_val = true ;
00457 }
00458
00459 return ret_val ;
00460 }
00461
00462 #define NEXT_BIT bitmask = bitmask>>1; \
00463 if(!bitmask) {bitmask=0x80 ; buff_pnt++;}
00464
00465 void MicrosoftMonoBMP_RT::extract_data(int *rgb)
00466 {
00467
00468
00469
00470
00471
00472 unsigned int lines;
00473 unsigned int pixels;
00474 unsigned int bytes_read;
00475 char *buff_pnt = raw_data;
00476 unsigned int p_off;
00477 unsigned int bytes_per_line;
00478 unsigned char bitmask = 0x80;
00479
00480 bytes_per_line = ImageWidth / 8 ;
00481
00482 if(ImageWidth & 0xF){
00483
00484 bytes_per_line++;
00485 }
00486
00487 p_off = (ImageWidth*ImageHeight);
00488
00489 for(lines=0 ; lines<ImageHeight ; lines ++){
00490
00491
00492 if(bitmask != 0x80){
00493
00494 bitmask = 0x80 ;
00495 buff_pnt++;
00496 }
00497
00498
00499 p_off -= ImageWidth ;
00500
00501
00502 for(pixels=0; pixels<ImageWidth ; pixels++){
00503
00504 if(*buff_pnt & bitmask){
00505 rgb[p_off*3] = pallete_true_r ;
00506 rgb[p_off*3+1] = pallete_true_g ;
00507 rgb[p_off*3+2] = pallete_true_b ;
00508
00509 }
00510 else{
00511 rgb[p_off*3] = pallete_false_r ;
00512 rgb[p_off*3+1] = pallete_false_g ;
00513 rgb[p_off*3+2] = pallete_false_b ;
00514 }
00515 NEXT_BIT
00516
00517 p_off++;
00518 }
00519
00520
00521 p_off -= ImageWidth ;
00522 }
00523 }
00524
00525 void MicrosoftMonoBMP_RT::extract_data_grey(int *grey)
00526 {
00527
00528
00529
00530
00531
00532 unsigned int lines;
00533 unsigned int pixels;
00534 unsigned int bytes_read;
00535 char *buff_pnt = raw_data;
00536 unsigned int p_off;
00537 unsigned int bytes_per_line;
00538 unsigned char bitmask = 0x80;
00539
00540 bytes_per_line = ImageWidth / 8 ;
00541
00542 if(ImageWidth & 0xF){
00543
00544 bytes_per_line++;
00545 }
00546
00547 p_off = (ImageWidth*ImageHeight);
00548
00549 for(lines=0 ; lines<ImageHeight ; lines ++){
00550
00551
00552 if(bitmask != 0x80){
00553
00554 bitmask = 0x80 ;
00555 buff_pnt++;
00556 }
00557
00558
00559 p_off -= ImageWidth ;
00560
00561
00562 for(pixels=0; pixels<ImageWidth ; pixels++){
00563
00564 if(*buff_pnt & bitmask){
00565 grey[p_off] = pallete_true_grey ;
00566
00567 }
00568 else{
00569 grey[p_off] = pallete_false_grey ;
00570 }
00571 NEXT_BIT
00572
00573 p_off++;
00574 }
00575
00576
00577 p_off -= ImageWidth ;
00578 }
00579 }
00580
00581
00582 void MicrosoftMonoBMP_RT::put_data(int *rgb)
00583 {
00584
00585
00586
00587
00588
00589
00590 unsigned int lines;
00591 unsigned int pixels;
00592 char *buff_pnt = raw_data;
00593 unsigned int p_off;
00594 unsigned char bitmask = 0x80 ;
00595
00596 p_off = (ImageWidth*ImageHeight);
00597
00598 for(lines=0 ; lines<ImageHeight ; lines ++){
00599
00600
00601 if(bitmask != 0x80){
00602
00603 bitmask = 0x80 ;
00604 buff_pnt++;
00605 }
00606
00607
00608 p_off -= ImageWidth ;
00609
00610
00611 for(pixels=0; pixels<ImageWidth ; pixels++){
00612 if(rgb[p_off*3] || rgb[p_off*3+1] || rgb[p_off*3+2]){
00613
00614 *buff_pnt |= bitmask ;
00615 }
00616 else{
00617 *buff_pnt &= ~bitmask ;
00618 }
00619 NEXT_BIT
00620
00621 p_off++;
00622 }
00623
00624
00625 p_off -= ImageWidth ;
00626 }
00627 }
00628
00629 void MicrosoftMonoBMP_RT::put_data_grey(int *grey)
00630 {
00631
00632
00633
00634
00635
00636
00637 unsigned int lines;
00638 unsigned int pixels;
00639 char *buff_pnt = raw_data;
00640 unsigned int p_off;
00641 unsigned char bitmask = 0x80 ;
00642
00643 p_off = (ImageWidth*ImageHeight);
00644
00645 for(lines=0 ; lines<ImageHeight ; lines ++){
00646
00647
00648 if(bitmask != 0x80){
00649
00650 bitmask = 0x80 ;
00651 buff_pnt++;
00652 }
00653
00654
00655 p_off -= ImageWidth ;
00656
00657
00658 for(pixels=0; pixels<ImageWidth ; pixels++){
00659 if(grey[p_off]){
00660
00661 *buff_pnt |= bitmask ;
00662 }
00663 else{
00664 *buff_pnt &= ~bitmask ;
00665 }
00666 NEXT_BIT
00667
00668 p_off++;
00669 }
00670
00671
00672 p_off -= ImageWidth ;
00673 }
00674 }
00675
00676
00677 bool MicrosoftMonoBMP_RT::write()
00678 {
00679
00680
00681
00682
00683 bool ret_val = true ;
00684 unsigned int bytes_in=0;
00685 char *d_pointer;
00686 char pad;
00687 unsigned int line;
00688 unsigned int pixel;
00689 if((file_pnt = fopen(file_name,"wb"))==NULL){
00690
00691 ret_val = false;
00692 }
00693 else{
00694
00695 ret_val &= write_byte('B');
00696 ret_val &= write_byte('M');
00697 ret_val &= write_dword(FileSize);
00698 ret_val &= write_dword(0);
00699 ret_val &= write_dword(IMAGE_DATA_OFFSET_M);
00700 ret_val &= write_dword(HEADER_SIZE_M);
00701 ret_val &= write_dword(ImageWidth);
00702 ret_val &= write_dword(ImageHeight);
00703 ret_val &= write_word(NO_OF_IMAGE_PLANES_M);
00704 ret_val &= write_word(BITS_PER_PIXEL_M);
00705 ret_val &= write_dword(COMPRESSION_METHOD_M);
00706 ret_val &= write_dword(SIZE_OF_BITMAP_M);
00707 ret_val &= write_dword(HorizResolution);
00708 ret_val &= write_dword(VertResolution);
00709 ret_val &= write_dword(NO_COLOURS_USED_M);
00710 ret_val &= write_dword(NO_SIGNIFICANT_COLS_M);
00711
00712
00713 ret_val &= write_byte(pallete_false_b);
00714 ret_val &= write_byte(pallete_false_g);
00715 ret_val &= write_byte(pallete_false_r);
00716 ret_val &= write_byte(0);
00717 ret_val &= write_byte(pallete_true_b);
00718 ret_val &= write_byte(pallete_true_g);
00719 ret_val &= write_byte(pallete_true_r);
00720 ret_val &= write_byte(0);
00721 }
00722
00723 if(ret_val){
00724
00725
00726 d_pointer = raw_data ;
00727
00728 for(line=0 ; line<ImageHeight && ret_val ; line ++){
00729
00730 bytes_in = 0;
00731 for(pixel=0 ; pixel<ImageWidth/8 && ret_val ; pixel ++){
00732 ret_val &= write_byte(*(d_pointer++));
00733 bytes_in++;
00734 }
00735
00736 if(ImageWidth & 0xF){
00737
00738 ret_val &= write_byte(*(d_pointer++));
00739 bytes_in++;
00740 }
00741
00742 while(bytes_in & 0x03){
00743
00744 ret_val &= write_byte(0);
00745 bytes_in++;
00746 }
00747 }
00748 }
00749
00750 if( file_pnt == NULL ||
00751 fclose(file_pnt) == EOF ){
00752
00753 ret_val = false ;
00754 }
00755
00756 return ret_val;
00757 }
00758