Merge pull request #5 from abhishek-kakkar/master

Changes in Text Rendering API
remotes/origin_old/ugfx_release_2.6
Tectu 2012-06-13 08:44:42 -07:00
commit 25ff65d207
6 changed files with 1161 additions and 713 deletions

View File

@ -40,7 +40,7 @@ inline void lld_lcdwrite(uint16_t db)
} }
static __inline uint16_t lcdReadData(void) { static __inline uint16_t lcdReadData(void) {
uint16_t value; uint16_t value=0;
LCD_RS_HIGH; LCD_RS_HIGH;
LCD_WR_HIGH; LCD_WR_HIGH;
@ -83,21 +83,15 @@ static __inline uint16_t lcdReadReg(uint16_t lcdReg) {
} }
void lcdWriteIndex(uint16_t lcdReg) { void lcdWriteIndex(uint16_t lcdReg) {
LCD_CS_LOW;
LCD_RS_LOW; LCD_RS_LOW;
lld_lcdwrite(lcdReg); lld_lcdwrite(lcdReg);
LCD_RS_HIGH; LCD_RS_HIGH;
LCD_CS_HIGH;
} }
void lcdWriteData(uint16_t lcdData) { void lcdWriteData(uint16_t lcdData) {
LCD_CS_LOW;
lld_lcdwrite(lcdData); lld_lcdwrite(lcdData);
LCD_CS_HIGH;
} }
void lcdWriteReg(uint16_t lcdReg, uint16_t lcdRegValue) { void lcdWriteReg(uint16_t lcdReg, uint16_t lcdRegValue) {

1128
fonts.c

File diff suppressed because it is too large Load Diff

29
fonts.h
View File

@ -1,12 +1,27 @@
#ifndef ASCIILIB_H /*
#define ASCIILIB_H * fonts.h
*
* File containing prototype of the fonts for display
*
*
*/
#include <string.h> #include <stdint.h>
//#define ASCII_8X16_MS_Gothic #ifndef _FONT_
#define ASCII_8X16_System #define _FONT_
void GetASCIICode(unsigned char* pBuffer,unsigned char ASCII); #define FONT_TABLE_HEIGHT_IDX 0
#define FONT_TABLE_PAD_AFTER_CHAR_IDX 1
#define FONT_TABLE_LINE_SPACING_IDX 2
#define FONT_TABLE_DECENDERS_HEIGHT_IDX 3
#define FONT_TABLE_UNUSED_IDX 4
#define FONT_TABLE_CHAR_LOOKUP_IDX 5
extern const uint8_t font_Small[];
extern const uint8_t font_Larger[];
//extern const uint8_t font_Medium[];
extern const uint8_t font_MediumBold[];
extern const uint8_t font_LargeNumbers[];
#endif #endif

135
glcd.c
View File

@ -1,14 +1,23 @@
#include "glcd.h" #include "glcd.h"
#include "fonts.h" #include "fonts.h"
#include <stdlib.h>
#include <math.h> #include <math.h>
uint8_t font_width = 8, font_height = 16;
uint16_t lcd_width, lcd_height; uint16_t lcd_width, lcd_height;
uint16_t bgcolor=White, fgcolor=Black;
uint16_t cx, cy;
static uint8_t tpText=0;
const uint8_t* font;
void lcdInit(void) { void lcdInit(void) {
lld_lcdInit(); lld_lcdInit();
lcd_width = SCREEN_WIDTH; lcd_width = SCREEN_WIDTH;
lcd_height = SCREEN_HEIGHT; lcd_height = SCREEN_HEIGHT;
lcdSetFont(font_MediumBold);
} }
uint16_t lcdGetHeight(void) { uint16_t lcdGetHeight(void) {
@ -109,41 +118,102 @@ void lcdDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t co
} }
} }
void lcdDrawChar(uint16_t x, uint16_t y, const char c, uint16_t charcolor, uint16_t bkcolor) { void lcdEnableTransparentText(uint8_t en) {
uint16_t i = 0; tpText=en;
uint16_t j = 0; }
unsigned char buffer[16];
unsigned char tmp_char=0;
GetASCIICode(buffer,c); void lcdDrawChar(char c) {
const uint8_t* ptr;
for (i=0;i<16;i++) { uint8_t fontHeight=lcdGetCurFontHeight();
tmp_char=buffer[i]; uint8_t sps=font[FONT_TABLE_PAD_AFTER_CHAR_IDX];
for (j=0;j<8;j++) {
if (((tmp_char >> (7-j)) & 0x01) == 0x01) uint16_t chi;
lcdDrawPixel(x+j,y+i,charcolor);
else uint16_t x,y;
lcdDrawPixel(x+j,y+i,bkcolor);
// No support for nongraphic characters, so just ignore them
if (c<0x20||c>0x7F) {
if (c=='\n') lcdLineBreak();
return;
}
chi=*(uint16_t*)(&font[FONT_TABLE_CHAR_LOOKUP_IDX+ (c-0x20)*2]);
ptr=font+chi;
uint8_t fontWidth=*(ptr++);
if (cx+fontWidth>lcdGetWidth()) lcdLineBreak();
for (x=0;x<fontWidth;x++) {
chi=*(uint16_t*)ptr;
for (y=0;y<fontHeight;y++) {
if (chi&0x01)
lcdDrawPixel(cx+x, cy+y, fgcolor);
else if (!tpText)
lcdDrawPixel(cx+x, cy+y, bgcolor);
chi>>=1;
}
ptr+=2;
}
cx+=fontWidth;
if (sps!=0) {
if (!tpText) lcdFillArea(cx,cy,sps,fontHeight,fgcolor);
cx+=sps;
} }
} }
void lcdPutString(const char *str) {
while (*str) lcdDrawChar(*str++);
} }
void lcdDrawString(uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bkcolor) { void lcdDrawString(uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bkcolor) {
uint8_t TempChar; uint16_t _bg=bgcolor, _fg=fgcolor;
cx=x;
do { cy=y;
TempChar = *str++; bgcolor=bkcolor;
lcdDrawChar(x, y, TempChar, color, bkcolor); fgcolor=color;
if(x<232) { lcdPutString(str);
x+=8; bgcolor=_bg;
} else if(y<304) { fgcolor=_fg;
x=0;
y+=16;
} else {
x=0;
y=0;
} }
} while(*str != 0);
uint16_t lcdMeasureChar(char c) {
const uint8_t* ptr;
// First get spaces after each character, usually 0 but can change
uint8_t sps=font[FONT_TABLE_PAD_AFTER_CHAR_IDX];
uint16_t chi;
if (c<0x20||c>0x7F) {
return 0;
}
chi=*(uint16_t*)(&font[FONT_TABLE_CHAR_LOOKUP_IDX+ (c-0x20)*2]);
ptr=font+chi;
uint8_t fontWidth=*(ptr++);
return fontWidth+sps;
}
uint16_t lcdMeasureString(const char* str) {
uint16_t result=0;
while (*str) result+=lcdMeasureChar(*str++);
return result;
}
void lcdLineBreak() {
// x=0 seems too much on the edge. So I keep it at 3
cx=3;
cy+=lcdGetCurFontHeight();
} }
uint16_t lcdBGR2RGB(uint16_t color) { uint16_t lcdBGR2RGB(uint16_t color) {
@ -200,17 +270,16 @@ void lcdDrawRect(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint8_t fil
} }
} }
void lcdDrawRectString(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint8_t *str, uint16_t fontColor, uint16_t bkColor) { void lcdDrawRectString(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, const char *str, uint16_t fontColor, uint16_t bkColor) {
if(((strlen(str)*8) < (x1-x0)) && ((y1-y0) > font_height)) {
uint16_t off_left, off_up; uint16_t off_left, off_up;
off_left = ((x1-x0) - (strlen(str) * font_width)) / 2; off_left = ((x1-x0)-lcdMeasureString(str))/2;
off_up = ((y1-y0) - font_height) / 2; off_up = ((y1-y0) - lcdGetCurFontHeight()) / 2;
lcdDrawRect(x0, y0, x1, y1, 1, bkColor); lcdDrawRect(x0, y0, x1, y1, 1, bkColor);
lcdDrawString(x0+off_left, y0+off_up, str, fontColor, bkColor); lcdDrawString(x0+off_left, y0+off_up, str, fontColor, bkColor);
} }
}
void lcdDrawCircle(uint16_t x, uint16_t y, uint16_t radius, uint8_t filled, uint16_t color) { void lcdDrawCircle(uint16_t x, uint16_t y, uint16_t radius, uint8_t filled, uint16_t color) {
int16_t a, b, P; int16_t a, b, P;

27
glcd.h
View File

@ -30,21 +30,42 @@
enum orientation {portrait, landscape, portraitInv, landscapeInv}; enum orientation {portrait, landscape, portraitInv, landscapeInv};
enum filled {frame, filled}; enum filled {frame, filled};
// For text rendering only
extern uint16_t bgcolor, fgcolor;
extern uint16_t cx, cy;
extern const uint8_t* font;
// A few macros
#define lcdGotoXY(x,y) { cx=x; cy=y; }
#define lcdGetCurFontHeight() (font[FONT_TABLE_HEIGHT_IDX])
#define lcdSetFont(fnt) { font=fnt; }
void lcdInit(void); void lcdInit(void);
void lcdClear(uint16_t color); void lcdClear(uint16_t color);
void lcdSetOrientation(uint8_t newOrientation); void lcdSetOrientation(uint8_t newOrientation);
void lcdSetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); void lcdSetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
void lcdFillArea(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color); void lcdFillArea(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color);
void lcdDrawPixel(uint16_t x, uint16_t y, uint16_t point); void lcdDrawPixel(uint16_t x, uint16_t y, uint16_t point);
void lcdDrawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color); void lcdDrawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color);
void lcdDrawRect(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint8_t filled, uint16_t color); void lcdDrawRect(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint8_t filled, uint16_t color);
void lcdDrawRectString(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint8_t* str, uint16_t fontColor, uint16_t bkColor); void lcdDrawRectString(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, const char* str, uint16_t fontColor, uint16_t bkColor);
void lcdDrawCircle(uint16_t x, uint16_t y, uint16_t radius, uint8_t filled, uint16_t color); void lcdDrawCircle(uint16_t x, uint16_t y, uint16_t radius, uint8_t filled, uint16_t color);
void lcdDrawString(uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bkColor);
void lcdDrawChar(uint16_t x, uint16_t y, const char c, uint16_t charcolor, uint16_t bkColor); void lcdEnableTransparentText(uint8_t en);
void lcdDrawChar(char c);
void lcdPutString(const char *str);
void lcdDrawString(uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bkcolor);
void lcdLineBreak(void);
uint16_t lcdMeasureChar(char c);
uint16_t lcdMeasureString(const char* str);
uint16_t lcdGetHeight(void); uint16_t lcdGetHeight(void);
uint16_t lcdGetWidth(void); uint16_t lcdGetWidth(void);
uint16_t lcdGetOrientation(void); uint16_t lcdGetOrientation(void);
uint16_t lcdBGR2RGB(uint16_t color); uint16_t lcdBGR2RGB(uint16_t color);
uint16_t lcdGetPixelColor(uint16_t x, uint16_t y); uint16_t lcdGetPixelColor(uint16_t x, uint16_t y);

View File

@ -122,6 +122,7 @@ void tpCalibrate(void) {
lcdSetOrientation(portrait); lcdSetOrientation(portrait);
lcdClear(Red); lcdClear(Red);
cx=40; cy=10;
lcdDrawString(40, 10, "Touchpad Calibration", White, Red); lcdDrawString(40, 10, "Touchpad Calibration", White, Red);
for(i=0; i<2; i++) { for(i=0; i<2; i++) {