|
|
@ -51,7 +51,7 @@ |
|
|
|
// Rob Loach Cort Stratton
|
|
|
|
// Kenney Phillis Jr. github:oyvindjam
|
|
|
|
// Brian Costabile github:vassvik
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// VERSION HISTORY
|
|
|
|
//
|
|
|
|
// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics()
|
|
|
@ -212,7 +212,7 @@ |
|
|
|
//
|
|
|
|
// Advancing for the next character:
|
|
|
|
// Call GlyphHMetrics, and compute 'current_point += SF * advance'.
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// ADVANCED USAGE
|
|
|
|
//
|
|
|
@ -257,7 +257,7 @@ |
|
|
|
// Curve tessellation 120 LOC \__ 550 LOC Bitmap creation
|
|
|
|
// Bitmap management 100 LOC /
|
|
|
|
// Baked bitmap interface 70 LOC /
|
|
|
|
// Font name matching & access 150 LOC ---- 150
|
|
|
|
// Font name matching & access 150 LOC ---- 150
|
|
|
|
// C runtime library abstraction 60 LOC ---- 60
|
|
|
|
//
|
|
|
|
//
|
|
|
@ -350,7 +350,7 @@ int main(int argc, char **argv) |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
//
|
|
|
|
// Output:
|
|
|
|
//
|
|
|
@ -364,9 +364,9 @@ int main(int argc, char **argv) |
|
|
|
// :@@. M@M
|
|
|
|
// @@@o@@@@
|
|
|
|
// :M@@V:@@.
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// Complete program: print "Hello World!" banner, with bugs
|
|
|
|
//
|
|
|
|
#if 0 |
|
|
@ -667,7 +667,7 @@ STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, cons |
|
|
|
// Calling these functions in sequence is roughly equivalent to calling
|
|
|
|
// 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
|
|
|
|
// 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,
|
|
|
|
// building up a single array of rects, then call PackRects once,
|
|
|
|
// then call RenderIntoRects repeatedly. This may result in a
|
|
|
@ -975,7 +975,7 @@ STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, floa |
|
|
|
// and computing from that can allow drop-out prevention).
|
|
|
|
//
|
|
|
|
// 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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1732,7 +1732,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s |
|
|
|
if (i != 0) |
|
|
|
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); |
|
|
|
if (start_off) { |
|
|
|
// if we start off with an off-curve point, then when we need to find a point on the curve
|
|
|
@ -1785,7 +1785,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s |
|
|
|
int comp_num_verts = 0, i; |
|
|
|
stbtt_vertex *comp_verts = 0, *tmp = 0; |
|
|
|
float mtx[6] = {1,0,0,1,0,0}, m, n; |
|
|
|
|
|
|
|
|
|
|
|
flags = ttSHORT(comp); comp+=2; |
|
|
|
gidx = ttSHORT(comp); comp+=2; |
|
|
|
|
|
|
@ -1815,7 +1815,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s |
|
|
|
mtx[2] = ttSHORT(comp)/16384.0f; comp+=2; |
|
|
|
mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Find transformation scales.
|
|
|
|
m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); |
|
|
|
n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); |
|
|
@ -2746,7 +2746,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); |
|
|
|
STBTT_assert(z != NULL); |
|
|
|
if (!z) return z; |
|
|
|
|
|
|
|
|
|
|
|
// round dx down to avoid overshooting
|
|
|
|
if (dxdy < 0) |
|
|
|
z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); |
|
|
@ -2824,7 +2824,7 @@ static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__ac |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
e = e->next; |
|
|
|
} |
|
|
|
} |
|
|
@ -3554,7 +3554,7 @@ STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info |
|
|
|
{ |
|
|
|
int ix0,iy0,ix1,iy1; |
|
|
|
stbtt__bitmap gbm; |
|
|
|
stbtt_vertex *vertices; |
|
|
|
stbtt_vertex *vertices; |
|
|
|
int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); |
|
|
|
|
|
|
|
if (scale_x == 0) scale_x = scale_y; |
|
|
@ -3577,7 +3577,7 @@ STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info |
|
|
|
if (height) *height = gbm.h; |
|
|
|
if (xoff ) *xoff = ix0; |
|
|
|
if (yoff ) *yoff = iy0; |
|
|
|
|
|
|
|
|
|
|
|
if (gbm.w && gbm.h) { |
|
|
|
gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata); |
|
|
|
if (gbm.pixels) { |
|
|
@ -3588,7 +3588,7 @@ STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info |
|
|
|
} |
|
|
|
STBTT_free(vertices, info->userdata); |
|
|
|
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) |
|
|
|
{ |
|
|
@ -3600,7 +3600,7 @@ STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigne |
|
|
|
int ix0,iy0; |
|
|
|
stbtt_vertex *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); |
|
|
|
gbm.pixels = output; |
|
|
@ -3622,7 +3622,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) |
|
|
|
{ |
|
|
|
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) |
|
|
|
{ |
|
|
@ -3637,7 +3637,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) |
|
|
|
{ |
|
|
|
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) |
|
|
|
{ |
|
|
@ -3762,7 +3762,7 @@ static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *no |
|
|
|
con->y = 0; |
|
|
|
con->bottom_y = 0; |
|
|
|
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) |
|
|
@ -4147,7 +4147,7 @@ STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char |
|
|
|
n = 0; |
|
|
|
for (i=0; i < num_ranges; ++i) |
|
|
|
n += ranges[i].num_chars; |
|
|
|
|
|
|
|
|
|
|
|
rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); |
|
|
|
if (rects == NULL) |
|
|
|
return 0; |
|
|
@ -4158,7 +4158,7 @@ STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char |
|
|
|
n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); |
|
|
|
|
|
|
|
stbtt_PackFontRangesPackRects(spc, rects, n); |
|
|
|
|
|
|
|
|
|
|
|
return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); |
|
|
|
|
|
|
|
STBTT_free(rects, spc->user_allocator_context); |
|
|
@ -4319,7 +4319,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; |
|
|
|
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; |
|
|
|
if (x_inter < x) |
|
|
|
if (x_inter < x) |
|
|
|
winding += (y0 < y1) ? 1 : -1; |
|
|
|
} |
|
|
|
} |
|
|
@ -4345,7 +4345,7 @@ static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex |
|
|
|
y1 = (int)verts[i ].y; |
|
|
|
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; |
|
|
|
if (x_inter < x) |
|
|
|
if (x_inter < x) |
|
|
|
winding += (y0 < y1) ? 1 : -1; |
|
|
|
} |
|
|
|
} else { |
|
|
@ -4357,7 +4357,7 @@ static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex |
|
|
|
if (hits[1][0] < 0) |
|
|
|
winding += (hits[1][1] < 0 ? -1 : 1); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return winding; |
|
|
@ -4438,7 +4438,7 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc |
|
|
|
|
|
|
|
// invert for y-downwards bitmaps
|
|
|
|
scale_y = -scale_y; |
|
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
int x,y,i,j; |
|
|
|
float *precompute; |
|
|
@ -4587,7 +4587,7 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc |
|
|
|
STBTT_free(verts, info->userdata); |
|
|
|
} |
|
|
|
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) |
|
|
|
{ |
|
|
@ -4605,7 +4605,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
|
|
|
|
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; |
|
|
|
|
|
|
@ -4644,7 +4644,7 @@ static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, s |
|
|
|
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); |
|
|
|
} |
|
|
@ -4773,7 +4773,7 @@ STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, |
|
|
|
|
|
|
|
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) |
|
|
@ -4866,38 +4866,38 @@ This software is available under 2 licenses -- choose whichever you prefer. |
|
|
|
------------------------------------------------------------------------------ |
|
|
|
ALTERNATIVE A - MIT License |
|
|
|
Copyright (c) 2017 Sean Barrett |
|
|
|
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 |
|
|
|
the Software without restriction, including without limitation the rights to |
|
|
|
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 |
|
|
|
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 |
|
|
|
the Software without restriction, including without limitation the rights to |
|
|
|
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 |
|
|
|
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. |
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
|
|
AUTHORS OR COPYRIGHT HOLDERS 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 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
|
|
AUTHORS OR COPYRIGHT HOLDERS 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 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|
|
|
SOFTWARE. |
|
|
|
------------------------------------------------------------------------------ |
|
|
|
ALTERNATIVE B - Public Domain (www.unlicense.org) |
|
|
|
This is free and unencumbered software released into the public domain. |
|
|
|
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, |
|
|
|
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, |
|
|
|
commercial or non-commercial, and by any means. |
|
|
|
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 |
|
|
|
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 |
|
|
|
overt act of relinquishment in perpetuity of all present and future rights to |
|
|
|
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 |
|
|
|
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 |
|
|
|
overt act of relinquishment in perpetuity of all present and future rights to |
|
|
|
this software under copyright law. |
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
|
|
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 |
|
|
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
|
|
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 |
|
|
|
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. |
|
|
|
------------------------------------------------------------------------------ |
|
|
|
*/ |
|
|
|