From 3b2f07ae85c9c8517ee2df1defbae88b93e39a14 Mon Sep 17 00:00:00 2001 From: HThuren <99370924+HThuren@users.noreply.github.com> Date: Wed, 7 Sep 2022 12:15:08 +0200 Subject: [PATCH] fix: Danish special characters on B&W radios (#2271) * Dannish special characters * Danish special characters * Danish special characters * Danish special characters * Danish special characters * Danish special characters * chore: Reset header to `copyright-header` template `tools/copyright-header.txt` template is what should be used. Also added line at EoF to make git happy Co-authored-by: Peter Feerick --- radio/src/fonts/sqt5/font_da_04x06.png | Bin 0 -> 254 bytes radio/src/fonts/sqt5/font_da_05x07.png | Bin 0 -> 263 bytes radio/src/fonts/sqt5/font_da_08x10.png | Bin 0 -> 360 bytes radio/src/fonts/sqt5/font_da_10x14.png | Bin 0 -> 384 bytes radio/src/fonts/std/font_da_04x06.png | Bin 0 -> 254 bytes radio/src/fonts/std/font_da_05x07.png | Bin 0 -> 263 bytes radio/src/fonts/std/font_da_08x10.png | Bin 0 -> 360 bytes radio/src/fonts/std/font_da_10x14.png | Bin 0 -> 384 bytes radio/src/gui/common/stdlcd/fonts.cpp | 8 +- radio/src/gui/common/stdlcd/utf8.cpp | 10 ++- radio/src/translations/da.h | 9 +-- radio/util/font2png.py | 103 +++++++++++++++++++++++++ tools/charset.py | 3 +- 13 files changed, 120 insertions(+), 13 deletions(-) create mode 100644 radio/src/fonts/sqt5/font_da_04x06.png create mode 100644 radio/src/fonts/sqt5/font_da_05x07.png create mode 100644 radio/src/fonts/sqt5/font_da_08x10.png create mode 100644 radio/src/fonts/sqt5/font_da_10x14.png create mode 100644 radio/src/fonts/std/font_da_04x06.png create mode 100644 radio/src/fonts/std/font_da_05x07.png create mode 100644 radio/src/fonts/std/font_da_08x10.png create mode 100644 radio/src/fonts/std/font_da_10x14.png create mode 100644 radio/util/font2png.py diff --git a/radio/src/fonts/sqt5/font_da_04x06.png b/radio/src/fonts/sqt5/font_da_04x06.png new file mode 100644 index 0000000000000000000000000000000000000000..eb759765428bec8027b086eac2a4194ea0a8b9da GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^azM<^!3HGdU;h0Fq!^2X+?^QKos)S9a~60+7Bet#3xhBt!>luu z%YZ_~o-U3d7XE7|M)Ms|;9xoW`~J?-p4$q6zdW8VjujL8y_0zq;g8!oS^xN&)!WxZJXJ{37WXl2VcWAmS|U9p{brp( tT8@Uw{p)p!Zqw%eGh8F~|9zw-r{`OpP>d4bk5c)I$ztaD0e0sw&#Rp$Tz literal 0 HcmV?d00001 diff --git a/radio/src/fonts/sqt5/font_da_05x07.png b/radio/src/fonts/sqt5/font_da_05x07.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ace6225db56edcc739ba0c7622422b264b6269 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^azM<%!3HGX?e|v!QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0WWg+Z8+Vb&Z8kd7p8cNc~ZR#^`qhrPtp*OmP)hqQ>g^0tZJ zwgQD}JY5_^Ed19_Y~*WD;BZ;`|NnEL_9ci%)6q6_@FCAkw_z_^Okf6}Ron92s_A zlU%i7ed*O?*-PeSlkW-LHSMm=S`~lqmj~~^=|OU7fo%^h_vxww-NE4L>gTe~DWM4f DW;|X| literal 0 HcmV?d00001 diff --git a/radio/src/fonts/sqt5/font_da_08x10.png b/radio/src/fonts/sqt5/font_da_08x10.png new file mode 100644 index 0000000000000000000000000000000000000000..1edd0316e2c245219c8470491cf8bd33d3f5117f GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^20+Zi!3HE%cG(32DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9GG!XV7ZFl&wkNJo;ly9+}HtE>l*!(QU)>&kwYM^v2I;uh=1 zP@vFVPZ!4!5AUs08ikq-IGor1|9^gV;jwPP4d;Hn+ZD#axIFr|j*s-(t)=N4*C*K( zn!o?2JY#!pe%nzu<;v6b`x&J+U(C4o$$pR1xzNq`Y`$@@6`Y24Oy{rmUUho`;|>`=ed%t4*P6e$8k)X z_e9==(zx}{U!6W_@rS$6)nHy`$pnsTsb8hKO}>2p@l^Xsb7-?$^H%|0>93uC7QTAb z_2|qNbva&7ljm_W?IVg$yH_!5=v?ame17IK{mRlCydjn%z))gf@O1TaS?83{1OTE4 BigN$} literal 0 HcmV?d00001 diff --git a/radio/src/fonts/sqt5/font_da_10x14.png b/radio/src/fonts/sqt5/font_da_10x14.png new file mode 100644 index 0000000000000000000000000000000000000000..a5de923bd14f36ccc79a54d4e8d57f06ad5ffa22 GIT binary patch literal 384 zcmeAS@N?(olHy`uVBq!ia0vp^Hb5-E!3HF~Cdt?XDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9GG!XV7ZFl&wkNJo;ly9+}HtE>l*!(QU)>&kwYLt4~~X~pC9 zXMjRqJzX3_BHYhTZ{%w>;Bbll|9}4Wxsu%TL^7Ao)i=yqC=L~(F@IiF`KvY3yUSz#WhOIU0eCfW4#bt_~kEE5B8quz4H5Z`HxkW2ea~z ztZ7&ia#*nNTw<{D#uHW+e>3j3vg#;VN=8^o`zqPZpVE6>(k1!-%sM~{-BZLcAz-_ZF8dL1JOq_&Ru_fV0PEB z)eAo+N%@!mYFX^NtwT=g@+H@;)v~Gw&PJ-0@*NlKmh<`5qAc9|*z`Mu)*v2?( a=6h{=z3%^(Wt)Hjz~JfX=d#Wzp$P#0Gnb(N literal 0 HcmV?d00001 diff --git a/radio/src/fonts/std/font_da_04x06.png b/radio/src/fonts/std/font_da_04x06.png new file mode 100644 index 0000000000000000000000000000000000000000..eb759765428bec8027b086eac2a4194ea0a8b9da GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^azM<^!3HGdU;h0Fq!^2X+?^QKos)S9a~60+7Bet#3xhBt!>luu z%YZ_~o-U3d7XE7|M)Ms|;9xoW`~J?-p4$q6zdW8VjujL8y_0zq;g8!oS^xN&)!WxZJXJ{37WXl2VcWAmS|U9p{brp( tT8@Uw{p)p!Zqw%eGh8F~|9zw-r{`OpP>d4bk5c)I$ztaD0e0sw&#Rp$Tz literal 0 HcmV?d00001 diff --git a/radio/src/fonts/std/font_da_05x07.png b/radio/src/fonts/std/font_da_05x07.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ace6225db56edcc739ba0c7622422b264b6269 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^azM<%!3HGX?e|v!QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0WWg+Z8+Vb&Z8kd7p8cNc~ZR#^`qhrPtp*OmP)hqQ>g^0tZJ zwgQD}JY5_^Ed19_Y~*WD;BZ;`|NnEL_9ci%)6q6_@FCAkw_z_^Okf6}Ron92s_A zlU%i7ed*O?*-PeSlkW-LHSMm=S`~lqmj~~^=|OU7fo%^h_vxww-NE4L>gTe~DWM4f DW;|X| literal 0 HcmV?d00001 diff --git a/radio/src/fonts/std/font_da_08x10.png b/radio/src/fonts/std/font_da_08x10.png new file mode 100644 index 0000000000000000000000000000000000000000..1edd0316e2c245219c8470491cf8bd33d3f5117f GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^20+Zi!3HE%cG(32DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9GG!XV7ZFl&wkNJo;ly9+}HtE>l*!(QU)>&kwYM^v2I;uh=1 zP@vFVPZ!4!5AUs08ikq-IGor1|9^gV;jwPP4d;Hn+ZD#axIFr|j*s-(t)=N4*C*K( zn!o?2JY#!pe%nzu<;v6b`x&J+U(C4o$$pR1xzNq`Y`$@@6`Y24Oy{rmUUho`;|>`=ed%t4*P6e$8k)X z_e9==(zx}{U!6W_@rS$6)nHy`$pnsTsb8hKO}>2p@l^Xsb7-?$^H%|0>93uC7QTAb z_2|qNbva&7ljm_W?IVg$yH_!5=v?ame17IK{mRlCydjn%z))gf@O1TaS?83{1OTE4 BigN$} literal 0 HcmV?d00001 diff --git a/radio/src/fonts/std/font_da_10x14.png b/radio/src/fonts/std/font_da_10x14.png new file mode 100644 index 0000000000000000000000000000000000000000..a5de923bd14f36ccc79a54d4e8d57f06ad5ffa22 GIT binary patch literal 384 zcmeAS@N?(olHy`uVBq!ia0vp^Hb5-E!3HF~Cdt?XDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9GG!XV7ZFl&wkNJo;ly9+}HtE>l*!(QU)>&kwYLt4~~X~pC9 zXMjRqJzX3_BHYhTZ{%w>;Bbll|9}4Wxsu%TL^7Ao)i=yqC=L~(F@IiF`KvY3yUSz#WhOIU0eCfW4#bt_~kEE5B8quz4H5Z`HxkW2ea~z ztZ7&ia#*nNTw<{D#uHW+e>3j3vg#;VN=8^o`zqPZpVE6>(k1!-%sM~{-BZLcAz-_ZF8dL1JOq_&Ru_fV0PEB z)eAo+N%@!mYFX^NtwT=g@+H@;)v~Gw&PJ-0@*NlKmh<`5qAc9|*z`Mu)*v2?( a=6h{=z3%^(Wt)Hjz~JfX=d#Wzp$P#0Gnb(N literal 0 HcmV?d00001 diff --git a/radio/src/gui/common/stdlcd/fonts.cpp b/radio/src/gui/common/stdlcd/fonts.cpp index 42f71005c..b7e9a8da1 100644 --- a/radio/src/gui/common/stdlcd/fonts.cpp +++ b/radio/src/gui/common/stdlcd/fonts.cpp @@ -27,7 +27,7 @@ const unsigned char font_5x7[] = { #if defined(TRANSLATIONS_DE) #include "font_de_05x07.lbm" #elif defined(TRANSLATIONS_DA) -#include "font_se_05x07.lbm" +#include "font_da_05x07.lbm" #elif defined(TRANSLATIONS_CZ) #include "font_cz_05x07.lbm" #elif defined(TRANSLATIONS_ES) @@ -57,7 +57,7 @@ const unsigned char font_10x14[] = { #if defined(TRANSLATIONS_DE) #include "font_de_10x14.lbm" #elif defined(TRANSLATIONS_DA) - #include "font_se_10x14.lbm" + #include "font_da_10x14.lbm" #elif defined(TRANSLATIONS_CZ) #include "font_cz_10x14.lbm" #elif defined(TRANSLATIONS_ES) @@ -86,7 +86,7 @@ const unsigned char font_4x6[] = { #if defined(TRANSLATIONS_DE) #include "font_de_04x06.lbm" #elif defined(TRANSLATIONS_DA) -#include "font_se_04x06.lbm" +#include "font_da_04x06.lbm" #elif defined(TRANSLATIONS_CZ) #include "font_cz_04x06.lbm" #elif defined(TRANSLATIONS_ES) @@ -111,7 +111,7 @@ const unsigned char font_8x10[] = { #if defined(TRANSLATIONS_DE) #include "font_de_08x10.lbm" #elif defined(TRANSLATIONS_DA) -#include "font_cz_08x10.lbm" +#include "font_da_08x10.lbm" #elif defined(TRANSLATIONS_CZ) #include "font_cz_08x10.lbm" #elif defined(TRANSLATIONS_ES) diff --git a/radio/src/gui/common/stdlcd/utf8.cpp b/radio/src/gui/common/stdlcd/utf8.cpp index 39f37bb17..0fad3b600 100644 --- a/radio/src/gui/common/stdlcd/utf8.cpp +++ b/radio/src/gui/common/stdlcd/utf8.cpp @@ -2,9 +2,9 @@ * Copyright (C) EdgeTX * * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html @@ -27,6 +27,10 @@ static wchar_t _utf8_lut[] = { L'é', L'è', L'à', L'î', L'ç', }; +#elif defined(TRANSLATIONS_DA) +static wchar_t _utf8_lut[] = { + L'å', L'æ', L'ø', L'Å', L'Æ', L'Ø', +}; #elif defined(TRANSLATIONS_DE) static wchar_t _utf8_lut[] = { L'Ä', L'ä', L'Ö', L'ö', L'Ü', L'ü', L'ß', diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index 1f0647daf..12b6abb8d 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -2,9 +2,9 @@ * Copyright (C) EdgeTX * * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html @@ -17,7 +17,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * */ // DK translations author: Henrik Thuren @@ -373,7 +372,7 @@ #define TR_ELEDIRECTION "HØJ retning" #define TR_AILDIRECTION "KRÆ retning" #define TR_COLDIRECTION "PIT retning" -#define TR_MODE "Tilstand" +#define TR_MODE "Tilst." #define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "Ingen fri expo!" #define TR_NOFREEMIXER "Ingen fri mix!" diff --git a/radio/util/font2png.py b/radio/util/font2png.py new file mode 100644 index 000000000..ed1ec2bb0 --- /dev/null +++ b/radio/util/font2png.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import sys, os +import glob + +from PIL import Image, ImageDraw, ImageFont + +chars_en = u""" !"#$%&'()*+,-./0123456789:;<=>?°ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz~|≥""" +chars_fr = u"""éèàîç""" +chars_da = u"""åæøÅÆØ""" +chars_de = u"""ÄäÖöÜüß""" +chars_cz = u"""ěščřžýáíéňóůúďťĚŠČŘŽÝÁÍÉŇÓÚŮĎŤ""" +chars_es = u"""ÑñÁáÉéÍíÓóÚú""" +chars_fi = u"""åäöÅÄÖ""" +chars_it = u"""àù""" +chars_pl = u"""ąćęłńóśżźĄĆĘŁŃÓŚŻŹ""" +chars_pt = u"""ÁáÂâÃãÀàÇçÉéÊêÍíÓóÔôÕõÚú""" + +COUNT_EXTRA_CHARS = 21 + +chars_extra = u"".join([chr(1+i) for i in range(COUNT_EXTRA_CHARS)]) +chars = chars_en + chars_extra + chars_fr + chars_da + chars_de + chars_cz + chars_es + chars_fi + chars_it + chars_pl + chars_pt + + +def createFontBitmap(filename, fontname, fontsize, fontoffset, foreground, background, coordsfile=True): + + + coords = [] + font_filename = 'fonts/' + fontname + '.ttf' + + print("Font filename: %s" % font_filename) + font = ImageFont.truetype(font_filename, fontsize) + + extraImage = None + extraFilename = 'fonts/extra_%dpx.png' % fontsize + + try: + extraImage = Image.open(extraFilename) + extraImage = extraImage.convert('RGB'); + + except IOError: + print("Missing extra symbol filename %s" % extraFilename) + + def getCharWidth(c): + if c in chars_extra: + if extraImage: + # Extra characters 16px + #if fontsize == 16: + if ord(c) <= 9: + return 13 + else: + return 15 + else: + return 0 + elif c == " ": + return 4 + else: + w, h = font.getsize(c) + return w + 1 + + def getFontWidth(): + width = 0 + for c in chars: + width += getCharWidth(c) + return width + + width = getFontWidth() + image = Image.new('RGB', (width, fontsize + 4), background) + draw = ImageDraw.Draw(image) + + width = 0 + for c in chars: + coords.append(width) + + if c in chars_extra: + if extraImage and c == chars_extra[0]: + image.paste(extraImage.copy(),(width,1)) + elif c == " ": + pass + elif c == "j" and fontsize == 32: + w, h = font.getsize(c) + draw.text((width + 2, fontoffset), c, fill=foreground, font=font) + elif c == "j" and fontsize == 64: + aw, h = font.getsize(c) + draw.text((width + 3, fontoffset), c, fill=foreground, font=font) + else: + w, h = font.getsize(c) + draw.text((width + 1, fontoffset), c, fill=foreground, font=font) + + width += getCharWidth(c) + + coords.append(width) + + image.save(filename + ".png") + if coordsfile: + with open(filename + ".specs", "w") as f: + f.write(",".join(str(tmp) for tmp in coords)) + + +# Main +if __name__ == "__main__": + createFontBitmap(sys.argv[4], sys.argv[1], int(sys.argv[2]), int(sys.argv[3]), (0,0,0), (255,255,255)) diff --git a/tools/charset.py b/tools/charset.py index 411ba24cb..6c029d6e6 100644 --- a/tools/charset.py +++ b/tools/charset.py @@ -14,7 +14,7 @@ def is_special_char(c): def get_special_chars(): result = {} - for lang in["en", "fr", "de", "cz", "nl", "es", "fi", "it", "pl", "pt", "se", "cn", "tw"]: + for lang in["en", "fr", "da", "de", "cz", "nl", "es", "fi", "it", "pl", "pt", "se", "cn", "tw"]: charset = set() tools_path = os.path.dirname(os.path.realpath(__file__)) with open(os.path.join(tools_path, "../radio/src/translations/%s.h" % lang), encoding='utf-8') as f: @@ -58,6 +58,7 @@ def get_chars_encoding(subset): special_chars_BW = { "en": "", "fr": "éèàîç", + "da": "åæøÅÆØ", "de": "ÄäÖöÜüß", "cz": "áčéěíóřšúůýÁÍŘÝžÉ", "nl": "",