mirror of https://github.com/buggins/dlangui.git
optimization: memoize textSize and convertColors functions
This commit is contained in:
parent
47610bb9f4
commit
1672b644cd
|
@ -74,11 +74,11 @@ enum FontWeight : int {
|
|||
Bold = 800
|
||||
}
|
||||
|
||||
immutable dchar UNICODE_SOFT_HYPHEN_CODE = 0x00ad;
|
||||
immutable dchar UNICODE_ZERO_WIDTH_SPACE = 0x200b;
|
||||
immutable dchar UNICODE_NO_BREAK_SPACE = 0x00a0;
|
||||
immutable dchar UNICODE_HYPHEN = 0x2010;
|
||||
immutable dchar UNICODE_NB_HYPHEN = 0x2011;
|
||||
enum dchar UNICODE_SOFT_HYPHEN_CODE = 0x00ad;
|
||||
enum dchar UNICODE_ZERO_WIDTH_SPACE = 0x200b;
|
||||
enum dchar UNICODE_NO_BREAK_SPACE = 0x00a0;
|
||||
enum dchar UNICODE_HYPHEN = 0x2010;
|
||||
enum dchar UNICODE_NB_HYPHEN = 0x2011;
|
||||
|
||||
/// custom character properties - for char-by-char drawing of text string with different character color and style
|
||||
struct CustomCharProps {
|
||||
|
@ -124,7 +124,7 @@ static if (ENABLE_OPENGL) {
|
|||
}
|
||||
|
||||
/// constant for measureText maxWidth paramenter - to tell that all characters of text string should be measured.
|
||||
immutable int MAX_WIDTH_UNSPECIFIED = int.max;
|
||||
enum int MAX_WIDTH_UNSPECIFIED = int.max;
|
||||
|
||||
/** Instance of font with specific size, weight, face, etc.
|
||||
*
|
||||
|
@ -322,13 +322,20 @@ class Font : RefCountedObject {
|
|||
* tabOffset = when string is drawn not from left position, use to move tab stops left/right
|
||||
* textFlags = TextFlag bit set - to control underline, hotkey label processing, etc...
|
||||
************************************************************************/
|
||||
Point textSize(const dchar[] text, int maxWidth = MAX_WIDTH_UNSPECIFIED, int tabSize = 4, int tabOffset = 0, uint textFlags = 0) {
|
||||
if (_textSizeBuffer.length < text.length + 1)
|
||||
_textSizeBuffer.length = text.length + 1;
|
||||
int charsMeasured = measureText(text, _textSizeBuffer, maxWidth, tabSize, tabOffset, textFlags);
|
||||
Point textSize(dstring text, int maxWidth = MAX_WIDTH_UNSPECIFIED, int tabSize = 4, int tabOffset = 0, uint textFlags = 0) {
|
||||
return textSizeMemoized(this, text, maxWidth, tabSize, tabOffset, textFlags);
|
||||
}
|
||||
|
||||
import std.functional;
|
||||
alias textSizeMemoized = memoize!(Font.textSizeImpl);
|
||||
|
||||
static Point textSizeImpl(Font font, const dchar[] text, int maxWidth = MAX_WIDTH_UNSPECIFIED, int tabSize = 4, int tabOffset = 0, uint textFlags = 0) {
|
||||
if (font._textSizeBuffer.length < text.length + 1)
|
||||
font._textSizeBuffer.length = text.length + 1;
|
||||
int charsMeasured = font.measureText(text, font._textSizeBuffer, maxWidth, tabSize, tabOffset, textFlags);
|
||||
if (charsMeasured < 1)
|
||||
return Point(0,0);
|
||||
return Point(_textSizeBuffer[charsMeasured - 1], height);
|
||||
return Point(font._textSizeBuffer[charsMeasured - 1], font.height);
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
|
|
|
@ -622,7 +622,11 @@ private void FillColor(uint color, Color[] buf_slice) {
|
|||
}
|
||||
}
|
||||
|
||||
private float[] convertColors(uint[] cols) pure nothrow {
|
||||
|
||||
import std.functional;
|
||||
alias convertColors = memoize!(convertColorsImpl);
|
||||
|
||||
float[] convertColorsImpl(uint[] cols) pure nothrow {
|
||||
float[] colors;
|
||||
colors.length = cols.length * 4;
|
||||
foreach(i; 0 .. cols.length) {
|
||||
|
|
Loading…
Reference in New Issue