uint32_t lcd_drawchar(uint32_t x, uint32_t y, char c, uint32_t size, uint32_t fgcolor, uint32_t bgcolor, uint32_t clear_bg) { uint32_t ret, i, x0, y0, x1, y1, h, data, mask; uint8_t *ptr; //size = (size==0)?1:size; x1 = x+(FONT_WIDTH*size); y1 = y+(FONT_HEIGHT*size); if((x1-1) >= width) { return width+1; } else if((y1-1) >= height) { return width+1; } else if(c < FONT_START) { return x; } size--; ret = x1; lcd_enable(); ptr = (uint8_t*)&fontdata[(c-FONT_START)*(8*FONT_HEIGHT/8)]; if(size == 0) { y0 = y; for(h=FONT_HEIGHT; h!=0; h--) { data = *ptr++; x0 = x; for(mask=(1<<(FONT_WIDTH-1)); mask!=0; mask>>=1) { if(data & mask) { lcd_setarea(x0, y0, x0, y0); lcd_drawstart(); lcd_draw(fgcolor); lcd_drawstop(); } else if(clear_bg) { lcd_setarea(x0, y0, x0, y0); lcd_drawstart(); lcd_draw(bgcolor); lcd_drawstop(); } x0++; } y0++; } }
inline void lcd_setpixel(const uint16_t x0, const uint16_t y0, const colour_t colour) { lcd_setarea(x0, y0, x0, y0); lcd_drawstart(); lcd_draw(colour); lcd_drawstop(); }
uint32_t lcd_setbias(uint32_t o) { uint32_t param, w, h; #define MEM_Y (7) //MY row address order #define MEM_X (6) //MX column address order #define MEM_V (5) //MV row / column exchange #define MEM_L (4) //ML vertical refresh order #define MEM_H (2) //MH horizontal refresh order #define MEM_BGR (3) //RGB-BGR Order switch(o) { default: case 0: //case 36: //case 360: w = LCD_WIDTH; h = LCD_HEIGHT; param = (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_Y); break; case 9: case 90: w = LCD_HEIGHT; h = LCD_WIDTH; param = (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_V); break; case 18: case 180: w = LCD_WIDTH; h = LCD_HEIGHT; param = (1<<MEM_BGR) | (1<<MEM_L); break; case 27: case 270: case 14: //270&0xFF w = LCD_HEIGHT; h = LCD_WIDTH; param = (1<<MEM_BGR) | (1<<MEM_Y) | (1<<MEM_V); break; } lcd_enable(); lcd_wrcmd8(LCD_CMD_MEMACCESS_CTRL); lcd_wrdata8(param); lcd_setarea(0, 0, w-1, h-1); lcd_disable(); return (w<<16) | (h<<0); }
void cmd_lcd_drawimage(uint_least16_t fgcolor, uint_least16_t bgcolor) { uint_least8_t b, c, e, n; uint_least16_t a, x0, y0, x1, y1, w, h; uint_least32_t i, ms; x0 = if_read(); //x0 y0 = if_read(); //y0 w = if_read(); //w h = if_read(); //h x1 = x0+w-1; y1 = y0+h-1; c = if_read8(); //color mode + encoding e = c & COLOR_RLE; c = c & ~COLOR_RLE; lcd_enable(); lcd_setarea(x0, y0, x1, y1); lcd_drawstart(); switch(c) { case COLOR_BW: //black/white fgcolor = RGB(0,0,0); bgcolor = RGB(255,255,255); break; case COLOR_WB: //white/black fgcolor = RGB(255,255,255); bgcolor = RGB(0,0,0); break; case COLOR_FG: //fg/bg fgcolor = fgcolor; bgcolor = bgcolor; break; case COLOR_BG: //bg/fg fgcolor ^= bgcolor; bgcolor ^= fgcolor; fgcolor ^= bgcolor; break; } ms = get_ms(); if(e == 0) //no encoding { switch(c) { case COLOR_BW: //black/white case COLOR_WB: //white/black case COLOR_FG: //fg/bg case COLOR_BG: //bg/fg for(i=w*h; i!=0;) { if(if_available()) { a = if_read8(); for(b=0x80; (b!=0) && (i!=0); b>>=1) { if(a & b) { lcd_draw(fgcolor); } else { lcd_draw(bgcolor); } i--; } } else if((get_ms()-ms) > 2000) //2s { break; } } break; case COLOR_RGB323: case COLOR_RGB332: case COLOR_RGB233: case COLOR_GRAY: for(i=w*h; i!=0;) { if(if_available()) { a = if_read8(); if(c == COLOR_RGB323){ a = RGB323toRGB565(a); } else if(c == COLOR_RGB332){ a = RGB332toRGB565(a); } else if(c == COLOR_RGB233){ a = RGB233toRGB565(a); } else { a = GRAYtoRGB565(a); } lcd_draw(a); i--; } else if((get_ms()-ms) > 2000) //2s { break; } } break; default: case COLOR_RGB565: for(i=w*h; i!=0;) { if(if_available()) { a = if_read16(); lcd_draw(a); i--; } else if((get_ms()-ms) > 2000) //2s { break; } } break; case COLOR_RGB888: for(i=w*h; i!=0;) { if(if_available()) { a = (if_read8()&0xF8)<<8; //R (5 bits) a |= (if_read8()&0xFC)<<3; //G (6 bits) a |= (if_read8()&0xF8)>>3; //B (5 bits) lcd_draw(a); i--; } else if((get_ms()-ms) > 2000) //2s { break; } } break; }