Skip to content

Commit

Permalink
GBR/GBM Export Settings: populate useful defaults for export settings
Browse files Browse the repository at this point in the history
  • Loading branch information
bbbbbr committed Apr 23, 2020
1 parent fa27a1f commit 2fcd358
Show file tree
Hide file tree
Showing 11 changed files with 160 additions and 12 deletions.
1 change: 1 addition & 0 deletions src/lib_gbm.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ int32_t gbm_save(const char * filename, image_data * p_src_image, color_data * p
// Initialize shared GBM map structure with defaults
gbm_export_set_defaults(&gbm);
gbm_export_update_color_set(&gbm, plugin_options.gb_mode);
gbm_export_update_export_settings(&gbm, filename, plugin_options.gb_mode);
gbm_overlay_cached_settings();

// Set GBR tile file name for the GBM file to use (exported above)
Expand Down
9 changes: 9 additions & 0 deletions src/lib_gbm.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,15 @@
#define GBM_MAP_EXPORT_DELETED_1_SIZE 0x012C
#define GBM_MAP_EXPORT_DELETED_2_SIZE 0x0

enum gbm_tile_export_tiletype {
gbm_export_filetype_rgbds_asm = 0x00,
gbm_export_iletype_rgbds_obj,
gbm_export_filetype_tasm_asm,
gbm_export_filetype_gbdk_c,
gbm_export_filetype_binary
};


typedef struct {
uint32_t nr; // Export Row Type Actual. NOTE: In app var is only uint8_t, but gets export padded (with garbage bytes) up to uint32_t. This is export property attribute row in location format table
uint32_t size; // Export number of bits
Expand Down
60 changes: 54 additions & 6 deletions src/lib_gbm_export.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,17 @@
#include "lib_gbm_file_utils.h"
#include "lib_gbm_ops.h"

#include "tilemap_path_ops.h"

#include "options.h"


static uint8_t GBM_EXPORT_PROPS_DEFAULT[] = {
0x01,0x12,0x2E,0x00, // Prop type = [Tile number]
0x08,0x00,0x00,0x00, // Prop size = [8 bits]
0x08,0x15,0x2E,0x00, // Prop type = [GBC BG Attribute]
0x08,0x00,0x00,0x00}; // Prop size = [8 bits]


int32_t gbm_object_producer_encode(gbm_record * p_gbm, gbm_file_object * p_obj) {

Expand Down Expand Up @@ -370,16 +378,16 @@ int32_t gbm_export_set_defaults(gbm_record * p_gbm) {
memset(p_gbm->map_export.label_name, 0x00, GBM_MAP_EXPORT_LABEL_NAME_SIZE);

snprintf(p_gbm->map_export.file_name, GBM_MAP_EXPORT_FILE_NAME_SIZE, "map.c");
p_gbm->map_export.file_type = 3; // TODO: make a #define for this?
p_gbm->map_export.file_type = gbm_export_filetype_gbdk_c;
// snprintf(p_gbm->map_export.section_name, GBM_MAP_EXPORT_SECTION_NAME_SIZE, ""); // Section name is blank
snprintf(p_gbm->map_export.label_name, GBM_MAP_EXPORT_LABEL_NAME_SIZE, "map%ce1_1", '\0');
p_gbm->map_export.bank = 0; // TODO: make a #define for this? Different default bank?

p_gbm->map_export.plane_count = 1;
p_gbm->map_export.plane_order = 0;
p_gbm->map_export.map_layout = 0;
p_gbm->map_export.plane_count = 1; // 1 plane (1 for DMG, 2 for CGB with attribs) - see export_props
p_gbm->map_export.plane_order = 1; // Planes are continues
p_gbm->map_export.map_layout = 0; // Rows

p_gbm->map_export.split = 0; // bool
p_gbm->map_export.split = 0; // (bool) split = no
p_gbm->map_export.split_size = 0;
p_gbm->map_export.split_bank = 0; // bool

Expand All @@ -389,7 +397,9 @@ int32_t gbm_export_set_defaults(gbm_record * p_gbm) {


// MAP PROP COLORS
// First fill memory with zeros, then load in some normal defaults
memset(p_gbm->map_export_prop.props, 0x00, GBM_MAP_EXPORT_PROPS_SIZE_MAX);
memcpy(p_gbm->map_export_prop.props, &GBM_EXPORT_PROPS_DEFAULT[0], sizeof(GBM_EXPORT_PROPS_DEFAULT));

return true;
}
Expand All @@ -401,4 +411,42 @@ void gbm_export_update_color_set(gbm_record * p_gbm, uint16_t gb_mode) {
p_gbm->map_settings.color_set = gbm_color_set_gbc;
else
p_gbm->map_settings.color_set = gbm_color_set_game_boy;
}
}


void gbm_export_update_export_settings(gbm_record * p_gbm, const char * filename, uint16_t gb_mode) {

char filename_trimmed[STR_FILENAME_MAX];

// Get the filename without any path and extension
// snprintf(filename_trimmed, STR_FILENAME_MAX, "%s", filename);
copy_filename_without_path_and_extension(&filename_trimmed[0], filename);

// Append required labels to the trimmed filename
snprintf(p_gbm->map_export.file_name, GBM_MAP_EXPORT_FILE_NAME_SIZE, "%s_map.c", filename_trimmed);
snprintf(p_gbm->map_export.label_name, GBM_MAP_EXPORT_LABEL_NAME_SIZE, "%s_map", filename_trimmed);

// printf("gbm_export_update_tile_export_settings:\nexport filename:%s\ntrimmed:%s\nexport setting filename:%s\nexport label:%s\n",
// filename,
// filename_trimmed,
// p_gbm->map_export.file_name,
// p_gbm->map_export.label_name);

// The export prop settings have been populated with
// full 2 bytes of CGB props, but this will set it to
// ignore the second property if it's DMG mode
if (gb_mode == MODE_CGB_32_COLOR) {

// 2 planes, 2 export_prop settings
p_gbm->map_export.plane_count = 2;
p_gbm->map_export.prop_count = 2;

} else {

// Otherwise it's DMG mode
// 1 plane, 1 export_prop setting
p_gbm->map_export.plane_count = 1;
p_gbm->map_export.prop_count = 1;
}

}
3 changes: 2 additions & 1 deletion src/lib_gbm_export.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,5 @@ int32_t gbm_object_map_deleted_1_encode(gbm_record * p_gbm, gbm_file_object * p_
int32_t gbm_object_map_deleted_2_encode(gbm_record * p_gbm, gbm_file_object * p_obj);

int32_t gbm_export_set_defaults(gbm_record * p_gbm);
void gbm_export_update_color_set(gbm_record * p_gbm, uint16_t gb_mode);
void gbm_export_update_color_set(gbm_record * p_gbm, uint16_t gb_mode);
void gbm_export_update_export_settings(gbm_record *, const char *, uint16_t);
7 changes: 7 additions & 0 deletions src/lib_gbr.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,13 @@ int32_t gbr_save(const char * filename, image_data * p_src_image, color_data * p
// Convert the image data to tiles
status = gbr_convert_image_to_tileset(&gbr, p_src_image, p_colors, plugin_options.gb_mode);

// Apply some final settings updates,
// only if there aren't cached settings we don't want to overwrite
if (!settings_gbr_tile_export_populated) {
gbr_export_update_tile_export_settings(&gbr, filename);
}


// Load and parse the file
if (status)
status = gbr_save_file(filename);
Expand Down
19 changes: 19 additions & 0 deletions src/lib_gbr.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,25 @@ enum gbr_tileset_splitorder {
vertical = 1
};

enum gbr_tile_export_tiletype {
gbr_export_filetype_rgbds_asm = 0x00,
gbr_export_filetype_rgbds_obj,
gbr_export_filetype_tasm_asm,
gbr_export_filetype_gbdk_c,
gbr_export_filetype_binary
};

enum gbr_tile_export_format {
gbr_export_format_gb_4_color = 0x00,
gbr_export_format_gb_2_color = 0x01,
gbr_export_format_byte_per_color = 0x03
};

enum gbr_tile_export_compression {
gbr_export_compress_none = 0x00,
gbr_export_compress_gbcompress
};


typedef struct {
char name[GBR_PRODUCER_NAME_SIZE_STR];
Expand Down
34 changes: 30 additions & 4 deletions src/lib_gbr_export.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
#include "lib_gbr_file_utils.h"
#include "lib_gbr_ops.h"

#include "tilemap_path_ops.h"

#include "options.h"


Expand Down Expand Up @@ -675,17 +677,17 @@ int32_t gbr_export_set_defaults(gbr_record * p_gbr) {

p_gbr->tile_export.tile_id = 1;
//snprintf(p_gbr->tile_export.file_name, GBR_TILE_EXPORT_FILE_NAME_SIZE_STR, "");
p_gbr->tile_export.file_type = 0;
p_gbr->tile_export.file_type = gbr_export_filetype_gbdk_c;
//snprintf(p_gbr->tile_export.section_name, GBR_TILE_EXPORT_SECTION_NAME_SIZE_STR, "");
//snprintf(p_gbr->tile_export.label_name, GBR_TILE_EXPORT_LABEL_NAME_SIZE_STR, "");
p_gbr->tile_export.bank = 0;
p_gbr->tile_export.tile_array = 1;
p_gbr->tile_export.format = 0;
p_gbr->tile_export.format = gbr_export_format_gb_4_color;
p_gbr->tile_export.counter = 0;
p_gbr->tile_export.from = 0;
p_gbr->tile_export.upto = 0;
p_gbr->tile_export.compression = 0;
p_gbr->tile_export.include_colors = 0;
p_gbr->tile_export.compression = gbr_export_compress_none;
p_gbr->tile_export.include_colors = 1; // Yes, include color palette in export
p_gbr->tile_export.sgb_palettes = 0;
p_gbr->tile_export.gbc_palettes = 0;
p_gbr->tile_export.make_meta_tiles = 0;
Expand Down Expand Up @@ -737,3 +739,27 @@ int32_t gbr_export_set_defaults(gbr_record * p_gbr) {

return true;
}


void gbr_export_update_tile_export_settings(gbr_record * p_gbr, const char * filename) {

char filename_trimmed[STR_FILENAME_MAX];

// Get the filename without any path and extension
// snprintf(filename_trimmed, STR_FILENAME_MAX, "%s", filename);
copy_filename_without_path_and_extension(&filename_trimmed[0], filename);

// Append required labels to the trimmed filename
snprintf(p_gbr->tile_export.file_name, GBR_TILE_EXPORT_FILE_NAME_SIZE, "%s_tiles.c", filename_trimmed);
snprintf(p_gbr->tile_export.label_name, GBR_TILE_EXPORT_LABEL_NAME_SIZE, "%s_tiles", filename_trimmed);

// printf("gbr_export_update_tile_export_settings:\nexport filename:%s\ntrimmed:%s\nexport setting filename:%s\nexport label:%s\n",
// filename,
// filename_trimmed,
// p_gbr->tile_export.file_name,
// p_gbr->tile_export.label_name);

// Tiles IDs to export
p_gbr->tile_export.from = 0; // Start at first tile
p_gbr->tile_export.upto = p_gbr->tile_data.count - 1; // Go up to last tile
}
1 change: 1 addition & 0 deletions src/lib_gbr_export.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,4 @@ int32_t gbr_convert_image_to_tileset(gbr_record * p_gbr, image_data * p_image, c
int32_t gbr_export_tileset_palette(color_data * p_colors, gbr_record * p_gbr);

int32_t gbr_export_set_defaults(gbr_record * p_gbr);
void gbr_export_update_tile_export_settings(gbr_record *, const char *);
2 changes: 1 addition & 1 deletion src/lib_gbr_ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ int32_t gbr_tile_palette_assign_and_strip(uint8_t * p_buf, gbr_record * p_gbr, u
// * the tile tried to use more than one palette
if ((tile_pal_setting != tile_pal_setting_last)) {

printf("Error: gbr_tile_palette_assign_and_strip(): Error, multiple palettes in single tile\n");
printf("Error: gbr_tile_palette_assign_and_strip(): Error, multiple palettes in single tile. tile# = %d\n, pal#1 = %d, pal#2 = %d\n", index, tile_pal_setting_last, tile_pal_setting);
return (false);
}
else {
Expand Down
35 changes: 35 additions & 0 deletions src/tilemap_path_ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "tilemap_path_ops.h"


const char kExtensionSeparator = '.';
const char kPathSeparator =
#ifdef _WIN32
'\\';
Expand Down Expand Up @@ -49,3 +50,37 @@ int32_t get_path_without_filename(const char * path, char * path_only, uint32_t
memcpy(path_only, path, strlen(path));
return true;
}


void copy_filename_without_path_and_extension(char * path_out, const char * path_in)
{
size_t i;
char * last_ext;

// First make sure any path seperators are removed
for(i = strlen(path_in) - 1; i; i--) {
if (path_in[i] == kPathSeparator) {
path_in = &path_in[i+1];
// printf("Found: %s\n", path_in);
break;
}
}

memcpy(path_out, path_in, strlen(path_in));

// Then check to see if there is an extension (*FIRST* occurance of '.')
// (tries to remove *all* trailing extensions)
last_ext = strrchr (path_out, kExtensionSeparator);
while (last_ext) {

if (last_ext != NULL) {
// If an extension is found then overwrite it with a string terminator
*last_ext = '\0';
// printf("Truncating extension: %s\n", path_out);
}

last_ext = strrchr (path_out, kExtensionSeparator);
}
}


1 change: 1 addition & 0 deletions src/tilemap_path_ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@

const char * get_filename_from_path(const char * path);
int32_t get_path_without_filename(const char * path, char * path_only, uint32_t str_max);
void copy_filename_without_path_and_extension(char * path_out, const char * path_in);

0 comments on commit 2fcd358

Please sign in to comment.