Skip to content

Commit 2fcd358

Browse files
committed
GBR/GBM Export Settings: populate useful defaults for export settings
1 parent fa27a1f commit 2fcd358

11 files changed

+160
-12
lines changed

src/lib_gbm.c

+1
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ int32_t gbm_save(const char * filename, image_data * p_src_image, color_data * p
130130
// Initialize shared GBM map structure with defaults
131131
gbm_export_set_defaults(&gbm);
132132
gbm_export_update_color_set(&gbm, plugin_options.gb_mode);
133+
gbm_export_update_export_settings(&gbm, filename, plugin_options.gb_mode);
133134
gbm_overlay_cached_settings();
134135

135136
// Set GBR tile file name for the GBM file to use (exported above)

src/lib_gbm.h

+9
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@
8484
#define GBM_MAP_EXPORT_DELETED_1_SIZE 0x012C
8585
#define GBM_MAP_EXPORT_DELETED_2_SIZE 0x0
8686

87+
enum gbm_tile_export_tiletype {
88+
gbm_export_filetype_rgbds_asm = 0x00,
89+
gbm_export_iletype_rgbds_obj,
90+
gbm_export_filetype_tasm_asm,
91+
gbm_export_filetype_gbdk_c,
92+
gbm_export_filetype_binary
93+
};
94+
95+
8796
typedef struct {
8897
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
8998
uint32_t size; // Export number of bits

src/lib_gbm_export.c

+54-6
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,17 @@
88
#include "lib_gbm_file_utils.h"
99
#include "lib_gbm_ops.h"
1010

11+
#include "tilemap_path_ops.h"
12+
1113
#include "options.h"
1214

1315

16+
static uint8_t GBM_EXPORT_PROPS_DEFAULT[] = {
17+
0x01,0x12,0x2E,0x00, // Prop type = [Tile number]
18+
0x08,0x00,0x00,0x00, // Prop size = [8 bits]
19+
0x08,0x15,0x2E,0x00, // Prop type = [GBC BG Attribute]
20+
0x08,0x00,0x00,0x00}; // Prop size = [8 bits]
21+
1422

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

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

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

378-
p_gbm->map_export.plane_count = 1;
379-
p_gbm->map_export.plane_order = 0;
380-
p_gbm->map_export.map_layout = 0;
386+
p_gbm->map_export.plane_count = 1; // 1 plane (1 for DMG, 2 for CGB with attribs) - see export_props
387+
p_gbm->map_export.plane_order = 1; // Planes are continues
388+
p_gbm->map_export.map_layout = 0; // Rows
381389

382-
p_gbm->map_export.split = 0; // bool
390+
p_gbm->map_export.split = 0; // (bool) split = no
383391
p_gbm->map_export.split_size = 0;
384392
p_gbm->map_export.split_bank = 0; // bool
385393

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

390398

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

394404
return true;
395405
}
@@ -401,4 +411,42 @@ void gbm_export_update_color_set(gbm_record * p_gbm, uint16_t gb_mode) {
401411
p_gbm->map_settings.color_set = gbm_color_set_gbc;
402412
else
403413
p_gbm->map_settings.color_set = gbm_color_set_game_boy;
404-
}
414+
}
415+
416+
417+
void gbm_export_update_export_settings(gbm_record * p_gbm, const char * filename, uint16_t gb_mode) {
418+
419+
char filename_trimmed[STR_FILENAME_MAX];
420+
421+
// Get the filename without any path and extension
422+
// snprintf(filename_trimmed, STR_FILENAME_MAX, "%s", filename);
423+
copy_filename_without_path_and_extension(&filename_trimmed[0], filename);
424+
425+
// Append required labels to the trimmed filename
426+
snprintf(p_gbm->map_export.file_name, GBM_MAP_EXPORT_FILE_NAME_SIZE, "%s_map.c", filename_trimmed);
427+
snprintf(p_gbm->map_export.label_name, GBM_MAP_EXPORT_LABEL_NAME_SIZE, "%s_map", filename_trimmed);
428+
429+
// printf("gbm_export_update_tile_export_settings:\nexport filename:%s\ntrimmed:%s\nexport setting filename:%s\nexport label:%s\n",
430+
// filename,
431+
// filename_trimmed,
432+
// p_gbm->map_export.file_name,
433+
// p_gbm->map_export.label_name);
434+
435+
// The export prop settings have been populated with
436+
// full 2 bytes of CGB props, but this will set it to
437+
// ignore the second property if it's DMG mode
438+
if (gb_mode == MODE_CGB_32_COLOR) {
439+
440+
// 2 planes, 2 export_prop settings
441+
p_gbm->map_export.plane_count = 2;
442+
p_gbm->map_export.prop_count = 2;
443+
444+
} else {
445+
446+
// Otherwise it's DMG mode
447+
// 1 plane, 1 export_prop setting
448+
p_gbm->map_export.plane_count = 1;
449+
p_gbm->map_export.prop_count = 1;
450+
}
451+
452+
}

