mirror of https://github.com/nothings/stb.git
stb_truetype:
STBTT_POINT_SIZE documentation for above stb_rect_pack: STBRP_ASSERT
This commit is contained in:
parent
27974c42f9
commit
97037461d9
|
@ -22,6 +22,7 @@
|
||||||
//
|
//
|
||||||
// Version history:
|
// Version history:
|
||||||
//
|
//
|
||||||
|
// 0.05: added STBRP_ASSERT to allow replacing assert
|
||||||
// 0.04: fixed minor bug in STBRP_LARGE_RECTS support
|
// 0.04: fixed minor bug in STBRP_LARGE_RECTS support
|
||||||
// 0.01: initial release
|
// 0.01: initial release
|
||||||
|
|
||||||
|
@ -169,7 +170,11 @@ struct stbrp_context
|
||||||
|
|
||||||
#ifdef STB_RECT_PACK_IMPLEMENTATION
|
#ifdef STB_RECT_PACK_IMPLEMENTATION
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#ifndef STBRP_ASSERT
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#define STBRP_ASSERT assert
|
||||||
|
#endif
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -180,11 +185,11 @@ STBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic)
|
||||||
{
|
{
|
||||||
switch (context->init_mode) {
|
switch (context->init_mode) {
|
||||||
case STBRP__INIT_skyline:
|
case STBRP__INIT_skyline:
|
||||||
assert(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight);
|
STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight);
|
||||||
context->heuristic = heuristic;
|
context->heuristic = heuristic;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(0);
|
STBRP_ASSERT(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,7 +217,7 @@ STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height,
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
#ifndef STBRP_LARGE_RECTS
|
#ifndef STBRP_LARGE_RECTS
|
||||||
assert(width <= 0xffff && height <= 0xffff);
|
STBRP_ASSERT(width <= 0xffff && height <= 0xffff);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (i=0; i < num_nodes-1; ++i)
|
for (i=0; i < num_nodes-1; ++i)
|
||||||
|
@ -246,17 +251,17 @@ static int stbrp__skyline_find_min_y(stbrp_context *c, stbrp_node *first, int x0
|
||||||
stbrp_node *node = first;
|
stbrp_node *node = first;
|
||||||
int x1 = x0 + width;
|
int x1 = x0 + width;
|
||||||
int min_y, visited_width, waste_area;
|
int min_y, visited_width, waste_area;
|
||||||
assert(first->x <= x0);
|
STBRP_ASSERT(first->x <= x0);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// skip in case we're past the node
|
// skip in case we're past the node
|
||||||
while (node->next->x <= x0)
|
while (node->next->x <= x0)
|
||||||
++node;
|
++node;
|
||||||
#else
|
#else
|
||||||
assert(node->next->x > x0); // we ended up handling this in the caller for efficiency
|
STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
assert(node->x <= x0);
|
STBRP_ASSERT(node->x <= x0);
|
||||||
|
|
||||||
min_y = 0;
|
min_y = 0;
|
||||||
waste_area = 0;
|
waste_area = 0;
|
||||||
|
@ -303,7 +308,7 @@ static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int widt
|
||||||
// align to multiple of c->align
|
// align to multiple of c->align
|
||||||
width = (width + c->align - 1);
|
width = (width + c->align - 1);
|
||||||
width -= width % c->align;
|
width -= width % c->align;
|
||||||
assert(width % c->align == 0);
|
STBRP_ASSERT(width % c->align == 0);
|
||||||
|
|
||||||
node = c->active_head;
|
node = c->active_head;
|
||||||
prev = &c->active_head;
|
prev = &c->active_head;
|
||||||
|
@ -360,19 +365,19 @@ static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int widt
|
||||||
while (tail) {
|
while (tail) {
|
||||||
int xpos = tail->x - width;
|
int xpos = tail->x - width;
|
||||||
int y,waste;
|
int y,waste;
|
||||||
assert(xpos >= 0);
|
STBRP_ASSERT(xpos >= 0);
|
||||||
// find the left position that matches this
|
// find the left position that matches this
|
||||||
while (node->next->x <= xpos) {
|
while (node->next->x <= xpos) {
|
||||||
prev = &node->next;
|
prev = &node->next;
|
||||||
node = node->next;
|
node = node->next;
|
||||||
}
|
}
|
||||||
assert(node->next->x > xpos && node->x <= xpos);
|
STBRP_ASSERT(node->next->x > xpos && node->x <= xpos);
|
||||||
y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste);
|
y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste);
|
||||||
if (y + height < c->height) {
|
if (y + height < c->height) {
|
||||||
if (y <= best_y) {
|
if (y <= best_y) {
|
||||||
if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) {
|
if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) {
|
||||||
best_x = xpos;
|
best_x = xpos;
|
||||||
assert(y <= best_y);
|
STBRP_ASSERT(y <= best_y);
|
||||||
best_y = y;
|
best_y = y;
|
||||||
best_waste = waste;
|
best_waste = waste;
|
||||||
best = prev;
|
best = prev;
|
||||||
|
@ -444,10 +449,10 @@ static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, i
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
cur = context->active_head;
|
cur = context->active_head;
|
||||||
while (cur->x < context->width) {
|
while (cur->x < context->width) {
|
||||||
assert(cur->x < cur->next->x);
|
STBRP_ASSERT(cur->x < cur->next->x);
|
||||||
cur = cur->next;
|
cur = cur->next;
|
||||||
}
|
}
|
||||||
assert(cur->next == NULL);
|
STBRP_ASSERT(cur->next == NULL);
|
||||||
|
|
||||||
{
|
{
|
||||||
stbrp_node *L1 = NULL, *L2 = NULL;
|
stbrp_node *L1 = NULL, *L2 = NULL;
|
||||||
|
@ -464,7 +469,7 @@ static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, i
|
||||||
cur = cur->next;
|
cur = cur->next;
|
||||||
++count;
|
++count;
|
||||||
}
|
}
|
||||||
assert(count == context->num_nodes+2);
|
STBRP_ASSERT(count == context->num_nodes+2);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -514,7 +519,7 @@ STBRP_DEF void stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int n
|
||||||
for (i=0; i < num_rects; ++i) {
|
for (i=0; i < num_rects; ++i) {
|
||||||
rects[i].was_packed = i;
|
rects[i].was_packed = i;
|
||||||
#ifndef STBRP_LARGE_RECTS
|
#ifndef STBRP_LARGE_RECTS
|
||||||
assert(rects[i].w <= 0xffff && rects[i].h <= 0xffff);
|
STBRP_ASSERT(rects[i].w <= 0xffff && rects[i].h <= 0xffff);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,8 @@
|
||||||
//
|
//
|
||||||
// VERSION HISTORY
|
// VERSION HISTORY
|
||||||
//
|
//
|
||||||
|
// 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match
|
||||||
|
// non-oversampled; STBTT_POINT_SIZE for packed case only
|
||||||
// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling
|
// 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.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.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID
|
||||||
|
@ -490,13 +492,6 @@ typedef struct
|
||||||
} stbtt_packedchar;
|
} stbtt_packedchar;
|
||||||
|
|
||||||
typedef struct stbtt_pack_context stbtt_pack_context;
|
typedef struct stbtt_pack_context stbtt_pack_context;
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
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 width, int height, int stride_in_bytes, int padding, void *alloc_context);
|
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.
|
// Initializes a packing context stored in the passed-in stbtt_pack_context.
|
||||||
|
@ -512,13 +507,30 @@ extern int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int
|
||||||
extern void stbtt_PackEnd (stbtt_pack_context *spc);
|
extern void stbtt_PackEnd (stbtt_pack_context *spc);
|
||||||
// Cleans up the packing context and frees all memory.
|
// 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,
|
#define STBTT_POINT_SIZE(x) (-(x))
|
||||||
|
|
||||||
|
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);
|
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
|
// 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
|
// 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
|
// 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;
|
// and increasing. Data for how to render them is stored in chardata_for_range;
|
||||||
// pass these to stbtt_GetPackedQuad to get back renderable quads.
|
// pass these to stbtt_GetPackedQuad to get back renderable quads.
|
||||||
|
//
|
||||||
|
// font_size is the full height of the character from ascender to descender,
|
||||||
|
// as computed by stbtt_ScaleForPixelHeight. To use a point size as computed
|
||||||
|
// by stbtt_ScaleForMappingEmToPixels, wrap the point size in STBTT_POINT_SIZE()
|
||||||
|
// and pass that result as 'font_size':
|
||||||
|
// ..., 20 , ... // font max minus min y is 20 pixels tall
|
||||||
|
// ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
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_PackFontRanges(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges);
|
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
|
// Creates character bitmaps from multiple ranges of characters stored in
|
||||||
|
|
Loading…
Reference in New Issue