Olli Vanhoja / gfxLcd

Dependents:   LCD

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers bitmap.cpp Source File

bitmap.cpp

00001 #include "bitmap.h "
00002 
00003 #define X_MAX 160
00004 #define Y_MAX 32
00005 
00006 extern Serial pc(USBTX, USBRX);
00007 
00008 bitmapImage::bitmapImage(char *inputFilename)
00009 {
00010     filename = inputFilename;
00011     
00012     pc.printf("Opening file %s...", filename);
00013     fp = fopen(filename, "rb");
00014     if(fp != NULL)
00015         pc.printf(" OK\n\r");
00016     else {
00017         fclose(fp);
00018         error("");
00019     }
00020     
00021     // check to see if it is a valid bitmap file
00022     if(fgetc(fp)!='B' || fgetc(fp)!='M')
00023     {
00024         fclose(fp);
00025         error("");
00026     }
00027     
00028     //fseek(fp, 0L, SEEK_END);
00029 
00030     // Get BMP info
00031     fileInfo.cols = readImageInfo(0x12, 4);
00032     fileInfo.rows = readImageInfo(0x16, 4);
00033     fileSize = readImageInfo(2, 4);
00034     fileInfo.offset = readImageInfo(0x0A, 4);
00035     fileInfo.bitsPP = (uint16_t)readImageInfo(0x1C, 2);
00036 
00037     // Print info
00038     pc.printf("\n\rBMP file %s:\n\r", filename);
00039     pc.printf("Width: %d\n\r", fileInfo.cols);
00040     pc.printf("Height: %d\n\r", fileInfo.rows);
00041     pc.printf("File size: %ld\n\r", fileSize);
00042     pc.printf("Offset: %d\n\r", fileInfo.offset);
00043     pc.printf("Bits per pixel: %d\n\r", fileInfo.bitsPP);
00044     //pc.printf("Vector size: %d\n\r", vectorSize);
00045 }
00046 
00047 bitmapImage::~bitmapImage()
00048 {
00049     fclose(fp);
00050 }
00051 
00052 void bitmapImage::drawImage(gfxLcd *glcd, int xOffset, int yOffset)
00053 {
00054     // Start at beginning of raster data
00055     fseek(fp, fileInfo.offset, SEEK_SET);
00056     int32_t offsettedX, offsettedY;
00057     
00058     uint32_t x=0, y=fileInfo.rows-1;
00059     for(uint32_t index=0; index < fileInfo.rows*(fileInfo.cols/8); index++)
00060     {
00061         char c=fgetc(fp);
00062         for(char b=0; b < 8; b++)
00063         {
00064             char mask = 0x80 >> b;
00065             offsettedX = (int32_t)x+xOffset;
00066             offsettedY = (int32_t)y+yOffset;
00067             
00068             if((offsettedX <= X_MAX) && (offsettedY <= Y_MAX) && (offsettedX >= 0) && (offsettedY >= 0))
00069             {
00070                 glcd->putPixel(offsettedX, offsettedY, ~c&mask);
00071             }
00072             x++;
00073             
00074             if (x == fileInfo.cols)
00075             {
00076                 x=0;
00077                 y--;
00078             }
00079             if (y == 0)
00080                 return;
00081         }
00082     }
00083 }
00084 
00085 uint32_t bitmapImage::readImageInfo(long offset, int n)
00086 {
00087     long value = 0L;
00088     char c;
00089     int  i;
00090 
00091     fseek(fp, offset, SEEK_SET);
00092 
00093     for(i=0; i < n; i++)
00094     {
00095         fread(&c, sizeof(char), 1, fp);
00096         /* calculate value based on adding bytes */
00097         value = (long)(value + (c)*((long)pow((long double)256, (int)(i))));
00098     }
00099     
00100     return value;
00101 }