Enhanced font support: support extended(utf8) characters
This commit is contained in:
parent
1bfcc7baf6
commit
f3b14ba4de
|
@ -17,6 +17,7 @@ struct FONT_DEF {
|
||||||
uint8_t u8LastChar; /* The last character available */
|
uint8_t u8LastChar; /* The last character available */
|
||||||
const uint8_t *au8FontTable; /* Font table start address in memory */
|
const uint8_t *au8FontTable; /* Font table start address in memory */
|
||||||
const FONT_CHAR_INFO *charInfo; /* Pointer to array of char information */
|
const FONT_CHAR_INFO *charInfo; /* Pointer to array of char information */
|
||||||
|
const uint16_t *charExtra; /* Pointer to array of extra char info */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef const struct FONT_DEF * FONT;
|
typedef const struct FONT_DEF * FONT;
|
||||||
|
|
33
lcd/render.c
33
lcd/render.c
|
@ -9,7 +9,7 @@ char font_direction = FONT_DIR_LTR;
|
||||||
|
|
||||||
/* Exported Functions */
|
/* Exported Functions */
|
||||||
|
|
||||||
int DoChar(int sx, int sy, char c){
|
int DoChar(int sx, int sy, int c){
|
||||||
int x=0;
|
int x=0;
|
||||||
|
|
||||||
/* how many bytes is it high? */
|
/* how many bytes is it high? */
|
||||||
|
@ -22,8 +22,20 @@ int DoChar(int sx, int sy, char c){
|
||||||
int ry=RESY-sy-font->u8Height;
|
int ry=RESY-sy-font->u8Height;
|
||||||
|
|
||||||
/* Does this font provide this character? */
|
/* Does this font provide this character? */
|
||||||
if(c<font->u8FirstChar || c>font->u8LastChar)
|
if(c<font->u8FirstChar)
|
||||||
c=font->u8FirstChar+1; // error
|
c=font->u8FirstChar+1; // error
|
||||||
|
if(c>font->u8LastChar && font->charExtra == NULL)
|
||||||
|
c=font->u8FirstChar+1; // error
|
||||||
|
|
||||||
|
if(c>font->u8LastChar && font->charExtra != NULL){
|
||||||
|
int cc=0;
|
||||||
|
while( font->charExtra[cc] < c)
|
||||||
|
cc++;
|
||||||
|
if(font->charExtra[cc] > c)
|
||||||
|
c=font->u8FirstChar+1; // error
|
||||||
|
else
|
||||||
|
c=font->u8LastChar+cc+1;
|
||||||
|
};
|
||||||
|
|
||||||
/* starting offset into character source data */
|
/* starting offset into character source data */
|
||||||
int toff=0,width,preblank=0,blank=0;
|
int toff=0,width,preblank=0,blank=0;
|
||||||
|
@ -127,9 +139,26 @@ int DoChar(int sx, int sy, char c){
|
||||||
return sx-dmul*(x+preblank+blank);
|
return sx-dmul*(x+preblank+blank);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define UTF8
|
||||||
|
// decode 2 and 4-byte utf-8 strings.
|
||||||
|
#define UT2(a,b) ( ((a&31)<<6) + (b&63) )
|
||||||
|
#define UT3(a,b,c) ( ((a&15)<<12) + ((b&63)<<6) + (c&63) )
|
||||||
|
|
||||||
int DoString(int sx, int sy, char *s){
|
int DoString(int sx, int sy, char *s){
|
||||||
char *c;
|
char *c;
|
||||||
|
int uc;
|
||||||
for(c=s;*c!=0;c++){
|
for(c=s;*c!=0;c++){
|
||||||
|
#ifdef UTF8
|
||||||
|
/* will b0rk on non-utf8 */
|
||||||
|
if((*c&(128+64+32))==(128+64)){
|
||||||
|
uc=UT2(*c,*(++c));
|
||||||
|
sx=DoChar(sx,sy,uc);
|
||||||
|
}else if( (*c&(128+64+32+16))==(128+64+32)){
|
||||||
|
uc=UT3(*c,*(++c),*(++c));
|
||||||
|
sx=DoChar(sx,sy,uc);
|
||||||
|
}else
|
||||||
|
#endif
|
||||||
|
|
||||||
sx=DoChar(sx,sy,*c);
|
sx=DoChar(sx,sy,*c);
|
||||||
};
|
};
|
||||||
return sx;
|
return sx;
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
}while(0)
|
}while(0)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int DoChar(int sx, int sy, char c);
|
int DoChar(int sx, int sy, int c);
|
||||||
int DoString(int sx, int sy, char *s);
|
int DoString(int sx, int sy, char *s);
|
||||||
int DoInt(int sx, int sy, int num);
|
int DoInt(int sx, int sy, int num);
|
||||||
int DoIntX(int sx, int sy, unsigned int num);
|
int DoIntX(int sx, int sy, unsigned int num);
|
||||||
|
|
|
@ -548,9 +548,9 @@ const uint8_t au8Font8x8Thin[]= {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Global variables */
|
/* Global variables */
|
||||||
const struct FONT_DEF Font_3x6 = {3, 6, 32, 96, au8Font3x6, NULL};
|
const struct FONT_DEF Font_3x6 = {3, 6, 32, 96, au8Font3x6, NULL,NULL};
|
||||||
const struct FONT_DEF Font_5x8 = {5, 8, 32, 128, au8Font5x8, NULL};
|
const struct FONT_DEF Font_5x8 = {5, 8, 32, 128, au8Font5x8, NULL,NULL};
|
||||||
const struct FONT_DEF Font_7x8 = {7, 8, 32, 128, au8Font7x8, NULL};
|
const struct FONT_DEF Font_7x8 = {7, 8, 32, 128, au8Font7x8, NULL,NULL};
|
||||||
const struct FONT_DEF Font_8x8 = {8, 8, 32, 128, au8Font8x8, NULL};
|
const struct FONT_DEF Font_8x8 = {8, 8, 32, 128, au8Font8x8, NULL,NULL};
|
||||||
const struct FONT_DEF Font_8x8Thin = {8, 8, 32, 128, au8Font8x8Thin, NULL};
|
const struct FONT_DEF Font_8x8Thin = {8, 8, 32, 128, au8Font8x8Thin,NULL,NULL};
|
||||||
|
|
||||||
|
|
978
lcd/ubuntu18.c
978
lcd/ubuntu18.c
File diff suppressed because it is too large
Load Diff
|
@ -22,10 +22,9 @@ $|=1;
|
||||||
### Configure me
|
### Configure me
|
||||||
###
|
###
|
||||||
|
|
||||||
my $charlist;
|
my @charlist=(32..126,0x20ac); #,0x3044 # hiragana I
|
||||||
for(32..126){
|
push @charlist,map {ord $_} qw(ä ö ü Ä Ö Ü ß);
|
||||||
$charlist.=chr $_;
|
|
||||||
};
|
|
||||||
|
|
||||||
###
|
###
|
||||||
### Runtime Options
|
### Runtime Options
|
||||||
|
@ -84,6 +83,9 @@ $file.="-raw" if($raw);
|
||||||
|
|
||||||
print "Rasterizing $title into ${file}.c\n";
|
print "Rasterizing $title into ${file}.c\n";
|
||||||
|
|
||||||
|
@charlist=sort { $a <=> $b } @charlist;
|
||||||
|
my $charlist=join("",map {chr $_} @charlist);
|
||||||
|
|
||||||
### Get & optimize bounding box
|
### Get & optimize bounding box
|
||||||
|
|
||||||
my $im = new GD::Image($width,$height);
|
my $im = new GD::Image($width,$height);
|
||||||
|
@ -278,9 +280,22 @@ EOF
|
||||||
|
|
||||||
print C @offsets;
|
print C @offsets;
|
||||||
|
|
||||||
my($first)=ord substr($charlist,0,1);
|
my($first)=$charlist[0];
|
||||||
my($last)=$first+length($charlist)-1;
|
my($last)=$first-1;
|
||||||
printf C "};
|
for(@charlist){
|
||||||
|
last unless $_ == $last+1;
|
||||||
|
$last++;
|
||||||
|
};
|
||||||
|
print C <<EOF;
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t ${fonts}Extra[] = {
|
||||||
|
EOF
|
||||||
|
|
||||||
|
print C join(",",@charlist[($last-$first+1)..$#charlist],0xffff);
|
||||||
|
|
||||||
|
printf C "
|
||||||
|
};
|
||||||
|
|
||||||
/* Font info */
|
/* Font info */
|
||||||
const struct FONT_DEF Font_$fonts = {
|
const struct FONT_DEF Font_$fonts = {
|
||||||
|
@ -288,9 +303,9 @@ const struct FONT_DEF Font_$fonts = {
|
||||||
%3d, /* character height */
|
%3d, /* character height */
|
||||||
%3d, /* first char */
|
%3d, /* first char */
|
||||||
%3d, /* last char */
|
%3d, /* last char */
|
||||||
%s, %s
|
%s, %s, %s
|
||||||
};
|
};
|
||||||
",1,$pxsize,$first,$last,"${fonts}Bitmaps","${fonts}Lengths";
|
",1,$pxsize,$first,$last,"${fonts}Bitmaps","${fonts}Lengths","${fonts}Extra";
|
||||||
|
|
||||||
printf C "\n";
|
printf C "\n";
|
||||||
printf C "/* Font metadata: \n";
|
printf C "/* Font metadata: \n";
|
||||||
|
|
Loading…
Reference in New Issue