|
|
@@ -2549,6 +2549,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) |
|
|
@@ -2616,7 +2617,10 @@ 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) |
|
|
|
type = NVG_CJK_CHAR; |
|
|
|
else |
|
|
|
type = NVG_CHAR; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
@@ -2643,7 +2647,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; |
|
|
@@ -2663,26 +2667,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 && 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) { |
|
|
|
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. |
|
|
|