diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2011-07-23 13:53:59 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2011-07-23 13:53:59 +0000 |
commit | baf4af60ec1100c43dec884c046d55e9a57c6b20 (patch) | |
tree | 5533e72fbb341f9e278d73e037dad5edf4b8a523 | |
parent | e3ba485a852fc10a85533d0c5a28c6e01d66a0d4 (diff) | |
download | nuttx-baf4af60ec1100c43dec884c046d55e9a57c6b20.tar.gz nuttx-baf4af60ec1100c43dec884c046d55e9a57c6b20.tar.bz2 nuttx-baf4af60ec1100c43dec884c046d55e9a57c6b20.zip |
Add JP's BDF font conversion program
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3813 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r-- | apps/examples/README.txt | 7 | ||||
-rw-r--r-- | nuttx/ChangeLog | 5 | ||||
-rw-r--r-- | nuttx/Documentation/NXGraphicsSubsystem.html | 207 | ||||
-rw-r--r-- | nuttx/graphics/README.txt | 148 | ||||
-rw-r--r-- | nuttx/graphics/nxfonts/nxfonts_internal.h | 4 | ||||
-rw-r--r-- | nuttx/tools/Makefile.host | 10 | ||||
-rwxr-xr-x | nuttx/tools/README.txt | 137 | ||||
-rw-r--r-- | nuttx/tools/bdf-converter.c | 407 |
8 files changed, 901 insertions, 24 deletions
diff --git a/apps/examples/README.txt b/apps/examples/README.txt index bef78528e..8e6f05b98 100644 --- a/apps/examples/README.txt +++ b/apps/examples/README.txt @@ -37,7 +37,7 @@ examples/buttons be required. NOTE: This test exercises internal button driver interfaces. As such, it - it relies on internal OS interfaces that are not normally available to a + relies on internal OS interfaces that are not normally available to a user-space program. As a result, this example cannot be used if a NuttX is built as a protected, supervisor kernel (CONFIG_NUTTX_KERNEL). @@ -838,6 +838,11 @@ examples/usbstorage Error results are always shown in the trace output + NOTE: This test exercises internal USB device driver interfaces. As such, + it relies on internal OS interfaces that are not normally available to a + user-space program. As a result, this example cannot be used if a + NuttX is built as a protected, supervisor kernel (CONFIG_NUTTX_KERNEL). + examples/wget ^^^^^^^^^^^^^ diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog index 67809e58d..605c9f767 100644 --- a/nuttx/ChangeLog +++ b/nuttx/ChangeLog @@ -1939,4 +1939,7 @@ * configs/stm3210e-eval/nsh2: Extended to support two new commands: 'msconn' will connect the USB mass storage device; 'msdis' will disconnect the USB storage device. - + * tools/bdf-converter.c. This C file is used to build the bdf-converter + program. The bdf-converter program be used to convert fonts in Bitmap + Distribution Format (BDF) into fonts that can be used in the NX graphics + system.
\ No newline at end of file diff --git a/nuttx/Documentation/NXGraphicsSubsystem.html b/nuttx/Documentation/NXGraphicsSubsystem.html index dd206ed04..d37e24ce1 100644 --- a/nuttx/Documentation/NXGraphicsSubsystem.html +++ b/nuttx/Documentation/NXGraphicsSubsystem.html @@ -12,7 +12,7 @@ <h1><big><font color="#3c34ec"> <i>NX Graphics Subsystem</i> </font></big></h1> - <p>Last Updated: July 19, 2011</p> + <p>Last Updated: July 23, 2011</p> </td> </tr> </table> @@ -178,14 +178,17 @@ </ul> </p> <p> - <big><b>Appendix C</b> <a href="#testcoverage">NX Test Coverage</a></big> + <big><b>Appendix C</b> <a href="#installnewfonts">Installing New Fonts</a></big> + </p> + <p> + <big><b>Appendix D</b> <a href="#testcoverage">NX Test Coverage</a></big> </p> <ul> - <i><b>Table C.1:</b> <a href="#nxglibcoverage">NXGLIB API Test Coverage</a></i><br> - <i><b>Table C.2:</b> <a href="#nxcbcoverage">NX Server Callbacks Test Coverage</a></i><br> - <i><b>Table C.3:</b> <a href="#nxcoverage">NX API Test Coverage</a></i><br> - <i><b>Table C.4:</b> <a href="#nxtkcoverage">NXTK API Test Coverage</a></i><br> - <i><b>Table C.5:</b> <a href="#nxfontscoverage">NXFONTS API Test Coverage</a></i><br> + <i><b>Table D.1:</b> <a href="#nxglibcoverage">NXGLIB API Test Coverage</a></i><br> + <i><b>Table D.2:</b> <a href="#nxcbcoverage">NX Server Callbacks Test Coverage</a></i><br> + <i><b>Table D.3:</b> <a href="#nxcoverage">NX API Test Coverage</a></i><br> + <i><b>Table D.4:</b> <a href="#nxtkcoverage">NXTK API Test Coverage</a></i><br> + <i><b>Table D.5:</b> <a href="#nxfontscoverage">NXFONTS API Test Coverage</a></i><br> </ul> </td> </tr> @@ -2729,7 +2732,185 @@ int nxf_convert_32bpp(FAR uint32_t *dest, uint16_t height, <table width ="100%"> <tr bgcolor="#e4e4e4"> <td> - <h1>Appendix C <a name="testcoverage">NX Test Coverage</a></h1> + <h1>Appendix C <a name="installnewfonts">Installing New Fonts</a></h1> + </td> + </tr> +</table> + +<p> + There is a tool called <i>bdf-converter</i> in the directory <code>tools/.</code>. + The <i>bdf-converter</i> program be used to convert fonts in Bitmap Distribution Format (BDF) into fonts that can be used in the NX graphics system. +</p> +<p> + Below are general instructions for creating and installing a new font in the NX graphic system: +</p> +<ol start="1"> + <li> + <p> + Locate a font in BDF format, + </p> + </li> + <li> + <p> + Use the <i>bdf-converter</i> program to convert the BDF font to the NuttX font format. + This will result in a C header file containing defintions. + That header file should be installed at, for example, <code>graphics/nxfonts/nxfonts_myfont.h</code>. + </p> + </li> +</ol> +<p> + Create a new NuttX configuration variable. + For example, suppose you define the following variable: <code>CONFIG_NXFONT_MYFONT</code>. + Then you would need to: +</p> +<ol start="3"> + <li> + <p> + Define <code>CONFIG_NXFONT_MYFONT=y</code> in your NuttX configuration file. + </p> + </li> +</ol> +<p> + A font ID number has to be assigned for each new font. + The font ID is defined in the file <code>include/nuttx/nxfonts.h</code>. + Those definitions have to be extended to support your new font. + Look at how the font ID enabled by <code>CONFIG_NXFONT_SANS23X27</code> is defined and add an ID for yournew font in a similar fashion: +</p> +<ol start="4"> + <li> + <p> + <code>include/nuttx/nxfonts.h</code>. Add you new font as a possible system default font: + </p> + <ul></pre> +#if defined(CONFIG_NXFONT_SANS23X27) +# define NXFONT_DEFAULT FONTID_SANS23X27 +#elif defined(CONFIG_NXFONT_MYFONT) +# define NXFONT_DEFAULT FONTID_MYFONT +#endif +</pre><ul> + <p> + Then define the actual font ID. + Make sure that the font ID value is unique: + </p> + <ul><pre> +enum nx_fontid_e +{ + FONTID_DEFAULT = 0 /* The default font */ +#ifdef CONFIG_NXFONT_SANS23X27 + , FONTID_SANS23X27 = 1 /* The 23x27 sans serif font */ +#endif +#ifdef CONFIG_NXFONT_MYFONT + , FONTID_MYFONT = 2 /* My shiny, new font */ +#endif +... +</pre></ul> + </li> +</ol> +<p> + New Add the font to the NX build system. + There are several files that you have to modify to to this. + Look how the build system uses the font CONFIG_NXFONT_SANS23X27 for examaples: +</p> +<ol start="5"> + <li> + <p> + <code>nuttx/graphics/Makefile</code>. + This file needs logic to auto-generate a C source file from the header file that you generated with the the <i>bdf-converter</i> program. + Notice <code>NXFONTS_FONTID=2</code>; this must be set to the same font ID value that you defined in the <code>include/nuttx/nxfonts.h</code> file. + </p> + <ul><pre> +genfontsources: + ifeq ($(CONFIG_NXFONT_SANS23X27),y) + @$(MAKE) -C nxfonts -f Makefile.sources TOPDIR=$(TOPDIR) NXFONTS_FONTID=1 EXTRADEFINES=$(EXTRADEFINES) + endif + ifeq ($(CONFIG_NXFONT_MYFONT),y) + @$(MAKE) -C nxfonts -f Makefile.sources TOPDIR=$(TOPDIR) NXFONTS_FONTID=2 EXTRADEFINES=$(EXTRADEFINES) + endif +</pre></ul> + </li> + <li> + <p> + <code>nuttx/graphics/nxfonts/Make.defs</code>. + Set the make variable <code>NXFSET_CSRCS</code>. + <code>NXFSET_CSRCS</code> determines the name of the font C file to build when <code>NXFONTS_FONTID=2</code>: + </p> + <ul><pre> +ifeq ($(CONFIG_NXFONT_SANS23X27),y) +NXFSET_CSRCS += nxfonts_bitmaps_sans23x27.c +endif +ifeq ($(CONFIG_NXFONT_MYFONT),y) +NXFSET_CSRCS += nxfonts_bitmaps_myfont.c +endif +</pre></ul> + </li> + <li> + <p> + <code>nuttx/graphics/nxfonts/Makefile.sources</code>. + This is the Makefile used in step 5 that will actually generate the font C file. + So, given your </code>NXFONTS_FONTID=2</code>, it needs to determine a prefix to use for auto-generated variable and function names and (again) the name of the autogenerated file to create (this must be the same name that was used in <code>nuttx/graphics/nxfonts/Make.defs</code>): + </p> + <ul><pre> +ifeq ($(NXFONTS_FONTID),1) +NXFONTS_PREFIX := g_sans23x27_ +GEN_CSRC = nxfonts_bitmaps_sans23x27.c +endif +ifeq ($(NXFONTS_FONTID),2) +NXFONTS_PREFIX := g_myfont_ +GEN_CSRC = nxfonts_bitmaps_myfont.c +endif +</pre></ul> + </li> + <li> + <p> + <code>graphics/nxfonts/nxfonts_bitmaps.c</code>. + This is the file that contains the generic font structures. + It is used as a "template&qout; file by <code>nuttx/graphics/nxfonts/Makefile.sources </code>to create your customized font data set at build time. + </p> + <ul><pre> +#if NXFONTS_FONTID == 1 +# include "nxfonts_sans23x27.h" +#elif NXFONTS_FONTID == 2 +# include "nxfonts_myfont.h" +#else +# error "No font ID specified" +#endif +</pre></ul> + <p> + Where <code>nxfonts_myfont.h<code> is the NuttX font file that we generated in + step 2 using the <i>bdf-converter</i> tool. + </p> + <li> + <p> + Finally, we need to extend the logic that does the run-time font lookups so that can find our new font. + The lookup function is <code>NXHANDLE nxf_getfonthandle(enum nx_fontid_e fontid)</code>. + The new font information needs to be added to data structures used by that function: + </p> + <ul><pre> +#ifdef CONFIG_NXFONT_SANS23X27 +extern const struct nx_fontpackage_s g_sans23x27_package; +#endif +#ifdef CONFIG_NXFONT_MYFONT +extern const struct nx_fontpackage_s g_myfont_package; +#endif + +static FAR const struct nx_fontpackage_s *g_fontpackages[] = +{ +#ifdef CONFIG_NXFONT_SANS23X27 + &g_sans23x27_package, +#endif +#ifdef CONFIG_NXFONT_MYFONT + &g_myfont_package, +#endif + NULL +}; +</pre></ul> + </li> +</ol> + +<table width ="100%"> + <tr bgcolor="#e4e4e4"> + <td> + <h1>Appendix D <a name="testcoverage">NX Test Coverage</a></h1> </td> </tr> </table> @@ -2810,7 +2991,7 @@ make The following table describes the testing performed on each NX API: </p> -<center><h2>Table C.1: <a name="nxglibcoverage">NXGLIB API Test Coverage</a></h2></center> +<center><h2>Table D.1: <a name="nxglibcoverage">NXGLIB API Test Coverage</a></h2></center> <center><table border="1" width="80%"> <tr> <th width="40%">Function</th> @@ -2910,7 +3091,7 @@ make </table></center> -<center><h2>Table C.2: <a name="nxcbcoverage">NX Server Callbacks Test Coverage</a></h2></center> +<center><h2>Table D.2: <a name="nxcbcoverage">NX Server Callbacks Test Coverage</a></h2></center> <center><table border="1" width="80%"> <tr> <th width="40%">Function</th> @@ -2939,7 +3120,7 @@ make </tr> </table></center> -<center><h2>Table C.3: <a name="nxcoverage">NX API Test Coverage</a></h2></center> +<center><h2>Table D.3: <a name="nxcoverage">NX API Test Coverage</a></h2></center> <center><table border="1" width="80%"> <tr> <th width="40%">Function</th> @@ -3083,7 +3264,7 @@ make </table></center> -<center><h2>Table C.4: <a name="nxtkcoverage">NXTK API Test Coverage</a></h2></center> +<center><h2>Table D.4: <a name="nxtkcoverage">NXTK API Test Coverage</a></h2></center> <center><table border="1" width="80%"> <tr> <th width="40%">Function</th> @@ -3177,7 +3358,7 @@ make </tr> </table></center> -<center><h2>Table C.5: <a name="nxfontscoverage">NXFONTS API Test Coverage</a></h2></center> +<center><h2>Table D.5: <a name="nxfontscoverage">NXFONTS API Test Coverage</a></h2></center> <center><table border="1" width="80%"> <tr> <th width="40%">Function</th> diff --git a/nuttx/graphics/README.txt b/nuttx/graphics/README.txt index c99a72809..378f71a9d 100644 --- a/nuttx/graphics/README.txt +++ b/nuttx/graphics/README.txt @@ -4,6 +4,14 @@ README This directory contains tiny graphics support for NuttX. The contents of this directory are only build if CONFIG_NX is defined in the NuttX configuration file. +Contents +^^^^^^^^ + Roadmap + Related Header Files + Directories + Installing New Fonts + Configuration Settings + Roadmap ^^^^^^^ @@ -37,8 +45,8 @@ include/nutt/nxtk.h -- Describe the NXTOOLKIT C interfaces include/nutt/nxfont.h -- Describe sthe NXFONT C interfaces include/nuttx/nxwidgets.h -- Will describe the NXWIDGETS classes (no longer planned) -Directories: -^^^^^^^^^^^^ +Directories +^^^^^^^^^^^ graphics/nxglib The NuttX tiny graphics library. The directory contains generic utilities @@ -80,6 +88,142 @@ graphics/nxtk graphics/nxwidgets At one time, I planned to put NXWIDGETS implementation here, but not anymore. +Installing New Fonts +^^^^^^^^^^^^^^^^^^^^ + + There is a tool called bdf-converter in the directory tools/. The bdf-converter + program be used to convert fonts in Bitmap Distribution Format (BDF) + into fonts that can be used in the NX graphics system. + + Below are general instructions for creating and installing a new font + in the NX graphic system: + + 1. Locate a font in BDF format, + 2. Use the bdf-converter program to convert the BDF font to the NuttX + font format. This will result in a C header file containing + defintions. That header file should be installed at, for example, + graphics/nxfonts/nxfonts_myfont.h. + + Create a new NuttX configuration variable. For example, suppose + you define the following variable: CONFIG_NXFONT_MYFONT. Then + you would need to: + + 3. Define CONFIG_NXFONT_MYFONT=y in your NuttX configuration file. + + A font ID number has to be assigned for each new font. The font ID + is defined in the file include/nuttx/nxfonts.h. Those definitions + have to be extended to support your new font. Look at how the font ID + enabled by CONFIG_NXFONT_SANS23X27 is defined and add an ID for your + new font in a similar fashion: + + 4. include/nuttx/nxfonts.h. Add you new font as a possible system + default font: + + #if defined(CONFIG_NXFONT_SANS23X27) + # define NXFONT_DEFAULT FONTID_SANS23X27 + #elif defined(CONFIG_NXFONT_MYFONT) + # define NXFONT_DEFAULT FONTID_MYFONT + #endif + + Then define the actual font ID. Make sure that the font ID value + is unique: + + enum nx_fontid_e + { + FONTID_DEFAULT = 0 /* The default font */ + #ifdef CONFIG_NXFONT_SANS23X27 + , FONTID_SANS23X27 = 1 /* The 23x27 sans serif font */ + #endif + #ifdef CONFIG_NXFONT_MYFONT + , FONTID_MYFONT = 2 /* My shiny, new font */ + #endif + ... + + New Add the font to the NX build system. There are several files that + you have to modify to to this. Look how the build system uses the + font CONFIG_NXFONT_SANS23X27 for examaples: + + 5. nuttx/graphics/Makefile. This file needs logic to auto-generate + a C source file from the header file that you generated with the + the bdf-converter program. Notice NXFONTS_FONTID=2; this must be + set to the same font ID value that you defined in the + include/nuttx/nxfonts.h file. + + genfontsources: + ifeq ($(CONFIG_NXFONT_SANS23X27),y) + @$(MAKE) -C nxfonts -f Makefile.sources TOPDIR=$(TOPDIR) NXFONTS_FONTID=1 EXTRADEFINES=$(EXTRADEFINES) + endif + ifeq ($(CONFIG_NXFONT_MYFONT),y) + @$(MAKE) -C nxfonts -f Makefile.sources TOPDIR=$(TOPDIR) NXFONTS_FONTID=2 EXTRADEFINES=$(EXTRADEFINES) + endif + + 6. nuttx/graphics/nxfonts/Make.defs. Set the make variable NXFSET_CSRCS. + NXFSET_CSRCS determines the name of the font C file to build when + NXFONTS_FONTID=2: + + ifeq ($(CONFIG_NXFONT_SANS23X27),y) + NXFSET_CSRCS += nxfonts_bitmaps_sans23x27.c + endif + ifeq ($(CONFIG_NXFONT_MYFONT),y) + NXFSET_CSRCS += nxfonts_bitmaps_myfont.c + endif + + 7. nuttx/graphics/nxfonts/Makefile.sources. This is the Makefile used + in step 5 that will actually generate the font C file. So, given + your NXFONTS_FONTID=2, it needs to determine a prefix to use for + auto-generated variable and function names and (again) the name of + the autogenerated file to create (this must be the same name that + was used in nuttx/graphics/nxfonts/Make.defs): + + ifeq ($(NXFONTS_FONTID),1) + NXFONTS_PREFIX := g_sans23x27_ + GEN_CSRC = nxfonts_bitmaps_sans23x27.c + endif + ifeq ($(NXFONTS_FONTID),2) + NXFONTS_PREFIX := g_myfont_ + GEN_CSRC = nxfonts_bitmaps_myfont.c + endif + + 8. graphics/nxfonts/nxfonts_bitmaps.c. This is the file that contains + the generic font structures. It is used as a "template" file by + nuttx/graphics/nxfonts/Makefile.sources to create your customized + font data set. + + #if NXFONTS_FONTID == 1 + # include "nxfonts_sans23x27.h" + #elif NXFONTS_FONTID == 2 + # include "nxfonts_myfont.h" + #else + # error "No font ID specified" + #endif + + Where nxfonts_myfont.h is the NuttX font file that we generated in + step 2 using the bdf-converter tool. + + 9. Finally, we need to extend the logic that does the run-time font + lookups so that can find our new font. The lookup function is + NXHANDLE nxf_getfonthandle(enum nx_fontid_e fontid). The new + font information needs to be added to data structures used by + that function: + + #ifdef CONFIG_NXFONT_SANS23X27 + extern const struct nx_fontpackage_s g_sans23x27_package; + #endif + #ifdef CONFIG_NXFONT_MYFONT + extern const struct nx_fontpackage_s g_myfont_package; + #endif + + static FAR const struct nx_fontpackage_s *g_fontpackages[] = + { + #ifdef CONFIG_NXFONT_SANS23X27 + &g_sans23x27_package, + #endif + #ifdef CONFIG_NXFONT_MYFONT + &g_myfont_package, + #endif + NULL + }; + Configuration Settings ^^^^^^^^^^^^^^^^^^^^^^ diff --git a/nuttx/graphics/nxfonts/nxfonts_internal.h b/nuttx/graphics/nxfonts/nxfonts_internal.h index 54c574fdc..889d573b1 100644 --- a/nuttx/graphics/nxfonts/nxfonts_internal.h +++ b/nuttx/graphics/nxfonts/nxfonts_internal.h @@ -54,10 +54,6 @@ # define CONFIG_NXFONTS_CHARBITS 7 #endif -/* Only font supported for now */ - -#define CONFIG_NXFONT_SANS23X27 1 - /**************************************************************************** * Public Types ****************************************************************************/ diff --git a/nuttx/tools/Makefile.host b/nuttx/tools/Makefile.host index 163472462..fc8762480 100644 --- a/nuttx/tools/Makefile.host +++ b/nuttx/tools/Makefile.host @@ -33,7 +33,7 @@ # ############################################################################ -all: mkconfig mkversion mksyscall +all: mkconfig mkversion mksyscall bdf-converter default: mkconfig mksyscall .PHONY: clean @@ -56,6 +56,12 @@ mkversion: mkconfig.c cfgparser.c mksyscall: mksyscall.c @gcc $(CFLAGS) -o mksyscall mksyscall.c +# mksyscall - Convert a CSV file into syscall stubs and proxies + +bdf-converter: bdf-converter.c + @gcc $(CFLAGS) -o bdf-converter bdf-converter.c + clean: @rm -f *.o *.a *~ .*.swp - @rm -f mkconfig mksyscall mkversion mkconfig.exe mksyscall.exe mkversion.exe
\ No newline at end of file + @rm -f mkconfig mksyscall mkversion bdf-converter + @rm -f mkconfig.exe mksyscall.exe mkversion.exe bdf-converter.exe diff --git a/nuttx/tools/README.txt b/nuttx/tools/README.txt index 259822378..549b6e31a 100755 --- a/nuttx/tools/README.txt +++ b/nuttx/tools/README.txt @@ -54,7 +54,7 @@ mkversion.c, cfgparser.c, and cfgparser.h mksyscall.c - This is C file that is used to build mksyscall program. The mksyscall + This is a C file that is used to build mksyscall program. The mksyscall program is used during the initial NuttX build by the logic in the top- level syscall/ directory. @@ -74,6 +74,141 @@ mksyscall.c accept this CVS file as input and generate all of the required proxy or stub files as output. See syscall/README.txt for additonal information. +bdf-convert.c + + This C file is used to build the bdf-converter program. The bdf-converter + program be used to convert fonts in Bitmap Distribution Format (BDF) + into fonts that can be used in the NX graphics system. + + Below are general instructions for creating and installing a new font + in the NX graphic system: + + 1. Locate a font in BDF format, + 2. Use the bdf-converter program to convert the BDF font to the NuttX + font format. This will result in a C header file containing + defintions. That header file should be installed at, for example, + graphics/nxfonts/nxfonts_myfont.h. + + Create a new NuttX configuration variable. For example, suppose + you define the following variable: CONFIG_NXFONT_MYFONT. Then + you would need to: + + 3. Define CONFIG_NXFONT_MYFONT=y in your NuttX configuration file. + + A font ID number has to be assigned for each new font. The font ID + is defined in the file include/nuttx/nxfonts.h. Those definitions + have to be extended to support your new font. Look at how the font ID + enabled by CONFIG_NXFONT_SANS23X27 is defined and add an ID for your + new font in a similar fashion: + + 4. include/nuttx/nxfonts.h. Add you new font as a possible system + default font: + + #if defined(CONFIG_NXFONT_SANS23X27) + # define NXFONT_DEFAULT FONTID_SANS23X27 + #elif defined(CONFIG_NXFONT_MYFONT) + # define NXFONT_DEFAULT FONTID_MYFONT + #endif + + Then define the actual font ID. Make sure that the font ID value + is unique: + + enum nx_fontid_e + { + FONTID_DEFAULT = 0 /* The default font */ + #ifdef CONFIG_NXFONT_SANS23X27 + , FONTID_SANS23X27 = 1 /* The 23x27 sans serif font */ + #endif + #ifdef CONFIG_NXFONT_MYFONT + , FONTID_MYFONT = 2 /* My shiny, new font */ + #endif + ... + + New Add the font to the NX build system. There are several files that + you have to modify to to this. Look how the build system uses the + font CONFIG_NXFONT_SANS23X27 for examaples: + + 5. nuttx/graphics/Makefile. This file needs logic to auto-generate + a C source file from the header file that you generated with the + the bdf-converter program. Notice NXFONTS_FONTID=2; this must be + set to the same font ID value that you defined in the + include/nuttx/nxfonts.h file. + + genfontsources: + ifeq ($(CONFIG_NXFONT_SANS23X27),y) + @$(MAKE) -C nxfonts -f Makefile.sources TOPDIR=$(TOPDIR) NXFONTS_FONTID=1 EXTRADEFINES=$(EXTRADEFINES) + endif + ifeq ($(CONFIG_NXFONT_MYFONT),y) + @$(MAKE) -C nxfonts -f Makefile.sources TOPDIR=$(TOPDIR) NXFONTS_FONTID=2 EXTRADEFINES=$(EXTRADEFINES) + endif + + 6. nuttx/graphics/nxfonts/Make.defs. Set the make variable NXFSET_CSRCS. + NXFSET_CSRCS determines the name of the font C file to build when + NXFONTS_FONTID=2: + + ifeq ($(CONFIG_NXFONT_SANS23X27),y) + NXFSET_CSRCS += nxfonts_bitmaps_sans23x27.c + endif + ifeq ($(CONFIG_NXFONT_MYFONT),y) + NXFSET_CSRCS += nxfonts_bitmaps_myfont.c + endif + + 7. nuttx/graphics/nxfonts/Makefile.sources. This is the Makefile used + in step 5 that will actually generate the font C file. So, given + your NXFONTS_FONTID=2, it needs to determine a prefix to use for + auto-generated variable and function names and (again) the name of + the autogenerated file to create (this must be the same name that + was used in nuttx/graphics/nxfonts/Make.defs): + + ifeq ($(NXFONTS_FONTID),1) + NXFONTS_PREFIX := g_sans23x27_ + GEN_CSRC = nxfonts_bitmaps_sans23x27.c + endif + ifeq ($(NXFONTS_FONTID),2) + NXFONTS_PREFIX := g_myfont_ + GEN_CSRC = nxfonts_bitmaps_myfont.c + endif + + 8. graphics/nxfonts/nxfonts_bitmaps.c. This is the file that contains + the generic font structures. It is used as a "template" file by + nuttx/graphics/nxfonts/Makefile.sources to create your customized + font data set. + + #if NXFONTS_FONTID == 1 + # include "nxfonts_sans23x27.h" + #elif NXFONTS_FONTID == 2 + # include "nxfonts_myfont.h" + #else + # error "No font ID specified" + #endif + + Where nxfonts_myfont.h is the NuttX font file that we generated in + step 2 using the bdf-converter tool. + + 9. Finally, we need to extend the logic that does the run-time font + lookups so that can find our new font. The lookup function is + NXHANDLE nxf_getfonthandle(enum nx_fontid_e fontid). The new + font information needs to be added to data structures used by + that function: + + #ifdef CONFIG_NXFONT_SANS23X27 + extern const struct nx_fontpackage_s g_sans23x27_package; + #endif + #ifdef CONFIG_NXFONT_MYFONT + extern const struct nx_fontpackage_s g_myfont_package; + #endif + + static FAR const struct nx_fontpackage_s *g_fontpackages[] = + { + #ifdef CONFIG_NXFONT_SANS23X27 + &g_sans23x27_package, + #endif + #ifdef CONFIG_NXFONT_MYFONT + &g_myfont_package, + #endif + NULL + }; + Makefile.host This is the makefile that is used to make the mkconfig program from diff --git a/nuttx/tools/bdf-converter.c b/nuttx/tools/bdf-converter.c new file mode 100644 index 000000000..94d00b8ee --- /dev/null +++ b/nuttx/tools/bdf-converter.c @@ -0,0 +1,407 @@ +/**************************************************************************** + * tools/bdf-converter.c + * + * Copyright (C) 2011 NX Engineering, S.A., All rights reserved. + * Author: Jose Pablo Carballo Gomez <jcarballo@nx-engineering.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include <string.h> +#include <ctype.h> + +/**************************************************************************** + * Pre-Processor Definitions + ****************************************************************************/ + +// BDF Specification Version 2.2: +// This version lifts the restriction on line length. In this version, the new +// maximum length of a value of the type string is 65535 characters, and hence +// lines may now be at least this long. + +#define BDF_MAX_LINE_LENGTH 65535 + +/* Ranges of 7-bit and 8-bit fonts */ + +#define NXFONT_MIN7BIT 33 +#define NXFONT_MAX7BIT 126 + +#define NXFONT_MIN8BIT 161 +#define NXFONT_MAX8BIT 255 + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/* This structure holds information about a glyph */ + +typedef struct glyphinfo_s +{ + char *name; /* Name for they glyph */ + int encoding; /* The Adobe Standard Encoding value */ + int bb_w; /* The width of the black pixels in x */ + int bb_h; /* The height of the black pixels in y */ + int bb_x_off; /* X displacement of the lower left corner + * of the bitmap from origin 0 */ + int bb_y_off; /* Y displacement of the lower left corner + * of the bitmap from origin 0 */ + uint32_t *bitmap; /* Hexadecimal data for the */ +} glyphinfo_t; + +/* This structures provides the metrics for one glyph */ + +typedef struct nx_fontmetric_s +{ + uint32_t stride : 2; /* Width of one font row in bytes */ + uint32_t width : 6; /* Width of the font in bits */ + uint32_t height : 6; /* Height of the font in rows */ + uint32_t xoffset : 6; /* Top, left-hand corner X-offset in pixels */ + uint32_t yoffset : 6; /* Top, left-hand corner y-offset in pixels */ + uint32_t unused : 6; +} nx_fontmetric_t; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static void trimLine(char *line) +{ + char *str; + str = line; + char *strEnd; + for (strEnd = str + strlen(str) - 1; + strEnd >= str && isspace((int)(*strEnd)); + strEnd--); + *(strEnd + 1) = 0; +} + +/**************************************************************************** + * Name: bdf_parseIntLine + * + * Description: + * Parses a line containing a BDF property followed by integers. It will + * ignore the first token that corresponds to the property name. + * + * Input Parameters: + * line - A line with a BDF property followed by integers, i.e.: + * "FONTBOUNDINGBOX 8 13 0 -2" + * count - How many integers are specified by the BDF property. In the + * example above, count = 4. + * info - A pointer to memory provided by the caller in which to + * return the array of integers. For the example above: + * info[0] = 8 + * info[1] = 13 + * info[2] = 0 + * info[3] = -2 + * + ****************************************************************************/ +static void bdf_parseintline(char *line, unsigned int count, int *info) +{ + char *str, *token, *saveptr1; + str = line; + + /* Ignore the key */ + + token = (char *)strtok_r(str, " ", &saveptr1); + + while ((token = (char *)strtok_r(NULL, " ", &saveptr1)) && count--) + { + *(info++) = atoi(token); + } +} + +static void bdf_printglyphinfo(const glyphinfo_t *ginfo) +{ + printf("NAME = %s\n", ginfo->name); + printf("ENCODING = %d\n", ginfo->encoding); + printf("BB_W = %d\n", ginfo->bb_w); + printf("BB_H = %d\n", ginfo->bb_h); + printf("BB_X_OFF = %d\n", ginfo->bb_x_off); + printf("BB_Y_OFF = %d\n", ginfo->bb_y_off); + int i; + for (i = 0; i < ginfo->bb_h; i++) + { + printf("BITMAP[%d] = %x\n", i, ginfo->bitmap[i]); + } +} + +static void bdf_printnxmetricinfo(const nx_fontmetric_t *info) +{ + printf("STRIDE = %d\n", info->stride); + printf("WIDTH = %d\n", info->width); + printf("HEIGHT = %d\n", info->height); + printf("XOFFSET = %d\n", info->xoffset); + printf("YOFFSET = %d\n", info->yoffset); +} + +static void bdf_getglyphinfo(FILE *file, glyphinfo_t *ginfo) +{ + char line[BDF_MAX_LINE_LENGTH]; + char lineCopy[BDF_MAX_LINE_LENGTH]; + char *str, *token, *saveptr1; + bool done; + + done = false; + + while(fgets(line, BDF_MAX_LINE_LENGTH, file) != NULL && !done) + { + trimLine(line); + strcpy(lineCopy, line); + str = line; + + while ((token = (char *)strtok_r(str, " ", &saveptr1))) + { + + /* ENCODING information */ + + if(strcmp(token, "ENCODING") == 0) + { + token = (char *)strtok_r(NULL, " ", &saveptr1); + ginfo->encoding = atoi(token); + } + + /* BBX information */ + + else if(strcmp(token, "BBX") == 0) + { + int bbxinfo[4]; + bdf_parseintline(lineCopy, 4, bbxinfo); + ginfo->bb_w = bbxinfo[0]; + ginfo->bb_h = bbxinfo[1]; + ginfo->bb_x_off = bbxinfo[2]; + ginfo->bb_y_off = bbxinfo[3]; + + /* This is the last BDF property of interest*/ + + done = true; + } + + str = NULL; + } + + } +} + +static void bdf_getglyphbitmap(FILE *file, glyphinfo_t *ginfo) +{ + char line[BDF_MAX_LINE_LENGTH]; + uint32_t *bitmap; + bool readingbitmap; + + bitmap = ginfo->bitmap; + readingbitmap = true; + + while (readingbitmap) + { + if (fgets(line, BDF_MAX_LINE_LENGTH, file) != NULL) + { + trimLine(line); + + if(strcmp(line, "ENDCHAR") == 0) + { + readingbitmap = false; + } + else + { + char *endptr; + *bitmap = strtoul(line, &endptr, 16); + bitmap++; + } + + } + else + { + /* error condition */ + + readingbitmap = false; + } + + } +} + +static void bdf_getstride(glyphinfo_t *ginfo, uint32_t *stride) +{ + *stride = (ginfo->bb_w % 8 == 0) ? ginfo->bb_w / 8 : ginfo->bb_w / 8 + 1 ; +} + +static void bdf_printoutput(FILE *out, + glyphinfo_t *ginfo, + nx_fontmetric_t *nxmetric) +{ + + /* Only interested in the 7 and 8 bit ranges */ + + if ((ginfo->encoding >= NXFONT_MIN7BIT && + ginfo->encoding <= NXFONT_MAX7BIT) || + (ginfo->encoding >= NXFONT_MIN8BIT && + ginfo->encoding <= NXFONT_MAX8BIT)) + { + + /* Glyph general info */ + + fprintf(out, "/* %s (%d) */\n", ginfo->name, ginfo->encoding); + + /* Glyph metrics */ + + fprintf(out, + "#define NXFONT_METRICS_%d {%d, %d, %d, %d, %d, 0}\n", + ginfo->encoding, + nxmetric->stride, + nxmetric->width, + nxmetric->height, + nxmetric->xoffset, + nxmetric->yoffset); + + /* Glyph bitmap */ + + fprintf(out, "#define NXFONT_BITMAP_%d {", ginfo->encoding); + int i; + for (i = 0; i < ginfo->bb_h - 1; i++) + { + fprintf(out, "0x%x, ", ginfo->bitmap[i]); + } + fprintf(out, "0x%x}\n", ginfo->bitmap[i]); + + fprintf(out, "\n"); + } + +} + +/**************************************************************************** + * Main + ****************************************************************************/ + +int main(int argc, char **argv) +{ + FILE *file, *out; + char line[BDF_MAX_LINE_LENGTH]; + char lineCopy[BDF_MAX_LINE_LENGTH]; + char *str, *token, *saveptr1; + + /* FONTBOUNDINGBOX properties*/ + int fbb_x, fbb_y, fbb_x_off, fbb_y_off; + + file = fopen("8x13.bdf", "r"); + out = fopen("out.txt", "w"); + + if (file == NULL) + { + perror("Error opening file"); + } + else + { + while (fgets(line, BDF_MAX_LINE_LENGTH, file) != NULL) + { + printf("--\n"); + + // Save a copy of the line + + strcpy(lineCopy,line); + + // Clean it + + trimLine(line); + str = line; + + while ((token = (char *)strtok_r(str, " ", &saveptr1))) + { + + /* FONTBOUNDINGBOX - Global font information */ + + if (strcmp(token, "FONTBOUNDINGBOX") == 0) + { + int fbbinfo[4]; + bdf_parseintline(lineCopy, 4, fbbinfo); + fbb_x = fbbinfo[0]; + fbb_y = fbbinfo[1]; + fbb_x_off = fbbinfo[2]; + fbb_y_off = fbbinfo[3]; + } + + /* STARTCHAR - Individual glyph information */ + + if (strcmp(token, "STARTCHAR") == 0) + { + glyphinfo_t ginfo; + + /* Glyph name */ + + ginfo.name = (char *)strtok_r(NULL, " ", &saveptr1); + + /* Glyph information: + * ENCODING + * BBX + */ + + bdf_getglyphinfo(file, &ginfo); + + /* Glyph bitmap */ + + ginfo.bitmap = malloc(sizeof(uint32_t) * ginfo.bb_h); + bdf_getglyphbitmap(file, &ginfo); + + bdf_printglyphinfo(&ginfo); + + /* Convert to nxfonts */ + + nx_fontmetric_t nxmetric; + uint32_t stride; + bdf_getstride(&ginfo, &stride); + nxmetric.stride = stride; + nxmetric.width = ginfo.bb_w; + nxmetric.height = ginfo.bb_h; + nxmetric.xoffset = (-fbb_x_off) + ginfo.bb_x_off; + nxmetric.yoffset = fbb_y + fbb_y_off - ginfo.bb_y_off; + bdf_printnxmetricinfo(&nxmetric); + + bdf_printoutput(out, &ginfo, &nxmetric); + + /* Free memory */ + + free(ginfo.bitmap); + + } + + str = NULL; + } + + } + fclose(file); + fclose(out); + } + + return EXIT_SUCCESS; +} |