| @@ -1,5 +1,5 @@ | |||
| // stb_truetype.h - v0.6c - public domain | |||
| // authored from 2009-2012 by Sean Barrett / RAD Game Tools | |||
| // stb_truetype.h - v0.8 - public domain | |||
| // authored from 2009-2013 by Sean Barrett / RAD Game Tools | |||
| // | |||
| // This library processes TrueType files: | |||
| // parse files | |||
| @@ -27,9 +27,15 @@ | |||
| // stoiko (Haemimont Games) | |||
| // Brian Hook | |||
| // Walter van Niftrik | |||
| // David Gow | |||
| // David Given | |||
| // Ivan-Assen Ivanov | |||
| // Anthony Pesch | |||
| // | |||
| // VERSION HISTORY | |||
| // | |||
| // 0.8 (2014-05-25) fix a few more warnings | |||
| // 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back | |||
| // 0.6c (2012-07-24) improve documentation | |||
| // 0.6b (2012-07-20) fix a few more warnings | |||
| // 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, | |||
| @@ -222,7 +228,7 @@ void my_stbtt_print(float x, float y, char *text) | |||
| while (*text) { | |||
| if (*text >= 32 && *text < 128) { | |||
| stbtt_aligned_quad q; | |||
| stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl,0=old d3d | |||
| stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9 | |||
| glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y0); | |||
| glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y0); | |||
| glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y1); | |||
| @@ -291,7 +297,7 @@ int main(int arg, char **argv) | |||
| { | |||
| stbtt_fontinfo font; | |||
| int i,j,ascent,baseline,ch=0; | |||
| float scale, xpos=0; | |||
| float scale, xpos=2; // leave a little padding in case the character extends left | |||
| char *text = "Heljo World!"; | |||
| fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); | |||
| @@ -363,10 +369,15 @@ int main(int arg, char **argv) | |||
| #define STBTT_iceil(x) ((int) ceil(x)) | |||
| #endif | |||
| #ifndef STBTT_sqrt | |||
| #include <math.h> | |||
| #define STBTT_sqrt(x) sqrt(x) | |||
| #endif | |||
| // #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h | |||
| #ifndef STBTT_malloc | |||
| #include <malloc.h> | |||
| #define STBTT_malloc(x,u) malloc(x) | |||
| #include <stdlib.h> | |||
| #define STBTT_malloc(x,u) ((void)(u),malloc(x)) | |||
| #define STBTT_free(x,u) free(x) | |||
| #endif | |||
| @@ -531,7 +542,6 @@ extern void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint | |||
| extern int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2); | |||
| // an additional amount to add to the 'advance' value between ch1 and ch2 | |||
| // @TODO; for now always returns 0! | |||
| extern int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1); | |||
| // Gets the bounding box of the visible part of the glyph, in unscaled coordinates | |||
| @@ -573,6 +583,13 @@ extern int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codep | |||
| extern int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices); | |||
| // returns # of vertices and fills *vertices with the pointer to them | |||
| // these are expressed in "unscaled" coordinates | |||
| // | |||
| // The shape is a series of countours. Each one starts with | |||
| // a STBTT_moveto, then consists of a series of mixed | |||
| // STBTT_lineto and STBTT_curveto segments. A lineto | |||
| // draws a line from previous endpoint to its x,y; a curveto | |||
| // draws a quadratic bezier from previous endpoint to | |||
| // its x,y, using cx,cy as the bezier control point. | |||
| extern void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices); | |||
| // frees the data allocated above | |||
| @@ -916,8 +933,6 @@ int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) | |||
| search -= 2; | |||
| while (entrySelector) { | |||
| searchRange >>= 1; | |||
| start = ttUSHORT(data + search + 2 + segcount*2 + 2); | |||
| end = ttUSHORT(data + search + 2); | |||
| start = ttUSHORT(data + search + searchRange*2 + segcount*2 + 2); | |||
| end = ttUSHORT(data + search + searchRange*2); | |||
| if (unicode_codepoint > end) | |||
| @@ -1222,8 +1237,8 @@ int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_verte | |||
| } | |||
| // Find transformation scales. | |||
| m = (float) sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); | |||
| n = (float) sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); | |||
| m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); | |||
| n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); | |||
| // Get indexed glyph. | |||
| comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); | |||
| @@ -1246,8 +1261,8 @@ int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_verte | |||
| if (comp_verts) STBTT_free(comp_verts, info->userdata); | |||
| return 0; | |||
| } | |||
| if (num_vertices > 0) memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); | |||
| memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex)); | |||
| if (num_vertices > 0) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); | |||
| STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex)); | |||
| if (vertices) STBTT_free(vertices, info->userdata); | |||
| vertices = tmp; | |||
| STBTT_free(comp_verts, info->userdata); | |||
| @@ -1759,7 +1774,7 @@ unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float sc | |||
| scale_y = scale_x; | |||
| } | |||
| stbtt_GetGlyphBitmapBox(info, glyph, scale_x, scale_y, &ix0,&iy0,&ix1,&iy1); | |||
| stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1); | |||
| // now we get the size | |||
| gbm.w = (ix1 - ix0); | |||
| @@ -1991,14 +2006,16 @@ static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, | |||
| // is this a Unicode encoding? | |||
| if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { | |||
| stbtt_int32 slen = ttUSHORT(fc+loc+8), off = ttUSHORT(fc+loc+10); | |||
| stbtt_int32 slen = ttUSHORT(fc+loc+8); | |||
| stbtt_int32 off = ttUSHORT(fc+loc+10); | |||
| // check if there's a prefix match | |||
| stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen); | |||
| if (matchlen >= 0) { | |||
| // check for target_id+1 immediately following, with same encoding & language | |||
| if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) { | |||
| stbtt_int32 slen = ttUSHORT(fc+loc+12+8), off = ttUSHORT(fc+loc+12+10); | |||
| slen = ttUSHORT(fc+loc+12+8); | |||
| off = ttUSHORT(fc+loc+12+10); | |||
| if (slen == 0) { | |||
| if (matchlen == nlen) | |||
| return 1; | |||