lnvis

nanovg lightning network visualizer
git clone git://jb55.com/lnvis
Log | Files | Refs | README | LICENSE

stb_truetype.h (127303B)


      1 // stb_truetype.h - v1.09 - public domain
      2 // authored from 2009-2015 by Sean Barrett / RAD Game Tools
      3 //
      4 //   This library processes TrueType files:
      5 //        parse files
      6 //        extract glyph metrics
      7 //        extract glyph shapes
      8 //        render glyphs to one-channel bitmaps with antialiasing (box filter)
      9 //
     10 //   Todo:
     11 //        non-MS cmaps
     12 //        crashproof on bad data
     13 //        hinting? (no longer patented)
     14 //        cleartype-style AA?
     15 //        optimize: use simple memory allocator for intermediates
     16 //        optimize: build edge-list directly from curves
     17 //        optimize: rasterize directly from curves?
     18 //
     19 // ADDITIONAL CONTRIBUTORS
     20 //
     21 //   Mikko Mononen: compound shape support, more cmap formats
     22 //   Tor Andersson: kerning, subpixel rendering
     23 //
     24 //   Bug/warning reports/fixes:
     25 //       "Zer" on mollyrocket (with fix)
     26 //       Cass Everitt
     27 //       stoiko (Haemimont Games)
     28 //       Brian Hook 
     29 //       Walter van Niftrik
     30 //       David Gow
     31 //       David Given
     32 //       Ivan-Assen Ivanov
     33 //       Anthony Pesch
     34 //       Johan Duparc
     35 //       Hou Qiming
     36 //       Fabian "ryg" Giesen
     37 //       Martins Mozeiko
     38 //       Cap Petschulat
     39 //       Omar Cornut
     40 //       github:aloucks
     41 //       Peter LaValle
     42 //       Sergey Popov
     43 //       Giumo X. Clanjor
     44 //       Higor Euripedes
     45 //       Thomas Fields
     46 //       Derek Vinyard
     47 //
     48 //   Misc other:
     49 //       Ryan Gordon
     50 //
     51 // VERSION HISTORY
     52 //
     53 //   1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly
     54 //   1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges
     55 //   1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints;
     56 //                     variant PackFontRanges to pack and render in separate phases;
     57 //                     fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?);
     58 //                     fixed an assert() bug in the new rasterizer
     59 //                     replace assert() with STBTT_assert() in new rasterizer
     60 //   1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine)
     61 //                     also more precise AA rasterizer, except if shapes overlap
     62 //                     remove need for STBTT_sort
     63 //   1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC
     64 //   1.04 (2015-04-15) typo in example
     65 //   1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes
     66 //
     67 //   Full history can be found at the end of this file.
     68 //
     69 // LICENSE
     70 //
     71 //   This software is in the public domain. Where that dedication is not
     72 //   recognized, you are granted a perpetual, irrevocable license to copy,
     73 //   distribute, and modify this file as you see fit.
     74 //
     75 // USAGE
     76 //
     77 //   Include this file in whatever places neeed to refer to it. In ONE C/C++
     78 //   file, write:
     79 //      #define STB_TRUETYPE_IMPLEMENTATION
     80 //   before the #include of this file. This expands out the actual
     81 //   implementation into that C/C++ file.
     82 //
     83 //   To make the implementation private to the file that generates the implementation,
     84 //      #define STBTT_STATIC
     85 //
     86 //   Simple 3D API (don't ship this, but it's fine for tools and quick start)
     87 //           stbtt_BakeFontBitmap()               -- bake a font to a bitmap for use as texture
     88 //           stbtt_GetBakedQuad()                 -- compute quad to draw for a given char
     89 //
     90 //   Improved 3D API (more shippable):
     91 //           #include "stb_rect_pack.h"           -- optional, but you really want it
     92 //           stbtt_PackBegin()
     93 //           stbtt_PackSetOversample()            -- for improved quality on small fonts
     94 //           stbtt_PackFontRanges()               -- pack and renders
     95 //           stbtt_PackEnd()
     96 //           stbtt_GetPackedQuad()
     97 //
     98 //   "Load" a font file from a memory buffer (you have to keep the buffer loaded)
     99 //           stbtt_InitFont()
    100 //           stbtt_GetFontOffsetForIndex()        -- use for TTC font collections
    101 //
    102 //   Render a unicode codepoint to a bitmap
    103 //           stbtt_GetCodepointBitmap()           -- allocates and returns a bitmap
    104 //           stbtt_MakeCodepointBitmap()          -- renders into bitmap you provide
    105 //           stbtt_GetCodepointBitmapBox()        -- how big the bitmap must be
    106 //
    107 //   Character advance/positioning
    108 //           stbtt_GetCodepointHMetrics()
    109 //           stbtt_GetFontVMetrics()
    110 //           stbtt_GetCodepointKernAdvance()
    111 //
    112 //   Starting with version 1.06, the rasterizer was replaced with a new,
    113 //   faster and generally-more-precise rasterizer. The new rasterizer more
    114 //   accurately measures pixel coverage for anti-aliasing, except in the case
    115 //   where multiple shapes overlap, in which case it overestimates the AA pixel
    116 //   coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If
    117 //   this turns out to be a problem, you can re-enable the old rasterizer with
    118 //        #define STBTT_RASTERIZER_VERSION 1
    119 //   which will incur about a 15% speed hit.
    120 //
    121 // ADDITIONAL DOCUMENTATION
    122 //
    123 //   Immediately after this block comment are a series of sample programs.
    124 //
    125 //   After the sample programs is the "header file" section. This section
    126 //   includes documentation for each API function.
    127 //
    128 //   Some important concepts to understand to use this library:
    129 //
    130 //      Codepoint
    131 //         Characters are defined by unicode codepoints, e.g. 65 is
    132 //         uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is
    133 //         the hiragana for "ma".
    134 //
    135 //      Glyph
    136 //         A visual character shape (every codepoint is rendered as
    137 //         some glyph)
    138 //
    139 //      Glyph index
    140 //         A font-specific integer ID representing a glyph
    141 //
    142 //      Baseline
    143 //         Glyph shapes are defined relative to a baseline, which is the
    144 //         bottom of uppercase characters. Characters extend both above
    145 //         and below the baseline.
    146 //
    147 //      Current Point
    148 //         As you draw text to the screen, you keep track of a "current point"
    149 //         which is the origin of each character. The current point's vertical
    150 //         position is the baseline. Even "baked fonts" use this model.
    151 //
    152 //      Vertical Font Metrics
    153 //         The vertical qualities of the font, used to vertically position
    154 //         and space the characters. See docs for stbtt_GetFontVMetrics.
    155 //
    156 //      Font Size in Pixels or Points
    157 //         The preferred interface for specifying font sizes in stb_truetype
    158 //         is to specify how tall the font's vertical extent should be in pixels.
    159 //         If that sounds good enough, skip the next paragraph.
    160 //
    161 //         Most font APIs instead use "points", which are a common typographic
    162 //         measurement for describing font size, defined as 72 points per inch.
    163 //         stb_truetype provides a point API for compatibility. However, true
    164 //         "per inch" conventions don't make much sense on computer displays
    165 //         since they different monitors have different number of pixels per
    166 //         inch. For example, Windows traditionally uses a convention that
    167 //         there are 96 pixels per inch, thus making 'inch' measurements have
    168 //         nothing to do with inches, and thus effectively defining a point to
    169 //         be 1.333 pixels. Additionally, the TrueType font data provides
    170 //         an explicit scale factor to scale a given font's glyphs to points,
    171 //         but the author has observed that this scale factor is often wrong
    172 //         for non-commercial fonts, thus making fonts scaled in points
    173 //         according to the TrueType spec incoherently sized in practice.
    174 //
    175 // ADVANCED USAGE
    176 //
    177 //   Quality:
    178 //
    179 //    - Use the functions with Subpixel at the end to allow your characters
    180 //      to have subpixel positioning. Since the font is anti-aliased, not
    181 //      hinted, this is very import for quality. (This is not possible with
    182 //      baked fonts.)
    183 //
    184 //    - Kerning is now supported, and if you're supporting subpixel rendering
    185 //      then kerning is worth using to give your text a polished look.
    186 //
    187 //   Performance:
    188 //
    189 //    - Convert Unicode codepoints to glyph indexes and operate on the glyphs;
    190 //      if you don't do this, stb_truetype is forced to do the conversion on
    191 //      every call.
    192 //
    193 //    - There are a lot of memory allocations. We should modify it to take
    194 //      a temp buffer and allocate from the temp buffer (without freeing),
    195 //      should help performance a lot.
    196 //
    197 // NOTES
    198 //
    199 //   The system uses the raw data found in the .ttf file without changing it
    200 //   and without building auxiliary data structures. This is a bit inefficient
    201 //   on little-endian systems (the data is big-endian), but assuming you're
    202 //   caching the bitmaps or glyph shapes this shouldn't be a big deal.
    203 //
    204 //   It appears to be very hard to programmatically determine what font a
    205 //   given file is in a general way. I provide an API for this, but I don't
    206 //   recommend it.
    207 //
    208 //
    209 // SOURCE STATISTICS (based on v0.6c, 2050 LOC)
    210 //
    211 //   Documentation & header file        520 LOC  \___ 660 LOC documentation
    212 //   Sample code                        140 LOC  /
    213 //   Truetype parsing                   620 LOC  ---- 620 LOC TrueType
    214 //   Software rasterization             240 LOC  \                           .
    215 //   Curve tesselation                  120 LOC   \__ 550 LOC Bitmap creation
    216 //   Bitmap management                  100 LOC   /
    217 //   Baked bitmap interface              70 LOC  /
    218 //   Font name matching & access        150 LOC  ---- 150 
    219 //   C runtime library abstraction       60 LOC  ----  60
    220 //
    221 //
    222 // PERFORMANCE MEASUREMENTS FOR 1.06:
    223 //
    224 //                      32-bit     64-bit
    225 //   Previous release:  8.83 s     7.68 s
    226 //   Pool allocations:  7.72 s     6.34 s
    227 //   Inline sort     :  6.54 s     5.65 s
    228 //   New rasterizer  :  5.63 s     5.00 s
    229 
    230 //////////////////////////////////////////////////////////////////////////////
    231 //////////////////////////////////////////////////////////////////////////////
    232 ////
    233 ////  SAMPLE PROGRAMS
    234 ////
    235 //
    236 //  Incomplete text-in-3d-api example, which draws quads properly aligned to be lossless
    237 //
    238 #if 0
    239 #define STB_TRUETYPE_IMPLEMENTATION  // force following include to generate implementation
    240 #include "stb_truetype.h"
    241 
    242 unsigned char ttf_buffer[1<<20];
    243 unsigned char temp_bitmap[512*512];
    244 
    245 stbtt_bakedchar cdata[96]; // ASCII 32..126 is 95 glyphs
    246 GLuint ftex;
    247 
    248 void my_stbtt_initfont(void)
    249 {
    250    fread(ttf_buffer, 1, 1<<20, fopen("c:/windows/fonts/times.ttf", "rb"));
    251    stbtt_BakeFontBitmap(ttf_buffer,0, 32.0, temp_bitmap,512,512, 32,96, cdata); // no guarantee this fits!
    252    // can free ttf_buffer at this point
    253    glGenTextures(1, &ftex);
    254    glBindTexture(GL_TEXTURE_2D, ftex);
    255    glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 512,512, 0, GL_ALPHA, GL_UNSIGNED_BYTE, temp_bitmap);
    256    // can free temp_bitmap at this point
    257    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    258 }
    259 
    260 void my_stbtt_print(float x, float y, char *text)
    261 {
    262    // assume orthographic projection with units = screen pixels, origin at top left
    263    glEnable(GL_TEXTURE_2D);
    264    glBindTexture(GL_TEXTURE_2D, ftex);
    265    glBegin(GL_QUADS);
    266    while (*text) {
    267       if (*text >= 32 && *text < 128) {
    268          stbtt_aligned_quad q;
    269          stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9
    270          glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y0);
    271          glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y0);
    272          glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y1);
    273          glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y1);
    274       }
    275       ++text;
    276    }
    277    glEnd();
    278 }
    279 #endif
    280 //
    281 //
    282 //////////////////////////////////////////////////////////////////////////////
    283 //
    284 // Complete program (this compiles): get a single bitmap, print as ASCII art
    285 //
    286 #if 0
    287 #include <stdio.h>
    288 #define STB_TRUETYPE_IMPLEMENTATION  // force following include to generate implementation
    289 #include "stb_truetype.h"
    290 
    291 char ttf_buffer[1<<25];
    292 
    293 int main(int argc, char **argv)
    294 {
    295    stbtt_fontinfo font;
    296    unsigned char *bitmap;
    297    int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20);
    298 
    299    fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb"));
    300 
    301    stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0));
    302    bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0);
    303 
    304    for (j=0; j < h; ++j) {
    305       for (i=0; i < w; ++i)
    306          putchar(" .:ioVM@"[bitmap[j*w+i]>>5]);
    307       putchar('\n');
    308    }
    309    return 0;
    310 }
    311 #endif 
    312 //
    313 // Output:
    314 //
    315 //     .ii.
    316 //    @@@@@@.
    317 //   V@Mio@@o
    318 //   :i.  V@V
    319 //     :oM@@M
    320 //   :@@@MM@M
    321 //   @@o  o@M
    322 //  :@@.  M@M
    323 //   @@@o@@@@
    324 //   :M@@V:@@.
    325 //  
    326 //////////////////////////////////////////////////////////////////////////////
    327 // 
    328 // Complete program: print "Hello World!" banner, with bugs
    329 //
    330 #if 0
    331 char buffer[24<<20];
    332 unsigned char screen[20][79];
    333 
    334 int main(int arg, char **argv)
    335 {
    336    stbtt_fontinfo font;
    337    int i,j,ascent,baseline,ch=0;
    338    float scale, xpos=2; // leave a little padding in case the character extends left
    339    char *text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness
    340 
    341    fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb"));
    342    stbtt_InitFont(&font, buffer, 0);
    343 
    344    scale = stbtt_ScaleForPixelHeight(&font, 15);
    345    stbtt_GetFontVMetrics(&font, &ascent,0,0);
    346    baseline = (int) (ascent*scale);
    347 
    348    while (text[ch]) {
    349       int advance,lsb,x0,y0,x1,y1;
    350       float x_shift = xpos - (float) floor(xpos);
    351       stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb);
    352       stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1);
    353       stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]);
    354       // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong
    355       // because this API is really for baking character bitmaps into textures. if you want to render
    356       // a sequence of characters, you really need to render each bitmap to a temp buffer, then
    357       // "alpha blend" that into the working buffer
    358       xpos += (advance * scale);
    359       if (text[ch+1])
    360          xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]);
    361       ++ch;
    362    }
    363 
    364    for (j=0; j < 20; ++j) {
    365       for (i=0; i < 78; ++i)
    366          putchar(" .:ioVM@"[screen[j][i]>>5]);
    367       putchar('\n');
    368    }
    369 
    370    return 0;
    371 }
    372 #endif
    373 
    374 
    375 //////////////////////////////////////////////////////////////////////////////
    376 //////////////////////////////////////////////////////////////////////////////
    377 ////
    378 ////   INTEGRATION WITH YOUR CODEBASE
    379 ////
    380 ////   The following sections allow you to supply alternate definitions
    381 ////   of C library functions used by stb_truetype.
    382 
    383 #ifdef STB_TRUETYPE_IMPLEMENTATION
    384    // #define your own (u)stbtt_int8/16/32 before including to override this
    385    #ifndef stbtt_uint8
    386    typedef unsigned char   stbtt_uint8;
    387    typedef signed   char   stbtt_int8;
    388    typedef unsigned short  stbtt_uint16;
    389    typedef signed   short  stbtt_int16;
    390    typedef unsigned int    stbtt_uint32;
    391    typedef signed   int    stbtt_int32;
    392    #endif
    393 
    394    typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1];
    395    typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1];
    396 
    397    // #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h
    398    #ifndef STBTT_ifloor
    399    #include <math.h>
    400    #define STBTT_ifloor(x)   ((int) floor(x))
    401    #define STBTT_iceil(x)    ((int) ceil(x))
    402    #endif
    403 
    404    #ifndef STBTT_sqrt
    405    #include <math.h>
    406    #define STBTT_sqrt(x)      sqrt(x)
    407    #endif
    408 
    409    // #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h
    410    #ifndef STBTT_malloc
    411    #include <stdlib.h>
    412    #define STBTT_malloc(x,u)  ((void)(u),malloc(x))
    413    #define STBTT_free(x,u)    ((void)(u),free(x))
    414    #endif
    415 
    416    #ifndef STBTT_assert
    417    #include <assert.h>
    418    #define STBTT_assert(x)    assert(x)
    419    #endif
    420 
    421    #ifndef STBTT_strlen
    422    #include <string.h>
    423    #define STBTT_strlen(x)    strlen(x)
    424    #endif
    425 
    426    #ifndef STBTT_memcpy
    427    #include <memory.h>
    428    #define STBTT_memcpy       memcpy
    429    #define STBTT_memset       memset
    430    #endif
    431 #endif
    432 
    433 ///////////////////////////////////////////////////////////////////////////////
    434 ///////////////////////////////////////////////////////////////////////////////
    435 ////
    436 ////   INTERFACE
    437 ////
    438 ////
    439 
    440 #ifndef __STB_INCLUDE_STB_TRUETYPE_H__
    441 #define __STB_INCLUDE_STB_TRUETYPE_H__
    442 
    443 #ifdef STBTT_STATIC
    444 #define STBTT_DEF static
    445 #else
    446 #define STBTT_DEF extern
    447 #endif
    448 
    449 #ifdef __cplusplus
    450 extern "C" {
    451 #endif
    452 
    453 //////////////////////////////////////////////////////////////////////////////
    454 //
    455 // TEXTURE BAKING API
    456 //
    457 // If you use this API, you only have to call two functions ever.
    458 //
    459 
    460 typedef struct
    461 {
    462    unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap
    463    float xoff,yoff,xadvance;
    464 } stbtt_bakedchar;
    465 
    466 STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset,  // font location (use offset=0 for plain .ttf)
    467                                 float pixel_height,                     // height of font in pixels
    468                                 unsigned char *pixels, int pw, int ph,  // bitmap to be filled in
    469                                 int first_char, int num_chars,          // characters to bake
    470                                 stbtt_bakedchar *chardata);             // you allocate this, it's num_chars long
    471 // if return is positive, the first unused row of the bitmap
    472 // if return is negative, returns the negative of the number of characters that fit
    473 // if return is 0, no characters fit and no rows were used
    474 // This uses a very crappy packing.
    475 
    476 typedef struct
    477 {
    478    float x0,y0,s0,t0; // top-left
    479    float x1,y1,s1,t1; // bottom-right
    480 } stbtt_aligned_quad;
    481 
    482 STBTT_DEF void stbtt_GetBakedQuad(stbtt_bakedchar *chardata, int pw, int ph,  // same data as above
    483                                int char_index,             // character to display
    484                                float *xpos, float *ypos,   // pointers to current position in screen pixel space
    485                                stbtt_aligned_quad *q,      // output: quad to draw
    486                                int opengl_fillrule);       // true if opengl fill rule; false if DX9 or earlier
    487 // Call GetBakedQuad with char_index = 'character - first_char', and it
    488 // creates the quad you need to draw and advances the current position.
    489 //
    490 // The coordinate system used assumes y increases downwards.
    491 //
    492 // Characters will extend both above and below the current position;
    493 // see discussion of "BASELINE" above.
    494 //
    495 // It's inefficient; you might want to c&p it and optimize it.
    496 
    497 
    498 
    499 //////////////////////////////////////////////////////////////////////////////
    500 //
    501 // NEW TEXTURE BAKING API
    502 //
    503 // This provides options for packing multiple fonts into one atlas, not
    504 // perfectly but better than nothing.
    505 
    506 typedef struct
    507 {
    508    unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap
    509    float xoff,yoff,xadvance;
    510    float xoff2,yoff2;
    511 } stbtt_packedchar;
    512 
    513 typedef struct stbtt_pack_context stbtt_pack_context;
    514 typedef struct stbtt_fontinfo stbtt_fontinfo;
    515 #ifndef STB_RECT_PACK_VERSION
    516 typedef struct stbrp_rect stbrp_rect;
    517 #endif
    518 
    519 STBTT_DEF int  stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int width, int height, int stride_in_bytes, int padding, void *alloc_context);
    520 // Initializes a packing context stored in the passed-in stbtt_pack_context.
    521 // Future calls using this context will pack characters into the bitmap passed
    522 // in here: a 1-channel bitmap that is weight x height. stride_in_bytes is
    523 // the distance from one row to the next (or 0 to mean they are packed tightly
    524 // together). "padding" is the amount of padding to leave between each
    525 // character (normally you want '1' for bitmaps you'll use as textures with
    526 // bilinear filtering).
    527 //
    528 // Returns 0 on failure, 1 on success.
    529 
    530 STBTT_DEF void stbtt_PackEnd  (stbtt_pack_context *spc);
    531 // Cleans up the packing context and frees all memory.
    532 
    533 #define STBTT_POINT_SIZE(x)   (-(x))
    534 
    535 STBTT_DEF int  stbtt_PackFontRange(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, float font_size,
    536                                 int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range);
    537 // Creates character bitmaps from the font_index'th font found in fontdata (use
    538 // font_index=0 if you don't know what that is). It creates num_chars_in_range
    539 // bitmaps for characters with unicode values starting at first_unicode_char_in_range
    540 // and increasing. Data for how to render them is stored in chardata_for_range;
    541 // pass these to stbtt_GetPackedQuad to get back renderable quads.
    542 //
    543 // font_size is the full height of the character from ascender to descender,
    544 // as computed by stbtt_ScaleForPixelHeight. To use a point size as computed
    545 // by stbtt_ScaleForMappingEmToPixels, wrap the point size in STBTT_POINT_SIZE()
    546 // and pass that result as 'font_size':
    547 //       ...,                  20 , ... // font max minus min y is 20 pixels tall
    548 //       ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall
    549 
    550 typedef struct
    551 {
    552    float font_size;
    553    int first_unicode_codepoint_in_range;  // if non-zero, then the chars are continuous, and this is the first codepoint
    554    int *array_of_unicode_codepoints;       // if non-zero, then this is an array of unicode codepoints
    555    int num_chars;
    556    stbtt_packedchar *chardata_for_range; // output
    557    unsigned char h_oversample, v_oversample; // don't set these, they're used internally
    558 } stbtt_pack_range;
    559 
    560 STBTT_DEF int  stbtt_PackFontRanges(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges);
    561 // Creates character bitmaps from multiple ranges of characters stored in
    562 // ranges. This will usually create a better-packed bitmap than multiple
    563 // calls to stbtt_PackFontRange. Note that you can call this multiple
    564 // times within a single PackBegin/PackEnd.
    565 
    566 STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample);
    567 // Oversampling a font increases the quality by allowing higher-quality subpixel
    568 // positioning, and is especially valuable at smaller text sizes.
    569 //
    570 // This function sets the amount of oversampling for all following calls to
    571 // stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given
    572 // pack context. The default (no oversampling) is achieved by h_oversample=1
    573 // and v_oversample=1. The total number of pixels required is
    574 // h_oversample*v_oversample larger than the default; for example, 2x2
    575 // oversampling requires 4x the storage of 1x1. For best results, render
    576 // oversampled textures with bilinear filtering. Look at the readme in
    577 // stb/tests/oversample for information about oversampled fonts
    578 //
    579 // To use with PackFontRangesGather etc., you must set it before calls
    580 // call to PackFontRangesGatherRects.
    581 
    582 STBTT_DEF void stbtt_GetPackedQuad(stbtt_packedchar *chardata, int pw, int ph,  // same data as above
    583                                int char_index,             // character to display
    584                                float *xpos, float *ypos,   // pointers to current position in screen pixel space
    585                                stbtt_aligned_quad *q,      // output: quad to draw
    586                                int align_to_integer);
    587 
    588 STBTT_DEF int  stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects);
    589 STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects);
    590 STBTT_DEF int  stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects);
    591 // Calling these functions in sequence is roughly equivalent to calling
    592 // stbtt_PackFontRanges(). If you more control over the packing of multiple
    593 // fonts, or if you want to pack custom data into a font texture, take a look
    594 // at the source to of stbtt_PackFontRanges() and create a custom version 
    595 // using these functions, e.g. call GatherRects multiple times,
    596 // building up a single array of rects, then call PackRects once,
    597 // then call RenderIntoRects repeatedly. This may result in a
    598 // better packing than calling PackFontRanges multiple times
    599 // (or it may not).
    600 
    601 // this is an opaque structure that you shouldn't mess with which holds
    602 // all the context needed from PackBegin to PackEnd.
    603 struct stbtt_pack_context {
    604    void *user_allocator_context;
    605    void *pack_info;
    606    int   width;
    607    int   height;
    608    int   stride_in_bytes;
    609    int   padding;
    610    unsigned int   h_oversample, v_oversample;
    611    unsigned char *pixels;
    612    void  *nodes;
    613 };
    614 
    615 //////////////////////////////////////////////////////////////////////////////
    616 //
    617 // FONT LOADING
    618 //
    619 //
    620 
    621 STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index);
    622 // Each .ttf/.ttc file may have more than one font. Each font has a sequential
    623 // index number starting from 0. Call this function to get the font offset for
    624 // a given index; it returns -1 if the index is out of range. A regular .ttf
    625 // file will only define one font and it always be at offset 0, so it will
    626 // return '0' for index 0, and -1 for all other indices. You can just skip
    627 // this step if you know it's that kind of font.
    628 
    629 
    630 // The following structure is defined publically so you can declare one on
    631 // the stack or as a global or etc, but you should treat it as opaque.
    632 typedef struct stbtt_fontinfo
    633 {
    634    void           * userdata;
    635    unsigned char  * data;              // pointer to .ttf file
    636    int              fontstart;         // offset of start of font
    637 
    638    int numGlyphs;                     // number of glyphs, needed for range checking
    639 
    640    int loca,head,glyf,hhea,hmtx,kern; // table locations as offset from start of .ttf
    641    int index_map;                     // a cmap mapping for our chosen character encoding
    642    int indexToLocFormat;              // format needed to map from glyph index to glyph
    643 } stbtt_fontinfo;
    644 
    645 STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset);
    646 // Given an offset into the file that defines a font, this function builds
    647 // the necessary cached info for the rest of the system. You must allocate
    648 // the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't
    649 // need to do anything special to free it, because the contents are pure
    650 // value data with no additional data structures. Returns 0 on failure.
    651 
    652 
    653 //////////////////////////////////////////////////////////////////////////////
    654 //
    655 // CHARACTER TO GLYPH-INDEX CONVERSIOn
    656 
    657 STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint);
    658 // If you're going to perform multiple operations on the same character
    659 // and you want a speed-up, call this function with the character you're
    660 // going to process, then use glyph-based functions instead of the
    661 // codepoint-based functions.
    662 
    663 
    664 //////////////////////////////////////////////////////////////////////////////
    665 //
    666 // CHARACTER PROPERTIES
    667 //
    668 
    669 STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels);
    670 // computes a scale factor to produce a font whose "height" is 'pixels' tall.
    671 // Height is measured as the distance from the highest ascender to the lowest
    672 // descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics
    673 // and computing:
    674 //       scale = pixels / (ascent - descent)
    675 // so if you prefer to measure height by the ascent only, use a similar calculation.
    676 
    677 STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels);
    678 // computes a scale factor to produce a font whose EM size is mapped to
    679 // 'pixels' tall. This is probably what traditional APIs compute, but
    680 // I'm not positive.
    681 
    682 STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap);
    683 // ascent is the coordinate above the baseline the font extends; descent
    684 // is the coordinate below the baseline the font extends (i.e. it is typically negative)
    685 // lineGap is the spacing between one row's descent and the next row's ascent...
    686 // so you should advance the vertical position by "*ascent - *descent + *lineGap"
    687 //   these are expressed in unscaled coordinates, so you must multiply by
    688 //   the scale factor for a given size
    689 
    690 STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1);
    691 // the bounding box around all possible characters
    692 
    693 STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing);
    694 // leftSideBearing is the offset from the current horizontal position to the left edge of the character
    695 // advanceWidth is the offset from the current horizontal position to the next horizontal position
    696 //   these are expressed in unscaled coordinates
    697 
    698 STBTT_DEF int  stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2);
    699 // an additional amount to add to the 'advance' value between ch1 and ch2
    700 
    701 STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1);
    702 // Gets the bounding box of the visible part of the glyph, in unscaled coordinates
    703 
    704 STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing);
    705 STBTT_DEF int  stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2);
    706 STBTT_DEF int  stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1);
    707 // as above, but takes one or more glyph indices for greater efficiency
    708 
    709 
    710 //////////////////////////////////////////////////////////////////////////////
    711 //
    712 // GLYPH SHAPES (you probably don't need these, but they have to go before
    713 // the bitmaps for C declaration-order reasons)
    714 //
    715 
    716 #ifndef STBTT_vmove // you can predefine these to use different values (but why?)
    717    enum {
    718       STBTT_vmove=1,
    719       STBTT_vline,
    720       STBTT_vcurve
    721    };
    722 #endif
    723 
    724 #ifndef stbtt_vertex // you can predefine this to use different values
    725                    // (we share this with other code at RAD)
    726    #define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file
    727    typedef struct
    728    {
    729       stbtt_vertex_type x,y,cx,cy;
    730       unsigned char type,padding;
    731    } stbtt_vertex;
    732 #endif
    733 
    734 STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index);
    735 // returns non-zero if nothing is drawn for this glyph
    736 
    737 STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices);
    738 STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices);
    739 // returns # of vertices and fills *vertices with the pointer to them
    740 //   these are expressed in "unscaled" coordinates
    741 //
    742 // The shape is a series of countours. Each one starts with
    743 // a STBTT_moveto, then consists of a series of mixed
    744 // STBTT_lineto and STBTT_curveto segments. A lineto
    745 // draws a line from previous endpoint to its x,y; a curveto
    746 // draws a quadratic bezier from previous endpoint to
    747 // its x,y, using cx,cy as the bezier control point.
    748 
    749 STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices);
    750 // frees the data allocated above
    751 
    752 //////////////////////////////////////////////////////////////////////////////
    753 //
    754 // BITMAP RENDERING
    755 //
    756 
    757 STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata);
    758 // frees the bitmap allocated below
    759 
    760 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);
    761 // allocates a large-enough single-channel 8bpp bitmap and renders the
    762 // specified character/glyph at the specified scale into it, with
    763 // antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque).
    764 // *width & *height are filled out with the width & height of the bitmap,
    765 // which is stored left-to-right, top-to-bottom.
    766 //
    767 // xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap
    768 
    769 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);
    770 // the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel
    771 // shift for the character
    772 
    773 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);
    774 // the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap
    775 // in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap
    776 // is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the
    777 // width and height and positioning info for it first.
    778 
    779 STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(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 codepoint);
    780 // same as stbtt_MakeCodepointBitmap, but you can specify a subpixel
    781 // shift for the character
    782 
    783 STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1);
    784 // get the bbox of the bitmap centered around the glyph origin; so the
    785 // bitmap width is ix1-ix0, height is iy1-iy0, and location to place
    786 // the bitmap top left is (leftSideBearing*scale,iy0).
    787 // (Note that the bitmap uses y-increases-down, but the shape uses
    788 // y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.)
    789 
    790 STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1);
    791 // same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel
    792 // shift for the character
    793 
    794 // the following functions are equivalent to the above functions, but operate
    795 // on glyph indices instead of Unicode codepoints (for efficiency)
    796 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);
    797 STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff);
    798 STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph);
    799 STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(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 glyph);
    800 STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1);
    801 STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1);
    802 
    803 
    804 // @TODO: don't expose this structure
    805 typedef struct
    806 {
    807    int w,h,stride;
    808    unsigned char *pixels;
    809 } stbtt__bitmap;
    810 
    811 // rasterize a shape with quadratic beziers into a bitmap
    812 STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result,        // 1-channel bitmap to draw into
    813                                float flatness_in_pixels,     // allowable error of curve in pixels
    814                                stbtt_vertex *vertices,       // array of vertices defining shape
    815                                int num_verts,                // number of vertices in above array
    816                                float scale_x, float scale_y, // scale applied to input vertices
    817                                float shift_x, float shift_y, // translation applied to input vertices
    818                                int x_off, int y_off,         // another translation applied to input
    819                                int invert,                   // if non-zero, vertically flip shape
    820                                void *userdata);              // context for to STBTT_MALLOC
    821 
    822 //////////////////////////////////////////////////////////////////////////////
    823 //
    824 // Finding the right font...
    825 //
    826 // You should really just solve this offline, keep your own tables
    827 // of what font is what, and don't try to get it out of the .ttf file.
    828 // That's because getting it out of the .ttf file is really hard, because
    829 // the names in the file can appear in many possible encodings, in many
    830 // possible languages, and e.g. if you need a case-insensitive comparison,
    831 // the details of that depend on the encoding & language in a complex way
    832 // (actually underspecified in truetype, but also gigantic).
    833 //
    834 // But you can use the provided functions in two possible ways:
    835 //     stbtt_FindMatchingFont() will use *case-sensitive* comparisons on
    836 //             unicode-encoded names to try to find the font you want;
    837 //             you can run this before calling stbtt_InitFont()
    838 //
    839 //     stbtt_GetFontNameString() lets you get any of the various strings
    840 //             from the file yourself and do your own comparisons on them.
    841 //             You have to have called stbtt_InitFont() first.
    842 
    843 
    844 STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags);
    845 // returns the offset (not index) of the font that matches, or -1 if none
    846 //   if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold".
    847 //   if you use any other flag, use a font name like "Arial"; this checks
    848 //     the 'macStyle' header field; i don't know if fonts set this consistently
    849 #define STBTT_MACSTYLE_DONTCARE     0
    850 #define STBTT_MACSTYLE_BOLD         1
    851 #define STBTT_MACSTYLE_ITALIC       2
    852 #define STBTT_MACSTYLE_UNDERSCORE   4
    853 #define STBTT_MACSTYLE_NONE         8   // <= not same as 0, this makes us check the bitfield is 0
    854 
    855 STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2);
    856 // returns 1/0 whether the first string interpreted as utf8 is identical to
    857 // the second string interpreted as big-endian utf16... useful for strings from next func
    858 
    859 STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID);
    860 // returns the string (which may be big-endian double byte, e.g. for unicode)
    861 // and puts the length in bytes in *length.
    862 //
    863 // some of the values for the IDs are below; for more see the truetype spec:
    864 //     http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html
    865 //     http://www.microsoft.com/typography/otspec/name.htm
    866 
    867 enum { // platformID
    868    STBTT_PLATFORM_ID_UNICODE   =0,
    869    STBTT_PLATFORM_ID_MAC       =1,
    870    STBTT_PLATFORM_ID_ISO       =2,
    871    STBTT_PLATFORM_ID_MICROSOFT =3
    872 };
    873 
    874 enum { // encodingID for STBTT_PLATFORM_ID_UNICODE
    875    STBTT_UNICODE_EID_UNICODE_1_0    =0,
    876    STBTT_UNICODE_EID_UNICODE_1_1    =1,
    877    STBTT_UNICODE_EID_ISO_10646      =2,
    878    STBTT_UNICODE_EID_UNICODE_2_0_BMP=3,
    879    STBTT_UNICODE_EID_UNICODE_2_0_FULL=4
    880 };
    881 
    882 enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT
    883    STBTT_MS_EID_SYMBOL        =0,
    884    STBTT_MS_EID_UNICODE_BMP   =1,
    885    STBTT_MS_EID_SHIFTJIS      =2,
    886    STBTT_MS_EID_UNICODE_FULL  =10
    887 };
    888 
    889 enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes
    890    STBTT_MAC_EID_ROMAN        =0,   STBTT_MAC_EID_ARABIC       =4,
    891    STBTT_MAC_EID_JAPANESE     =1,   STBTT_MAC_EID_HEBREW       =5,
    892    STBTT_MAC_EID_CHINESE_TRAD =2,   STBTT_MAC_EID_GREEK        =6,
    893    STBTT_MAC_EID_KOREAN       =3,   STBTT_MAC_EID_RUSSIAN      =7
    894 };
    895 
    896 enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID...
    897        // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs
    898    STBTT_MS_LANG_ENGLISH     =0x0409,   STBTT_MS_LANG_ITALIAN     =0x0410,
    899    STBTT_MS_LANG_CHINESE     =0x0804,   STBTT_MS_LANG_JAPANESE    =0x0411,
    900    STBTT_MS_LANG_DUTCH       =0x0413,   STBTT_MS_LANG_KOREAN      =0x0412,
    901    STBTT_MS_LANG_FRENCH      =0x040c,   STBTT_MS_LANG_RUSSIAN     =0x0419,
    902    STBTT_MS_LANG_GERMAN      =0x0407,   STBTT_MS_LANG_SPANISH     =0x0409,
    903    STBTT_MS_LANG_HEBREW      =0x040d,   STBTT_MS_LANG_SWEDISH     =0x041D
    904 };
    905 
    906 enum { // languageID for STBTT_PLATFORM_ID_MAC
    907    STBTT_MAC_LANG_ENGLISH      =0 ,   STBTT_MAC_LANG_JAPANESE     =11,
    908    STBTT_MAC_LANG_ARABIC       =12,   STBTT_MAC_LANG_KOREAN       =23,
    909    STBTT_MAC_LANG_DUTCH        =4 ,   STBTT_MAC_LANG_RUSSIAN      =32,
    910    STBTT_MAC_LANG_FRENCH       =1 ,   STBTT_MAC_LANG_SPANISH      =6 ,
    911    STBTT_MAC_LANG_GERMAN       =2 ,   STBTT_MAC_LANG_SWEDISH      =5 ,
    912    STBTT_MAC_LANG_HEBREW       =10,   STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33,
    913    STBTT_MAC_LANG_ITALIAN      =3 ,   STBTT_MAC_LANG_CHINESE_TRAD =19
    914 };
    915 
    916 #ifdef __cplusplus
    917 }
    918 #endif
    919 
    920 #endif // __STB_INCLUDE_STB_TRUETYPE_H__
    921 
    922 ///////////////////////////////////////////////////////////////////////////////
    923 ///////////////////////////////////////////////////////////////////////////////
    924 ////
    925 ////   IMPLEMENTATION
    926 ////
    927 ////
    928 
    929 #ifdef STB_TRUETYPE_IMPLEMENTATION
    930 
    931 #ifndef STBTT_MAX_OVERSAMPLE
    932 #define STBTT_MAX_OVERSAMPLE   8
    933 #endif
    934 
    935 #if STBTT_MAX_OVERSAMPLE > 255
    936 #error "STBTT_MAX_OVERSAMPLE cannot be > 255"
    937 #endif
    938 
    939 typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE-1)) == 0 ? 1 : -1];
    940 
    941 #ifndef STBTT_RASTERIZER_VERSION
    942 #define STBTT_RASTERIZER_VERSION 2
    943 #endif
    944 
    945 //////////////////////////////////////////////////////////////////////////
    946 //
    947 // accessors to parse data from file
    948 //
    949 
    950 // on platforms that don't allow misaligned reads, if we want to allow
    951 // truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE
    952 
    953 #define ttBYTE(p)     (* (stbtt_uint8 *) (p))
    954 #define ttCHAR(p)     (* (stbtt_int8 *) (p))
    955 #define ttFixed(p)    ttLONG(p)
    956 
    957 #if defined(STB_TRUETYPE_BIGENDIAN) && !defined(ALLOW_UNALIGNED_TRUETYPE)
    958 
    959    #define ttUSHORT(p)   (* (stbtt_uint16 *) (p))
    960    #define ttSHORT(p)    (* (stbtt_int16 *) (p))
    961    #define ttULONG(p)    (* (stbtt_uint32 *) (p))
    962    #define ttLONG(p)     (* (stbtt_int32 *) (p))
    963 
    964 #else
    965 
    966    static stbtt_uint16 ttUSHORT(const stbtt_uint8 *p) { return p[0]*256 + p[1]; }
    967    static stbtt_int16 ttSHORT(const stbtt_uint8 *p)   { return p[0]*256 + p[1]; }
    968    static stbtt_uint32 ttULONG(const stbtt_uint8 *p)  { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; }
    969    static stbtt_int32 ttLONG(const stbtt_uint8 *p)    { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; }
    970 
    971 #endif
    972 
    973 #define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3))
    974 #define stbtt_tag(p,str)           stbtt_tag4(p,str[0],str[1],str[2],str[3])
    975 
    976 static int stbtt__isfont(const stbtt_uint8 *font)
    977 {
    978    // check the version number
    979    if (stbtt_tag4(font, '1',0,0,0))  return 1; // TrueType 1
    980    if (stbtt_tag(font, "typ1"))   return 1; // TrueType with type 1 font -- we don't support this!
    981    if (stbtt_tag(font, "OTTO"))   return 1; // OpenType with CFF
    982    if (stbtt_tag4(font, 0,1,0,0)) return 1; // OpenType 1.0
    983    return 0;
    984 }
    985 
    986 // @OPTIMIZE: binary search
    987 static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag)
    988 {
    989    stbtt_int32 num_tables = ttUSHORT(data+fontstart+4);
    990    stbtt_uint32 tabledir = fontstart + 12;
    991    stbtt_int32 i;
    992    for (i=0; i < num_tables; ++i) {
    993       stbtt_uint32 loc = tabledir + 16*i;
    994       if (stbtt_tag(data+loc+0, tag))
    995          return ttULONG(data+loc+8);
    996    }
    997    return 0;
    998 }
    999 
   1000 STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *font_collection, int index)
   1001 {
   1002    // if it's just a font, there's only one valid index
   1003    if (stbtt__isfont(font_collection))
   1004       return index == 0 ? 0 : -1;
   1005 
   1006    // check if it's a TTC
   1007    if (stbtt_tag(font_collection, "ttcf")) {
   1008       // version 1?
   1009       if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) {
   1010          stbtt_int32 n = ttLONG(font_collection+8);
   1011          if (index >= n)
   1012             return -1;
   1013          return ttULONG(font_collection+12+index*4);
   1014       }
   1015    }
   1016    return -1;
   1017 }
   1018 
   1019 STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data2, int fontstart)
   1020 {
   1021    stbtt_uint8 *data = (stbtt_uint8 *) data2;
   1022    stbtt_uint32 cmap, t;
   1023    stbtt_int32 i,numTables;
   1024 
   1025    info->data = data;
   1026    info->fontstart = fontstart;
   1027 
   1028    cmap = stbtt__find_table(data, fontstart, "cmap");       // required
   1029    info->loca = stbtt__find_table(data, fontstart, "loca"); // required
   1030    info->head = stbtt__find_table(data, fontstart, "head"); // required
   1031    info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required
   1032    info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required
   1033    info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required
   1034    info->kern = stbtt__find_table(data, fontstart, "kern"); // not required
   1035    if (!cmap || !info->loca || !info->head || !info->glyf || !info->hhea || !info->hmtx)
   1036       return 0;
   1037 
   1038    t = stbtt__find_table(data, fontstart, "maxp");
   1039    if (t)
   1040       info->numGlyphs = ttUSHORT(data+t+4);
   1041    else
   1042       info->numGlyphs = 0xffff;
   1043 
   1044    // find a cmap encoding table we understand *now* to avoid searching
   1045    // later. (todo: could make this installable)
   1046    // the same regardless of glyph.
   1047    numTables = ttUSHORT(data + cmap + 2);
   1048    info->index_map = 0;
   1049    for (i=0; i < numTables; ++i) {
   1050       stbtt_uint32 encoding_record = cmap + 4 + 8 * i;
   1051       // find an encoding we understand:
   1052       switch(ttUSHORT(data+encoding_record)) {
   1053          case STBTT_PLATFORM_ID_MICROSOFT:
   1054             switch (ttUSHORT(data+encoding_record+2)) {
   1055                case STBTT_MS_EID_UNICODE_BMP:
   1056                case STBTT_MS_EID_UNICODE_FULL:
   1057                   // MS/Unicode
   1058                   info->index_map = cmap + ttULONG(data+encoding_record+4);
   1059                   break;
   1060             }
   1061             break;
   1062         case STBTT_PLATFORM_ID_UNICODE:
   1063             // Mac/iOS has these
   1064             // all the encodingIDs are unicode, so we don't bother to check it
   1065             info->index_map = cmap + ttULONG(data+encoding_record+4);
   1066             break;
   1067       }
   1068    }
   1069    if (info->index_map == 0)
   1070       return 0;
   1071 
   1072    info->indexToLocFormat = ttUSHORT(data+info->head + 50);
   1073    return 1;
   1074 }
   1075 
   1076 STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint)
   1077 {
   1078    stbtt_uint8 *data = info->data;
   1079    stbtt_uint32 index_map = info->index_map;
   1080 
   1081    stbtt_uint16 format = ttUSHORT(data + index_map + 0);
   1082    if (format == 0) { // apple byte encoding
   1083       stbtt_int32 bytes = ttUSHORT(data + index_map + 2);
   1084       if (unicode_codepoint < bytes-6)
   1085          return ttBYTE(data + index_map + 6 + unicode_codepoint);
   1086       return 0;
   1087    } else if (format == 6) {
   1088       stbtt_uint32 first = ttUSHORT(data + index_map + 6);
   1089       stbtt_uint32 count = ttUSHORT(data + index_map + 8);
   1090       if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count)
   1091          return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2);
   1092       return 0;
   1093    } else if (format == 2) {
   1094       STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean
   1095       return 0;
   1096    } else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges
   1097       stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1;
   1098       stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1;
   1099       stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10);
   1100       stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1;
   1101 
   1102       // do a binary search of the segments
   1103       stbtt_uint32 endCount = index_map + 14;
   1104       stbtt_uint32 search = endCount;
   1105 
   1106       if (unicode_codepoint > 0xffff)
   1107          return 0;
   1108 
   1109       // they lie from endCount .. endCount + segCount
   1110       // but searchRange is the nearest power of two, so...
   1111       if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2))
   1112          search += rangeShift*2;
   1113 
   1114       // now decrement to bias correctly to find smallest
   1115       search -= 2;
   1116       while (entrySelector) {
   1117          stbtt_uint16 end;
   1118          searchRange >>= 1;
   1119          end = ttUSHORT(data + search + searchRange*2);
   1120          if (unicode_codepoint > end)
   1121             search += searchRange*2;
   1122          --entrySelector;
   1123       }
   1124       search += 2;
   1125 
   1126       {
   1127          stbtt_uint16 offset, start;
   1128          stbtt_uint16 item = (stbtt_uint16) ((search - endCount) >> 1);
   1129 
   1130          STBTT_assert(unicode_codepoint <= ttUSHORT(data + endCount + 2*item));
   1131          start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item);
   1132          if (unicode_codepoint < start)
   1133             return 0;
   1134 
   1135          offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item);
   1136          if (offset == 0)
   1137             return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item));
   1138 
   1139          return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item);
   1140       }
   1141    } else if (format == 12 || format == 13) {
   1142       stbtt_uint32 ngroups = ttULONG(data+index_map+12);
   1143       stbtt_int32 low,high;
   1144       low = 0; high = (stbtt_int32)ngroups;
   1145       // Binary search the right group.
   1146       while (low < high) {
   1147          stbtt_int32 mid = low + ((high-low) >> 1); // rounds down, so low <= mid < high
   1148          stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12);
   1149          stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4);
   1150          if ((stbtt_uint32) unicode_codepoint < start_char)
   1151             high = mid;
   1152          else if ((stbtt_uint32) unicode_codepoint > end_char)
   1153             low = mid+1;
   1154          else {
   1155             stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8);
   1156             if (format == 12)
   1157                return start_glyph + unicode_codepoint-start_char;
   1158             else // format == 13
   1159                return start_glyph;
   1160          }
   1161       }
   1162       return 0; // not found
   1163    }
   1164    // @TODO
   1165    STBTT_assert(0);
   1166    return 0;
   1167 }
   1168 
   1169 STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices)
   1170 {
   1171    return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices);
   1172 }
   1173 
   1174 static void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy)
   1175 {
   1176    v->type = type;
   1177    v->x = (stbtt_int16) x;
   1178    v->y = (stbtt_int16) y;
   1179    v->cx = (stbtt_int16) cx;
   1180    v->cy = (stbtt_int16) cy;
   1181 }
   1182 
   1183 static int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index)
   1184 {
   1185    int g1,g2;
   1186 
   1187    if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range
   1188    if (info->indexToLocFormat >= 2)    return -1; // unknown index->glyph map format
   1189 
   1190    if (info->indexToLocFormat == 0) {
   1191       g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2;
   1192       g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2;
   1193    } else {
   1194       g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4);
   1195       g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4);
   1196    }
   1197 
   1198    return g1==g2 ? -1 : g1; // if length is 0, return -1
   1199 }
   1200 
   1201 STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1)
   1202 {
   1203    int g = stbtt__GetGlyfOffset(info, glyph_index);
   1204    if (g < 0) return 0;
   1205 
   1206    if (x0) *x0 = ttSHORT(info->data + g + 2);
   1207    if (y0) *y0 = ttSHORT(info->data + g + 4);
   1208    if (x1) *x1 = ttSHORT(info->data + g + 6);
   1209    if (y1) *y1 = ttSHORT(info->data + g + 8);
   1210    return 1;
   1211 }
   1212 
   1213 STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1)
   1214 {
   1215    return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1);
   1216 }
   1217 
   1218 STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index)
   1219 {
   1220    stbtt_int16 numberOfContours;
   1221    int g = stbtt__GetGlyfOffset(info, glyph_index);
   1222    if (g < 0) return 1;
   1223    numberOfContours = ttSHORT(info->data + g);
   1224    return numberOfContours == 0;
   1225 }
   1226 
   1227 static int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off,
   1228     stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy)
   1229 {
   1230    if (start_off) {
   1231       if (was_off)
   1232          stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy);
   1233       stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy);
   1234    } else {
   1235       if (was_off)
   1236          stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy);
   1237       else
   1238          stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0);
   1239    }
   1240    return num_vertices;
   1241 }
   1242 
   1243 STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices)
   1244 {
   1245    stbtt_int16 numberOfContours;
   1246    stbtt_uint8 *endPtsOfContours;
   1247    stbtt_uint8 *data = info->data;
   1248    stbtt_vertex *vertices=0;
   1249    int num_vertices=0;
   1250    int g = stbtt__GetGlyfOffset(info, glyph_index);
   1251 
   1252    *pvertices = NULL;
   1253 
   1254    if (g < 0) return 0;
   1255 
   1256    numberOfContours = ttSHORT(data + g);
   1257 
   1258    if (numberOfContours > 0) {
   1259       stbtt_uint8 flags=0,flagcount;
   1260       stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0;
   1261       stbtt_int32 x,y,cx,cy,sx,sy, scx,scy;
   1262       stbtt_uint8 *points;
   1263       endPtsOfContours = (data + g + 10);
   1264       ins = ttUSHORT(data + g + 10 + numberOfContours * 2);
   1265       points = data + g + 10 + numberOfContours * 2 + 2 + ins;
   1266 
   1267       n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2);
   1268 
   1269       m = n + 2*numberOfContours;  // a loose bound on how many vertices we might need
   1270       vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata);
   1271       if (vertices == 0)
   1272          return 0;
   1273 
   1274       next_move = 0;
   1275       flagcount=0;
   1276 
   1277       // in first pass, we load uninterpreted data into the allocated array
   1278       // above, shifted to the end of the array so we won't overwrite it when
   1279       // we create our final data starting from the front
   1280 
   1281       off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated
   1282 
   1283       // first load flags
   1284 
   1285       for (i=0; i < n; ++i) {
   1286          if (flagcount == 0) {
   1287             flags = *points++;
   1288             if (flags & 8)
   1289                flagcount = *points++;
   1290          } else
   1291             --flagcount;
   1292          vertices[off+i].type = flags;
   1293       }
   1294 
   1295       // now load x coordinates
   1296       x=0;
   1297       for (i=0; i < n; ++i) {
   1298          flags = vertices[off+i].type;
   1299          if (flags & 2) {
   1300             stbtt_int16 dx = *points++;
   1301             x += (flags & 16) ? dx : -dx; // ???
   1302          } else {
   1303             if (!(flags & 16)) {
   1304                x = x + (stbtt_int16) (points[0]*256 + points[1]);
   1305                points += 2;
   1306             }
   1307          }
   1308          vertices[off+i].x = (stbtt_int16) x;
   1309       }
   1310 
   1311       // now load y coordinates
   1312       y=0;
   1313       for (i=0; i < n; ++i) {
   1314          flags = vertices[off+i].type;
   1315          if (flags & 4) {
   1316             stbtt_int16 dy = *points++;
   1317             y += (flags & 32) ? dy : -dy; // ???
   1318          } else {
   1319             if (!(flags & 32)) {
   1320                y = y + (stbtt_int16) (points[0]*256 + points[1]);
   1321                points += 2;
   1322             }
   1323          }
   1324          vertices[off+i].y = (stbtt_int16) y;
   1325       }
   1326 
   1327       // now convert them to our format
   1328       num_vertices=0;
   1329       sx = sy = cx = cy = scx = scy = 0;
   1330       for (i=0; i < n; ++i) {
   1331          flags = vertices[off+i].type;
   1332          x     = (stbtt_int16) vertices[off+i].x;
   1333          y     = (stbtt_int16) vertices[off+i].y;
   1334 
   1335          if (next_move == i) {
   1336             if (i != 0)
   1337                num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy);
   1338 
   1339             // now start the new one               
   1340             start_off = !(flags & 1);
   1341             if (start_off) {
   1342                // if we start off with an off-curve point, then when we need to find a point on the curve
   1343                // where we can start, and we need to save some state for when we wraparound.
   1344                scx = x;
   1345                scy = y;
   1346                if (!(vertices[off+i+1].type & 1)) {
   1347                   // next point is also a curve point, so interpolate an on-point curve
   1348                   sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1;
   1349                   sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1;
   1350                } else {
   1351                   // otherwise just use the next point as our start point
   1352                   sx = (stbtt_int32) vertices[off+i+1].x;
   1353                   sy = (stbtt_int32) vertices[off+i+1].y;
   1354                   ++i; // we're using point i+1 as the starting point, so skip it
   1355                }
   1356             } else {
   1357                sx = x;
   1358                sy = y;
   1359             }
   1360             stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0);
   1361             was_off = 0;
   1362             next_move = 1 + ttUSHORT(endPtsOfContours+j*2);
   1363             ++j;
   1364          } else {
   1365             if (!(flags & 1)) { // if it's a curve
   1366                if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint
   1367                   stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy);
   1368                cx = x;
   1369                cy = y;
   1370                was_off = 1;
   1371             } else {
   1372                if (was_off)
   1373                   stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy);
   1374                else
   1375                   stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0);
   1376                was_off = 0;
   1377             }
   1378          }
   1379       }
   1380       num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy);
   1381    } else if (numberOfContours == -1) {
   1382       // Compound shapes.
   1383       int more = 1;
   1384       stbtt_uint8 *comp = data + g + 10;
   1385       num_vertices = 0;
   1386       vertices = 0;
   1387       while (more) {
   1388          stbtt_uint16 flags, gidx;
   1389          int comp_num_verts = 0, i;
   1390          stbtt_vertex *comp_verts = 0, *tmp = 0;
   1391          float mtx[6] = {1,0,0,1,0,0}, m, n;
   1392          
   1393          flags = ttSHORT(comp); comp+=2;
   1394          gidx = ttSHORT(comp); comp+=2;
   1395 
   1396          if (flags & 2) { // XY values
   1397             if (flags & 1) { // shorts
   1398                mtx[4] = ttSHORT(comp); comp+=2;
   1399                mtx[5] = ttSHORT(comp); comp+=2;
   1400             } else {
   1401                mtx[4] = ttCHAR(comp); comp+=1;
   1402                mtx[5] = ttCHAR(comp); comp+=1;
   1403             }
   1404          }
   1405          else {
   1406             // @TODO handle matching point
   1407             STBTT_assert(0);
   1408          }
   1409          if (flags & (1<<3)) { // WE_HAVE_A_SCALE
   1410             mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2;
   1411             mtx[1] = mtx[2] = 0;
   1412          } else if (flags & (1<<6)) { // WE_HAVE_AN_X_AND_YSCALE
   1413             mtx[0] = ttSHORT(comp)/16384.0f; comp+=2;
   1414             mtx[1] = mtx[2] = 0;
   1415             mtx[3] = ttSHORT(comp)/16384.0f; comp+=2;
   1416          } else if (flags & (1<<7)) { // WE_HAVE_A_TWO_BY_TWO
   1417             mtx[0] = ttSHORT(comp)/16384.0f; comp+=2;
   1418             mtx[1] = ttSHORT(comp)/16384.0f; comp+=2;
   1419             mtx[2] = ttSHORT(comp)/16384.0f; comp+=2;
   1420             mtx[3] = ttSHORT(comp)/16384.0f; comp+=2;
   1421          }
   1422          
   1423          // Find transformation scales.
   1424          m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]);
   1425          n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]);
   1426 
   1427          // Get indexed glyph.
   1428          comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts);
   1429          if (comp_num_verts > 0) {
   1430             // Transform vertices.
   1431             for (i = 0; i < comp_num_verts; ++i) {
   1432                stbtt_vertex* v = &comp_verts[i];
   1433                stbtt_vertex_type x,y;
   1434                x=v->x; y=v->y;
   1435                v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4]));
   1436                v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5]));
   1437                x=v->cx; y=v->cy;
   1438                v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4]));
   1439                v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5]));
   1440             }
   1441             // Append vertices.
   1442             tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata);
   1443             if (!tmp) {
   1444                if (vertices) STBTT_free(vertices, info->userdata);
   1445                if (comp_verts) STBTT_free(comp_verts, info->userdata);
   1446                return 0;
   1447             }
   1448             if (num_vertices > 0) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex));
   1449             STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex));
   1450             if (vertices) STBTT_free(vertices, info->userdata);
   1451             vertices = tmp;
   1452             STBTT_free(comp_verts, info->userdata);
   1453             num_vertices += comp_num_verts;
   1454          }
   1455          // More components ?
   1456          more = flags & (1<<5);
   1457       }
   1458    } else if (numberOfContours < 0) {
   1459       // @TODO other compound variations?
   1460       STBTT_assert(0);
   1461    } else {
   1462       // numberOfCounters == 0, do nothing
   1463    }
   1464 
   1465    *pvertices = vertices;
   1466    return num_vertices;
   1467 }
   1468 
   1469 STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing)
   1470 {
   1471    stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34);
   1472    if (glyph_index < numOfLongHorMetrics) {
   1473       if (advanceWidth)     *advanceWidth    = ttSHORT(info->data + info->hmtx + 4*glyph_index);
   1474       if (leftSideBearing)  *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2);
   1475    } else {
   1476       if (advanceWidth)     *advanceWidth    = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1));
   1477       if (leftSideBearing)  *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics));
   1478    }
   1479 }
   1480 
   1481 STBTT_DEF int  stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2)
   1482 {
   1483    stbtt_uint8 *data = info->data + info->kern;
   1484    stbtt_uint32 needle, straw;
   1485    int l, r, m;
   1486 
   1487    // we only look at the first table. it must be 'horizontal' and format 0.
   1488    if (!info->kern)
   1489       return 0;
   1490    if (ttUSHORT(data+2) < 1) // number of tables, need at least 1
   1491       return 0;
   1492    if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format
   1493       return 0;
   1494 
   1495    l = 0;
   1496    r = ttUSHORT(data+10) - 1;
   1497    needle = glyph1 << 16 | glyph2;
   1498    while (l <= r) {
   1499       m = (l + r) >> 1;
   1500       straw = ttULONG(data+18+(m*6)); // note: unaligned read
   1501       if (needle < straw)
   1502          r = m - 1;
   1503       else if (needle > straw)
   1504          l = m + 1;
   1505       else
   1506          return ttSHORT(data+22+(m*6));
   1507    }
   1508    return 0;
   1509 }
   1510 
   1511 STBTT_DEF int  stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2)
   1512 {
   1513    if (!info->kern) // if no kerning table, don't waste time looking up both codepoint->glyphs
   1514       return 0;
   1515    return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2));
   1516 }
   1517 
   1518 STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing)
   1519 {
   1520    stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing);
   1521 }
   1522 
   1523 STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap)
   1524 {
   1525    if (ascent ) *ascent  = ttSHORT(info->data+info->hhea + 4);
   1526    if (descent) *descent = ttSHORT(info->data+info->hhea + 6);
   1527    if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8);
   1528 }
   1529 
   1530 STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1)
   1531 {
   1532    *x0 = ttSHORT(info->data + info->head + 36);
   1533    *y0 = ttSHORT(info->data + info->head + 38);
   1534    *x1 = ttSHORT(info->data + info->head + 40);
   1535    *y1 = ttSHORT(info->data + info->head + 42);
   1536 }
   1537 
   1538 STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height)
   1539 {
   1540    int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6);
   1541    return (float) height / fheight;
   1542 }
   1543 
   1544 STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels)
   1545 {
   1546    int unitsPerEm = ttUSHORT(info->data + info->head + 18);
   1547    return pixels / unitsPerEm;
   1548 }
   1549 
   1550 STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v)
   1551 {
   1552    STBTT_free(v, info->userdata);
   1553 }
   1554 
   1555 //////////////////////////////////////////////////////////////////////////////
   1556 //
   1557 // antialiasing software rasterizer
   1558 //
   1559 
   1560 STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1)
   1561 {
   1562    int x0=0,y0=0,x1,y1; // =0 suppresses compiler warning
   1563    if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) {
   1564       // e.g. space character
   1565       if (ix0) *ix0 = 0;
   1566       if (iy0) *iy0 = 0;
   1567       if (ix1) *ix1 = 0;
   1568       if (iy1) *iy1 = 0;
   1569    } else {
   1570       // move to integral bboxes (treating pixels as little squares, what pixels get touched)?
   1571       if (ix0) *ix0 = STBTT_ifloor( x0 * scale_x + shift_x);
   1572       if (iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y);
   1573       if (ix1) *ix1 = STBTT_iceil ( x1 * scale_x + shift_x);
   1574       if (iy1) *iy1 = STBTT_iceil (-y0 * scale_y + shift_y);
   1575    }
   1576 }
   1577 
   1578 STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1)
   1579 {
   1580    stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1);
   1581 }
   1582 
   1583 STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1)
   1584 {
   1585    stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1);
   1586 }
   1587 
   1588 STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1)
   1589 {
   1590    stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1);
   1591 }
   1592 
   1593 //////////////////////////////////////////////////////////////////////////////
   1594 //
   1595 //  Rasterizer
   1596 
   1597 typedef struct stbtt__hheap_chunk
   1598 {
   1599    struct stbtt__hheap_chunk *next;
   1600 } stbtt__hheap_chunk;
   1601 
   1602 typedef struct stbtt__hheap
   1603 {
   1604    struct stbtt__hheap_chunk *head;
   1605    void   *first_free;
   1606    int    num_remaining_in_head_chunk;
   1607 } stbtt__hheap;
   1608 
   1609 static void *stbtt__hheap_alloc(stbtt__hheap *hh, size_t size, void *userdata)
   1610 {
   1611    if (hh->first_free) {
   1612       void *p = hh->first_free;
   1613       hh->first_free = * (void **) p;
   1614       return p;
   1615    } else {
   1616       if (hh->num_remaining_in_head_chunk == 0) {
   1617          int count = (size < 32 ? 2000 : size < 128 ? 800 : 100);
   1618          stbtt__hheap_chunk *c = (stbtt__hheap_chunk *) STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata);
   1619          if (c == NULL)
   1620             return NULL;
   1621          c->next = hh->head;
   1622          hh->head = c;
   1623          hh->num_remaining_in_head_chunk = count;
   1624       }
   1625       --hh->num_remaining_in_head_chunk;
   1626       return (char *) (hh->head) + size * hh->num_remaining_in_head_chunk;
   1627    }
   1628 }
   1629 
   1630 static void stbtt__hheap_free(stbtt__hheap *hh, void *p)
   1631 {
   1632    *(void **) p = hh->first_free;
   1633    hh->first_free = p;
   1634 }
   1635 
   1636 static void stbtt__hheap_cleanup(stbtt__hheap *hh, void *userdata)
   1637 {
   1638    stbtt__hheap_chunk *c = hh->head;
   1639    while (c) {
   1640       stbtt__hheap_chunk *n = c->next;
   1641       STBTT_free(c, userdata);
   1642       c = n;
   1643    }
   1644 }
   1645 
   1646 typedef struct stbtt__edge {
   1647    float x0,y0, x1,y1;
   1648    int invert;
   1649 } stbtt__edge;
   1650 
   1651 
   1652 typedef struct stbtt__active_edge
   1653 {
   1654    struct stbtt__active_edge *next;
   1655    #if STBTT_RASTERIZER_VERSION==1
   1656    int x,dx;
   1657    float ey;
   1658    int direction;
   1659    #elif STBTT_RASTERIZER_VERSION==2
   1660    float fx,fdx,fdy;
   1661    float direction;
   1662    float sy;
   1663    float ey;
   1664    #else
   1665    #error "Unrecognized value of STBTT_RASTERIZER_VERSION"
   1666    #endif
   1667 } stbtt__active_edge;
   1668 
   1669 #if STBTT_RASTERIZER_VERSION == 1
   1670 #define STBTT_FIXSHIFT   10
   1671 #define STBTT_FIX        (1 << STBTT_FIXSHIFT)
   1672 #define STBTT_FIXMASK    (STBTT_FIX-1)
   1673 
   1674 static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata)
   1675 {
   1676    stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata);
   1677    float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0);
   1678    STBTT_assert(z != NULL);
   1679    if (!z) return z;
   1680    
   1681    // round dx down to avoid overshooting
   1682    if (dxdy < 0)
   1683       z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy);
   1684    else
   1685       z->dx = STBTT_ifloor(STBTT_FIX * dxdy);
   1686 
   1687    z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - e->y0)); // use z->dx so when we offset later it's by the same amount
   1688    z->x -= off_x * STBTT_FIX;
   1689 
   1690    z->ey = e->y1;
   1691    z->next = 0;
   1692    z->direction = e->invert ? 1 : -1;
   1693    return z;
   1694 }
   1695 #elif STBTT_RASTERIZER_VERSION == 2
   1696 static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata)
   1697 {
   1698    stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata);
   1699    float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0);
   1700    STBTT_assert(z != NULL);
   1701    //STBTT_assert(e->y0 <= start_point);
   1702    if (!z) return z;
   1703    z->fdx = dxdy;
   1704    z->fdy = dxdy != 0.0f ? (1.0f/dxdy) : 0.0f;
   1705    z->fx = e->x0 + dxdy * (start_point - e->y0);
   1706    z->fx -= off_x;
   1707    z->direction = e->invert ? 1.0f : -1.0f;
   1708    z->sy = e->y0;
   1709    z->ey = e->y1;
   1710    z->next = 0;
   1711    return z;
   1712 }
   1713 #else
   1714 #error "Unrecognized value of STBTT_RASTERIZER_VERSION"
   1715 #endif
   1716 
   1717 #if STBTT_RASTERIZER_VERSION == 1
   1718 // note: this routine clips fills that extend off the edges... ideally this
   1719 // wouldn't happen, but it could happen if the truetype glyph bounding boxes
   1720 // are wrong, or if the user supplies a too-small bitmap
   1721 static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight)
   1722 {
   1723    // non-zero winding fill
   1724    int x0=0, w=0;
   1725 
   1726    while (e) {
   1727       if (w == 0) {
   1728          // if we're currently at zero, we need to record the edge start point
   1729          x0 = e->x; w += e->direction;
   1730       } else {
   1731          int x1 = e->x; w += e->direction;
   1732          // if we went to zero, we need to draw
   1733          if (w == 0) {
   1734             int i = x0 >> STBTT_FIXSHIFT;
   1735             int j = x1 >> STBTT_FIXSHIFT;
   1736 
   1737             if (i < len && j >= 0) {
   1738                if (i == j) {
   1739                   // x0,x1 are the same pixel, so compute combined coverage
   1740                   scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> STBTT_FIXSHIFT);
   1741                } else {
   1742                   if (i >= 0) // add antialiasing for x0
   1743                      scanline[i] = scanline[i] + (stbtt_uint8) (((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT);
   1744                   else
   1745                      i = -1; // clip
   1746 
   1747                   if (j < len) // add antialiasing for x1
   1748                      scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT);
   1749                   else
   1750                      j = len; // clip
   1751 
   1752                   for (++i; i < j; ++i) // fill pixels between x0 and x1
   1753                      scanline[i] = scanline[i] + (stbtt_uint8) max_weight;
   1754                }
   1755             }
   1756          }
   1757       }
   1758       
   1759       e = e->next;
   1760    }
   1761 }
   1762 
   1763 static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata)
   1764 {
   1765    stbtt__hheap hh = { 0, 0, 0 };
   1766    stbtt__active_edge *active = NULL;
   1767    int y,j=0;
   1768    int max_weight = (255 / vsubsample);  // weight per vertical scanline
   1769    int s; // vertical subsample index
   1770    unsigned char scanline_data[512], *scanline;
   1771 
   1772    if (result->w > 512)
   1773       scanline = (unsigned char *) STBTT_malloc(result->w, userdata);
   1774    else
   1775       scanline = scanline_data;
   1776 
   1777    y = off_y * vsubsample;
   1778    e[n].y0 = (off_y + result->h) * (float) vsubsample + 1;
   1779 
   1780    while (j < result->h) {
   1781       STBTT_memset(scanline, 0, result->w);
   1782       for (s=0; s < vsubsample; ++s) {
   1783          // find center of pixel for this scanline
   1784          float scan_y = y + 0.5f;
   1785          stbtt__active_edge **step = &active;
   1786 
   1787          // update all active edges;
   1788          // remove all active edges that terminate before the center of this scanline
   1789          while (*step) {
   1790             stbtt__active_edge * z = *step;
   1791             if (z->ey <= scan_y) {
   1792                *step = z->next; // delete from list
   1793                STBTT_assert(z->direction);
   1794                z->direction = 0;
   1795                stbtt__hheap_free(&hh, z);
   1796             } else {
   1797                z->x += z->dx; // advance to position for current scanline
   1798                step = &((*step)->next); // advance through list
   1799             }
   1800          }
   1801 
   1802          // resort the list if needed
   1803          for(;;) {
   1804             int changed=0;
   1805             step = &active;
   1806             while (*step && (*step)->next) {
   1807                if ((*step)->x > (*step)->next->x) {
   1808                   stbtt__active_edge *t = *step;
   1809                   stbtt__active_edge *q = t->next;
   1810 
   1811                   t->next = q->next;
   1812                   q->next = t;
   1813                   *step = q;
   1814                   changed = 1;
   1815                }
   1816                step = &(*step)->next;
   1817             }
   1818             if (!changed) break;
   1819          }
   1820 
   1821          // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline
   1822          while (e->y0 <= scan_y) {
   1823             if (e->y1 > scan_y) {
   1824                stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y, userdata);
   1825                if (z != NULL) {
   1826                   // find insertion point
   1827                   if (active == NULL)
   1828                      active = z;
   1829                   else if (z->x < active->x) {
   1830                      // insert at front
   1831                      z->next = active;
   1832                      active = z;
   1833                   } else {
   1834                      // find thing to insert AFTER
   1835                      stbtt__active_edge *p = active;
   1836                      while (p->next && p->next->x < z->x)
   1837                         p = p->next;
   1838                      // at this point, p->next->x is NOT < z->x
   1839                      z->next = p->next;
   1840                      p->next = z;
   1841                   }
   1842                }
   1843             }
   1844             ++e;
   1845          }
   1846 
   1847          // now process all active edges in XOR fashion
   1848          if (active)
   1849             stbtt__fill_active_edges(scanline, result->w, active, max_weight);
   1850 
   1851          ++y;
   1852       }
   1853       STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w);
   1854       ++j;
   1855    }
   1856 
   1857    stbtt__hheap_cleanup(&hh, userdata);
   1858 
   1859    if (scanline != scanline_data)
   1860       STBTT_free(scanline, userdata);
   1861 }
   1862 
   1863 #elif STBTT_RASTERIZER_VERSION == 2
   1864 
   1865 // the edge passed in here does not cross the vertical line at x or the vertical line at x+1
   1866 // (i.e. it has already been clipped to those)
   1867 static void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__active_edge *e, float x0, float y0, float x1, float y1)
   1868 {
   1869    if (y0 == y1) return;
   1870    STBTT_assert(y0 < y1);
   1871    STBTT_assert(e->sy <= e->ey);
   1872    if (y0 > e->ey) return;
   1873    if (y1 < e->sy) return;
   1874    if (y0 < e->sy) {
   1875       x0 += (x1-x0) * (e->sy - y0) / (y1-y0);
   1876       y0 = e->sy;
   1877    }
   1878    if (y1 > e->ey) {
   1879       x1 += (x1-x0) * (e->ey - y1) / (y1-y0);
   1880       y1 = e->ey;
   1881    }
   1882 
   1883    if (x0 == x)
   1884       STBTT_assert(x1 <= x+1);
   1885    else if (x0 == x+1)
   1886       STBTT_assert(x1 >= x);
   1887    else if (x0 <= x)
   1888       STBTT_assert(x1 <= x);
   1889    else if (x0 >= x+1)
   1890       STBTT_assert(x1 >= x+1);
   1891    else
   1892       STBTT_assert(x1 >= x && x1 <= x+1);
   1893 
   1894    if (x0 <= x && x1 <= x)
   1895       scanline[x] += e->direction * (y1-y0);
   1896    else if (x0 >= x+1 && x1 >= x+1)
   1897       ;
   1898    else {
   1899       STBTT_assert(x0 >= x && x0 <= x+1 && x1 >= x && x1 <= x+1);
   1900       scanline[x] += e->direction * (y1-y0) * (1-((x0-x)+(x1-x))/2); // coverage = 1 - average x position
   1901    }
   1902 }
   1903 
   1904 static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill, int len, stbtt__active_edge *e, float y_top)
   1905 {
   1906    float y_bottom = y_top+1;
   1907 
   1908    while (e) {
   1909       // brute force every pixel
   1910 
   1911       // compute intersection points with top & bottom
   1912       STBTT_assert(e->ey >= y_top);
   1913 
   1914       if (e->fdx == 0) {
   1915          float x0 = e->fx;
   1916          if (x0 < len) {
   1917             if (x0 >= 0) {
   1918                stbtt__handle_clipped_edge(scanline,(int) x0,e, x0,y_top, x0,y_bottom);
   1919                stbtt__handle_clipped_edge(scanline_fill-1,(int) x0+1,e, x0,y_top, x0,y_bottom);
   1920             } else {
   1921                stbtt__handle_clipped_edge(scanline_fill-1,0,e, x0,y_top, x0,y_bottom);
   1922             }
   1923          }
   1924       } else {
   1925          float x0 = e->fx;
   1926          float dx = e->fdx;
   1927          float xb = x0 + dx;
   1928          float x_top, x_bottom;
   1929          float sy0,sy1;
   1930          float dy = e->fdy;
   1931          STBTT_assert(e->sy <= y_bottom && e->ey >= y_top);
   1932 
   1933          // compute endpoints of line segment clipped to this scanline (if the
   1934          // line segment starts on this scanline. x0 is the intersection of the
   1935          // line with y_top, but that may be off the line segment.
   1936          if (e->sy > y_top) {
   1937             x_top = x0 + dx * (e->sy - y_top);
   1938             sy0 = e->sy;
   1939          } else {
   1940             x_top = x0;
   1941             sy0 = y_top;
   1942          }
   1943          if (e->ey < y_bottom) {
   1944             x_bottom = x0 + dx * (e->ey - y_top);
   1945             sy1 = e->ey;
   1946          } else {
   1947             x_bottom = xb;
   1948             sy1 = y_bottom;
   1949          }
   1950 
   1951          if (x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) {
   1952             // from here on, we don't have to range check x values
   1953 
   1954             if ((int) x_top == (int) x_bottom) {
   1955                float height;
   1956                // simple case, only spans one pixel
   1957                int x = (int) x_top;
   1958                height = sy1 - sy0;
   1959                STBTT_assert(x >= 0 && x < len);
   1960                scanline[x] += e->direction * (1-((x_top - x) + (x_bottom-x))/2)  * height;
   1961                scanline_fill[x] += e->direction * height; // everything right of this pixel is filled
   1962             } else {
   1963                int x,x1,x2;
   1964                float y_crossing, step, sign, area;
   1965                // covers 2+ pixels
   1966                if (x_top > x_bottom) {
   1967                   // flip scanline vertically; signed area is the same
   1968                   float t;
   1969                   sy0 = y_bottom - (sy0 - y_top);
   1970                   sy1 = y_bottom - (sy1 - y_top);
   1971                   t = sy0, sy0 = sy1, sy1 = t;
   1972                   t = x_bottom, x_bottom = x_top, x_top = t;
   1973                   dx = -dx;
   1974                   dy = -dy;
   1975                   t = x0, x0 = xb, xb = t;
   1976                }
   1977 
   1978                x1 = (int) x_top;
   1979                x2 = (int) x_bottom;
   1980                // compute intersection with y axis at x1+1
   1981                y_crossing = (x1+1 - x0) * dy + y_top;
   1982 
   1983                sign = e->direction;
   1984                // area of the rectangle covered from y0..y_crossing
   1985                area = sign * (y_crossing-sy0);
   1986                // area of the triangle (x_top,y0), (x+1,y0), (x+1,y_crossing)
   1987                scanline[x1] += area * (1-((x_top - x1)+(x1+1-x1))/2);
   1988 
   1989                step = sign * dy;
   1990                for (x = x1+1; x < x2; ++x) {
   1991                   scanline[x] += area + step/2;
   1992                   area += step;
   1993                }
   1994                y_crossing += dy * (x2 - (x1+1));
   1995 
   1996                STBTT_assert(fabs(area) <= 1.01f);
   1997 
   1998                scanline[x2] += area + sign * (1-((x2-x2)+(x_bottom-x2))/2) * (sy1-y_crossing);
   1999 
   2000                scanline_fill[x2] += sign * (sy1-sy0);
   2001             }
   2002          } else {
   2003             // if edge goes outside of box we're drawing, we require
   2004             // clipping logic. since this does not match the intended use
   2005             // of this library, we use a different, very slow brute
   2006             // force implementation
   2007             int x;
   2008             for (x=0; x < len; ++x) {
   2009                // cases:
   2010                //
   2011                // there can be up to two intersections with the pixel. any intersection
   2012                // with left or right edges can be handled by splitting into two (or three)
   2013                // regions. intersections with top & bottom do not necessitate case-wise logic.
   2014                //
   2015                // the old way of doing this found the intersections with the left & right edges,
   2016                // then used some simple logic to produce up to three segments in sorted order
   2017                // from top-to-bottom. however, this had a problem: if an x edge was epsilon
   2018                // across the x border, then the corresponding y position might not be distinct
   2019                // from the other y segment, and it might ignored as an empty segment. to avoid
   2020                // that, we need to explicitly produce segments based on x positions.
   2021 
   2022                // rename variables to clear pairs
   2023                float y0 = y_top;
   2024                float x1 = (float) (x);
   2025                float x2 = (float) (x+1);
   2026                float x3 = xb;
   2027                float y3 = y_bottom;
   2028                float y1,y2;
   2029 
   2030                // x = e->x + e->dx * (y-y_top)
   2031                // (y-y_top) = (x - e->x) / e->dx
   2032                // y = (x - e->x) / e->dx + y_top
   2033                y1 = (x - x0) / dx + y_top;
   2034                y2 = (x+1 - x0) / dx + y_top;
   2035 
   2036                if (x0 < x1 && x3 > x2) {         // three segments descending down-right
   2037                   stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1);
   2038                   stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x2,y2);
   2039                   stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3);
   2040                } else if (x3 < x1 && x0 > x2) {  // three segments descending down-left
   2041                   stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2);
   2042                   stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x1,y1);
   2043                   stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3);
   2044                } else if (x0 < x1 && x3 > x1) {  // two segments across x, down-right
   2045                   stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1);
   2046                   stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3);
   2047                } else if (x3 < x1 && x0 > x1) {  // two segments across x, down-left
   2048                   stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1);
   2049                   stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3);
   2050                } else if (x0 < x2 && x3 > x2) {  // two segments across x+1, down-right
   2051                   stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2);
   2052                   stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3);
   2053                } else if (x3 < x2 && x0 > x2) {  // two segments across x+1, down-left
   2054                   stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2);
   2055                   stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3);
   2056                } else {  // one segment
   2057                   stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x3,y3);
   2058                }
   2059             }
   2060          }
   2061       }
   2062       e = e->next;
   2063    }
   2064 }
   2065 
   2066 // directly AA rasterize edges w/o supersampling
   2067 static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata)
   2068 {
   2069 	(void)vsubsample;
   2070    stbtt__hheap hh = { 0, 0, 0 };
   2071    stbtt__active_edge *active = NULL;
   2072    int y,j=0, i;
   2073    float scanline_data[129], *scanline, *scanline2;
   2074 
   2075    if (result->w > 64)
   2076       scanline = (float *) STBTT_malloc((result->w*2+1) * sizeof(float), userdata);
   2077    else
   2078       scanline = scanline_data;
   2079 
   2080    scanline2 = scanline + result->w;
   2081 
   2082    y = off_y;
   2083    e[n].y0 = (float) (off_y + result->h) + 1;
   2084 
   2085    while (j < result->h) {
   2086       // find center of pixel for this scanline
   2087       float scan_y_top    = y + 0.0f;
   2088       float scan_y_bottom = y + 1.0f;
   2089       stbtt__active_edge **step = &active;
   2090 
   2091       STBTT_memset(scanline , 0, result->w*sizeof(scanline[0]));
   2092       STBTT_memset(scanline2, 0, (result->w+1)*sizeof(scanline[0]));
   2093 
   2094       // update all active edges;
   2095       // remove all active edges that terminate before the top of this scanline
   2096       while (*step) {
   2097          stbtt__active_edge * z = *step;
   2098          if (z->ey <= scan_y_top) {
   2099             *step = z->next; // delete from list
   2100             STBTT_assert(z->direction);
   2101             z->direction = 0;
   2102             stbtt__hheap_free(&hh, z);
   2103          } else {
   2104             step = &((*step)->next); // advance through list
   2105          }
   2106       }
   2107 
   2108       // insert all edges that start before the bottom of this scanline
   2109       while (e->y0 <= scan_y_bottom) {
   2110          if (e->y0 != e->y1) {
   2111             stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata);
   2112             if (z != NULL) {
   2113                STBTT_assert(z->ey >= scan_y_top);
   2114                // insert at front
   2115                z->next = active;
   2116                active = z;
   2117             }
   2118          }
   2119          ++e;
   2120       }
   2121 
   2122       // now process all active edges
   2123       if (active)
   2124          stbtt__fill_active_edges_new(scanline, scanline2+1, result->w, active, scan_y_top);
   2125 
   2126       {
   2127          float sum = 0;
   2128          for (i=0; i < result->w; ++i) {
   2129             float k;
   2130             int m;
   2131             sum += scanline2[i];
   2132             k = scanline[i] + sum;
   2133             k = (float) fabs(k)*255 + 0.5f;
   2134             m = (int) k;
   2135             if (m > 255) m = 255;
   2136             result->pixels[j*result->stride + i] = (unsigned char) m;
   2137          }
   2138       }
   2139       // advance all the edges
   2140       step = &active;
   2141       while (*step) {
   2142          stbtt__active_edge *z = *step;
   2143          z->fx += z->fdx; // advance to position for current scanline
   2144          step = &((*step)->next); // advance through list
   2145       }
   2146 
   2147       ++y;
   2148       ++j;
   2149    }
   2150 
   2151    stbtt__hheap_cleanup(&hh, userdata);
   2152 
   2153    if (scanline != scanline_data)
   2154       STBTT_free(scanline, userdata);
   2155 }
   2156 #else
   2157 #error "Unrecognized value of STBTT_RASTERIZER_VERSION"
   2158 #endif
   2159 
   2160 #define STBTT__COMPARE(a,b)  ((a)->y0 < (b)->y0)
   2161 
   2162 static void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n)
   2163 {
   2164    int i,j;
   2165    for (i=1; i < n; ++i) {
   2166       stbtt__edge t = p[i], *a = &t;
   2167       j = i;
   2168       while (j > 0) {
   2169          stbtt__edge *b = &p[j-1];
   2170          int c = STBTT__COMPARE(a,b);
   2171          if (!c) break;
   2172          p[j] = p[j-1];
   2173          --j;
   2174       }
   2175       if (i != j)
   2176          p[j] = t;
   2177    }
   2178 }
   2179 
   2180 static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n)
   2181 {
   2182    /* threshhold for transitioning to insertion sort */
   2183    while (n > 12) {
   2184       stbtt__edge t;
   2185       int c01,c12,c,m,i,j;
   2186 
   2187       /* compute median of three */
   2188       m = n >> 1;
   2189       c01 = STBTT__COMPARE(&p[0],&p[m]);
   2190       c12 = STBTT__COMPARE(&p[m],&p[n-1]);
   2191       /* if 0 >= mid >= end, or 0 < mid < end, then use mid */
   2192       if (c01 != c12) {
   2193          /* otherwise, we'll need to swap something else to middle */
   2194          int z;
   2195          c = STBTT__COMPARE(&p[0],&p[n-1]);
   2196          /* 0>mid && mid<n:  0>n => n; 0<n => 0 */
   2197          /* 0<mid && mid>n:  0>n => 0; 0<n => n */
   2198          z = (c == c12) ? 0 : n-1;
   2199          t = p[z];
   2200          p[z] = p[m];
   2201          p[m] = t;
   2202       }
   2203       /* now p[m] is the median-of-three */
   2204       /* swap it to the beginning so it won't move around */
   2205       t = p[0];
   2206       p[0] = p[m];
   2207       p[m] = t;
   2208 
   2209       /* partition loop */
   2210       i=1;
   2211       j=n-1;
   2212       for(;;) {
   2213          /* handling of equality is crucial here */
   2214          /* for sentinels & efficiency with duplicates */
   2215          for (;;++i) {
   2216             if (!STBTT__COMPARE(&p[i], &p[0])) break;
   2217          }
   2218          for (;;--j) {
   2219             if (!STBTT__COMPARE(&p[0], &p[j])) break;
   2220          }
   2221          /* make sure we haven't crossed */
   2222          if (i >= j) break;
   2223          t = p[i];
   2224          p[i] = p[j];
   2225          p[j] = t;
   2226 
   2227          ++i;
   2228          --j;
   2229       }
   2230       /* recurse on smaller side, iterate on larger */
   2231       if (j < (n-i)) {
   2232          stbtt__sort_edges_quicksort(p,j);
   2233          p = p+i;
   2234          n = n-i;
   2235       } else {
   2236          stbtt__sort_edges_quicksort(p+i, n-i);
   2237          n = j;
   2238       }
   2239    }
   2240 }
   2241 
   2242 static void stbtt__sort_edges(stbtt__edge *p, int n)
   2243 {
   2244    stbtt__sort_edges_quicksort(p, n);
   2245    stbtt__sort_edges_ins_sort(p, n);
   2246 }
   2247 
   2248 typedef struct
   2249 {
   2250    float x,y;
   2251 } stbtt__point;
   2252 
   2253 static void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata)
   2254 {
   2255    float y_scale_inv = invert ? -scale_y : scale_y;
   2256    stbtt__edge *e;
   2257    int n,i,j,k,m;
   2258 #if STBTT_RASTERIZER_VERSION == 1
   2259    int vsubsample = result->h < 8 ? 15 : 5;
   2260 #elif STBTT_RASTERIZER_VERSION == 2
   2261    int vsubsample = 1;
   2262 #else
   2263    #error "Unrecognized value of STBTT_RASTERIZER_VERSION"
   2264 #endif
   2265    // vsubsample should divide 255 evenly; otherwise we won't reach full opacity
   2266 
   2267    // now we have to blow out the windings into explicit edge lists
   2268    n = 0;
   2269    for (i=0; i < windings; ++i)
   2270       n += wcount[i];
   2271 
   2272    e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); // add an extra one as a sentinel
   2273    if (e == 0) return;
   2274    n = 0;
   2275 
   2276    m=0;
   2277    for (i=0; i < windings; ++i) {
   2278       stbtt__point *p = pts + m;
   2279       m += wcount[i];
   2280       j = wcount[i]-1;
   2281       for (k=0; k < wcount[i]; j=k++) {
   2282          int a=k,b=j;
   2283          // skip the edge if horizontal
   2284          if (p[j].y == p[k].y)
   2285             continue;
   2286          // add edge from j to k to the list
   2287          e[n].invert = 0;
   2288          if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) {
   2289             e[n].invert = 1;
   2290             a=j,b=k;
   2291          }
   2292          e[n].x0 = p[a].x * scale_x + shift_x;
   2293          e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample;
   2294          e[n].x1 = p[b].x * scale_x + shift_x;
   2295          e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample;
   2296          ++n;
   2297       }
   2298    }
   2299 
   2300    // now sort the edges by their highest point (should snap to integer, and then by x)
   2301    //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare);
   2302    stbtt__sort_edges(e, n);
   2303 
   2304    // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule
   2305    stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata);
   2306 
   2307    STBTT_free(e, userdata);
   2308 }
   2309 
   2310 static void stbtt__add_point(stbtt__point *points, int n, float x, float y)
   2311 {
   2312    if (!points) return; // during first pass, it's unallocated
   2313    points[n].x = x;
   2314    points[n].y = y;
   2315 }
   2316 
   2317 // tesselate until threshhold p is happy... @TODO warped to compensate for non-linear stretching
   2318 static int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n)
   2319 {
   2320    // midpoint
   2321    float mx = (x0 + 2*x1 + x2)/4;
   2322    float my = (y0 + 2*y1 + y2)/4;
   2323    // versus directly drawn line
   2324    float dx = (x0+x2)/2 - mx;
   2325    float dy = (y0+y2)/2 - my;
   2326    if (n > 16) // 65536 segments on one curve better be enough!
   2327       return 1;
   2328    if (dx*dx+dy*dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA
   2329       stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1);
   2330       stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1);
   2331    } else {
   2332       stbtt__add_point(points, *num_points,x2,y2);
   2333       *num_points = *num_points+1;
   2334    }
   2335    return 1;
   2336 }
   2337 
   2338 // returns number of contours
   2339 static stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata)
   2340 {
   2341    stbtt__point *points=0;
   2342    int num_points=0;
   2343 
   2344    float objspace_flatness_squared = objspace_flatness * objspace_flatness;
   2345    int i,n=0,start=0, pass;
   2346 
   2347    // count how many "moves" there are to get the contour count
   2348    for (i=0; i < num_verts; ++i)
   2349       if (vertices[i].type == STBTT_vmove)
   2350          ++n;
   2351 
   2352    *num_contours = n;
   2353    if (n == 0) return 0;
   2354 
   2355    *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata);
   2356 
   2357    if (*contour_lengths == 0) {
   2358       *num_contours = 0;
   2359       return 0;
   2360    }
   2361 
   2362    // make two passes through the points so we don't need to realloc
   2363    for (pass=0; pass < 2; ++pass) {
   2364       float x=0,y=0;
   2365       if (pass == 1) {
   2366          points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata);
   2367          if (points == NULL) goto error;
   2368       }
   2369       num_points = 0;
   2370       n= -1;
   2371       for (i=0; i < num_verts; ++i) {
   2372          switch (vertices[i].type) {
   2373             case STBTT_vmove:
   2374                // start the next contour
   2375                if (n >= 0)
   2376                   (*contour_lengths)[n] = num_points - start;
   2377                ++n;
   2378                start = num_points;
   2379 
   2380                x = vertices[i].x, y = vertices[i].y;
   2381                stbtt__add_point(points, num_points++, x,y);
   2382                break;
   2383             case STBTT_vline:
   2384                x = vertices[i].x, y = vertices[i].y;
   2385                stbtt__add_point(points, num_points++, x, y);
   2386                break;
   2387             case STBTT_vcurve:
   2388                stbtt__tesselate_curve(points, &num_points, x,y,
   2389                                         vertices[i].cx, vertices[i].cy,
   2390                                         vertices[i].x,  vertices[i].y,
   2391                                         objspace_flatness_squared, 0);
   2392                x = vertices[i].x, y = vertices[i].y;
   2393                break;
   2394          }
   2395       }
   2396       (*contour_lengths)[n] = num_points - start;
   2397    }
   2398 
   2399    return points;
   2400 error:
   2401    STBTT_free(points, userdata);
   2402    STBTT_free(*contour_lengths, userdata);
   2403    *contour_lengths = 0;
   2404    *num_contours = 0;
   2405    return NULL;
   2406 }
   2407 
   2408 STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata)
   2409 {
   2410    float scale = scale_x > scale_y ? scale_y : scale_x;
   2411    int winding_count, *winding_lengths;
   2412    stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata);
   2413    if (windings) {
   2414       stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata);
   2415       STBTT_free(winding_lengths, userdata);
   2416       STBTT_free(windings, userdata);
   2417    }
   2418 }
   2419 
   2420 STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata)
   2421 {
   2422    STBTT_free(bitmap, userdata);
   2423 }
   2424 
   2425 STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff)
   2426 {
   2427    int ix0,iy0,ix1,iy1;
   2428    stbtt__bitmap gbm;
   2429    stbtt_vertex *vertices;   
   2430    int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices);
   2431 
   2432    if (scale_x == 0) scale_x = scale_y;
   2433    if (scale_y == 0) {
   2434       if (scale_x == 0) return NULL;
   2435       scale_y = scale_x;
   2436    }
   2437 
   2438    stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1);
   2439 
   2440    // now we get the size
   2441    gbm.w = (ix1 - ix0);
   2442    gbm.h = (iy1 - iy0);
   2443    gbm.pixels = NULL; // in case we error
   2444 
   2445    if (width ) *width  = gbm.w;
   2446    if (height) *height = gbm.h;
   2447    if (xoff  ) *xoff   = ix0;
   2448    if (yoff  ) *yoff   = iy0;
   2449    
   2450    if (gbm.w && gbm.h) {
   2451       gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata);
   2452       if (gbm.pixels) {
   2453          gbm.stride = gbm.w;
   2454 
   2455          stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata);
   2456       }
   2457    }
   2458    STBTT_free(vertices, info->userdata);
   2459    return gbm.pixels;
   2460 }   
   2461 
   2462 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)
   2463 {
   2464    return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff);
   2465 }
   2466 
   2467 STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(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 glyph)
   2468 {
   2469    int ix0,iy0;
   2470    stbtt_vertex *vertices;
   2471    int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices);
   2472    stbtt__bitmap gbm;   
   2473 
   2474    stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0);
   2475    gbm.pixels = output;
   2476    gbm.w = out_w;
   2477    gbm.h = out_h;
   2478    gbm.stride = out_stride;
   2479 
   2480    if (gbm.w && gbm.h)
   2481       stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata);
   2482 
   2483    STBTT_free(vertices, info->userdata);
   2484 }
   2485 
   2486 STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph)
   2487 {
   2488    stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph);
   2489 }
   2490 
   2491 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)
   2492 {
   2493    return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff);
   2494 }   
   2495 
   2496 STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(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 codepoint)
   2497 {
   2498    stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint));
   2499 }
   2500 
   2501 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)
   2502 {
   2503    return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff);
   2504 }   
   2505 
   2506 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)
   2507 {
   2508    stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint);
   2509 }
   2510 
   2511 //////////////////////////////////////////////////////////////////////////////
   2512 //
   2513 // bitmap baking
   2514 //
   2515 // This is SUPER-CRAPPY packing to keep source code small
   2516 
   2517 STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset,  // font location (use offset=0 for plain .ttf)
   2518                                 float pixel_height,                     // height of font in pixels
   2519                                 unsigned char *pixels, int pw, int ph,  // bitmap to be filled in
   2520                                 int first_char, int num_chars,          // characters to bake
   2521                                 stbtt_bakedchar *chardata)
   2522 {
   2523    float scale;
   2524    int x,y,bottom_y, i;
   2525    stbtt_fontinfo f;
   2526    f.userdata = NULL;
   2527    if (!stbtt_InitFont(&f, data, offset))
   2528       return -1;
   2529    STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels
   2530    x=y=1;
   2531    bottom_y = 1;
   2532 
   2533    scale = stbtt_ScaleForPixelHeight(&f, pixel_height);
   2534 
   2535    for (i=0; i < num_chars; ++i) {
   2536       int advance, lsb, x0,y0,x1,y1,gw,gh;
   2537       int g = stbtt_FindGlyphIndex(&f, first_char + i);
   2538       stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb);
   2539       stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1);
   2540       gw = x1-x0;
   2541       gh = y1-y0;
   2542       if (x + gw + 1 >= pw)
   2543          y = bottom_y, x = 1; // advance to next row
   2544       if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row
   2545          return -i;
   2546       STBTT_assert(x+gw < pw);
   2547       STBTT_assert(y+gh < ph);
   2548       stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g);
   2549       chardata[i].x0 = (stbtt_int16) x;
   2550       chardata[i].y0 = (stbtt_int16) y;
   2551       chardata[i].x1 = (stbtt_int16) (x + gw);
   2552       chardata[i].y1 = (stbtt_int16) (y + gh);
   2553       chardata[i].xadvance = scale * advance;
   2554       chardata[i].xoff     = (float) x0;
   2555       chardata[i].yoff     = (float) y0;
   2556       x = x + gw + 1;
   2557       if (y+gh+1 > bottom_y)
   2558          bottom_y = y+gh+1;
   2559    }
   2560    return bottom_y;
   2561 }
   2562 
   2563 STBTT_DEF void stbtt_GetBakedQuad(stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule)
   2564 {
   2565    float d3d_bias = opengl_fillrule ? 0 : -0.5f;
   2566    float ipw = 1.0f / pw, iph = 1.0f / ph;
   2567    stbtt_bakedchar *b = chardata + char_index;
   2568    int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f);
   2569    int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f);
   2570 
   2571    q->x0 = round_x + d3d_bias;
   2572    q->y0 = round_y + d3d_bias;
   2573    q->x1 = round_x + b->x1 - b->x0 + d3d_bias;
   2574    q->y1 = round_y + b->y1 - b->y0 + d3d_bias;
   2575 
   2576    q->s0 = b->x0 * ipw;
   2577    q->t0 = b->y0 * iph;
   2578    q->s1 = b->x1 * ipw;
   2579    q->t1 = b->y1 * iph;
   2580 
   2581    *xpos += b->xadvance;
   2582 }
   2583 
   2584 //////////////////////////////////////////////////////////////////////////////
   2585 //
   2586 // rectangle packing replacement routines if you don't have stb_rect_pack.h
   2587 //
   2588 
   2589 #ifndef STB_RECT_PACK_VERSION
   2590 #ifdef _MSC_VER
   2591 #define STBTT__NOTUSED(v)  (void)(v)
   2592 #else
   2593 #define STBTT__NOTUSED(v)  (void)sizeof(v)
   2594 #endif
   2595 
   2596 typedef int stbrp_coord;
   2597 
   2598 ////////////////////////////////////////////////////////////////////////////////////
   2599 //                                                                                //
   2600 //                                                                                //
   2601 // COMPILER WARNING ?!?!?                                                         //
   2602 //                                                                                //
   2603 //                                                                                //
   2604 // if you get a compile warning due to these symbols being defined more than      //
   2605 // once, move #include "stb_rect_pack.h" before #include "stb_truetype.h"         //
   2606 //                                                                                //
   2607 ////////////////////////////////////////////////////////////////////////////////////
   2608 
   2609 typedef struct
   2610 {
   2611    int width,height;
   2612    int x,y,bottom_y;
   2613 } stbrp_context;
   2614 
   2615 typedef struct
   2616 {
   2617    unsigned char x;
   2618 } stbrp_node;
   2619 
   2620 struct stbrp_rect
   2621 {
   2622    stbrp_coord x,y;
   2623    int id,w,h,was_packed;
   2624 };
   2625 
   2626 static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *nodes, int num_nodes)
   2627 {
   2628    con->width  = pw;
   2629    con->height = ph;
   2630    con->x = 0;
   2631    con->y = 0;
   2632    con->bottom_y = 0;
   2633    STBTT__NOTUSED(nodes);
   2634    STBTT__NOTUSED(num_nodes);   
   2635 }
   2636 
   2637 static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects)
   2638 {
   2639    int i;
   2640    for (i=0; i < num_rects; ++i) {
   2641       if (con->x + rects[i].w > con->width) {
   2642          con->x = 0;
   2643          con->y = con->bottom_y;
   2644       }
   2645       if (con->y + rects[i].h > con->height)
   2646          break;
   2647       rects[i].x = con->x;
   2648       rects[i].y = con->y;
   2649       rects[i].was_packed = 1;
   2650       con->x += rects[i].w;
   2651       if (con->y + rects[i].h > con->bottom_y)
   2652          con->bottom_y = con->y + rects[i].h;
   2653    }
   2654    for (   ; i < num_rects; ++i)
   2655       rects[i].was_packed = 0;
   2656 }
   2657 #endif
   2658 
   2659 //////////////////////////////////////////////////////////////////////////////
   2660 //
   2661 // bitmap baking
   2662 //
   2663 // This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If
   2664 // stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy.
   2665 
   2666 STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int pw, int ph, int stride_in_bytes, int padding, void *alloc_context)
   2667 {
   2668    stbrp_context *context = (stbrp_context *) STBTT_malloc(sizeof(*context)            ,alloc_context);
   2669    int            num_nodes = pw - padding;
   2670    stbrp_node    *nodes   = (stbrp_node    *) STBTT_malloc(sizeof(*nodes  ) * num_nodes,alloc_context);
   2671 
   2672    if (context == NULL || nodes == NULL) {
   2673       if (context != NULL) STBTT_free(context, alloc_context);
   2674       if (nodes   != NULL) STBTT_free(nodes  , alloc_context);
   2675       return 0;
   2676    }
   2677 
   2678    spc->user_allocator_context = alloc_context;
   2679    spc->width = pw;
   2680    spc->height = ph;
   2681    spc->pixels = pixels;
   2682    spc->pack_info = context;
   2683    spc->nodes = nodes;
   2684    spc->padding = padding;
   2685    spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw;
   2686    spc->h_oversample = 1;
   2687    spc->v_oversample = 1;
   2688 
   2689    stbrp_init_target(context, pw-padding, ph-padding, nodes, num_nodes);
   2690 
   2691    if (pixels)
   2692       STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels
   2693 
   2694    return 1;
   2695 }
   2696 
   2697 STBTT_DEF void stbtt_PackEnd  (stbtt_pack_context *spc)
   2698 {
   2699    STBTT_free(spc->nodes    , spc->user_allocator_context);
   2700    STBTT_free(spc->pack_info, spc->user_allocator_context);
   2701 }
   2702 
   2703 STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample)
   2704 {
   2705    STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE);
   2706    STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE);
   2707    if (h_oversample <= STBTT_MAX_OVERSAMPLE)
   2708       spc->h_oversample = h_oversample;
   2709    if (v_oversample <= STBTT_MAX_OVERSAMPLE)
   2710       spc->v_oversample = v_oversample;
   2711 }
   2712 
   2713 #define STBTT__OVER_MASK  (STBTT_MAX_OVERSAMPLE-1)
   2714 
   2715 static void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width)
   2716 {
   2717    unsigned char buffer[STBTT_MAX_OVERSAMPLE];
   2718    int safe_w = w - kernel_width;
   2719    int j;
   2720    STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze
   2721    for (j=0; j < h; ++j) {
   2722       int i;
   2723       unsigned int total;
   2724       STBTT_memset(buffer, 0, kernel_width);
   2725 
   2726       total = 0;
   2727 
   2728       // make kernel_width a constant in common cases so compiler can optimize out the divide
   2729       switch (kernel_width) {
   2730          case 2:
   2731             for (i=0; i <= safe_w; ++i) {
   2732                total += pixels[i] - buffer[i & STBTT__OVER_MASK];
   2733                buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i];
   2734                pixels[i] = (unsigned char) (total / 2);
   2735             }
   2736             break;
   2737          case 3:
   2738             for (i=0; i <= safe_w; ++i) {
   2739                total += pixels[i] - buffer[i & STBTT__OVER_MASK];
   2740                buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i];
   2741                pixels[i] = (unsigned char) (total / 3);
   2742             }
   2743             break;
   2744          case 4:
   2745             for (i=0; i <= safe_w; ++i) {
   2746                total += pixels[i] - buffer[i & STBTT__OVER_MASK];
   2747                buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i];
   2748                pixels[i] = (unsigned char) (total / 4);
   2749             }
   2750             break;
   2751          case 5:
   2752             for (i=0; i <= safe_w; ++i) {
   2753                total += pixels[i] - buffer[i & STBTT__OVER_MASK];
   2754                buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i];
   2755                pixels[i] = (unsigned char) (total / 5);
   2756             }
   2757             break;
   2758          default:
   2759             for (i=0; i <= safe_w; ++i) {
   2760                total += pixels[i] - buffer[i & STBTT__OVER_MASK];
   2761                buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i];
   2762                pixels[i] = (unsigned char) (total / kernel_width);
   2763             }
   2764             break;
   2765       }
   2766 
   2767       for (; i < w; ++i) {
   2768          STBTT_assert(pixels[i] == 0);
   2769          total -= buffer[i & STBTT__OVER_MASK];
   2770          pixels[i] = (unsigned char) (total / kernel_width);
   2771       }
   2772 
   2773       pixels += stride_in_bytes;
   2774    }
   2775 }
   2776 
   2777 static void stbtt__v_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width)
   2778 {
   2779    unsigned char buffer[STBTT_MAX_OVERSAMPLE];
   2780    int safe_h = h - kernel_width;
   2781    int j;
   2782    STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze
   2783    for (j=0; j < w; ++j) {
   2784       int i;
   2785       unsigned int total;
   2786       STBTT_memset(buffer, 0, kernel_width);
   2787 
   2788       total = 0;
   2789 
   2790       // make kernel_width a constant in common cases so compiler can optimize out the divide
   2791       switch (kernel_width) {
   2792          case 2:
   2793             for (i=0; i <= safe_h; ++i) {
   2794                total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK];
   2795                buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes];
   2796                pixels[i*stride_in_bytes] = (unsigned char) (total / 2);
   2797             }
   2798             break;
   2799          case 3:
   2800             for (i=0; i <= safe_h; ++i) {
   2801                total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK];
   2802                buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes];
   2803                pixels[i*stride_in_bytes] = (unsigned char) (total / 3);
   2804             }
   2805             break;
   2806          case 4:
   2807             for (i=0; i <= safe_h; ++i) {
   2808                total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK];
   2809                buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes];
   2810                pixels[i*stride_in_bytes] = (unsigned char) (total / 4);
   2811             }
   2812             break;
   2813          case 5:
   2814             for (i=0; i <= safe_h; ++i) {
   2815                total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK];
   2816                buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes];
   2817                pixels[i*stride_in_bytes] = (unsigned char) (total / 5);
   2818             }
   2819             break;
   2820          default:
   2821             for (i=0; i <= safe_h; ++i) {
   2822                total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK];
   2823                buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes];
   2824                pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width);
   2825             }
   2826             break;
   2827       }
   2828 
   2829       for (; i < h; ++i) {
   2830          STBTT_assert(pixels[i*stride_in_bytes] == 0);
   2831          total -= buffer[i & STBTT__OVER_MASK];
   2832          pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width);
   2833       }
   2834 
   2835       pixels += 1;
   2836    }
   2837 }
   2838 
   2839 static float stbtt__oversample_shift(int oversample)
   2840 {
   2841    if (!oversample)
   2842       return 0.0f;
   2843 
   2844    // The prefilter is a box filter of width "oversample",
   2845    // which shifts phase by (oversample - 1)/2 pixels in
   2846    // oversampled space. We want to shift in the opposite
   2847    // direction to counter this.
   2848    return (float)-(oversample - 1) / (2.0f * (float)oversample);
   2849 }
   2850 
   2851 // rects array must be big enough to accommodate all characters in the given ranges
   2852 STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects)
   2853 {
   2854    int i,j,k;
   2855 
   2856    k=0;
   2857    for (i=0; i < num_ranges; ++i) {
   2858       float fh = ranges[i].font_size;
   2859       float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh);
   2860       ranges[i].h_oversample = (unsigned char) spc->h_oversample;
   2861       ranges[i].v_oversample = (unsigned char) spc->v_oversample;
   2862       for (j=0; j < ranges[i].num_chars; ++j) {
   2863          int x0,y0,x1,y1;
   2864          int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j];
   2865          int glyph = stbtt_FindGlyphIndex(info, codepoint);
   2866          stbtt_GetGlyphBitmapBoxSubpixel(info,glyph,
   2867                                          scale * spc->h_oversample,
   2868                                          scale * spc->v_oversample,
   2869                                          0,0,
   2870                                          &x0,&y0,&x1,&y1);
   2871          rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1);
   2872          rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1);
   2873          ++k;
   2874       }
   2875    }
   2876 
   2877    return k;
   2878 }
   2879 
   2880 // rects array must be big enough to accommodate all characters in the given ranges
   2881 STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects)
   2882 {
   2883    int i,j,k, return_value = 1;
   2884 
   2885    // save current values
   2886    int old_h_over = spc->h_oversample;
   2887    int old_v_over = spc->v_oversample;
   2888 
   2889    k = 0;
   2890    for (i=0; i < num_ranges; ++i) {
   2891       float fh = ranges[i].font_size;
   2892       float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh);
   2893       float recip_h,recip_v,sub_x,sub_y;
   2894       spc->h_oversample = ranges[i].h_oversample;
   2895       spc->v_oversample = ranges[i].v_oversample;
   2896       recip_h = 1.0f / spc->h_oversample;
   2897       recip_v = 1.0f / spc->v_oversample;
   2898       sub_x = stbtt__oversample_shift(spc->h_oversample);
   2899       sub_y = stbtt__oversample_shift(spc->v_oversample);
   2900       for (j=0; j < ranges[i].num_chars; ++j) {
   2901          stbrp_rect *r = &rects[k];
   2902          if (r->was_packed) {
   2903             stbtt_packedchar *bc = &ranges[i].chardata_for_range[j];
   2904             int advance, lsb, x0,y0,x1,y1;
   2905             int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j];
   2906             int glyph = stbtt_FindGlyphIndex(info, codepoint);
   2907             stbrp_coord pad = (stbrp_coord) spc->padding;
   2908 
   2909             // pad on left and top
   2910             r->x += pad;
   2911             r->y += pad;
   2912             r->w -= pad;
   2913             r->h -= pad;
   2914             stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb);
   2915             stbtt_GetGlyphBitmapBox(info, glyph,
   2916                                     scale * spc->h_oversample,
   2917                                     scale * spc->v_oversample,
   2918                                     &x0,&y0,&x1,&y1);
   2919             stbtt_MakeGlyphBitmapSubpixel(info,
   2920                                           spc->pixels + r->x + r->y*spc->stride_in_bytes,
   2921                                           r->w - spc->h_oversample+1,
   2922                                           r->h - spc->v_oversample+1,
   2923                                           spc->stride_in_bytes,
   2924                                           scale * spc->h_oversample,
   2925                                           scale * spc->v_oversample,
   2926                                           0,0,
   2927                                           glyph);
   2928 
   2929             if (spc->h_oversample > 1)
   2930                stbtt__h_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes,
   2931                                   r->w, r->h, spc->stride_in_bytes,
   2932                                   spc->h_oversample);
   2933 
   2934             if (spc->v_oversample > 1)
   2935                stbtt__v_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes,
   2936                                   r->w, r->h, spc->stride_in_bytes,
   2937                                   spc->v_oversample);
   2938 
   2939             bc->x0       = (stbtt_int16)  r->x;
   2940             bc->y0       = (stbtt_int16)  r->y;
   2941             bc->x1       = (stbtt_int16) (r->x + r->w);
   2942             bc->y1       = (stbtt_int16) (r->y + r->h);
   2943             bc->xadvance =                scale * advance;
   2944             bc->xoff     =       (float)  x0 * recip_h + sub_x;
   2945             bc->yoff     =       (float)  y0 * recip_v + sub_y;
   2946             bc->xoff2    =                (x0 + r->w) * recip_h + sub_x;
   2947             bc->yoff2    =                (y0 + r->h) * recip_v + sub_y;
   2948          } else {
   2949             return_value = 0; // if any fail, report failure
   2950          }
   2951 
   2952          ++k;
   2953       }
   2954    }
   2955 
   2956    // restore original values
   2957    spc->h_oversample = old_h_over;
   2958    spc->v_oversample = old_v_over;
   2959 
   2960    return return_value;
   2961 }
   2962 
   2963 STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects)
   2964 {
   2965    stbrp_pack_rects((stbrp_context *) spc->pack_info, rects, num_rects);
   2966 }
   2967 
   2968 STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges)
   2969 {
   2970    stbtt_fontinfo info;
   2971    int i,j,n, return_value = 1;
   2972    //stbrp_context *context = (stbrp_context *) spc->pack_info;
   2973    stbrp_rect    *rects;
   2974 
   2975    // flag all characters as NOT packed
   2976    for (i=0; i < num_ranges; ++i)
   2977       for (j=0; j < ranges[i].num_chars; ++j)
   2978          ranges[i].chardata_for_range[j].x0 =
   2979          ranges[i].chardata_for_range[j].y0 =
   2980          ranges[i].chardata_for_range[j].x1 =
   2981          ranges[i].chardata_for_range[j].y1 = 0;
   2982 
   2983    n = 0;
   2984    for (i=0; i < num_ranges; ++i)
   2985       n += ranges[i].num_chars;
   2986          
   2987    rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context);
   2988    if (rects == NULL)
   2989       return 0;
   2990 
   2991    info.userdata = spc->user_allocator_context;
   2992    stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata,font_index));
   2993 
   2994    n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects);
   2995 
   2996    stbtt_PackFontRangesPackRects(spc, rects, n);
   2997   
   2998    return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects);
   2999 
   3000    STBTT_free(rects, spc->user_allocator_context);
   3001    return return_value;
   3002 }
   3003 
   3004 STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, float font_size,
   3005             int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range)
   3006 {
   3007    stbtt_pack_range range;
   3008    range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range;
   3009    range.array_of_unicode_codepoints = NULL;
   3010    range.num_chars                   = num_chars_in_range;
   3011    range.chardata_for_range          = chardata_for_range;
   3012    range.font_size                   = font_size;
   3013    return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1);
   3014 }
   3015 
   3016 STBTT_DEF void stbtt_GetPackedQuad(stbtt_packedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int align_to_integer)
   3017 {
   3018    float ipw = 1.0f / pw, iph = 1.0f / ph;
   3019    stbtt_packedchar *b = chardata + char_index;
   3020 
   3021    if (align_to_integer) {
   3022       float x = (float) STBTT_ifloor((*xpos + b->xoff) + 0.5f);
   3023       float y = (float) STBTT_ifloor((*ypos + b->yoff) + 0.5f);
   3024       q->x0 = x;
   3025       q->y0 = y;
   3026       q->x1 = x + b->xoff2 - b->xoff;
   3027       q->y1 = y + b->yoff2 - b->yoff;
   3028    } else {
   3029       q->x0 = *xpos + b->xoff;
   3030       q->y0 = *ypos + b->yoff;
   3031       q->x1 = *xpos + b->xoff2;
   3032       q->y1 = *ypos + b->yoff2;
   3033    }
   3034 
   3035    q->s0 = b->x0 * ipw;
   3036    q->t0 = b->y0 * iph;
   3037    q->s1 = b->x1 * ipw;
   3038    q->t1 = b->y1 * iph;
   3039 
   3040    *xpos += b->xadvance;
   3041 }
   3042 
   3043 
   3044 //////////////////////////////////////////////////////////////////////////////
   3045 //
   3046 // font name matching -- recommended not to use this
   3047 //
   3048 
   3049 // check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string
   3050 static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(const stbtt_uint8 *s1, stbtt_int32 len1, const stbtt_uint8 *s2, stbtt_int32 len2) 
   3051 {
   3052    stbtt_int32 i=0;
   3053 
   3054    // convert utf16 to utf8 and compare the results while converting
   3055    while (len2) {
   3056       stbtt_uint16 ch = s2[0]*256 + s2[1];
   3057       if (ch < 0x80) {
   3058          if (i >= len1) return -1;
   3059          if (s1[i++] != ch) return -1;
   3060       } else if (ch < 0x800) {
   3061          if (i+1 >= len1) return -1;
   3062          if (s1[i++] != 0xc0 + (ch >> 6)) return -1;
   3063          if (s1[i++] != 0x80 + (ch & 0x3f)) return -1;
   3064       } else if (ch >= 0xd800 && ch < 0xdc00) {
   3065          stbtt_uint32 c;
   3066          stbtt_uint16 ch2 = s2[2]*256 + s2[3];
   3067          if (i+3 >= len1) return -1;
   3068          c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000;
   3069          if (s1[i++] != 0xf0 + (c >> 18)) return -1;
   3070          if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1;
   3071          if (s1[i++] != 0x80 + ((c >>  6) & 0x3f)) return -1;
   3072          if (s1[i++] != 0x80 + ((c      ) & 0x3f)) return -1;
   3073          s2 += 2; // plus another 2 below
   3074          len2 -= 2;
   3075       } else if (ch >= 0xdc00 && ch < 0xe000) {
   3076          return -1;
   3077       } else {
   3078          if (i+2 >= len1) return -1;
   3079          if (s1[i++] != 0xe0 + (ch >> 12)) return -1;
   3080          if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1;
   3081          if (s1[i++] != 0x80 + ((ch     ) & 0x3f)) return -1;
   3082       }
   3083       s2 += 2;
   3084       len2 -= 2;
   3085    }
   3086    return i;
   3087 }
   3088 
   3089 STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2) 
   3090 {
   3091    return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((const stbtt_uint8*) s1, len1, (const stbtt_uint8*) s2, len2);
   3092 }
   3093 
   3094 // returns results in whatever encoding you request... but note that 2-byte encodings
   3095 // will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare
   3096 STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID)
   3097 {
   3098    stbtt_int32 i,count,stringOffset;
   3099    stbtt_uint8 *fc = font->data;
   3100    stbtt_uint32 offset = font->fontstart;
   3101    stbtt_uint32 nm = stbtt__find_table(fc, offset, "name");
   3102    if (!nm) return NULL;
   3103 
   3104    count = ttUSHORT(fc+nm+2);
   3105    stringOffset = nm + ttUSHORT(fc+nm+4);
   3106    for (i=0; i < count; ++i) {
   3107       stbtt_uint32 loc = nm + 6 + 12 * i;
   3108       if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2)
   3109           && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) {
   3110          *length = ttUSHORT(fc+loc+8);
   3111          return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10));
   3112       }
   3113    }
   3114    return NULL;
   3115 }
   3116 
   3117 static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id)
   3118 {
   3119    stbtt_int32 i;
   3120    stbtt_int32 count = ttUSHORT(fc+nm+2);
   3121    stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4);
   3122 
   3123    for (i=0; i < count; ++i) {
   3124       stbtt_uint32 loc = nm + 6 + 12 * i;
   3125       stbtt_int32 id = ttUSHORT(fc+loc+6);
   3126       if (id == target_id) {
   3127          // find the encoding
   3128          stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4);
   3129 
   3130          // is this a Unicode encoding?
   3131          if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) {
   3132             stbtt_int32 slen = ttUSHORT(fc+loc+8);
   3133             stbtt_int32 off = ttUSHORT(fc+loc+10);
   3134 
   3135             // check if there's a prefix match
   3136             stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen);
   3137             if (matchlen >= 0) {
   3138                // check for target_id+1 immediately following, with same encoding & language
   3139                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) {
   3140                   slen = ttUSHORT(fc+loc+12+8);
   3141                   off = ttUSHORT(fc+loc+12+10);
   3142                   if (slen == 0) {
   3143                      if (matchlen == nlen)
   3144                         return 1;
   3145                   } else if (matchlen < nlen && name[matchlen] == ' ') {
   3146                      ++matchlen;
   3147                      if (stbtt_CompareUTF8toUTF16_bigendian((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen))
   3148                         return 1;
   3149                   }
   3150                } else {
   3151                   // if nothing immediately following
   3152                   if (matchlen == nlen)
   3153                      return 1;
   3154                }
   3155             }
   3156          }
   3157 
   3158          // @TODO handle other encodings
   3159       }
   3160    }
   3161    return 0;
   3162 }
   3163 
   3164 static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags)
   3165 {
   3166    stbtt_int32 nlen = (stbtt_int32) STBTT_strlen((char *) name);
   3167    stbtt_uint32 nm,hd;
   3168    if (!stbtt__isfont(fc+offset)) return 0;
   3169 
   3170    // check italics/bold/underline flags in macStyle...
   3171    if (flags) {
   3172       hd = stbtt__find_table(fc, offset, "head");
   3173       if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0;
   3174    }
   3175 
   3176    nm = stbtt__find_table(fc, offset, "name");
   3177    if (!nm) return 0;
   3178 
   3179    if (flags) {
   3180       // if we checked the macStyle flags, then just check the family and ignore the subfamily
   3181       if (stbtt__matchpair(fc, nm, name, nlen, 16, -1))  return 1;
   3182       if (stbtt__matchpair(fc, nm, name, nlen,  1, -1))  return 1;
   3183       if (stbtt__matchpair(fc, nm, name, nlen,  3, -1))  return 1;
   3184    } else {
   3185       if (stbtt__matchpair(fc, nm, name, nlen, 16, 17))  return 1;
   3186       if (stbtt__matchpair(fc, nm, name, nlen,  1,  2))  return 1;
   3187       if (stbtt__matchpair(fc, nm, name, nlen,  3, -1))  return 1;
   3188    }
   3189 
   3190    return 0;
   3191 }
   3192 
   3193 STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *font_collection, const char *name_utf8, stbtt_int32 flags)
   3194 {
   3195    stbtt_int32 i;
   3196    for (i=0;;++i) {
   3197       stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i);
   3198       if (off < 0) return off;
   3199       if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags))
   3200          return off;
   3201    }
   3202 }
   3203 
   3204 #endif // STB_TRUETYPE_IMPLEMENTATION
   3205 
   3206 
   3207 // FULL VERSION HISTORY
   3208 //
   3209 //   1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges
   3210 //   1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges
   3211 //   1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints;
   3212 //                     allow PackFontRanges to pack and render in separate phases;
   3213 //                     fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?);
   3214 //                     fixed an assert() bug in the new rasterizer
   3215 //                     replace assert() with STBTT_assert() in new rasterizer
   3216 //   1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine)
   3217 //                     also more precise AA rasterizer, except if shapes overlap
   3218 //                     remove need for STBTT_sort
   3219 //   1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC
   3220 //   1.04 (2015-04-15) typo in example
   3221 //   1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes
   3222 //   1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++
   3223 //   1.01 (2014-12-08) fix subpixel position when oversampling to exactly match
   3224 //                        non-oversampled; STBTT_POINT_SIZE for packed case only
   3225 //   1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling
   3226 //   0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg)
   3227 //   0.9  (2014-08-07) support certain mac/iOS fonts without an MS platformID
   3228 //   0.8b (2014-07-07) fix a warning
   3229 //   0.8  (2014-05-25) fix a few more warnings
   3230 //   0.7  (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back
   3231 //   0.6c (2012-07-24) improve documentation
   3232 //   0.6b (2012-07-20) fix a few more warnings
   3233 //   0.6  (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels,
   3234 //                        stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty
   3235 //   0.5  (2011-12-09) bugfixes:
   3236 //                        subpixel glyph renderer computed wrong bounding box
   3237 //                        first vertex of shape can be off-curve (FreeSans)
   3238 //   0.4b (2011-12-03) fixed an error in the font baking example
   3239 //   0.4  (2011-12-01) kerning, subpixel rendering (tor)
   3240 //                    bugfixes for:
   3241 //                        codepoint-to-glyph conversion using table fmt=12
   3242 //                        codepoint-to-glyph conversion using table fmt=4
   3243 //                        stbtt_GetBakedQuad with non-square texture (Zer)
   3244 //                    updated Hello World! sample to use kerning and subpixel
   3245 //                    fixed some warnings
   3246 //   0.3  (2009-06-24) cmap fmt=12, compound shapes (MM)
   3247 //                    userdata, malloc-from-userdata, non-zero fill (stb)
   3248 //   0.2  (2009-03-11) Fix unsigned/signed char warnings
   3249 //   0.1  (2009-03-09) First public release
   3250 //