git.y1.nz

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.