|
|
@ -1,5 +1,5 @@
|
|
|
|
// stb_truetype.h - v1.10 - public domain
|
|
|
|
// stb_truetype.h - v1.12 - public domain
|
|
|
|
// authored from 2009-2015 by Sean Barrett / RAD Game Tools
|
|
|
|
// authored from 2009-2016 by Sean Barrett / RAD Game Tools
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// This library processes TrueType files:
|
|
|
|
// This library processes TrueType files:
|
|
|
|
// parse files
|
|
|
|
// parse files
|
|
|
@ -51,6 +51,8 @@
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// VERSION HISTORY
|
|
|
|
// VERSION HISTORY
|
|
|
|
//
|
|
|
|
//
|
|
|
|
|
|
|
|
// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual
|
|
|
|
|
|
|
|
// 1.11 (2016-04-02) fix unused-variable warning
|
|
|
|
// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef
|
|
|
|
// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef
|
|
|
|
// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly
|
|
|
|
// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly
|
|
|
|
// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges
|
|
|
|
// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges
|
|
|
@ -59,12 +61,6 @@
|
|
|
|
// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?);
|
|
|
|
// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?);
|
|
|
|
// fixed an assert() bug in the new rasterizer
|
|
|
|
// fixed an assert() bug in the new rasterizer
|
|
|
|
// replace assert() with STBTT_assert() in new rasterizer
|
|
|
|
// replace assert() with STBTT_assert() in new rasterizer
|
|
|
|
// 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine)
|
|
|
|
|
|
|
|
// also more precise AA rasterizer, except if shapes overlap
|
|
|
|
|
|
|
|
// remove need for STBTT_sort
|
|
|
|
|
|
|
|
// 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC
|
|
|
|
|
|
|
|
// 1.04 (2015-04-15) typo in example
|
|
|
|
|
|
|
|
// 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// Full history can be found at the end of this file.
|
|
|
|
// Full history can be found at the end of this file.
|
|
|
|
//
|
|
|
|
//
|
|
|
@ -592,9 +588,9 @@ STBTT_DEF void stbtt_GetPackedQuad(stbtt_packedchar *chardata, int pw, int ph,
|
|
|
|
stbtt_aligned_quad *q, // output: quad to draw
|
|
|
|
stbtt_aligned_quad *q, // output: quad to draw
|
|
|
|
int align_to_integer);
|
|
|
|
int align_to_integer);
|
|
|
|
|
|
|
|
|
|
|
|
STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects);
|
|
|
|
STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects);
|
|
|
|
STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects);
|
|
|
|
STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects);
|
|
|
|
STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects);
|
|
|
|
STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects);
|
|
|
|
// 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
|
|
|
@ -949,6 +945,12 @@ typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERS
|
|
|
|
#define STBTT_RASTERIZER_VERSION 2
|
|
|
|
#define STBTT_RASTERIZER_VERSION 2
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
|
|
|
|
#define STBTT__NOTUSED(v) (void)(v)
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
#define STBTT__NOTUSED(v) (void)sizeof(v)
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// accessors to parse data from file
|
|
|
|
// accessors to parse data from file
|
|
|
@ -961,26 +963,15 @@ typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERS
|
|
|
|
#define ttCHAR(p) (* (stbtt_int8 *) (p))
|
|
|
|
#define ttCHAR(p) (* (stbtt_int8 *) (p))
|
|
|
|
#define ttFixed(p) ttLONG(p)
|
|
|
|
#define ttFixed(p) ttLONG(p)
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(STB_TRUETYPE_BIGENDIAN) && !defined(ALLOW_UNALIGNED_TRUETYPE)
|
|
|
|
static stbtt_uint16 ttUSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; }
|
|
|
|
|
|
|
|
static stbtt_int16 ttSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; }
|
|
|
|
#define ttUSHORT(p) (* (stbtt_uint16 *) (p))
|
|
|
|
static stbtt_uint32 ttULONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; }
|
|
|
|
#define ttSHORT(p) (* (stbtt_int16 *) (p))
|
|
|
|
static stbtt_int32 ttLONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; }
|
|
|
|
#define ttULONG(p) (* (stbtt_uint32 *) (p))
|
|
|
|
|
|
|
|
#define ttLONG(p) (* (stbtt_int32 *) (p))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static stbtt_uint16 ttUSHORT(const stbtt_uint8 *p) { return p[0]*256 + p[1]; }
|
|
|
|
|
|
|
|
static stbtt_int16 ttSHORT(const stbtt_uint8 *p) { return p[0]*256 + p[1]; }
|
|
|
|
|
|
|
|
static stbtt_uint32 ttULONG(const stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; }
|
|
|
|
|
|
|
|
static stbtt_int32 ttLONG(const stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3))
|
|
|
|
#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3))
|
|
|
|
#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3])
|
|
|
|
#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3])
|
|
|
|
|
|
|
|
|
|
|
|
static int stbtt__isfont(const stbtt_uint8 *font)
|
|
|
|
static int stbtt__isfont(stbtt_uint8 *font)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// check the version number
|
|
|
|
// check the version number
|
|
|
|
if (stbtt_tag4(font, '1',0,0,0)) return 1; // TrueType 1
|
|
|
|
if (stbtt_tag4(font, '1',0,0,0)) return 1; // TrueType 1
|
|
|
@ -1004,7 +995,7 @@ static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart,
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *font_collection, int index)
|
|
|
|
static int stbtt_GetFontOffsetForIndex_internal(unsigned char *font_collection, int index)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// if it's just a font, there's only one valid index
|
|
|
|
// if it's just a font, there's only one valid index
|
|
|
|
if (stbtt__isfont(font_collection))
|
|
|
|
if (stbtt__isfont(font_collection))
|
|
|
@ -1023,9 +1014,8 @@ STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *font_collection,
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data2, int fontstart)
|
|
|
|
static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
stbtt_uint8 *data = (stbtt_uint8 *) data2;
|
|
|
|
|
|
|
|
stbtt_uint32 cmap, t;
|
|
|
|
stbtt_uint32 cmap, t;
|
|
|
|
stbtt_int32 i,numTables;
|
|
|
|
stbtt_int32 i,numTables;
|
|
|
|
|
|
|
|
|
|
|
@ -2073,12 +2063,13 @@ static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill,
|
|
|
|
// directly AA rasterize edges w/o supersampling
|
|
|
|
// directly AA rasterize edges w/o supersampling
|
|
|
|
static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata)
|
|
|
|
static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
(void)vsubsample;
|
|
|
|
|
|
|
|
stbtt__hheap hh = { 0, 0, 0 };
|
|
|
|
stbtt__hheap hh = { 0, 0, 0 };
|
|
|
|
stbtt__active_edge *active = NULL;
|
|
|
|
stbtt__active_edge *active = NULL;
|
|
|
|
int y,j=0, i;
|
|
|
|
int y,j=0, i;
|
|
|
|
float scanline_data[129], *scanline, *scanline2;
|
|
|
|
float scanline_data[129], *scanline, *scanline2;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
STBTT__NOTUSED(vsubsample);
|
|
|
|
|
|
|
|
|
|
|
|
if (result->w > 64)
|
|
|
|
if (result->w > 64)
|
|
|
|
scanline = (float *) STBTT_malloc((result->w*2+1) * sizeof(float), userdata);
|
|
|
|
scanline = (float *) STBTT_malloc((result->w*2+1) * sizeof(float), userdata);
|
|
|
|
else
|
|
|
|
else
|
|
|
@ -2524,7 +2515,7 @@ STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned ch
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// This is SUPER-CRAPPY packing to keep source code small
|
|
|
|
// This is SUPER-CRAPPY packing to keep source code small
|
|
|
|
|
|
|
|
|
|
|
|
STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf)
|
|
|
|
static int stbtt_BakeFontBitmap_internal(unsigned char *data, int offset, // font location (use offset=0 for plain .ttf)
|
|
|
|
float pixel_height, // height of font in pixels
|
|
|
|
float pixel_height, // height of font in pixels
|
|
|
|
unsigned char *pixels, int pw, int ph, // bitmap to be filled in
|
|
|
|
unsigned char *pixels, int pw, int ph, // bitmap to be filled in
|
|
|
|
int first_char, int num_chars, // characters to bake
|
|
|
|
int first_char, int num_chars, // characters to bake
|
|
|
@ -2597,11 +2588,6 @@ STBTT_DEF void stbtt_GetBakedQuad(stbtt_bakedchar *chardata, int pw, int ph, int
|
|
|
|
//
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef STB_RECT_PACK_VERSION
|
|
|
|
#ifndef STB_RECT_PACK_VERSION
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
|
|
|
|
#define STBTT__NOTUSED(v) (void)(v)
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
#define STBTT__NOTUSED(v) (void)sizeof(v)
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef int stbrp_coord;
|
|
|
|
typedef int stbrp_coord;
|
|
|
|
|
|
|
|
|
|
|
@ -2859,7 +2845,7 @@ static float stbtt__oversample_shift(int oversample)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// rects array must be big enough to accommodate all characters in the given ranges
|
|
|
|
// rects array must be big enough to accommodate all characters in the given ranges
|
|
|
|
STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects)
|
|
|
|
STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int i,j,k;
|
|
|
|
int i,j,k;
|
|
|
|
|
|
|
|
|
|
|
@ -2888,7 +2874,7 @@ STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, stbtt_fon
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// rects array must be big enough to accommodate all characters in the given ranges
|
|
|
|
// rects array must be big enough to accommodate all characters in the given ranges
|
|
|
|
STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects)
|
|
|
|
STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int i,j,k, return_value = 1;
|
|
|
|
int i,j,k, return_value = 1;
|
|
|
|
|
|
|
|
|
|
|
@ -3057,7 +3043,7 @@ STBTT_DEF void stbtt_GetPackedQuad(stbtt_packedchar *chardata, int pw, int ph, i
|
|
|
|
//
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
// 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(const stbtt_uint8 *s1, stbtt_int32 len1, const 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;
|
|
|
|
|
|
|
|
|
|
|
@ -3096,9 +3082,9 @@ static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(const stbtt_uint8
|
|
|
|
return i;
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2)
|
|
|
|
static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((const stbtt_uint8*) s1, len1, (const stbtt_uint8*) s2, len2);
|
|
|
|
return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// returns results in whatever encoding you request... but note that 2-byte encodings
|
|
|
|
// returns results in whatever encoding you request... but note that 2-byte encodings
|
|
|
@ -3154,7 +3140,7 @@ static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name,
|
|
|
|
return 1;
|
|
|
|
return 1;
|
|
|
|
} else if (matchlen < nlen && name[matchlen] == ' ') {
|
|
|
|
} else if (matchlen < nlen && name[matchlen] == ' ') {
|
|
|
|
++matchlen;
|
|
|
|
++matchlen;
|
|
|
|
if (stbtt_CompareUTF8toUTF16_bigendian((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen))
|
|
|
|
if (stbtt_CompareUTF8toUTF16_bigendian_internal((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen))
|
|
|
|
return 1;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
@ -3200,7 +3186,7 @@ static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *nam
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *font_collection, const char *name_utf8, stbtt_int32 flags)
|
|
|
|
static int stbtt_FindMatchingFont_internal(unsigned char *font_collection, char *name_utf8, stbtt_int32 flags)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
stbtt_int32 i;
|
|
|
|
stbtt_int32 i;
|
|
|
|
for (i=0;;++i) {
|
|
|
|
for (i=0;;++i) {
|
|
|
@ -3211,11 +3197,49 @@ STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *font_collection, const
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(__GNUC__) || defined(__clang__)
|
|
|
|
|
|
|
|
#pragma GCC diagnostic push
|
|
|
|
|
|
|
|
#pragma GCC diagnostic ignored "-Wcast-qual"
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset,
|
|
|
|
|
|
|
|
float pixel_height, unsigned char *pixels, int pw, int ph,
|
|
|
|
|
|
|
|
int first_char, int num_chars, stbtt_bakedchar *chardata)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return stbtt_BakeFontBitmap_internal((unsigned char *) data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return stbtt_InitFont_internal(info, (unsigned char *) data, offset);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return stbtt_FindMatchingFont_internal((unsigned char *) fontdata, (char *) name, flags);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return stbtt_CompareUTF8toUTF16_bigendian_internal((char *) s1, len1, (char *) s2, len2);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(__GNUC__) || defined(__clang__)
|
|
|
|
|
|
|
|
#pragma GCC diagnostic pop
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#endif // STB_TRUETYPE_IMPLEMENTATION
|
|
|
|
#endif // STB_TRUETYPE_IMPLEMENTATION
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// FULL VERSION HISTORY
|
|
|
|
// FULL VERSION HISTORY
|
|
|
|
//
|
|
|
|
//
|
|
|
|
|
|
|
|
// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual
|
|
|
|
|
|
|
|
// 1.11 (2016-04-02) fix unused-variable warning
|
|
|
|
// 1.10 (2016-04-02) allow user-defined fabs() replacement
|
|
|
|
// 1.10 (2016-04-02) allow user-defined fabs() replacement
|
|
|
|
// fix memory leak if fontsize=0.0
|
|
|
|
// fix memory leak if fontsize=0.0
|
|
|
|
// fix warning from duplicate typedef
|
|
|
|
// fix warning from duplicate typedef
|
|
|
|