gbdk-2020 | GameBoy Development Kit |
| download: https://git.y1.nz/archives/gbdk.tar.gz | |
| README | Files | Log | Refs | LICENSE |
gbdk-support/png2asset/export_binary.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_map_binary_tile_data(PNG2AssetData* assetData);
36 static void export_map_binary_map_data(PNG2AssetData* assetData);
37 static void export_map_binary_palette_data(PNG2AssetData* assetData);
38
39 bool export_map_binary(PNG2AssetData* assetData) {
40
41 calc_palette_and_tileset_export_size(assetData, &exportOpt);
42
43 if (assetData->args->includeTileData)
44 export_map_binary_tile_data(assetData);
45
46 if (assetData->args->includedMapOrMetaspriteData)
47 export_map_binary_map_data(assetData);
48
49 if (assetData->args->include_palettes)
50 export_map_binary_palette_data(assetData);
51
52 return true; // success
53 }
54
55
56 static void export_map_binary_tile_data(PNG2AssetData* assetData) {
57
58 std::ofstream tilesBinaryFile;
59 tilesBinaryFile.open(assetData->args->output_filename_tiles_bin, std::ios_base::binary);
60
61 for(vector< Tile >::iterator it = assetData->tiles.begin() + exportOpt.tiles_start; it != assetData->tiles.end(); ++it)
62 {
63
64 vector< unsigned char > packed_data = (*it).GetPackedData(assetData->args->pack_mode, assetData->image.tile_w, assetData->image.tile_h, assetData->args->bpp);
65 for(vector< unsigned char >::iterator it2 = packed_data.begin(); it2 != packed_data.end(); ++it2)
66 {
67
68 const char chars[] = { (const char)(*it2) };
69 tilesBinaryFile.write(chars, 1);
70 }
71
72 }
73 // Finalize the files
74 tilesBinaryFile.close();
75 }
76
77
78 static void export_map_binary_map_data(PNG2AssetData* assetData) {
79
80 std::ofstream mapBinaryFile, mapAttributesBinaryfile;
81 mapBinaryFile.open(assetData->args->output_filename_bin, std::ios_base::binary);
82
83 // Open our file for writing attributes if specified
84 if (assetData->args->use_map_attributes && assetData->map_attributes.size()) {
85 mapAttributesBinaryfile.open(assetData->args->output_filename_attributes_bin, std::ios_base::binary);
86 }
87
88 int columns = assetData->image.w >> 3;
89 int rows = assetData->image.h >> 3;
90
91 // If we want the values to be column-by-column
92 if(assetData->args->output_transposed) {
93
94 int map_entry_size = assetData->args->map_entry_size_bytes;
95 // Swap the column/row for loops
96 for(int column = 0; column < columns; column++) {
97 for(int row = 0; row < rows; ++row) {
98
99 int tile = (column + row * columns) * map_entry_size;
100
101 // Write map items column-by-column
102 mapBinaryFile.write( (const char *) &(assetData->map[tile]), map_entry_size);
103
104 if (assetData->args->use_map_attributes && assetData->map_attributes.size()) {
105 mapAttributesBinaryfile.write( (const char*) &(assetData->map_attributes[tile]), map_entry_size);
106 }
107 }
108 }
109 }
110 else {
111 // Write the arrays as-is, row-by-row
112 mapBinaryFile.write((const char*)(&assetData->map[0]), assetData->map.size());
113
114 if (assetData->args->use_map_attributes && assetData->map_attributes.size()) {
115 mapAttributesBinaryfile.write((const char*)(&assetData->map_attributes[0]), assetData->map_attributes.size());
116 }
117 }
118 // Finalize the files
119 mapBinaryFile.close();
120 if (assetData->args->use_map_attributes && assetData->map_attributes.size()) {
121 mapAttributesBinaryfile.close();
122 }
123 }
124
125 static void export_map_binary_palette_data(PNG2AssetData* assetData) {
126
127 std::ofstream paletteBinaryFile;
128 paletteBinaryFile.open(assetData->args->output_filename_palettes_bin, std::ios_base::binary);
129
130 const size_t palette_start = exportOpt.color_start / assetData->image.colors_per_pal;
131 const size_t total_palette_count = assetData->image.total_color_count / assetData->image.colors_per_pal;
132 int cur_color = exportOpt.color_start;
133
134 for (size_t i = palette_start; i < total_palette_count; ++i)
135 {
136 unsigned char* pal_ptr = &assetData->image.palette[i * (assetData->image.colors_per_pal * RGBA32_SZ)];
137 for (int c = 0; c < (int)assetData->image.colors_per_pal; ++c, pal_ptr += RGBA32_SZ)
138 {
139 if (assetData->args->convert_rgb_to_nes) {
140 size_t rgb222 = (((pal_ptr[2] >> 6) & 0x3) << 4) |
141 (((pal_ptr[1] >> 6) & 0x3) << 2) |
142 (((pal_ptr[0] >> 6) & 0x3) << 0);
143 paletteBinaryFile.write((const char *)&rgb_to_nes[rgb222], sizeof(rgb_to_nes[0]));
144 } else {
145 // TODO: implement formats other than RGB555, depending on the pack mode
146 uint16_t rgb555 = (((pal_ptr[2] >> 3) & 0b00011111) << 10) |
147 (((pal_ptr[1] >> 3) & 0b00011111) << 5) |
148 (((pal_ptr[0] >> 3) & 0b00011111) << 0);
149 paletteBinaryFile.write((const char *)&rgb555, sizeof(rgb555));
150 }
151
152 cur_color++;
153 }
154 }
155 // Finalize the files
156 paletteBinaryFile.close();
157 }
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.