Index: drivers/diacritic.c =================================================================== --- drivers/diacritic.c (revision 0) +++ drivers/diacritic.c (revision 0) @@ -0,0 +1,127 @@ +#include "diacritic.h" + +const struct diac_range diacritic[] = { + {0xfb1e, 0xfb1e}, /* Alpha Presentation Forms */ + {0x0483, 0x0489}, /* Cyrillic */ + {0x2de0, 0x2dff}, /* Cyrillic Extended-A */ + {0x0300, 0x0357}, /* Combining Diacritical Marks */ + {0x035d, 0x036f}, + {0x1dc0, 0x1de6}, /* Combining Diacritical Marks Supplement */ + {0x1dfd, 0x1dff}, + {0x20d0, 0x20ea}, /* Combining Diacritical Marks for Symbols */ + {0x20ee, 0x20f0}, + {0xfe20, 0xfe26}, /* Combining Half Marks */ + {0x0591, 0x05a1}, /* Hebrew */ + {0x05a3, 0x05bd}, + {0x05bf, 0x05bf}, + {0x05c1, 0x05c2}, + {0x05c4, 0x05c4}, + {0x0610, 0x061a}, /* Arabic */ + {0x064b, 0x0658}, + {0x0670, 0x0670}, + {0x06d6, 0x06dc}, + {0x06df, 0x06e4}, + {0x06e7, 0x06e8}, + {0x06ea, 0x06ed}, + {0x0711, 0x0711}, /* Syriac */ + {0x0730, 0x074a}, + {0x0816, 0x0819}, /* Samaritan */ + {0x081b, 0x0823}, + {0x0825, 0x0827}, + {0x0829, 0x082d}, + {0x07a6, 0x07b0}, /* Thaana */ + {0x0900, 0x0903}, /* Devanagari */ + {0x093c, 0x093c}, + {0x093e, 0x094e}, + {0x0951, 0x0955}, + {0x0962, 0x0963}, + {0xa8e0, 0xa8f1}, /* Devanagari Extended */ + {0x0981, 0x0983}, /* Bengali */ + {0x09bc, 0x09bc}, + {0x09be, 0x09cd}, + {0x09d7, 0x09d7}, + {0x09e2, 0x09e3}, + {0x0a01, 0x0a03}, /* Gurmukhi */ + {0x0a3c, 0x0a51}, + {0x0a70, 0x0a71}, + {0x0a75, 0x0a75}, + {0x0a81, 0x0a83}, /* Gujarati */ + {0x0abc, 0x0abc}, + {0x0abe, 0x0acd}, + {0x0ae2, 0x0ae3}, + {0x0b01, 0x0b03}, /* Oriya */ + {0x0b3c, 0x0b3c}, + {0x0b3e, 0x0b57}, + {0x0b82, 0x0b82}, /* Tamil */ + {0x0bce, 0x0bed}, + {0x0bd7, 0x0bd7}, + {0x0c01, 0x0c03}, /* Telugu */ + {0x0c3e, 0x0c56}, + {0x0c82, 0x0c83}, /* Kannada */ + {0x0cbc, 0x0cd6}, + {0x0ce3, 0x0ce3}, + {0x0d4a, 0x0d4c}, /* Malayalam */ + {0x0d82, 0x0d83}, /* Sinhala */ + {0x0dca, 0x0df3}, + {0x1c24, 0x1c37}, /* Lepcha */ + {0x1920, 0x193b}, /* Limbu */ + {0xabe3, 0xabea}, /* Meetei Mayek */ + {0xabec, 0xabed}, + {0x1cd0, 0x1cd2}, /* Vedic Extensions */ + {0x1cd4, 0x1ce8}, + {0x1ced, 0x1ced}, + {0x1cf2, 0x1cf2}, + {0x0e31, 0x0e31}, /* Thai */ + {0x0e34, 0x0e3a}, + {0x0e47, 0x0e4e}, + {0x0eb1, 0x0eb1}, /* Lao */ + {0x0eb4, 0x0ebc}, + {0x0ec8, 0x0ecd}, + {0x102b, 0x103e}, /* Myanmar */ + {0x1056, 0x1059}, + {0x105e, 0x1060}, + {0x1062, 0x1064}, + {0x1067, 0x106d}, + {0x1071, 0x1074}, + {0x1082, 0x108d}, + {0x108f, 0x108f}, + {0x109a, 0x109d}, + {0xaa7b, 0xaa7b}, /* Myanmar Extended-A */ + {0x17b6, 0x17d3}, /* Khmer */ + {0x17dd, 0x17dd}, + {0x1a55, 0x1a7f}, /* Tai Tham */ + {0xaab0, 0xaab0}, /* Tai Viet */ + {0xaab2, 0xaab4}, + {0xaab7, 0xaab8}, + {0xaabe, 0xaabf}, + {0xaac1, 0xaac1}, + {0x1732, 0x1734}, /* Hanunoo */ + {0x1752, 0x1753}, /* Buhid */ + {0x1772, 0x1773}, /* Tagbanwa */ + {0x1b00, 0x1b04}, /* Balinese */ + {0x1b34, 0x1b44}, + {0x1b6b, 0x1b73}, + {0xa980, 0xa983}, /* Javanese */ + {0xa9b3, 0xa9c0}, + {0xa947, 0xa949}, /* Rejang */ + {0xa94b, 0xa94d}, + {0x1b80, 0x1b82}, /* Sundanese */ + {0x1ba1, 0x1baa}, + {0xa6f0, 0xa6f1}, /* Bamum */ + {0x3099, 0x309a}, /* Hiragana */ +}; + +int is_diacritic(unsigned short ch) +{ + unsigned int n; + + for(n=0; n < sizeof(diacritic)/sizeof(struct diac_range); n++) + { + if(ch >= diacritic[n].begin && ch <= diacritic[n].end) + { + return 1; + } + } + + return 0; +} Index: drivers/diacritic.h =================================================================== --- drivers/diacritic.h (revision 0) +++ drivers/diacritic.h (revision 0) @@ -0,0 +1,9 @@ +struct diac_range { + unsigned short begin; + unsigned short end; +}; + +/* diacritic characters */ +extern const struct diac_range diacritic[]; + +int is_diacritic(unsigned short ch); Index: drivers/lcd-bitmap-common.c =================================================================== --- drivers/lcd-bitmap-common.c (revision 23340) +++ drivers/lcd-bitmap-common.c (working copy) @@ -29,6 +29,7 @@ ****************************************************************************/ #include "stdarg.h" #include "sprintf.h" +#include "diacritic.h" #ifndef LCDFN /* Not compiling for remote - define macros for main LCD. */ #define LCDFN(fn) lcd_ ## fn @@ -86,6 +87,7 @@ unsigned short *ucs; struct font* pf = font_get(current_vp->font); int vp_flags = current_vp->flags; + int base_width = 0; ucs = bidi_l2v(str, 1); @@ -111,7 +113,7 @@ while ((ch = *ucs++) != 0 && x < current_vp->width) { - int width; + int width, drawmode = 0, diac, base_ofs = 0; const unsigned char *bits; /* get proportional width and glyph bits */ @@ -122,14 +124,39 @@ ofs -= width; continue; } + + diac = is_diacritic(ch); + + if(diac) + { + drawmode = current_vp->drawmode; + current_vp->drawmode = DRMODE_FG; + } + else + { + base_width = width; + } bits = font_get_bits(pf, ch); + + if(width != base_width) + { + base_ofs = (base_width - width)/2; + } + + LCDFN(mono_bitmap_part)(bits, ofs, 0, width, x + base_ofs, y, + width - ofs, pf->height); - LCDFN(mono_bitmap_part)(bits, ofs, 0, width, x, y, width - ofs, - pf->height); + if(diac) + { + current_vp->drawmode = drawmode; + } - x += width - ofs; - ofs = 0; + if(!is_diacritic(*ucs)) + { + x += base_width - ofs; + ofs = 0; + } } } /* put a string at a given pixel position */