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_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.