1 #include "studiox_includes.h"
2 
3 UCHAR filling_string[] = "000";
4 
5 #define GX_RESOURCE_STANDALONE_HEADER_SIZE 8 /* 2 bytes type, 2 bytes version, 4 bytes count. */
6 
7 ///////////////////////////////////////////////////////////////////////////////
binary_resource_gen(studiox_project * proj,BOOL file_format)8 binary_resource_gen::binary_resource_gen(studiox_project *proj, BOOL file_format)
9     : resource_gen(proj)
10 {
11     m_num_displays = proj->mHeader.num_displays;
12     m_project = proj;
13 
14     m_written_size = 0;
15     m_written_start_address = 0;
16     m_file_format = file_format;
17     m_srec_address = proj->mHeader.memory_offset;
18     m_srec_data_size = 0;
19     memset(m_srec_data, 0, SREC_MAX_DATA_SIZE);
20     m_srec_record_count = 0;
21     m_output_resource_id = 0;
22 
23     if (GetCmdInfo()->IsNoGui())
24     {
25         m_big_endian = GetCmdInfo()->IsBigEndian();
26     }
27     else
28     {
29         m_big_endian = m_project->mHeader.big_endian;
30     }
31 }
32 
33 
34 ///////////////////////////////////////////////////////////////////////////////
~binary_resource_gen()35 binary_resource_gen::~binary_resource_gen()
36 {
37 }
38 
39 ////////////////////////////////////////////////////////////////////////////////////////////////
InitRotatedPixelmaps()40 void binary_resource_gen::InitRotatedPixelmaps()
41 {
42     for (int theme = 0; theme < m_project->mDisplays[m_display].num_themes; theme++)
43     {
44         m_rotated_pixelmaps[theme].RemoveAll();
45 
46         for (int index = 0; index < m_pixelmap_table_size; index++)
47         {
48             m_rotated_pixelmaps[theme].Add(GX_NULL);
49         }
50     }
51 }
52 
53 ////////////////////////////////////////////////////////////////////////////////////////////////
DestroyRotatedPixelmaps()54 void binary_resource_gen::DestroyRotatedPixelmaps()
55 {
56     GX_PIXELMAP *map;
57 
58     for (int theme = 0; theme < m_project->mDisplays[m_display].num_themes; theme++)
59     {
60         for (int index = 0; index < m_pixelmap_table_size; index++)
61         {
62             map = m_rotated_pixelmaps[theme].GetAt(index);
63             if (map)
64             {
65                 pixelmap_destroy(map);
66             }
67         }
68     }
69 }
70 
71 ///////////////////////////////////////////////////////////////////////////////
InitResource()72 void binary_resource_gen::InitResource()
73 {
74     m_project->CopyDictionary(m_display, RES_TYPE_PIXELMAP, &m_pixelmap_dictionary);
75     m_project->SortResDictionary(RES_TYPE_PIXELMAP, &m_pixelmap_dictionary);
76 
77     CalculateTableSizes();
78 
79     InitOptimizedFonts();
80     InitRotatedPixelmaps();
81     InitFontSizeStorage(m_display);
82 
83     if (m_file_format == BINARY_FILE_FORMAT_BIN_STANDALONE)
84     {
85         MakeFileDictionary();
86     }
87 
88 }
89 
90 ///////////////////////////////////////////////////////////////////////////////
DestroyResource()91 void binary_resource_gen::DestroyResource()
92 {
93     DestroyOptimizedFonts();
94     DestroyRotatedPixelmaps();
95     DeleteFontSizeStorage(m_display);
96 
97     CloseOutputFiles();
98 
99     if (m_file_format == BINARY_FILE_FORMAT_BIN_STANDALONE)
100     {
101         DestroyFileDictionay();
102     }
103 }
104 
105 ///////////////////////////////////////////////////////////////////////////////
GenerateBinaryFile(int display)106 BOOL binary_resource_gen::GenerateBinaryFile(int display)
107 {
108     m_display = display;
109     m_color_table_size = m_font_table_size = m_pixelmap_table_size = 0;
110 
111     GotoProjectDirectory();
112 
113     // for now just use project name for output name
114     CCommandInfo *pCmdInfo = GetCmdInfo();
115     CString res_file_name;
116 
117     CCommandInfo *pCmd = GetCmdInfo();
118     BOOL gen_res_header;
119 
120     if (pCmd->IsNoGui())
121     {
122         gen_res_header = pCmd->GenResHeader();
123     }
124     else
125     {
126         gen_res_header = m_project->mHeader.gen_res_header;
127     }
128 
129     InitResource();
130 
131     if (gen_res_header)
132     {
133         res_file_name = m_project->mHeader.header_path;
134         if (!res_file_name.IsEmpty())
135         {
136             if (res_file_name.GetAt(res_file_name.GetLength() - 1) != '\\')
137             {
138                 res_file_name += "\\";
139             }
140         }
141         res_file_name += GetResourceFileName() + _T(".h");
142 
143         if (m_outfile)
144         {
145             delete m_outfile;
146         }
147 
148         m_outfile = new CFile();
149 
150         /* Generate head file. */
151         if (!m_outfile->Open(res_file_name, CFile::modeCreate | CFile::modeWrite))
152         {
153             CString msg;
154             msg.Format(_T("Could not open output file:\n%s\nPlease check resource file path."), res_file_name);
155 
156             ErrorMsg(msg);
157 
158             delete m_outfile;
159             DestroyResource();
160             return FALSE;
161         }
162         GenerateResourceHeader();
163         m_outfile->Close();
164     }
165 
166     // Generate binary resource data
167     res_file_name = m_project->mHeader.resource_path;
168     if (!res_file_name.IsEmpty())
169     {
170         if (res_file_name.GetAt(res_file_name.GetLength() - 1) != '\\')
171         {
172             res_file_name += "\\";
173         }
174     }
175 
176     res_file_name += GetResourceFileName();
177 
178     switch (m_file_format)
179     {
180     case BINARY_FILE_FORMAT_BIN:
181     case BINARY_FILE_FORMAT_BIN_STANDALONE:
182         res_file_name += _T(".bin");
183         break;
184 
185     case BINARY_FILE_FORMAT_SREC:
186         res_file_name += _T(".srec");
187         break;
188     }
189 
190     if (m_outfile)
191     {
192         delete m_outfile;
193         m_outfile = NULL;
194     }
195 
196     m_outfile = new CFile();
197 
198     if (!m_outfile->Open(res_file_name, CFile::modeCreate | CFile::modeWrite))
199     {
200         CString msg;
201         msg.Format(_T("Could not open output file:\n%s\nPlease check resource file path."), res_file_name);
202 
203         ErrorMsg(msg);
204         delete m_outfile;
205         DestroyResource();
206         return FALSE;
207     }
208 
209     outfile_list.Add(m_outfile);
210 
211     if (m_file_format == BINARY_FILE_FORMAT_SREC)
212     {
213         m_written_size = m_srec_address;
214         m_written_start_address = m_srec_address;
215         WriteSRecordHeader();
216     }
217     else
218     {
219         m_written_size = 0;
220         m_written_start_address = 0;
221     }
222 
223     if (pCmdInfo->IsXmlMode())
224     {
225         BOOL enabled;
226         m_warn_on_error = TRUE;
227 
228         WriteStandaloneResHeader();
229 
230         for (int theme = 0; theme < m_project->mDisplays[m_display].num_themes; theme++)
231         {
232             theme_info* current = &m_project->mDisplays[m_display].themes[theme];
233 
234             if (pCmd->IsNoGui())
235             {
236                 enabled = pCmd->IsThemeEnabled(current->theme_name);
237             }
238             else
239             {
240                 enabled = current->enabled;
241             }
242 
243             if (!enabled)
244             {
245                 continue;
246             }
247 
248             for (int font_id = 0; font_id < m_project->CountResources(m_display, RES_TYPE_FONT); font_id++)
249             {
250                 res_info* info = m_project->FindResource(m_display, theme, RES_TYPE_FONT, font_id);
251 
252                 if (IsResEnabled(info))
253                 {
254                     WriteFontBlock(info, 0, theme);
255                 }
256             }
257 
258             for (int pixelmap_id = 1; pixelmap_id < m_pixelmap_dictionary.GetCount(); pixelmap_id++)
259             {
260                 res_info *info = m_project->FindResource(m_display, theme, RES_TYPE_PIXELMAP, m_pixelmap_dictionary.GetAt(pixelmap_id));
261 
262                 if (IsResEnabled(info) && info->GetPixelmapFrameCount())
263                 {
264                     for (int frame_id = 0; frame_id < info->GetPixelmapFrameCount(); frame_id++)
265                     {
266                         WritePixelmapBlock(info, 0, 0, theme, frame_id);
267                     }
268                 }
269             }
270         }
271     }
272     else
273     {
274         GenerateBinaryData();
275     }
276 
277     if (m_file_format == BINARY_FILE_FORMAT_SREC)
278     {
279         if (m_srec_data_size)
280         {
281             WriteOneSRecord();
282         }
283 
284         WriteSRecordEnd();
285     }
286 
287     DestroyResource();
288 
289     return TRUE;
290 }
291 
292 ///////////////////////////////////////////////////////////////////////////////
GenerateBinaryData()293 BOOL binary_resource_gen::GenerateBinaryData()
294 {
295     WriteResourceHeader();
296 
297     BOOL enabled;
298     CCommandInfo *pCmd = GetCmdInfo();
299 
300     for (int theme = 0; theme < m_project->mDisplays[m_display].num_themes; theme++)
301     {
302         theme_info *current = &m_project->mDisplays[m_display].themes[theme];
303 
304         if (pCmd->IsNoGui())
305         {
306             enabled = pCmd->IsThemeEnabled(current->theme_name);
307         }
308         else
309         {
310             enabled = current->enabled;
311         }
312 
313         if (enabled)
314         {
315             WriteThemeBlock(theme);
316         }
317     }
318 
319     if (GetEnabledLanguageCount())
320     {
321         WriteStringBlock();
322     }
323     return TRUE;
324 }
325 
326 ///////////////////////////////////////////////////////////////////////////////
WriteResourceHeader()327 void binary_resource_gen::WriteResourceHeader()
328 {
329     //write magic number
330     GX_RESOURCE_HEADER header;
331     ULONG theme_data_size = GetThemeDataSize(-1);
332     ULONG string_data_size = GetStringDataSize();
333 
334     header.gx_resource_header_magic_number = GX_MAGIC_NUMBER;
335     header.gx_resource_header_version = m_project->mHeader.guix_version;
336     header.gx_resource_header_theme_count = GetEnabledThemeCount();
337     header.gx_resource_header_language_count = GetEnabledLanguageCount();
338     header.gx_resource_header_theme_data_size = theme_data_size;
339     header.gx_resource_header_string_data_size = string_data_size;
340     header.gx_resource_header_data_size = theme_data_size + string_data_size;
341 
342     UCHAR header_array[GX_RESOURCE_HEADER_SIZE];
343     int index = 0;
344     SHORT s;
345     LONG l;
346 
347     s = SwapUshort(header.gx_resource_header_magic_number);
348     memcpy_s(header_array, GX_RESOURCE_HEADER_SIZE, &s, sizeof(USHORT));
349     index += sizeof(USHORT);
350 
351     if (index < GX_RESOURCE_HEADER_SIZE)
352     {
353         s = SwapUshort(header.gx_resource_header_version);
354         memcpy_s(header_array + index, GX_RESOURCE_HEADER_SIZE - index, &s, sizeof(USHORT));
355         index += sizeof(USHORT);
356     }
357 
358     if (index < GX_RESOURCE_HEADER_SIZE)
359     {
360         s = SwapUshort(header.gx_resource_header_theme_count);
361         memcpy_s(header_array + index, GX_RESOURCE_HEADER_SIZE - index, &s, sizeof(USHORT));
362         index += sizeof(USHORT);
363     }
364 
365     if (index < GX_RESOURCE_HEADER_SIZE)
366     {
367         s = SwapUshort(header.gx_resource_header_language_count);
368         memcpy_s(header_array + index, GX_RESOURCE_HEADER_SIZE - index, &s, sizeof(USHORT));
369         index += sizeof(USHORT);
370     }
371 
372     if (index < GX_RESOURCE_HEADER_SIZE)
373     {
374         l = SwapUint(header.gx_resource_header_theme_data_size);
375         memcpy_s(header_array + index, GX_RESOURCE_HEADER_SIZE - index, &l, sizeof(LONG));
376         index += sizeof(LONG);
377     }
378 
379     if (index < GX_RESOURCE_HEADER_SIZE)
380     {
381         l = SwapUint(header.gx_resource_header_string_data_size);
382         memcpy_s(header_array + index, GX_RESOURCE_HEADER_SIZE - index, &l, sizeof(LONG));
383         index += sizeof(LONG);
384     }
385 
386     if (index < GX_RESOURCE_HEADER_SIZE)
387     {
388         l = SwapUint(header.gx_resource_header_data_size);
389         memcpy_s(header_array + index, GX_RESOURCE_HEADER_SIZE - index, &l, sizeof(LONG));
390         index += sizeof(LONG);
391     }
392 
393     WriteDataOut(header_array, GX_RESOURCE_HEADER_SIZE);
394 }
395 
396 ///////////////////////////////////////////////////////////////////////////////
WriteThemeHeader(GX_THEME_HEADER * header)397 void binary_resource_gen::WriteThemeHeader(GX_THEME_HEADER* header)
398 {
399     UCHAR header_array[GX_THEME_HEADER_SIZE];
400     int index = 0;
401     SHORT s;
402     LONG l;
403 
404     s = SwapUshort(header->gx_theme_header_magic_number);
405     memcpy_s(header_array, GX_THEME_HEADER_SIZE, &s, sizeof(USHORT));
406     index += sizeof(USHORT);
407 
408     if (index < GX_THEME_HEADER_SIZE)
409     {
410         s = SwapUshort(header->gx_theme_header_index);
411         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &s, sizeof(USHORT));
412         index += sizeof(USHORT);
413     }
414 
415     if (index < GX_THEME_HEADER_SIZE)
416     {
417         s = SwapUshort(header->gx_theme_header_color_count);
418         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &s, sizeof(USHORT));
419         index += sizeof(USHORT);
420     }
421 
422     if (index < GX_THEME_HEADER_SIZE)
423     {
424         s = SwapUshort(header->gx_theme_header_palette_count);
425         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &s, sizeof(USHORT));
426         index += sizeof(USHORT);
427     }
428 
429     if (index < GX_THEME_HEADER_SIZE)
430     {
431         s = SwapUshort(header->gx_theme_header_font_count);
432         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &s, sizeof(USHORT));
433         index += sizeof(USHORT);
434     }
435 
436     if (index < GX_THEME_HEADER_SIZE)
437     {
438         s = SwapUshort(header->gx_theme_header_pixelmap_count);
439         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &s, sizeof(USHORT));
440         index += sizeof(USHORT);
441     }
442 
443     if (index < GX_THEME_HEADER_SIZE)
444     {
445         s = SwapUshort(header->gx_theme_header_vscroll_appearance.gx_scroll_width);
446         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &s, sizeof(SHORT));
447         index += sizeof(SHORT);
448     }
449 
450     if (index < GX_THEME_HEADER_SIZE)
451     {
452         s = SwapUshort(header->gx_theme_header_vscroll_appearance.gx_scroll_thumb_width);
453         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &s, sizeof(SHORT));
454         index += sizeof(SHORT);
455     }
456 
457     if (index < GX_THEME_HEADER_SIZE)
458     {
459         s = SwapUshort(header->gx_theme_header_vscroll_appearance.gx_scroll_thumb_travel_min);
460         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &s, sizeof(SHORT));
461         index += sizeof(SHORT);
462     }
463 
464     if (index < GX_THEME_HEADER_SIZE)
465     {
466         s = SwapUshort(header->gx_theme_header_vscroll_appearance.gx_scroll_thumb_travel_max);
467         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &s, sizeof(SHORT));
468         index += sizeof(SHORT);
469     }
470 
471     if (index + 1 < GX_THEME_HEADER_SIZE)
472     {
473         header_array[index++] = header->gx_theme_header_vscroll_appearance.gx_scroll_thumb_border_style;
474         l = SwapUint(header->gx_theme_header_vscroll_appearance.gx_scroll_fill_pixelmap);
475         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
476         index += sizeof(LONG);
477     }
478 
479     if (index < GX_THEME_HEADER_SIZE)
480     {
481         l = SwapUint(header->gx_theme_header_vscroll_appearance.gx_scroll_thumb_pixelmap);
482         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
483         index += sizeof(LONG);
484     }
485 
486     if (index < GX_THEME_HEADER_SIZE)
487     {
488         l = SwapUint(header->gx_theme_header_vscroll_appearance.gx_scroll_up_pixelmap);
489         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
490         index += sizeof(LONG);
491     }
492 
493     if (index < GX_THEME_HEADER_SIZE)
494     {
495         l = SwapUint(header->gx_theme_header_vscroll_appearance.gx_scroll_down_pixelmap);
496         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
497         index += sizeof(LONG);
498     }
499 
500     if (index < GX_THEME_HEADER_SIZE)
501     {
502         l = SwapUint(header->gx_theme_header_vscroll_appearance.gx_scroll_thumb_color);
503         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
504         index += sizeof(LONG);
505     }
506 
507     if (index < GX_THEME_HEADER_SIZE)
508     {
509         l = SwapUint(header->gx_theme_header_vscroll_appearance.gx_scroll_thumb_border_color);
510         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
511         index += sizeof(LONG);
512     }
513 
514     if (index < GX_THEME_HEADER_SIZE)
515     {
516         l = SwapUint(header->gx_theme_header_vscroll_appearance.gx_scroll_button_color);
517         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
518         index += sizeof(LONG);
519     }
520 
521     if (index < GX_THEME_HEADER_SIZE)
522     {
523         s = SwapUshort(header->gx_theme_header_hscroll_appearance.gx_scroll_width);
524         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &s, sizeof(SHORT));
525         index += sizeof(SHORT);
526     }
527 
528     if (index < GX_THEME_HEADER_SIZE)
529     {
530         s = SwapUshort(header->gx_theme_header_hscroll_appearance.gx_scroll_thumb_width);
531         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &s, sizeof(SHORT));
532         index += sizeof(SHORT);
533     }
534 
535     if (index < GX_THEME_HEADER_SIZE)
536     {
537         s = SwapUshort(header->gx_theme_header_hscroll_appearance.gx_scroll_thumb_travel_min);
538         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &s, sizeof(SHORT));
539         index += sizeof(SHORT);
540     }
541 
542     if (index < GX_THEME_HEADER_SIZE)
543     {
544         s = SwapUshort(header->gx_theme_header_hscroll_appearance.gx_scroll_thumb_travel_max);
545         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &s, sizeof(SHORT));
546         index += sizeof(SHORT);
547     }
548 
549     if (index + 1 < GX_THEME_HEADER_SIZE)
550     {
551         header_array[index++] = header->gx_theme_header_hscroll_appearance.gx_scroll_thumb_border_style;
552         l = SwapUint(header->gx_theme_header_hscroll_appearance.gx_scroll_fill_pixelmap);
553         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
554         index += sizeof(LONG);
555     }
556 
557     if (index < GX_THEME_HEADER_SIZE)
558     {
559         l = SwapUint(header->gx_theme_header_hscroll_appearance.gx_scroll_thumb_pixelmap);
560         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
561         index += sizeof(LONG);
562     }
563 
564     if (index < GX_THEME_HEADER_SIZE)
565     {
566         l = SwapUint(header->gx_theme_header_hscroll_appearance.gx_scroll_up_pixelmap);
567         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
568         index += sizeof(LONG);
569     }
570 
571     if (index < GX_THEME_HEADER_SIZE)
572     {
573         l = SwapUint(header->gx_theme_header_hscroll_appearance.gx_scroll_down_pixelmap);
574         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
575         index += sizeof(LONG);
576     }
577 
578     if (index < GX_THEME_HEADER_SIZE)
579     {
580         l = SwapUint(header->gx_theme_header_hscroll_appearance.gx_scroll_thumb_color);
581         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
582         index += sizeof(LONG);
583     }
584 
585     if (index < GX_THEME_HEADER_SIZE)
586     {
587         l = SwapUint(header->gx_theme_header_hscroll_appearance.gx_scroll_thumb_border_color);
588         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
589         index += sizeof(LONG);
590     }
591 
592     if (index < GX_THEME_HEADER_SIZE)
593     {
594         l = SwapUint(header->gx_theme_header_hscroll_appearance.gx_scroll_button_color);
595         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
596         index += sizeof(LONG);
597     }
598 
599     if (index < GX_THEME_HEADER_SIZE)
600     {
601         l = SwapUint(header->gx_theme_header_vscroll_style);
602         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
603         index += sizeof(LONG);
604     }
605 
606     if (index < GX_THEME_HEADER_SIZE)
607     {
608         l = SwapUint(header->gx_theme_header_hscroll_style);
609         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
610         index += sizeof(LONG);
611     }
612 
613     if (index < GX_THEME_HEADER_SIZE)
614     {
615         l = SwapUint(header->gx_theme_header_color_data_size);
616         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
617         index += sizeof(LONG);
618     }
619 
620     if (index < GX_THEME_HEADER_SIZE)
621     {
622         l = SwapUint(header->gx_theme_header_palette_data_size);
623         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
624         index += sizeof(LONG);
625     }
626 
627     if (index < GX_THEME_HEADER_SIZE)
628     {
629         l = SwapUint(header->gx_theme_header_font_data_size);
630         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
631         index += sizeof(LONG);
632     }
633 
634     if (index < GX_THEME_HEADER_SIZE)
635     {
636         l = SwapUint(header->gx_theme_header_pixelmap_data_size);
637         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
638         index += sizeof(LONG);
639     }
640 
641     if (index < GX_THEME_HEADER_SIZE)
642     {
643         l = SwapUint(header->gx_theme_header_data_size);
644         memcpy_s(header_array + index, GX_THEME_HEADER_SIZE - index, &l, sizeof(LONG));
645         index += sizeof(LONG);
646     }
647 
648     WriteDataOut(header_array, GX_THEME_HEADER_SIZE);
649 }
650 
651 ///////////////////////////////////////////////////////////////////////////////
WriteColorHeader(GX_COLOR_HEADER * header)652 void binary_resource_gen::WriteColorHeader(GX_COLOR_HEADER *header)
653 {
654     UCHAR header_array[GX_COLOR_HEADER_SIZE];
655     int index = 0;
656     SHORT s;
657     LONG l;
658 
659     s = SwapUshort(header->gx_color_header_magic_number);
660     memcpy_s(header_array, GX_COLOR_HEADER_SIZE, &s, sizeof(USHORT));
661     index += sizeof(USHORT);
662 
663     if (index < GX_COLOR_HEADER_SIZE)
664     {
665         s = SwapUshort(header->gx_color_header_color_count);
666         memcpy_s(header_array + index, GX_COLOR_HEADER_SIZE - index, &s, sizeof(USHORT));
667         index += sizeof(USHORT);
668     }
669 
670     if (index < GX_COLOR_HEADER_SIZE)
671     {
672         l = SwapUint(header->gx_color_header_data_size);
673         memcpy_s(header_array + index, GX_COLOR_HEADER_SIZE - index, &l, sizeof(ULONG));
674         index += sizeof(ULONG);
675     }
676 
677     WriteDataOut(header_array, GX_COLOR_HEADER_SIZE);
678 }
679 
680 ///////////////////////////////////////////////////////////////////////////////
WritePaletteHeader(GX_PALETTE_HEADER * header)681 void binary_resource_gen::WritePaletteHeader(GX_PALETTE_HEADER *header)
682 {
683     UCHAR header_array[GX_PALETTE_HEADER_SIZE];
684     int index = 0;
685     SHORT s;
686     LONG l;
687 
688     s = SwapUshort(header->gx_palette_header_magic_number);
689     memcpy_s(header_array, GX_PALETTE_HEADER_SIZE, &s, sizeof(USHORT));
690     index += sizeof(USHORT);
691 
692     if (index < GX_PALETTE_HEADER_SIZE)
693     {
694         s = SwapUshort(header->gx_palette_header_color_count);
695         memcpy_s(header_array + index, GX_PALETTE_HEADER_SIZE - index, &s, sizeof(USHORT));
696         index += sizeof(USHORT);
697     }
698 
699     if (index < GX_PALETTE_HEADER_SIZE)
700     {
701         l = SwapUint(header->gx_palette_header_data_size);
702         memcpy_s(header_array + index, GX_PALETTE_HEADER_SIZE - index, &l, sizeof(ULONG));
703         index += sizeof(ULONG);
704     }
705 
706     WriteDataOut(header_array, GX_PALETTE_HEADER_SIZE);
707 }
708 
709 ///////////////////////////////////////////////////////////////////////////////
WriteFontHeader(GX_FONT_HEADER * header)710 void binary_resource_gen::WriteFontHeader(GX_FONT_HEADER *header)
711 {
712     UCHAR header_array[GX_FONT_HEADER_SIZE];
713     int index = 0;
714     SHORT s;
715     LONG l;
716 
717     s = SwapUshort(header->gx_font_header_magic_number);
718     memcpy_s(header_array, GX_FONT_HEADER_SIZE, &s, sizeof(USHORT));
719     index += sizeof(USHORT);
720 
721     if (index < GX_FONT_HEADER_SIZE)
722     {
723         s = SwapUshort(header->gx_font_header_index);
724         memcpy_s(header_array + index, GX_FONT_HEADER_SIZE - index, &s, sizeof(USHORT));
725         index += sizeof(USHORT);
726     }
727 
728     if (index < GX_FONT_HEADER_SIZE)
729     {
730         s = SwapUshort(header->gx_font_header_page_count);
731         memcpy_s(header_array + index, GX_FONT_HEADER_SIZE  - index, &s, sizeof(USHORT));
732         index += sizeof(USHORT);
733     }
734 
735     if (index + 1 < GX_FONT_HEADER_SIZE)
736     {
737         header_array[index++] = header->gx_font_header_deault;
738         header_array[index++] = header->gx_font_header_bits;
739     }
740 
741     if (index < GX_FONT_HEADER_SIZE)
742     {
743         l = SwapUint(header->gx_font_header_data_size);
744         memcpy_s(header_array + index, GX_FONT_HEADER_SIZE - index, &l, sizeof(ULONG));
745         index += sizeof(ULONG);
746     }
747 
748     if ((project_lib_version() >= GX_VERSION_DUPLICATE_BINRES_DATA_FIX) && (index < GX_FONT_HEADER_SIZE))
749     {
750         l = SwapUint(header->gx_font_header_data_offset);
751         memcpy_s(header_array + index, GX_FONT_HEADER_SIZE - index, &l, sizeof(ULONG));
752         index += sizeof(ULONG);
753     }
754 
755     WriteDataOut(header_array, GetFontHeaderSize());
756 }
757 
758 ///////////////////////////////////////////////////////////////////////////////
WritePageHeader(GX_PAGE_HEADER * header)759 void binary_resource_gen::WritePageHeader(GX_PAGE_HEADER *header)
760 {
761     UCHAR header_array[GX_PAGE_HEADER_SIZE];
762     int index = 0;
763     SHORT s;
764     LONG l;
765 
766     s = SwapUshort(header->gx_page_header_magic_number);
767     memcpy_s(header_array, GX_PAGE_HEADER_SIZE , &s, sizeof(USHORT));
768     index += sizeof(USHORT);
769 
770     if (index < GX_PAGE_HEADER_SIZE)
771     {
772         s = SwapUshort(header->gx_page_header_index);
773         memcpy_s(header_array + index, GX_PAGE_HEADER_SIZE  - index, &s, sizeof(USHORT));
774         index += sizeof(USHORT);
775     }
776 
777     if (index + 4 < GX_PAGE_HEADER_SIZE)
778     {
779         header_array[index++] = header->gx_page_header_format;
780         header_array[index++] = header->gx_page_header_prespace;
781         header_array[index++] = header->gx_page_header_postspace;
782         header_array[index++] = header->gx_page_header_line_height;
783         header_array[index++] = header->gx_page_header_baseline;
784     }
785 
786     if (index < GX_PAGE_HEADER_SIZE)
787     {
788         l = SwapUint((UINT)header->gx_page_header_first_glyph);
789         memcpy_s(header_array + index, GX_PAGE_HEADER_SIZE  - index, &l, sizeof(ULONG));
790         index += sizeof(ULONG);
791     }
792 
793     if (index < GX_PAGE_HEADER_SIZE)
794     {
795         l = SwapUint((UINT)header->gx_page_header_last_glyph);
796         memcpy_s(header_array + index, GX_PAGE_HEADER_SIZE - index, &l, sizeof(ULONG));
797         index += sizeof(ULONG);
798     }
799 
800     if (index < GX_PAGE_HEADER_SIZE)
801     {
802         l = SwapUint(header->gx_page_header_data_size);
803         memcpy_s(header_array + index, GX_PAGE_HEADER_SIZE - index, &l, sizeof(ULONG));
804         index += sizeof(ULONG);
805     }
806 
807     WriteDataOut(header_array, GX_PAGE_HEADER_SIZE);
808 }
809 
810 ///////////////////////////////////////////////////////////////////////////////
WriteGlyphHeader(GX_GLYPH_HEADER * header)811 void binary_resource_gen::WriteGlyphHeader(GX_GLYPH_HEADER* header)
812 {
813     UCHAR header_array[GX_GLYPH_HEADER_SIZE];
814     int index = 0;
815     SHORT s;
816     LONG l;
817 
818     s = SwapUshort(header->gx_glyph_header_magic_number);
819     memcpy_s(header_array, GX_GLYPH_HEADER_SIZE, &s, sizeof(USHORT));
820     index += sizeof(USHORT);
821 
822     if (index < GX_GLYPH_HEADER_SIZE)
823     {
824         s = SwapUshort(header->gx_glyph_header_map_size);
825         memcpy_s(header_array + index, GX_GLYPH_HEADER_SIZE - index, &s, sizeof(USHORT));
826         index += sizeof(USHORT);
827     }
828 
829     if ((project_lib_version() >= GX_VERSION_BINRES_FONT_ALIGNMENT_FIX) && (index < GX_GLYPH_HEADER_SIZE))
830     {
831         l = SwapUint(header->gx_glyph_header_map_offset);
832         memcpy_s(header_array + index, GX_GLYPH_HEADER_SIZE - index, &l, sizeof(ULONG));
833         index += sizeof(ULONG);
834     }
835 
836     if (index < GX_GLYPH_HEADER_SIZE)
837     {
838         s = SwapUshort(header->gx_glyph_header_index);
839         memcpy_s(header_array + index, GX_GLYPH_HEADER_SIZE - index, &s, sizeof(USHORT));
840         index += sizeof(USHORT);
841     }
842 
843     if (index < GX_GLYPH_HEADER_SIZE)
844     {
845         s = SwapUshort(header->gx_glyph_header_ascent);
846         memcpy_s(header_array + index, GX_GLYPH_HEADER_SIZE - index, &s, sizeof(USHORT));
847         index += sizeof(USHORT);
848     }
849 
850     if (index < GX_GLYPH_HEADER_SIZE)
851     {
852         s = SwapUshort(header->gx_glyph_header_descent);
853         memcpy_s(header_array + index, GX_GLYPH_HEADER_SIZE - index, &s, sizeof(USHORT));
854         index += sizeof(USHORT);
855     }
856 
857     if (index + 3 < GX_GLYPH_HEADER_SIZE)
858     {
859         header_array[index++] = header->gx_glyph_header_advance;
860         header_array[index++] = header->gx_glyph_header_leading;
861         header_array[index++] = header->gx_glyph_header_width;
862         header_array[index++] = header->gx_glyph_header_height;
863     }
864 
865     if (index < GX_GLYPH_HEADER_SIZE)
866     {
867         l = SwapUint(header->gx_glyph_header_data_size);
868         memcpy_s(header_array + index, GX_GLYPH_HEADER_SIZE - index, &l, sizeof(ULONG));
869     }
870 
871     WriteDataOut(header_array, GetGlyphHeaderSize());
872 }
873 
874 
875 ///////////////////////////////////////////////////////////////////////////////
WriteKerningGlyphHeader(GX_KERNING_GLYPH_HEADER * header)876 void binary_resource_gen::WriteKerningGlyphHeader(GX_KERNING_GLYPH_HEADER *header)
877 {
878     UCHAR header_array[GX_KERNING_GLYPH_HEADER_SIZE];
879     int index = 0;
880     SHORT s;
881     LONG l;
882 
883     s = SwapUshort(header->gx_glyph_header_magic_number);
884     memcpy_s(header_array, GX_KERNING_GLYPH_HEADER_SIZE, &s, sizeof(USHORT));
885     index += sizeof(USHORT);
886 
887     if (index < GX_KERNING_GLYPH_HEADER_SIZE)
888     {
889         s = SwapUshort(header->gx_glyph_header_map_size);
890         memcpy_s(header_array + index, GX_KERNING_GLYPH_HEADER_SIZE - index, &s, sizeof(USHORT));
891         index += sizeof(USHORT);
892     }
893 
894     if ((project_lib_version() >= GX_VERSION_BINRES_FONT_ALIGNMENT_FIX) && (index < GX_GLYPH_HEADER_SIZE))
895     {
896         l = SwapUint(header->gx_glyph_header_map_offset);
897         memcpy_s(header_array + index, GX_GLYPH_HEADER_SIZE - index, &l, sizeof(ULONG));
898         index += sizeof(ULONG);
899     }
900 
901     if (index < GX_KERNING_GLYPH_HEADER_SIZE)
902     {
903         s = SwapUshort(header->gx_glyph_header_index);
904         memcpy_s(header_array + index, GX_KERNING_GLYPH_HEADER_SIZE - index, &s, sizeof(USHORT));
905         index += sizeof(USHORT);
906     }
907 
908     if (index < GX_KERNING_GLYPH_HEADER_SIZE)
909     {
910         s = SwapUshort(header->gx_glyph_header_ascent);
911         memcpy_s(header_array + index, GX_KERNING_GLYPH_HEADER_SIZE - index, &s, sizeof(USHORT));
912         index += sizeof(USHORT);
913     }
914 
915     if (index < GX_KERNING_GLYPH_HEADER_SIZE)
916     {
917         s = SwapUshort(header->gx_glyph_header_descent);
918         memcpy_s(header_array + index, GX_KERNING_GLYPH_HEADER_SIZE - index, &s, sizeof(USHORT));
919         index += sizeof(USHORT);
920     }
921 
922     if (index + 3 < GX_KERNING_GLYPH_HEADER_SIZE)
923     {
924         header_array[index++] = header->gx_glyph_header_advance;
925         header_array[index++] = header->gx_glyph_header_leading;
926         header_array[index++] = header->gx_glyph_header_width;
927         header_array[index++] = header->gx_glyph_header_height;
928     }
929 
930     if (index < GX_KERNING_GLYPH_HEADER_SIZE)
931     {
932         l = SwapUint(header->gx_glyph_header_data_size);
933         memcpy_s(header_array + index, GX_KERNING_GLYPH_HEADER_SIZE - index, &l, sizeof(ULONG));
934         index += sizeof(ULONG);
935     }
936 
937     if (index < GX_KERNING_GLYPH_HEADER_SIZE)
938     {
939         s = SwapUshort(header->gx_glyph_header_kerning_table_size);
940         memcpy_s(header_array + index, GX_KERNING_GLYPH_HEADER_SIZE - index, &s, sizeof(USHORT));
941     }
942 
943     WriteDataOut(header_array, GetKerningGlyphHeaderSize());
944 }
945 
946 ///////////////////////////////////////////////////////////////////////////////
WritePixelmapHeader(GX_PIXELMAP_HEADER * header)947 void binary_resource_gen::WritePixelmapHeader(GX_PIXELMAP_HEADER *header)
948 {
949     UCHAR header_array[GX_PIXELMAP_HEADER_SIZE];
950     int index = 0;
951     SHORT s;
952     LONG l;
953 
954     s = SwapUshort(header->gx_pixelmap_header_magic_number);
955     memcpy_s(header_array, GX_PIXELMAP_HEADER_SIZE, &s, sizeof(USHORT));
956     index += sizeof(USHORT);
957 
958     if (index < GX_PIXELMAP_HEADER_SIZE)
959     {
960         s = SwapUshort(header->gx_pixelmap_header_index);
961         memcpy_s(header_array + index, GX_PIXELMAP_HEADER_SIZE - index, &s, sizeof(USHORT));
962         index += sizeof(USHORT);
963     }
964 
965     if (index + 3 < GX_PIXELMAP_HEADER_SIZE)
966     {
967         header_array[index++] = header->gx_pixelmap_header_version_major;
968         header_array[index++] = header->gx_pixelmap_header_version_minor;
969         header_array[index++] = header->gx_pixelmap_header_flags;
970         header_array[index++] = header->gx_pixelmap_header_format;
971     }
972 
973     if (index < GX_PIXELMAP_HEADER_SIZE)
974     {
975         l = SwapUint(header->gx_pixelmap_header_map_size);
976         memcpy_s(header_array + index, GX_PIXELMAP_HEADER_SIZE - index, &l, sizeof(ULONG));
977         index += sizeof(ULONG);
978     }
979 
980     if (index < GX_PIXELMAP_HEADER_SIZE)
981     {
982         l = SwapUint(header->gx_pixelmap_header_aux_data_size);
983         memcpy_s(header_array + index, GX_PIXELMAP_HEADER_SIZE - index, &l, sizeof(ULONG));
984         index += sizeof(ULONG);
985     }
986 
987     if (index < GX_PIXELMAP_HEADER_SIZE)
988     {
989         l = SwapUint(header->gx_pixelmap_header_transparent_color);
990         memcpy_s(header_array + index, GX_PIXELMAP_HEADER_SIZE - index, &l, sizeof(GX_COLOR));
991         index += sizeof(GX_COLOR);
992     }
993 
994     if (index < GX_PIXELMAP_HEADER_SIZE)
995     {
996         s = SwapUshort(header->gx_pixelmap_header_width);
997         memcpy_s(header_array + index, GX_PIXELMAP_HEADER_SIZE - index, &s, sizeof(USHORT));
998         index += sizeof(USHORT);
999     }
1000 
1001     if (index < GX_PIXELMAP_HEADER_SIZE)
1002     {
1003         s = SwapUshort(header->gx_pixelmap_header_height);
1004         memcpy_s(header_array + index, GX_PIXELMAP_HEADER_SIZE - index, &s, sizeof(USHORT));
1005         index += sizeof(USHORT);
1006     }
1007 
1008     if (index < GX_PIXELMAP_HEADER_SIZE)
1009     {
1010         l = SwapUint(header->gx_pixelmap_header_data_size);
1011         memcpy_s(header_array + index, GX_PIXELMAP_HEADER_SIZE - index, &l, sizeof(ULONG));
1012         index += sizeof(ULONG);
1013     }
1014 
1015     if ((project_lib_version() >= GX_VERSION_DUPLICATE_BINRES_DATA_FIX) && (index < GX_PIXELMAP_HEADER_SIZE))
1016     {
1017         l = SwapUint(header->gx_pixelmap_header_data_offset);
1018         memcpy_s(header_array + index, GX_PIXELMAP_HEADER_SIZE - index, &l, sizeof(ULONG));
1019         index += sizeof(ULONG);
1020     }
1021 
1022     WriteDataOut(header_array, GetPixelmapHeaderSize());
1023 }
1024 
1025 ///////////////////////////////////////////////////////////////////////////////
WriteStringHeader(GX_STRING_HEADER * header)1026 void binary_resource_gen::WriteStringHeader(GX_STRING_HEADER *header)
1027 {
1028     UCHAR header_array[GX_STRING_HEADER_SIZE];
1029     int index = 0;
1030     SHORT s;
1031     LONG l;
1032 
1033     s = SwapUshort(header->gx_string_header_magic_number);
1034     memcpy_s(header_array, GX_STRING_HEADER_SIZE, &s, sizeof(USHORT));
1035     index += sizeof(USHORT);
1036 
1037     if (index < GX_STRING_HEADER_SIZE)
1038     {
1039         s = SwapUshort(header->gx_string_header_language_count);
1040         memcpy_s(header_array + index, GX_STRING_HEADER_SIZE  - index, &s, sizeof(USHORT));
1041         index += sizeof(USHORT);
1042     }
1043 
1044     if (index < GX_STRING_HEADER_SIZE)
1045     {
1046         s = SwapUshort(header->gx_string_header_string_count);
1047         memcpy_s(header_array + index, GX_STRING_HEADER_SIZE - index, &s, sizeof(USHORT));
1048         index += sizeof(USHORT);
1049     }
1050 
1051     if (index < GX_STRING_HEADER_SIZE)
1052     {
1053         l = SwapUint(header->gx_string_header_data_size);
1054         memcpy_s(header_array + index, GX_STRING_HEADER_SIZE - index, &l, sizeof(ULONG));
1055     }
1056 
1057     WriteDataOut(header_array, GX_STRING_HEADER_SIZE);
1058 }
1059 
1060 ///////////////////////////////////////////////////////////////////////////////
WriteLanguageHeader(GX_LANGUAGE_HEADER * header)1061 void binary_resource_gen::WriteLanguageHeader(GX_LANGUAGE_HEADER *header)
1062 {
1063     UCHAR header_array[GX_LANGUAGE_HEADER_SIZE];
1064     int index = 0;
1065     SHORT s;
1066     LONG l;
1067 
1068     s = SwapUshort(header->gx_language_header_magic_number);
1069     memcpy_s(header_array, GX_LANGUAGE_HEADER_SIZE, &s, sizeof(USHORT));
1070     index += sizeof(USHORT);
1071 
1072     if (index < GX_LANGUAGE_HEADER_SIZE)
1073     {
1074         s = SwapUshort(header->gx_language_header_index);
1075         memcpy_s(header_array + index, GX_LANGUAGE_HEADER_SIZE  - index, &s, sizeof(USHORT));
1076         index += sizeof(USHORT);
1077     }
1078 
1079     if (index < GX_LANGUAGE_HEADER_SIZE)
1080     {
1081         memcpy_s(header_array + index, GX_LANGUAGE_HEADER_SIZE - index, header->gx_language_header_name, GX_LANGUAGE_HEADER_NAME_SIZE);
1082         index += GX_LANGUAGE_HEADER_NAME_SIZE;
1083     }
1084 
1085     if (index < GX_LANGUAGE_HEADER_SIZE)
1086     {
1087         l = SwapUint(header->gx_language_header_data_size);
1088         memcpy_s(header_array + index, GX_LANGUAGE_HEADER_SIZE - index, &l, sizeof(ULONG));
1089         index += sizeof(ULONG);
1090     }
1091 
1092     WriteDataOut(header_array, GX_LANGUAGE_HEADER_SIZE);
1093 }
1094 
1095 ///////////////////////////////////////////////////////////////////////////////
WriteStandaloneResHeader()1096 void binary_resource_gen::WriteStandaloneResHeader()
1097 {
1098     if (m_written_size)
1099     {
1100         return;
1101     }
1102 
1103     file_info* info;
1104     CString filename = RemoveFileExtension(m_outfile->GetFileName());
1105     filename.MakeUpper();
1106 
1107     info = FindFileInfo(&m_file_dictionary, filename);
1108     if (!info)
1109     {
1110         info = m_file_dictionary.GetAt(0);
1111     }
1112 
1113     UCHAR header_array[GX_RESOURCE_STANDALONE_HEADER_SIZE];
1114     int index = 0;
1115     SHORT s;
1116     LONG l;
1117     ULONG offset;
1118     int res_count = info->size_table.GetCount();
1119 
1120     // Write resource type.
1121     s = SwapUshort(GX_RESOURCE_TYPE_BINRES_STANDALONE);
1122     memcpy_s(header_array, GX_RESOURCE_STANDALONE_HEADER_SIZE, &s, sizeof(USHORT));
1123     index += sizeof(USHORT);
1124 
1125     // Write version.
1126     if (index < GX_RESOURCE_STANDALONE_HEADER_SIZE)
1127     {
1128         s = SwapUshort(m_project->mHeader.guix_version);
1129         memcpy_s(header_array + index, GX_RESOURCE_STANDALONE_HEADER_SIZE - index, &s, sizeof(USHORT));
1130         index += sizeof(USHORT);
1131     }
1132 
1133     // Write resource count.
1134     if (index < GX_RESOURCE_STANDALONE_HEADER_SIZE)
1135     {
1136         l = SwapUint(res_count);
1137         memcpy_s(header_array + index, GX_RESOURCE_STANDALONE_HEADER_SIZE - index, &l, sizeof(ULONG));
1138         index += sizeof(ULONG);
1139     }
1140 
1141     WriteDataOut(header_array, GX_RESOURCE_STANDALONE_HEADER_SIZE);
1142 
1143     if (res_count > 1)
1144     {
1145         // Generate offset table when more than one resource is generated to one binary file.
1146         offset = m_written_size + sizeof(ULONG) * res_count;
1147 
1148         for (int index = 0; index < res_count; index++)
1149         {
1150             l = SwapUint(offset);
1151             WriteDataOut((void*)&l, sizeof(ULONG));
1152 
1153             offset += info->size_table.GetAt(index);
1154         }
1155     }
1156 }
1157 
1158 ///////////////////////////////////////////////////////////////////////////////
SwapUshort(USHORT s)1159 USHORT binary_resource_gen::SwapUshort(USHORT s)
1160 {
1161     if (m_big_endian)
1162     {
1163         UCHAR b1, b2;
1164 
1165         b1 = s & 0xff;
1166         b2 = (s >> 8) & 0xff;
1167 
1168         return (b1 << 8) + b2;
1169     }
1170     else
1171     {
1172         return s;
1173     }
1174 }
1175 
1176 ///////////////////////////////////////////////////////////////////////////////
SwapUint(UINT l)1177 UINT  binary_resource_gen::SwapUint(UINT l)
1178 {
1179     if (m_big_endian)
1180     {
1181         UCHAR b1, b2, b3, b4;
1182 
1183         b1 = l & 0xff;
1184         b2 = (l >> 8) & 0xff;
1185         b3 = (l >> 16) & 0xff;
1186         b4 = (l >> 24) & 0xff;
1187 
1188         return ((LONG)b1 << 24) + ((LONG)b2 << 16) + ((LONG)b3 << 8) + b4;
1189     }
1190     else
1191     {
1192         return l;
1193     }
1194 }
1195 
1196 ///////////////////////////////////////////////////////////////////////////////
WriteThemeBlock(USHORT theme_id)1197 void binary_resource_gen::WriteThemeBlock(USHORT theme_id)
1198 {
1199     if (!m_project)
1200     {
1201         return;
1202     }
1203 
1204     GX_THEME_HEADER header;
1205 
1206     header.gx_theme_header_magic_number = GX_MAGIC_NUMBER;
1207     header.gx_theme_header_index = theme_id;
1208     header.gx_theme_header_color_count = GetColorCount(theme_id);
1209     if (m_project->mDisplays[m_display].colorformat == GX_COLOR_FORMAT_8BIT_PALETTE &&
1210         m_project->mDisplays[m_display].themes[theme_id].palette != NULL)
1211     {
1212         /* ONly 8bit palette size is wanted to be generated.
1213         4bpp driver contains palette table. But it is just used inside Studio.*/
1214         header.gx_theme_header_palette_count = m_project->mDisplays[m_display].themes[theme_id].palette_total_size;
1215     }
1216     else
1217     {
1218         header.gx_theme_header_palette_count = 0;
1219     }
1220 
1221     header.gx_theme_header_font_count = GetFontCount(theme_id);
1222     header.gx_theme_header_pixelmap_count = GetPixelmapCount(theme_id);
1223     header.gx_theme_header_color_data_size = GetColorBlockSize(theme_id);
1224     header.gx_theme_header_palette_data_size = GetPaletteBlockSize(theme_id);
1225 
1226     ULONG written_size = m_written_size;
1227     written_size += GetThemeHeaderSize();
1228     written_size += header.gx_theme_header_color_data_size;
1229     written_size += header.gx_theme_header_palette_data_size;
1230 
1231     header.gx_theme_header_font_data_size = GetFontBlockSize(written_size, theme_id, -1);
1232 
1233     written_size += header.gx_theme_header_font_data_size;
1234 
1235     header.gx_theme_header_pixelmap_data_size = GetPixelmapBlockSize(written_size, theme_id, -1, -1);
1236     /* calculate theme data size. */
1237     header.gx_theme_header_data_size = header.gx_theme_header_color_data_size;
1238     header.gx_theme_header_data_size += header.gx_theme_header_palette_data_size;
1239     header.gx_theme_header_data_size += header.gx_theme_header_font_data_size;
1240     header.gx_theme_header_data_size += header.gx_theme_header_pixelmap_data_size;
1241 
1242     memcpy_s(&header.gx_theme_header_vscroll_appearance,
1243            sizeof(header.gx_theme_header_vscroll_appearance),
1244            &m_project->mDisplays[m_display].themes[theme_id].VScrollAppearance, sizeof(GX_SCROLLBAR_APPEARANCE));
1245 
1246     memcpy_s(&header.gx_theme_header_hscroll_appearance,
1247         sizeof(header.gx_theme_header_hscroll_appearance),
1248         &m_project->mDisplays[m_display].themes[theme_id].HScrollAppearance, sizeof(GX_SCROLLBAR_APPEARANCE));
1249 
1250     header.gx_theme_header_vscroll_style = m_project->mDisplays[m_display].themes[theme_id].VScrollStyle;
1251     header.gx_theme_header_hscroll_style = m_project->mDisplays[m_display].themes[theme_id].HScrollStyle;
1252 
1253     // Write theme header
1254     WriteThemeHeader(&header);
1255 
1256     // Write theme data
1257     theme_info *info = &m_project->mDisplays[m_display].themes[theme_id];
1258     CCommandInfo *pCmd = GetCmdInfo();
1259     BOOL gen_color_table;
1260     BOOL gen_font_table;
1261     BOOL gen_pixelmap_table;
1262 
1263     if (pCmd->IsNoGui())
1264     {
1265         gen_color_table = TRUE;
1266         gen_font_table = TRUE;
1267         gen_pixelmap_table = TRUE;
1268     }
1269     else
1270     {
1271         gen_color_table = info->gen_color_table;
1272         gen_font_table = info->gen_font_table;
1273         gen_pixelmap_table = info->gen_pixelmap_table;
1274     }
1275 
1276     if (gen_color_table &&
1277         header.gx_theme_header_color_count)
1278     {
1279         WriteColorBlock(theme_id);
1280     }
1281 
1282     if (info->palette &&
1283         header.gx_theme_header_palette_count)
1284     {
1285         WritePaletteBlock(theme_id);
1286     }
1287 
1288     if (gen_font_table &&
1289         header.gx_theme_header_font_count)
1290     {
1291         int font_id;
1292 
1293         for (font_id = 0; font_id < m_project->CountResources(m_display, RES_TYPE_FONT); font_id++)
1294         {
1295             res_info *info = m_project->FindResource(m_display, theme_id, RES_TYPE_FONT, font_id);
1296 
1297             if (info)
1298             {
1299                 WriteFontBlock(info, font_id, theme_id);
1300             }
1301         }
1302     }
1303 
1304     if (gen_pixelmap_table &&
1305         header.gx_theme_header_pixelmap_count)
1306     {
1307         int pixelmap_id;
1308         int frame_id;
1309         int output_id = 1;
1310 
1311         for (pixelmap_id = 1; pixelmap_id < m_pixelmap_dictionary.GetCount(); pixelmap_id++)
1312         {
1313             res_info *info = m_project->FindResource(m_display, theme_id, RES_TYPE_PIXELMAP, m_pixelmap_dictionary.GetAt(pixelmap_id));
1314 
1315             if (info && info->GetPixelmapFrameCount() && (info->enabled) && (info->parent->enabled))
1316             {
1317                 for (frame_id = 0; frame_id < info->GetPixelmapFrameCount(); frame_id++)
1318                 {
1319                     WritePixelmapBlock(info, pixelmap_id, output_id++, theme_id, frame_id);
1320                 }
1321             }
1322             else if (IsSystemPixelmap(pixelmap_id))
1323             {
1324                 output_id++;
1325             }
1326         }
1327     }
1328 }
1329 
1330 ///////////////////////////////////////////////////////////////////////////////
WriteColorBlock(int theme_id)1331 void binary_resource_gen::WriteColorBlock(int theme_id)
1332 {
1333     int color_count = GetColorCount(theme_id);
1334 
1335     GX_COLOR_HEADER header;
1336     header.gx_color_header_magic_number = GX_MAGIC_NUMBER;
1337     header.gx_color_header_color_count = color_count;
1338     header.gx_color_header_data_size = color_count * sizeof(GX_COLOR);
1339 
1340     //Write Color Header
1341     WriteColorHeader(&header);
1342 
1343     //Write color data
1344     int color_id;
1345     GX_COLOR rgb_color;
1346     GX_COLOR native_color;
1347     int color_format;
1348 
1349     color_format = m_project->mDisplays[m_display].colorformat;
1350 
1351     // write color table data
1352     for (color_id = 0; color_id < m_project->CountResources(m_display, RES_TYPE_COLOR); color_id++)
1353     {
1354         res_info *info = m_project->FindResource(m_display, theme_id, RES_TYPE_COLOR, color_id);
1355 
1356         if (info)
1357         {
1358             rgb_color = info->colorval;
1359             native_color = resource_view::GetNativeColor(rgb_color, color_format);
1360 
1361             native_color = SwapUint(native_color);
1362 
1363             WriteDataOut(&native_color, sizeof(GX_COLOR));
1364         }
1365     }
1366 }
1367 
1368 ///////////////////////////////////////////////////////////////////////////////
WritePaletteBlock(int theme_id)1369 void binary_resource_gen::WritePaletteBlock(int theme_id)
1370 {
1371     theme_info *info = &m_project->mDisplays[m_display].themes[theme_id];
1372     int color_count = info->palette_total_size;
1373     int palette_index;
1374     GX_COLOR rgb_color;
1375 
1376     if (color_count)
1377     {
1378         GX_PALETTE_HEADER header;
1379         header.gx_palette_header_magic_number = GX_MAGIC_NUMBER;
1380         header.gx_palette_header_color_count = color_count;
1381         header.gx_palette_header_data_size = color_count * sizeof(GX_COLOR);
1382 
1383         //Write Palette Header
1384         WritePaletteHeader(&header);
1385 
1386         //Write palette data
1387 
1388         for (palette_index = 0; palette_index < color_count; palette_index++)
1389         {
1390             rgb_color = SwapUint(info->palette[palette_index]);
1391             WriteDataOut(&rgb_color, sizeof(ULONG));
1392         }
1393     }
1394 }
1395 
1396 
1397 ///////////////////////////////////////////////////////////////////////////////
WriteFontBlock(res_info * info,USHORT font_id,USHORT theme_id)1398 void binary_resource_gen::WriteFontBlock(res_info *info, USHORT font_id, USHORT theme_id)
1399 {
1400     GX_FONT_HEADER header;
1401     int reference_theme = -1;
1402     USHORT output_font_id = font_id;
1403 
1404     if (m_file_format == BINARY_FILE_FORMAT_BIN_STANDALONE)
1405     {
1406         CString filename = RemoveFileExtension(m_outfile->GetFileName());
1407         filename.MakeUpper();
1408 
1409         file_info *finfo = FindFileInfo(&m_file_dictionary, filename);
1410         if (!finfo)
1411         {
1412             finfo = m_file_dictionary.GetAt(0);
1413         }
1414         output_font_id = finfo->write_res_index++;
1415     }
1416 
1417     memset(&header, 0, sizeof(GX_FONT_HEADER));
1418     header.gx_font_header_magic_number = GX_MAGIC_NUMBER;
1419     header.gx_font_header_index = output_font_id;
1420     header.gx_font_header_page_count = GetPageCount(info, theme_id, font_id);
1421     header.gx_font_header_bits = info->font_bits;
1422 
1423     if (info->is_default && info->pathinfo.pathname.IsEmpty() &&
1424         !IsRotatedResourceSupported(m_project, m_display))
1425     {
1426         header.gx_font_header_deault = TRUE;
1427     }
1428     else
1429     {
1430         header.gx_font_header_deault = FALSE;
1431 
1432         if (project_lib_version() >= GX_VERSION_DUPLICATE_BINRES_DATA_FIX)
1433         {
1434             reference_theme = FindResourceReferenceTheme(info, theme_id);
1435         }
1436     }
1437 
1438     if (reference_theme >= 0)
1439     {
1440         header.gx_font_header_data_offset = GetFontDataOffset(font_id, reference_theme);
1441 
1442         //write font header
1443         WriteFontHeader(&header);
1444     }
1445     else
1446     {
1447         header.gx_font_header_data_size = GetFontDataSize(m_written_size + GetFontHeaderSize(), info, theme_id, font_id);
1448 
1449         //write font header
1450         WriteFontHeader(&header);
1451 
1452         //write font data
1453         WriteFontData(info, theme_id, font_id);
1454     }
1455 }
1456 
1457 ///////////////////////////////////////////////////////////////////////////////
WriteFontData(res_info * info,USHORT theme_id,USHORT font_id)1458 void binary_resource_gen::WriteFontData(res_info *info, USHORT theme_id, USHORT font_id)
1459 {
1460 
1461     const GX_FONT *font_page;
1462     GX_FONT *head_page;
1463     int page_index;
1464 
1465     if (info->is_default && info->pathinfo.pathname.IsEmpty() &&
1466         !IsRotatedResourceSupported(m_project, m_display))
1467     {
1468         return;
1469     }
1470 
1471     head_page = GetPageHead(info, theme_id, font_id);
1472 
1473     //write font data
1474     font_page = head_page;
1475     page_index = 1;
1476     while (font_page)
1477     {
1478         WritePageBlock(font_page, page_index);
1479 
1480         page_index++;
1481         font_page = font_page->gx_font_next_page;
1482     }
1483 }
1484 
1485 
1486 ///////////////////////////////////////////////////////////////////////////////
WritePageBlock(const GX_FONT * font,USHORT page_id)1487 void binary_resource_gen::WritePageBlock(const GX_FONT *font, USHORT page_id)
1488 {
1489     if (!font)
1490     {
1491         return;
1492     }
1493 
1494     GX_PAGE_HEADER header;
1495     header.gx_page_header_magic_number = GX_MAGIC_NUMBER;
1496     header.gx_page_header_index = page_id;
1497     header.gx_page_header_format = font->gx_font_format;
1498     header.gx_page_header_prespace = font->gx_font_prespace;
1499     header.gx_page_header_postspace = font->gx_font_postspace;
1500     header.gx_page_header_line_height = font->gx_font_line_height;
1501     header.gx_page_header_baseline = font->gx_font_baseline;
1502     header.gx_page_header_first_glyph = font->gx_font_first_glyph;
1503     header.gx_page_header_last_glyph = font->gx_font_last_glyph;
1504     header.gx_page_header_data_size = GetPageDataSize(m_written_size + GetPageHeaderSize(), font);
1505 
1506     if (IsRotatedResourceSupported(m_project, m_display))
1507     {
1508         switch (m_project->mDisplays[m_display].rotation_angle)
1509         {
1510         case GX_SCREEN_ROTATION_CW:
1511             header.gx_page_header_format |= GX_FONT_FORMAT_ROTATED_90;
1512             break;
1513         case GX_SCREEN_ROTATION_CCW:
1514             header.gx_page_header_format |= GX_FONT_FORMAT_ROTATED_270;
1515             break;
1516         }
1517     }
1518 
1519     //Write font page header
1520     WritePageHeader(&header);
1521 
1522     // Write font page data
1523     GX_CHAR_CODE charval;
1524     INT glyph_index;
1525 
1526     for (charval = font->gx_font_first_glyph; charval <= font->gx_font_last_glyph; charval++)
1527     {
1528         glyph_index = charval - font->gx_font_first_glyph;
1529         WriteGlyphBock(font, glyph_index);
1530     }
1531 }
1532 
1533 ///////////////////////////////////////////////////////////////////////////////
WriteGlyphBock(const GX_FONT * font,USHORT glyph_index)1534 void binary_resource_gen::WriteGlyphBock(const GX_FONT *font, USHORT glyph_index)
1535 {
1536     studiox_project *project = GetOpenProject();
1537     if (project)
1538     {
1539         const GX_GLYPH *glyph = NULL;
1540         GX_KERNING_GLYPH_HEADER header;
1541 
1542         if (font->gx_font_format & GX_FONT_FORMAT_COMPRESSED)
1543         {
1544             const GX_COMPRESSED_GLYPH *compressed_glyph = &font ->gx_font_glyphs.gx_font_compressed_glyphs[glyph_index];
1545             header.gx_glyph_header_map_size = compressed_glyph->gx_glyph_map_size;
1546             glyph = (const GX_GLYPH *)compressed_glyph;
1547         }
1548         else if (font->gx_font_format & GX_FONT_FORMAT_KERNING)
1549         {
1550             const GX_KERNING_GLYPH *kerning_glyph = &font->gx_font_glyphs.gx_font_kerning_glyphs[glyph_index];
1551             header.gx_glyph_header_map_size = 0;
1552             glyph = (const GX_GLYPH *)kerning_glyph;
1553         }
1554         else
1555         {
1556             glyph = &font->gx_font_glyphs.gx_font_normal_glyphs[glyph_index];
1557             header.gx_glyph_header_map_size = 0;
1558         }
1559 
1560         const UCHAR *data = glyph->gx_glyph_map;
1561         UCHAR *rotated_data = NULL;
1562         int map_size = header.gx_glyph_header_map_size;
1563         int map_data_pos;
1564 
1565         if (IsRotatedResourceSupported(m_project, m_display))
1566         {
1567             RotateGlyphData(glyph, font->gx_font_format, &rotated_data, &map_size);
1568 
1569             header.gx_glyph_header_map_size = map_size;
1570 
1571             data = rotated_data;
1572         }
1573 
1574         header.gx_glyph_header_magic_number = GX_MAGIC_NUMBER;
1575         header.gx_glyph_header_index = glyph_index;
1576         header.gx_glyph_header_ascent = glyph->gx_glyph_ascent;
1577         header.gx_glyph_header_descent = glyph->gx_glyph_descent;
1578         header.gx_glyph_header_advance = glyph->gx_glyph_advance;
1579         header.gx_glyph_header_leading = glyph->gx_glyph_leading;
1580         header.gx_glyph_header_width = glyph->gx_glyph_width;
1581         header.gx_glyph_header_height = glyph->gx_glyph_height;
1582         header.gx_glyph_header_kerning_table_size = 0;
1583         header.gx_glyph_header_map_offset = (m_written_size - m_written_start_address);
1584 
1585         if (font->gx_font_format & GX_FONT_FORMAT_KERNING)
1586         {
1587             header.gx_glyph_header_map_offset += GX_KERNING_GLYPH_HEADER_SIZE;
1588             map_data_pos = m_written_size + GetKerningGlyphHeaderSize();
1589         }
1590         else
1591         {
1592             header.gx_glyph_header_map_offset += GX_GLYPH_HEADER_SIZE;
1593             map_data_pos = m_written_size + GetGlyphHeaderSize();
1594         }
1595 
1596         if (header.gx_glyph_header_map_offset & 0x03)
1597         {
1598             header.gx_glyph_header_map_offset = (header.gx_glyph_header_map_offset + 3) & (~0x03UL);
1599         }
1600 
1601         if (map_size)
1602         {
1603             header.gx_glyph_header_data_size = map_size & 0x7fff;
1604             if (map_data_pos & 0x03)
1605             {
1606                 header.gx_glyph_header_data_size += (4 - (map_data_pos & 0x03));
1607             }
1608         }
1609         else
1610         {
1611             header.gx_glyph_header_data_size = GetGlyphDataSize(map_data_pos, font, glyph_index);
1612         }
1613 
1614         if (font->gx_font_format & GX_FONT_FORMAT_KERNING)
1615         {
1616             header.gx_glyph_header_kerning_table_size = GetGlyphKerningTableSize(font, glyph_index);
1617             WriteKerningGlyphHeader(&header);
1618         }
1619         else
1620         {
1621             // Write glyph header
1622             WriteGlyphHeader((GX_GLYPH_HEADER *)&header);
1623         }
1624 
1625         // Write Glyph Data
1626         if (data)
1627         {
1628             int padding = 0;
1629 
1630             if ((project_lib_version() >= GX_VERSION_BINRES_FONT_ALIGNMENT_FIX) &&
1631                 (m_written_size & 0x03))
1632             {
1633                 padding = 4 - (m_written_size & 0x03);
1634                 WriteDataOut(filling_string, padding);
1635             }
1636 
1637             WriteDataOut(data, header.gx_glyph_header_data_size - padding);
1638         }
1639 
1640         if (rotated_data)
1641         {
1642             delete rotated_data;
1643         }
1644 
1645         if (font -> gx_font_format & GX_FONT_FORMAT_KERNING)
1646         {
1647             if (header.gx_glyph_header_kerning_table_size)
1648             {
1649                 WriteDataOut(((GX_KERNING_GLYPH *)glyph)->gx_kerning_table, header.gx_glyph_header_kerning_table_size);
1650             }
1651         }
1652     }
1653 }
1654 
1655 ///////////////////////////////////////////////////////////////////////////////
WriteBigEndianUintData(GX_PIXELMAP * map)1656 VOID binary_resource_gen::WriteBigEndianUintData(GX_PIXELMAP *map)
1657 {
1658     UINT *swap_data = new UINT[map->gx_pixelmap_data_size / 4];
1659     UINT *data_p = (UINT *)map->gx_pixelmap_data;
1660     UINT val;
1661 
1662     for (UINT i = 0; i < map->gx_pixelmap_data_size / 4; i++)
1663     {
1664         val = SwapUint(*data_p);
1665         swap_data[i] = val;
1666         data_p++;
1667     }
1668 
1669     WriteDataOut(swap_data, map->gx_pixelmap_data_size);
1670 
1671     delete swap_data;
1672 }
1673 
1674 ///////////////////////////////////////////////////////////////////////////////
WriteBigEndianUshortData(GX_PIXELMAP * map)1675 VOID binary_resource_gen::WriteBigEndianUshortData(GX_PIXELMAP *map)
1676 {
1677     USHORT *swap_data = new USHORT[map->gx_pixelmap_data_size / 2];
1678     USHORT *data_p = (USHORT *)map->gx_pixelmap_data;
1679     USHORT val;
1680 
1681     for (UINT i = 0; i < map->gx_pixelmap_data_size / 2; i++)
1682     {
1683         val = SwapUshort(*data_p);
1684         swap_data[i] = val;
1685         data_p++;
1686     }
1687 
1688     WriteDataOut(swap_data, map->gx_pixelmap_data_size);
1689 
1690     delete swap_data;
1691 }
1692 
1693 ///////////////////////////////////////////////////////////////////////////////
WriteBigEndianCompressedUshortData(GX_PIXELMAP * map)1694 VOID binary_resource_gen::WriteBigEndianCompressedUshortData(GX_PIXELMAP *map)
1695 {
1696     USHORT *swap_data = new USHORT[map->gx_pixelmap_data_size / 2];
1697     USHORT *data_p = (USHORT *)map->gx_pixelmap_data;
1698     USHORT val;
1699 
1700     for (UINT i = 0; i < map->gx_pixelmap_data_size / 2; i++)
1701     {
1702         swap_data[i++] = *data_p;
1703         data_p++;
1704 
1705         val = SwapUshort(*data_p);
1706         swap_data[i] = val;
1707         data_p++;
1708     }
1709 
1710     WriteDataOut(swap_data, map->gx_pixelmap_data_size);
1711 
1712     delete swap_data;
1713 }
1714 
1715 ///////////////////////////////////////////////////////////////////////////////
WriteOneSRecord()1716 VOID binary_resource_gen::WriteOneSRecord()
1717 {
1718     INT srec_type;
1719     if (m_srec_address <= 0xffff)
1720     {
1721         srec_type = SREC_TYPE_S1;
1722     }
1723     else if (m_srec_address <= 0xffffff)
1724     {
1725         srec_type = SREC_TYPE_S2;
1726     }
1727     else
1728     {
1729         srec_type = SREC_TYPE_S3;
1730     }
1731 
1732     WriteOneSRecord(srec_type);
1733 }
1734 
1735 ///////////////////////////////////////////////////////////////////////////////
WriteOneSRecord(INT type)1736 VOID binary_resource_gen::WriteOneSRecord(INT type)
1737 {
1738     ULONG crc = 0;
1739     char buffer[80];
1740     int  write_size = 0;
1741     int  count = m_srec_data_size;
1742 
1743     buffer[0] = 'S';
1744     switch (type)
1745     {
1746     case SREC_TYPE_S0:
1747         count += 3;
1748         crc += count;
1749         buffer[1] = '0';
1750         sprintf_s(buffer + 2, sizeof(buffer) - 2, "%02X", count);
1751         sprintf_s(buffer + 4, sizeof(buffer) - 4, "%04X", 0);
1752         write_size = 8;
1753         break;
1754 
1755     case SREC_TYPE_S1:
1756         count += 3;
1757         crc += count;
1758         crc += m_srec_address & 0xff;
1759         crc += m_srec_address >> 8;
1760         buffer[1] = '1';
1761         sprintf_s(buffer + 2, sizeof(buffer) - 2, "%02X", count);
1762         sprintf_s(buffer + 4, sizeof(buffer) - 4, "%04X", m_srec_address);
1763         write_size = 8;
1764         break;
1765 
1766     case SREC_TYPE_S2:
1767         count += 4;
1768         crc += count;
1769         crc += m_srec_address & 0xff;
1770         crc += (m_srec_address >> 8) & 0xff;
1771         crc += m_srec_address >> 16;
1772         buffer[1] = '2';
1773         sprintf_s(buffer + 2, sizeof(buffer) - 2,  "%02X", count);
1774         sprintf_s(buffer + 4, sizeof(buffer) - 4, "%06X", m_srec_address);
1775         write_size = 10;
1776         break;
1777 
1778     case SREC_TYPE_S3:
1779         count += 5;
1780         crc += count;
1781         crc += m_srec_address & 0xff;
1782         crc += (m_srec_address >> 8) & 0xff;
1783         crc += (m_srec_address >> 16) & 0xff;
1784         crc += m_srec_address >> 24;
1785         buffer[1] = '3';
1786         sprintf_s(buffer + 2, sizeof(buffer) - 2, "%02X", count);
1787         sprintf_s(buffer + 4, sizeof(buffer) - 4, "%08X", m_srec_address);
1788         write_size = 12;
1789         break;
1790 
1791     case SREC_TYPE_S5:
1792         count += 3;
1793         crc += count;
1794         crc += m_srec_record_count & 0xff;
1795         crc += m_srec_record_count >> 8;
1796         buffer[1] = '5';
1797         sprintf_s(buffer + 2, sizeof(buffer) - 2, "%02X", count);
1798         sprintf_s(buffer + 4, sizeof(buffer) - 4, "%04X", m_srec_record_count);
1799         write_size = 8;
1800         break;
1801 
1802     case SREC_TYPE_S6:
1803         count += 4;
1804         crc += count;
1805         crc += m_srec_record_count & 0xff;
1806         crc += (m_srec_record_count >> 8) & 0xff;
1807         crc += m_srec_record_count >> 16;
1808         buffer[1] = '6';
1809         sprintf_s(buffer + 2, sizeof(buffer) - 2, "%02X", count);
1810         sprintf_s(buffer + 4, sizeof(buffer) - 4, "%06X", m_srec_record_count);
1811         write_size = 10;
1812         break;
1813     }
1814 
1815     for (int index = 0; index < m_srec_data_size; index++)
1816     {
1817         crc += m_srec_data[index];
1818 
1819         if (write_size < sizeof(buffer))
1820         {
1821             sprintf_s(buffer + write_size, sizeof(buffer) - write_size, "%02X", m_srec_data[index]);
1822             write_size += 2;
1823         }
1824     }
1825 
1826     crc &= 0xff;
1827     crc = (~(UCHAR)crc) & 0xff;
1828 
1829     if (write_size < sizeof(buffer))
1830     {
1831         sprintf_s(buffer + write_size, sizeof(buffer) - write_size, "%02X", crc);
1832         write_size += 2;
1833     }
1834 
1835     if (write_size + 1 < sizeof(buffer))
1836     {
1837         buffer[write_size++] = '\r';
1838         buffer[write_size++] = '\n';
1839     }
1840 
1841     FileWrite(buffer, write_size);//write srecord
1842 
1843     if (type != SREC_TYPE_S0)
1844     {
1845         m_srec_address += m_srec_data_size;
1846         m_srec_record_count++;
1847     }
1848     m_srec_data_size = 0;
1849 }
1850 
1851 ///////////////////////////////////////////////////////////////////////////////
WriteSRecordData(const void * data_ptr,INT data_size)1852 VOID binary_resource_gen::WriteSRecordData(const void *data_ptr, INT data_size)
1853 {
1854     INT remain_size;
1855     INT written_size;
1856 
1857     if (data_size + m_srec_data_size < SREC_MAX_DATA_SIZE)
1858     {
1859         memcpy_s(m_srec_data + m_srec_data_size, SREC_MAX_DATA_SIZE - m_srec_data_size, data_ptr, data_size);
1860         m_srec_data_size += data_size;
1861     }
1862     else
1863     {
1864         written_size = 0;
1865 
1866         while (written_size != data_size)
1867         {
1868             if (m_srec_data_size == SREC_MAX_DATA_SIZE)
1869             {
1870                 WriteOneSRecord();
1871             }
1872 
1873             remain_size = SREC_MAX_DATA_SIZE - m_srec_data_size;
1874 
1875             if (data_size - written_size <= remain_size)
1876             {
1877                 memcpy_s(m_srec_data + m_srec_data_size, remain_size, (char *)data_ptr + written_size, data_size - written_size);
1878                 m_srec_data_size += data_size - written_size;
1879                 written_size = data_size;
1880             }
1881             else
1882             {
1883                 memcpy_s(m_srec_data + m_srec_data_size, remain_size, (char *)data_ptr + written_size, remain_size);
1884                 written_size += remain_size;
1885                 m_srec_data_size += remain_size;
1886             }
1887         }
1888     }
1889 }
1890 
1891 ///////////////////////////////////////////////////////////////////////////////
WriteSRecordHeader()1892 VOID binary_resource_gen::WriteSRecordHeader()
1893 {
1894     INT type = SREC_TYPE_S0;
1895     const char header[] = "guix_resource_data";
1896 
1897     m_srec_data_size = strlen(header);
1898     memcpy_s(m_srec_data, sizeof(m_srec_data), header, m_srec_data_size);
1899 
1900     WriteOneSRecord(type);
1901 }
1902 
1903 ///////////////////////////////////////////////////////////////////////////////
WriteSRecordEnd()1904 VOID binary_resource_gen::WriteSRecordEnd()
1905 {
1906     INT type;
1907 
1908     if (m_srec_record_count < 0xffff)
1909     {
1910         type = SREC_TYPE_S5;
1911     }
1912     else
1913     {
1914         return;
1915     }
1916 
1917     WriteOneSRecord(type);
1918 }
1919 
1920 ///////////////////////////////////////////////////////////////////////////////
WriteDataOut(const void * lpBuf,UINT nCount)1921 VOID binary_resource_gen::WriteDataOut(const void *lpBuf, UINT nCount)
1922 {
1923     switch (m_file_format)
1924 
1925     {
1926     case BINARY_FILE_FORMAT_BIN:
1927     case BINARY_FILE_FORMAT_BIN_STANDALONE:
1928         FileWrite(lpBuf, nCount);
1929         break;
1930 
1931     case BINARY_FILE_FORMAT_SREC:
1932         WriteSRecordData(lpBuf, nCount);
1933         break;
1934     }
1935 
1936     m_written_size += nCount;
1937 }
1938 
1939 ///////////////////////////////////////////////////////////////////////////////
WritePixelmapBlock(res_info * info,USHORT map_id,USHORT output_map_id,USHORT theme_id,int frame_id)1940 void binary_resource_gen::WritePixelmapBlock(res_info *info, USHORT map_id, USHORT output_map_id, USHORT theme_id, int frame_id)
1941 {
1942     GX_PIXELMAP *map = info->GetPixelmap(frame_id);
1943 
1944     if (!map)
1945     {
1946         return;
1947     }
1948 
1949     GX_PIXELMAP_HEADER header;
1950     int refer_theme = -1;
1951 
1952     if (m_file_format == BINARY_FILE_FORMAT_BIN_STANDALONE)
1953     {
1954         CString filename = RemoveFileExtension(m_outfile->GetFileName());
1955         filename.MakeUpper();
1956 
1957         file_info* finfo = FindFileInfo(&m_file_dictionary, filename);
1958         if (!finfo)
1959         {
1960             finfo = m_file_dictionary.GetAt(0);
1961         }
1962 
1963         output_map_id = finfo->write_res_index++;
1964     }
1965 
1966     memset(&header, 0, sizeof(GX_PIXELMAP_HEADER));
1967 
1968     header.gx_pixelmap_header_magic_number = GX_MAGIC_NUMBER;
1969     header.gx_pixelmap_header_index = output_map_id;
1970     header.gx_pixelmap_header_version_major = map->gx_pixelmap_version_major;
1971     header.gx_pixelmap_header_version_minor = map->gx_pixelmap_version_minor;
1972     header.gx_pixelmap_header_flags = map->gx_pixelmap_flags;
1973     header.gx_pixelmap_header_format = map->gx_pixelmap_format;
1974     header.gx_pixelmap_header_transparent_color = map->gx_pixelmap_transparent_color;
1975     header.gx_pixelmap_header_width = map->gx_pixelmap_width;
1976     header.gx_pixelmap_header_height = map->gx_pixelmap_height;
1977 
1978     if (project_lib_version() >= GX_VERSION_DUPLICATE_BINRES_DATA_FIX && map_id)
1979     {
1980         refer_theme = FindResourceReferenceTheme(info, theme_id);
1981 
1982         if (refer_theme >= 0)
1983         {
1984             header.gx_pixelmap_header_data_offset = GetPixelmapDataOffset(map_id, frame_id, refer_theme);
1985 
1986             // write pixelmap header
1987             WritePixelmapHeader(&header);
1988 
1989             return;
1990         }
1991     }
1992 
1993     int data_output_pos = m_written_size + GetPixelmapHeaderSize();
1994     int padding = 0;
1995 
1996     if (project_lib_version() >= GX_VERSION_BINRES_DATA_ALIGNMENT_FIX)
1997     {
1998         if (data_output_pos & 0x03)
1999         {
2000             // 32bit alignment
2001             padding = 4 - (data_output_pos & 0x03);
2002         }
2003     }
2004     else
2005     {
2006         switch (map->gx_pixelmap_format)
2007         {
2008         case GX_COLOR_FORMAT_24XRGB:
2009         case GX_COLOR_FORMAT_24BGRX:
2010         case GX_COLOR_FORMAT_32ARGB:
2011         case GX_COLOR_FORMAT_32RGBA:
2012         case GX_COLOR_FORMAT_32ABGR:
2013         case GX_COLOR_FORMAT_32BGRA:
2014             if (data_output_pos & 0x03)
2015             {
2016                 // 32bit alignment
2017                 padding = (data_output_pos & 0x03);
2018             }
2019             break;
2020         case GX_COLOR_FORMAT_565RGB:
2021         case GX_COLOR_FORMAT_565BGR:
2022         case GX_COLOR_FORMAT_4444ARGB:
2023         case GX_COLOR_FORMAT_4444BGRA:
2024         case GX_COLOR_FORMAT_5551BGRX:
2025         case GX_COLOR_FORMAT_1555XRGB:
2026             if (data_output_pos & 0x01)
2027             {
2028                 // 16bit alignment
2029                 padding = (data_output_pos & 0x01);
2030             }
2031             break;
2032 
2033         default:
2034             // Do nothing
2035             break;
2036         }
2037     }
2038 
2039     if (info->raw)
2040     {
2041         //write raw image
2042         CString path;
2043         UCHAR buffer[1024];
2044         long file_size;
2045         long total_bytes_written;
2046         int chunk_size;
2047 
2048         path = MakeAbsolutePathname(info->pathinfo);
2049         FILE *file = _tfopen(path.GetBuffer(), _T("rb"));
2050 
2051         if (!file)
2052         {
2053             return;
2054         }
2055 
2056         fseek(file, 0, SEEK_END);
2057         file_size = ftell(file);
2058 
2059         header.gx_pixelmap_header_flags |= GX_PIXELMAP_RAW_FORMAT;
2060         header.gx_pixelmap_header_map_size = file_size;
2061         header.gx_pixelmap_header_aux_data_size = 0;
2062         header.gx_pixelmap_header_data_size = file_size;
2063 
2064         // write pixelmap header
2065         WritePixelmapHeader(&header);
2066 
2067         // Padding for alignment
2068         if (padding)
2069         {
2070             WriteDataOut(filling_string, padding);
2071         }
2072 
2073         fseek(file, 0, SEEK_SET);
2074 
2075         total_bytes_written = 0;
2076 
2077         while (total_bytes_written < file_size)
2078         {
2079             chunk_size = fread(buffer, 1, 1024, file);
2080 
2081             WriteDataOut(buffer, chunk_size);
2082             total_bytes_written += chunk_size;
2083         }
2084 
2085         fclose(file);
2086     }
2087     else
2088     {
2089         GX_PIXELMAP* rotated_map = GX_NULL;
2090 
2091         if (IsRotatedResourceSupported(m_project, m_display))
2092         {
2093             rotated_map = m_rotated_pixelmaps[theme_id].GetAt(output_map_id - 1);
2094 
2095             if (!rotated_map)
2096             {
2097                 rotated_map = RotatePixelmap(info, theme_id, map, frame_id);
2098                 m_rotated_pixelmaps[theme_id].SetAt(output_map_id - 1, rotated_map);
2099             }
2100             map = rotated_map;
2101         }
2102 
2103         header.gx_pixelmap_header_flags = map->gx_pixelmap_flags;
2104         header.gx_pixelmap_header_map_size = map->gx_pixelmap_data_size;
2105         header.gx_pixelmap_header_aux_data_size = map->gx_pixelmap_aux_data_size;
2106         header.gx_pixelmap_header_data_size = map->gx_pixelmap_data_size + map->gx_pixelmap_aux_data_size;
2107 
2108         // write pixelmap header
2109         WritePixelmapHeader(&header);
2110 
2111         // write image as guix format
2112         if (map->gx_pixelmap_data)
2113         {
2114             // Padding for alignment
2115             if (padding)
2116             {
2117                 WriteDataOut(filling_string, padding);
2118             }
2119 
2120             // Write pixelmap data
2121             if (m_big_endian)
2122             {
2123                 switch (map->gx_pixelmap_format)
2124                 {
2125                 case GX_COLOR_FORMAT_24XRGB:
2126                 case GX_COLOR_FORMAT_24BGRX:
2127                 case GX_COLOR_FORMAT_32ARGB:
2128                 case GX_COLOR_FORMAT_32RGBA:
2129                 case GX_COLOR_FORMAT_32ABGR:
2130                 case GX_COLOR_FORMAT_32BGRA:
2131                     WriteBigEndianUintData(map);
2132                     break;
2133                 case GX_COLOR_FORMAT_565RGB:
2134                 case GX_COLOR_FORMAT_565BGR:
2135                 case GX_COLOR_FORMAT_4444ARGB:
2136                 case GX_COLOR_FORMAT_4444BGRA:
2137                 case GX_COLOR_FORMAT_5551BGRX:
2138                 case GX_COLOR_FORMAT_1555XRGB:
2139                     if (m_big_endian &&
2140                         (map->gx_pixelmap_flags & GX_PIXELMAP_COMPRESSED) &&
2141                         (map->gx_pixelmap_flags & GX_PIXELMAP_ALPHA))
2142                     {
2143                         WriteBigEndianCompressedUshortData(map);
2144                     }
2145                     else
2146                     {
2147                         WriteBigEndianUshortData(map);
2148                     }
2149                     break;
2150 
2151                 case GX_COLOR_FORMAT_8BIT_PACKED_PIXEL:
2152                     if ((map->gx_pixelmap_flags & GX_PIXELMAP_COMPRESSED) &&
2153                         (map->gx_pixelmap_flags & GX_PIXELMAP_ALPHA))
2154                     {
2155                         WriteBigEndianUshortData(map);
2156                     }
2157                     else
2158                     {
2159                         WriteDataOut(map->gx_pixelmap_data, map->gx_pixelmap_data_size);
2160                     }
2161                     break;
2162                 default:
2163                     WriteDataOut(map->gx_pixelmap_data, map->gx_pixelmap_data_size);
2164                     break;
2165                 }
2166             }
2167             else
2168             {
2169                 WriteDataOut(map->gx_pixelmap_data, map->gx_pixelmap_data_size);
2170             }
2171         }
2172 
2173         if (map->gx_pixelmap_aux_data)
2174         {
2175             WriteDataOut(map->gx_pixelmap_aux_data, map->gx_pixelmap_aux_data_size);
2176         }
2177     }
2178 }
2179 
2180 ///////////////////////////////////////////////////////////////////////////////
WriteStringBlock()2181 void binary_resource_gen::WriteStringBlock()
2182 {
2183     string_table *pTable = m_project->mDisplays[m_display].stable;
2184 
2185     GX_STRING_HEADER header;
2186     header.gx_string_header_magic_number = GX_MAGIC_NUMBER;
2187     header.gx_string_header_language_count = GetEnabledLanguageCount();
2188     header.gx_string_header_string_count = pTable->CountGeneratedStrings();
2189     header.gx_string_header_data_size = GetStringDataSize();
2190 
2191     // Write string header
2192     WriteStringHeader(&header);
2193 
2194     BOOL enabled;
2195     CCommandInfo *pCmd = GetCmdInfo();
2196 
2197     // write string data
2198     for (int language_id = 0; language_id < m_project->mHeader.num_languages; language_id++)
2199     {
2200         if (pCmd->IsNoGui())
2201         {
2202             enabled = pCmd->IsLanguageEnabled(m_project->mHeader.languages[language_id].name);
2203         }
2204         else
2205         {
2206             enabled = m_project->mDisplays[m_display].gen_string_table[language_id];
2207         }
2208 
2209         if (enabled)
2210         {
2211             WriteStringData(language_id);
2212         }
2213     }
2214 }
2215 
2216 ///////////////////////////////////////////////////////////////////////////////
WriteStringData(USHORT language_id)2217 void binary_resource_gen::WriteStringData(USHORT language_id)
2218 {
2219     string_table *pTable = m_project->mDisplays[m_display].stable;
2220     int num_strings = pTable->CountStrings();
2221     CString val;
2222     char end_of_string[] = "";
2223 
2224     GX_LANGUAGE_HEADER header;
2225     header.gx_language_header_magic_number = GX_MAGIC_NUMBER;
2226     header.gx_language_header_index = language_id;
2227     memset(header.gx_language_header_name, 0, GX_LANGUAGE_HEADER_NAME_SIZE);
2228     strcpy_s((char *)header.gx_language_header_name, GX_LANGUAGE_HEADER_NAME_SIZE,  CT2A(m_project->mHeader.languages[language_id].name));
2229     header.gx_language_header_data_size = GetStringDataSize(language_id);
2230 
2231     // Write language header
2232     WriteLanguageHeader(&header);
2233 
2234     CString id_name;
2235     GX_STRING utf8str;
2236     CArray<widget_info*> *info_list;
2237     widget_info* info;
2238     int reference_count;
2239 
2240     // Write strings
2241     for (int string_id = 1; string_id < num_strings; string_id++)
2242     {
2243         id_name = pTable->GetResourceIdName(string_id);
2244         val = pTable->GetString(id_name, language_id);
2245 
2246         if (val.IsEmpty())
2247         {
2248             utf8str.gx_string_ptr = end_of_string;
2249             utf8str.gx_string_length = 0;
2250             WriteOneStringData(&utf8str);
2251         }
2252         else
2253         {
2254 
2255             info_list = pTable->GetMLViewReferenceWidgetInfoList(id_name);
2256 
2257             if (info_list)
2258             {
2259                 reference_count = info_list->GetCount();
2260             }
2261             else
2262             {
2263                 reference_count = 1;
2264             }
2265 
2266             info = NULL;
2267 
2268             for (int index = 0; index < reference_count; index++)
2269             {
2270                 if (info_list)
2271                 {
2272                     info = info_list->GetAt(index);
2273                 }
2274 
2275                 MakeUtf8String(m_project, val, language_id, &utf8str, m_display, TRUE, info);
2276                 WriteOneStringData(&utf8str);
2277                 delete[] utf8str.gx_string_ptr;
2278                 utf8str.gx_string_length = 0;
2279             }
2280         }
2281     }
2282 }
2283 
2284 ///////////////////////////////////////////////////////////////////////////////
WriteOneStringData(GX_STRING * string)2285 void binary_resource_gen::WriteOneStringData(GX_STRING *string)
2286 {
2287     USHORT  write_ushort;
2288 
2289     if (project_lib_version() >= GX_VERSION_STRING_LENGTH_FIX)
2290     {
2291         // Write out string length
2292         write_ushort = string->gx_string_length;
2293         write_ushort = SwapUshort(write_ushort);
2294         WriteDataOut(&write_ushort, sizeof(USHORT));
2295     }
2296 
2297     // Write out string
2298     WriteDataOut(string->gx_string_ptr, string->gx_string_length + 1);
2299 }
2300 
2301 ///////////////////////////////////////////////////////////////////////////////
GetEnabledThemeCount()2302 USHORT binary_resource_gen::GetEnabledThemeCount()
2303 {
2304     if (!m_project)
2305     {
2306         return 0;
2307     }
2308 
2309     USHORT count = 0;
2310     BOOL enabled;
2311     CString theme_name;
2312 
2313     CCommandInfo *pCmd = GetCmdInfo();
2314 
2315     for (int theme = 0; theme < m_project->mDisplays[m_display].num_themes; theme++)
2316     {
2317         if (pCmd->IsNoGui())
2318         {
2319             theme_name = m_project->mDisplays[m_display].themes[theme].theme_name;
2320             enabled = pCmd->IsThemeEnabled(theme_name);
2321         }
2322         else
2323         {
2324             enabled = m_project->mDisplays[m_display].themes[theme].enabled;
2325         }
2326 
2327         if (enabled)
2328         {
2329             count++;
2330         }
2331     }
2332 
2333     return count;
2334 }
2335 
2336 ///////////////////////////////////////////////////////////////////////////////
GetEnabledLanguageCount()2337 USHORT binary_resource_gen::GetEnabledLanguageCount()
2338 {
2339     if (!m_project)
2340     {
2341         return 0;
2342     }
2343 
2344     USHORT count = 0;
2345     BOOL enabled;
2346     CCommandInfo *pCmd = GetCmdInfo();
2347     CString lang_name;
2348 
2349     for (int language = 0; language < m_project->mHeader.num_languages; language++)
2350     {
2351         if (pCmd->IsNoGui())
2352         {
2353             lang_name = m_project->mHeader.languages[language].name;
2354             enabled = pCmd->IsLanguageEnabled(lang_name);
2355         }
2356         else
2357         {
2358             enabled = m_project->mDisplays[m_display].gen_string_table[language];
2359         }
2360 
2361         if (enabled)
2362         {
2363             count++;
2364         }
2365     }
2366 
2367     return count;
2368 }
2369 
2370 ///////////////////////////////////////////////////////////////////////////////
GetColorCount(USHORT theme_id)2371 USHORT binary_resource_gen::GetColorCount(USHORT theme_id)
2372 {
2373     int color_count = 0;
2374 
2375     CCommandInfo *pCmd = GetCmdInfo();
2376 
2377     if (pCmd->IsNoGui() || m_project->mDisplays[m_display].themes[theme_id].gen_color_table)
2378     {
2379         color_count = m_project->CountResources(m_display, RES_TYPE_COLOR);
2380     }
2381 
2382     return color_count;
2383 }
2384 
2385 ///////////////////////////////////////////////////////////////////////////////
GetFontCount(USHORT theme_id)2386 USHORT binary_resource_gen::GetFontCount(USHORT theme_id)
2387 {
2388     int font_count = 0;
2389 
2390     CCommandInfo *pCmd = GetCmdInfo();
2391 
2392     if (pCmd->IsNoGui() || m_project->mDisplays[m_display].themes[theme_id].gen_font_table)
2393     {
2394         font_count = m_project->CountResources(m_display, RES_TYPE_FONT);
2395     }
2396     return font_count;
2397 }
2398 
2399 ///////////////////////////////////////////////////////////////////////////////
GetPageCount(res_info * info,USHORT theme_id,USHORT font_id)2400 USHORT binary_resource_gen::GetPageCount(res_info *info, USHORT theme_id, USHORT font_id)
2401 {
2402     const GX_FONT *font_page;
2403     GX_FONT *head_page;
2404     int page_index;
2405 
2406     if (info->is_default && info->pathinfo.pathname.IsEmpty() &&
2407         !IsRotatedResourceSupported(m_project, m_display))
2408     {
2409         return 0;
2410     }
2411 
2412     head_page = GetPageHead(info, theme_id, font_id);
2413 
2414     //write font data
2415     font_page = head_page;
2416     page_index = 0;
2417     while (font_page)
2418     {
2419         page_index++;
2420         font_page = font_page->gx_font_next_page;
2421     }
2422 
2423     return page_index;
2424 }
2425 
2426 ///////////////////////////////////////////////////////////////////////////////
GetPixelmapCount(USHORT theme_id)2427 USHORT binary_resource_gen::GetPixelmapCount(USHORT theme_id)
2428 {
2429     int pixlemap_count = 0;
2430 
2431     CCommandInfo *pCmd = GetCmdInfo();
2432 
2433     if (pCmd->IsNoGui() || m_project->mDisplays[m_display].themes[theme_id].gen_pixelmap_table)
2434     {
2435         INT pixelmap_id;
2436 
2437         for (pixelmap_id = 1; pixelmap_id < m_pixelmap_dictionary.GetCount(); pixelmap_id++)
2438         {
2439             res_info *info = m_project->FindResource(m_display, theme_id, RES_TYPE_PIXELMAP, m_pixelmap_dictionary.GetAt(pixelmap_id));
2440 
2441             if (info)
2442             {
2443                 if ((info->enabled) || (IsSystemPixelmap(pixelmap_id)))
2444                 {
2445                     pixlemap_count += info->GetPixelmapFrameCount();
2446                 }
2447             }
2448         }
2449     }
2450 
2451     return pixlemap_count;
2452 }
2453 
2454 ///////////////////////////////////////////////////////////////////////////////
GetFontHeaderSize()2455 INT  binary_resource_gen::GetFontHeaderSize()
2456 {
2457     if (project_lib_version() >= GX_VERSION_DUPLICATE_BINRES_DATA_FIX)
2458     {
2459         // new member "data_offset" is added
2460         return GX_FONT_HEADER_SIZE;
2461     }
2462     else
2463     {
2464         return GX_FONT_HEADER_SIZE - sizeof(ULONG);
2465     }
2466 }
2467 
2468 ///////////////////////////////////////////////////////////////////////////////
GetGlyphHeaderSize()2469 INT  binary_resource_gen::GetGlyphHeaderSize()
2470 {
2471     if (project_lib_version() >= GX_VERSION_BINRES_FONT_ALIGNMENT_FIX)
2472     {
2473         return GX_GLYPH_HEADER_SIZE;
2474     }
2475     else
2476     {
2477         return GX_GLYPH_HEADER_SIZE - sizeof(ULONG);
2478     }
2479 }
2480 
2481 ///////////////////////////////////////////////////////////////////////////////
GetKerningGlyphHeaderSize()2482 INT  binary_resource_gen::GetKerningGlyphHeaderSize()
2483 {
2484     if (project_lib_version() >= GX_VERSION_BINRES_FONT_ALIGNMENT_FIX)
2485     {
2486         return GX_KERNING_GLYPH_HEADER_SIZE;
2487     }
2488     else
2489     {
2490         return GX_KERNING_GLYPH_HEADER_SIZE - sizeof(ULONG);
2491     }
2492 }
2493 
2494 ///////////////////////////////////////////////////////////////////////////////
GetPixelmapHeaderSize()2495 INT  binary_resource_gen::GetPixelmapHeaderSize()
2496 {
2497     if (project_lib_version() >= GX_VERSION_DUPLICATE_BINRES_DATA_FIX)
2498     {
2499         // new member "data_offset" is added
2500         return GX_PIXELMAP_HEADER_SIZE;
2501     }
2502     else
2503     {
2504         return GX_PIXELMAP_HEADER_SIZE - sizeof(ULONG);
2505     }
2506 }
2507 
2508 ///////////////////////////////////////////////////////////////////////////////
GetThemeDataSize(SHORT theme_count)2509 ULONG binary_resource_gen::GetThemeDataSize(SHORT theme_count)
2510 {
2511     ULONG size = 0;
2512     ULONG data_size = 0;
2513     ULONG written_size = GetResourceHeaderSize();
2514 
2515     CCommandInfo *pCmd = GetCmdInfo();
2516     BOOL enabled;
2517 
2518     if (theme_count < 0)
2519     {
2520         theme_count = m_project->mDisplays[m_display].num_themes;
2521     }
2522 
2523     for (int theme = 0; theme < theme_count; theme++)
2524     {
2525         if (pCmd->IsNoGui())
2526         {
2527             enabled = pCmd->IsThemeEnabled(m_project->mDisplays[m_display].themes[theme].theme_name);
2528         }
2529         else
2530         {
2531             enabled = m_project->mDisplays[m_display].themes[theme].enabled;
2532         }
2533 
2534         if (enabled)
2535         {
2536             size = GetThemeHeaderSize();
2537             written_size += size;
2538             data_size += size;
2539 
2540             size = GetThemeDataSize(written_size, theme);
2541             written_size += size;
2542             data_size += size;
2543         }
2544     }
2545 
2546     return data_size;
2547 }
2548 
2549 ///////////////////////////////////////////////////////////////////////////////
GetThemeDataSize(ULONG written_size,USHORT theme_id)2550 ULONG binary_resource_gen::GetThemeDataSize(ULONG written_size, USHORT theme_id)
2551 {
2552     int theme_data_size = 0;
2553     int data_size;
2554 
2555     //Calcualte color data size
2556     theme_data_size += GetColorBlockSize(theme_id);
2557 
2558     //Calcualte palette table size
2559     theme_data_size += GetPaletteBlockSize(theme_id);
2560 
2561     written_size += theme_data_size;
2562 
2563     //Calculate font data size
2564     data_size = GetFontBlockSize(written_size, theme_id, -1);
2565     written_size += data_size;
2566     theme_data_size += data_size;
2567 
2568     //Calculate pixelmap data size
2569     theme_data_size += GetPixelmapBlockSize(written_size, theme_id, -1, -1);
2570 
2571     return theme_data_size;
2572 }
2573 
2574 ///////////////////////////////////////////////////////////////////////////////
GetPaletteBlockSize(USHORT theme_id)2575 ULONG binary_resource_gen::GetPaletteBlockSize(USHORT theme_id)
2576 {
2577     ULONG data_size = 0;
2578 
2579     if (m_project->mDisplays[m_display].themes[theme_id].palette)
2580     {
2581         INT color_count = m_project->mDisplays[m_display].themes[theme_id].palette_total_size;
2582 
2583         if (color_count)
2584         {
2585             data_size += GetPaletteHeaderSize();
2586             data_size += color_count * sizeof(GX_COLOR);
2587         }
2588     }
2589 
2590     return data_size;
2591 }
2592 
2593 ///////////////////////////////////////////////////////////////////////////////
GetColorBlockSize(USHORT theme_id)2594 ULONG binary_resource_gen::GetColorBlockSize(USHORT theme_id)
2595 {
2596     ULONG data_size = 0;
2597 
2598     CCommandInfo *pCmd = GetCmdInfo();
2599 
2600     if (pCmd->IsNoGui() || m_project->mDisplays[m_display].themes[theme_id].gen_color_table)
2601     {
2602         INT color_count = GetColorCount(theme_id);
2603 
2604         if (color_count)
2605         {
2606             data_size += GetColorHeaderSize();
2607             data_size += color_count * sizeof(GX_COLOR);
2608         }
2609     }
2610 
2611     return data_size;
2612 }
2613 
2614 ///////////////////////////////////////////////////////////////////////////////
GetFontBlockSize(ULONG written_size,USHORT theme_id,SHORT font_count)2615 ULONG binary_resource_gen::GetFontBlockSize(ULONG written_size, USHORT theme_id, SHORT font_count)
2616 {
2617     ULONG data_size = 0;
2618     ULONG size;
2619     int reference_theme = -1;
2620 
2621     CCommandInfo *pCmd = GetCmdInfo();
2622 
2623     if (font_count < 0)
2624     {
2625         font_count = m_project->CountResources(m_display, RES_TYPE_FONT);
2626     }
2627 
2628     if (pCmd->IsNoGui() || m_project->mDisplays[m_display].themes[theme_id].gen_font_table)
2629     {
2630         int font_id = 0;
2631 
2632         for (font_id = 0; font_id < font_count; font_id++)
2633         {
2634             res_info *info = m_project->FindResource(m_display, theme_id, RES_TYPE_FONT, font_id);
2635 
2636             if (info)
2637             {
2638                 if (project_lib_version() >= GX_VERSION_DUPLICATE_BINRES_DATA_FIX)
2639                 {
2640                     reference_theme = FindResourceReferenceTheme(info, theme_id);
2641                 }
2642 
2643                 data_size += GetFontHeaderSize();
2644                 written_size += GetFontHeaderSize();
2645 
2646                 /* This font is duplicate with the font in "reference_theme",
2647                     don't need to generate the same font data. */
2648                 if (reference_theme < 0)
2649                 {
2650                     size = GetFontDataSize(written_size, info, theme_id, font_id);
2651                     data_size += size;
2652                     written_size += size;
2653                 }
2654             }
2655         }
2656     }
2657 
2658     return data_size;
2659 }
2660 
2661 ///////////////////////////////////////////////////////////////////////////////
GetOnePixelmapDataSize(ULONG written_size,res_info * info,USHORT theme_id,INT frame_id,USHORT outmap_id)2662 ULONG binary_resource_gen::GetOnePixelmapDataSize(ULONG written_size, res_info *info, USHORT theme_id, INT frame_id, USHORT outmap_id)
2663 {
2664     ULONG data_size = 0;
2665     INT padding;
2666 
2667     GX_PIXELMAP *map = info->GetPixelmap(frame_id);
2668 
2669     if (project_lib_version() >= GX_VERSION_BINRES_DATA_ALIGNMENT_FIX)
2670     {
2671         if (written_size & 0x03)
2672         {
2673             padding = (4 - (written_size & 0x03));
2674             data_size += padding;
2675             written_size += padding;
2676         }
2677     }
2678     else
2679     {
2680 
2681         switch (map->gx_pixelmap_format)
2682         {
2683         case GX_COLOR_FORMAT_24XRGB:
2684         case GX_COLOR_FORMAT_24BGRX:
2685         case GX_COLOR_FORMAT_32ARGB:
2686         case GX_COLOR_FORMAT_32RGBA:
2687         case GX_COLOR_FORMAT_32ABGR:
2688         case GX_COLOR_FORMAT_32BGRA:
2689             if (written_size & 0x03)
2690             {
2691                 data_size += written_size & 0x03;
2692                 written_size += written_size & 0x03;
2693             }
2694             break;
2695         case GX_COLOR_FORMAT_565RGB:
2696         case GX_COLOR_FORMAT_565BGR:
2697         case GX_COLOR_FORMAT_4444ARGB:
2698         case GX_COLOR_FORMAT_4444BGRA:
2699         case GX_COLOR_FORMAT_5551BGRX:
2700         case GX_COLOR_FORMAT_1555XRGB:
2701             if (written_size & 0x01)
2702             {
2703                 //16bit alignment
2704                 data_size += written_size & 0x01;
2705                 written_size += written_size & 0x01;
2706             }
2707         }
2708     }
2709 
2710     if (info->raw)
2711     {
2712         CString path = MakeAbsolutePathname(info->pathinfo);
2713         FILE* file = _tfopen(path.GetBuffer(), _T("rb"));
2714 
2715         if (!file)
2716         {
2717             return 0;
2718         }
2719 
2720         fseek(file, 0, SEEK_END);
2721         data_size += ftell(file);
2722         written_size += ftell(file);
2723     }
2724     else
2725     {
2726         GX_PIXELMAP* rotated_map = GX_NULL;
2727 
2728         if (IsRotatedResourceSupported(m_project, m_display))
2729         {
2730             rotated_map = m_rotated_pixelmaps[theme_id].GetAt(outmap_id - 1);
2731 
2732             if (!rotated_map)
2733             {
2734                 rotated_map = RotatePixelmap(info, theme_id, map, frame_id);
2735                 m_rotated_pixelmaps[theme_id].SetAt(outmap_id - 1, rotated_map);
2736             }
2737 
2738             map = rotated_map;
2739         }
2740 
2741         data_size += map->gx_pixelmap_data_size;
2742         data_size += map->gx_pixelmap_aux_data_size;
2743         written_size += map->gx_pixelmap_data_size;
2744         written_size += map->gx_pixelmap_aux_data_size;
2745     }
2746 
2747     return data_size;
2748 }
2749 
2750 ///////////////////////////////////////////////////////////////////////////////
GetPixelmapBlockSize(ULONG written_size,USHORT theme_id,SHORT map_id,SHORT frame_id)2751 ULONG binary_resource_gen::GetPixelmapBlockSize(ULONG written_size, USHORT theme_id, SHORT map_id, SHORT frame_id)
2752 {
2753     ULONG data_size = 0;
2754     ULONG size;
2755     int reference_theme = -1;
2756     int frame_count;
2757     int index;
2758 
2759     CCommandInfo *pCmd = GetCmdInfo();
2760 
2761     if (map_id < 0)
2762     {
2763         map_id = m_pixelmap_dictionary.GetCount() - 1;
2764     }
2765 
2766     if (pCmd->IsNoGui() || m_project->mDisplays[m_display].themes[theme_id].gen_pixelmap_table)
2767     {
2768         int pixelmap_id;
2769         int output_pixelmap_id = 1;
2770 
2771         for (pixelmap_id = 1; pixelmap_id <= map_id; pixelmap_id++)
2772         {
2773             res_info *info = m_project->FindResource(m_display, theme_id, RES_TYPE_PIXELMAP, m_pixelmap_dictionary.GetAt(pixelmap_id));
2774 
2775             if (info && info->GetPixelmapFrameCount() && (info->enabled) && (info->parent->enabled))
2776             {
2777                 if (project_lib_version() >= GX_VERSION_DUPLICATE_BINRES_DATA_FIX)
2778                 {
2779                     reference_theme = FindResourceReferenceTheme(info, theme_id);
2780                 }
2781 
2782                 if ((pixelmap_id < map_id) || (frame_id < 0))
2783                 {
2784                     frame_count = info->GetPixelmapFrameCount();
2785                 }
2786                 else
2787                 {
2788                     frame_count = frame_id;
2789                 }
2790 
2791                 for (index = 0; index < frame_count; index++)
2792                 {
2793                     data_size += GetPixelmapHeaderSize();
2794                     written_size += GetPixelmapHeaderSize();
2795 
2796                     if (reference_theme < 0)
2797                     {
2798                         size = GetOnePixelmapDataSize(written_size, info, theme_id, index, output_pixelmap_id);
2799                         data_size += size;
2800                         written_size += size;
2801                     }
2802                     output_pixelmap_id++;
2803                 }
2804             }
2805             else if(IsSystemPixelmap(pixelmap_id))
2806             {
2807                 output_pixelmap_id++;
2808             }
2809         }
2810     }
2811 
2812     return data_size;
2813 }
2814 
2815 ///////////////////////////////////////////////////////////////////////////////
InitFontSizeStorage(int display)2816 void binary_resource_gen::InitFontSizeStorage(int display)
2817 {
2818     int font_count = m_project->CountResources(display, RES_TYPE_FONT);
2819     for (int index = 0; index < m_project->mDisplays[display].num_themes; index++)
2820     {
2821         m_font_data_size[index] = new INT[font_count];
2822         memset(m_font_data_size[index], 0, sizeof(INT) * font_count);
2823     }
2824 }
2825 
2826 ///////////////////////////////////////////////////////////////////////////////
DeleteFontSizeStorage(int display)2827 void binary_resource_gen::DeleteFontSizeStorage(int display)
2828 {
2829     for (int index = 0; index < m_project->mDisplays[display].num_themes; index++)
2830     {
2831         delete m_font_data_size[index];
2832     }
2833 }
2834 
2835 ///////////////////////////////////////////////////////////////////////////////
GetFontDataSize(ULONG written_size,res_info * info,USHORT theme_id,USHORT font_id)2836 ULONG binary_resource_gen::GetFontDataSize(ULONG written_size, res_info *info, USHORT theme_id, USHORT font_id)
2837 {
2838     if (m_font_data_size[theme_id][font_id])
2839     {
2840         return m_font_data_size[theme_id][font_id];
2841     }
2842 
2843     if (info->is_default && info->pathinfo.pathname.IsEmpty() &&
2844         !IsRotatedResourceSupported(m_project, m_display))
2845     {
2846         // Default font.
2847         return 0;
2848     }
2849 
2850     ULONG data_size = 0;
2851     ULONG size;
2852     GX_FONT* head_page = GetPageHead(info, theme_id, font_id);
2853 
2854     const GX_FONT *font_page = head_page;
2855     while (font_page)
2856     {
2857         data_size += GetPageHeaderSize();
2858         written_size += GetPageHeaderSize();
2859 
2860         size = GetPageDataSize(written_size, font_page);
2861         data_size += size;
2862         written_size += size;
2863 
2864         font_page = font_page->gx_font_next_page;
2865     }
2866 
2867     m_font_data_size[theme_id][font_id] = data_size;
2868 
2869     return data_size;
2870 }
2871 
2872 ///////////////////////////////////////////////////////////////////////////////
GetFontDataOffset(USHORT font_id,USHORT theme_id)2873 ULONG binary_resource_gen::GetFontDataOffset(USHORT font_id, USHORT theme_id)
2874 {
2875     ULONG data_offset;
2876 
2877     data_offset = GetResourceHeaderSize();
2878     data_offset += GetThemeDataSize(theme_id);
2879 
2880     data_offset += GetThemeHeaderSize();
2881 
2882     //Calculate color block size
2883     data_offset += GetColorBlockSize(theme_id);
2884 
2885     //Calcualte palette table size
2886     data_offset += GetPaletteBlockSize(theme_id);
2887 
2888     if (font_id)
2889     {
2890         data_offset += GetFontBlockSize(data_offset, theme_id, font_id);
2891     }
2892 
2893     return data_offset;
2894 }
2895 
2896 ///////////////////////////////////////////////////////////////////////////////
GetPixelmapDataOffset(USHORT map_id,USHORT frame_id,USHORT theme_id)2897 ULONG binary_resource_gen::GetPixelmapDataOffset(USHORT map_id, USHORT frame_id, USHORT theme_id)
2898 {
2899     ULONG data_offset;
2900 
2901     data_offset = GetResourceHeaderSize();
2902     data_offset += GetThemeDataSize(theme_id);
2903 
2904     data_offset += GetThemeHeaderSize();
2905 
2906     //Calculate color block size
2907     data_offset += GetColorBlockSize(theme_id);
2908 
2909     //Calcualte palette block size
2910     data_offset += GetPaletteBlockSize(theme_id);
2911 
2912     // Calcualte font block size
2913     data_offset += GetFontBlockSize(data_offset, theme_id, -1);
2914 
2915     if (map_id > 1)
2916     {
2917         data_offset += GetPixelmapBlockSize(data_offset, theme_id, map_id, frame_id);
2918     }
2919 
2920     return data_offset;
2921 }
2922 
2923 ///////////////////////////////////////////////////////////////////////////////
GetPageDataSize(ULONG written_size,const GX_FONT * font)2924 ULONG binary_resource_gen::GetPageDataSize(ULONG written_size, const GX_FONT *font)
2925 {
2926     if (!font)
2927     {
2928         return 0;
2929     }
2930 
2931     GX_CHAR_CODE charval;
2932     ULONG data_size = 0;
2933     ULONG size;
2934 
2935     if (font -> gx_font_format & GX_FONT_FORMAT_KERNING)
2936     {
2937         for (charval = font->gx_font_first_glyph; charval <= font->gx_font_last_glyph; charval++)
2938         {
2939             data_size += GetKerningGlyphHeaderSize();
2940             written_size += GetKerningGlyphHeaderSize();
2941 
2942             size = GetGlyphDataSize(written_size, font, charval - font->gx_font_first_glyph);
2943             data_size += size;
2944             written_size += size;
2945 
2946             size = GetGlyphKerningTableSize(font, charval - font->gx_font_first_glyph);
2947             data_size += size;
2948             written_size += size;
2949         }
2950     }
2951     else
2952     {
2953         for (charval = font->gx_font_first_glyph; charval <= font->gx_font_last_glyph; charval++)
2954         {
2955             data_size += GetGlyphHeaderSize();
2956             written_size += GetGlyphHeaderSize();
2957 
2958             size = GetGlyphDataSize(written_size, font, charval - font->gx_font_first_glyph);
2959             data_size += size;
2960             written_size += size;
2961         }
2962     }
2963 
2964     return data_size;
2965 }
2966 
2967 ///////////////////////////////////////////////////////////////////////////////
GetGlyphKerningTableSize(const GX_FONT * font,INT glyph_index)2968 USHORT binary_resource_gen::GetGlyphKerningTableSize(const GX_FONT *font, INT glyph_index)
2969 {
2970     USHORT table_size = 0;
2971     studiox_project *pProject = GetOpenProject();
2972 
2973     if (pProject)
2974     {
2975         GX_CONST GX_KERNING_GLYPH *glyph = &font->gx_font_glyphs.gx_font_kerning_glyphs[glyph_index];
2976         if (glyph->gx_kerning_table)
2977         {
2978             INT pair_counts = *(glyph->gx_kerning_table);
2979             table_size = 1 + pair_counts * (sizeof(GX_UBYTE) + sizeof(GX_CHAR));
2980         }
2981     }
2982 
2983     return table_size;
2984 }
2985 
2986 ///////////////////////////////////////////////////////////////////////////////
GetGlyphDataSize(ULONG written_size,const GX_FONT * font,INT glyph_index)2987 ULONG binary_resource_gen::GetGlyphDataSize(ULONG written_size, const GX_FONT *font, INT glyph_index)
2988 {
2989     ULONG data_size = 0;
2990     studiox_project *pProject = GetOpenProject();
2991 
2992     if (pProject)
2993     {
2994         if (font->gx_font_format & GX_FONT_FORMAT_COMPRESSED)
2995         {
2996             GX_CONST GX_COMPRESSED_GLYPH *glyph = &font->gx_font_glyphs.gx_font_compressed_glyphs[glyph_index];
2997 
2998             if (glyph->gx_glyph_map)
2999             {
3000                 if (IsRotatedResourceSupported(m_project, m_display))
3001                 {
3002                     UCHAR* rotated_data;
3003                     int mapsize;
3004                     RotateGlyphData((GX_GLYPH *)glyph, font->gx_font_format, &rotated_data, &mapsize);
3005                     if (rotated_data)
3006                     {
3007                         delete rotated_data;
3008                     }
3009                     data_size = mapsize & 0x7fff;
3010                 }
3011                 else
3012                 {
3013                     data_size = glyph->gx_glyph_map_size & 0x7fff;
3014                 }
3015             }
3016         }
3017         else
3018         {
3019             GX_GLYPH* glyph;
3020             if (font->gx_font_format & GX_FONT_FORMAT_KERNING)
3021             {
3022                 glyph = (GX_GLYPH *) &font->gx_font_glyphs.gx_font_kerning_glyphs[glyph_index];
3023             }
3024             else
3025             {
3026                 glyph = (GX_GLYPH*) &(font->gx_font_glyphs.gx_font_normal_glyphs[glyph_index]);
3027             }
3028 
3029             if (glyph->gx_glyph_map)
3030             {
3031                 if (IsRotatedResourceSupported(m_project, m_display))
3032                 {
3033                     data_size = GetRowPitch(glyph->gx_glyph_height, GetFontBits(font->gx_font_format));
3034                     data_size *= glyph->gx_glyph_width;
3035                 }
3036                 else
3037                 {
3038                     int pitch = GetRowPitch(glyph->gx_glyph_width, GetFontBits(font->gx_font_format));
3039                     data_size = pitch * glyph->gx_glyph_height;
3040                 }
3041             }
3042         }
3043 
3044         if (data_size &&
3045             (project_lib_version() >= GX_VERSION_BINRES_FONT_ALIGNMENT_FIX) &&
3046             (written_size & 0x03))
3047         {
3048             data_size += (4 - (written_size & 0x03));
3049         }
3050     }
3051 
3052     return data_size;
3053 }
3054 
3055 ///////////////////////////////////////////////////////////////////////////////
GetStringDataSize()3056 ULONG binary_resource_gen::GetStringDataSize()
3057 {
3058     ULONG data_size = 0;
3059 
3060     CCommandInfo *pCmd = GetCmdInfo();
3061     BOOL enabled;
3062 
3063     data_size += GetStringHeaderSize();
3064     for (int language = 0; language < m_project->mHeader.num_languages; language++)
3065     {
3066         if (pCmd->IsNoGui())
3067         {
3068             enabled = pCmd->IsLanguageEnabled(m_project->mHeader.languages[language].name);
3069         }
3070         else
3071         {
3072             enabled = m_project->mDisplays[m_display].gen_string_table[language];
3073         }
3074 
3075         if (enabled)
3076         {
3077             data_size += GetLanguageHeaderSize();
3078             data_size += GetStringDataSize(language);
3079         }
3080     }
3081 
3082     return data_size;
3083 }
3084 
3085 ///////////////////////////////////////////////////////////////////////////////
GetStringDataSize(USHORT language_id)3086 ULONG binary_resource_gen::GetStringDataSize(USHORT language_id)
3087 {
3088     ULONG string_data_size = 0;
3089 
3090     string_table *pTable = m_project->mDisplays[m_display].stable;
3091     int num_strings = pTable->CountStrings();
3092     CString val;
3093     CString id_name;
3094     GX_STRING string;
3095     CArray<widget_info*>* info_list;
3096     widget_info* info;
3097     int reference_count;
3098 
3099     // calcualte string data size
3100     for (int string_id = 1; string_id < num_strings; string_id++)
3101     {
3102         id_name = pTable->GetResourceIdName(string_id);
3103         val = pTable->GetString(id_name, language_id);
3104 
3105         info_list = pTable->GetMLViewReferenceWidgetInfoList(id_name);
3106 
3107         if (info_list)
3108         {
3109             reference_count = info_list->GetCount();
3110         }
3111         else
3112         {
3113             reference_count = 1;
3114         }
3115 
3116         info = NULL;
3117 
3118         for(int index = 0; index < reference_count; index++)
3119         {
3120             if (info_list)
3121             {
3122                 info = info_list->GetAt(index);
3123             }
3124 
3125             if (val.IsEmpty())
3126             {
3127                 string.gx_string_ptr = GX_NULL;
3128                 string.gx_string_length = 0;
3129             }
3130             else
3131             {
3132                 MakeUtf8String(m_project, val, language_id, &string, m_display, TRUE, info);
3133             }
3134 
3135             if (project_lib_version() >= GX_VERSION_STRING_LENGTH_FIX)
3136             {
3137                 //two bytes for string length
3138                 string_data_size += sizeof(USHORT);
3139             }
3140 
3141             string_data_size += string.gx_string_length + 1;
3142             if (string.gx_string_ptr)
3143             {
3144                 delete string.gx_string_ptr;
3145             }
3146         }
3147     }
3148 
3149     return string_data_size;
3150 }
3151 
3152 ////////////////////////////////////////////////////////////////////////////////////////////////
MakeFileDictionary(void)3153 void binary_resource_gen::MakeFileDictionary(void)
3154 {
3155     res_info* info;
3156     CCommandInfo* pCmdInfo = GetCmdInfo();
3157     BOOL enabled;
3158     CString output_file;
3159     file_info* finfo;
3160     ULONG blocksize;
3161 
3162     finfo = new file_info();
3163     finfo->name = "";
3164     finfo->total_size = 0;
3165     finfo->write_res_index = 0;
3166     finfo->size_table.RemoveAll();
3167     m_file_dictionary.Add(finfo);
3168 
3169     ULONG written_size = 0;
3170 
3171     for (int theme = 0; theme < m_project->mDisplays[m_display].num_themes; theme++)
3172     {
3173         if (pCmdInfo->IsNoGui())
3174         {
3175             enabled = pCmdInfo->IsThemeEnabled(m_project->mDisplays[m_display].themes[theme].theme_name);
3176         }
3177         else
3178         {
3179             enabled = m_project->mDisplays[m_display].themes[theme].gen_pixelmap_table;
3180         }
3181 
3182         if (!enabled) continue;
3183 
3184         for (int font_id = 0; font_id < m_project->CountResources(m_display, RES_TYPE_FONT); font_id++)
3185         {
3186             res_info* info = m_project->FindResource(m_display, theme, RES_TYPE_FONT, font_id);
3187 
3188             if (IsResEnabled(info))
3189             {
3190                 if (info->output_file_enabled)
3191                 {
3192                     output_file = RemoveFileExtension(info->output_file);
3193                     output_file.MakeUpper();
3194                     finfo = FindFileInfo(&m_file_dictionary, output_file);
3195 
3196                     if (!finfo)
3197                     {
3198                         finfo = new file_info;
3199                         finfo->name = output_file;
3200                         finfo->total_size = 0;
3201                         finfo->write_res_index = 0;
3202                         finfo->size_table.RemoveAll();
3203                         m_file_dictionary.Add(finfo);
3204                     }
3205                 }
3206                 else
3207                 {
3208                     finfo = m_file_dictionary.GetAt(0);
3209                 }
3210 
3211                 written_size = finfo->total_size;
3212                 written_size += GetFontHeaderSize();
3213                 blocksize = GetFontDataSize(written_size, info, theme, font_id);
3214                 written_size += blocksize;
3215                 blocksize += GetFontHeaderSize();
3216 
3217                 finfo->size_table.Add(blocksize);
3218                 finfo->total_size = written_size;
3219             }
3220         }
3221 
3222         GX_PIXELMAP *map;
3223         USHORT outmap_id = 1;
3224 
3225         for (int id = 1; id < m_pixelmap_dictionary.GetCount(); id++)
3226         {
3227             info = m_project->FindResource(m_display, theme, RES_TYPE_PIXELMAP, m_pixelmap_dictionary.GetAt(id));
3228 
3229             if (IsResEnabled(info) && info->GetPixelmapFrameCount())
3230             {
3231                 for (int frame_id = 0; frame_id < info->GetPixelmapFrameCount(); frame_id++)
3232                 {
3233                     map = info->GetPixelmap(frame_id);
3234 
3235                     if (!map)
3236                     {
3237                         continue;
3238                     }
3239 
3240                     if (info->output_file_enabled)
3241                     {
3242                         output_file = RemoveFileExtension(info->output_file);
3243                         output_file.MakeUpper();
3244 
3245                         finfo = FindFileInfo(&m_file_dictionary, output_file);
3246 
3247                         if (!finfo)
3248                         {
3249 
3250                             finfo = new file_info;
3251                             finfo->name = output_file;
3252                             finfo->total_size = 0;
3253                             finfo->write_res_index = 0;
3254                             finfo->size_table.RemoveAll();
3255                             m_file_dictionary.Add(finfo);
3256                         }
3257                     }
3258                     else
3259                     {
3260                         finfo = m_file_dictionary.GetAt(0);
3261                     }
3262 
3263                     written_size = finfo->total_size;
3264                     written_size += GetPixelmapHeaderSize();
3265                     blocksize = GetOnePixelmapDataSize(written_size, info, theme, frame_id, outmap_id);
3266                     written_size += blocksize;
3267                     blocksize += GetPixelmapHeaderSize();
3268 
3269                     finfo->size_table.Add(blocksize);
3270                     finfo->total_size = written_size;
3271 
3272                     outmap_id++;
3273                 }
3274             }
3275         }
3276     }
3277 }
3278 
3279 ////////////////////////////////////////////////////////////////////////////////////////////////
DestroyFileDictionay()3280 void binary_resource_gen::DestroyFileDictionay()
3281 {
3282     file_info* info;
3283     for (int index = 0; index < m_file_dictionary.GetCount(); index++)
3284     {
3285         info = m_file_dictionary.GetAt(index);
3286         delete info;
3287     }
3288 
3289     m_file_dictionary.RemoveAll();
3290 }
3291 
3292 
3293 ///////////////////////////////////////////////////////////////////////////////
FindFileInfo(CArray<file_info * > * file_dict,CString name)3294 file_info *binary_resource_gen::FindFileInfo(CArray<file_info*>* file_dict, CString name)
3295 {
3296     file_info* find;
3297     int index;
3298 
3299     for (index = 1; index < file_dict->GetCount(); index++)
3300     {
3301         find = file_dict->GetAt(index);
3302 
3303         if (find->name == name)
3304         {
3305             return find;
3306         }
3307     }
3308 
3309     return GX_NULL;
3310 }