1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     font_ResourceFormat.h
4   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  All rights reserved.
5   These coded instructions, statements, and computer programs contain
6   proprietary information of Nintendo of America Inc. and/or Nintendo
7   Company Ltd., and are protected by Federal copyright law. They may
8   not be disclosed to third parties or copied or duplicated in any form,
9   in whole or in part, without the prior written consent of Nintendo.
10   $Revision: 28630 $
11  *---------------------------------------------------------------------------
12 
13 
14 */
15 
16 #ifndef NN_FONT_FONT_RESOURCE_FORMAT_H_
17 #define NN_FONT_FONT_RESOURCE_FORMAT_H_
18 
19 #include <nn/types.h>
20 #include <nn/font/detail/font_BinaryFileFormat.h>
21 
22 namespace nn {
23 namespace font {
24 
25 
26 const int   GlyphDataAlignment   = 128;
27 
28 
29 /* ------------------------------------------------------------------------
30         Signature Definitions
31    ------------------------------------------------------------------------ */
32 
33 // Standard font resource file signature
34 const detail::SigWord BINFILE_SIG_FONT              = NN_FONT_MAKE_SIGWORD('C','F','N','T');
35 
36 // Binary file signature with already resolved offset
37 const detail::SigWord BINFILE_SIG_FONT_RESOLEVED    = NN_FONT_MAKE_SIGWORD('C','F','N','U');
38 
39 // Archive font resource file signature
40 const detail::SigWord BINFILE_SIG_FONTA             = NN_FONT_MAKE_SIGWORD('C','F','N','A');
41 
42 // Binary block signature
43 const detail::SigWord BINBLOCK_SIG_FINF             = NN_FONT_MAKE_SIGWORD('F','I','N','F');
44 const detail::SigWord BINBLOCK_SIG_CGLP             = NN_FONT_MAKE_SIGWORD('C','G','L','P');
45 const detail::SigWord BINBLOCK_SIG_TGLP             = NN_FONT_MAKE_SIGWORD('T','G','L','P');
46 const detail::SigWord BINBLOCK_SIG_CWDH             = NN_FONT_MAKE_SIGWORD('C','W','D','H');
47 const detail::SigWord BINBLOCK_SIG_CMAP             = NN_FONT_MAKE_SIGWORD('C','M','A','P');
48 
49 const detail::SigWord BINBLOCK_SIG_GLGR             = NN_FONT_MAKE_SIGWORD('G','L','G','R');
50 const detail::SigWord BINBLOCK_SIG_HTGL             = NN_FONT_MAKE_SIGWORD('H','T','G','L');
51 
52 
53 
54 
55 
56 /* ------------------------------------------------------------------------
57         Resource version definitions
58    ------------------------------------------------------------------------ */
59 
60 const u32 FONT_FILE_VERSION             = NN_FONT_MAKE_VERSION(3, 0, 0, 0);
61 
62 
63 
64 /* ------------------------------------------------------------------------
65         Constant definitions
66    ------------------------------------------------------------------------ */
67 const u16 INVALID_CHAR_CODE   = 0xFFFF;
68 const u16 INVALID_GLYPH_INDEX = 0xFFFF;
69 
70 
71 
72 
73 
74 /* ------------------------------------------------------------------------
75         enum Definitions
76    ------------------------------------------------------------------------ */
77 
78 /*---------------------------------------------------------------------------*
79   Name:         FontType
80   Description:  Font type
81  *---------------------------------------------------------------------------
82 */
83 enum FontType
84 {
85     FONT_TYPE_GLYPH,            // BMP
86     FONT_TYPE_TEXTURE,          // Texture
87     NUM_OF_FONT_TYPE
88 };
89 
90 //---------------------------------------------------------------------------
91 //
92 //---------------------------------------------------------------------------
93 enum CharacterCode
94 {
95     CHARACTER_CODE_UNICODE = 1,  //
96     CHARACTER_CODE_SJIS,         //
97     CHARACTER_CODE_CP1252,       //
98 
99     CHARACTER_CODE_MAX
100 };
101 
102 /*---------------------------------------------------------------------------*
103   Name:         FontMapMethod
104   Description:  character code mapping type
105  *---------------------------------------------------------------------------
106 */
107 enum FontMapMethod
108 {
109     FONT_MAPMETHOD_DIRECT,      // index = character code - offset
110     FONT_MAPMETHOD_TABLE,       // index = mapInfo[character code - offset]
111     FONT_MAPMETHOD_SCAN,        // index = search(mapInfo, character code)
112     NUM_OF_FONT_MAPMETHOD
113 };
114 
115 
116 /*---------------------------------------------------------------------------*
117   Name:         FontSheetFormat
118   Description:  Sheet format (texture format)
119  *---------------------------------------------------------------------------
120 */
121 enum FontSheetFormat
122 {
123     FONT_SHEET_FORMAT_RGBA8,
124     FONT_SHEET_FORMAT_RGB8,
125     FONT_SHEET_FORMAT_RGB5A1,
126     FONT_SHEET_FORMAT_RGB565,
127     FONT_SHEET_FORMAT_RGBA4,
128     FONT_SHEET_FORMAT_LA8,
129 
130 
131     FONT_SHEET_FORMAT_A8 = 8,
132     FONT_SHEET_FORMAT_LA4,
133 
134     FONT_SHEET_FORMAT_A4 = 11,
135 
136 
137 
138     FONT_SHEET_FORMAT_MASK              = 0x7FFF,
139     FONT_SHEET_FORMAT_COMPRESSED_FLAG   = 0x8000    // Compressed if 1.
140 };
141 
142 
143 
144 
145 /* ------------------------------------------------------------------------
146         Structure definitions
147    ------------------------------------------------------------------------ */
148 
149 //---------------------------------------------------------------------------
150 //
151 //---------------------------------------------------------------------------
152 struct CharWidths
153 {
154     s8  left;                   //
155     u8  glyphWidth;             //
156     s8  charWidth;              //
157 };
158 
159 /*---------------------------------------------------------------------------*
160   Name:         CMapScanEntry
161   Description:  Character code and glyph index pair
162  *---------------------------------------------------------------------------
163 */
164 struct CMapScanEntry
165 {
166     u16 ccode;                  // Character code
167     u16 index;                  // Glyph index
168 };
169 
170 /*---------------------------------------------------------------------------*
171   Name:         CMapInfoScan
172   Description:  FontCodeMap.mapInfo when using MAPMETHOD_SCAN
173  *---------------------------------------------------------------------------
174 */
175 struct CMapInfoScan
176 {
177     u16 num;                    // number of elements in "entries"
GetEntriesCMapInfoScan178     CMapScanEntry* GetEntries() const // mapping list to the glyph index from the character code
179     {
180         return reinterpret_cast<CMapScanEntry*>( reinterpret_cast<uptr>(this) + sizeof(*this) );
181     }
182 };
183 
184 
185 
186 
187 
188 /* ------------------------------------------------------------------------
189         Block definition
190    ------------------------------------------------------------------------ */
191 
192 /*---------------------------------------------------------------------------*
193   Name:         FontGlyphGroups
194   Description:  Stores the information for partially loading font.
195  *---------------------------------------------------------------------------
196 */
197 struct FontGlyphGroups
198 {
199     u32 sheetSize;
200     u16 glyphsPerSheet;
201     u16 numSet;
202     u16 numSheet;
203     u16 numCWDH;
204     u16 numCMAP;
205 
206     u16 nameOffsets[1];  // numSet
207 /*
208     A variable length data follows from here
209     (4 byte align)
210     u32 sizeSheets[numSheet];       // size of the compressed sheet
211     u32 sizeCWDH[numCWDH];          // size of the CWDH block
212     u32 sizeCMAP[numCMAP];          // size of the CMAP block
213     u32 useSheets[numSet][numSheet/32];
214     u32 useCWDH[numSet][numCWDH/32];
215     u32 useCMAP[numSet][numCMAP/32];
216     char names[numSet][name length];
217 
218 
219 
220 */
221 };
222 
223 
224 
225 /*---------------------------------------------------------------------------*
226   Name:         FontTextureGlyph
227   Description:  Stores the glyph texture of the font.
228  *---------------------------------------------------------------------------
229 */
230 struct FontTextureGlyph
231 {
232     u8  cellWidth;              // Cell width = maximum glyph width
233     u8  cellHeight;             // Cell height
234     s8  baselinePos;            // Baseline position
235     u8  maxCharWidth;           // Maximum character width
236     u32 sheetSize;              // Texture sheet data size (in bytes)
237     u16 sheetNum;               // Number of sheets
238     u16 sheetFormat;            // FontSheetFormat
239     u16 sheetRow;               // Number of horizontal cells on a sheet
240     u16 sheetLine;              // Number of vertical cells on a sheet
241     u16 sheetWidth;             // Sheet width (in pixels)
242     u16 sheetHeight;            // Sheet height (in pixels)
243     u8* sheetImage;             // The pointer to the texture data
244 };
245 
246 
247 
248 /*---------------------------------------------------------------------------*
249   Name:         FontWidth
250   Description:  Stores the character width information for each character.
251  *---------------------------------------------------------------------------
252 */
253 struct FontWidth
254 {
255     u16                 indexBegin;     // glyph index corresponding to the first entry in widthTable
256     u16                 indexEnd;       // glyph index corresponding to the last entry in widthTable
257     FontWidth*          pNext;          // Pointer to the next FontWidth
GetWidthTableFontWidth258     CharWidths*         GetWidthTable() const // width information array
259     {
260         return reinterpret_cast<CharWidths*>( reinterpret_cast<uptr>(this) + sizeof(*this) );
261     }
262 };
263 
264 
265 
266 /*---------------------------------------------------------------------------*
267   Name:         FontCodeMap
268   Description:  Given a character code, specifies the mapping to the index of the glyph in the glyph image arrangment that matches the character code.
269 
270  *---------------------------------------------------------------------------
271 */
272 struct FontCodeMap
273 {
274     u16                 ccodeBegin;     // First character code in the character code range that this block manages
275     u16                 ccodeEnd;       // Last character code in the character code range that this block manages
276     u16                 mappingMethod;  // Mapping method (FontMappingMethod type)
277     u16                 reserved;       // Reserved
278     FontCodeMap*        pNext;          // Pointer to the next FontCodeMap
GetMapInfoFontCodeMap279     u16*                GetMapInfo() const // The specific details of the character code mapping information depend on the mappingMethod
280     {
281         return reinterpret_cast<u16*>( reinterpret_cast<uptr>(this) + sizeof(*this) );
282     }
283 };
284 
285 
286 
287 /*---------------------------------------------------------------------------*
288   Name:         FontInformation
289   Description:  Stores the information related to the overall font.
290  *---------------------------------------------------------------------------
291 */
292 struct FontInformation
293 {
294     u8                  fontType;       // glyph data type (FontType)
295     s8                  linefeed;       // (*)== leading
296     u16                 alterCharIndex; // (*) glyph index of the glyph for characters not contained in the font
297     CharWidths          defaultWidth;   // (*) character width information for glyphs that have no character width information
298     u8                  characterCode;  // Corresponding character code (CharacterCode type)
299     FontTextureGlyph*   pGlyph;         // Pointer to a unique FontGlyph
300     FontWidth*          pWidth;         // Pointer to the first FontWidth
301     FontCodeMap*        pMap;           // Pointer to the first FontCodeMap
302     u8                  height;         // Font height
303     u8                  width;          // Font width
304     u8                  ascent;         // Ascent
305     u8                  padding_[1];
306 };
307 
308 
309 
310 /* ------------------------------------------------------------------------
311         Block definition
312    ------------------------------------------------------------------------ */
313 
314 /*---------------------------------------------------------------------------*
315   Name:         BinaryBlock
316   Description:  NintendoWare standard binary block
317  *---------------------------------------------------------------------------
318 */
319 template <typename BlockBodyType>
320 struct BinaryBlock
321 {
322     detail::BinaryBlockHeader       header;     // Block header
323     BlockBodyType                   body;       // Block body
324 };
325 
326 typedef BinaryBlock<FontGlyphGroups>    FontGlyphGroupsBlock;
327 typedef BinaryBlock<FontInformation>    FontInformationBlock;
328 typedef BinaryBlock<FontTextureGlyph>   FontTextureGlyphBlock;
329 typedef BinaryBlock<FontWidth>          FontWidthBlock;
330 typedef BinaryBlock<FontCodeMap>        FontCodeMapBlock;
331 
332 
333 
334 } // namespace font
335 } // namespace nn
336 
337 
338 #endif //  NN_FONT_FONT_RESOURCE_FORMAT_H_
339