diff --git a/common/tft/tft.c b/common/tft/tft.c index 2395668..7558100 100644 --- a/common/tft/tft.c +++ b/common/tft/tft.c @@ -3,6 +3,7 @@ #include #include #include +#include "filesystem.h" bool tft_init() { return ll_tft_init(); @@ -67,3 +68,59 @@ void tft_print_formatted(uint16_t x, uint16_t y, uint16_t color, uint16_t bgcolo tft_print_line(x,y,color,bgcolor,font,buffer); va_end(args); } + +bool tft_draw_bitmap_file_unscaled(uint16_t x, uint16_t y, const char* filename) { + //Copied and modified from: http://stackoverflow.com/a/17040962/2606757 + + FILE_HANDLE* file = filesystem_file_open(filename); + if(file==NULL) { + return false; + } + + unsigned char info[54]; + if(filesystem_file_read(file,info,54)!=F_OK) { + filesystem_file_close(file); + return false; + } + + // extract image height and width from header + uint32_t width = *(uint32_t*)&info[18]; //width in pixel + uint32_t height = *(uint32_t*)&info[22]; //height in pixel + uint16_t depth = *(uint16_t*)&info[28]; //bit's per pixel (color depth) + depth/=8; //we want the number of bytes per pixel + + filesystem_file_seek(file,*(uint32_t*)&info[10]); //seek to the place where img data begins + + uint32_t row_padded = (width*depth + 3) & (~3); //row size aligned to 4 bytes + + unsigned char data [row_padded]; + + for(int i = 0; i < height; i++) + { + filesystem_file_read(file,data,row_padded); + for(int j = 0; j < width*depth; j += depth) + { + unsigned char a,r,g,b; + if(depth==4) { + a = data[j]; + r = data[j+1]; + g = data[j+2]; + b = data[j+3]; + } else if (depth==3) { + a = 255; + r = data[j+2]; + g = data[j+1]; + b = data[j]; + } + + if(a!=0) { + tft_draw_pixel(x+j/depth,y+height-1-i,RGB(r,g,b)); + } + } + } + + filesystem_file_close(file); + + return true; + +} diff --git a/common/tft/tft.h b/common/tft/tft.h index e36244a..40157d2 100644 --- a/common/tft/tft.h +++ b/common/tft/tft.h @@ -103,6 +103,18 @@ void tft_fill_rectangle(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2, uint16_ */ void tft_draw_bitmap_unscaled(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint16_t* dat); + +/** + * Draws a bitmap from the filesystem onto the display without scaling/cropping + * The bitmap must be saved in the windows bitmap format (.bmp) without compression and with 24 (b,g,r) or 32 (a,r,g,b) bits per pixel + * @param x The x-coordinate of the top-left corner to draw the bitmap at + * @param y The y-coordinate of the top-left corner to draw the bitmap at + * @param filename The absolute path to the .bmp file + * @return true on success + */ +bool tft_draw_bitmap_file_unscaled(uint16_t x, uint16_t y, const char* filename); + + /** * Draws the outline of a circle onto the display * @param x The x-Coordinate of the center point diff --git a/emulator/qt/ll_tft.cpp b/emulator/qt/ll_tft.cpp index 6a9ad0c..ced8b52 100644 --- a/emulator/qt/ll_tft.cpp +++ b/emulator/qt/ll_tft.cpp @@ -44,13 +44,15 @@ void ll_tft_draw_circle(uint16_t x, uint16_t y, uint16_t r, uint16_t color) { } uint8_t ll_tft_num_fonts() { - return 1; + return 2; } QFont get_font(uint8_t fontnum) { switch(fontnum) { case 0: return QFont("Monospace",8); + case 1: + return QFont("DejaVu Sans Mono",14); default: return QFont(); }