1 // Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved
6 #include "vg_platform.h"
11 u32 optimize_test_compile
= 0;
15 * -------------------------------------------------------------------------- */
18 vg_info( "running script: s_build(void)\n" );
20 vg_build
.optimization
= optimize_test_compile
;
22 vg_build
.platform
= k_platform_linux
;
23 vg_build
.arch
= k_architecture_x86_64
;
24 vg_build
.compiler
= k_compiler_clang
;
25 vg_build
.libc
= k_libc_version_native
;
27 vg_build_new( "texsheet" );
28 vg_add_source( "src/texsheet.c" );
29 vg_compile( "texsheet" );
31 vg_success( "Completed 1/1\n" );
34 int main( int argc
, char *argv
[] ){
36 while( vg_argp( argc
, argv
) ){
37 if( vg_long_opt( "native" ) )
41 optimize_test_compile
= 3;
44 if( vg_build
.warnings
)
45 vg_warn( "Finished with %u warnings\n", vg_build
.warnings
);
47 vg_success( "All scripts ran successfully\n" );
55 #define STB_IMAGE_IMPLEMENTATION
56 #include "submodules/stb/stb_image.h"
58 #define QOI_IMPLEMENTATION
59 #include "submodules/qoi/qoi.h"
68 int image_sort( const void* a
, const void* b
)
70 struct image_src
*p_a
= (struct image_src
*)a
;
71 struct image_src
*p_b
= (struct image_src
*)b
;
73 if( p_a
->x
== p_b
->x
)
75 else if ( p_a
->x
< p_b
->x
)
81 int main( int argc
, const char *argv
[] )
83 struct image_src
*source_images
= malloc( sizeof( struct image_src
) * argc
);
89 vg_info( "Usage: %s \\\n[output_image output_header name images...]\n",
96 FILE *fp
= fopen( argv
[2], "w" );
99 vg_error( "Could not open file for writing\n" );
103 fprintf( fp
, "enum %s_index\n{\n", argv
[3] );
107 stbi_set_flip_vertically_on_load(1);
109 for( int i
= 4; i
< argc
; i
++ )
111 struct image_src
*src
= &source_images
[ num_images
];
112 src
->data
= (u8
*)stbi_load( argv
[i
], &src
->x
, &src
->y
, &src
->ch
, 4 );
115 int j
= 0; int ext
= 0;
116 for( ; j
< vg_list_size( name
)-1; j
++ )
120 name
[j
] = argv
[i
][j
];
125 if( name
[j
] == '.' || name
[j
] == '-' )
137 fprintf( fp
, "\tk_sprite_%s,\n", name
);
141 if( src
->x
!= src
->y
)
143 vg_error( "Non-square images are currently not supported ('%s')\n", argv
[i
] );
150 vg_error( "Could not decode '%s'\n", argv
[i
] );
153 fprintf( fp
, "};\n\n" );
157 qsort( source_images
, num_images
, sizeof(struct image_src
), image_sort
);
161 fprintf( fp
, "static struct vg_sprite %s[] = \n{\n", argv
[3] );
163 u8
*dest
= (u8
*)malloc( 1024*1024*4 );
165 for( int i
= 0; i
< 1024*1024; i
++ )
187 for( int i
= 0; i
< num_images
; i
++ )
189 struct image_src
*psrc
= &source_images
[ i
];
194 struct region
*pregion
= ®ion_stack
[ stack_h
];
196 if( (pregion
->p0
[ 0 ] + psrc
->x
<= pregion
->p1
[0]) && (pregion
->p0
[ 1 ] + psrc
->y
<= pregion
->p1
[1]) )
198 // Passed, add image and create subdivisions
199 fprintf( fp
, "\t{{ %f, %f, %f, %f }}",
200 (float)pregion
->p0
[0] / 1024.0f
,
201 (float)pregion
->p0
[1] / 1024.0f
,
202 (float)psrc
->x
/ 1024.0f
,
203 (float)psrc
->y
/ 1024.0f
206 if( i
!= num_images
-1 )
212 for( int y
= 0; y
< psrc
->y
; y
++ )
214 int px
= pregion
->p0
[0];
215 int py
= pregion
->p0
[1] + y
;
217 memcpy( &dest
[ (py
*1024+px
) * 4 ], &psrc
->data
[ y
*psrc
->x
*4 ], psrc
->x
*4 );
222 struct region
*new_region
= ®ion_stack
[ stack_h
];
224 new_region
->p0
[0] = pregion
->p0
[0] + psrc
->x
;
225 new_region
->p0
[1] = pregion
->p0
[1];
226 new_region
->p1
[0] = pregion
->p1
[0];
227 new_region
->p1
[1] = pregion
->p0
[1] + psrc
->y
;
229 pregion
->p0
[ 1 ] += psrc
->y
;
234 // Failed, loop up to next region if can
237 vg_error( "Could not fit image %d. Pack failed\n", i
);
253 qoi_write( argv
[1], dest
, &(qoi_desc
){
257 .colorspace
= QOI_SRGB
262 for( int i
= 0; i
< num_images
; i
++ )
263 free( source_images
[ i
].data
);
265 free( source_images
);
267 vg_success( "Processed %u images\n", num_images
);