Dependencies: mbed FATFileSystem
N5110_Modded/Bitmap.cpp@2:964e19f2f3f1, 2019-04-18 (annotated)
- Committer:
- rottenegg
- Date:
- Thu Apr 18 19:47:30 2019 +0000
- Revision:
- 2:964e19f2f3f1
- Parent:
- 1:0efd25071a6d
- Child:
- 3:63cdd5cab431
Documented the N5110-Modded and added the WDplayer, a Library that plays 8-Bit Mono-stereo .wav files - However, it has problems running alongside as a Ticker event.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rottenegg | 1:0efd25071a6d | 1 | #include "Bitmap.h" |
rottenegg | 1:0efd25071a6d | 2 | |
rottenegg | 2:964e19f2f3f1 | 3 | //Total New Process time = 0.04 Seconds (still a bit long) |
rottenegg | 2:964e19f2f3f1 | 4 | //Image data is Stored in DWORDS (32-bits) not Bytes (8-bits) |
rottenegg | 2:964e19f2f3f1 | 5 | |
rottenegg | 1:0efd25071a6d | 6 | void Bitmap::renderBMP(const char *path, N5110 &lcd, unsigned int const x, unsigned int const y) { |
rottenegg | 2:964e19f2f3f1 | 7 | //Opening File and Checking |
rottenegg | 1:0efd25071a6d | 8 | FILE *bmp = fopen(path,"r"); |
rottenegg | 1:0efd25071a6d | 9 | if (bmp == NULL) { |
rottenegg | 1:0efd25071a6d | 10 | std::cerr << "File Not Found" << std::endl; |
rottenegg | 1:0efd25071a6d | 11 | } |
rottenegg | 2:964e19f2f3f1 | 12 | //Creating Buffer and Geting data from Memory locations for RIFF data block |
rottenegg | 1:0efd25071a6d | 13 | unsigned char *buffer = (unsigned char*)std::malloc(4 * sizeof(unsigned char)); |
rottenegg | 1:0efd25071a6d | 14 | unsigned long offbits; |
rottenegg | 1:0efd25071a6d | 15 | unsigned long height; |
rottenegg | 1:0efd25071a6d | 16 | unsigned long width; |
rottenegg | 1:0efd25071a6d | 17 | std::fseek(bmp,10,SEEK_SET); |
rottenegg | 1:0efd25071a6d | 18 | std::fread(&offbits,4,1,bmp); |
rottenegg | 1:0efd25071a6d | 19 | std::fseek(bmp,18,SEEK_SET); |
rottenegg | 1:0efd25071a6d | 20 | std::fread(&width,4,1,bmp); |
rottenegg | 1:0efd25071a6d | 21 | std::fseek(bmp,22,SEEK_SET); |
rottenegg | 1:0efd25071a6d | 22 | std::fread(&height,4,1,bmp); |
rottenegg | 2:964e19f2f3f1 | 23 | //Counting DWORDS required per Row of Image |
rottenegg | 1:0efd25071a6d | 24 | unsigned short int dcount = (width / 32) + 1; |
rottenegg | 1:0efd25071a6d | 25 | fseek(bmp,offbits,SEEK_SET); |
rottenegg | 1:0efd25071a6d | 26 | std::bitset<32> bits; |
rottenegg | 1:0efd25071a6d | 27 | int row = 0; |
rottenegg | 1:0efd25071a6d | 28 | offbits = 0; |
rottenegg | 1:0efd25071a6d | 29 | int colomn = 0; |
rottenegg | 1:0efd25071a6d | 30 | bool state; |
rottenegg | 2:964e19f2f3f1 | 31 | //NEW ENGINE CORE |
rottenegg | 2:964e19f2f3f1 | 32 | //Looping relative to DWORDS to remove packing bits |
rottenegg | 1:0efd25071a6d | 33 | for (unsigned int dwcount = 1; dwcount < ((dcount*height) + 1); dwcount++) { |
rottenegg | 1:0efd25071a6d | 34 | std::fread(buffer,1,4,bmp); |
rottenegg | 2:964e19f2f3f1 | 35 | //Endian Swap |
rottenegg | 1:0efd25071a6d | 36 | bits = buffer[0]; |
rottenegg | 1:0efd25071a6d | 37 | bits = (bits << 8) | (std::bitset<32>)buffer[1]; |
rottenegg | 1:0efd25071a6d | 38 | bits = (bits << 8) | (std::bitset<32>)buffer[2]; |
rottenegg | 1:0efd25071a6d | 39 | bits = (bits << 8) | (std::bitset<32>)buffer[3]; |
rottenegg | 2:964e19f2f3f1 | 40 | //Bit Loop to print out pixel data but skips the packing bits |
rottenegg | 2:964e19f2f3f1 | 41 | //Uses two selective For loops |
rottenegg | 2:964e19f2f3f1 | 42 | //First Loop only reads remaining bits in a DWORD and skips the Packing bits |
rottenegg | 2:964e19f2f3f1 | 43 | //Second Loop reads the full DWORD |
rottenegg | 1:0efd25071a6d | 44 | if (dwcount % dcount == 0) { |
rottenegg | 1:0efd25071a6d | 45 | for (offbits = 0; offbits < (width % 32); offbits++){ |
rottenegg | 1:0efd25071a6d | 46 | if (bits[31 - offbits] == 1) { |
rottenegg | 1:0efd25071a6d | 47 | state = false; |
rottenegg | 1:0efd25071a6d | 48 | } else { |
rottenegg | 1:0efd25071a6d | 49 | state = true; |
rottenegg | 1:0efd25071a6d | 50 | } |
rottenegg | 1:0efd25071a6d | 51 | lcd.setPixel((colomn + x) ,(row + y),state); |
rottenegg | 1:0efd25071a6d | 52 | colomn++; |
rottenegg | 1:0efd25071a6d | 53 | } |
rottenegg | 1:0efd25071a6d | 54 | row++; |
rottenegg | 1:0efd25071a6d | 55 | colomn = 0; |
rottenegg | 1:0efd25071a6d | 56 | } else { |
rottenegg | 1:0efd25071a6d | 57 | for (offbits = 0; offbits < 32; offbits++) { |
rottenegg | 1:0efd25071a6d | 58 | if (bits[31 - offbits] == 1) { |
rottenegg | 1:0efd25071a6d | 59 | state = false; |
rottenegg | 1:0efd25071a6d | 60 | } else { |
rottenegg | 1:0efd25071a6d | 61 | state = true; |
rottenegg | 1:0efd25071a6d | 62 | } |
rottenegg | 1:0efd25071a6d | 63 | lcd.setPixel((colomn + x) ,(row + y),state); |
rottenegg | 1:0efd25071a6d | 64 | colomn++; |
rottenegg | 1:0efd25071a6d | 65 | } |
rottenegg | 1:0efd25071a6d | 66 | } |
rottenegg | 1:0efd25071a6d | 67 | } |
rottenegg | 1:0efd25071a6d | 68 | std::fclose(bmp); |
rottenegg | 1:0efd25071a6d | 69 | } |