src/lib_gbm_export.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ int32_t gbm_object_map_deleted_1_encode(gbm_record * p_gbm, gbm_file_object * p_
2020
int32_t gbm_object_map_deleted_2_encode(gbm_record * p_gbm, gbm_file_object * p_obj);
2121

2222
int32_t gbm_export_set_defaults(gbm_record * p_gbm);
23-
void gbm_export_update_color_set(gbm_record * p_gbm, uint16_t gb_mode);
23+
void gbm_export_update_color_set(gbm_record * p_gbm, uint16_t gb_mode);
24+
void gbm_export_update_export_settings(gbm_record *, const char *, uint16_t);

src/lib_gbr.c

+7
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,13 @@ int32_t gbr_save(const char * filename, image_data * p_src_image, color_data * p
5858
// Convert the image data to tiles
5959
status = gbr_convert_image_to_tileset(&gbr, p_src_image, p_colors, plugin_options.gb_mode);
6060

61+
// Apply some final settings updates,
62+
// only if there aren't cached settings we don't want to overwrite
63+
if (!settings_gbr_tile_export_populated) {
64+
gbr_export_update_tile_export_settings(&gbr, filename);
65+
}
66+
67+
6168
// Load and parse the file
6269
if (status)
6370
status = gbr_save_file(filename);

src/lib_gbr.h

+19
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,25 @@ enum gbr_tileset_splitorder {
119119
vertical = 1
120120
};
121121

122+
enum gbr_tile_export_tiletype {
123+
gbr_export_filetype_rgbds_asm = 0x00,
124+
gbr_export_filetype_rgbds_obj,
125+
gbr_export_filetype_tasm_asm,
126+
gbr_export_filetype_gbdk_c,
127+
gbr_export_filetype_binary
128+
};
129+
130+
enum gbr_tile_export_format {
131+
gbr_export_format_gb_4_color = 0x00,
132+
gbr_export_format_gb_2_color = 0x01,
133+
gbr_export_format_byte_per_color = 0x03
134+
};
135+
136+
enum gbr_tile_export_compression {
137+
gbr_export_compress_none = 0x00,
138+
gbr_export_compress_gbcompress
139+
};
140+
122141

123142
typedef struct {
124143
char name[GBR_PRODUCER_NAME_SIZE_STR];

src/lib_gbr_export.c

+30-4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include "lib_gbr_file_utils.h"
77
#include "lib_gbr_ops.h"
88

9+
#include "tilemap_path_ops.h"
10+
911
#include "options.h"
1012

1113

@@ -675,17 +677,17 @@ int32_t gbr_export_set_defaults(gbr_record * p_gbr) {
675677

676678
p_gbr->tile_export.tile_id = 1;
677679
//snprintf(p_gbr->tile_export.file_name, GBR_TILE_EXPORT_FILE_NAME_SIZE_STR, "");
678-
p_gbr->tile_export.file_type = 0;
680+
p_gbr->tile_export.file_type = gbr_export_filetype_gbdk_c;
679681
//snprintf(p_gbr->tile_export.section_name, GBR_TILE_EXPORT_SECTION_NAME_SIZE_STR, "");
680682
//snprintf(p_gbr->tile_export.label_name, GBR_TILE_EXPORT_LABEL_NAME_SIZE_STR, "");
681683
p_gbr->tile_export.bank = 0;
682684
p_gbr->tile_export.tile_array = 1;
683-
p_gbr->tile_export.format = 0;
685+
p_gbr->tile_export.format = gbr_export_format_gb_4_color;
684686
p_gbr->tile_export.counter = 0;
685687
p_gbr->tile_export.from = 0;
686688
p_gbr->tile_export.upto = 0;
687-
p_gbr->tile_export.compression = 0;
688-
p_gbr->tile_export.include_colors = 0;
689+
p_gbr->tile_export.compression = gbr_export_compress_none;
690+
p_gbr->tile_export.include_colors = 1; // Yes, include color palette in export
689691
p_gbr->tile_export.sgb_palettes = 0;
690692
p_gbr->tile_export.gbc_palettes = 0;
691693
p_gbr->tile_export.make_meta_tiles = 0;
@@ -737,3 +739,27 @@ int32_t gbr_export_set_defaults(gbr_record * p_gbr) {
737739

738740
return true;
739741
}
742+
743+
744+
void gbr_export_update_tile_export_settings(gbr_record * p_gbr, const char * filename) {
745+
746+
char filename_trimmed[STR_FILENAME_MAX];
747+
748+
// Get the filename without any path and extension
749+
// snprintf(filename_trimmed, STR_FILENAME_MAX, "%s", filename);
750+
copy_filename_without_path_and_extension(&filename_trimmed[0], filename);
751+
752+
// Append required labels to the trimmed filename
753+
snprintf(p_gbr->tile_export.file_name, GBR_TILE_EXPORT_FILE_NAME_SIZE, "%s_tiles.c", filename_trimmed);
754+
snprintf(p_gbr->tile_export.label_name, GBR_TILE_EXPORT_LABEL_NAME_SIZE, "%s_tiles", filename_trimmed);
755+
756+
// printf("gbr_export_update_tile_export_settings:\nexport filename:%s\ntrimmed:%s\nexport setting filename:%s\nexport label:%s\n",
757+
// filename,
758+
// filename_trimmed,
759+
// p_gbr->tile_export.file_name,
760+
// p_gbr->tile_export.label_name);
761+
762+
// Tiles IDs to export
763+
p_gbr->tile_export.from = 0; // Start at first tile
764+
p_gbr->tile_export.upto = p_gbr->tile_data.count - 1; // Go up to last tile
765+
}

src/lib_gbr_export.h

+1
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,4 @@ int32_t gbr_convert_image_to_tileset(gbr_record * p_gbr, image_data * p_image, c
2121
int32_t gbr_export_tileset_palette(color_data * p_colors, gbr_record * p_gbr);
2222

2323
int32_t gbr_export_set_defaults(gbr_record * p_gbr);
24+
void gbr_export_update_tile_export_settings(gbr_record *, const char *);

src/lib_gbr_ops.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ int32_t gbr_tile_palette_assign_and_strip(uint8_t * p_buf, gbr_record * p_gbr, u
152152
// * the tile tried to use more than one palette
153153
if ((tile_pal_setting != tile_pal_setting_last)) {
154154

155-
printf("Error: gbr_tile_palette_assign_and_strip(): Error, multiple palettes in single tile\n");
155+
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);
156156
return (false);
157157
}
158158
else {

src/tilemap_path_ops.c

+35
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "tilemap_path_ops.h"
1111

1212

13+
const char kExtensionSeparator = '.';
1314
const char kPathSeparator =
1415
#ifdef _WIN32
1516
'\\';
@@ -49,3 +50,37 @@ int32_t get_path_without_filename(const char * path, char * path_only, uint32_t
4950
memcpy(path_only, path, strlen(path));
5051
return true;
5152
}
53+
54+
55+
void copy_filename_without_path_and_extension(char * path_out, const char * path_in)
56+
{
57+
size_t i;
58+
char * last_ext;
59+
60+
// First make sure any path seperators are removed
61+
for(i = strlen(path_in) - 1; i; i--) {
62+
if (path_in[i] == kPathSeparator) {
63+
path_in = &path_in[i+1];
64+
// printf("Found: %s\n", path_in);
65+
break;
66+
}
67+
}
68+
69+
memcpy(path_out, path_in, strlen(path_in));
70+
71+
// Then check to see if there is an extension (*FIRST* occurance of '.')
72+
// (tries to remove *all* trailing extensions)
73+
last_ext = strrchr (path_out, kExtensionSeparator);
74+
while (last_ext) {
75+
76+
if (last_ext != NULL) {
77+
// If an extension is found then overwrite it with a string terminator
78+
*last_ext = '\0';
79+
// printf("Truncating extension: %s\n", path_out);
80+
}
81+
82+
last_ext = strrchr (path_out, kExtensionSeparator);
83+
}
84+
}
85+
86+

src/tilemap_path_ops.h

+1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@
66

77
const char * get_filename_from_path(const char * path);
88
int32_t get_path_without_filename(const char * path, char * path_only, uint32_t str_max);
9+
void copy_filename_without_path_and_extension(char * path_out, const char * path_in);
910

0 commit comments

Comments
 (0)