first pass at stb-izing complete, now need to debug

This commit is contained in:
Sean Barrett 2014-07-04 09:34:57 -07:00
parent 88c99e47fb
commit 4b590c0a62
2 changed files with 122 additions and 116 deletions

View File

@ -232,7 +232,7 @@ typedef struct
STBHW_EXTERN void stbhw_get_template_size(stbhw_config *c, int *w, int *h);
// generates a template image, assuming data is 3*w*h bytes long, RGB format
STBHW_EXTERN void stbhw_make_template(stbhw_config *c, unsigned char *data, int w, int h);
STBHW_EXTERN int stbhw_make_template(stbhw_config *c, unsigned char *data, int w, int h, int stride_in_bytes);
#endif//INCLUDE_STB_HWANG_H
@ -340,7 +340,9 @@ static signed char h_color[STB_HBWANG_MAX_Y+5][STB_HBWANG_MAX_X+6];
static char *stbhw_error;
STBHW_EXTERN char *stbhw_get_last_error(void)
{
return stbhw_error;
char *temp = stbhw_error;
stbhw_error = 0;
return temp;
}
@ -470,7 +472,7 @@ STBHW_EXTERN void stbhw_get_template_size(stbhw_config *c, int *w, int *h)
stbhw__get_template_info(c, w, h, NULL, NULL);
}
static int stbhw__process_image(stbhw__process *p)
static int stbhw__process_template(stbhw__process *p)
{
int i,j,k,q, ypos;
int size_x, size_y;
@ -896,6 +898,8 @@ STBHW_EXTERN int stbhw_build_tileset_from_image(stbhw_tileset *ts, unsigned char
return 0;
if (c.short_side_len == 0)
return 0;
if (c.num_color[0] > 32 || c.num_color[1] > 32 || c.num_color[2] > 32 || c.num_color[3] > 32)
return 0;
stbhw__get_template_info(&c, NULL, NULL, &h_count, &v_count);
@ -920,7 +924,7 @@ STBHW_EXTERN int stbhw_build_tileset_from_image(stbhw_tileset *ts, unsigned char
p.h = h;
// load all the tiles out of the image
return stbhw__process_image(&p);
return stbhw__process_template(&p);
}
STBHW_EXTERN void stbhw_free_tileset(stbhw_tileset *ts)
@ -1158,126 +1162,49 @@ static void stbhw__corner_process_v_rect(stbhw__process *p, int xpos, int ypos,
#endif // STB_HBWANG_IMPLEMENTATION
#ifndef INCLUDE_STB_IMAGE_WRITE_H
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
#endif
int corner_color_count[4] = { 2,2,2,2 };
// whether each color for each type of corner should get the corner template
int corner_type_color_template[4][4] =
// generates a template image, assuming data is 3*w*h bytes long, RGB format
STBHW_EXTERN int stbhw_make_template(stbhw_config *c, unsigned char *data, int w, int h, int stride_in_bytes)
{
{ 0,0,0,0 },
{ 0,0,0,0 },
{ 0,0,0,0 },
{ 0,0,0,0 },
};
// number of duplicates with the exact same edge colors
int num_variants_x = 1;
int num_variants_y = 1;
// total number of items in complete set:
//
// horizontal items:
// ec[1] * ec[2] * ec[3] * ec[0] * ec[1] * ec[2] * num_variants_x * num_variants_y
//
// vertical items:
// ec[0] * ce[1] * ce[3] * ce[0] * ec[2] * ec[3] * num_variants_x * num_variants_y
// number of tiles along the short side
int short_side = 9;
int my_main(int argc, char **argv)
{
stbhw_config c;
stbhw__process p;
int i;
if (argc != 2) {
fprintf(stderr, "Usage: gentemplate {filename}\n");
return 1;
p.data = data;
p.w = w;
p.h = h;
p.stride = stride_in_bytes;
p.ts = 0;
p.c = c;
if (c->is_corner) {
p.process_h_rect = stbhw__corner_process_h_rect;
p.process_v_rect = stbhw__corner_process_v_rect;
} else {
p.process_h_rect = stbhw__edge_process_h_rect;
p.process_v_rect = stbhw__edge_process_v_rect;
}
p.data = NULL;
p.h = p.w = p.stride = 0;
p.process_h_rect = stbhw__corner_process_h_rect;
p.process_v_rect = stbhw__corner_process_v_rect;
//p.ts = 0;
p.c = & c;
c.is_corner = 1;
c.short_side_len = short_side;
c.num_vary_x = num_variants_x;
c.num_vary_y = num_variants_y;
memcpy(c.num_color, corner_color_count, sizeof(corner_color_count));
if (!stbhw__process_template(&p))
return 0;
stbhw__process_image(&p);
// write out binary information in first line of image
for (i=0; i < 4; ++i)
p.data[p.w*3-1-i] = c.num_color[i];
p.data[p.w*3-1-i] = num_variants_x;
p.data[p.w*3-2-i] = num_variants_y;
p.data[p.w*3-3-i] = short_side;
p.data[p.w*3-4-i] = 0xc0;
if (c->is_corner) {
// write out binary information in first line of image
for (i=0; i < 4; ++i)
data[w*3-1-i] = c->num_color[i];
data[w*3-1-i] = c->num_vary_x;
data[w*3-2-i] = c->num_vary_y;
data[w*3-3-i] = c->short_side_len;
data[w*3-4-i] = 0xc0;
} else {
for (i=0; i < 6; ++i)
data[w*3-1-i] = c->num_color[i];
data[w*3-1-i] = c->num_vary_x;
data[w*3-2-i] = c->num_vary_y;
data[w*3-3-i] = c->short_side_len;
}
// make it more obvious it encodes actual data
for (i=0; i < 9; ++i)
p.data[p.w*3 - 1 - i] ^= i*55;
stbi_write_png(argv[1], p.w, p.h, 3, p.data, p.w*3);
return 0;
return 1;
}
/*
// number of colors for each edge based on above diagram:
int edge_colors[6] = { 1,1,1,1,1,1, };
// number of duplicates with the exact same edge colors
int num_variants_x = 4;
int num_variants_y = 4;
// total number of items in complete set:
//
// horizontal items:
// ec[0] * ec[1] * ec[2] * ec[3] * ec[4] * ec[2] * num_variants_x * num_variants_y
//
// vertical items:
// ec[0] * ce[1] * ce[5] * ce[3] * ec[4] * ec[5] * num_variants_x * num_variants_y
// number of tiles along the short side
int short_side = 12;
int main(int argc, char **argv)
{
int w,h,i;
unsigned char *data;
if (argc != 2) {
fprintf(stderr, "Usage: gentemplate {filename}\n");
return 1;
}
memcpy(ec, edge_colors, sizeof(edge_colors));
num_vx = num_variants_x;
num_vy = num_variants_y;
data = process_image(NULL, &w, &h, short_side);
// write out binary information in first line of image
for (i=0; i < 6; ++i)
data[w*3-1-i] = ec[i];
data[w*3-1-i] = num_variants_x;
data[w*3-2-i] = num_variants_y;
data[w*3-3-i] = short_side;
// make it more obvious it encodes actual data
for (i=0; i < 9; ++i)
data[w*3 - 1 - i] ^= i*55;
stbi_write_png(argv[1], w, h, 3, data, w*3);
return 0;
}
*/

View File

@ -1,8 +1,87 @@
#define STB_HERRINGBONE_WANG_TILE_IMPLEMENTATION
#include "stb_herringbone_wang_tile.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
// e 12 1 1 1 1 1 1 4 4
int main(int argc, char **argv)
{
return 0;
}
stbhw_config c = { 0 };
int w,h, num_colors,i;
unsigned char *data;
if (argc == 1) goto usage;
if (argc < 3) goto error;
switch (argv[2][0]) {
case 'c':
if (argc < 8 || argc > 10)
goto error;
num_colors = 4;
c.is_corner = 1;
break;
case 'e':
if (argc < 10 || argc > 12)
goto error;
num_colors = 6;
c.is_corner = 0;
break;
default:
goto error;
}
c.short_side_len = atoi(argv[3]);
for (i=0; i < num_colors; ++i)
c.num_color[i] = atoi(argv[4+i]);
c.num_vary_x = 1;
c.num_vary_y = 1;
if (argc > 4+i)
c.num_vary_x = atoi(argv[4+i]);
if (argc > 5+i)
c.num_vary_y = atoi(argv[5+i]);
stbhw_get_template_size(&c, &w, &h);
data = (unsigned char *) malloc(w*h*3);
if (stbhw_make_template(&c, data, w, h, w*3))
stbi_write_png(argv[1], w, h, 3, data, w*3);
else
fprintf(stderr, "Error: %s\n", stbhw_get_last_error());
return 0;
error:
fputs("Invalid command-line arguments\n\n", stderr);
usage:
fputs("Usage (see source for corner & edge type definitions):\n\n", stderr);
fputs("herringbone_generator {outfile} c {sidelen} {c0} {c1} {c2} {c3} [{vx} {vy}]\n"
" {outfile} -- filename that template will be written to as PNG\n"
" {sidelen} -- length of short side of rectangle in pixels\n"
" {c0} -- number of colors for corner type 0\n"
" {c1} -- number of colors for corner type 1\n"
" {c2} -- number of colors for corner type 2\n"
" {c3} -- number of colors for corner type 3\n"
" {vx} -- number of color-duplicating variations horizontally in template\n"
" {vy} -- number of color-duplicating variations vertically in template\n"
"\n"
, stderr);
fputs("herringbone_generator {outfile} e {sidelen} {e0} {e1} {e2} {e3} {e4} {e5} [{vx} {vy}]\n"
" {outfile} -- filename that template will be written to as PNG\n"
" {sidelen} -- length of short side of rectangle in pixels\n"
" {e0} -- number of colors for edge type 0\n"
" {e1} -- number of colors for edge type 1\n"
" {e2} -- number of colors for edge type 2\n"
" {e3} -- number of colors for edge type 3\n"
" {e4} -- number of colors for edge type 4\n"
" {e5} -- number of colors for edge type 5\n"
" {vx} -- number of color-duplicating variations horizontally in template\n"
" {vy} -- number of color-duplicating variations vertically in template\n"
, stderr);
return 1;
}