gbdk-2020 | GameBoy Development Kit |
| download: https://git.y1.nz/archives/gbdk.tar.gz | |
| README | Files | Log | Refs | LICENSE |
gbdk-support/png2asset/export_h_file.cpp
1 // This prevents windows build errors regarding the 'fopen' function
2 // Example: 'fopen': This function or variable may be unsafe.Consider using fopen_s instead.To disable deprecation, use _CRT_SECURE_NO_WARNINGS.See online help for details.
3 // More info: https://stackoverflow.com/questions/14386/fopen-deprecated-warning
4 // From bbbbbr: `Looks like some of the benefits are concurrency protection, but that probably isn't an issue for png2asset`
5 #ifdef _WIN32
6 #define _CRT_SECURE_NO_DEPRECATE
7 #endif
8
9 #include <vector>
10 #include <string>
11 #include <algorithm>
12 #include <cstring>
13 #include <set>
14 #include <stdio.h>
15 #include <fstream>
16 #include <cstdint>
17
18 #include "lodepng.h"
19 #include "mttile.h"
20
21 #include "cmp_int_color.h"
22 #include "metasprites.h"
23
24 #include "png2asset.h"
25 #include "png_image.h"
26 #include "export.h"
27 #include "image_utils.h"
28 #include "process_arguments.h"
29 #include "rgb_to_nes_lut.h"
30
31 using namespace std;
32
33 static exportOptions_t exportOpt;
34
35 static void export_h_use_structs(PNG2AssetData* assetData, FILE* file);
36 static void export_h_map_and_metasprite_shared_defines(PNG2AssetData* assetData, FILE* file);
37 static void export_h_map_and_metasprite_shared_externs(PNG2AssetData* assetData, FILE* file);
38 static void export_h_map_mode(PNG2AssetData* assetData, FILE* file);
39 static void export_h_metasprite_mode(PNG2AssetData* assetData, FILE* file);
40
41
42 bool export_h_file( PNG2AssetData* assetData) {
43
44 FILE* file;
45 calc_palette_and_tileset_export_size(assetData, &exportOpt);
46
47 file = fopen(assetData->args->output_filename_h.c_str(), "w");
48 if (!file) {
49 printf("Error writing file: %s", assetData->args->output_filename_h.c_str());
50 return false;
51 }
52
53 fprintf(file, "//AUTOGENERATED FILE FROM png2asset\n");
54 fprintf(file, "// Conversion args:%s\n\n", assetData->args->args_for_logging_to_output.c_str());
55
56 fprintf(file, "#ifndef METASPRITE_%s_H\n", assetData->args->data_name.c_str());
57 fprintf(file, "#define METASPRITE_%s_H\n", assetData->args->data_name.c_str());
58 fprintf(file, "\n");
59 fprintf(file, "#include <stdint.h>\n");
60 fprintf(file, "#include <gbdk/platform.h>\n");
61 fprintf(file, "#include <gbdk/metasprites.h>\n");
62 fprintf(file, "\n");
63
64 if (assetData->args->use_structs) {
65 export_h_use_structs(assetData, file);
66 }
67 else {
68 export_h_map_and_metasprite_shared_defines(assetData, file);
69
70 if (assetData->args->includedMapOrMetaspriteData) {
71 if (assetData->args->export_as_map)
72 export_h_map_mode(assetData, file);
73 else
74 export_h_metasprite_mode(assetData, file);
75 }
76
77 export_h_map_and_metasprite_shared_externs(assetData, file);
78 }
79 fprintf(file, "\n");
80 fprintf(file, "#endif\n");
81
82
83 fclose(file);
84 // END: Output .h FILE
85
86 return true; // success
87 }
88
89
90 static void export_h_use_structs(PNG2AssetData* assetData, FILE* file) {
91
92 if (assetData->args->export_as_map) {
93 fprintf(file, "#include \"TilesInfo.h\"\n");
94 fprintf(file, "#include \"MapInfo.h\"\n");
95 fprintf(file, "\n");
96 // Analogous to "(output_mode == ZGB_TILES_MODE_TILESONLY)" in the C output
97 if ((assetData->args->includeTileData) && (!assetData->args->includedMapOrMetaspriteData)) {
98 // ZGB Tiles-only mode doesn't append "_tiles_info" to the struct name (and lacks a BANKREF output in the C output)
99 fprintf(file, "extern const struct TilesInfo %s;\n", assetData->args->data_name.c_str());
100 }
101 else { // implied (output_mode == ZGB_TILES_MODE_NORMAL)
102 fprintf(file, "extern const struct TilesInfo %s_tiles_info;\n", assetData->args->data_name.c_str());
103 fprintf(file, "extern const struct MapInfo %s;\n", assetData->args->data_name.c_str());
104 }
105
106 }
107 else {
108 fprintf(file, "#include \"MetaSpriteInfo.h\"\n");
109 fprintf(file, "\n");
110 fprintf(file, "extern const struct MetaSpriteInfo %s;\n", assetData->args->data_name.c_str());
111 }
112
113 }
114
115
116 static void export_h_map_and_metasprite_shared_defines(PNG2AssetData* assetData, FILE* file) {
117
118 // Non use-structs output mode
119 fprintf(file, "#define %s_TILE_ORIGIN %d\n", assetData->args->data_name.c_str(), assetData->args->tile_origin);
120 fprintf(file, "#define %s_TILE_W %d\n", assetData->args->data_name.c_str(), assetData->image.tile_w);
121 fprintf(file, "#define %s_TILE_H %d\n", assetData->args->data_name.c_str(), assetData->image.tile_h);
122 fprintf(file, "#define %s_WIDTH %d\n", assetData->args->data_name.c_str(), (unsigned int)assetData->args->spriteSize.width);
123 fprintf(file, "#define %s_HEIGHT %d\n", assetData->args->data_name.c_str(), (unsigned int)assetData->args->spriteSize.height);
124 // The TILE_COUNT calc here is referring to number of 8x8 tiles,
125 fprintf(file, "#define %s_TILE_COUNT %d\n", assetData->args->data_name.c_str(), ((unsigned int)exportOpt.tiles_count) * (assetData->image.tile_h >> 3) * (assetData->image.tile_w >> 3));
126 if (assetData->args->include_palettes) {
127 fprintf(file, "#define %s_PALETTE_COUNT %d\n", assetData->args->data_name.c_str(), (unsigned int)(assetData->image.total_color_count / assetData->image.colors_per_pal));
128 fprintf(file, "#define %s_COLORS_PER_PALETTE %d\n", assetData->args->data_name.c_str(), (unsigned int)assetData->image.colors_per_pal);
129 fprintf(file, "#define %s_TOTAL_COLORS %d\n", assetData->args->data_name.c_str(), (unsigned int)assetData->image.total_color_count);
130 }
131 }
132
133 static void export_h_map_and_metasprite_shared_externs(PNG2AssetData* assetData, FILE* file) {
134
135 fprintf(file, "\n");
136 fprintf(file, "BANKREF_EXTERN(%s)\n", assetData->args->data_name.c_str());
137 fprintf(file, "\n");
138
139 if (exportOpt.has_palette_data_to_export) {
140 fprintf(file, "extern const palette_color_t %s_palettes[%d];\n", assetData->args->data_name.c_str(), (unsigned int)exportOpt.color_count);
141 }
142 if (assetData->args->includeTileData) {
143 fprintf(file, "extern const uint8_t %s_tiles[%d];\n", assetData->args->data_name.c_str(), (unsigned int)(exportOpt.tiles_count * (assetData->image.tile_w * assetData->image.tile_h * assetData->args->bpp / 8)));
144 }
145 }
146
147
148 static void export_h_map_mode(PNG2AssetData* assetData, FILE* file) {
149
150 fprintf(file, "#define %s_MAP_ATTRIBUTES ", assetData->args->data_name.c_str());
151 if (assetData->args->use_map_attributes && assetData->map_attributes.size())
152 fprintf(file, "%s_map_attributes\n", assetData->args->data_name.c_str());
153 else
154 fprintf(file, "0\n");
155
156 if (assetData->args->use_map_attributes) {
157 int scale = assetData->args->use_2x2_map_attributes ? 2 : 1;
158 fprintf(file, "#define %s_MAP_ATTRIBUTES_WIDTH %d\n", assetData->args->data_name.c_str(), (int)(scale * assetData->args->map_attributes_size.width));
159 fprintf(file, "#define %s_MAP_ATTRIBUTES_HEIGHT %d\n", assetData->args->data_name.c_str(), (int)(scale * assetData->args->map_attributes_size.height));
160 fprintf(file, "#define %s_MAP_ATTRIBUTES_PACKED_WIDTH %d\n", assetData->args->data_name.c_str(), (int)assetData->args->map_attributes_packed_size.width);
161 fprintf(file, "#define %s_MAP_ATTRIBUTES_PACKED_HEIGHT %d\n", assetData->args->data_name.c_str(), (int)assetData->args->map_attributes_packed_size.height);
162 }
163
164 fprintf(file, "extern const unsigned char %s_map[%d];\n", assetData->args->data_name.c_str(), (unsigned int)(assetData->map).size());
165
166 if (assetData->args->use_map_attributes && assetData->map_attributes.size()) {
167 fprintf(file, "extern const unsigned char %s_map_attributes[%d];\n", assetData->args->data_name.c_str(), (unsigned int)(assetData->map_attributes).size());
168 }
169 else {
170 // Some platforms (like SMS/GG) encode attributes as part of map
171 // For compatibility, add a define that makes _map_attributes equal _map,
172 // so that set_bkg_attributes can work the same on these platforms
173 fprintf(file, "#define %s_map_attributes %s_map\n", assetData->args->data_name.c_str(), assetData->args->data_name.c_str());
174 }
175 }
176
177
178 static void export_h_metasprite_mode(PNG2AssetData* assetData, FILE* file) {
179
180 fprintf(file, "#define %s_PIVOT_X %d\n", assetData->args->data_name.c_str(), assetData->args->pivot.x);
181 fprintf(file, "#define %s_PIVOT_Y %d\n", assetData->args->data_name.c_str(), assetData->args->pivot.y);
182 fprintf(file, "#define %s_PIVOT_W %d\n", assetData->args->data_name.c_str(), (unsigned int)assetData->args->pivot.width);
183 fprintf(file, "#define %s_PIVOT_H %d\n", assetData->args->data_name.c_str(), (unsigned int)assetData->args->pivot.height);
184
185 fprintf(file, "extern const metasprite_t* const %s_metasprites[%d];\n", assetData->args->data_name.c_str(), (unsigned int)(assetData->sprites.size()));
186 }
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.