From 22dbcffef714461ca29694bf71deeff38bf5522d Mon Sep 17 00:00:00 2001 From: Sean Barrett Date: Sat, 6 Dec 2014 23:00:59 -0800 Subject: [PATCH] stbtt_Pack* documentation oversample test tweaks --- stb_rect_pack.h | 8 ++- stb_truetype.h | 62 +++++++++++++---- tests/oversample/main.c | 118 ++++++++++++++++++++++++-------- tests/oversample/oversample.exe | Bin 0 -> 54272 bytes tests/oversample/stb_wingraph.h | 3 + 5 files changed, 148 insertions(+), 43 deletions(-) create mode 100644 tests/oversample/oversample.exe diff --git a/stb_rect_pack.h b/stb_rect_pack.h index 5462379..6a9e8d3 100644 --- a/stb_rect_pack.h +++ b/stb_rect_pack.h @@ -1,4 +1,4 @@ -// stb_rect_pack.h - v0.03 - public domain - rectangle packing +// stb_rect_pack.h - v0.04 - public domain - rectangle packing // Sean Barrett 2014 // // Useful for e.g. packing rectangular textures into an atlas. @@ -19,7 +19,11 @@ // Please note: better rectangle packers are welcome! Please // implement them to the same API, but with a different init // function. - +// +// Version history: +// +// 0.04: fixed minor bug in STBRP_LARGE_RECTS support +// 0.01: initial release ////////////////////////////////////////////////////////////////////////////// // diff --git a/stb_truetype.h b/stb_truetype.h index 4b7db1a..f57ec09 100644 --- a/stb_truetype.h +++ b/stb_truetype.h @@ -1,4 +1,4 @@ -// stb_truetype.h - v0.99 - public domain +// stb_truetype.h - v1.00 - public domain // authored from 2009-2014 by Sean Barrett / RAD Game Tools // // This library processes TrueType files: @@ -40,6 +40,7 @@ // // VERSION HISTORY // +// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling // 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) // 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID // 0.8b (2014-07-07) fix a warning @@ -61,7 +62,7 @@ // updated Hello World! sample to use kerning and subpixel // fixed some warnings // 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) -// userdata, malloc-from-userdata, non-zero fill (STB) +// userdata, malloc-from-userdata, non-zero fill (stb) // 0.2 (2009-03-11) Fix unsigned/signed char warnings // 0.1 (2009-03-09) First public release // @@ -79,11 +80,18 @@ // before the #include of this file. This expands out the actual // implementation into that C/C++ file. // -// Simple 3D API (don't ship this, but it's fine for tools and quick start, -// and you can cut and paste from it to move to more advanced) +// Simple 3D API (don't ship this, but it's fine for tools and quick start) // stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture // stbtt_GetBakedQuad() -- compute quad to draw for a given char // +// Improved 3D API (more shippable): +// #include "stb_rect_pack.h" -- optional, but you really want it +// stbtt_PackBegin() +// stbtt_PackSetOversample() -- for improved quality on small fonts +// stbtt_PackFontRanges() +// stbtt_PackEnd() +// stbtt_GetPackedQuad() +// // "Load" a font file from a memory buffer (you have to keep the buffer loaded) // stbtt_InitFont() // stbtt_GetFontOffsetForIndex() -- use for TTC font collections @@ -484,21 +492,51 @@ typedef struct typedef struct stbtt_pack_context stbtt_pack_context; typedef struct { - float font_size; // if positive, pixel height; if negative, points + float font_size; int first_unicode_char_in_range; int num_chars_in_range; stbtt_packedchar *chardata_for_range; // output } stbtt_pack_range; -extern int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int pw, int ph, int stride_in_bytes, int padding, void *alloc_context); -// returns 0 if the allocations fail +extern int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int width, int height, int stride_in_bytes, int padding, void *alloc_context); +// Initializes a packing context stored in the passed-in stbtt_pack_context. +// Future calls using this context will pack characters into the bitmap passed +// in here: a 1-channel bitmap that is weight x height. stride_in_bytes is +// the distance from one row to the next (or 0 to mean they are packed tightly +// together). "padding" is // the amount of padding to leave between each +// character (normally you want '1' for bitmaps you'll use as textures with +// bilinear filtering). +// +// Returns 0 on failure, 1 on success. + +extern void stbtt_PackEnd (stbtt_pack_context *spc); +// Cleans up the packing context and frees all memory. + +extern int stbtt_PackFontRange(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, float pixel_height, + int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range); +// Creates character bitmaps from the font_index'th font found in fontdata (use +// font_index=0 if you don't know what that is). It creates num_chars_in_range +// bitmaps for characters with unicode values starting at first_unicode_char_in_range +// and increasing. Data for how to render them is stored in chardata_for_range; +// pass these to stbtt_GetPackedQuad to get back renderable quads. + +extern int stbtt_PackFontRanges(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges); +// Creates character bitmaps from multiple ranges of characters stored in +// ranges. This will usually create a better-packed bitmap than multiple +// calls to stbtt_PackFontRange. + extern void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample); -extern void stbtt_PackEnd (stbtt_pack_context *spc); -extern int stbtt_PackFontRange(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, float font_size, - int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range); -extern int stbtt_PackFontRanges(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges); - +// Oversampling a font increases the quality by allowing higher-quality subpixel +// positioning, and is especially valuable at smaller text sizes. +// +// This function sets the amount of oversampling for all following calls to +// stbtt_PackFontRange(s). The default (no oversampling) is achieved by +// h_oversample=1, v_oversample=1. The total number of pixels required is +// h_oversample*v_oversample larger than the default; for example, 2x2 +// oversampling requires 4x the storage of 1x1. For best results, render +// oversampled textures with bilinear filtering. Look at the readme in +// stb/tests/oversample for information about oversampled fonts extern void stbtt_GetPackedQuad(stbtt_packedchar *chardata, int pw, int ph, // same data as above int char_index, // character to display diff --git a/tests/oversample/main.c b/tests/oversample/main.c index f9f4d76..bc6bd0f 100644 --- a/tests/oversample/main.c +++ b/tests/oversample/main.c @@ -2,11 +2,8 @@ #include #include -#define STB_DEFINE #define STB_WINMAIN -#define STB_NO_REGISTRY #include "stb_wingraph.h" -#include "stb.h" #define STB_TRUETYPE_IMPLEMENTATION #define STB_RECT_PACK_IMPLEMENTATION @@ -22,11 +19,12 @@ #include #include +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 #define SIZE_X 1024 #define SIZE_Y 768 -stbtt_packedchar chardata[3][128]; +stbtt_packedchar chardata[6][128]; int sx=SIZE_X, sy=SIZE_Y; @@ -36,19 +34,40 @@ unsigned char temp_bitmap[BITMAP_W][BITMAP_H]; unsigned char ttf_buffer[1 << 25]; GLuint font_tex; +float scale[2] = { 24.0f, 14.0f }; + +int sf[6] = { 0,1,2, 0,1,2 }; + void load_fonts(void) { stbtt_pack_context pc; - FILE *f = fopen("c:/windows/fonts/times.ttf", "rb"); - if (!f) exit(0); + int i; + FILE *f; + char filename[256]; + char *win = getenv("windir"); + if (win == NULL) win = getenv("SystemRoot"); + + f = fopen(stb_wingraph_commandline, "rb"); + if (!f) { + if (win == NULL) + sprintf(filename, "arial.ttf", win); + else + sprintf(filename, "%s/fonts/arial.ttf", win); + f = fopen(filename, "rb"); + if (!f) exit(0); + } + fread(ttf_buffer, 1, 1<<25, f); stbtt_PackBegin(&pc, temp_bitmap[0], BITMAP_W, BITMAP_H, 0, 1, NULL); - stbtt_PackFontRange(&pc, ttf_buffer, 0, 24.0, 32, 95, chardata[0]+32); - stbtt_PackSetOversampling(&pc, 2, 2); - stbtt_PackFontRange(&pc, ttf_buffer, 0, 24.0, 32, 95, chardata[1]+32); - stbtt_PackSetOversampling(&pc, 3, 1); - stbtt_PackFontRange(&pc, ttf_buffer, 0, 24.0, 32, 95, chardata[2]+32); + for (i=0; i < 2; ++i) { + stbtt_PackSetOversampling(&pc, 1, 1); + stbtt_PackFontRange(&pc, ttf_buffer, 0, scale[i], 32, 95, chardata[i*3+0]+32); + stbtt_PackSetOversampling(&pc, 2, 2); + stbtt_PackFontRange(&pc, ttf_buffer, 0, scale[i], 32, 95, chardata[i*3+1]+32); + stbtt_PackSetOversampling(&pc, 3, 1); + stbtt_PackFontRange(&pc, ttf_buffer, 0, scale[i], 32, 95, chardata[i*3+2]+32); + } stbtt_PackEnd(&pc); glGenTextures(1, &font_tex); @@ -58,6 +77,8 @@ void load_fonts(void) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } +int black_on_white; + void draw_init(void) { glDisable(GL_CULL_FACE); @@ -66,7 +87,10 @@ void draw_init(void) glDisable(GL_DEPTH_TEST); glViewport(0,0,sx,sy); - glClearColor(0,0,0,0); + if (black_on_white) + glClearColor(255,255,255,0); + else + glClearColor(0,0,0,0); glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJECTION); @@ -100,41 +124,64 @@ void print(float x, float y, int font, char *text) glEnd(); } -int font=0; +int font=3; int translating; int rotating=0; +int srgb=0; float rotate_t, translate_t; int show_tex; void draw_world(void) { + int sfont = sf[font]; float x = 20; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glColor3f(1,1,1); - if (font==1) - print(100, 50, font, "2x2 oversampled text at 1:1"); - else if (font == 2) - print(100, 50, font, "3x1 oversampled text at 1:1"); - else if (integer_align) - print(100, 50, font, "1:1 text, one texel = one pixel, snapped to integer coordinates"); + if (black_on_white) + glColor3f(0,0,0); else - print(100, 50, font, "1:1 text, one texel = one pixel"); + glColor3f(1,1,1); - print(100, 80, font, "O: toggle oversampling"); - print(100,105, font, "T: toggle translation"); - print(100,130, font, "R: toggle rotation"); - print(100,155, font, "P: toggle pixel-snap (only non-oversampled)"); - print(100,180, font, "V: view font texture"); + + print(80, 30, sfont, "Controls:"); + print(100, 60, sfont, "S: toggle font size"); + print(100, 85, sfont, "O: toggle oversampling"); + print(100,110, sfont, "T: toggle translation"); + print(100,135, sfont, "R: toggle rotation"); + print(100,160, sfont, "P: toggle pixel-snap (only non-oversampled)"); + print(100,185, sfont, "G: toggle srgb gamma-correction"); + if (black_on_white) + print(100,210, sfont, "B: toggle to white-on-black"); + else + print(100,210, sfont, "B: toggle to black-on-white"); + print(100,235, sfont, "V: view font texture"); + + print(80, 300, sfont, "Current font:"); + + if (!show_tex) { + if (font < 3) + print(100, 350, sfont, "Font height: 24 pixels"); + else + print(100, 350, sfont, "Font height: 14 pixels"); + } + + if (font%3==1) + print(100, 325, sfont, "2x2 oversampled text at 1:1"); + else if (font%3 == 2) + print(100, 325, sfont, "3x1 oversampled text at 1:1"); + else if (integer_align) + print(100, 325, sfont, "1:1 text, one texel = one pixel, snapped to integer coordinates"); + else + print(100, 325, sfont, "1:1 text, one texel = one pixel"); if (show_tex) { glBegin(GL_QUADS); - drawBoxTC(200,200, 200+BITMAP_W,200+BITMAP_H, 0,0,1,1); + drawBoxTC(200,400, 200+BITMAP_W,300+BITMAP_H, 0,0,1,1); glEnd(); } else { glMatrixMode(GL_MODELVIEW); - glTranslatef(200,250,0); + glTranslatef(200,350,0); if (translating) x += fmod(translate_t*8,30); @@ -198,7 +245,10 @@ int winproc(void *data, stbwingraph_event *e) return STBWINGRAPH_winproc_exit; break; case 'o': case 'O': - font = (font+1) % 3; + font = (font+1) % 3 + (font/3)*3; + break; + case 's': case 'S': + font = (font+3) % 6; break; case 't': case 'T': translating = !translating; @@ -211,9 +261,19 @@ int winproc(void *data, stbwingraph_event *e) case 'p': case 'P': integer_align = !integer_align; break; + case 'g': case 'G': + srgb = !srgb; + if (srgb) + glEnable(GL_FRAMEBUFFER_SRGB_EXT); + else + glDisable(GL_FRAMEBUFFER_SRGB_EXT); + break; case 'v': case 'V': show_tex = !show_tex; break; + case 'b': case 'B': + black_on_white = !black_on_white; + break; } break; diff --git a/tests/oversample/oversample.exe b/tests/oversample/oversample.exe new file mode 100644 index 0000000000000000000000000000000000000000..004069318671fd3a7d13d393cd70a9c7b77a2207 GIT binary patch literal 54272 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\-(aEl(~6QB;ZpG>kn>^Ha6=B3)9zXH``ux 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 GTF?Ob0~1mJ literal 0 HcmV?d00001 diff --git a/tests/oversample/stb_wingraph.h b/tests/oversample/stb_wingraph.h index d48065f..ee16923 100644 --- a/tests/oversample/stb_wingraph.h +++ b/tests/oversample/stb_wingraph.h @@ -791,6 +791,8 @@ void stbwingraph_SwapBuffers(void *win) #ifdef STB_WINMAIN void stbwingraph_main(void); +char *stb_wingraph_commandline; + int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { { @@ -808,6 +810,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine else if (strstr(buffer, " -full ") || strstr(buffer, " -fullscreen ")) stbwingraph_request_fullscreen = TRUE; } + stb_wingraph_commandline = lpCmdLine; stbwingraph_DefineClass(hInstance, "appicon"); stbwingraph_main();