Very simple library for controlling small graphic LCDs
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Fri Jul 15 2022 12:01:38 by
1.7.2