mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-17 20:52:36 +01:00
Updates NanoVG to the latest commit.
This commit pulls more changes that was not included in #1088.
This commit is contained in:
@@ -83,7 +83,7 @@ typedef struct FONStextIter FONStextIter;
|
||||
|
||||
typedef struct FONScontext FONScontext;
|
||||
|
||||
// Contructor and destructor.
|
||||
// Constructor and destructor.
|
||||
FONScontext* fonsCreateInternal(FONSparams* params);
|
||||
void fonsDeleteInternal(FONScontext* s);
|
||||
|
||||
@@ -92,7 +92,7 @@ void fonsSetErrorCallback(FONScontext* s, void (*callback)(void* uptr, int error
|
||||
void fonsGetAtlasSize(FONScontext* s, int* width, int* height);
|
||||
// Expands the atlas size.
|
||||
int fonsExpandAtlas(FONScontext* s, int width, int height);
|
||||
// Reseta the whole stash.
|
||||
// Resets the whole stash.
|
||||
int fonsResetAtlas(FONScontext* stash, int width, int height);
|
||||
|
||||
// Add fonts
|
||||
@@ -1045,6 +1045,7 @@ static FONSglyph* fons__getGlyph(FONScontext* stash, FONSfont* font, unsigned in
|
||||
int pad, added;
|
||||
unsigned char* bdst;
|
||||
unsigned char* dst;
|
||||
FONSfont* renderFont = font;
|
||||
|
||||
if (isize < 2) return NULL;
|
||||
if (iblur > 20) iblur = 20;
|
||||
@@ -1063,18 +1064,23 @@ static FONSglyph* fons__getGlyph(FONScontext* stash, FONSfont* font, unsigned in
|
||||
}
|
||||
|
||||
// Could not find glyph, create it.
|
||||
scale = fons__tt_getPixelHeightScale(&font->font, size);
|
||||
g = fons__tt_getGlyphIndex(&font->font, codepoint);
|
||||
// Try to find the glyph in fallback fonts.
|
||||
if (g == 0) {
|
||||
for (i = 0; i < font->nfallbacks; ++i) {
|
||||
FONSglyph* fallbackGlyph = fons__getGlyph(stash, stash->fonts[font->fallbacks[i]], codepoint, isize, iblur);
|
||||
if (fallbackGlyph != NULL && fallbackGlyph->index != 0) {
|
||||
return fallbackGlyph;
|
||||
FONSfont* fallbackFont = stash->fonts[font->fallbacks[i]];
|
||||
int fallbackIndex = fons__tt_getGlyphIndex(&fallbackFont->font, codepoint);
|
||||
if (fallbackIndex != 0) {
|
||||
g = fallbackIndex;
|
||||
renderFont = fallbackFont;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// It is possible that we did not find a fallback glyph.
|
||||
// In that case the glyph index 'g' is 0, and we'll proceed below and cache empty glyph.
|
||||
}
|
||||
fons__tt_buildGlyphBitmap(&font->font, g, size, scale, &advance, &lsb, &x0, &y0, &x1, &y1);
|
||||
scale = fons__tt_getPixelHeightScale(&renderFont->font, size);
|
||||
fons__tt_buildGlyphBitmap(&renderFont->font, g, size, scale, &advance, &lsb, &x0, &y0, &x1, &y1);
|
||||
gw = x1-x0 + pad*2;
|
||||
gh = y1-y0 + pad*2;
|
||||
|
||||
@@ -1108,7 +1114,7 @@ static FONSglyph* fons__getGlyph(FONScontext* stash, FONSfont* font, unsigned in
|
||||
|
||||
// Rasterize
|
||||
dst = &stash->texData[(glyph->x0+pad) + (glyph->y0+pad) * stash->params.width];
|
||||
fons__tt_renderGlyphBitmap(&font->font, dst, gw-pad*2,gh-pad*2, stash->params.width, scale,scale, g);
|
||||
fons__tt_renderGlyphBitmap(&renderFont->font, dst, gw-pad*2,gh-pad*2, stash->params.width, scale,scale, g);
|
||||
|
||||
// Make sure there is one pixel empty border.
|
||||
dst = &stash->texData[glyph->x0 + glyph->y0 * stash->params.width];
|
||||
|
||||
@@ -257,10 +257,14 @@ static void nvg__setDevicePixelRatio(NVGcontext* ctx, float ratio)
|
||||
|
||||
static NVGcompositeOperationState nvg__compositeOperationState(int op)
|
||||
{
|
||||
int sfactor = NVG_ONE;
|
||||
int dfactor = NVG_ONE_MINUS_SRC_ALPHA;
|
||||
int sfactor, dfactor;
|
||||
|
||||
if (op == NVG_SOURCE_IN)
|
||||
if (op == NVG_SOURCE_OVER)
|
||||
{
|
||||
sfactor = NVG_ONE;
|
||||
dfactor = NVG_ONE_MINUS_SRC_ALPHA;
|
||||
}
|
||||
else if (op == NVG_SOURCE_IN)
|
||||
{
|
||||
sfactor = NVG_DST_ALPHA;
|
||||
dfactor = NVG_ZERO;
|
||||
@@ -310,6 +314,11 @@ static NVGcompositeOperationState nvg__compositeOperationState(int op)
|
||||
sfactor = NVG_ONE_MINUS_DST_ALPHA;
|
||||
dfactor = NVG_ONE_MINUS_SRC_ALPHA;
|
||||
}
|
||||
else
|
||||
{
|
||||
sfactor = NVG_ONE;
|
||||
dfactor = NVG_ZERO;
|
||||
}
|
||||
|
||||
NVGcompositeOperationState state;
|
||||
state.srcRGB = sfactor;
|
||||
@@ -507,7 +516,7 @@ NVGcolor nvgLerpRGBA(NVGcolor c0, NVGcolor c1, float u)
|
||||
{
|
||||
int i;
|
||||
float oneminu;
|
||||
NVGcolor cint;
|
||||
NVGcolor cint = {{{0}}};
|
||||
|
||||
u = nvg__clampf(u, 0.0f, 1.0f);
|
||||
oneminu = 1.0f - u;
|
||||
@@ -2595,6 +2604,7 @@ enum NVGcodepointType {
|
||||
NVG_SPACE,
|
||||
NVG_NEWLINE,
|
||||
NVG_CHAR,
|
||||
NVG_CJK_CHAR,
|
||||
};
|
||||
|
||||
int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, float breakRowWidth, NVGtextRow* rows, int maxRows)
|
||||
@@ -2662,7 +2672,15 @@ int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, floa
|
||||
type = NVG_NEWLINE;
|
||||
break;
|
||||
default:
|
||||
type = NVG_CHAR;
|
||||
if ((iter.codepoint >= 0x4E00 && iter.codepoint <= 0x9FFF) ||
|
||||
(iter.codepoint >= 0x3000 && iter.codepoint <= 0x30FF) ||
|
||||
(iter.codepoint >= 0xFF00 && iter.codepoint <= 0xFFEF) ||
|
||||
(iter.codepoint >= 0x1100 && iter.codepoint <= 0x11FF) ||
|
||||
(iter.codepoint >= 0x3130 && iter.codepoint <= 0x318F) ||
|
||||
(iter.codepoint >= 0xAC00 && iter.codepoint <= 0xD7AF))
|
||||
type = NVG_CJK_CHAR;
|
||||
else
|
||||
type = NVG_CHAR;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2689,7 +2707,7 @@ int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, floa
|
||||
} else {
|
||||
if (rowStart == NULL) {
|
||||
// Skip white space until the beginning of the line
|
||||
if (type == NVG_CHAR) {
|
||||
if (type == NVG_CHAR || type == NVG_CJK_CHAR) {
|
||||
// The current char is the row so far
|
||||
rowStartX = iter.x;
|
||||
rowStart = iter.str;
|
||||
@@ -2709,26 +2727,26 @@ int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, floa
|
||||
float nextWidth = iter.nextx - rowStartX;
|
||||
|
||||
// track last non-white space character
|
||||
if (type == NVG_CHAR) {
|
||||
if (type == NVG_CHAR || type == NVG_CJK_CHAR) {
|
||||
rowEnd = iter.next;
|
||||
rowWidth = iter.nextx - rowStartX;
|
||||
rowMaxX = q.x1 - rowStartX;
|
||||
}
|
||||
// track last end of a word
|
||||
if (ptype == NVG_CHAR && type == NVG_SPACE) {
|
||||
if (((ptype == NVG_CHAR || ptype == NVG_CJK_CHAR) && type == NVG_SPACE) || type == NVG_CJK_CHAR) {
|
||||
breakEnd = iter.str;
|
||||
breakWidth = rowWidth;
|
||||
breakMaxX = rowMaxX;
|
||||
}
|
||||
// track last beginning of a word
|
||||
if (ptype == NVG_SPACE && type == NVG_CHAR) {
|
||||
if ((ptype == NVG_SPACE && (type == NVG_CHAR || type == NVG_CJK_CHAR)) || type == NVG_CJK_CHAR) {
|
||||
wordStart = iter.str;
|
||||
wordStartX = iter.x;
|
||||
wordMinX = q.x0 - rowStartX;
|
||||
}
|
||||
|
||||
// Break to new line when a character is beyond break width.
|
||||
if (type == NVG_CHAR && nextWidth > breakRowWidth) {
|
||||
if ((type == NVG_CHAR || type == NVG_CJK_CHAR) && nextWidth > breakRowWidth) {
|
||||
// The run length is too long, need to break to new line.
|
||||
if (breakEnd == rowStart) {
|
||||
// The current word is longer than the row length, just break it from here.
|
||||
|
||||
@@ -143,6 +143,7 @@ enum NVGimageFlags {
|
||||
NVG_IMAGE_REPEATY = 1<<2, // Repeat image in Y direction.
|
||||
NVG_IMAGE_FLIPY = 1<<3, // Flips (inverses) image in Y direction when rendered.
|
||||
NVG_IMAGE_PREMULTIPLIED = 1<<4, // Image data has premultiplied alpha.
|
||||
NVG_IMAGE_NEAREST = 1<<5, // Image interpolation is Nearest instead Linear
|
||||
};
|
||||
|
||||
// Begin drawing a new frame
|
||||
|
||||
Reference in New Issue
Block a user