📄 gnewfont_tge.cc
字号:
//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
#include "platform/platform.h"
#include "platform/platformFont.h"
#include "platform/profiler.h"
#include "platform/platformMutex.h"
#include "console/console.h"
#include "core/stream.h"
#include "dgl/gBitmap.h"
#include "core/fileStream.h"
#include "core/findMatch.h"
#include "dgl/gTexManager.h"
#include "dgl/gNewFont.h"
#include "util/safeDelete.h"
#include "core/frameAllocator.h"
#include "core/unicode.h"
#include "zlib.h"
//////////////////////////////////////////////////////////////////////////
/// Chinese
#ifndef TGE_CHINESE
//////////////////////////////////////////////////////////////////////////
U32 GFont::getStrNWidth(const UTF8 *str, U32 n)
{
// UTF8 conversion is expensive. Avoid converting in a tight loop.
FrameTemp<UTF16> str16(n + 1);
convertUTF8toUTF16(str, str16, n);
return getStrNWidth(str16, n);
}
U32 GFont::getStrNWidth(const UTF16 *str, U32 n)
{
AssertFatal(str != NULL, "GFont::getStrNWidth: String is NULL");
if (str == NULL || str[0] == NULL || n == 0)
return 0;
U32 totWidth = 0;
UTF16 curChar;
U32 charCount;
for(charCount = 0; charCount <= n; charCount++)
{
curChar = str[charCount];
if(curChar == NULL)
break;
if(isValidChar(curChar))
{
const PlatformFont::CharInfo& rChar = getCharInfo(curChar);
totWidth += rChar.xIncrement;
}
else if (curChar == dT('\t'))
{
const PlatformFont::CharInfo& rChar = getCharInfo(dT(' '));
totWidth += rChar.xIncrement * TabWidthInSpaces;
}
}
return(totWidth);
}
U32 GFont::getStrNWidthPrecise(const UTF8 *str, U32 n)
{
FrameTemp<UTF16> str16(n + 1);
convertUTF8toUTF16(str, str16, n);
return getStrNWidthPrecise(str16, n);
}
U32 GFont::getStrNWidthPrecise(const UTF16 *str, U32 n)
{
AssertFatal(str != NULL, "GFont::getStrNWidth: String is NULL");
if (str == NULL || str[0] == NULL || n == 0)
return(0);
U32 totWidth = 0;
UTF16 curChar;
U32 charCount = 0;
for(charCount = 0; charCount < n; charCount++)
{
curChar = str[charCount];
if(curChar == NULL)
break;
if(isValidChar(curChar))
{
const PlatformFont::CharInfo& rChar = getCharInfo(curChar);
totWidth += rChar.xIncrement;
}
else if (curChar == dT('\t'))
{
const PlatformFont::CharInfo& rChar = getCharInfo(dT(' '));
totWidth += rChar.xIncrement * TabWidthInSpaces;
}
}
UTF16 endChar = str[getMin(charCount,n-1)];
if (isValidChar(endChar))
{
const PlatformFont::CharInfo& rChar = getCharInfo(endChar);
if (rChar.width > rChar.xIncrement)
totWidth += (rChar.width - rChar.xIncrement);
}
return(totWidth);
}
U32 GFont::getBreakPos(const UTF8 *string, U32 slen, U32 width, bool breakOnWhitespace)
{
// Some early out cases.
if(slen==0)
return 0;
U32 ret = 0;
U32 lastws = 0;
UTF16 c;
U32 charCount = 0;
// convert the buffer to utf16, converter will give us the length.
FrameTemp<UTF16> str16(slen);
U32 len16 = convertUTF8toUTF16(string, str16, slen);
for( charCount=0; charCount < len16; charCount++)
{
c = str16[charCount];
if(c == NULL)
break;
if(c == dT('\t'))
c = dT(' ');
if(!isValidChar(c))
{
ret++;
continue;
}
if(c == dT(' '))
lastws = ret+1;
const PlatformFont::CharInfo& rChar = getCharInfo(c);
if(rChar.width > width || rChar.xIncrement > width)
{
if(lastws && breakOnWhitespace)
return lastws;
return ret;
}
width -= rChar.xIncrement;
ret++;
}
return ret;
}
void GFont::wrapString(const UTF8 *txt, U32 lineWidth, Vector<U32> &startLineOffset, Vector<U32> &lineLen)
{
Con::errorf("GFont::wrapString(): Not yet converted to be UTF-8 safe");
startLineOffset.clear();
lineLen.clear();
if (!txt || !txt[0] || lineWidth < getCharWidth('W')) //make sure the line width is greater then a single character
return;
U32 len = dStrlen(txt);
U32 startLine;
for (U32 i = 0; i < len;)
{
startLine = i;
startLineOffset.push_back(startLine);
// loop until the string is too large
bool needsNewLine = false;
U32 lineStrWidth = 0;
for (; i < len; i++)
{
if(isValidChar(txt[i]))
{
lineStrWidth += getCharInfo(txt[i]).xIncrement;
if ( txt[i] == '\n' || lineStrWidth > lineWidth )
{
needsNewLine = true;
break;
}
}
}
if (!needsNewLine)
{
// we are done!
lineLen.push_back(i - startLine);
return;
}
// now determine where to put the newline
// else we need to backtrack until we find a either space character
// or \\ character to break up the line.
S32 j;
for (j = i - 1; j >= startLine; j--)
{
if (dIsspace(txt[j]))
break;
}
if (j < startLine)
{
// the line consists of a single word!
// So, just break up the word
j = i - 1;
}
lineLen.push_back(j - startLine);
i = j;
// now we need to increment through any space characters at the
// beginning of the next line
for (i++; i < len; i++)
{
if (!dIsspace(txt[i]) || txt[i] == '\n')
break;
}
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -