Fix trailing whitespace
This commit is contained in:
parent
7a69424f15
commit
2bb4a0accd
198
stb.h
198
stb.h
@ -8,16 +8,16 @@
|
|||||||
Unit tests: http://nothings.org/stb/stb.c
|
Unit tests: http://nothings.org/stb/stb.c
|
||||||
|
|
||||||
============================================================================
|
============================================================================
|
||||||
You MUST
|
You MUST
|
||||||
|
|
||||||
#define STB_DEFINE
|
#define STB_DEFINE
|
||||||
|
|
||||||
in EXACTLY _one_ C or C++ file that includes this header, BEFORE the
|
in EXACTLY _one_ C or C++ file that includes this header, BEFORE the
|
||||||
include, like this:
|
include, like this:
|
||||||
|
|
||||||
#define STB_DEFINE
|
#define STB_DEFINE
|
||||||
#include "stb.h"
|
#include "stb.h"
|
||||||
|
|
||||||
All other files should just #include "stb.h" without the #define.
|
All other files should just #include "stb.h" without the #define.
|
||||||
============================================================================
|
============================================================================
|
||||||
|
|
||||||
@ -308,14 +308,14 @@ CREDITS
|
|||||||
#ifndef rad2deg
|
#ifndef rad2deg
|
||||||
#define rad2deg(a) ((a)*(180/M_PI))
|
#define rad2deg(a) ((a)*(180/M_PI))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef swap
|
#ifndef swap
|
||||||
#ifndef __cplusplus
|
#ifndef __cplusplus
|
||||||
#define swap(TYPE,a,b) \
|
#define swap(TYPE,a,b) \
|
||||||
do { TYPE stb__t; stb__t = (a); (a) = (b); (b) = stb__t; } while (0)
|
do { TYPE stb__t; stb__t = (a); (a) = (b); (b) = stb__t; } while (0)
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef unsigned char uint8 ;
|
typedef unsigned char uint8 ;
|
||||||
typedef signed char int8 ;
|
typedef signed char int8 ;
|
||||||
typedef unsigned short uint16;
|
typedef unsigned short uint16;
|
||||||
@ -464,7 +464,7 @@ static char *stb_p_strncpy_s(char *a, size_t size, const char *b, size_t count)
|
|||||||
#define stb_p_mktemp(s) (mktemp(s) != NULL)
|
#define stb_p_mktemp(s) (mktemp(s) != NULL)
|
||||||
|
|
||||||
#define stb_p_sprintf sprintf
|
#define stb_p_sprintf sprintf
|
||||||
#define stb_p_size(x)
|
#define stb_p_size(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
@ -2165,7 +2165,7 @@ static char **stb_tokens_raw(char *src_, char *delimit, int *count,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
while (nested || !stb_tokentable[*s]) {
|
while (nested || !stb_tokentable[*s]) {
|
||||||
if (stable[*s]) {
|
if (stable[*s]) {
|
||||||
if (!*s) break;
|
if (!*s) break;
|
||||||
@ -2808,7 +2808,7 @@ static void * stb__alloc_chunk(stb__alloc *src, int size, int align, int pre_ali
|
|||||||
if (c->next) {
|
if (c->next) {
|
||||||
p = stb__try_chunk(c->next, size, align, pre_align);
|
p = stb__try_chunk(c->next, size, align, pre_align);
|
||||||
if (p) { ++c->alloc; return p; }
|
if (p) { ++c->alloc; return p; }
|
||||||
|
|
||||||
// put the bigger chunk first, since the second will get buried
|
// put the bigger chunk first, since the second will get buried
|
||||||
// the upshot of this is that, until it gets allocated from, chunk #2
|
// the upshot of this is that, until it gets allocated from, chunk #2
|
||||||
// is always the largest remaining chunk. (could formalize
|
// is always the largest remaining chunk. (could formalize
|
||||||
@ -3009,7 +3009,7 @@ void *stb_realloc(void *ptr, size_t newsize)
|
|||||||
|
|
||||||
if (ptr == NULL) return stb_malloc(NULL, newsize);
|
if (ptr == NULL) return stb_malloc(NULL, newsize);
|
||||||
if (newsize == 0) { stb_free(ptr); return NULL; }
|
if (newsize == 0) { stb_free(ptr); return NULL; }
|
||||||
|
|
||||||
t = stb__identify(ptr);
|
t = stb__identify(ptr);
|
||||||
assert(t == STB__alloc || t == STB__nochildren);
|
assert(t == STB__alloc || t == STB__nochildren);
|
||||||
|
|
||||||
@ -3172,7 +3172,7 @@ typedef struct
|
|||||||
#define stb_arr_len2(a) ((stb__arr *) (a) ? stb_arrhead2(a)->len : 0)
|
#define stb_arr_len2(a) ((stb__arr *) (a) ? stb_arrhead2(a)->len : 0)
|
||||||
#define stb_arr_lastn(a) (stb_arr_len(a)-1)
|
#define stb_arr_lastn(a) (stb_arr_len(a)-1)
|
||||||
|
|
||||||
// check whether a given index is valid -- tests 0 <= i < stb_arr_len(a)
|
// check whether a given index is valid -- tests 0 <= i < stb_arr_len(a)
|
||||||
#define stb_arr_valid(a,i) (a ? (int) (i) < stb_arrhead(a)->len : 0)
|
#define stb_arr_valid(a,i) (a ? (int) (i) < stb_arrhead(a)->len : 0)
|
||||||
|
|
||||||
// change the array length so is is exactly N entries long, creating
|
// change the array length so is is exactly N entries long, creating
|
||||||
@ -3907,7 +3907,7 @@ int stb_ischar(char c, char *set)
|
|||||||
|
|
||||||
#define STB_nocopy(x) (x)
|
#define STB_nocopy(x) (x)
|
||||||
#define STB_nodelete(x) 0
|
#define STB_nodelete(x) 0
|
||||||
#define STB_nofields
|
#define STB_nofields
|
||||||
#define STB_nonullvalue(x)
|
#define STB_nonullvalue(x)
|
||||||
#define STB_nullvalue(x) x
|
#define STB_nullvalue(x) x
|
||||||
#define STB_safecompare(x) x
|
#define STB_safecompare(x) x
|
||||||
@ -4283,7 +4283,7 @@ void stb_uidict_reset(stb_uidict *e)
|
|||||||
// An stb_ptrmap data structure is an O(1) hash table storing an arbitrary
|
// An stb_ptrmap data structure is an O(1) hash table storing an arbitrary
|
||||||
// block of data for a given pair of pointers.
|
// block of data for a given pair of pointers.
|
||||||
//
|
//
|
||||||
// If create=0, returns
|
// If create=0, returns
|
||||||
|
|
||||||
typedef struct stb__st_stb_spmatrix stb_spmatrix;
|
typedef struct stb__st_stb_spmatrix stb_spmatrix;
|
||||||
|
|
||||||
@ -4345,13 +4345,13 @@ void *stb_sparse_ptr_matrix_get(stb_spmatrix *z, void *a, void *b, int create)
|
|||||||
//
|
//
|
||||||
// if "use_arena=1", then strings will be copied
|
// if "use_arena=1", then strings will be copied
|
||||||
// into blocks and never freed until the sdict is freed;
|
// into blocks and never freed until the sdict is freed;
|
||||||
// otherwise they're malloc()ed and free()d on the fly.
|
// otherwise they're malloc()ed and free()d on the fly.
|
||||||
// (specify use_arena=1 if you never stb_sdict_remove)
|
// (specify use_arena=1 if you never stb_sdict_remove)
|
||||||
|
|
||||||
stb_declare_hash(STB_EXTERN, stb_sdict, stb_sdict_, char *, void *)
|
stb_declare_hash(STB_EXTERN, stb_sdict, stb_sdict_, char *, void *)
|
||||||
|
|
||||||
STB_EXTERN stb_sdict * stb_sdict_new(int use_arena);
|
STB_EXTERN stb_sdict * stb_sdict_new(int use_arena);
|
||||||
STB_EXTERN stb_sdict * stb_sdict_copy(stb_sdict*);
|
STB_EXTERN stb_sdict * stb_sdict_copy(stb_sdict*);
|
||||||
STB_EXTERN void stb_sdict_delete(stb_sdict *);
|
STB_EXTERN void stb_sdict_delete(stb_sdict *);
|
||||||
STB_EXTERN void * stb_sdict_change(stb_sdict *, char *str, void *p);
|
STB_EXTERN void * stb_sdict_change(stb_sdict *, char *str, void *p);
|
||||||
STB_EXTERN int stb_sdict_count(stb_sdict *d);
|
STB_EXTERN int stb_sdict_count(stb_sdict *d);
|
||||||
@ -4425,7 +4425,7 @@ stb_sdict* stb_sdict_copy(stb_sdict *old)
|
|||||||
else if (new_arena)
|
else if (new_arena)
|
||||||
stb_free(new_arena);
|
stb_free(new_arena);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void stb_sdict_delete(stb_sdict *d)
|
void stb_sdict_delete(stb_sdict *d)
|
||||||
@ -4804,7 +4804,7 @@ static stb__memory_leaf *stb__nptr_find_leaf(void *mem)
|
|||||||
if (z)
|
if (z)
|
||||||
return z->children[STB__NPTR_NODE_OFFSET(address)];
|
return z->children[STB__NPTR_NODE_OFFSET(address)];
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void * stb__nptr_alloc(int size)
|
static void * stb__nptr_alloc(int size)
|
||||||
@ -4924,7 +4924,7 @@ void stb__nptr_block(void *address, int len, void (*function)(stb__memory_leaf *
|
|||||||
int b0 = start >> STB__NPTR_ROOT_SHIFT;
|
int b0 = start >> STB__NPTR_ROOT_SHIFT;
|
||||||
int b1 = end >> STB__NPTR_ROOT_SHIFT;
|
int b1 = end >> STB__NPTR_ROOT_SHIFT;
|
||||||
int b=b0,i,e0,e1;
|
int b=b0,i,e0,e1;
|
||||||
|
|
||||||
e0 = STB__NPTR_NODE_OFFSET(start);
|
e0 = STB__NPTR_NODE_OFFSET(start);
|
||||||
|
|
||||||
if (datum <= 0) {
|
if (datum <= 0) {
|
||||||
@ -5896,7 +5896,7 @@ int stb_size_varlen64(stb_uint64 v)
|
|||||||
if (v < STB_IMM_UINT64(0x0000000800000000)) return 5;
|
if (v < STB_IMM_UINT64(0x0000000800000000)) return 5;
|
||||||
if (v < STB_IMM_UINT64(0x0000040000000000)) return 6;
|
if (v < STB_IMM_UINT64(0x0000040000000000)) return 6;
|
||||||
if (v < STB_IMM_UINT64(0x0002000000000000)) return 7;
|
if (v < STB_IMM_UINT64(0x0002000000000000)) return 7;
|
||||||
if (v < STB_IMM_UINT64(0x0100000000000000)) return 8;
|
if (v < STB_IMM_UINT64(0x0100000000000000)) return 8;
|
||||||
return 9;
|
return 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5914,7 +5914,7 @@ void stb_fput_varlen64(FILE *f, stb_uint64 v)
|
|||||||
if (z >= STB_IMM_UINT64(0x00000010000000)) fputc((first ? 0xF0 : 0)+(char)(z>>32),f), first=0;
|
if (z >= STB_IMM_UINT64(0x00000010000000)) fputc((first ? 0xF0 : 0)+(char)(z>>32),f), first=0;
|
||||||
if (z >= STB_IMM_UINT64(0x00000000200000)) fputc((first ? 0xE0 : 0)+(char)(z>>24),f), first=0;
|
if (z >= STB_IMM_UINT64(0x00000000200000)) fputc((first ? 0xE0 : 0)+(char)(z>>24),f), first=0;
|
||||||
if (z >= STB_IMM_UINT64(0x00000000004000)) fputc((first ? 0xC0 : 0)+(char)(z>>16),f), first=0;
|
if (z >= STB_IMM_UINT64(0x00000000004000)) fputc((first ? 0xC0 : 0)+(char)(z>>16),f), first=0;
|
||||||
if (z >= STB_IMM_UINT64(0x00000000000080)) fputc((first ? 0x80 : 0)+(char)(z>> 8),f), first=0;
|
if (z >= STB_IMM_UINT64(0x00000000000080)) fputc((first ? 0x80 : 0)+(char)(z>> 8),f), first=0;
|
||||||
fputc((char)z,f);
|
fputc((char)z,f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6395,9 +6395,9 @@ stb_dirtree2 *stb_dirtree2_from_files(char **filelist, int count)
|
|||||||
#define STB_ADLER32_SEED 1
|
#define STB_ADLER32_SEED 1
|
||||||
#define STB_CRC32_SEED 0 // note that we logical NOT this in the code
|
#define STB_CRC32_SEED 0 // note that we logical NOT this in the code
|
||||||
|
|
||||||
STB_EXTERN stb_uint
|
STB_EXTERN stb_uint
|
||||||
stb_adler32(stb_uint adler32, stb_uchar *buffer, stb_uint buflen);
|
stb_adler32(stb_uint adler32, stb_uchar *buffer, stb_uint buflen);
|
||||||
STB_EXTERN stb_uint
|
STB_EXTERN stb_uint
|
||||||
stb_crc32_block(stb_uint crc32, stb_uchar *buffer, stb_uint len);
|
stb_crc32_block(stb_uint crc32, stb_uchar *buffer, stb_uint len);
|
||||||
STB_EXTERN stb_uint stb_crc32(unsigned char *buffer, stb_uint len);
|
STB_EXTERN stb_uint stb_crc32(unsigned char *buffer, stb_uint len);
|
||||||
|
|
||||||
@ -6603,7 +6603,7 @@ int stb_sha1_file(stb_uchar output[20], char *file)
|
|||||||
buffer[n++] = 0x80;
|
buffer[n++] = 0x80;
|
||||||
|
|
||||||
// if there isn't enough room for the length, double the block
|
// if there isn't enough room for the length, double the block
|
||||||
if (n + 8 > 64)
|
if (n + 8 > 64)
|
||||||
block = 128;
|
block = 128;
|
||||||
|
|
||||||
// pad to end
|
// pad to end
|
||||||
@ -6661,7 +6661,7 @@ void stb_sha1_readable(char display[27], unsigned char sha[20])
|
|||||||
num_bits -= 6;
|
num_bits -= 6;
|
||||||
}
|
}
|
||||||
assert(num_bits == 20*8 - 26*6);
|
assert(num_bits == 20*8 - 26*6);
|
||||||
display[o++] = encoding[acc];
|
display[o++] = encoding[acc];
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // STB_DEFINE
|
#endif // STB_DEFINE
|
||||||
@ -6690,7 +6690,7 @@ STB_EXTERN void stb_reg_write_string(void *zreg, const char *str, const char *
|
|||||||
|
|
||||||
STB_EXTERN __declspec(dllimport) long __stdcall RegCloseKey ( HKEY hKey );
|
STB_EXTERN __declspec(dllimport) long __stdcall RegCloseKey ( HKEY hKey );
|
||||||
STB_EXTERN __declspec(dllimport) long __stdcall RegCreateKeyExA ( HKEY hKey, const char * lpSubKey,
|
STB_EXTERN __declspec(dllimport) long __stdcall RegCreateKeyExA ( HKEY hKey, const char * lpSubKey,
|
||||||
int Reserved, char * lpClass, int dwOptions,
|
int Reserved, char * lpClass, int dwOptions,
|
||||||
int samDesired, void *lpSecurityAttributes, HKEY * phkResult, int * lpdwDisposition );
|
int samDesired, void *lpSecurityAttributes, HKEY * phkResult, int * lpdwDisposition );
|
||||||
STB_EXTERN __declspec(dllimport) long __stdcall RegDeleteKeyA ( HKEY hKey, const char * lpSubKey );
|
STB_EXTERN __declspec(dllimport) long __stdcall RegDeleteKeyA ( HKEY hKey, const char * lpSubKey );
|
||||||
STB_EXTERN __declspec(dllimport) long __stdcall RegQueryValueExA ( HKEY hKey, const char * lpValueName,
|
STB_EXTERN __declspec(dllimport) long __stdcall RegQueryValueExA ( HKEY hKey, const char * lpValueName,
|
||||||
@ -6936,7 +6936,7 @@ int stb_cfg_delete(stb_cfg *z, char *key)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i=0; i < stb_arr_len(z->data); ++i)
|
for (i=0; i < stb_arr_len(z->data); ++i)
|
||||||
if (!stb_stricmp(z->data[i].key, key)) {
|
if (!stb_stricmp(z->data[i].key, key)) {
|
||||||
stb_arr_fastdelete(z->data, i);
|
stb_arr_fastdelete(z->data, i);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -7147,7 +7147,7 @@ static void stb__dirtree_scandir(char *path, time_t last_time, stb_dirtree *acti
|
|||||||
int has_slash;
|
int has_slash;
|
||||||
if (stb__showfile) printf("<");
|
if (stb__showfile) printf("<");
|
||||||
|
|
||||||
has_slash = (path[0] && path[strlen(path)-1] == '/');
|
has_slash = (path[0] && path[strlen(path)-1] == '/');
|
||||||
|
|
||||||
// @TODO: do this concatenation without using swprintf to avoid this mess:
|
// @TODO: do this concatenation without using swprintf to avoid this mess:
|
||||||
#if (defined(_MSC_VER) && _MSC_VER < 1400) // || (defined(__clang__))
|
#if (defined(_MSC_VER) && _MSC_VER < 1400) // || (defined(__clang__))
|
||||||
@ -7585,7 +7585,7 @@ void stb_wrapper_malloc(void *p, size_t sz, char *file, int line)
|
|||||||
void stb_wrapper_free(void *p, char *file, int line)
|
void stb_wrapper_free(void *p, char *file, int line)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
if (p == NULL) return;
|
if (p == NULL) return;
|
||||||
|
|
||||||
n = stb__hashfind(p);
|
n = stb__hashfind(p);
|
||||||
@ -7609,7 +7609,7 @@ void stb_wrapper_free(void *p, char *file, int line)
|
|||||||
void stb_wrapper_check(void *p)
|
void stb_wrapper_check(void *p)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
if (p == NULL) return;
|
if (p == NULL) return;
|
||||||
|
|
||||||
n = stb__hashfind(p);
|
n = stb__hashfind(p);
|
||||||
@ -8118,7 +8118,7 @@ stb_ps *stb_ps_remove_any(stb_ps *ps, void **value)
|
|||||||
if (count == 2) {
|
if (count == 2) {
|
||||||
void *leftover = b->p[slast]; // second to last
|
void *leftover = b->p[slast]; // second to last
|
||||||
stb_bucket_free(b);
|
stb_bucket_free(b);
|
||||||
return (stb_ps *) leftover;
|
return (stb_ps *) leftover;
|
||||||
}
|
}
|
||||||
return ps;
|
return ps;
|
||||||
}
|
}
|
||||||
@ -8450,7 +8450,7 @@ unsigned int stb_rand()
|
|||||||
int idx = stb__mt_index;
|
int idx = stb__mt_index;
|
||||||
unsigned int s,r;
|
unsigned int s,r;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (idx >= STB__MT_LEN*sizeof(unsigned int)) {
|
if (idx >= STB__MT_LEN*sizeof(unsigned int)) {
|
||||||
if (idx > STB__MT_LEN*sizeof(unsigned int))
|
if (idx > STB__MT_LEN*sizeof(unsigned int))
|
||||||
stb_srand(0);
|
stb_srand(0);
|
||||||
@ -8464,19 +8464,19 @@ unsigned int stb_rand()
|
|||||||
s = STB__TWIST(b, i, i+1);
|
s = STB__TWIST(b, i, i+1);
|
||||||
b[i] = b[i - STB__MT_IB] ^ (s >> 1) ^ STB__MAGIC(s);
|
b[i] = b[i - STB__MT_IB] ^ (s >> 1) ^ STB__MAGIC(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
s = STB__TWIST(b, STB__MT_LEN-1, 0);
|
s = STB__TWIST(b, STB__MT_LEN-1, 0);
|
||||||
b[STB__MT_LEN-1] = b[STB__MT_IA-1] ^ (s >> 1) ^ STB__MAGIC(s);
|
b[STB__MT_LEN-1] = b[STB__MT_IA-1] ^ (s >> 1) ^ STB__MAGIC(s);
|
||||||
}
|
}
|
||||||
stb__mt_index = idx + sizeof(unsigned int);
|
stb__mt_index = idx + sizeof(unsigned int);
|
||||||
|
|
||||||
r = *(unsigned int *)((unsigned char *)b + idx);
|
r = *(unsigned int *)((unsigned char *)b + idx);
|
||||||
|
|
||||||
r ^= (r >> 11);
|
r ^= (r >> 11);
|
||||||
r ^= (r << 7) & 0x9D2C5680;
|
r ^= (r << 7) & 0x9D2C5680;
|
||||||
r ^= (r << 15) & 0xEFC60000;
|
r ^= (r << 15) & 0xEFC60000;
|
||||||
r ^= (r >> 18);
|
r ^= (r >> 18);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8639,7 +8639,7 @@ void stb_dupe_finish(stb_dupe *sd)
|
|||||||
assert(sd->dupes == NULL);
|
assert(sd->dupes == NULL);
|
||||||
for (i=0; i < sd->hash_size; ++i) {
|
for (i=0; i < sd->hash_size; ++i) {
|
||||||
void ** list = sd->hash_table[i];
|
void ** list = sd->hash_table[i];
|
||||||
if (list != NULL) {
|
if (list != NULL) {
|
||||||
int n = stb_arr_len(list);
|
int n = stb_arr_len(list);
|
||||||
// @TODO: measure to find good numbers instead of just making them up!
|
// @TODO: measure to find good numbers instead of just making them up!
|
||||||
int thresh = (sd->ineq ? 200 : 20);
|
int thresh = (sd->ineq ? 200 : 20);
|
||||||
@ -8955,7 +8955,7 @@ int stb_wordwrap(int *pairs, int pair_max, int count, char *str)
|
|||||||
int n=0,i=0, start=0,nonwhite=0;
|
int n=0,i=0, start=0,nonwhite=0;
|
||||||
if (pairs == NULL) pair_max = 0x7ffffff0;
|
if (pairs == NULL) pair_max = 0x7ffffff0;
|
||||||
else pair_max *= 2;
|
else pair_max *= 2;
|
||||||
// parse
|
// parse
|
||||||
for(;;) {
|
for(;;) {
|
||||||
int s=i; // first whitespace char; last nonwhite+1
|
int s=i; // first whitespace char; last nonwhite+1
|
||||||
int w; // word start
|
int w; // word start
|
||||||
@ -9136,7 +9136,7 @@ int stb__wildmatch_raw2(char *expr, char *candidate, int search, int insensitive
|
|||||||
{
|
{
|
||||||
int where=0;
|
int where=0;
|
||||||
int start = -1;
|
int start = -1;
|
||||||
|
|
||||||
if (!search) {
|
if (!search) {
|
||||||
// parse to first '*'
|
// parse to first '*'
|
||||||
if (*expr != '*')
|
if (*expr != '*')
|
||||||
@ -9150,7 +9150,7 @@ int stb__wildmatch_raw2(char *expr, char *candidate, int search, int insensitive
|
|||||||
if (insensitive) {
|
if (insensitive) {
|
||||||
if (tolower(*candidate) != tolower(*expr))
|
if (tolower(*candidate) != tolower(*expr))
|
||||||
return -1;
|
return -1;
|
||||||
} else
|
} else
|
||||||
if (*candidate != *expr)
|
if (*candidate != *expr)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -9167,7 +9167,7 @@ int stb__wildmatch_raw2(char *expr, char *candidate, int search, int insensitive
|
|||||||
++expr;
|
++expr;
|
||||||
|
|
||||||
// implicit '*' at this point
|
// implicit '*' at this point
|
||||||
|
|
||||||
while (*expr) {
|
while (*expr) {
|
||||||
int o=0;
|
int o=0;
|
||||||
// combine redundant * characters
|
// combine redundant * characters
|
||||||
@ -9196,7 +9196,7 @@ int stb__wildmatch_raw2(char *expr, char *candidate, int search, int insensitive
|
|||||||
// ok, now check if they match
|
// ok, now check if they match
|
||||||
if (stb__match_qstring(candidate+z-o, expr, o, insensitive))
|
if (stb__match_qstring(candidate+z-o, expr, o, insensitive))
|
||||||
return start >= 0 ? start : 0;
|
return start >= 0 ? start : 0;
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
// if yes '*', then do stb__find_qmatch on the intervening chars
|
// if yes '*', then do stb__find_qmatch on the intervening chars
|
||||||
int n = stb__find_qstring(candidate, expr, o, insensitive);
|
int n = stb__find_qstring(candidate, expr, o, insensitive);
|
||||||
@ -9386,7 +9386,7 @@ static char *stb__reg_parse(stb_matcher *matcher, int start, char *regex, stb_ui
|
|||||||
case '{': // not supported!
|
case '{': // not supported!
|
||||||
// @TODO: given {n,m}, clone last_start to last_end m times,
|
// @TODO: given {n,m}, clone last_start to last_end m times,
|
||||||
// and include epsilons from start to first m-n blocks
|
// and include epsilons from start to first m-n blocks
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
case '\\':
|
case '\\':
|
||||||
++regex;
|
++regex;
|
||||||
@ -10114,7 +10114,7 @@ typedef struct
|
|||||||
|
|
||||||
extern stb_info_struct stb_introspect_output[];
|
extern stb_info_struct stb_introspect_output[];
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
STB_EXTERN void stb_introspect_precompiled(stb_info_struct *compiled);
|
STB_EXTERN void stb_introspect_precompiled(stb_info_struct *compiled);
|
||||||
STB_EXTERN void stb__introspect(char *path, char *file);
|
STB_EXTERN void stb__introspect(char *path, char *file);
|
||||||
@ -10216,11 +10216,11 @@ void stb__introspect(char *path, char *file, stb_info_struct *compiled)
|
|||||||
stb__introspect_filename(buffer2, path);
|
stb__introspect_filename(buffer2, path);
|
||||||
|
|
||||||
// get source/include files timestamps, compare to output-file timestamp;
|
// get source/include files timestamps, compare to output-file timestamp;
|
||||||
// if mismatched, regenerate
|
// if mismatched, regenerate
|
||||||
|
|
||||||
if (stb__stat(buffer2, &st))
|
if (stb__stat(buffer2, &st))
|
||||||
needs_building = STB_TRUE;
|
needs_building = STB_TRUE;
|
||||||
|
|
||||||
{
|
{
|
||||||
// find any file that contains an introspection command and is newer
|
// find any file that contains an introspection command and is newer
|
||||||
// if needs_building is already true, we don't need to do this test,
|
// if needs_building is already true, we don't need to do this test,
|
||||||
@ -10316,7 +10316,7 @@ void stb__introspect(char *filename)
|
|||||||
if (t == NULL) stb_fatal("Error parsing %s", filename);
|
if (t == NULL) stb_fatal("Error parsing %s", filename);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -10456,7 +10456,7 @@ stb_uint stb_decompress(stb_uchar *output, stb_uchar *i, stb_uint length)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert(stb__dout <= output + olen);
|
assert(stb__dout <= output + olen);
|
||||||
if (stb__dout > output + olen)
|
if (stb__dout > output + olen)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -10615,7 +10615,7 @@ void stb_compress_window(int z)
|
|||||||
|
|
||||||
static int stb_not_crap(int best, int dist)
|
static int stb_not_crap(int best, int dist)
|
||||||
{
|
{
|
||||||
return ((best > 2 && dist <= 0x00100)
|
return ((best > 2 && dist <= 0x00100)
|
||||||
|| (best > 5 && dist <= 0x04000)
|
|| (best > 5 && dist <= 0x04000)
|
||||||
|| (best > 7 && dist <= 0x80000));
|
|| (best > 7 && dist <= 0x80000));
|
||||||
}
|
}
|
||||||
@ -10702,15 +10702,15 @@ static int stb_compress_chunk(stb_uchar *history,
|
|||||||
stb_out(dist-1);
|
stb_out(dist-1);
|
||||||
} else if (best > 5 && best <= 0x100 && dist <= 0x4000) {
|
} else if (best > 5 && best <= 0x100 && dist <= 0x4000) {
|
||||||
outliterals(lit_start, q-lit_start); lit_start = (q += best);
|
outliterals(lit_start, q-lit_start); lit_start = (q += best);
|
||||||
stb_out2(0x4000 + dist-1);
|
stb_out2(0x4000 + dist-1);
|
||||||
stb_out(best-1);
|
stb_out(best-1);
|
||||||
} else if (best > 7 && best <= 0x100 && dist <= 0x80000) {
|
} else if (best > 7 && best <= 0x100 && dist <= 0x80000) {
|
||||||
outliterals(lit_start, q-lit_start); lit_start = (q += best);
|
outliterals(lit_start, q-lit_start); lit_start = (q += best);
|
||||||
stb_out3(0x180000 + dist-1);
|
stb_out3(0x180000 + dist-1);
|
||||||
stb_out(best-1);
|
stb_out(best-1);
|
||||||
} else if (best > 8 && best <= 0x10000 && dist <= 0x80000) {
|
} else if (best > 8 && best <= 0x10000 && dist <= 0x80000) {
|
||||||
outliterals(lit_start, q-lit_start); lit_start = (q += best);
|
outliterals(lit_start, q-lit_start); lit_start = (q += best);
|
||||||
stb_out3(0x100000 + dist-1);
|
stb_out3(0x100000 + dist-1);
|
||||||
stb_out2(best-1);
|
stb_out2(best-1);
|
||||||
} else if (best > 9 && dist <= 0x1000000) {
|
} else if (best > 9 && dist <= 0x1000000) {
|
||||||
if (best > 65536) best = 65536;
|
if (best > 65536) best = 65536;
|
||||||
@ -10790,7 +10790,7 @@ int stb_compress_tofile(char *filename, char *input, unsigned int length)
|
|||||||
//int maxlen = length + 512 + (length >> 2); // total guess
|
//int maxlen = length + 512 + (length >> 2); // total guess
|
||||||
//char *buffer = (char *) malloc(maxlen);
|
//char *buffer = (char *) malloc(maxlen);
|
||||||
//int blen = stb_compress((stb_uchar*)buffer, (stb_uchar*)input, length);
|
//int blen = stb_compress((stb_uchar*)buffer, (stb_uchar*)input, length);
|
||||||
|
|
||||||
stb__out = NULL;
|
stb__out = NULL;
|
||||||
stb__outfile = stb_p_fopen(filename, "wb");
|
stb__outfile = stb_p_fopen(filename, "wb");
|
||||||
if (!stb__outfile) return 0;
|
if (!stb__outfile) return 0;
|
||||||
@ -10810,7 +10810,7 @@ int stb_compress_intofile(FILE *f, char *input, unsigned int length)
|
|||||||
//int maxlen = length + 512 + (length >> 2); // total guess
|
//int maxlen = length + 512 + (length >> 2); // total guess
|
||||||
//char *buffer = (char*)malloc(maxlen);
|
//char *buffer = (char*)malloc(maxlen);
|
||||||
//int blen = stb_compress((stb_uchar*)buffer, (stb_uchar*)input, length);
|
//int blen = stb_compress((stb_uchar*)buffer, (stb_uchar*)input, length);
|
||||||
|
|
||||||
stb__out = NULL;
|
stb__out = NULL;
|
||||||
stb__outfile = f;
|
stb__outfile = f;
|
||||||
if (!stb__outfile) return 0;
|
if (!stb__outfile) return 0;
|
||||||
@ -10986,7 +10986,7 @@ void stb_write(char *data, int data_len)
|
|||||||
memmove(xtb.buffer, xtb.buffer + flush, xtb.valid - flush);
|
memmove(xtb.buffer, xtb.buffer + flush, xtb.valid - flush);
|
||||||
xtb.start -= flush;
|
xtb.start -= flush;
|
||||||
xtb.valid -= flush;
|
xtb.valid -= flush;
|
||||||
|
|
||||||
for (i=0; i <= xtb.hashmask; ++i)
|
for (i=0; i <= xtb.hashmask; ++i)
|
||||||
if (xtb.chash[i] < xtb.buffer + flush)
|
if (xtb.chash[i] < xtb.buffer + flush)
|
||||||
xtb.chash[i] = NULL;
|
xtb.chash[i] = NULL;
|
||||||
@ -11711,7 +11711,7 @@ void stb_mutex_end(void *p)
|
|||||||
#endif // _WINDOWS_
|
#endif // _WINDOWS_
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// for future reference,
|
// for future reference,
|
||||||
// InterlockedCompareExchange for x86:
|
// InterlockedCompareExchange for x86:
|
||||||
int cas64_mp(void * dest, void * xcmp, void * xxchg) {
|
int cas64_mp(void * dest, void * xcmp, void * xxchg) {
|
||||||
__asm
|
__asm
|
||||||
@ -11751,7 +11751,7 @@ inline unsigned __int64 _InterlockedCompareExchange64(volatile unsigned __int64
|
|||||||
mov ecx,4[edi];
|
mov ecx,4[edi];
|
||||||
mov esi,dest;
|
mov esi,dest;
|
||||||
lock CMPXCHG8B [esi];
|
lock CMPXCHG8B [esi];
|
||||||
}
|
}
|
||||||
#endif // #if 0
|
#endif // #if 0
|
||||||
|
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
@ -12321,7 +12321,7 @@ static void * stb__io_task(void *p)
|
|||||||
FILE *f;
|
FILE *f;
|
||||||
stb_uchar *buf;
|
stb_uchar *buf;
|
||||||
|
|
||||||
if (dc->stat_out) {
|
if (dc->stat_out) {
|
||||||
struct _stati64 s;
|
struct _stati64 s;
|
||||||
if (!_stati64(dc->filename, &s)) {
|
if (!_stati64(dc->filename, &s)) {
|
||||||
dc->stat_out->filesize = s.st_size;
|
dc->stat_out->filesize = s.st_size;
|
||||||
@ -12356,7 +12356,7 @@ static void * stb__io_task(void *p)
|
|||||||
len = ftell(f) - dc->offset;
|
len = ftell(f) - dc->offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fseek(f, dc->offset, SEEK_SET)) {
|
if (fseek(f, dc->offset, SEEK_SET)) {
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return stb__io_error(dc);
|
return stb__io_error(dc);
|
||||||
}
|
}
|
||||||
@ -12628,7 +12628,7 @@ static stb__span *stb__alloc_span(int pagecount)
|
|||||||
if (p == NULL) return 0;
|
if (p == NULL) return 0;
|
||||||
} else
|
} else
|
||||||
stb__spanlist_unlink(p);
|
stb__spanlist_unlink(p);
|
||||||
|
|
||||||
if (p->len > pagecount) {
|
if (p->len > pagecount) {
|
||||||
stb__span *q = stb__span_alloc();
|
stb__span *q = stb__span_alloc();
|
||||||
if (q) {
|
if (q) {
|
||||||
@ -12886,7 +12886,7 @@ char *stb__get_sourcefile_path(char *file)
|
|||||||
stb_p_sprintf(filebuf stb_p_size(sizeof(filebuf)), "../%s", file);
|
stb_p_sprintf(filebuf stb_p_size(sizeof(filebuf)), "../%s", file);
|
||||||
if (!stb_fexists(filebuf)) return filebuf;
|
if (!stb_fexists(filebuf)) return filebuf;
|
||||||
|
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -12971,7 +12971,7 @@ static void stb__constant_parse(stb__FileEntry *f, int i)
|
|||||||
matched_int: {
|
matched_int: {
|
||||||
int neg=0;
|
int neg=0;
|
||||||
s = stb_skipwhite(s);
|
s = stb_skipwhite(s);
|
||||||
while (*s == '-') { neg = !neg; s = stb_skipwhite(s+1); } // handle '- - 5', pointlessly
|
while (*s == '-') { neg = !neg; s = stb_skipwhite(s+1); } // handle '- - 5', pointlessly
|
||||||
if (s[0] == '0' && tolower(s[1]) == 'x')
|
if (s[0] == '0' && tolower(s[1]) == 'x')
|
||||||
f->entries[i].ival = strtol(s, NULL, 16);
|
f->entries[i].ival = strtol(s, NULL, 16);
|
||||||
else if (s[0] == '0')
|
else if (s[0] == '0')
|
||||||
@ -13165,7 +13165,7 @@ static float stu__getfloat(stua_obj v)
|
|||||||
return *(float *) &n;
|
return *(float *) &n;
|
||||||
}
|
}
|
||||||
|
|
||||||
stua_obj stua_float(float f)
|
stua_obj stua_float(float f)
|
||||||
{
|
{
|
||||||
return stu__floatp(&f);
|
return stu__floatp(&f);
|
||||||
}
|
}
|
||||||
@ -13336,7 +13336,7 @@ static void stua_gc(int force)
|
|||||||
// stu__mark everything reachable
|
// stu__mark everything reachable
|
||||||
stu__nil.stua_gc = stu__true.stua_gc = stu__false.stua_gc = 1;
|
stu__nil.stua_gc = stu__true.stua_gc = stu__false.stua_gc = 1;
|
||||||
stu__mark(stua_globals);
|
stu__mark(stua_globals);
|
||||||
if (!stu__number(stu__flow_val))
|
if (!stu__number(stu__flow_val))
|
||||||
stu__mark(stu__flow_val);
|
stu__mark(stu__flow_val);
|
||||||
for (i=0; i < stb_arr_len(stu__gc_root_stack); ++i)
|
for (i=0; i < stb_arr_len(stu__gc_root_stack); ++i)
|
||||||
if (!stu__number(stu__gc_root_stack[i]))
|
if (!stu__number(stu__gc_root_stack[i]))
|
||||||
@ -13344,7 +13344,7 @@ static void stua_gc(int force)
|
|||||||
|
|
||||||
// sweep unreachables
|
// sweep unreachables
|
||||||
for (i=0; i < stb_arr_len(stu__gc_ptrlist);) {
|
for (i=0; i < stb_arr_len(stu__gc_ptrlist);) {
|
||||||
stu__box *z = stu__gc_ptrlist[i];
|
stu__box *z = stu__gc_ptrlist[i];
|
||||||
if (!z->stua_gc) {
|
if (!z->stua_gc) {
|
||||||
switch (z->type) {
|
switch (z->type) {
|
||||||
case STU___dict: stb_idict_destroy((stua_dict *) z); break;
|
case STU___dict: stb_idict_destroy((stua_dict *) z); break;
|
||||||
@ -13354,7 +13354,7 @@ static void stua_gc(int force)
|
|||||||
}
|
}
|
||||||
// swap in the last item over this, and repeat
|
// swap in the last item over this, and repeat
|
||||||
z = stb_arr_pop(stu__gc_ptrlist);
|
z = stb_arr_pop(stu__gc_ptrlist);
|
||||||
stu__gc_ptrlist[i] = z;
|
stu__gc_ptrlist[i] = z;
|
||||||
} else
|
} else
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
@ -13739,7 +13739,7 @@ static stua_obj stu__funceval(stua_obj fo, stua_obj co)
|
|||||||
stu__f = f->code, stu__c = context;
|
stu__f = f->code, stu__c = context;
|
||||||
stu__f_obj = co;
|
stu__f_obj = co;
|
||||||
++stb__stua_nesting;
|
++stb__stua_nesting;
|
||||||
if (stu__f[1])
|
if (stu__f[1])
|
||||||
p = stu__eval(stu__f[1]);
|
p = stu__eval(stu__f[1]);
|
||||||
else
|
else
|
||||||
p = stua_nil;
|
p = stua_nil;
|
||||||
@ -13813,7 +13813,7 @@ static struct { int stu__tok; char *regex; } stu__lexemes[] =
|
|||||||
stua_key4(func,var,let,break) stua_key4(nil,true,false,end)
|
stua_key4(func,var,let,break) stua_key4(nil,true,false,end)
|
||||||
stua_key4(return,continue,as,repeat) stua_key4(_frame,catch,catch,catch)
|
stua_key4(return,continue,as,repeat) stua_key4(_frame,catch,catch,catch)
|
||||||
|
|
||||||
ST_shl, "<<", ST_and, "&&", ST_eq, "==", ST_ge, ">=",
|
ST_shl, "<<", ST_and, "&&", ST_eq, "==", ST_ge, ">=",
|
||||||
ST_shr, ">>", ST_or , "||", ST_ne, "!=", ST_le, "<=",
|
ST_shr, ">>", ST_or , "||", ST_ne, "!=", ST_le, "<=",
|
||||||
ST_shru,">>>", ST_into, "=>",
|
ST_shru,">>>", ST_into, "=>",
|
||||||
T__none, ".",
|
T__none, ".",
|
||||||
@ -13843,7 +13843,7 @@ static void stu__push_func_comp(void)
|
|||||||
static void stu__pop_func_comp(void)
|
static void stu__pop_func_comp(void)
|
||||||
{
|
{
|
||||||
stb_arr_free(stu__pfunc.code);
|
stb_arr_free(stu__pfunc.code);
|
||||||
stb_arr_free(stu__pfunc.data);
|
stb_arr_free(stu__pfunc.data);
|
||||||
stb_idict_destroy(stu__pfunc.locals);
|
stb_idict_destroy(stu__pfunc.locals);
|
||||||
stb_arr_free(stu__pfunc.non_local_refs);
|
stb_arr_free(stu__pfunc.non_local_refs);
|
||||||
stu__pfunc = stb_arr_pop(func_stack);
|
stu__pfunc = stb_arr_pop(func_stack);
|
||||||
@ -14117,7 +14117,7 @@ static int stu__dictdef(int end, int *count)
|
|||||||
if (!stu__accept(',')) break;
|
if (!stu__accept(',')) break;
|
||||||
}
|
}
|
||||||
if (!stu__demand(end))
|
if (!stu__demand(end))
|
||||||
return stu__err(end == ')' ? "Expecting ) at end of function call"
|
return stu__err(end == ')' ? "Expecting ) at end of function call"
|
||||||
: "Expecting } at end of dictionary definition");
|
: "Expecting } at end of dictionary definition");
|
||||||
z = stu__cc2('{', stb_arr_len(dict)/2);
|
z = stu__cc2('{', stb_arr_len(dict)/2);
|
||||||
for (i=0; i < stb_arr_len(dict); ++i)
|
for (i=0; i < stb_arr_len(dict); ++i)
|
||||||
@ -14232,7 +14232,7 @@ static int stu__funcdef(stua_obj *id, stua_obj *result)
|
|||||||
stua_obj v,f=stua_nil;
|
stua_obj v,f=stua_nil;
|
||||||
assert(stu__tok == ST_func);
|
assert(stu__tok == ST_func);
|
||||||
stu__nexttoken();
|
stu__nexttoken();
|
||||||
if (id) {
|
if (id) {
|
||||||
if (!stu__demandv(ST_id, id)) return stu__err("Expecting function name");
|
if (!stu__demandv(ST_id, id)) return stu__err("Expecting function name");
|
||||||
} else
|
} else
|
||||||
stu__accept(ST_id);
|
stu__accept(ST_id);
|
||||||
@ -14418,38 +14418,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -280,7 +280,7 @@ enum
|
|||||||
STB_C_LEX_EQUAL_ARROW( CLEX_eqarrow )
|
STB_C_LEX_EQUAL_ARROW( CLEX_eqarrow )
|
||||||
|
|
||||||
#ifdef STB__clex_define_shifts
|
#ifdef STB__clex_define_shifts
|
||||||
CLEX_shleq, CLEX_shreq,
|
CLEX_shleq, CLEX_shreq,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CLEX_first_unused_token
|
CLEX_first_unused_token
|
||||||
@ -348,7 +348,7 @@ static int stb__clex_iswhite(int x)
|
|||||||
|
|
||||||
static const char *stb__strchr(const char *str, int ch)
|
static const char *stb__strchr(const char *str, int ch)
|
||||||
{
|
{
|
||||||
for (; *str; ++str)
|
for (; *str; ++str)
|
||||||
if (*str == ch)
|
if (*str == ch)
|
||||||
return str;
|
return str;
|
||||||
return 0;
|
return 0;
|
||||||
@ -604,14 +604,14 @@ int stb_c_lexer_get_token(stb_lexer *lexer)
|
|||||||
lexer->string[n] = 0;
|
lexer->string[n] = 0;
|
||||||
return stb__clex_token(lexer, CLEX_id, p, p+n-1);
|
return stb__clex_token(lexer, CLEX_id, p, p+n-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for EOF
|
// check for EOF
|
||||||
STB_C_LEX_0_IS_EOF(
|
STB_C_LEX_0_IS_EOF(
|
||||||
if (*p == 0)
|
if (*p == 0)
|
||||||
return stb__clex_eof(tok);
|
return stb__clex_eof(tok);
|
||||||
)
|
)
|
||||||
|
|
||||||
single_char:
|
single_char:
|
||||||
// not an identifier, return the character as itself
|
// not an identifier, return the character as itself
|
||||||
return stb__clex_token(lexer, *p, p, p);
|
return stb__clex_token(lexer, *p, p, p);
|
||||||
|
|
||||||
@ -929,38 +929,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
// two points, with fast updates when changing reachability (e.g. on one machine
|
// two points, with fast updates when changing reachability (e.g. on one machine
|
||||||
// it was typically 0.2ms w/ 1024x1024 grid). Each grid square must be "open" or
|
// it was typically 0.2ms w/ 1024x1024 grid). Each grid square must be "open" or
|
||||||
// "closed" (traversable or untraversable), and grid squares are only connected
|
// "closed" (traversable or untraversable), and grid squares are only connected
|
||||||
// to their orthogonal neighbors, not diagonally.
|
// to their orthogonal neighbors, not diagonally.
|
||||||
//
|
//
|
||||||
// In one source file, create the implementation by doing something like this:
|
// In one source file, create the implementation by doing something like this:
|
||||||
//
|
//
|
||||||
@ -17,7 +17,7 @@
|
|||||||
// The above creates an implementation that can run on maps up to 1024x1024.
|
// The above creates an implementation that can run on maps up to 1024x1024.
|
||||||
// Map sizes must be a multiple of (1<<(LOG2/2)) on each axis (e.g. 32 if LOG2=10,
|
// Map sizes must be a multiple of (1<<(LOG2/2)) on each axis (e.g. 32 if LOG2=10,
|
||||||
// 16 if LOG2=8, etc.) (You can just pad your map with untraversable space.)
|
// 16 if LOG2=8, etc.) (You can just pad your map with untraversable space.)
|
||||||
//
|
//
|
||||||
// MEMORY USAGE
|
// MEMORY USAGE
|
||||||
//
|
//
|
||||||
// Uses about 6-7 bytes per grid square (e.g. 7MB for a 1024x1024 grid).
|
// Uses about 6-7 bytes per grid square (e.g. 7MB for a 1024x1024 grid).
|
||||||
@ -52,7 +52,7 @@
|
|||||||
// - function for setting a grid of squares at once (just use batching)
|
// - function for setting a grid of squares at once (just use batching)
|
||||||
//
|
//
|
||||||
// LICENSE
|
// LICENSE
|
||||||
//
|
//
|
||||||
// See end of file for license information.
|
// See end of file for license information.
|
||||||
//
|
//
|
||||||
// ALGORITHM
|
// ALGORITHM
|
||||||
@ -435,7 +435,7 @@ static void stbcc__build_all_connections_for_cluster(stbcc_grid *g, int cx, int
|
|||||||
i = 0;
|
i = 0;
|
||||||
j = 0;
|
j = 0;
|
||||||
step_x = 0;
|
step_x = 0;
|
||||||
step_y = 1;
|
step_y = 1;
|
||||||
n = STBCC__CLUSTER_SIZE_Y;
|
n = STBCC__CLUSTER_SIZE_Y;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
@ -599,7 +599,7 @@ void stbcc_init_grid(stbcc_grid *g, unsigned char *map, int w, int h)
|
|||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
for (j=0; j < STBCC__CLUSTER_COUNT_Y; ++j)
|
for (j=0; j < STBCC__CLUSTER_COUNT_Y; ++j)
|
||||||
for (i=0; i < STBCC__CLUSTER_COUNT_X; ++i)
|
for (i=0; i < STBCC__CLUSTER_COUNT_X; ++i)
|
||||||
g->cluster_dirty[j][i] = 0;
|
g->cluster_dirty[j][i] = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -699,7 +699,7 @@ static void stbcc__remove_clump_connection(stbcc_grid *g, int x1, int y1, int x2
|
|||||||
for (i=0; i < clump->num_adjacent; ++i)
|
for (i=0; i < clump->num_adjacent; ++i)
|
||||||
if (rc.clump_index == adj[i].clump_index &&
|
if (rc.clump_index == adj[i].clump_index &&
|
||||||
rc.cluster_dx == adj[i].cluster_dx &&
|
rc.cluster_dx == adj[i].cluster_dx &&
|
||||||
rc.cluster_dy == adj[i].cluster_dy)
|
rc.cluster_dy == adj[i].cluster_dy)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (i < clump->num_adjacent)
|
if (i < clump->num_adjacent)
|
||||||
@ -736,7 +736,7 @@ static void stbcc__add_connections_to_adjacent_cluster(stbcc_grid *g, int cx, in
|
|||||||
i = 0;
|
i = 0;
|
||||||
j = 0;
|
j = 0;
|
||||||
step_x = 0;
|
step_x = 0;
|
||||||
step_y = 1;
|
step_y = 1;
|
||||||
n = STBCC__CLUSTER_SIZE_Y;
|
n = STBCC__CLUSTER_SIZE_Y;
|
||||||
} else if (dy == -1) {
|
} else if (dy == -1) {
|
||||||
i = 0;
|
i = 0;
|
||||||
@ -797,7 +797,7 @@ static void stbcc__remove_connections_to_adjacent_cluster(stbcc_grid *g, int cx,
|
|||||||
i = 0;
|
i = 0;
|
||||||
j = 0;
|
j = 0;
|
||||||
step_x = 0;
|
step_x = 0;
|
||||||
step_y = 1;
|
step_y = 1;
|
||||||
n = STBCC__CLUSTER_SIZE_Y;
|
n = STBCC__CLUSTER_SIZE_Y;
|
||||||
} else if (dy == -1) {
|
} else if (dy == -1) {
|
||||||
i = 0;
|
i = 0;
|
||||||
@ -1012,38 +1012,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
52
stb_divide.h
52
stb_divide.h
@ -3,7 +3,7 @@
|
|||||||
//
|
//
|
||||||
// HISTORY
|
// HISTORY
|
||||||
//
|
//
|
||||||
// v0.93 2020-02-02 Write useful exit() value from main()
|
// v0.93 2020-02-02 Write useful exit() value from main()
|
||||||
// v0.92 2019-02-25 Fix warning
|
// v0.92 2019-02-25 Fix warning
|
||||||
// v0.91 2010-02-27 Fix euclidean division by INT_MIN for non-truncating C
|
// v0.91 2010-02-27 Fix euclidean division by INT_MIN for non-truncating C
|
||||||
// Check result with 64-bit math to catch such cases
|
// Check result with 64-bit math to catch such cases
|
||||||
@ -311,7 +311,7 @@ void test(int a, int b)
|
|||||||
if (show) printf("(%+11d,%+d) | ", a,b);
|
if (show) printf("(%+11d,%+d) | ", a,b);
|
||||||
q = stb_div_trunc(a,b), r = stb_mod_trunc(a,b);
|
q = stb_div_trunc(a,b), r = stb_mod_trunc(a,b);
|
||||||
if (show) printf("(%+11d,%+2d) ", q,r); stbdiv_check(q,r,a,b, "trunc",a);
|
if (show) printf("(%+11d,%+2d) ", q,r); stbdiv_check(q,r,a,b, "trunc",a);
|
||||||
q = stb_div_floor(a,b), r = stb_mod_floor(a,b);
|
q = stb_div_floor(a,b), r = stb_mod_floor(a,b);
|
||||||
if (show) printf("(%+11d,%+2d) ", q,r); stbdiv_check(q,r,a,b, "floor",b);
|
if (show) printf("(%+11d,%+2d) ", q,r); stbdiv_check(q,r,a,b, "floor",b);
|
||||||
q = stb_div_eucl (a,b), r = stb_mod_eucl (a,b);
|
q = stb_div_eucl (a,b), r = stb_mod_eucl (a,b);
|
||||||
if (show) printf("(%+11d,%+2d)\n", q,r); stbdiv_check(q,r,a,b, "euclidean",1);
|
if (show) printf("(%+11d,%+2d)\n", q,r); stbdiv_check(q,r,a,b, "euclidean",1);
|
||||||
@ -393,38 +393,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
58
stb_ds.h
58
stb_ds.h
@ -1,5 +1,5 @@
|
|||||||
/* stb_ds.h - v0.63 - public domain data structures - Sean Barrett 2019
|
/* stb_ds.h - v0.63 - public domain data structures - Sean Barrett 2019
|
||||||
|
|
||||||
This is a single-header-file library that provides easy-to-use
|
This is a single-header-file library that provides easy-to-use
|
||||||
dynamic arrays and hash tables for C (also works in C++).
|
dynamic arrays and hash tables for C (also works in C++).
|
||||||
|
|
||||||
@ -26,7 +26,7 @@ COMPILE-TIME OPTIONS
|
|||||||
#define STBDS_NO_SHORT_NAMES
|
#define STBDS_NO_SHORT_NAMES
|
||||||
|
|
||||||
This flag needs to be set globally.
|
This flag needs to be set globally.
|
||||||
|
|
||||||
By default stb_ds exposes shorter function names that are not qualified
|
By default stb_ds exposes shorter function names that are not qualified
|
||||||
with the "stbds_" prefix. If these names conflict with the names in your
|
with the "stbds_" prefix. If these names conflict with the names in your
|
||||||
code, define this flag.
|
code, define this flag.
|
||||||
@ -71,7 +71,7 @@ DOCUMENTATION
|
|||||||
Non-function interface:
|
Non-function interface:
|
||||||
|
|
||||||
Declare an empty dynamic array of type T
|
Declare an empty dynamic array of type T
|
||||||
T* foo = NULL;
|
T* foo = NULL;
|
||||||
|
|
||||||
Access the i'th item of a dynamic array 'foo' of type T, T* foo:
|
Access the i'th item of a dynamic array 'foo' of type T, T* foo:
|
||||||
foo[i]
|
foo[i]
|
||||||
@ -227,7 +227,7 @@ DOCUMENTATION
|
|||||||
T* shgetp(T*, char* key)
|
T* shgetp(T*, char* key)
|
||||||
T* hmgetp_ts(T*, TK key, ptrdiff_t tempvar)
|
T* hmgetp_ts(T*, TK key, ptrdiff_t tempvar)
|
||||||
T* hmgetp_null(T*, TK key)
|
T* hmgetp_null(T*, TK key)
|
||||||
T* shgetp_null(T*, char *key)
|
T* shgetp_null(T*, char *key)
|
||||||
Returns a pointer to the structure corresponding to 'key' in
|
Returns a pointer to the structure corresponding to 'key' in
|
||||||
the hashmap. Functions ending in "_null" return NULL if the key
|
the hashmap. Functions ending in "_null" return NULL if the key
|
||||||
is not present in the hashmap; the others return a pointer to a
|
is not present in the hashmap; the others return a pointer to a
|
||||||
@ -355,7 +355,7 @@ NOTES - HASH MAP
|
|||||||
* If adversarial input is a serious concern and you're on a 64-bit platform,
|
* If adversarial input is a serious concern and you're on a 64-bit platform,
|
||||||
enable STBDS_SIPHASH_2_4 (see the 'Compile-time options' section), and pass
|
enable STBDS_SIPHASH_2_4 (see the 'Compile-time options' section), and pass
|
||||||
a strong random number to stbds_rand_seed.
|
a strong random number to stbds_rand_seed.
|
||||||
|
|
||||||
* The default value for the hash table is stored in foo[-1], so if you
|
* The default value for the hash table is stored in foo[-1], so if you
|
||||||
use code like 'hmget(T,k)->value = 5' you can accidentally overwrite
|
use code like 'hmget(T,k)->value = 5' you can accidentally overwrite
|
||||||
the value stored by hmdefault if 'k' is not present.
|
the value stored by hmdefault if 'k' is not present.
|
||||||
@ -436,7 +436,7 @@ CREDITS
|
|||||||
|
|
||||||
#define stralloc stbds_stralloc
|
#define stralloc stbds_stralloc
|
||||||
#define strreset stbds_strreset
|
#define strreset stbds_strreset
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(STBDS_REALLOC) && !defined(STBDS_FREE) || !defined(STBDS_REALLOC) && defined(STBDS_FREE)
|
#if defined(STBDS_REALLOC) && !defined(STBDS_FREE) || !defined(STBDS_REALLOC) && defined(STBDS_FREE)
|
||||||
#error "You must define both STBDS_REALLOC and STBDS_FREE, or neither."
|
#error "You must define both STBDS_REALLOC and STBDS_FREE, or neither."
|
||||||
@ -881,16 +881,16 @@ static stbds_hash_index *stbds_make_hash_index(size_t slot_count, stbds_hash_ind
|
|||||||
// Following statistics were measured on a Core i7-6700 @ 4.00Ghz, compiled with clang 7.0.1 -O2
|
// Following statistics were measured on a Core i7-6700 @ 4.00Ghz, compiled with clang 7.0.1 -O2
|
||||||
// Note that the larger tables have high variance as they were run fewer times
|
// Note that the larger tables have high variance as they were run fewer times
|
||||||
// A1 A2 B1 C1
|
// A1 A2 B1 C1
|
||||||
// 0.10ms : 0.10ms : 0.10ms : 0.11ms : 2,000 inserts creating 2K table
|
// 0.10ms : 0.10ms : 0.10ms : 0.11ms : 2,000 inserts creating 2K table
|
||||||
// 0.96ms : 0.95ms : 0.97ms : 1.04ms : 20,000 inserts creating 20K table
|
// 0.96ms : 0.95ms : 0.97ms : 1.04ms : 20,000 inserts creating 20K table
|
||||||
// 14.48ms : 14.46ms : 10.63ms : 11.00ms : 200,000 inserts creating 200K table
|
// 14.48ms : 14.46ms : 10.63ms : 11.00ms : 200,000 inserts creating 200K table
|
||||||
// 195.74ms : 196.35ms : 203.69ms : 214.92ms : 2,000,000 inserts creating 2M table
|
// 195.74ms : 196.35ms : 203.69ms : 214.92ms : 2,000,000 inserts creating 2M table
|
||||||
// 2193.88ms : 2209.22ms : 2285.54ms : 2437.17ms : 20,000,000 inserts creating 20M table
|
// 2193.88ms : 2209.22ms : 2285.54ms : 2437.17ms : 20,000,000 inserts creating 20M table
|
||||||
// 65.27ms : 53.77ms : 65.33ms : 65.47ms : 500,000 inserts & deletes in 2K table
|
// 65.27ms : 53.77ms : 65.33ms : 65.47ms : 500,000 inserts & deletes in 2K table
|
||||||
// 72.78ms : 62.45ms : 71.95ms : 72.85ms : 500,000 inserts & deletes in 20K table
|
// 72.78ms : 62.45ms : 71.95ms : 72.85ms : 500,000 inserts & deletes in 20K table
|
||||||
// 89.47ms : 77.72ms : 96.49ms : 96.75ms : 500,000 inserts & deletes in 200K table
|
// 89.47ms : 77.72ms : 96.49ms : 96.75ms : 500,000 inserts & deletes in 200K table
|
||||||
// 97.58ms : 98.14ms : 97.18ms : 97.53ms : 500,000 inserts & deletes in 2M table
|
// 97.58ms : 98.14ms : 97.18ms : 97.53ms : 500,000 inserts & deletes in 2M table
|
||||||
// 118.61ms : 119.62ms : 120.16ms : 118.86ms : 500,000 inserts & deletes in 20M table
|
// 118.61ms : 119.62ms : 120.16ms : 118.86ms : 500,000 inserts & deletes in 20M table
|
||||||
// 192.11ms : 194.39ms : 196.38ms : 195.73ms : 500,000 inserts & deletes in 200M table
|
// 192.11ms : 194.39ms : 196.38ms : 195.73ms : 500,000 inserts & deletes in 200M table
|
||||||
|
|
||||||
if (slot_count <= STBDS_BUCKET_LENGTH)
|
if (slot_count <= STBDS_BUCKET_LENGTH)
|
||||||
@ -1023,7 +1023,7 @@ static size_t stbds_siphash_bytes(void *p, size_t len, size_t seed)
|
|||||||
// derived from siphash, but on 32-bit platforms very different as it uses 4 32-bit state not 4 64-bit
|
// derived from siphash, but on 32-bit platforms very different as it uses 4 32-bit state not 4 64-bit
|
||||||
v0 = ((((size_t) 0x736f6d65 << 16) << 16) + 0x70736575) ^ seed;
|
v0 = ((((size_t) 0x736f6d65 << 16) << 16) + 0x70736575) ^ seed;
|
||||||
v1 = ((((size_t) 0x646f7261 << 16) << 16) + 0x6e646f6d) ^ ~seed;
|
v1 = ((((size_t) 0x646f7261 << 16) << 16) + 0x6e646f6d) ^ ~seed;
|
||||||
v2 = ((((size_t) 0x6c796765 << 16) << 16) + 0x6e657261) ^ seed;
|
v2 = ((((size_t) 0x6c796765 << 16) << 16) + 0x6e657261) ^ seed;
|
||||||
v3 = ((((size_t) 0x74656462 << 16) << 16) + 0x79746573) ^ ~seed;
|
v3 = ((((size_t) 0x74656462 << 16) << 16) + 0x79746573) ^ ~seed;
|
||||||
|
|
||||||
#ifdef STBDS_TEST_SIPHASH_2_4
|
#ifdef STBDS_TEST_SIPHASH_2_4
|
||||||
@ -1126,16 +1126,16 @@ size_t stbds_hash_bytes(void *p, size_t len, size_t seed)
|
|||||||
// Following statistics were measured on a Core i7-6700 @ 4.00Ghz, compiled with clang 7.0.1 -O2
|
// Following statistics were measured on a Core i7-6700 @ 4.00Ghz, compiled with clang 7.0.1 -O2
|
||||||
// Note that the larger tables have high variance as they were run fewer times
|
// Note that the larger tables have high variance as they were run fewer times
|
||||||
// HASH32-A // HASH32-BB // HASH32-C
|
// HASH32-A // HASH32-BB // HASH32-C
|
||||||
// 0.10ms // 0.10ms // 0.10ms : 2,000 inserts creating 2K table
|
// 0.10ms // 0.10ms // 0.10ms : 2,000 inserts creating 2K table
|
||||||
// 0.96ms // 0.95ms // 0.99ms : 20,000 inserts creating 20K table
|
// 0.96ms // 0.95ms // 0.99ms : 20,000 inserts creating 20K table
|
||||||
// 14.69ms // 14.43ms // 14.97ms : 200,000 inserts creating 200K table
|
// 14.69ms // 14.43ms // 14.97ms : 200,000 inserts creating 200K table
|
||||||
// 199.99ms // 195.36ms // 202.05ms : 2,000,000 inserts creating 2M table
|
// 199.99ms // 195.36ms // 202.05ms : 2,000,000 inserts creating 2M table
|
||||||
// 2234.84ms // 2187.74ms // 2240.38ms : 20,000,000 inserts creating 20M table
|
// 2234.84ms // 2187.74ms // 2240.38ms : 20,000,000 inserts creating 20M table
|
||||||
// 55.68ms // 53.72ms // 57.31ms : 500,000 inserts & deletes in 2K table
|
// 55.68ms // 53.72ms // 57.31ms : 500,000 inserts & deletes in 2K table
|
||||||
// 63.43ms // 61.99ms // 65.73ms : 500,000 inserts & deletes in 20K table
|
// 63.43ms // 61.99ms // 65.73ms : 500,000 inserts & deletes in 20K table
|
||||||
// 80.04ms // 77.96ms // 81.83ms : 500,000 inserts & deletes in 200K table
|
// 80.04ms // 77.96ms // 81.83ms : 500,000 inserts & deletes in 200K table
|
||||||
// 100.42ms // 97.40ms // 102.39ms : 500,000 inserts & deletes in 2M table
|
// 100.42ms // 97.40ms // 102.39ms : 500,000 inserts & deletes in 2M table
|
||||||
// 119.71ms // 120.59ms // 121.63ms : 500,000 inserts & deletes in 20M table
|
// 119.71ms // 120.59ms // 121.63ms : 500,000 inserts & deletes in 20M table
|
||||||
// 185.28ms // 195.15ms // 187.74ms : 500,000 inserts & deletes in 200M table
|
// 185.28ms // 195.15ms // 187.74ms : 500,000 inserts & deletes in 200M table
|
||||||
// 15.58ms // 14.79ms // 15.52ms : 200,000 inserts creating 200K table with varying key spacing
|
// 15.58ms // 14.79ms // 15.52ms : 200,000 inserts creating 200K table with varying key spacing
|
||||||
|
|
||||||
@ -1176,7 +1176,7 @@ static int stbds_is_key_equal(void *a, size_t elemsize, void *key, size_t keysiz
|
|||||||
#define STBDS_ARR_TO_HASH(x,elemsize) ((char*) (x) + (elemsize))
|
#define STBDS_ARR_TO_HASH(x,elemsize) ((char*) (x) + (elemsize))
|
||||||
|
|
||||||
#define stbds_hash_table(a) ((stbds_hash_index *) stbds_header(a)->hash_table)
|
#define stbds_hash_table(a) ((stbds_hash_index *) stbds_header(a)->hash_table)
|
||||||
|
|
||||||
void stbds_hmfree_func(void *a, size_t elemsize)
|
void stbds_hmfree_func(void *a, size_t elemsize)
|
||||||
{
|
{
|
||||||
if (a == NULL) return;
|
if (a == NULL) return;
|
||||||
@ -1466,7 +1466,7 @@ void * stbds_hmdel_key(void *a, size_t elemsize, void *key, size_t keysize, size
|
|||||||
|
|
||||||
// if indices are the same, memcpy is a no-op, but back-pointer-fixup will fail, so skip
|
// if indices are the same, memcpy is a no-op, but back-pointer-fixup will fail, so skip
|
||||||
if (old_index != final_index) {
|
if (old_index != final_index) {
|
||||||
// swap delete
|
// swap delete
|
||||||
memmove((char*) a + elemsize*old_index, (char*) a + elemsize*final_index, elemsize);
|
memmove((char*) a + elemsize*old_index, (char*) a + elemsize*final_index, elemsize);
|
||||||
|
|
||||||
// now find the slot for the last element
|
// now find the slot for the last element
|
||||||
@ -1676,7 +1676,7 @@ void stbds_unit_tests(void)
|
|||||||
if (i & 3) STBDS_ASSERT(hmget(intmap, i) == -2 );
|
if (i & 3) STBDS_ASSERT(hmget(intmap, i) == -2 );
|
||||||
else STBDS_ASSERT(hmget(intmap, i) == i*3);
|
else STBDS_ASSERT(hmget(intmap, i) == i*3);
|
||||||
for (i=0; i < testsize; i+=1)
|
for (i=0; i < testsize; i+=1)
|
||||||
hmdel(intmap, i); // delete the rest of the entries
|
hmdel(intmap, i); // delete the rest of the entries
|
||||||
for (i=0; i < testsize; i+=1)
|
for (i=0; i < testsize; i+=1)
|
||||||
STBDS_ASSERT(hmget(intmap, i) == -2 );
|
STBDS_ASSERT(hmget(intmap, i) == -2 );
|
||||||
hmfree(intmap);
|
hmfree(intmap);
|
||||||
@ -1720,7 +1720,7 @@ void stbds_unit_tests(void)
|
|||||||
if (i & 3) STBDS_ASSERT(shget(strmap, strkey(i)) == -2 );
|
if (i & 3) STBDS_ASSERT(shget(strmap, strkey(i)) == -2 );
|
||||||
else STBDS_ASSERT(shget(strmap, strkey(i)) == i*3);
|
else STBDS_ASSERT(shget(strmap, strkey(i)) == i*3);
|
||||||
for (i=0; i < testsize; i+=1)
|
for (i=0; i < testsize; i+=1)
|
||||||
shdel(strmap, strkey(i)); // delete the rest of the entries
|
shdel(strmap, strkey(i)); // delete the rest of the entries
|
||||||
for (i=0; i < testsize; i+=1)
|
for (i=0; i < testsize; i+=1)
|
||||||
STBDS_ASSERT(shget(strmap, strkey(i)) == -2 );
|
STBDS_ASSERT(shget(strmap, strkey(i)) == -2 );
|
||||||
shfree(strmap);
|
shfree(strmap);
|
||||||
|
68
stb_dxt.h
68
stb_dxt.h
@ -23,10 +23,10 @@
|
|||||||
// v1.01 - (stb) fix bug converting to RGB that messed up quality, thanks ryg & cbloom
|
// v1.01 - (stb) fix bug converting to RGB that messed up quality, thanks ryg & cbloom
|
||||||
// v1.00 - (stb) first release
|
// v1.00 - (stb) first release
|
||||||
//
|
//
|
||||||
// contributors:
|
// contributors:
|
||||||
// Kevin Schmidt (#defines for "freestanding" compilation)
|
// Kevin Schmidt (#defines for "freestanding" compilation)
|
||||||
// github:ppiastucki (BC4 support)
|
// github:ppiastucki (BC4 support)
|
||||||
//
|
//
|
||||||
// LICENSE
|
// LICENSE
|
||||||
//
|
//
|
||||||
// See end of file for license information.
|
// See end of file for license information.
|
||||||
@ -68,7 +68,7 @@ STBDDEF void stb_compress_bc5_block(unsigned char *dest, const unsigned char *sr
|
|||||||
// STB_DXT_USE_ROUNDING_BIAS
|
// STB_DXT_USE_ROUNDING_BIAS
|
||||||
// use a rounding bias during color interpolation. this is closer to what "ideal"
|
// use a rounding bias during color interpolation. this is closer to what "ideal"
|
||||||
// interpolation would do but doesn't match the S3TC/DX10 spec. old versions (pre-1.03)
|
// interpolation would do but doesn't match the S3TC/DX10 spec. old versions (pre-1.03)
|
||||||
// implicitly had this turned on.
|
// implicitly had this turned on.
|
||||||
//
|
//
|
||||||
// in case you're targeting a specific type of hardware (e.g. console programmers):
|
// in case you're targeting a specific type of hardware (e.g. console programmers):
|
||||||
// NVidia and Intel GPUs (as of 2010) as well as DX9 ref use DXT decoders that are closer
|
// NVidia and Intel GPUs (as of 2010) as well as DX9 ref use DXT decoders that are closer
|
||||||
@ -159,7 +159,7 @@ static void stb__PrepareOptTable(unsigned char *Table,const unsigned char *expan
|
|||||||
int mine = expand[mn];
|
int mine = expand[mn];
|
||||||
int maxe = expand[mx];
|
int maxe = expand[mx];
|
||||||
int err = STBD_ABS(stb__Lerp13(maxe, mine) - i);
|
int err = STBD_ABS(stb__Lerp13(maxe, mine) - i);
|
||||||
|
|
||||||
// DX10 spec says that interpolation must be within 3% of "correct" result,
|
// DX10 spec says that interpolation must be within 3% of "correct" result,
|
||||||
// add this as error term. (normally we'd expect a random distribution of
|
// add this as error term. (normally we'd expect a random distribution of
|
||||||
// +-1.5% error, but nowhere in the spec does it say that the error has to be
|
// +-1.5% error, but nowhere in the spec does it say that the error has to be
|
||||||
@ -238,7 +238,7 @@ static unsigned int stb__MatchColorsBlock(unsigned char *block, unsigned char *c
|
|||||||
// relying on this 1d approximation isn't always optimal in terms of euclidean distance,
|
// relying on this 1d approximation isn't always optimal in terms of euclidean distance,
|
||||||
// but it's very close and a lot faster.
|
// but it's very close and a lot faster.
|
||||||
// http://cbloomrants.blogspot.com/2008/12/12-08-08-dxtc-summary.html
|
// http://cbloomrants.blogspot.com/2008/12/12-08-08-dxtc-summary.html
|
||||||
|
|
||||||
c0Point = (stops[1] + stops[3]) >> 1;
|
c0Point = (stops[1] + stops[3]) >> 1;
|
||||||
halfPoint = (stops[3] + stops[2]) >> 1;
|
halfPoint = (stops[3] + stops[2]) >> 1;
|
||||||
c3Point = (stops[2] + stops[0]) >> 1;
|
c3Point = (stops[2] + stops[0]) >> 1;
|
||||||
@ -513,7 +513,7 @@ static void stb__CompressColorBlock(unsigned char *dest, unsigned char *block, i
|
|||||||
int refinecount;
|
int refinecount;
|
||||||
unsigned short max16, min16;
|
unsigned short max16, min16;
|
||||||
unsigned char dblock[16*4],color[4*4];
|
unsigned char dblock[16*4],color[4*4];
|
||||||
|
|
||||||
dither = mode & STB_DXT_DITHER;
|
dither = mode & STB_DXT_DITHER;
|
||||||
refinecount = (mode & STB_DXT_HIGHQUAL) ? 2 : 1;
|
refinecount = (mode & STB_DXT_HIGHQUAL) ? 2 : 1;
|
||||||
|
|
||||||
@ -543,7 +543,7 @@ static void stb__CompressColorBlock(unsigned char *dest, unsigned char *block, i
|
|||||||
// third step: refine (multiple times if requested)
|
// third step: refine (multiple times if requested)
|
||||||
for (i=0;i<refinecount;i++) {
|
for (i=0;i<refinecount;i++) {
|
||||||
unsigned int lastmask = mask;
|
unsigned int lastmask = mask;
|
||||||
|
|
||||||
if (stb__RefineBlock(dither ? dblock : block,&max16,&min16,mask)) {
|
if (stb__RefineBlock(dither ? dblock : block,&max16,&min16,mask)) {
|
||||||
if (max16 != min16) {
|
if (max16 != min16) {
|
||||||
stb__EvalColors(color,max16,min16);
|
stb__EvalColors(color,max16,min16);
|
||||||
@ -553,7 +553,7 @@ static void stb__CompressColorBlock(unsigned char *dest, unsigned char *block, i
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mask == lastmask)
|
if(mask == lastmask)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -607,7 +607,7 @@ static void stb__CompressAlphaBlock(unsigned char *dest,unsigned char *src, int
|
|||||||
bias = (dist < 8) ? (dist - 1) : (dist/2 + 2);
|
bias = (dist < 8) ? (dist - 1) : (dist/2 + 2);
|
||||||
bias -= mn * 7;
|
bias -= mn * 7;
|
||||||
bits = 0,mask=0;
|
bits = 0,mask=0;
|
||||||
|
|
||||||
for (i=0;i<16;i++) {
|
for (i=0;i<16;i++) {
|
||||||
int a = src[i*stride]*7 + bias;
|
int a = src[i*stride]*7 + bias;
|
||||||
int ind,t;
|
int ind,t;
|
||||||
@ -616,7 +616,7 @@ static void stb__CompressAlphaBlock(unsigned char *dest,unsigned char *src, int
|
|||||||
t = (a >= dist4) ? -1 : 0; ind = t & 4; a -= dist4 & t;
|
t = (a >= dist4) ? -1 : 0; ind = t & 4; a -= dist4 & t;
|
||||||
t = (a >= dist2) ? -1 : 0; ind += t & 2; a -= dist2 & t;
|
t = (a >= dist2) ? -1 : 0; ind += t & 2; a -= dist2 & t;
|
||||||
ind += (a >= dist);
|
ind += (a >= dist);
|
||||||
|
|
||||||
// turn linear scale into DXT index (0/1 are extremal pts)
|
// turn linear scale into DXT index (0/1 are extremal pts)
|
||||||
ind = -ind & 7;
|
ind = -ind & 7;
|
||||||
ind ^= (2 > ind);
|
ind ^= (2 > ind);
|
||||||
@ -693,38 +693,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -58,7 +58,7 @@
|
|||||||
//
|
//
|
||||||
// Use positive values to expand the space between characters,
|
// Use positive values to expand the space between characters,
|
||||||
// and small negative values (no smaller than -1.5) to contract
|
// and small negative values (no smaller than -1.5) to contract
|
||||||
// the space between characters.
|
// the space between characters.
|
||||||
//
|
//
|
||||||
// E.g. spacing = 1 adds one "pixel" of spacing between the
|
// E.g. spacing = 1 adds one "pixel" of spacing between the
|
||||||
// characters. spacing = -1 is reasonable but feels a bit too
|
// characters. spacing = -1 is reasonable but feels a bit too
|
||||||
@ -268,38 +268,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -17,13 +17,13 @@ publish, and distribute this file as you see fit.
|
|||||||
"template" of the tiles you'll create. You then edit those tiles, then
|
"template" of the tiles you'll create. You then edit those tiles, then
|
||||||
load the created tile image file back into this library and use it at
|
load the created tile image file back into this library and use it at
|
||||||
runtime to generate "maps".
|
runtime to generate "maps".
|
||||||
|
|
||||||
You cannot load arbitrary tile image files with this library; it is
|
You cannot load arbitrary tile image files with this library; it is
|
||||||
only designed to load image files made from the template it created.
|
only designed to load image files made from the template it created.
|
||||||
It stores a binary description of the tile sizes & constraints in a
|
It stores a binary description of the tile sizes & constraints in a
|
||||||
few pixels, and uses those to recover the rules, rather than trying
|
few pixels, and uses those to recover the rules, rather than trying
|
||||||
to parse the tiles themselves.
|
to parse the tiles themselves.
|
||||||
|
|
||||||
You *can* use this library to generate from arbitrary tile sets, but
|
You *can* use this library to generate from arbitrary tile sets, but
|
||||||
only by loading the tile set and specifying the constraints explicitly
|
only by loading the tile set and specifying the constraints explicitly
|
||||||
yourself.
|
yourself.
|
||||||
@ -142,7 +142,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
0.7 2019-03-04 - fix warnings
|
0.7 2019-03-04 - fix warnings
|
||||||
0.6 2014-08-17 - fix broken map-maker
|
0.6 2014-08-17 - fix broken map-maker
|
||||||
0.5 2014-07-07 - initial release
|
0.5 2014-07-07 - initial release
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -251,7 +251,7 @@ STBHW_EXTERN int stbhw_make_template(stbhw_config *c, unsigned char *data, int w
|
|||||||
// there are 4 "types" of corners and 6 types of edges.
|
// there are 4 "types" of corners and 6 types of edges.
|
||||||
// you can configure the tileset to have different numbers
|
// you can configure the tileset to have different numbers
|
||||||
// of colors for each type of color or edge.
|
// of colors for each type of color or edge.
|
||||||
//
|
//
|
||||||
// corner types:
|
// corner types:
|
||||||
//
|
//
|
||||||
// 0---*---1---*---2---*---3
|
// 0---*---1---*---2---*---3
|
||||||
@ -513,7 +513,7 @@ static int stbhw__process_template(stbhw__process *p)
|
|||||||
for (j=0; j < c->num_color[0]; ++j) {
|
for (j=0; j < c->num_color[0]; ++j) {
|
||||||
for (i=0; i < c->num_color[1]; ++i) {
|
for (i=0; i < c->num_color[1]; ++i) {
|
||||||
for (q=0; q < c->num_vary_x; ++q) {
|
for (q=0; q < c->num_vary_x; ++q) {
|
||||||
stbhw__process_v_row(p, 0,ypos,
|
stbhw__process_v_row(p, 0,ypos,
|
||||||
0,c->num_color[0]-1, 0,c->num_color[3]-1, 0,c->num_color[2]-1,
|
0,c->num_color[0]-1, 0,c->num_color[3]-1, 0,c->num_color[2]-1,
|
||||||
i,i, j,j, k,k,
|
i,i, j,j, k,k,
|
||||||
c->num_vary_y);
|
c->num_vary_y);
|
||||||
@ -689,7 +689,7 @@ static int stbhw__change_color(int old_color, int num_options, int *weights)
|
|||||||
|
|
||||||
|
|
||||||
// generate a map that is w * h pixels (3-bytes each)
|
// generate a map that is w * h pixels (3-bytes each)
|
||||||
// returns 1 on success, 0 on error
|
// returns 1 on success, 0 on error
|
||||||
STBHW_EXTERN int stbhw_generate_image(stbhw_tileset *ts, int **weighting, unsigned char *output, int stride, int w, int h)
|
STBHW_EXTERN int stbhw_generate_image(stbhw_tileset *ts, int **weighting, unsigned char *output, int stride, int w, int h)
|
||||||
{
|
{
|
||||||
int sidelen = ts->short_side_len;
|
int sidelen = ts->short_side_len;
|
||||||
|
146
stb_image.h
146
stb_image.h
@ -52,7 +52,7 @@ RECENT REVISION HISTORY:
|
|||||||
2.23 (2019-08-11) fix clang static analysis warning
|
2.23 (2019-08-11) fix clang static analysis warning
|
||||||
2.22 (2019-03-04) gif fixes, fix warnings
|
2.22 (2019-03-04) gif fixes, fix warnings
|
||||||
2.21 (2019-02-25) fix typo in comment
|
2.21 (2019-02-25) fix typo in comment
|
||||||
2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
|
2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
|
||||||
2.19 (2018-02-11) fix warning
|
2.19 (2018-02-11) fix warning
|
||||||
2.18 (2018-01-30) fix warnings
|
2.18 (2018-01-30) fix warnings
|
||||||
2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings
|
2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings
|
||||||
@ -108,7 +108,7 @@ RECENT REVISION HISTORY:
|
|||||||
Christian Floisand Kevin Schmidt JR Smith github:darealshinji
|
Christian Floisand Kevin Schmidt JR Smith github:darealshinji
|
||||||
Brad Weinberger Matvey Cherevko github:Michaelangel007
|
Brad Weinberger Matvey Cherevko github:Michaelangel007
|
||||||
Blazej Dariusz Roszkowski
|
Blazej Dariusz Roszkowski
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef STBI_INCLUDE_STB_IMAGE_H
|
#ifndef STBI_INCLUDE_STB_IMAGE_H
|
||||||
@ -894,7 +894,7 @@ static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int
|
|||||||
static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
|
static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static
|
static
|
||||||
#ifdef STBI_THREAD_LOCAL
|
#ifdef STBI_THREAD_LOCAL
|
||||||
STBI_THREAD_LOCAL
|
STBI_THREAD_LOCAL
|
||||||
#endif
|
#endif
|
||||||
@ -1159,8 +1159,8 @@ static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int byt
|
|||||||
|
|
||||||
stbi_uc *bytes = (stbi_uc *)image;
|
stbi_uc *bytes = (stbi_uc *)image;
|
||||||
for (slice = 0; slice < z; ++slice) {
|
for (slice = 0; slice < z; ++slice) {
|
||||||
stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
|
stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
|
||||||
bytes += slice_size;
|
bytes += slice_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1246,7 +1246,7 @@ static FILE *stbi__fopen(char const *filename, char const *mode)
|
|||||||
wchar_t wFilename[1024];
|
wchar_t wFilename[1024];
|
||||||
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)))
|
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)))
|
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1348,15 +1348,15 @@ STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *u
|
|||||||
STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
|
STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
|
||||||
{
|
{
|
||||||
unsigned char *result;
|
unsigned char *result;
|
||||||
stbi__context s;
|
stbi__context s;
|
||||||
stbi__start_mem(&s,buffer,len);
|
stbi__start_mem(&s,buffer,len);
|
||||||
|
|
||||||
result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);
|
result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);
|
||||||
if (stbi__vertically_flip_on_load) {
|
if (stbi__vertically_flip_on_load) {
|
||||||
stbi__vertical_flip_slices( result, *x, *y, *z, *comp );
|
stbi__vertical_flip_slices( result, *x, *y, *z, *comp );
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -6293,7 +6293,7 @@ typedef struct
|
|||||||
int w,h;
|
int w,h;
|
||||||
stbi_uc *out; // output buffer (always 4 components)
|
stbi_uc *out; // output buffer (always 4 components)
|
||||||
stbi_uc *background; // The current "background" as far as a gif is concerned
|
stbi_uc *background; // The current "background" as far as a gif is concerned
|
||||||
stbi_uc *history;
|
stbi_uc *history;
|
||||||
int flags, bgindex, ratio, transparent, eflags;
|
int flags, bgindex, ratio, transparent, eflags;
|
||||||
stbi_uc pal[256][4];
|
stbi_uc pal[256][4];
|
||||||
stbi_uc lpal[256][4];
|
stbi_uc lpal[256][4];
|
||||||
@ -6381,7 +6381,7 @@ static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)
|
|||||||
static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
|
static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
|
||||||
{
|
{
|
||||||
stbi_uc *p, *c;
|
stbi_uc *p, *c;
|
||||||
int idx;
|
int idx;
|
||||||
|
|
||||||
// recurse to decode the prefixes, since the linked-list is backwards,
|
// recurse to decode the prefixes, since the linked-list is backwards,
|
||||||
// and working backwards through an interleaved image would be nasty
|
// and working backwards through an interleaved image would be nasty
|
||||||
@ -6390,12 +6390,12 @@ static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
|
|||||||
|
|
||||||
if (g->cur_y >= g->max_y) return;
|
if (g->cur_y >= g->max_y) return;
|
||||||
|
|
||||||
idx = g->cur_x + g->cur_y;
|
idx = g->cur_x + g->cur_y;
|
||||||
p = &g->out[idx];
|
p = &g->out[idx];
|
||||||
g->history[idx / 4] = 1;
|
g->history[idx / 4] = 1;
|
||||||
|
|
||||||
c = &g->color_table[g->codes[code].suffix * 4];
|
c = &g->color_table[g->codes[code].suffix * 4];
|
||||||
if (c[3] > 128) { // don't render transparent pixels;
|
if (c[3] > 128) { // don't render transparent pixels;
|
||||||
p[0] = c[2];
|
p[0] = c[2];
|
||||||
p[1] = c[1];
|
p[1] = c[1];
|
||||||
p[2] = c[0];
|
p[2] = c[0];
|
||||||
@ -6504,14 +6504,14 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
|
|||||||
// two back is the image from two frames ago, used for a very specific disposal format
|
// two back is the image from two frames ago, used for a very specific disposal format
|
||||||
static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back)
|
static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back)
|
||||||
{
|
{
|
||||||
int dispose;
|
int dispose;
|
||||||
int first_frame;
|
int first_frame;
|
||||||
int pi;
|
int pi;
|
||||||
int pcount;
|
int pcount;
|
||||||
STBI_NOTUSED(req_comp);
|
STBI_NOTUSED(req_comp);
|
||||||
|
|
||||||
// on first frame, any non-written pixels get the background colour (non-transparent)
|
// on first frame, any non-written pixels get the background colour (non-transparent)
|
||||||
first_frame = 0;
|
first_frame = 0;
|
||||||
if (g->out == 0) {
|
if (g->out == 0) {
|
||||||
if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header
|
if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header
|
||||||
if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
|
if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
|
||||||
@ -6523,17 +6523,17 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
|
|||||||
if (!g->out || !g->background || !g->history)
|
if (!g->out || !g->background || !g->history)
|
||||||
return stbi__errpuc("outofmem", "Out of memory");
|
return stbi__errpuc("outofmem", "Out of memory");
|
||||||
|
|
||||||
// image is treated as "transparent" at the start - ie, nothing overwrites the current background;
|
// image is treated as "transparent" at the start - ie, nothing overwrites the current background;
|
||||||
// background colour is only used for pixels that are not rendered first frame, after that "background"
|
// background colour is only used for pixels that are not rendered first frame, after that "background"
|
||||||
// color refers to the color that was there the previous frame.
|
// color refers to the color that was there the previous frame.
|
||||||
memset(g->out, 0x00, 4 * pcount);
|
memset(g->out, 0x00, 4 * pcount);
|
||||||
memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent)
|
memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent)
|
||||||
memset(g->history, 0x00, pcount); // pixels that were affected previous frame
|
memset(g->history, 0x00, pcount); // pixels that were affected previous frame
|
||||||
first_frame = 1;
|
first_frame = 1;
|
||||||
} else {
|
} else {
|
||||||
// second frame - how do we dispoase of the previous one?
|
// second frame - how do we dispoase of the previous one?
|
||||||
dispose = (g->eflags & 0x1C) >> 2;
|
dispose = (g->eflags & 0x1C) >> 2;
|
||||||
pcount = g->w * g->h;
|
pcount = g->w * g->h;
|
||||||
|
|
||||||
if ((dispose == 3) && (two_back == 0)) {
|
if ((dispose == 3) && (two_back == 0)) {
|
||||||
dispose = 2; // if I don't have an image to revert back to, default to the old background
|
dispose = 2; // if I don't have an image to revert back to, default to the old background
|
||||||
@ -6542,32 +6542,32 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
|
|||||||
if (dispose == 3) { // use previous graphic
|
if (dispose == 3) { // use previous graphic
|
||||||
for (pi = 0; pi < pcount; ++pi) {
|
for (pi = 0; pi < pcount; ++pi) {
|
||||||
if (g->history[pi]) {
|
if (g->history[pi]) {
|
||||||
memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );
|
memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (dispose == 2) {
|
} else if (dispose == 2) {
|
||||||
// restore what was changed last frame to background before that frame;
|
// restore what was changed last frame to background before that frame;
|
||||||
for (pi = 0; pi < pcount; ++pi) {
|
for (pi = 0; pi < pcount; ++pi) {
|
||||||
if (g->history[pi]) {
|
if (g->history[pi]) {
|
||||||
memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );
|
memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// This is a non-disposal case eithe way, so just
|
// This is a non-disposal case eithe way, so just
|
||||||
// leave the pixels as is, and they will become the new background
|
// leave the pixels as is, and they will become the new background
|
||||||
// 1: do not dispose
|
// 1: do not dispose
|
||||||
// 0: not specified.
|
// 0: not specified.
|
||||||
}
|
}
|
||||||
|
|
||||||
// background is what out is after the undoing of the previou frame;
|
// background is what out is after the undoing of the previou frame;
|
||||||
memcpy( g->background, g->out, 4 * g->w * g->h );
|
memcpy( g->background, g->out, 4 * g->w * g->h );
|
||||||
}
|
}
|
||||||
|
|
||||||
// clear my history;
|
// clear my history;
|
||||||
memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame
|
memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
int tag = stbi__get8(s);
|
int tag = stbi__get8(s);
|
||||||
switch (tag) {
|
switch (tag) {
|
||||||
case 0x2C: /* Image Descriptor */
|
case 0x2C: /* Image Descriptor */
|
||||||
{
|
{
|
||||||
@ -6612,19 +6612,19 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
|
|||||||
} else if (g->flags & 0x80) {
|
} else if (g->flags & 0x80) {
|
||||||
g->color_table = (stbi_uc *) g->pal;
|
g->color_table = (stbi_uc *) g->pal;
|
||||||
} else
|
} else
|
||||||
return stbi__errpuc("missing color table", "Corrupt GIF");
|
return stbi__errpuc("missing color table", "Corrupt GIF");
|
||||||
|
|
||||||
o = stbi__process_gif_raster(s, g);
|
o = stbi__process_gif_raster(s, g);
|
||||||
if (!o) return NULL;
|
if (!o) return NULL;
|
||||||
|
|
||||||
// if this was the first frame,
|
// if this was the first frame,
|
||||||
pcount = g->w * g->h;
|
pcount = g->w * g->h;
|
||||||
if (first_frame && (g->bgindex > 0)) {
|
if (first_frame && (g->bgindex > 0)) {
|
||||||
// if first frame, any pixel not drawn to gets the background color
|
// if first frame, any pixel not drawn to gets the background color
|
||||||
for (pi = 0; pi < pcount; ++pi) {
|
for (pi = 0; pi < pcount; ++pi) {
|
||||||
if (g->history[pi] == 0) {
|
if (g->history[pi] == 0) {
|
||||||
g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be;
|
g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be;
|
||||||
memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );
|
memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6635,7 +6635,7 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
|
|||||||
case 0x21: // Comment Extension.
|
case 0x21: // Comment Extension.
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
int ext = stbi__get8(s);
|
int ext = stbi__get8(s);
|
||||||
if (ext == 0xF9) { // Graphic Control Extension.
|
if (ext == 0xF9) { // Graphic Control Extension.
|
||||||
len = stbi__get8(s);
|
len = stbi__get8(s);
|
||||||
if (len == 4) {
|
if (len == 4) {
|
||||||
@ -6644,23 +6644,23 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
|
|||||||
|
|
||||||
// unset old transparent
|
// unset old transparent
|
||||||
if (g->transparent >= 0) {
|
if (g->transparent >= 0) {
|
||||||
g->pal[g->transparent][3] = 255;
|
g->pal[g->transparent][3] = 255;
|
||||||
}
|
}
|
||||||
if (g->eflags & 0x01) {
|
if (g->eflags & 0x01) {
|
||||||
g->transparent = stbi__get8(s);
|
g->transparent = stbi__get8(s);
|
||||||
if (g->transparent >= 0) {
|
if (g->transparent >= 0) {
|
||||||
g->pal[g->transparent][3] = 0;
|
g->pal[g->transparent][3] = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// don't need transparent
|
// don't need transparent
|
||||||
stbi__skip(s, 1);
|
stbi__skip(s, 1);
|
||||||
g->transparent = -1;
|
g->transparent = -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
stbi__skip(s, len);
|
stbi__skip(s, len);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while ((len = stbi__get8(s)) != 0) {
|
while ((len = stbi__get8(s)) != 0) {
|
||||||
stbi__skip(s, len);
|
stbi__skip(s, len);
|
||||||
}
|
}
|
||||||
@ -6679,15 +6679,15 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
|
|||||||
static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
|
static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
|
||||||
{
|
{
|
||||||
if (stbi__gif_test(s)) {
|
if (stbi__gif_test(s)) {
|
||||||
int layers = 0;
|
int layers = 0;
|
||||||
stbi_uc *u = 0;
|
stbi_uc *u = 0;
|
||||||
stbi_uc *out = 0;
|
stbi_uc *out = 0;
|
||||||
stbi_uc *two_back = 0;
|
stbi_uc *two_back = 0;
|
||||||
stbi__gif g;
|
stbi__gif g;
|
||||||
int stride;
|
int stride;
|
||||||
memset(&g, 0, sizeof(g));
|
memset(&g, 0, sizeof(g));
|
||||||
if (delays) {
|
if (delays) {
|
||||||
*delays = 0;
|
*delays = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
@ -6697,9 +6697,9 @@ static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y,
|
|||||||
if (u) {
|
if (u) {
|
||||||
*x = g.w;
|
*x = g.w;
|
||||||
*y = g.h;
|
*y = g.h;
|
||||||
++layers;
|
++layers;
|
||||||
stride = g.w * g.h * 4;
|
stride = g.w * g.h * 4;
|
||||||
|
|
||||||
if (out) {
|
if (out) {
|
||||||
void *tmp = (stbi_uc*) STBI_REALLOC( out, layers * stride );
|
void *tmp = (stbi_uc*) STBI_REALLOC( out, layers * stride );
|
||||||
if (NULL == tmp) {
|
if (NULL == tmp) {
|
||||||
@ -6711,38 +6711,38 @@ static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y,
|
|||||||
else
|
else
|
||||||
out = (stbi_uc*) tmp;
|
out = (stbi_uc*) tmp;
|
||||||
if (delays) {
|
if (delays) {
|
||||||
*delays = (int*) STBI_REALLOC( *delays, sizeof(int) * layers );
|
*delays = (int*) STBI_REALLOC( *delays, sizeof(int) * layers );
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
out = (stbi_uc*)stbi__malloc( layers * stride );
|
out = (stbi_uc*)stbi__malloc( layers * stride );
|
||||||
if (delays) {
|
if (delays) {
|
||||||
*delays = (int*) stbi__malloc( layers * sizeof(int) );
|
*delays = (int*) stbi__malloc( layers * sizeof(int) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
memcpy( out + ((layers - 1) * stride), u, stride );
|
memcpy( out + ((layers - 1) * stride), u, stride );
|
||||||
if (layers >= 2) {
|
if (layers >= 2) {
|
||||||
two_back = out - 2 * stride;
|
two_back = out - 2 * stride;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (delays) {
|
if (delays) {
|
||||||
(*delays)[layers - 1U] = g.delay;
|
(*delays)[layers - 1U] = g.delay;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (u != 0);
|
} while (u != 0);
|
||||||
|
|
||||||
// free temp buffer;
|
// free temp buffer;
|
||||||
STBI_FREE(g.out);
|
STBI_FREE(g.out);
|
||||||
STBI_FREE(g.history);
|
STBI_FREE(g.history);
|
||||||
STBI_FREE(g.background);
|
STBI_FREE(g.background);
|
||||||
|
|
||||||
// do the final conversion after loading everything;
|
// do the final conversion after loading everything;
|
||||||
if (req_comp && req_comp != 4)
|
if (req_comp && req_comp != 4)
|
||||||
out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
|
out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
|
||||||
|
|
||||||
*z = layers;
|
*z = layers;
|
||||||
return out;
|
return out;
|
||||||
} else {
|
} else {
|
||||||
return stbi__errpuc("not GIF", "Image was not as a gif type.");
|
return stbi__errpuc("not GIF", "Image was not as a gif type.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6760,7 +6760,7 @@ static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req
|
|||||||
*y = g.h;
|
*y = g.h;
|
||||||
|
|
||||||
// moved conversion to after successful load so that the same
|
// moved conversion to after successful load so that the same
|
||||||
// can be done for multiple frames.
|
// can be done for multiple frames.
|
||||||
if (req_comp && req_comp != 4)
|
if (req_comp && req_comp != 4)
|
||||||
u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
|
u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
|
||||||
} else if (g.out) {
|
} else if (g.out) {
|
||||||
@ -6768,9 +6768,9 @@ static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req
|
|||||||
STBI_FREE(g.out);
|
STBI_FREE(g.out);
|
||||||
}
|
}
|
||||||
|
|
||||||
// free buffers needed for multiple frame loading;
|
// free buffers needed for multiple frame loading;
|
||||||
STBI_FREE(g.history);
|
STBI_FREE(g.history);
|
||||||
STBI_FREE(g.background);
|
STBI_FREE(g.background);
|
||||||
|
|
||||||
return u;
|
return u;
|
||||||
}
|
}
|
||||||
@ -7433,7 +7433,7 @@ STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
revision history:
|
revision history:
|
||||||
2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
|
2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
|
||||||
2.19 (2018-02-11) fix warning
|
2.19 (2018-02-11) fix warning
|
||||||
2.18 (2018-01-30) fix warnings
|
2.18 (2018-01-30) fix warnings
|
||||||
2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug
|
2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug
|
||||||
|
@ -20,8 +20,8 @@
|
|||||||
output_pixels, out_w, out_h, 0,
|
output_pixels, out_w, out_h, 0,
|
||||||
num_channels , alpha_chan , 0)
|
num_channels , alpha_chan , 0)
|
||||||
stbir_resize_uint8_srgb_edgemode(
|
stbir_resize_uint8_srgb_edgemode(
|
||||||
input_pixels , in_w , in_h , 0,
|
input_pixels , in_w , in_h , 0,
|
||||||
output_pixels, out_w, out_h, 0,
|
output_pixels, out_w, out_h, 0,
|
||||||
num_channels , alpha_chan , 0, STBIR_EDGE_CLAMP)
|
num_channels , alpha_chan , 0, STBIR_EDGE_CLAMP)
|
||||||
// WRAP/REFLECT/ZERO
|
// WRAP/REFLECT/ZERO
|
||||||
|
|
||||||
@ -234,7 +234,7 @@ STBIRDEF int stbir_resize_float( const float *input_pixels , int input_w , i
|
|||||||
int num_channels);
|
int num_channels);
|
||||||
|
|
||||||
|
|
||||||
// The following functions interpret image data as gamma-corrected sRGB.
|
// The following functions interpret image data as gamma-corrected sRGB.
|
||||||
// Specify STBIR_ALPHA_CHANNEL_NONE if you have no alpha channel,
|
// Specify STBIR_ALPHA_CHANNEL_NONE if you have no alpha channel,
|
||||||
// or otherwise provide the index of the alpha channel. Flags value
|
// or otherwise provide the index of the alpha channel. Flags value
|
||||||
// of 0 will probably do the right thing if you're not sure what
|
// of 0 will probably do the right thing if you're not sure what
|
||||||
@ -307,19 +307,19 @@ typedef enum
|
|||||||
STBIRDEF int stbir_resize_uint8_generic( const unsigned char *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
|
STBIRDEF int stbir_resize_uint8_generic( const unsigned char *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
|
||||||
unsigned char *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
unsigned char *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
||||||
int num_channels, int alpha_channel, int flags,
|
int num_channels, int alpha_channel, int flags,
|
||||||
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
|
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
|
||||||
void *alloc_context);
|
void *alloc_context);
|
||||||
|
|
||||||
STBIRDEF int stbir_resize_uint16_generic(const stbir_uint16 *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
|
STBIRDEF int stbir_resize_uint16_generic(const stbir_uint16 *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
|
||||||
stbir_uint16 *output_pixels , int output_w, int output_h, int output_stride_in_bytes,
|
stbir_uint16 *output_pixels , int output_w, int output_h, int output_stride_in_bytes,
|
||||||
int num_channels, int alpha_channel, int flags,
|
int num_channels, int alpha_channel, int flags,
|
||||||
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
|
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
|
||||||
void *alloc_context);
|
void *alloc_context);
|
||||||
|
|
||||||
STBIRDEF int stbir_resize_float_generic( const float *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
|
STBIRDEF int stbir_resize_float_generic( const float *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
|
||||||
float *output_pixels , int output_w, int output_h, int output_stride_in_bytes,
|
float *output_pixels , int output_w, int output_h, int output_stride_in_bytes,
|
||||||
int num_channels, int alpha_channel, int flags,
|
int num_channels, int alpha_channel, int flags,
|
||||||
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
|
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
|
||||||
void *alloc_context);
|
void *alloc_context);
|
||||||
|
|
||||||
|
|
||||||
@ -351,7 +351,7 @@ STBIRDEF int stbir_resize( const void *input_pixels , int input_w , int
|
|||||||
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
||||||
stbir_datatype datatype,
|
stbir_datatype datatype,
|
||||||
int num_channels, int alpha_channel, int flags,
|
int num_channels, int alpha_channel, int flags,
|
||||||
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
|
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
|
||||||
stbir_filter filter_horizontal, stbir_filter filter_vertical,
|
stbir_filter filter_horizontal, stbir_filter filter_vertical,
|
||||||
stbir_colorspace space, void *alloc_context);
|
stbir_colorspace space, void *alloc_context);
|
||||||
|
|
||||||
@ -359,7 +359,7 @@ STBIRDEF int stbir_resize_subpixel(const void *input_pixels , int input_w , int
|
|||||||
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
||||||
stbir_datatype datatype,
|
stbir_datatype datatype,
|
||||||
int num_channels, int alpha_channel, int flags,
|
int num_channels, int alpha_channel, int flags,
|
||||||
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
|
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
|
||||||
stbir_filter filter_horizontal, stbir_filter filter_vertical,
|
stbir_filter filter_horizontal, stbir_filter filter_vertical,
|
||||||
stbir_colorspace space, void *alloc_context,
|
stbir_colorspace space, void *alloc_context,
|
||||||
float x_scale, float y_scale,
|
float x_scale, float y_scale,
|
||||||
@ -369,7 +369,7 @@ STBIRDEF int stbir_resize_region( const void *input_pixels , int input_w , int
|
|||||||
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
||||||
stbir_datatype datatype,
|
stbir_datatype datatype,
|
||||||
int num_channels, int alpha_channel, int flags,
|
int num_channels, int alpha_channel, int flags,
|
||||||
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
|
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
|
||||||
stbir_filter filter_horizontal, stbir_filter filter_vertical,
|
stbir_filter filter_horizontal, stbir_filter filter_vertical,
|
||||||
stbir_colorspace space, void *alloc_context,
|
stbir_colorspace space, void *alloc_context,
|
||||||
float s0, float t0, float s1, float t1);
|
float s0, float t0, float s1, float t1);
|
||||||
@ -671,14 +671,14 @@ static const stbir_uint32 fp32_to_srgb8_tab4[104] = {
|
|||||||
0x44c20798, 0x488e071e, 0x4c1c06b6, 0x4f76065d, 0x52a50610, 0x55ac05cc, 0x5892058f, 0x5b590559,
|
0x44c20798, 0x488e071e, 0x4c1c06b6, 0x4f76065d, 0x52a50610, 0x55ac05cc, 0x5892058f, 0x5b590559,
|
||||||
0x5e0c0a23, 0x631c0980, 0x67db08f6, 0x6c55087f, 0x70940818, 0x74a007bd, 0x787d076c, 0x7c330723,
|
0x5e0c0a23, 0x631c0980, 0x67db08f6, 0x6c55087f, 0x70940818, 0x74a007bd, 0x787d076c, 0x7c330723,
|
||||||
};
|
};
|
||||||
|
|
||||||
static stbir_uint8 stbir__linear_to_srgb_uchar(float in)
|
static stbir_uint8 stbir__linear_to_srgb_uchar(float in)
|
||||||
{
|
{
|
||||||
static const stbir__FP32 almostone = { 0x3f7fffff }; // 1-eps
|
static const stbir__FP32 almostone = { 0x3f7fffff }; // 1-eps
|
||||||
static const stbir__FP32 minval = { (127-13) << 23 };
|
static const stbir__FP32 minval = { (127-13) << 23 };
|
||||||
stbir_uint32 tab,bias,scale,t;
|
stbir_uint32 tab,bias,scale,t;
|
||||||
stbir__FP32 f;
|
stbir__FP32 f;
|
||||||
|
|
||||||
// Clamp to [2^(-13), 1-eps]; these two values map to 0 and 1, respectively.
|
// Clamp to [2^(-13), 1-eps]; these two values map to 0 and 1, respectively.
|
||||||
// The tests are carefully written so that NaNs map to 0, same as in the reference
|
// The tests are carefully written so that NaNs map to 0, same as in the reference
|
||||||
// implementation.
|
// implementation.
|
||||||
@ -686,13 +686,13 @@ static stbir_uint8 stbir__linear_to_srgb_uchar(float in)
|
|||||||
in = minval.f;
|
in = minval.f;
|
||||||
if (in > almostone.f)
|
if (in > almostone.f)
|
||||||
in = almostone.f;
|
in = almostone.f;
|
||||||
|
|
||||||
// Do the table lookup and unpack bias, scale
|
// Do the table lookup and unpack bias, scale
|
||||||
f.f = in;
|
f.f = in;
|
||||||
tab = fp32_to_srgb8_tab4[(f.u - minval.u) >> 20];
|
tab = fp32_to_srgb8_tab4[(f.u - minval.u) >> 20];
|
||||||
bias = (tab >> 16) << 9;
|
bias = (tab >> 16) << 9;
|
||||||
scale = tab & 0xffff;
|
scale = tab & 0xffff;
|
||||||
|
|
||||||
// Grab next-highest mantissa bits and perform linear interpolation
|
// Grab next-highest mantissa bits and perform linear interpolation
|
||||||
t = (f.u >> 12) & 0xff;
|
t = (f.u >> 12) & 0xff;
|
||||||
return (unsigned char) ((bias + scale*t) >> 16);
|
return (unsigned char) ((bias + scale*t) >> 16);
|
||||||
@ -2446,7 +2446,7 @@ static int stbir__resize_arbitrary(
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
result = stbir__resize_allocated(&info, input_data, input_stride_in_bytes,
|
result = stbir__resize_allocated(&info, input_data, input_stride_in_bytes,
|
||||||
output_data, output_stride_in_bytes,
|
output_data, output_stride_in_bytes,
|
||||||
alpha_channel, flags, type,
|
alpha_channel, flags, type,
|
||||||
edge_horizontal, edge_vertical,
|
edge_horizontal, edge_vertical,
|
||||||
colorspace, extra_memory, memory_required);
|
colorspace, extra_memory, memory_required);
|
||||||
@ -2500,7 +2500,7 @@ STBIRDEF int stbir_resize_uint8_srgb_edgemode(const unsigned char *input_pixels
|
|||||||
STBIRDEF int stbir_resize_uint8_generic( const unsigned char *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
|
STBIRDEF int stbir_resize_uint8_generic( const unsigned char *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
|
||||||
unsigned char *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
unsigned char *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
||||||
int num_channels, int alpha_channel, int flags,
|
int num_channels, int alpha_channel, int flags,
|
||||||
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
|
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
|
||||||
void *alloc_context)
|
void *alloc_context)
|
||||||
{
|
{
|
||||||
return stbir__resize_arbitrary(alloc_context, input_pixels, input_w, input_h, input_stride_in_bytes,
|
return stbir__resize_arbitrary(alloc_context, input_pixels, input_w, input_h, input_stride_in_bytes,
|
||||||
@ -2512,7 +2512,7 @@ STBIRDEF int stbir_resize_uint8_generic( const unsigned char *input_pixels , int
|
|||||||
STBIRDEF int stbir_resize_uint16_generic(const stbir_uint16 *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
|
STBIRDEF int stbir_resize_uint16_generic(const stbir_uint16 *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
|
||||||
stbir_uint16 *output_pixels , int output_w, int output_h, int output_stride_in_bytes,
|
stbir_uint16 *output_pixels , int output_w, int output_h, int output_stride_in_bytes,
|
||||||
int num_channels, int alpha_channel, int flags,
|
int num_channels, int alpha_channel, int flags,
|
||||||
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
|
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
|
||||||
void *alloc_context)
|
void *alloc_context)
|
||||||
{
|
{
|
||||||
return stbir__resize_arbitrary(alloc_context, input_pixels, input_w, input_h, input_stride_in_bytes,
|
return stbir__resize_arbitrary(alloc_context, input_pixels, input_w, input_h, input_stride_in_bytes,
|
||||||
@ -2525,7 +2525,7 @@ STBIRDEF int stbir_resize_uint16_generic(const stbir_uint16 *input_pixels , int
|
|||||||
STBIRDEF int stbir_resize_float_generic( const float *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
|
STBIRDEF int stbir_resize_float_generic( const float *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
|
||||||
float *output_pixels , int output_w, int output_h, int output_stride_in_bytes,
|
float *output_pixels , int output_w, int output_h, int output_stride_in_bytes,
|
||||||
int num_channels, int alpha_channel, int flags,
|
int num_channels, int alpha_channel, int flags,
|
||||||
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
|
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
|
||||||
void *alloc_context)
|
void *alloc_context)
|
||||||
{
|
{
|
||||||
return stbir__resize_arbitrary(alloc_context, input_pixels, input_w, input_h, input_stride_in_bytes,
|
return stbir__resize_arbitrary(alloc_context, input_pixels, input_w, input_h, input_stride_in_bytes,
|
||||||
@ -2539,7 +2539,7 @@ STBIRDEF int stbir_resize( const void *input_pixels , int input_w , int
|
|||||||
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
||||||
stbir_datatype datatype,
|
stbir_datatype datatype,
|
||||||
int num_channels, int alpha_channel, int flags,
|
int num_channels, int alpha_channel, int flags,
|
||||||
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
|
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
|
||||||
stbir_filter filter_horizontal, stbir_filter filter_vertical,
|
stbir_filter filter_horizontal, stbir_filter filter_vertical,
|
||||||
stbir_colorspace space, void *alloc_context)
|
stbir_colorspace space, void *alloc_context)
|
||||||
{
|
{
|
||||||
@ -2554,7 +2554,7 @@ STBIRDEF int stbir_resize_subpixel(const void *input_pixels , int input_w , int
|
|||||||
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
||||||
stbir_datatype datatype,
|
stbir_datatype datatype,
|
||||||
int num_channels, int alpha_channel, int flags,
|
int num_channels, int alpha_channel, int flags,
|
||||||
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
|
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
|
||||||
stbir_filter filter_horizontal, stbir_filter filter_vertical,
|
stbir_filter filter_horizontal, stbir_filter filter_vertical,
|
||||||
stbir_colorspace space, void *alloc_context,
|
stbir_colorspace space, void *alloc_context,
|
||||||
float x_scale, float y_scale,
|
float x_scale, float y_scale,
|
||||||
@ -2575,7 +2575,7 @@ STBIRDEF int stbir_resize_region( const void *input_pixels , int input_w , int
|
|||||||
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
|
||||||
stbir_datatype datatype,
|
stbir_datatype datatype,
|
||||||
int num_channels, int alpha_channel, int flags,
|
int num_channels, int alpha_channel, int flags,
|
||||||
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
|
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
|
||||||
stbir_filter filter_horizontal, stbir_filter filter_vertical,
|
stbir_filter filter_horizontal, stbir_filter filter_vertical,
|
||||||
stbir_colorspace space, void *alloc_context,
|
stbir_colorspace space, void *alloc_context,
|
||||||
float s0, float t0, float s1, float t1)
|
float s0, float t0, float s1, float t1)
|
||||||
@ -2594,38 +2594,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -105,7 +105,7 @@ USAGE:
|
|||||||
|
|
||||||
TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed
|
TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed
|
||||||
data, set the global variable 'stbi_write_tga_with_rle' to 0.
|
data, set the global variable 'stbi_write_tga_with_rle' to 0.
|
||||||
|
|
||||||
JPEG does ignore alpha channels in input data; quality is between 1 and 100.
|
JPEG does ignore alpha channels in input data; quality is between 1 and 100.
|
||||||
Higher quality looks better but results in a bigger image.
|
Higher quality looks better but results in a bigger image.
|
||||||
JPEG baseline (no JPEG progressive).
|
JPEG baseline (no JPEG progressive).
|
||||||
@ -113,7 +113,7 @@ USAGE:
|
|||||||
CREDITS:
|
CREDITS:
|
||||||
|
|
||||||
|
|
||||||
Sean Barrett - PNG/BMP/TGA
|
Sean Barrett - PNG/BMP/TGA
|
||||||
Baldur Karlsson - HDR
|
Baldur Karlsson - HDR
|
||||||
Jean-Sebastien Guay - TGA monochrome
|
Jean-Sebastien Guay - TGA monochrome
|
||||||
Tim Kelsey - misc enhancements
|
Tim Kelsey - misc enhancements
|
||||||
@ -306,7 +306,7 @@ static FILE *stbiw__fopen(char const *filename, char const *mode)
|
|||||||
wchar_t wFilename[1024];
|
wchar_t wFilename[1024];
|
||||||
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)))
|
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)))
|
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1044,13 +1044,13 @@ static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int
|
|||||||
int type = mymap[filter_type];
|
int type = mymap[filter_type];
|
||||||
unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y);
|
unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y);
|
||||||
int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes;
|
int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes;
|
||||||
|
|
||||||
if (type==0) {
|
if (type==0) {
|
||||||
memcpy(line_buffer, z, width*n);
|
memcpy(line_buffer, z, width*n);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// first loop isn't optimized since it's just one pixel
|
// first loop isn't optimized since it's just one pixel
|
||||||
for (i = 0; i < n; ++i) {
|
for (i = 0; i < n; ++i) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 1: line_buffer[i] = z[i]; break;
|
case 1: line_buffer[i] = z[i]; break;
|
||||||
@ -1410,7 +1410,7 @@ static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, in
|
|||||||
37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99};
|
37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99};
|
||||||
static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,
|
static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,
|
||||||
99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99};
|
99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99};
|
||||||
static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f,
|
static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f,
|
||||||
1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f };
|
1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f };
|
||||||
|
|
||||||
int row, col, i, k, subsample;
|
int row, col, i, k, subsample;
|
||||||
@ -1578,9 +1578,9 @@ STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const
|
|||||||
1.13
|
1.13
|
||||||
1.12
|
1.12
|
||||||
1.11 (2019-08-11)
|
1.11 (2019-08-11)
|
||||||
|
|
||||||
1.10 (2019-02-07)
|
1.10 (2019-02-07)
|
||||||
support utf8 filenames in Windows; fix warnings and platform ifdefs
|
support utf8 filenames in Windows; fix warnings and platform ifdefs
|
||||||
1.09 (2018-02-11)
|
1.09 (2018-02-11)
|
||||||
fix typo in zlib quality API, improve STB_I_W_STATIC in C++
|
fix typo in zlib quality API, improve STB_I_W_STATIC in C++
|
||||||
1.08 (2018-01-29)
|
1.08 (2018-01-29)
|
||||||
@ -1629,38 +1629,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -28,9 +28,9 @@
|
|||||||
// string.h strcpy, strncmp, memcpy
|
// string.h strcpy, strncmp, memcpy
|
||||||
//
|
//
|
||||||
// Credits:
|
// Credits:
|
||||||
//
|
//
|
||||||
// Written by Sean Barrett.
|
// Written by Sean Barrett.
|
||||||
//
|
//
|
||||||
// Fixes:
|
// Fixes:
|
||||||
// Michal Klos
|
// Michal Klos
|
||||||
|
|
||||||
@ -266,7 +266,7 @@ char *stb_include_strings(char **strs, int count, char *inject, char *path_to_in
|
|||||||
}
|
}
|
||||||
result = stb_include_string(text, inject, path_to_includes, filename, error);
|
result = stb_include_string(text, inject, path_to_includes, filename, error);
|
||||||
free(text);
|
free(text);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *stb_include_file(char *filename, char *inject, char *path_to_includes, char error[256])
|
char *stb_include_file(char *filename, char *inject, char *path_to_includes, char error[256])
|
||||||
|
@ -157,38 +157,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
126
stb_perlin.h
126
stb_perlin.h
@ -47,9 +47,9 @@
|
|||||||
//
|
//
|
||||||
// Fractal Noise:
|
// Fractal Noise:
|
||||||
//
|
//
|
||||||
// Three common fractal noise functions are included, which produce
|
// Three common fractal noise functions are included, which produce
|
||||||
// a wide variety of nice effects depending on the parameters
|
// a wide variety of nice effects depending on the parameters
|
||||||
// provided. Note that each function will call stb_perlin_noise3
|
// provided. Note that each function will call stb_perlin_noise3
|
||||||
// 'octaves' times, so this parameter will affect runtime.
|
// 'octaves' times, so this parameter will affect runtime.
|
||||||
//
|
//
|
||||||
// float stb_perlin_ridge_noise3(float x, float y, float z,
|
// float stb_perlin_ridge_noise3(float x, float y, float z,
|
||||||
@ -66,7 +66,7 @@
|
|||||||
// lacunarity = ~ 2.0 -- spacing between successive octaves (use exactly 2.0 for wrapping output)
|
// lacunarity = ~ 2.0 -- spacing between successive octaves (use exactly 2.0 for wrapping output)
|
||||||
// gain = 0.5 -- relative weighting applied to each successive octave
|
// gain = 0.5 -- relative weighting applied to each successive octave
|
||||||
// offset = 1.0? -- used to invert the ridges, may need to be larger, not sure
|
// offset = 1.0? -- used to invert the ridges, may need to be larger, not sure
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// Contributors:
|
// Contributors:
|
||||||
// Jack Mott - additional noise functions
|
// Jack Mott - additional noise functions
|
||||||
@ -95,41 +95,41 @@ extern float stb_perlin_noise3_wrap_nonpow2(float x, float y, float z, int x_wra
|
|||||||
// Perlin's table can be found at http://mrl.nyu.edu/~perlin/noise/
|
// Perlin's table can be found at http://mrl.nyu.edu/~perlin/noise/
|
||||||
static unsigned char stb__perlin_randtab[512] =
|
static unsigned char stb__perlin_randtab[512] =
|
||||||
{
|
{
|
||||||
23, 125, 161, 52, 103, 117, 70, 37, 247, 101, 203, 169, 124, 126, 44, 123,
|
23, 125, 161, 52, 103, 117, 70, 37, 247, 101, 203, 169, 124, 126, 44, 123,
|
||||||
152, 238, 145, 45, 171, 114, 253, 10, 192, 136, 4, 157, 249, 30, 35, 72,
|
152, 238, 145, 45, 171, 114, 253, 10, 192, 136, 4, 157, 249, 30, 35, 72,
|
||||||
175, 63, 77, 90, 181, 16, 96, 111, 133, 104, 75, 162, 93, 56, 66, 240,
|
175, 63, 77, 90, 181, 16, 96, 111, 133, 104, 75, 162, 93, 56, 66, 240,
|
||||||
8, 50, 84, 229, 49, 210, 173, 239, 141, 1, 87, 18, 2, 198, 143, 57,
|
8, 50, 84, 229, 49, 210, 173, 239, 141, 1, 87, 18, 2, 198, 143, 57,
|
||||||
225, 160, 58, 217, 168, 206, 245, 204, 199, 6, 73, 60, 20, 230, 211, 233,
|
225, 160, 58, 217, 168, 206, 245, 204, 199, 6, 73, 60, 20, 230, 211, 233,
|
||||||
94, 200, 88, 9, 74, 155, 33, 15, 219, 130, 226, 202, 83, 236, 42, 172,
|
94, 200, 88, 9, 74, 155, 33, 15, 219, 130, 226, 202, 83, 236, 42, 172,
|
||||||
165, 218, 55, 222, 46, 107, 98, 154, 109, 67, 196, 178, 127, 158, 13, 243,
|
165, 218, 55, 222, 46, 107, 98, 154, 109, 67, 196, 178, 127, 158, 13, 243,
|
||||||
65, 79, 166, 248, 25, 224, 115, 80, 68, 51, 184, 128, 232, 208, 151, 122,
|
65, 79, 166, 248, 25, 224, 115, 80, 68, 51, 184, 128, 232, 208, 151, 122,
|
||||||
26, 212, 105, 43, 179, 213, 235, 148, 146, 89, 14, 195, 28, 78, 112, 76,
|
26, 212, 105, 43, 179, 213, 235, 148, 146, 89, 14, 195, 28, 78, 112, 76,
|
||||||
250, 47, 24, 251, 140, 108, 186, 190, 228, 170, 183, 139, 39, 188, 244, 246,
|
250, 47, 24, 251, 140, 108, 186, 190, 228, 170, 183, 139, 39, 188, 244, 246,
|
||||||
132, 48, 119, 144, 180, 138, 134, 193, 82, 182, 120, 121, 86, 220, 209, 3,
|
132, 48, 119, 144, 180, 138, 134, 193, 82, 182, 120, 121, 86, 220, 209, 3,
|
||||||
91, 241, 149, 85, 205, 150, 113, 216, 31, 100, 41, 164, 177, 214, 153, 231,
|
91, 241, 149, 85, 205, 150, 113, 216, 31, 100, 41, 164, 177, 214, 153, 231,
|
||||||
38, 71, 185, 174, 97, 201, 29, 95, 7, 92, 54, 254, 191, 118, 34, 221,
|
38, 71, 185, 174, 97, 201, 29, 95, 7, 92, 54, 254, 191, 118, 34, 221,
|
||||||
131, 11, 163, 99, 234, 81, 227, 147, 156, 176, 17, 142, 69, 12, 110, 62,
|
131, 11, 163, 99, 234, 81, 227, 147, 156, 176, 17, 142, 69, 12, 110, 62,
|
||||||
27, 255, 0, 194, 59, 116, 242, 252, 19, 21, 187, 53, 207, 129, 64, 135,
|
27, 255, 0, 194, 59, 116, 242, 252, 19, 21, 187, 53, 207, 129, 64, 135,
|
||||||
61, 40, 167, 237, 102, 223, 106, 159, 197, 189, 215, 137, 36, 32, 22, 5,
|
61, 40, 167, 237, 102, 223, 106, 159, 197, 189, 215, 137, 36, 32, 22, 5,
|
||||||
|
|
||||||
// and a second copy so we don't need an extra mask or static initializer
|
// and a second copy so we don't need an extra mask or static initializer
|
||||||
23, 125, 161, 52, 103, 117, 70, 37, 247, 101, 203, 169, 124, 126, 44, 123,
|
23, 125, 161, 52, 103, 117, 70, 37, 247, 101, 203, 169, 124, 126, 44, 123,
|
||||||
152, 238, 145, 45, 171, 114, 253, 10, 192, 136, 4, 157, 249, 30, 35, 72,
|
152, 238, 145, 45, 171, 114, 253, 10, 192, 136, 4, 157, 249, 30, 35, 72,
|
||||||
175, 63, 77, 90, 181, 16, 96, 111, 133, 104, 75, 162, 93, 56, 66, 240,
|
175, 63, 77, 90, 181, 16, 96, 111, 133, 104, 75, 162, 93, 56, 66, 240,
|
||||||
8, 50, 84, 229, 49, 210, 173, 239, 141, 1, 87, 18, 2, 198, 143, 57,
|
8, 50, 84, 229, 49, 210, 173, 239, 141, 1, 87, 18, 2, 198, 143, 57,
|
||||||
225, 160, 58, 217, 168, 206, 245, 204, 199, 6, 73, 60, 20, 230, 211, 233,
|
225, 160, 58, 217, 168, 206, 245, 204, 199, 6, 73, 60, 20, 230, 211, 233,
|
||||||
94, 200, 88, 9, 74, 155, 33, 15, 219, 130, 226, 202, 83, 236, 42, 172,
|
94, 200, 88, 9, 74, 155, 33, 15, 219, 130, 226, 202, 83, 236, 42, 172,
|
||||||
165, 218, 55, 222, 46, 107, 98, 154, 109, 67, 196, 178, 127, 158, 13, 243,
|
165, 218, 55, 222, 46, 107, 98, 154, 109, 67, 196, 178, 127, 158, 13, 243,
|
||||||
65, 79, 166, 248, 25, 224, 115, 80, 68, 51, 184, 128, 232, 208, 151, 122,
|
65, 79, 166, 248, 25, 224, 115, 80, 68, 51, 184, 128, 232, 208, 151, 122,
|
||||||
26, 212, 105, 43, 179, 213, 235, 148, 146, 89, 14, 195, 28, 78, 112, 76,
|
26, 212, 105, 43, 179, 213, 235, 148, 146, 89, 14, 195, 28, 78, 112, 76,
|
||||||
250, 47, 24, 251, 140, 108, 186, 190, 228, 170, 183, 139, 39, 188, 244, 246,
|
250, 47, 24, 251, 140, 108, 186, 190, 228, 170, 183, 139, 39, 188, 244, 246,
|
||||||
132, 48, 119, 144, 180, 138, 134, 193, 82, 182, 120, 121, 86, 220, 209, 3,
|
132, 48, 119, 144, 180, 138, 134, 193, 82, 182, 120, 121, 86, 220, 209, 3,
|
||||||
91, 241, 149, 85, 205, 150, 113, 216, 31, 100, 41, 164, 177, 214, 153, 231,
|
91, 241, 149, 85, 205, 150, 113, 216, 31, 100, 41, 164, 177, 214, 153, 231,
|
||||||
38, 71, 185, 174, 97, 201, 29, 95, 7, 92, 54, 254, 191, 118, 34, 221,
|
38, 71, 185, 174, 97, 201, 29, 95, 7, 92, 54, 254, 191, 118, 34, 221,
|
||||||
131, 11, 163, 99, 234, 81, 227, 147, 156, 176, 17, 142, 69, 12, 110, 62,
|
131, 11, 163, 99, 234, 81, 227, 147, 156, 176, 17, 142, 69, 12, 110, 62,
|
||||||
27, 255, 0, 194, 59, 116, 242, 252, 19, 21, 187, 53, 207, 129, 64, 135,
|
27, 255, 0, 194, 59, 116, 242, 252, 19, 21, 187, 53, 207, 129, 64, 135,
|
||||||
61, 40, 167, 237, 102, 223, 106, 159, 197, 189, 215, 137, 36, 32, 22, 5,
|
61, 40, 167, 237, 102, 223, 106, 159, 197, 189, 215, 137, 36, 32, 22, 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// perlin's gradient has 12 cases so some get used 1/16th of the time
|
// perlin's gradient has 12 cases so some get used 1/16th of the time
|
||||||
@ -298,7 +298,7 @@ float stb_perlin_fbm_noise3(float x, float y, float z, float lacunarity, float g
|
|||||||
float frequency = 1.0f;
|
float frequency = 1.0f;
|
||||||
float amplitude = 1.0f;
|
float amplitude = 1.0f;
|
||||||
float sum = 0.0f;
|
float sum = 0.0f;
|
||||||
|
|
||||||
for (i = 0; i < octaves; i++) {
|
for (i = 0; i < octaves; i++) {
|
||||||
sum += stb_perlin_noise3_internal(x*frequency,y*frequency,z*frequency,0,0,0,(unsigned char)i)*amplitude;
|
sum += stb_perlin_noise3_internal(x*frequency,y*frequency,z*frequency,0,0,0,(unsigned char)i)*amplitude;
|
||||||
frequency *= lacunarity;
|
frequency *= lacunarity;
|
||||||
@ -313,7 +313,7 @@ float stb_perlin_turbulence_noise3(float x, float y, float z, float lacunarity,
|
|||||||
float frequency = 1.0f;
|
float frequency = 1.0f;
|
||||||
float amplitude = 1.0f;
|
float amplitude = 1.0f;
|
||||||
float sum = 0.0f;
|
float sum = 0.0f;
|
||||||
|
|
||||||
for (i = 0; i < octaves; i++) {
|
for (i = 0; i < octaves; i++) {
|
||||||
float r = stb_perlin_noise3_internal(x*frequency,y*frequency,z*frequency,0,0,0,(unsigned char)i)*amplitude;
|
float r = stb_perlin_noise3_internal(x*frequency,y*frequency,z*frequency,0,0,0,(unsigned char)i)*amplitude;
|
||||||
sum += (float) fabs(r);
|
sum += (float) fabs(r);
|
||||||
@ -391,38 +391,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
// Minor features
|
// Minor features
|
||||||
// Martins Mozeiko
|
// Martins Mozeiko
|
||||||
// github:IntellectualKitty
|
// github:IntellectualKitty
|
||||||
//
|
//
|
||||||
// Bugfixes / warning fixes
|
// Bugfixes / warning fixes
|
||||||
// Jeremy Jaussaud
|
// Jeremy Jaussaud
|
||||||
// Fabian Giesen
|
// Fabian Giesen
|
||||||
@ -432,7 +432,7 @@ static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int widt
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
tail = tail->next;
|
tail = tail->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fr.prev_link = best;
|
fr.prev_link = best;
|
||||||
@ -591,38 +591,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
// texts, as its performance does not scale and it has limited undo).
|
// texts, as its performance does not scale and it has limited undo).
|
||||||
//
|
//
|
||||||
// Non-trivial behaviors are modelled after Windows text controls.
|
// Non-trivial behaviors are modelled after Windows text controls.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// LICENSE
|
// LICENSE
|
||||||
//
|
//
|
||||||
@ -213,20 +213,20 @@
|
|||||||
// call this with the mouse x,y on a mouse down; it will update the cursor
|
// call this with the mouse x,y on a mouse down; it will update the cursor
|
||||||
// and reset the selection start/end to the cursor point. the x,y must
|
// and reset the selection start/end to the cursor point. the x,y must
|
||||||
// be relative to the text widget, with (0,0) being the top left.
|
// be relative to the text widget, with (0,0) being the top left.
|
||||||
//
|
//
|
||||||
// drag:
|
// drag:
|
||||||
// call this with the mouse x,y on a mouse drag/up; it will update the
|
// call this with the mouse x,y on a mouse drag/up; it will update the
|
||||||
// cursor and the selection end point
|
// cursor and the selection end point
|
||||||
//
|
//
|
||||||
// cut:
|
// cut:
|
||||||
// call this to delete the current selection; returns true if there was
|
// call this to delete the current selection; returns true if there was
|
||||||
// one. you should FIRST copy the current selection to the system paste buffer.
|
// one. you should FIRST copy the current selection to the system paste buffer.
|
||||||
// (To copy, just copy the current selection out of the string yourself.)
|
// (To copy, just copy the current selection out of the string yourself.)
|
||||||
//
|
//
|
||||||
// paste:
|
// paste:
|
||||||
// call this to paste text at the current cursor point or over the current
|
// call this to paste text at the current cursor point or over the current
|
||||||
// selection if there is one.
|
// selection if there is one.
|
||||||
//
|
//
|
||||||
// key:
|
// key:
|
||||||
// call this for keyboard inputs sent to the textfield. you can use it
|
// call this for keyboard inputs sent to the textfield. you can use it
|
||||||
// for "key down" events or for "translated" key events. if you need to
|
// for "key down" events or for "translated" key events. if you need to
|
||||||
@ -237,7 +237,7 @@
|
|||||||
// clear. STB_TEXTEDIT_KEYTYPE defaults to int, but you can #define it to
|
// clear. STB_TEXTEDIT_KEYTYPE defaults to int, but you can #define it to
|
||||||
// anything other type you wante before including.
|
// anything other type you wante before including.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// When rendering, you can read the cursor position and selection state from
|
// When rendering, you can read the cursor position and selection state from
|
||||||
// the STB_TexteditState.
|
// the STB_TexteditState.
|
||||||
//
|
//
|
||||||
@ -756,7 +756,7 @@ retry:
|
|||||||
state->insert_mode = !state->insert_mode;
|
state->insert_mode = !state->insert_mode;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case STB_TEXTEDIT_K_UNDO:
|
case STB_TEXTEDIT_K_UNDO:
|
||||||
stb_text_undo(str, state);
|
stb_text_undo(str, state);
|
||||||
state->has_preferred_x = 0;
|
state->has_preferred_x = 0;
|
||||||
@ -771,7 +771,7 @@ retry:
|
|||||||
// if currently there's a selection, move cursor to start of selection
|
// if currently there's a selection, move cursor to start of selection
|
||||||
if (STB_TEXT_HAS_SELECTION(state))
|
if (STB_TEXT_HAS_SELECTION(state))
|
||||||
stb_textedit_move_to_first(state);
|
stb_textedit_move_to_first(state);
|
||||||
else
|
else
|
||||||
if (state->cursor > 0)
|
if (state->cursor > 0)
|
||||||
--state->cursor;
|
--state->cursor;
|
||||||
state->has_preferred_x = 0;
|
state->has_preferred_x = 0;
|
||||||
@ -820,7 +820,7 @@ retry:
|
|||||||
|
|
||||||
#ifdef STB_TEXTEDIT_MOVEWORDRIGHT
|
#ifdef STB_TEXTEDIT_MOVEWORDRIGHT
|
||||||
case STB_TEXTEDIT_K_WORDRIGHT:
|
case STB_TEXTEDIT_K_WORDRIGHT:
|
||||||
if (STB_TEXT_HAS_SELECTION(state))
|
if (STB_TEXT_HAS_SELECTION(state))
|
||||||
stb_textedit_move_to_last(str, state);
|
stb_textedit_move_to_last(str, state);
|
||||||
else {
|
else {
|
||||||
state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor);
|
state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor);
|
||||||
@ -898,7 +898,7 @@ retry:
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case STB_TEXTEDIT_K_UP:
|
case STB_TEXTEDIT_K_UP:
|
||||||
case STB_TEXTEDIT_K_UP | STB_TEXTEDIT_K_SHIFT: {
|
case STB_TEXTEDIT_K_UP | STB_TEXTEDIT_K_SHIFT: {
|
||||||
StbFindState find;
|
StbFindState find;
|
||||||
@ -975,7 +975,7 @@ retry:
|
|||||||
}
|
}
|
||||||
state->has_preferred_x = 0;
|
state->has_preferred_x = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef STB_TEXTEDIT_K_TEXTSTART2
|
#ifdef STB_TEXTEDIT_K_TEXTSTART2
|
||||||
case STB_TEXTEDIT_K_TEXTSTART2:
|
case STB_TEXTEDIT_K_TEXTSTART2:
|
||||||
#endif
|
#endif
|
||||||
@ -992,7 +992,7 @@ retry:
|
|||||||
state->select_start = state->select_end = 0;
|
state->select_start = state->select_end = 0;
|
||||||
state->has_preferred_x = 0;
|
state->has_preferred_x = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef STB_TEXTEDIT_K_TEXTSTART2
|
#ifdef STB_TEXTEDIT_K_TEXTSTART2
|
||||||
case STB_TEXTEDIT_K_TEXTSTART2 | STB_TEXTEDIT_K_SHIFT:
|
case STB_TEXTEDIT_K_TEXTSTART2 | STB_TEXTEDIT_K_SHIFT:
|
||||||
#endif
|
#endif
|
||||||
@ -1367,38 +1367,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -147,7 +147,7 @@
|
|||||||
// while I'm editing? Will I lose my work?
|
// while I'm editing? Will I lose my work?
|
||||||
//
|
//
|
||||||
// A: The library allocates all editor memory when you create
|
// A: The library allocates all editor memory when you create
|
||||||
// the tilemap. It allocates a maximally-sized map and a
|
// the tilemap. It allocates a maximally-sized map and a
|
||||||
// fixed-size undo buffer (and the fixed-size copy buffer
|
// fixed-size undo buffer (and the fixed-size copy buffer
|
||||||
// is static), and never allocates memory while it's running.
|
// is static), and never allocates memory while it's running.
|
||||||
// So it can't fail due to running out of memory.
|
// So it can't fail due to running out of memory.
|
||||||
@ -171,7 +171,7 @@
|
|||||||
// void STBTE_DRAW_RECT(int x0, int y0, int x1, int y1, unsigned int color);
|
// void STBTE_DRAW_RECT(int x0, int y0, int x1, int y1, unsigned int color);
|
||||||
// // this must draw a filled rectangle (exclusive on right/bottom)
|
// // this must draw a filled rectangle (exclusive on right/bottom)
|
||||||
// // color = (r<<16)|(g<<8)|(b)
|
// // color = (r<<16)|(g<<8)|(b)
|
||||||
//
|
//
|
||||||
// void STBTE_DRAW_TILE(int x0, int y0,
|
// void STBTE_DRAW_TILE(int x0, int y0,
|
||||||
// unsigned short id, int highlight, float *data);
|
// unsigned short id, int highlight, float *data);
|
||||||
// // this draws the tile image identified by 'id' in one of several
|
// // this draws the tile image identified by 'id' in one of several
|
||||||
@ -206,7 +206,7 @@
|
|||||||
// // Changing the type of a parameter does not cause the underlying
|
// // Changing the type of a parameter does not cause the underlying
|
||||||
// // value to be clamped to the type min/max except when the tile is
|
// // value to be clamped to the type min/max except when the tile is
|
||||||
// // explicitly selected.
|
// // explicitly selected.
|
||||||
//
|
//
|
||||||
// #define STBTE_PROP_NAME(int n, short *tiledata, float *params) ...
|
// #define STBTE_PROP_NAME(int n, short *tiledata, float *params) ...
|
||||||
// // these return a string with the name for slot #n in the float
|
// // these return a string with the name for slot #n in the float
|
||||||
// // property list for the tile.
|
// // property list for the tile.
|
||||||
@ -297,7 +297,7 @@
|
|||||||
// - fix bug when pasting into protected layer
|
// - fix bug when pasting into protected layer
|
||||||
// - better color scheme
|
// - better color scheme
|
||||||
// - internal-use color picker
|
// - internal-use color picker
|
||||||
// 0.10 initial release
|
// 0.10 initial release
|
||||||
//
|
//
|
||||||
// TODO
|
// TODO
|
||||||
//
|
//
|
||||||
@ -436,7 +436,7 @@ extern void stbte_action(stbte_tilemap *tm, enum stbte_action act);
|
|||||||
|
|
||||||
////////////////
|
////////////////
|
||||||
//
|
//
|
||||||
// save/load
|
// save/load
|
||||||
//
|
//
|
||||||
// There is no editor file format. You have to save and load the data yourself
|
// There is no editor file format. You have to save and load the data yourself
|
||||||
// through the following functions. You can also use these functions to get the
|
// through the following functions. You can also use these functions to get the
|
||||||
@ -485,7 +485,7 @@ extern void stbte_set_link(stbte_tilemap *tm, int x, int y, int destx, int desty
|
|||||||
|
|
||||||
extern void stbte_set_background_tile(stbte_tilemap *tm, short id);
|
extern void stbte_set_background_tile(stbte_tilemap *tm, short id);
|
||||||
// selects the tile to fill the bottom layer with and used to clear bottom tiles to;
|
// selects the tile to fill the bottom layer with and used to clear bottom tiles to;
|
||||||
// should be same ID as
|
// should be same ID as
|
||||||
|
|
||||||
extern void stbte_set_sidewidths(int left, int right);
|
extern void stbte_set_sidewidths(int left, int right);
|
||||||
// call this once to set the left & right side widths. don't call
|
// call this once to set the left & right side widths. don't call
|
||||||
@ -1011,7 +1011,7 @@ stbte_tilemap *stbte_create_map(int map_x, int map_y, int map_layers, int spacin
|
|||||||
if (map_x < 0 || map_y < 0 || map_layers < 0 ||
|
if (map_x < 0 || map_y < 0 || map_layers < 0 ||
|
||||||
map_x > STBTE_MAX_TILEMAP_X || map_y > STBTE_MAX_TILEMAP_Y || map_layers > STBTE_MAX_LAYERS)
|
map_x > STBTE_MAX_TILEMAP_X || map_y > STBTE_MAX_TILEMAP_Y || map_layers > STBTE_MAX_LAYERS)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!stbte__ui.initted)
|
if (!stbte__ui.initted)
|
||||||
stbte__init_gui();
|
stbte__init_gui();
|
||||||
|
|
||||||
@ -1295,7 +1295,7 @@ static void stbte__prepare_tileinfo(stbte_tilemap *tm)
|
|||||||
|
|
||||||
// the undo system works by storing "commands" into a buffer, and
|
// the undo system works by storing "commands" into a buffer, and
|
||||||
// then playing back those commands. undo and redo have to store
|
// then playing back those commands. undo and redo have to store
|
||||||
// the commands in different order.
|
// the commands in different order.
|
||||||
//
|
//
|
||||||
// the commands are:
|
// the commands are:
|
||||||
//
|
//
|
||||||
@ -1549,7 +1549,7 @@ static void stbte__redo(stbte_tilemap *tm)
|
|||||||
|
|
||||||
// we found a complete redo record
|
// we found a complete redo record
|
||||||
pos = stbte__wrap(tm->undo_pos+1);
|
pos = stbte__wrap(tm->undo_pos+1);
|
||||||
|
|
||||||
// start an undo record
|
// start an undo record
|
||||||
stbte__write_undo(tm, STBTE__undo_record);
|
stbte__write_undo(tm, STBTE__undo_record);
|
||||||
|
|
||||||
@ -1594,7 +1594,7 @@ static void stbte__redo(stbte_tilemap *tm)
|
|||||||
tm->undo_buffer[tm->undo_pos] = STBTE__undo_junk;
|
tm->undo_buffer[tm->undo_pos] = STBTE__undo_junk;
|
||||||
}
|
}
|
||||||
|
|
||||||
// because detecting that undo is available
|
// because detecting that undo is available
|
||||||
static void stbte__recompute_undo_available(stbte_tilemap *tm)
|
static void stbte__recompute_undo_available(stbte_tilemap *tm)
|
||||||
{
|
{
|
||||||
tm->undo_available = (stbte__undo_find_end(tm) >= 0);
|
tm->undo_available = (stbte__undo_find_end(tm) >= 0);
|
||||||
@ -1692,7 +1692,7 @@ static void stbte__draw_bitmask_as_columns(int x, int y, short bitmask, int colo
|
|||||||
while (bitmask) {
|
while (bitmask) {
|
||||||
if (bitmask & (1<<i)) {
|
if (bitmask & (1<<i)) {
|
||||||
if (start_i < 0)
|
if (start_i < 0)
|
||||||
start_i = i;
|
start_i = i;
|
||||||
} else if (start_i >= 0) {
|
} else if (start_i >= 0) {
|
||||||
stbte__draw_rect(x, y+start_i, x+1, y+i, color);
|
stbte__draw_rect(x, y+start_i, x+1, y+i, color);
|
||||||
start_i = -1;
|
start_i = -1;
|
||||||
@ -1890,7 +1890,7 @@ static int stbte__microbutton_dragger(int x, int y, int size, int id, int *pos)
|
|||||||
break;
|
break;
|
||||||
case STBTE__mousemove:
|
case STBTE__mousemove:
|
||||||
if (STBTE__IS_ACTIVE(id) && stbte__ui.active_event == STBTE__leftdown) {
|
if (STBTE__IS_ACTIVE(id) && stbte__ui.active_event == STBTE__leftdown) {
|
||||||
*pos = stbte__ui.mx - stbte__ui.sx;
|
*pos = stbte__ui.mx - stbte__ui.sx;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case STBTE__leftup:
|
case STBTE__leftup:
|
||||||
@ -1907,7 +1907,7 @@ static int stbte__category_button(const char *label, int x, int y, int width, in
|
|||||||
{
|
{
|
||||||
int x0=x,y0=y, x1=x+width,y1=y+STBTE__BUTTON_HEIGHT;
|
int x0=x,y0=y, x1=x+width,y1=y+STBTE__BUTTON_HEIGHT;
|
||||||
int s = STBTE__BUTTON_INTERNAL_SPACING;
|
int s = STBTE__BUTTON_INTERNAL_SPACING;
|
||||||
|
|
||||||
if (stbte__ui.event == STBTE__paint)
|
if (stbte__ui.event == STBTE__paint)
|
||||||
stbte__draw_textbox(x0,y0,x1,y1, (char*) label, s,s, STBTE__ccategory_button, STBTE__INDEX_FOR_ID(id,0,toggled));
|
stbte__draw_textbox(x0,y0,x1,y1, (char*) label, s,s, STBTE__ccategory_button, STBTE__INDEX_FOR_ID(id,0,toggled));
|
||||||
|
|
||||||
@ -1962,7 +1962,7 @@ static int stbte__slider(int x0, int w, int y, int range, int *value, int id)
|
|||||||
#define stbte__sizeof(s) , sizeof(s)
|
#define stbte__sizeof(s) , sizeof(s)
|
||||||
#else
|
#else
|
||||||
#define stbte__sprintf sprintf
|
#define stbte__sprintf sprintf
|
||||||
#define stbte__sizeof(s)
|
#define stbte__sizeof(s)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int stbte__float_control(int x0, int y0, int w, float minv, float maxv, float scale, const char *fmt, float *value, int colormode, int id)
|
static int stbte__float_control(int x0, int y0, int w, float minv, float maxv, float scale, const char *fmt, float *value, int colormode, int id)
|
||||||
@ -2192,7 +2192,7 @@ static void stbte__compute_panel_locations(stbte_tilemap *tm)
|
|||||||
limit = 6 + stbte__ui.panel[STBTE__panel_categories].delta_height;
|
limit = 6 + stbte__ui.panel[STBTE__panel_categories].delta_height;
|
||||||
height[STBTE__panel_categories] = (tm->num_categories+1 > limit ? limit : tm->num_categories+1)*11 + 14;
|
height[STBTE__panel_categories] = (tm->num_categories+1 > limit ? limit : tm->num_categories+1)*11 + 14;
|
||||||
if (stbte__ui.panel[STBTE__panel_categories].side == stbte__ui.panel[STBTE__panel_categories].side)
|
if (stbte__ui.panel[STBTE__panel_categories].side == stbte__ui.panel[STBTE__panel_categories].side)
|
||||||
height[STBTE__panel_categories] -= 4;
|
height[STBTE__panel_categories] -= 4;
|
||||||
|
|
||||||
// palette
|
// palette
|
||||||
k = (stbte__region[p[STBTE__panel_tiles].side].width - 8) / tm->palette_spacing_x;
|
k = (stbte__region[p[STBTE__panel_tiles].side].width - 8) / tm->palette_spacing_x;
|
||||||
@ -3413,7 +3413,7 @@ static void stbte__layers(stbte_tilemap *tm, int x0, int y0, int w, int h)
|
|||||||
int x1 = x0+w;
|
int x1 = x0+w;
|
||||||
int y1 = y0+h;
|
int y1 = y0+h;
|
||||||
int xoff = 20;
|
int xoff = 20;
|
||||||
|
|
||||||
if (tm->has_layer_names) {
|
if (tm->has_layer_names) {
|
||||||
int side = stbte__ui.panel[STBTE__panel_layers].side;
|
int side = stbte__ui.panel[STBTE__panel_layers].side;
|
||||||
xoff = stbte__region[side].width - 42;
|
xoff = stbte__region[side].width - 42;
|
||||||
@ -3524,7 +3524,7 @@ static void stbte__palette_of_tiles(stbte_tilemap *tm, int x0, int y0, int w, in
|
|||||||
num_total_rows = (tm->cur_palette_count + num_columns-1) / num_columns; // ceil()
|
num_total_rows = (tm->cur_palette_count + num_columns-1) / num_columns; // ceil()
|
||||||
|
|
||||||
column = 0;
|
column = 0;
|
||||||
row = -tm->palette_scroll;
|
row = -tm->palette_scroll;
|
||||||
for (i=0; i < tm->num_tiles; ++i) {
|
for (i=0; i < tm->num_tiles; ++i) {
|
||||||
stbte__tileinfo *t = &tm->tiles[i];
|
stbte__tileinfo *t = &tm->tiles[i];
|
||||||
|
|
||||||
@ -3676,8 +3676,8 @@ static void stbte__colorpicker(int x0, int y0, int w, int h)
|
|||||||
|
|
||||||
y += 5;
|
y += 5;
|
||||||
x += 8;
|
x += 8;
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
int color = stbte__color_table[stbte__cp_mode][stbte__cp_aspect][stbte__cp_index];
|
int color = stbte__color_table[stbte__cp_mode][stbte__cp_aspect][stbte__cp_index];
|
||||||
int rgb[3];
|
int rgb[3];
|
||||||
@ -4124,38 +4124,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
118
stb_truetype.h
118
stb_truetype.h
@ -47,11 +47,11 @@
|
|||||||
// Kenney Phillis Jr. github:oyvindjam
|
// Kenney Phillis Jr. github:oyvindjam
|
||||||
// Brian Costabile github:vassvik
|
// Brian Costabile github:vassvik
|
||||||
// Ken Voskuil (kaesve) Ryan Griege
|
// Ken Voskuil (kaesve) Ryan Griege
|
||||||
//
|
//
|
||||||
// VERSION HISTORY
|
// VERSION HISTORY
|
||||||
//
|
//
|
||||||
// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS)
|
// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS)
|
||||||
// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined
|
// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined
|
||||||
// 1.21 (2019-02-25) fix warning
|
// 1.21 (2019-02-25) fix warning
|
||||||
// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics()
|
// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics()
|
||||||
// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod
|
// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod
|
||||||
@ -211,7 +211,7 @@
|
|||||||
//
|
//
|
||||||
// Advancing for the next character:
|
// Advancing for the next character:
|
||||||
// Call GlyphHMetrics, and compute 'current_point += SF * advance'.
|
// Call GlyphHMetrics, and compute 'current_point += SF * advance'.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// ADVANCED USAGE
|
// ADVANCED USAGE
|
||||||
//
|
//
|
||||||
@ -336,7 +336,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
//
|
//
|
||||||
// Output:
|
// Output:
|
||||||
//
|
//
|
||||||
@ -350,9 +350,9 @@ int main(int argc, char **argv)
|
|||||||
// :@@. M@M
|
// :@@. M@M
|
||||||
// @@@o@@@@
|
// @@@o@@@@
|
||||||
// :M@@V:@@.
|
// :M@@V:@@.
|
||||||
//
|
//
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Complete program: print "Hello World!" banner, with bugs
|
// Complete program: print "Hello World!" banner, with bugs
|
||||||
//
|
//
|
||||||
#if 0
|
#if 0
|
||||||
@ -653,7 +653,7 @@ STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, cons
|
|||||||
// Calling these functions in sequence is roughly equivalent to calling
|
// Calling these functions in sequence is roughly equivalent to calling
|
||||||
// stbtt_PackFontRanges(). If you more control over the packing of multiple
|
// stbtt_PackFontRanges(). If you more control over the packing of multiple
|
||||||
// fonts, or if you want to pack custom data into a font texture, take a look
|
// fonts, or if you want to pack custom data into a font texture, take a look
|
||||||
// at the source to of stbtt_PackFontRanges() and create a custom version
|
// at the source to of stbtt_PackFontRanges() and create a custom version
|
||||||
// using these functions, e.g. call GatherRects multiple times,
|
// using these functions, e.g. call GatherRects multiple times,
|
||||||
// building up a single array of rects, then call PackRects once,
|
// building up a single array of rects, then call PackRects once,
|
||||||
// then call RenderIntoRects repeatedly. This may result in a
|
// then call RenderIntoRects repeatedly. This may result in a
|
||||||
@ -978,7 +978,7 @@ STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, floa
|
|||||||
// and computing from that can allow drop-out prevention).
|
// and computing from that can allow drop-out prevention).
|
||||||
//
|
//
|
||||||
// The algorithm has not been optimized at all, so expect it to be slow
|
// The algorithm has not been optimized at all, so expect it to be slow
|
||||||
// if computing lots of characters or very large sizes.
|
// if computing lots of characters or very large sizes.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1365,7 +1365,7 @@ static int stbtt__get_svg(stbtt_fontinfo *info)
|
|||||||
}
|
}
|
||||||
return info->svg;
|
return info->svg;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart)
|
static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart)
|
||||||
{
|
{
|
||||||
stbtt_uint32 cmap, t;
|
stbtt_uint32 cmap, t;
|
||||||
@ -1753,7 +1753,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s
|
|||||||
if (i != 0)
|
if (i != 0)
|
||||||
num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy);
|
num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy);
|
||||||
|
|
||||||
// now start the new one
|
// now start the new one
|
||||||
start_off = !(flags & 1);
|
start_off = !(flags & 1);
|
||||||
if (start_off) {
|
if (start_off) {
|
||||||
// if we start off with an off-curve point, then when we need to find a point on the curve
|
// if we start off with an off-curve point, then when we need to find a point on the curve
|
||||||
@ -1806,7 +1806,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s
|
|||||||
int comp_num_verts = 0, i;
|
int comp_num_verts = 0, i;
|
||||||
stbtt_vertex *comp_verts = 0, *tmp = 0;
|
stbtt_vertex *comp_verts = 0, *tmp = 0;
|
||||||
float mtx[6] = {1,0,0,1,0,0}, m, n;
|
float mtx[6] = {1,0,0,1,0,0}, m, n;
|
||||||
|
|
||||||
flags = ttSHORT(comp); comp+=2;
|
flags = ttSHORT(comp); comp+=2;
|
||||||
gidx = ttSHORT(comp); comp+=2;
|
gidx = ttSHORT(comp); comp+=2;
|
||||||
|
|
||||||
@ -1836,7 +1836,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s
|
|||||||
mtx[2] = ttSHORT(comp)/16384.0f; comp+=2;
|
mtx[2] = ttSHORT(comp)/16384.0f; comp+=2;
|
||||||
mtx[3] = ttSHORT(comp)/16384.0f; comp+=2;
|
mtx[3] = ttSHORT(comp)/16384.0f; comp+=2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find transformation scales.
|
// Find transformation scales.
|
||||||
m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]);
|
m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]);
|
||||||
n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]);
|
n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]);
|
||||||
@ -2683,7 +2683,7 @@ STBTT_DEF stbtt_uint8 *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl)
|
|||||||
int i;
|
int i;
|
||||||
stbtt_uint8 *data = info->data;
|
stbtt_uint8 *data = info->data;
|
||||||
stbtt_uint8 *svg_doc_list = data + stbtt__get_svg((stbtt_fontinfo *) info);
|
stbtt_uint8 *svg_doc_list = data + stbtt__get_svg((stbtt_fontinfo *) info);
|
||||||
|
|
||||||
int numEntries = ttUSHORT(svg_doc_list);
|
int numEntries = ttUSHORT(svg_doc_list);
|
||||||
stbtt_uint8 *svg_docs = svg_doc_list + 2;
|
stbtt_uint8 *svg_docs = svg_doc_list + 2;
|
||||||
|
|
||||||
@ -2692,17 +2692,17 @@ STBTT_DEF stbtt_uint8 *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl)
|
|||||||
if ((gl >= ttUSHORT(svg_doc)) && (gl <= ttUSHORT(svg_doc + 2)))
|
if ((gl >= ttUSHORT(svg_doc)) && (gl <= ttUSHORT(svg_doc + 2)))
|
||||||
return svg_doc;
|
return svg_doc;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg)
|
STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg)
|
||||||
{
|
{
|
||||||
stbtt_uint8 *data = info->data;
|
stbtt_uint8 *data = info->data;
|
||||||
stbtt_uint8 *svg_doc;
|
stbtt_uint8 *svg_doc;
|
||||||
|
|
||||||
if(info->svg == 0)
|
if(info->svg == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(svg_doc = stbtt_FindSVGDoc(info, gl)) {
|
if(svg_doc = stbtt_FindSVGDoc(info, gl)) {
|
||||||
*svg = (char *)data + info->svg + ttULONG(svg_doc + 4);
|
*svg = (char *)data + info->svg + ttULONG(svg_doc + 4);
|
||||||
return ttULONG(svg_doc + 8);
|
return ttULONG(svg_doc + 8);
|
||||||
@ -2841,7 +2841,7 @@ static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, i
|
|||||||
float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0);
|
float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0);
|
||||||
STBTT_assert(z != NULL);
|
STBTT_assert(z != NULL);
|
||||||
if (!z) return z;
|
if (!z) return z;
|
||||||
|
|
||||||
// round dx down to avoid overshooting
|
// round dx down to avoid overshooting
|
||||||
if (dxdy < 0)
|
if (dxdy < 0)
|
||||||
z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy);
|
z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy);
|
||||||
@ -2919,7 +2919,7 @@ static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__ac
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
e = e->next;
|
e = e->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3647,7 +3647,7 @@ STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info
|
|||||||
{
|
{
|
||||||
int ix0,iy0,ix1,iy1;
|
int ix0,iy0,ix1,iy1;
|
||||||
stbtt__bitmap gbm;
|
stbtt__bitmap gbm;
|
||||||
stbtt_vertex *vertices;
|
stbtt_vertex *vertices;
|
||||||
int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices);
|
int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices);
|
||||||
|
|
||||||
if (scale_x == 0) scale_x = scale_y;
|
if (scale_x == 0) scale_x = scale_y;
|
||||||
@ -3670,7 +3670,7 @@ STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info
|
|||||||
if (height) *height = gbm.h;
|
if (height) *height = gbm.h;
|
||||||
if (xoff ) *xoff = ix0;
|
if (xoff ) *xoff = ix0;
|
||||||
if (yoff ) *yoff = iy0;
|
if (yoff ) *yoff = iy0;
|
||||||
|
|
||||||
if (gbm.w && gbm.h) {
|
if (gbm.w && gbm.h) {
|
||||||
gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata);
|
gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata);
|
||||||
if (gbm.pixels) {
|
if (gbm.pixels) {
|
||||||
@ -3681,7 +3681,7 @@ STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info
|
|||||||
}
|
}
|
||||||
STBTT_free(vertices, info->userdata);
|
STBTT_free(vertices, info->userdata);
|
||||||
return gbm.pixels;
|
return gbm.pixels;
|
||||||
}
|
}
|
||||||
|
|
||||||
STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff)
|
STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff)
|
||||||
{
|
{
|
||||||
@ -3693,7 +3693,7 @@ STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigne
|
|||||||
int ix0,iy0;
|
int ix0,iy0;
|
||||||
stbtt_vertex *vertices;
|
stbtt_vertex *vertices;
|
||||||
int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices);
|
int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices);
|
||||||
stbtt__bitmap gbm;
|
stbtt__bitmap gbm;
|
||||||
|
|
||||||
stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0);
|
stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0);
|
||||||
gbm.pixels = output;
|
gbm.pixels = output;
|
||||||
@ -3715,7 +3715,7 @@ STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *
|
|||||||
STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff)
|
STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff)
|
||||||
{
|
{
|
||||||
return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff);
|
return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff);
|
||||||
}
|
}
|
||||||
|
|
||||||
STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint)
|
STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint)
|
||||||
{
|
{
|
||||||
@ -3730,7 +3730,7 @@ STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, uns
|
|||||||
STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff)
|
STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff)
|
||||||
{
|
{
|
||||||
return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff);
|
return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff);
|
||||||
}
|
}
|
||||||
|
|
||||||
STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint)
|
STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint)
|
||||||
{
|
{
|
||||||
@ -3855,7 +3855,7 @@ static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *no
|
|||||||
con->y = 0;
|
con->y = 0;
|
||||||
con->bottom_y = 0;
|
con->bottom_y = 0;
|
||||||
STBTT__NOTUSED(nodes);
|
STBTT__NOTUSED(nodes);
|
||||||
STBTT__NOTUSED(num_nodes);
|
STBTT__NOTUSED(num_nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects)
|
static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects)
|
||||||
@ -4250,7 +4250,7 @@ STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char
|
|||||||
n = 0;
|
n = 0;
|
||||||
for (i=0; i < num_ranges; ++i)
|
for (i=0; i < num_ranges; ++i)
|
||||||
n += ranges[i].num_chars;
|
n += ranges[i].num_chars;
|
||||||
|
|
||||||
rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context);
|
rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context);
|
||||||
if (rects == NULL)
|
if (rects == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
@ -4261,7 +4261,7 @@ STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char
|
|||||||
n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects);
|
n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects);
|
||||||
|
|
||||||
stbtt_PackFontRangesPackRects(spc, rects, n);
|
stbtt_PackFontRangesPackRects(spc, rects, n);
|
||||||
|
|
||||||
return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects);
|
return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects);
|
||||||
|
|
||||||
STBTT_free(rects, spc->user_allocator_context);
|
STBTT_free(rects, spc->user_allocator_context);
|
||||||
@ -4422,7 +4422,7 @@ static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex
|
|||||||
int x1 = (int) verts[i ].x, y1 = (int) verts[i ].y;
|
int x1 = (int) verts[i ].x, y1 = (int) verts[i ].y;
|
||||||
if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) {
|
if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) {
|
||||||
float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0;
|
float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0;
|
||||||
if (x_inter < x)
|
if (x_inter < x)
|
||||||
winding += (y0 < y1) ? 1 : -1;
|
winding += (y0 < y1) ? 1 : -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4448,7 +4448,7 @@ static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex
|
|||||||
y1 = (int)verts[i ].y;
|
y1 = (int)verts[i ].y;
|
||||||
if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) {
|
if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) {
|
||||||
float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0;
|
float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0;
|
||||||
if (x_inter < x)
|
if (x_inter < x)
|
||||||
winding += (y0 < y1) ? 1 : -1;
|
winding += (y0 < y1) ? 1 : -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -4460,7 +4460,7 @@ static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex
|
|||||||
if (hits[1][0] < 0)
|
if (hits[1][0] < 0)
|
||||||
winding += (hits[1][1] < 0 ? -1 : 1);
|
winding += (hits[1][1] < 0 ? -1 : 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return winding;
|
return winding;
|
||||||
@ -4536,7 +4536,7 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
|
|||||||
|
|
||||||
// invert for y-downwards bitmaps
|
// invert for y-downwards bitmaps
|
||||||
scale_y = -scale_y;
|
scale_y = -scale_y;
|
||||||
|
|
||||||
{
|
{
|
||||||
int x,y,i,j;
|
int x,y,i,j;
|
||||||
float *precompute;
|
float *precompute;
|
||||||
@ -4685,7 +4685,7 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
|
|||||||
STBTT_free(verts, info->userdata);
|
STBTT_free(verts, info->userdata);
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff)
|
STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff)
|
||||||
{
|
{
|
||||||
@ -4703,7 +4703,7 @@ STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata)
|
|||||||
//
|
//
|
||||||
|
|
||||||
// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string
|
// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string
|
||||||
static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2)
|
static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2)
|
||||||
{
|
{
|
||||||
stbtt_int32 i=0;
|
stbtt_int32 i=0;
|
||||||
|
|
||||||
@ -4742,7 +4742,7 @@ static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, s
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2)
|
static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2)
|
||||||
{
|
{
|
||||||
return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2);
|
return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2);
|
||||||
}
|
}
|
||||||
@ -4871,7 +4871,7 @@ STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset,
|
|||||||
|
|
||||||
STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index)
|
STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index)
|
||||||
{
|
{
|
||||||
return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index);
|
return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data)
|
STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data)
|
||||||
@ -4964,38 +4964,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
220
stb_vorbis.c
220
stb_vorbis.c
@ -41,7 +41,7 @@
|
|||||||
// 1.14 - 2018-02-11 - delete bogus dealloca usage
|
// 1.14 - 2018-02-11 - delete bogus dealloca usage
|
||||||
// 1.13 - 2018-01-29 - fix truncation of last frame (hopefully)
|
// 1.13 - 2018-01-29 - fix truncation of last frame (hopefully)
|
||||||
// 1.12 - 2017-11-21 - limit residue begin/end to blocksize/2 to avoid large temp allocs in bad/corrupt files
|
// 1.12 - 2017-11-21 - limit residue begin/end to blocksize/2 to avoid large temp allocs in bad/corrupt files
|
||||||
// 1.11 - 2017-07-23 - fix MinGW compilation
|
// 1.11 - 2017-07-23 - fix MinGW compilation
|
||||||
// 1.10 - 2017-03-03 - more robust seeking; fix negative ilog(); clear error in open_memory
|
// 1.10 - 2017-03-03 - more robust seeking; fix negative ilog(); clear error in open_memory
|
||||||
// 1.09 - 2016-04-04 - back out 'truncation of last frame' fix from previous version
|
// 1.09 - 2016-04-04 - back out 'truncation of last frame' fix from previous version
|
||||||
// 1.08 - 2016-04-02 - warnings; setup memory leaks; truncation of last frame
|
// 1.08 - 2016-04-02 - warnings; setup memory leaks; truncation of last frame
|
||||||
@ -844,7 +844,7 @@ struct stb_vorbis
|
|||||||
int current_loc_valid;
|
int current_loc_valid;
|
||||||
|
|
||||||
// per-blocksize precomputed data
|
// per-blocksize precomputed data
|
||||||
|
|
||||||
// twiddle factors
|
// twiddle factors
|
||||||
float *A[2],*B[2],*C[2];
|
float *A[2],*B[2],*C[2];
|
||||||
float *window[2];
|
float *window[2];
|
||||||
@ -1166,7 +1166,7 @@ static void compute_sorted_huffman(Codebook *c, uint8 *lengths, uint32 *values)
|
|||||||
if (!c->sparse) {
|
if (!c->sparse) {
|
||||||
int k = 0;
|
int k = 0;
|
||||||
for (i=0; i < c->entries; ++i)
|
for (i=0; i < c->entries; ++i)
|
||||||
if (include_in_sort(c, lengths[i]))
|
if (include_in_sort(c, lengths[i]))
|
||||||
c->sorted_codewords[k++] = bit_reverse(c->codewords[i]);
|
c->sorted_codewords[k++] = bit_reverse(c->codewords[i]);
|
||||||
assert(k == c->sorted_entries);
|
assert(k == c->sorted_entries);
|
||||||
} else {
|
} else {
|
||||||
@ -1349,7 +1349,7 @@ static int getn(vorb *z, uint8 *data, int n)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef STB_VORBIS_NO_STDIO
|
#ifndef STB_VORBIS_NO_STDIO
|
||||||
if (fread(data, n, 1, z->f) == 1)
|
if (fread(data, n, 1, z->f) == 1)
|
||||||
return 1;
|
return 1;
|
||||||
else {
|
else {
|
||||||
@ -1432,7 +1432,7 @@ static int start_page_no_capturepattern(vorb *f)
|
|||||||
// header flag
|
// header flag
|
||||||
f->page_flag = get8(f);
|
f->page_flag = get8(f);
|
||||||
// absolute granule position
|
// absolute granule position
|
||||||
loc0 = get32(f);
|
loc0 = get32(f);
|
||||||
loc1 = get32(f);
|
loc1 = get32(f);
|
||||||
// @TODO: validate loc0,loc1 as valid positions?
|
// @TODO: validate loc0,loc1 as valid positions?
|
||||||
// stream serial number -- vorbis doesn't interleave, so discard
|
// stream serial number -- vorbis doesn't interleave, so discard
|
||||||
@ -1924,69 +1924,69 @@ static int predict_point(int x, int x0, int x1, int y0, int y1)
|
|||||||
// the following table is block-copied from the specification
|
// the following table is block-copied from the specification
|
||||||
static float inverse_db_table[256] =
|
static float inverse_db_table[256] =
|
||||||
{
|
{
|
||||||
1.0649863e-07f, 1.1341951e-07f, 1.2079015e-07f, 1.2863978e-07f,
|
1.0649863e-07f, 1.1341951e-07f, 1.2079015e-07f, 1.2863978e-07f,
|
||||||
1.3699951e-07f, 1.4590251e-07f, 1.5538408e-07f, 1.6548181e-07f,
|
1.3699951e-07f, 1.4590251e-07f, 1.5538408e-07f, 1.6548181e-07f,
|
||||||
1.7623575e-07f, 1.8768855e-07f, 1.9988561e-07f, 2.1287530e-07f,
|
1.7623575e-07f, 1.8768855e-07f, 1.9988561e-07f, 2.1287530e-07f,
|
||||||
2.2670913e-07f, 2.4144197e-07f, 2.5713223e-07f, 2.7384213e-07f,
|
2.2670913e-07f, 2.4144197e-07f, 2.5713223e-07f, 2.7384213e-07f,
|
||||||
2.9163793e-07f, 3.1059021e-07f, 3.3077411e-07f, 3.5226968e-07f,
|
2.9163793e-07f, 3.1059021e-07f, 3.3077411e-07f, 3.5226968e-07f,
|
||||||
3.7516214e-07f, 3.9954229e-07f, 4.2550680e-07f, 4.5315863e-07f,
|
3.7516214e-07f, 3.9954229e-07f, 4.2550680e-07f, 4.5315863e-07f,
|
||||||
4.8260743e-07f, 5.1396998e-07f, 5.4737065e-07f, 5.8294187e-07f,
|
4.8260743e-07f, 5.1396998e-07f, 5.4737065e-07f, 5.8294187e-07f,
|
||||||
6.2082472e-07f, 6.6116941e-07f, 7.0413592e-07f, 7.4989464e-07f,
|
6.2082472e-07f, 6.6116941e-07f, 7.0413592e-07f, 7.4989464e-07f,
|
||||||
7.9862701e-07f, 8.5052630e-07f, 9.0579828e-07f, 9.6466216e-07f,
|
7.9862701e-07f, 8.5052630e-07f, 9.0579828e-07f, 9.6466216e-07f,
|
||||||
1.0273513e-06f, 1.0941144e-06f, 1.1652161e-06f, 1.2409384e-06f,
|
1.0273513e-06f, 1.0941144e-06f, 1.1652161e-06f, 1.2409384e-06f,
|
||||||
1.3215816e-06f, 1.4074654e-06f, 1.4989305e-06f, 1.5963394e-06f,
|
1.3215816e-06f, 1.4074654e-06f, 1.4989305e-06f, 1.5963394e-06f,
|
||||||
1.7000785e-06f, 1.8105592e-06f, 1.9282195e-06f, 2.0535261e-06f,
|
1.7000785e-06f, 1.8105592e-06f, 1.9282195e-06f, 2.0535261e-06f,
|
||||||
2.1869758e-06f, 2.3290978e-06f, 2.4804557e-06f, 2.6416497e-06f,
|
2.1869758e-06f, 2.3290978e-06f, 2.4804557e-06f, 2.6416497e-06f,
|
||||||
2.8133190e-06f, 2.9961443e-06f, 3.1908506e-06f, 3.3982101e-06f,
|
2.8133190e-06f, 2.9961443e-06f, 3.1908506e-06f, 3.3982101e-06f,
|
||||||
3.6190449e-06f, 3.8542308e-06f, 4.1047004e-06f, 4.3714470e-06f,
|
3.6190449e-06f, 3.8542308e-06f, 4.1047004e-06f, 4.3714470e-06f,
|
||||||
4.6555282e-06f, 4.9580707e-06f, 5.2802740e-06f, 5.6234160e-06f,
|
4.6555282e-06f, 4.9580707e-06f, 5.2802740e-06f, 5.6234160e-06f,
|
||||||
5.9888572e-06f, 6.3780469e-06f, 6.7925283e-06f, 7.2339451e-06f,
|
5.9888572e-06f, 6.3780469e-06f, 6.7925283e-06f, 7.2339451e-06f,
|
||||||
7.7040476e-06f, 8.2047000e-06f, 8.7378876e-06f, 9.3057248e-06f,
|
7.7040476e-06f, 8.2047000e-06f, 8.7378876e-06f, 9.3057248e-06f,
|
||||||
9.9104632e-06f, 1.0554501e-05f, 1.1240392e-05f, 1.1970856e-05f,
|
9.9104632e-06f, 1.0554501e-05f, 1.1240392e-05f, 1.1970856e-05f,
|
||||||
1.2748789e-05f, 1.3577278e-05f, 1.4459606e-05f, 1.5399272e-05f,
|
1.2748789e-05f, 1.3577278e-05f, 1.4459606e-05f, 1.5399272e-05f,
|
||||||
1.6400004e-05f, 1.7465768e-05f, 1.8600792e-05f, 1.9809576e-05f,
|
1.6400004e-05f, 1.7465768e-05f, 1.8600792e-05f, 1.9809576e-05f,
|
||||||
2.1096914e-05f, 2.2467911e-05f, 2.3928002e-05f, 2.5482978e-05f,
|
2.1096914e-05f, 2.2467911e-05f, 2.3928002e-05f, 2.5482978e-05f,
|
||||||
2.7139006e-05f, 2.8902651e-05f, 3.0780908e-05f, 3.2781225e-05f,
|
2.7139006e-05f, 2.8902651e-05f, 3.0780908e-05f, 3.2781225e-05f,
|
||||||
3.4911534e-05f, 3.7180282e-05f, 3.9596466e-05f, 4.2169667e-05f,
|
3.4911534e-05f, 3.7180282e-05f, 3.9596466e-05f, 4.2169667e-05f,
|
||||||
4.4910090e-05f, 4.7828601e-05f, 5.0936773e-05f, 5.4246931e-05f,
|
4.4910090e-05f, 4.7828601e-05f, 5.0936773e-05f, 5.4246931e-05f,
|
||||||
5.7772202e-05f, 6.1526565e-05f, 6.5524908e-05f, 6.9783085e-05f,
|
5.7772202e-05f, 6.1526565e-05f, 6.5524908e-05f, 6.9783085e-05f,
|
||||||
7.4317983e-05f, 7.9147585e-05f, 8.4291040e-05f, 8.9768747e-05f,
|
7.4317983e-05f, 7.9147585e-05f, 8.4291040e-05f, 8.9768747e-05f,
|
||||||
9.5602426e-05f, 0.00010181521f, 0.00010843174f, 0.00011547824f,
|
9.5602426e-05f, 0.00010181521f, 0.00010843174f, 0.00011547824f,
|
||||||
0.00012298267f, 0.00013097477f, 0.00013948625f, 0.00014855085f,
|
0.00012298267f, 0.00013097477f, 0.00013948625f, 0.00014855085f,
|
||||||
0.00015820453f, 0.00016848555f, 0.00017943469f, 0.00019109536f,
|
0.00015820453f, 0.00016848555f, 0.00017943469f, 0.00019109536f,
|
||||||
0.00020351382f, 0.00021673929f, 0.00023082423f, 0.00024582449f,
|
0.00020351382f, 0.00021673929f, 0.00023082423f, 0.00024582449f,
|
||||||
0.00026179955f, 0.00027881276f, 0.00029693158f, 0.00031622787f,
|
0.00026179955f, 0.00027881276f, 0.00029693158f, 0.00031622787f,
|
||||||
0.00033677814f, 0.00035866388f, 0.00038197188f, 0.00040679456f,
|
0.00033677814f, 0.00035866388f, 0.00038197188f, 0.00040679456f,
|
||||||
0.00043323036f, 0.00046138411f, 0.00049136745f, 0.00052329927f,
|
0.00043323036f, 0.00046138411f, 0.00049136745f, 0.00052329927f,
|
||||||
0.00055730621f, 0.00059352311f, 0.00063209358f, 0.00067317058f,
|
0.00055730621f, 0.00059352311f, 0.00063209358f, 0.00067317058f,
|
||||||
0.00071691700f, 0.00076350630f, 0.00081312324f, 0.00086596457f,
|
0.00071691700f, 0.00076350630f, 0.00081312324f, 0.00086596457f,
|
||||||
0.00092223983f, 0.00098217216f, 0.0010459992f, 0.0011139742f,
|
0.00092223983f, 0.00098217216f, 0.0010459992f, 0.0011139742f,
|
||||||
0.0011863665f, 0.0012634633f, 0.0013455702f, 0.0014330129f,
|
0.0011863665f, 0.0012634633f, 0.0013455702f, 0.0014330129f,
|
||||||
0.0015261382f, 0.0016253153f, 0.0017309374f, 0.0018434235f,
|
0.0015261382f, 0.0016253153f, 0.0017309374f, 0.0018434235f,
|
||||||
0.0019632195f, 0.0020908006f, 0.0022266726f, 0.0023713743f,
|
0.0019632195f, 0.0020908006f, 0.0022266726f, 0.0023713743f,
|
||||||
0.0025254795f, 0.0026895994f, 0.0028643847f, 0.0030505286f,
|
0.0025254795f, 0.0026895994f, 0.0028643847f, 0.0030505286f,
|
||||||
0.0032487691f, 0.0034598925f, 0.0036847358f, 0.0039241906f,
|
0.0032487691f, 0.0034598925f, 0.0036847358f, 0.0039241906f,
|
||||||
0.0041792066f, 0.0044507950f, 0.0047400328f, 0.0050480668f,
|
0.0041792066f, 0.0044507950f, 0.0047400328f, 0.0050480668f,
|
||||||
0.0053761186f, 0.0057254891f, 0.0060975636f, 0.0064938176f,
|
0.0053761186f, 0.0057254891f, 0.0060975636f, 0.0064938176f,
|
||||||
0.0069158225f, 0.0073652516f, 0.0078438871f, 0.0083536271f,
|
0.0069158225f, 0.0073652516f, 0.0078438871f, 0.0083536271f,
|
||||||
0.0088964928f, 0.009474637f, 0.010090352f, 0.010746080f,
|
0.0088964928f, 0.009474637f, 0.010090352f, 0.010746080f,
|
||||||
0.011444421f, 0.012188144f, 0.012980198f, 0.013823725f,
|
0.011444421f, 0.012188144f, 0.012980198f, 0.013823725f,
|
||||||
0.014722068f, 0.015678791f, 0.016697687f, 0.017782797f,
|
0.014722068f, 0.015678791f, 0.016697687f, 0.017782797f,
|
||||||
0.018938423f, 0.020169149f, 0.021479854f, 0.022875735f,
|
0.018938423f, 0.020169149f, 0.021479854f, 0.022875735f,
|
||||||
0.024362330f, 0.025945531f, 0.027631618f, 0.029427276f,
|
0.024362330f, 0.025945531f, 0.027631618f, 0.029427276f,
|
||||||
0.031339626f, 0.033376252f, 0.035545228f, 0.037855157f,
|
0.031339626f, 0.033376252f, 0.035545228f, 0.037855157f,
|
||||||
0.040315199f, 0.042935108f, 0.045725273f, 0.048696758f,
|
0.040315199f, 0.042935108f, 0.045725273f, 0.048696758f,
|
||||||
0.051861348f, 0.055231591f, 0.058820850f, 0.062643361f,
|
0.051861348f, 0.055231591f, 0.058820850f, 0.062643361f,
|
||||||
0.066714279f, 0.071049749f, 0.075666962f, 0.080584227f,
|
0.066714279f, 0.071049749f, 0.075666962f, 0.080584227f,
|
||||||
0.085821044f, 0.091398179f, 0.097337747f, 0.10366330f,
|
0.085821044f, 0.091398179f, 0.097337747f, 0.10366330f,
|
||||||
0.11039993f, 0.11757434f, 0.12521498f, 0.13335215f,
|
0.11039993f, 0.11757434f, 0.12521498f, 0.13335215f,
|
||||||
0.14201813f, 0.15124727f, 0.16107617f, 0.17154380f,
|
0.14201813f, 0.15124727f, 0.16107617f, 0.17154380f,
|
||||||
0.18269168f, 0.19456402f, 0.20720788f, 0.22067342f,
|
0.18269168f, 0.19456402f, 0.20720788f, 0.22067342f,
|
||||||
0.23501402f, 0.25028656f, 0.26655159f, 0.28387361f,
|
0.23501402f, 0.25028656f, 0.26655159f, 0.28387361f,
|
||||||
0.30232132f, 0.32196786f, 0.34289114f, 0.36517414f,
|
0.30232132f, 0.32196786f, 0.34289114f, 0.36517414f,
|
||||||
0.38890521f, 0.41417847f, 0.44109412f, 0.46975890f,
|
0.38890521f, 0.41417847f, 0.44109412f, 0.46975890f,
|
||||||
0.50028648f, 0.53279791f, 0.56742212f, 0.60429640f,
|
0.50028648f, 0.53279791f, 0.56742212f, 0.60429640f,
|
||||||
0.64356699f, 0.68538959f, 0.72993007f, 0.77736504f,
|
0.64356699f, 0.68538959f, 0.72993007f, 0.77736504f,
|
||||||
0.82788260f, 0.88168307f, 0.9389798f, 1.0f
|
0.82788260f, 0.88168307f, 0.9389798f, 1.0f
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2347,11 +2347,11 @@ void inverse_mdct_slow(float *buffer, int n, vorb *f, int blocktype)
|
|||||||
#if LIBVORBIS_MDCT
|
#if LIBVORBIS_MDCT
|
||||||
// directly call the vorbis MDCT using an interface documented
|
// directly call the vorbis MDCT using an interface documented
|
||||||
// by Jeff Roberts... useful for performance comparison
|
// by Jeff Roberts... useful for performance comparison
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
int log2n;
|
int log2n;
|
||||||
|
|
||||||
float *trig;
|
float *trig;
|
||||||
int *bitrev;
|
int *bitrev;
|
||||||
|
|
||||||
@ -2370,7 +2370,7 @@ void inverse_mdct(float *buffer, int n, vorb *f, int blocktype)
|
|||||||
if (M1.n == n) M = &M1;
|
if (M1.n == n) M = &M1;
|
||||||
else if (M2.n == n) M = &M2;
|
else if (M2.n == n) M = &M2;
|
||||||
else if (M1.n == 0) { mdct_init(&M1, n); M = &M1; }
|
else if (M1.n == 0) { mdct_init(&M1, n); M = &M1; }
|
||||||
else {
|
else {
|
||||||
if (M2.n) __asm int 3;
|
if (M2.n) __asm int 3;
|
||||||
mdct_init(&M2, n);
|
mdct_init(&M2, n);
|
||||||
M = &M2;
|
M = &M2;
|
||||||
@ -2783,7 +2783,7 @@ static void inverse_mdct(float *buffer, int n, vorb *f, int blocktype)
|
|||||||
d1[0] = u[k4+1];
|
d1[0] = u[k4+1];
|
||||||
d0[1] = u[k4+2];
|
d0[1] = u[k4+2];
|
||||||
d0[0] = u[k4+3];
|
d0[0] = u[k4+3];
|
||||||
|
|
||||||
d0 -= 4;
|
d0 -= 4;
|
||||||
d1 -= 4;
|
d1 -= 4;
|
||||||
bitrev += 2;
|
bitrev += 2;
|
||||||
@ -2864,7 +2864,7 @@ static void inverse_mdct(float *buffer, int n, vorb *f, int blocktype)
|
|||||||
float p0,p1,p2,p3;
|
float p0,p1,p2,p3;
|
||||||
|
|
||||||
p3 = e[6]*B[7] - e[7]*B[6];
|
p3 = e[6]*B[7] - e[7]*B[6];
|
||||||
p2 = -e[6]*B[6] - e[7]*B[7];
|
p2 = -e[6]*B[6] - e[7]*B[7];
|
||||||
|
|
||||||
d0[0] = p3;
|
d0[0] = p3;
|
||||||
d1[3] = - p3;
|
d1[3] = - p3;
|
||||||
@ -2872,7 +2872,7 @@ static void inverse_mdct(float *buffer, int n, vorb *f, int blocktype)
|
|||||||
d3[3] = p2;
|
d3[3] = p2;
|
||||||
|
|
||||||
p1 = e[4]*B[5] - e[5]*B[4];
|
p1 = e[4]*B[5] - e[5]*B[4];
|
||||||
p0 = -e[4]*B[4] - e[5]*B[5];
|
p0 = -e[4]*B[4] - e[5]*B[5];
|
||||||
|
|
||||||
d0[1] = p1;
|
d0[1] = p1;
|
||||||
d1[2] = - p1;
|
d1[2] = - p1;
|
||||||
@ -2880,7 +2880,7 @@ static void inverse_mdct(float *buffer, int n, vorb *f, int blocktype)
|
|||||||
d3[2] = p0;
|
d3[2] = p0;
|
||||||
|
|
||||||
p3 = e[2]*B[3] - e[3]*B[2];
|
p3 = e[2]*B[3] - e[3]*B[2];
|
||||||
p2 = -e[2]*B[2] - e[3]*B[3];
|
p2 = -e[2]*B[2] - e[3]*B[3];
|
||||||
|
|
||||||
d0[2] = p3;
|
d0[2] = p3;
|
||||||
d1[1] = - p3;
|
d1[1] = - p3;
|
||||||
@ -2888,7 +2888,7 @@ static void inverse_mdct(float *buffer, int n, vorb *f, int blocktype)
|
|||||||
d3[1] = p2;
|
d3[1] = p2;
|
||||||
|
|
||||||
p1 = e[0]*B[1] - e[1]*B[0];
|
p1 = e[0]*B[1] - e[1]*B[0];
|
||||||
p0 = -e[0]*B[0] - e[1]*B[1];
|
p0 = -e[0]*B[0] - e[1]*B[1];
|
||||||
|
|
||||||
d0[3] = p1;
|
d0[3] = p1;
|
||||||
d1[0] = - p1;
|
d1[0] = - p1;
|
||||||
@ -3520,7 +3520,7 @@ static int is_whole_packet_present(stb_vorbis *f)
|
|||||||
first = FALSE;
|
first = FALSE;
|
||||||
}
|
}
|
||||||
for (; s == -1;) {
|
for (; s == -1;) {
|
||||||
uint8 *q;
|
uint8 *q;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
// check that we have the page header ready
|
// check that we have the page header ready
|
||||||
@ -3618,7 +3618,7 @@ static int start_decoder(vorb *f)
|
|||||||
|
|
||||||
// second packet!
|
// second packet!
|
||||||
if (!start_page(f)) return FALSE;
|
if (!start_page(f)) return FALSE;
|
||||||
|
|
||||||
if (!start_packet(f)) return FALSE;
|
if (!start_packet(f)) return FALSE;
|
||||||
|
|
||||||
if (!next_segment(f)) return FALSE;
|
if (!next_segment(f)) return FALSE;
|
||||||
@ -3636,7 +3636,7 @@ static int start_decoder(vorb *f)
|
|||||||
//user comments
|
//user comments
|
||||||
f->comment_list_length = get32_packet(f);
|
f->comment_list_length = get32_packet(f);
|
||||||
f->comment_list = (char**)setup_malloc(f, sizeof(char*) * (f->comment_list_length));
|
f->comment_list = (char**)setup_malloc(f, sizeof(char*) * (f->comment_list_length));
|
||||||
|
|
||||||
for(i=0; i < f->comment_list_length; ++i) {
|
for(i=0; i < f->comment_list_length; ++i) {
|
||||||
len = get32_packet(f);
|
len = get32_packet(f);
|
||||||
f->comment_list[i] = (char*)setup_malloc(f, sizeof(char) * (len+1));
|
f->comment_list[i] = (char*)setup_malloc(f, sizeof(char) * (len+1));
|
||||||
@ -3651,7 +3651,7 @@ static int start_decoder(vorb *f)
|
|||||||
x = get8_packet(f);
|
x = get8_packet(f);
|
||||||
if (!(x & 1)) return error(f, VORBIS_invalid_setup);
|
if (!(x & 1)) return error(f, VORBIS_invalid_setup);
|
||||||
|
|
||||||
|
|
||||||
skip(f, f->bytes_in_seg);
|
skip(f, f->bytes_in_seg);
|
||||||
f->bytes_in_seg = 0;
|
f->bytes_in_seg = 0;
|
||||||
|
|
||||||
@ -3925,7 +3925,7 @@ static int start_decoder(vorb *f)
|
|||||||
} else {
|
} else {
|
||||||
stbv__floor_ordering p[31*8+2];
|
stbv__floor_ordering p[31*8+2];
|
||||||
Floor1 *g = &f->floor_config[i].floor1;
|
Floor1 *g = &f->floor_config[i].floor1;
|
||||||
int max_class = -1;
|
int max_class = -1;
|
||||||
g->partitions = get_bits(f, 5);
|
g->partitions = get_bits(f, 5);
|
||||||
for (j=0; j < g->partitions; ++j) {
|
for (j=0; j < g->partitions; ++j) {
|
||||||
g->partition_class_list[j] = get_bits(f, 4);
|
g->partition_class_list[j] = get_bits(f, 4);
|
||||||
@ -4038,7 +4038,7 @@ static int start_decoder(vorb *f)
|
|||||||
if (f->mapping == NULL) return error(f, VORBIS_outofmem);
|
if (f->mapping == NULL) return error(f, VORBIS_outofmem);
|
||||||
memset(f->mapping, 0, f->mapping_count * sizeof(*f->mapping));
|
memset(f->mapping, 0, f->mapping_count * sizeof(*f->mapping));
|
||||||
for (i=0; i < f->mapping_count; ++i) {
|
for (i=0; i < f->mapping_count; ++i) {
|
||||||
Mapping *m = f->mapping + i;
|
Mapping *m = f->mapping + i;
|
||||||
int mapping_type = get_bits(f,16);
|
int mapping_type = get_bits(f,16);
|
||||||
if (mapping_type != 0) return error(f, VORBIS_invalid_setup);
|
if (mapping_type != 0) return error(f, VORBIS_invalid_setup);
|
||||||
m->chan = (MappingChannel *) setup_malloc(f, f->channels * sizeof(*m->chan));
|
m->chan = (MappingChannel *) setup_malloc(f, f->channels * sizeof(*m->chan));
|
||||||
@ -5060,7 +5060,7 @@ stb_vorbis * stb_vorbis_open_filename(const char *filename, int *error, const st
|
|||||||
#else
|
#else
|
||||||
f = fopen(filename, "rb");
|
f = fopen(filename, "rb");
|
||||||
#endif
|
#endif
|
||||||
if (f)
|
if (f)
|
||||||
return stb_vorbis_open_file(f, TRUE, error, alloc);
|
return stb_vorbis_open_file(f, TRUE, error, alloc);
|
||||||
if (error) *error = VORBIS_file_open_failure;
|
if (error) *error = VORBIS_file_open_failure;
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -5123,7 +5123,7 @@ static int8 channel_position[7][6] =
|
|||||||
#define MAGIC(SHIFT) (1.5f * (1 << (23-SHIFT)) + 0.5f/(1 << SHIFT))
|
#define MAGIC(SHIFT) (1.5f * (1 << (23-SHIFT)) + 0.5f/(1 << SHIFT))
|
||||||
#define ADDEND(SHIFT) (((150-SHIFT) << 23) + (1 << 22))
|
#define ADDEND(SHIFT) (((150-SHIFT) << 23) + (1 << 22))
|
||||||
#define FAST_SCALED_FLOAT_TO_INT(temp,x,s) (temp.f = (x) + MAGIC(s), temp.i - ADDEND(s))
|
#define FAST_SCALED_FLOAT_TO_INT(temp,x,s) (temp.f = (x) + MAGIC(s), temp.i - ADDEND(s))
|
||||||
#define check_endianness()
|
#define check_endianness()
|
||||||
#else
|
#else
|
||||||
#define FAST_SCALED_FLOAT_TO_INT(temp,x,s) ((int) ((x) * (1 << (s))))
|
#define FAST_SCALED_FLOAT_TO_INT(temp,x,s) ((int) ((x) * (1 << (s))))
|
||||||
#define check_endianness()
|
#define check_endianness()
|
||||||
@ -5455,13 +5455,13 @@ int stb_vorbis_get_samples_float(stb_vorbis *f, int channels, float **buffer, in
|
|||||||
1.14 - 2018-02-11 - delete bogus dealloca usage
|
1.14 - 2018-02-11 - delete bogus dealloca usage
|
||||||
1.13 - 2018-01-29 - fix truncation of last frame (hopefully)
|
1.13 - 2018-01-29 - fix truncation of last frame (hopefully)
|
||||||
1.12 - 2017-11-21 - limit residue begin/end to blocksize/2 to avoid large temp allocs in bad/corrupt files
|
1.12 - 2017-11-21 - limit residue begin/end to blocksize/2 to avoid large temp allocs in bad/corrupt files
|
||||||
1.11 - 2017-07-23 - fix MinGW compilation
|
1.11 - 2017-07-23 - fix MinGW compilation
|
||||||
1.10 - 2017-03-03 - more robust seeking; fix negative ilog(); clear error in open_memory
|
1.10 - 2017-03-03 - more robust seeking; fix negative ilog(); clear error in open_memory
|
||||||
1.09 - 2016-04-04 - back out 'avoid discarding last frame' fix from previous version
|
1.09 - 2016-04-04 - back out 'avoid discarding last frame' fix from previous version
|
||||||
1.08 - 2016-04-02 - fixed multiple warnings; fix setup memory leaks;
|
1.08 - 2016-04-02 - fixed multiple warnings; fix setup memory leaks;
|
||||||
avoid discarding last frame of audio data
|
avoid discarding last frame of audio data
|
||||||
1.07 - 2015-01-16 - fixed some warnings, fix mingw, const-correct API
|
1.07 - 2015-01-16 - fixed some warnings, fix mingw, const-correct API
|
||||||
some more crash fixes when out of memory or with corrupt files
|
some more crash fixes when out of memory or with corrupt files
|
||||||
1.06 - 2015-08-31 - full, correct support for seeking API (Dougall Johnson)
|
1.06 - 2015-08-31 - full, correct support for seeking API (Dougall Johnson)
|
||||||
some crash fixes when out of memory or with corrupt files
|
some crash fixes when out of memory or with corrupt files
|
||||||
1.05 - 2015-04-19 - don't define __forceinline if it's redundant
|
1.05 - 2015-04-19 - don't define __forceinline if it's redundant
|
||||||
@ -5517,38 +5517,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -817,7 +817,7 @@ struct stbvox_input_description
|
|||||||
// Indexed by 3D coordinate. Contains the color for all faces of the block.
|
// Indexed by 3D coordinate. Contains the color for all faces of the block.
|
||||||
// The core color value is 0..63.
|
// The core color value is 0..63.
|
||||||
// Encode with STBVOX_MAKE_COLOR(color_number, tex1_enable, tex2_enable)
|
// Encode with STBVOX_MAKE_COLOR(color_number, tex1_enable, tex2_enable)
|
||||||
|
|
||||||
unsigned char *block_color;
|
unsigned char *block_color;
|
||||||
// Array indexed by blocktype containing the color value to apply to the faces.
|
// Array indexed by blocktype containing the color value to apply to the faces.
|
||||||
// The core color value is 0..63.
|
// The core color value is 0..63.
|
||||||
@ -936,7 +936,7 @@ struct stbvox_input_description
|
|||||||
// Indexed by 3D coordinates, specifies which faces should use the
|
// Indexed by 3D coordinates, specifies which faces should use the
|
||||||
// color defined in color2. No rotation value is applied.
|
// color defined in color2. No rotation value is applied.
|
||||||
// Encode with STBVOX_MAKE_FACE_MASK(e,n,w,s,u,d)
|
// Encode with STBVOX_MAKE_FACE_MASK(e,n,w,s,u,d)
|
||||||
|
|
||||||
unsigned char *color3;
|
unsigned char *color3;
|
||||||
// Indexed by 3D coordinates, specifies an alternative color to apply
|
// Indexed by 3D coordinates, specifies an alternative color to apply
|
||||||
// to some of the faces of the block.
|
// to some of the faces of the block.
|
||||||
@ -944,9 +944,9 @@ struct stbvox_input_description
|
|||||||
|
|
||||||
unsigned char *color3_facemask;
|
unsigned char *color3_facemask;
|
||||||
// Indexed by 3D coordinates, specifies which faces should use the
|
// Indexed by 3D coordinates, specifies which faces should use the
|
||||||
// color defined in color3. No rotation value is applied.
|
// color defined in color3. No rotation value is applied.
|
||||||
// Encode with STBVOX_MAKE_FACE_MASK(e,n,w,s,u,d)
|
// Encode with STBVOX_MAKE_FACE_MASK(e,n,w,s,u,d)
|
||||||
|
|
||||||
unsigned char *texlerp_simple;
|
unsigned char *texlerp_simple;
|
||||||
// Indexed by 3D coordinates, this is the smallest texlerp encoding
|
// Indexed by 3D coordinates, this is the smallest texlerp encoding
|
||||||
// that can do useful work. It consits of three values: baselerp,
|
// that can do useful work. It consits of three values: baselerp,
|
||||||
@ -962,7 +962,7 @@ struct stbvox_input_description
|
|||||||
// Encode with STBVOX_MAKE_TEXLERP_SIMPLE(baselerp, vertlerp, face_vertlerp)
|
// Encode with STBVOX_MAKE_TEXLERP_SIMPLE(baselerp, vertlerp, face_vertlerp)
|
||||||
|
|
||||||
// The following texlerp encodings are experimental and maybe not
|
// The following texlerp encodings are experimental and maybe not
|
||||||
// that useful.
|
// that useful.
|
||||||
|
|
||||||
unsigned char *texlerp;
|
unsigned char *texlerp;
|
||||||
// Indexed by 3D coordinates, this defines four values:
|
// Indexed by 3D coordinates, this defines four values:
|
||||||
@ -1251,7 +1251,7 @@ struct stbvox_mesh_maker
|
|||||||
// shouldn't improve performance, although obviously it allow you
|
// shouldn't improve performance, although obviously it allow you
|
||||||
// to create larger worlds without streaming.
|
// to create larger worlds without streaming.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// ----------- Two textures ----------- -- One texture -- ---- Color only ----
|
// ----------- Two textures ----------- -- One texture -- ---- Color only ----
|
||||||
// Mode: 0 1 2 3 4 5 6 10 11 12 20 21 22 23 24
|
// Mode: 0 1 2 3 4 5 6 10 11 12 20 21 22 23 24
|
||||||
// ============================================================================================================
|
// ============================================================================================================
|
||||||
@ -1273,15 +1273,15 @@ struct stbvox_mesh_maker
|
|||||||
// Mode: 0 1 2 3 4 5 6 10 11 12 20 21 22 23 24
|
// Mode: 0 1 2 3 4 5 6 10 11 12 20 21 22 23 24
|
||||||
// =============================================================================================================
|
// =============================================================================================================
|
||||||
// bytes per quad 32 20 14 12 10 6 6 8 8 4 20 10 6 4
|
// bytes per quad 32 20 14 12 10 6 6 8 8 4 20 10 6 4
|
||||||
//
|
//
|
||||||
// vertex x bits 7 7 0 6 0 0 0 0 0 0 7 0 0 0
|
// vertex x bits 7 7 0 6 0 0 0 0 0 0 7 0 0 0
|
||||||
// vertex y bits 7 7 0 0 0 0 0 0 0 0 7 0 0 0
|
// vertex y bits 7 7 0 0 0 0 0 0 0 0 7 0 0 0
|
||||||
// vertex z bits 9 9 7 4 2 0 0 2 2 0 9 2 0 0
|
// vertex z bits 9 9 7 4 2 0 0 2 2 0 9 2 0 0
|
||||||
// vertex ao bits 6 6 6 6 6 0 0 6 6 0 6 6 0 0
|
// vertex ao bits 6 6 6 6 6 0 0 6 6 0 6 6 0 0
|
||||||
// vertex txl bits 3 3 3 0 0 0 0 0 0 0 (3) 0 0 0
|
// vertex txl bits 3 3 3 0 0 0 0 0 0 0 (3) 0 0 0
|
||||||
//
|
//
|
||||||
// face tex1 bits (8) 8 8 8 8 8 8 8 8 8
|
// face tex1 bits (8) 8 8 8 8 8 8 8 8 8
|
||||||
// face tex2 bits (8) 8 8 8 8 8 7 - - -
|
// face tex2 bits (8) 8 8 8 8 8 7 - - -
|
||||||
// face color bits (8) 8 8 8 8 8 8 3 0 0 24 24 24 8
|
// face color bits (8) 8 8 8 8 8 8 3 0 0 24 24 24 8
|
||||||
// face normal bits (8) 8 8 8 6 4 7 4 4 3 8 3 4 3
|
// face normal bits (8) 8 8 8 6 4 7 4 4 3 8 3 4 3
|
||||||
// face x bits 7 0 6 7 6 6 7 7 0 7 7 7
|
// face x bits 7 0 6 7 6 6 7 7 0 7 7 7
|
||||||
@ -1710,7 +1710,7 @@ static const char *stbvox_fragment_program =
|
|||||||
" uint color_id = facedata.z;\n"
|
" uint color_id = facedata.z;\n"
|
||||||
|
|
||||||
#ifndef STBVOX_CONFIG_PREFER_TEXBUFFER
|
#ifndef STBVOX_CONFIG_PREFER_TEXBUFFER
|
||||||
// load from uniforms / texture buffers
|
// load from uniforms / texture buffers
|
||||||
" vec3 texgen_s = texgen[texprojid];\n"
|
" vec3 texgen_s = texgen[texprojid];\n"
|
||||||
" vec3 texgen_t = texgen[texprojid+32u];\n"
|
" vec3 texgen_t = texgen[texprojid+32u];\n"
|
||||||
" float tex1_scale = texscale[tex1_id & 63u].x;\n"
|
" float tex1_scale = texscale[tex1_id & 63u].x;\n"
|
||||||
@ -1822,7 +1822,7 @@ static const char *stbvox_fragment_program =
|
|||||||
" vec3 dist = voxelspace_pos + (transform[1] - camera_pos.xyz);\n"
|
" vec3 dist = voxelspace_pos + (transform[1] - camera_pos.xyz);\n"
|
||||||
" lit_color = compute_fog(lit_color, dist, fragment_alpha);\n"
|
" lit_color = compute_fog(lit_color, dist, fragment_alpha);\n"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef STBVOX_CONFIG_UNPREMULTIPLY
|
#ifdef STBVOX_CONFIG_UNPREMULTIPLY
|
||||||
" vec4 final_color = vec4(lit_color/fragment_alpha, fragment_alpha);\n"
|
" vec4 final_color = vec4(lit_color/fragment_alpha, fragment_alpha);\n"
|
||||||
#else
|
#else
|
||||||
@ -1849,7 +1849,7 @@ static const char *stbvox_fragment_program =
|
|||||||
"{\n"
|
"{\n"
|
||||||
" float f = dot(relative_pos,relative_pos)*ambient[3].w;\n"
|
" float f = dot(relative_pos,relative_pos)*ambient[3].w;\n"
|
||||||
//" f = rlerp(f, -2,1);\n"
|
//" f = rlerp(f, -2,1);\n"
|
||||||
" f = clamp(f, 0.0, 1.0);\n"
|
" f = clamp(f, 0.0, 1.0);\n"
|
||||||
" f = 3.0*f*f - 2.0*f*f*f;\n" // smoothstep
|
" f = 3.0*f*f - 2.0*f*f*f;\n" // smoothstep
|
||||||
//" f = f*f;\n" // fade in more smoothly
|
//" f = f*f;\n" // fade in more smoothly
|
||||||
#ifdef STBVOX_CONFIG_PREMULTIPLIED_ALPHA
|
#ifdef STBVOX_CONFIG_PREMULTIPLIED_ALPHA
|
||||||
@ -1903,7 +1903,7 @@ static const char *stbvox_fragment_program_alpha_only =
|
|||||||
" uint color_id = facedata.z;\n"
|
" uint color_id = facedata.z;\n"
|
||||||
|
|
||||||
#ifndef STBVOX_CONFIG_PREFER_TEXBUFFER
|
#ifndef STBVOX_CONFIG_PREFER_TEXBUFFER
|
||||||
// load from uniforms / texture buffers
|
// load from uniforms / texture buffers
|
||||||
" vec3 texgen_s = texgen[texprojid];\n"
|
" vec3 texgen_s = texgen[texprojid];\n"
|
||||||
" vec3 texgen_t = texgen[texprojid+32u];\n"
|
" vec3 texgen_t = texgen[texprojid+32u];\n"
|
||||||
" float tex1_scale = texscale[tex1_id & 63u].x;\n"
|
" float tex1_scale = texscale[tex1_id & 63u].x;\n"
|
||||||
@ -2034,7 +2034,7 @@ static unsigned char stbvox_rotate_face[6][4] =
|
|||||||
{ 2,3,0,1 },
|
{ 2,3,0,1 },
|
||||||
{ 3,0,1,2 },
|
{ 3,0,1,2 },
|
||||||
{ 4,4,4,4 },
|
{ 4,4,4,4 },
|
||||||
{ 5,5,5,5 },
|
{ 5,5,5,5 },
|
||||||
};
|
};
|
||||||
|
|
||||||
#define STBVOX_ROTATE(x,r) stbvox_rotate_face[x][r] // (((x)+(r))&3)
|
#define STBVOX_ROTATE(x,r) stbvox_rotate_face[x][r] // (((x)+(r))&3)
|
||||||
@ -2190,7 +2190,7 @@ static unsigned char stbvox_vertex_selector[6][4] =
|
|||||||
|
|
||||||
static stbvox_mesh_vertex stbvox_vmesh_delta_normal[6][4] =
|
static stbvox_mesh_vertex stbvox_vmesh_delta_normal[6][4] =
|
||||||
{
|
{
|
||||||
{ stbvox_vertex_encode(1,0,1,0,0) ,
|
{ stbvox_vertex_encode(1,0,1,0,0) ,
|
||||||
stbvox_vertex_encode(1,1,1,0,0) ,
|
stbvox_vertex_encode(1,1,1,0,0) ,
|
||||||
stbvox_vertex_encode(1,1,0,0,0) ,
|
stbvox_vertex_encode(1,1,0,0,0) ,
|
||||||
stbvox_vertex_encode(1,0,0,0,0) },
|
stbvox_vertex_encode(1,0,0,0,0) },
|
||||||
@ -2218,7 +2218,7 @@ static stbvox_mesh_vertex stbvox_vmesh_delta_normal[6][4] =
|
|||||||
|
|
||||||
static stbvox_mesh_vertex stbvox_vmesh_pre_vheight[6][4] =
|
static stbvox_mesh_vertex stbvox_vmesh_pre_vheight[6][4] =
|
||||||
{
|
{
|
||||||
{ stbvox_vertex_encode(1,0,0,0,0) ,
|
{ stbvox_vertex_encode(1,0,0,0,0) ,
|
||||||
stbvox_vertex_encode(1,1,0,0,0) ,
|
stbvox_vertex_encode(1,1,0,0,0) ,
|
||||||
stbvox_vertex_encode(1,1,0,0,0) ,
|
stbvox_vertex_encode(1,1,0,0,0) ,
|
||||||
stbvox_vertex_encode(1,0,0,0,0) },
|
stbvox_vertex_encode(1,0,0,0,0) },
|
||||||
@ -2246,7 +2246,7 @@ static stbvox_mesh_vertex stbvox_vmesh_pre_vheight[6][4] =
|
|||||||
|
|
||||||
static stbvox_mesh_vertex stbvox_vmesh_delta_half_z[6][4] =
|
static stbvox_mesh_vertex stbvox_vmesh_delta_half_z[6][4] =
|
||||||
{
|
{
|
||||||
{ stbvox_vertex_encode(1,0,2,0,0) ,
|
{ stbvox_vertex_encode(1,0,2,0,0) ,
|
||||||
stbvox_vertex_encode(1,1,2,0,0) ,
|
stbvox_vertex_encode(1,1,2,0,0) ,
|
||||||
stbvox_vertex_encode(1,1,0,0,0) ,
|
stbvox_vertex_encode(1,1,0,0,0) ,
|
||||||
stbvox_vertex_encode(1,0,0,0,0) },
|
stbvox_vertex_encode(1,0,0,0,0) },
|
||||||
@ -2274,7 +2274,7 @@ static stbvox_mesh_vertex stbvox_vmesh_delta_half_z[6][4] =
|
|||||||
|
|
||||||
static stbvox_mesh_vertex stbvox_vmesh_crossed_pair[6][4] =
|
static stbvox_mesh_vertex stbvox_vmesh_crossed_pair[6][4] =
|
||||||
{
|
{
|
||||||
{ stbvox_vertex_encode(1,0,2,0,0) ,
|
{ stbvox_vertex_encode(1,0,2,0,0) ,
|
||||||
stbvox_vertex_encode(0,1,2,0,0) ,
|
stbvox_vertex_encode(0,1,2,0,0) ,
|
||||||
stbvox_vertex_encode(0,1,0,0,0) ,
|
stbvox_vertex_encode(0,1,0,0,0) ,
|
||||||
stbvox_vertex_encode(1,0,0,0,0) },
|
stbvox_vertex_encode(1,0,0,0,0) },
|
||||||
@ -2521,7 +2521,7 @@ static unsigned char stbvox_optimized_face_up_normal[4][4][4][4] =
|
|||||||
// @TODO: this table was constructed by hand and may have bugs
|
// @TODO: this table was constructed by hand and may have bugs
|
||||||
// nw se sw
|
// nw se sw
|
||||||
static unsigned char stbvox_planar_face_up_normal[4][4][4] =
|
static unsigned char stbvox_planar_face_up_normal[4][4][4] =
|
||||||
{
|
{
|
||||||
{ // sw,se,nw,ne; ne = se+nw-sw
|
{ // sw,se,nw,ne; ne = se+nw-sw
|
||||||
{ STBVF_u , 0 , 0 , 0 }, // 0,0,0,0; 1,0,0,-1; 2,0,0,-2; 3,0,0,-3;
|
{ STBVF_u , 0 , 0 , 0 }, // 0,0,0,0; 1,0,0,-1; 2,0,0,-2; 3,0,0,-3;
|
||||||
{ STBVF_u , STBVF_u , 0 , 0 }, // 0,1,0,1; 1,1,0, 0; 2,1,0,-1; 3,1,0,-2;
|
{ STBVF_u , STBVF_u , 0 , 0 }, // 0,1,0,1; 1,1,0, 0; 2,1,0,-1; 3,1,0,-2;
|
||||||
@ -2908,7 +2908,7 @@ static void stbvox_make_mesh_for_block(stbvox_mesh_maker *mm, stbvox_pos pos, in
|
|||||||
mesh = mm->input.selector[v_off];
|
mesh = mm->input.selector[v_off];
|
||||||
else if (mm->input.block_selector)
|
else if (mm->input.block_selector)
|
||||||
mesh = mm->input.block_selector[mm->input.blocktype[v_off]];
|
mesh = mm->input.block_selector[mm->input.blocktype[v_off]];
|
||||||
|
|
||||||
// check if we're going off the end
|
// check if we're going off the end
|
||||||
if (mm->output_cur[mesh][0] + mm->output_size[mesh][0]*6 > mm->output_end[mesh][0]) {
|
if (mm->output_cur[mesh][0] + mm->output_size[mesh][0]*6 > mm->output_end[mesh][0]) {
|
||||||
mm->full = 1;
|
mm->full = 1;
|
||||||
@ -3119,7 +3119,7 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po
|
|||||||
mesh = mm->input.selector[v_off];
|
mesh = mm->input.selector[v_off];
|
||||||
else if (mm->input.block_selector)
|
else if (mm->input.block_selector)
|
||||||
mesh = mm->input.block_selector[bt];
|
mesh = mm->input.block_selector[bt];
|
||||||
|
|
||||||
if (geo <= STBVOX_GEOM_ceil_slope_north_is_bottom) {
|
if (geo <= STBVOX_GEOM_ceil_slope_north_is_bottom) {
|
||||||
// this is the simple case, we can just use regular block gen with special vmesh calculated with vheight
|
// this is the simple case, we can just use regular block gen with special vmesh calculated with vheight
|
||||||
stbvox_mesh_vertex basevert;
|
stbvox_mesh_vertex basevert;
|
||||||
@ -3344,7 +3344,7 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po
|
|||||||
|
|
||||||
if ((visible_faces & (1 << STBVOX_FACE_north)) || (extreme && (ht[2] == 3 || ht[3] == 3)))
|
if ((visible_faces & (1 << STBVOX_FACE_north)) || (extreme && (ht[2] == 3 || ht[3] == 3)))
|
||||||
stbvox_make_mesh_for_face(mm, rotate, STBVOX_FACE_north, v_off, pos, basevert, vmesh[STBVOX_FACE_north], mesh, STBVOX_FACE_north);
|
stbvox_make_mesh_for_face(mm, rotate, STBVOX_FACE_north, v_off, pos, basevert, vmesh[STBVOX_FACE_north], mesh, STBVOX_FACE_north);
|
||||||
if ((visible_faces & (1 << STBVOX_FACE_south)) || (extreme && (ht[0] == 3 || ht[1] == 3)))
|
if ((visible_faces & (1 << STBVOX_FACE_south)) || (extreme && (ht[0] == 3 || ht[1] == 3)))
|
||||||
stbvox_make_mesh_for_face(mm, rotate, STBVOX_FACE_south, v_off, pos, basevert, vmesh[STBVOX_FACE_south], mesh, STBVOX_FACE_south);
|
stbvox_make_mesh_for_face(mm, rotate, STBVOX_FACE_south, v_off, pos, basevert, vmesh[STBVOX_FACE_south], mesh, STBVOX_FACE_south);
|
||||||
if ((visible_faces & (1 << STBVOX_FACE_east)) || (extreme && (ht[1] == 3 || ht[3] == 3)))
|
if ((visible_faces & (1 << STBVOX_FACE_east)) || (extreme && (ht[1] == 3 || ht[3] == 3)))
|
||||||
stbvox_make_mesh_for_face(mm, rotate, STBVOX_FACE_east , v_off, pos, basevert, vmesh[STBVOX_FACE_east ], mesh, STBVOX_FACE_east);
|
stbvox_make_mesh_for_face(mm, rotate, STBVOX_FACE_east , v_off, pos, basevert, vmesh[STBVOX_FACE_east ], mesh, STBVOX_FACE_east);
|
||||||
@ -3362,7 +3362,7 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po
|
|||||||
mesh = mm->input.selector[v_off];
|
mesh = mm->input.selector[v_off];
|
||||||
simple_rot = mesh >> 4;
|
simple_rot = mesh >> 4;
|
||||||
mesh &= 15;
|
mesh &= 15;
|
||||||
}
|
}
|
||||||
if (mm->input.block_selector) {
|
if (mm->input.block_selector) {
|
||||||
mesh = mm->input.block_selector[bt];
|
mesh = mm->input.block_selector[bt];
|
||||||
}
|
}
|
||||||
@ -3644,7 +3644,7 @@ void stbvox_set_input_stride(stbvox_mesh_maker *mm, int x_stride_in_bytes, int y
|
|||||||
+ stbvox_vertex_vector[f][v][2] ;
|
+ stbvox_vertex_vector[f][v][2] ;
|
||||||
mm->vertex_gather_offset[f][v] = (stbvox_vertex_vector[f][v][0]-1) * mm->x_stride_in_bytes
|
mm->vertex_gather_offset[f][v] = (stbvox_vertex_vector[f][v][0]-1) * mm->x_stride_in_bytes
|
||||||
+ (stbvox_vertex_vector[f][v][1]-1) * mm->y_stride_in_bytes
|
+ (stbvox_vertex_vector[f][v][1]-1) * mm->y_stride_in_bytes
|
||||||
+ (stbvox_vertex_vector[f][v][2]-1) ;
|
+ (stbvox_vertex_vector[f][v][2]-1) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3770,38 +3770,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -226,38 +226,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
software, either in source code form or as a compiled binary, for any purpose,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
software dedicate any and all copyright interest in the software to the public
|
software dedicate any and all copyright interest in the software to the public
|
||||||
domain. We make this dedication for the benefit of the public at large and to
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
the detriment of our heirs and successors. We intend this dedication to be an
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
overt act of relinquishment in perpetuity of all present and future rights to
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
32
tools/trailing_whitespace.c
Normal file
32
tools/trailing_whitespace.c
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#define STB_DEFINE
|
||||||
|
#include "stb.h"
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i=1; i < argc; ++i) {
|
||||||
|
int len;
|
||||||
|
FILE *f;
|
||||||
|
char *s = stb_file(argv[i], &len);
|
||||||
|
char *end, *src, *dest;
|
||||||
|
if (s == NULL) {
|
||||||
|
printf("Couldn't read file '%s'.\n", argv[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
end = s + len;
|
||||||
|
src = dest = s;
|
||||||
|
while (src < end) {
|
||||||
|
char *start=0;
|
||||||
|
while (src < end && *src != '\n' && *src != '\r')
|
||||||
|
*dest++ = *src++;
|
||||||
|
while (dest-1 > s && (dest[-1] == ' ' || dest[-1] == '\t'))
|
||||||
|
--dest;
|
||||||
|
while (src < end && (*src == '\n' || *src == '\r'))
|
||||||
|
*dest++ = *src++;
|
||||||
|
}
|
||||||
|
f = fopen(argv[i], "wb");
|
||||||
|
fwrite(s, 1, dest-s, f);
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user