Mygui中文换行问题(五)

2014-11-24 09:03:06 · 作者: · 浏览: 5
float char_bearingY = info->bearingY;

if (_height != font_height)
{
float scale = (float)_height / font_height;

char_width *= scale;
char_height *= scale;
char_advance *= scale;
char_bearingX *= scale;
char_bearingY *= scale;
}

float char_fullAdvance = char_bearingX + char_advance;

// перенос слов
if (_maxWidth != -1
&& (width + char_fullAdvance) > _maxWidth
/*&& !roll_back.empty()*/)
{
--index;
// откатываем до последнего пробела
/*width = roll_back.getWidth();
count = roll_back.getCount();
index = roll_back.getTextIter();
line_info.simbols.erase(line_info.simbols.begin() + roll_back.getPosition(), line_info.simbols.end());*/

// запоминаем место отката, как полную строку
/*line_info.width = (int)ceil(width);
line_info.count = count;
mLength += line_info.count + 1;

result.height += _height;
setMax(result.width, line_info.width);
width = 0;
count = 0;

mLineInfo.push_back(line_info);
line_info.clear();*/

// запоминаем место отката, как полную строку
line_info.width = (int)ceil(width);
line_info.count = count;
line_info.offcount = 0;
mLength += line_info.count;// + 1;

result.height += _height;
setMax(result.width, line_info.width);
width = 0;
count = 0;

mLineInfo.push_back(line_info);
line_info.clear();


// отменяем откат
roll_back.clear();

continue;
}

line_info.simbols.push_back(CharInfo(info->uvRect, char_width, char_height, char_advance, char_bearingX, char_bearingY));
width += char_fullAdvance;
count ++;
}

line_info.width = (int)ceil(width);
line_info.count = count;
mLength += line_info.count;

mLineInfo.push_back(line_info);

setMax(result.width, line_info.width);

// теперь выравниванием строки
for (VectorLineInfo::iterator line = mLineInfo.begin(); line != mLineInfo.end(); ++line)
{
if (_align.isRight())
line->offset = result.width - line->width;
else if (_align.isHCenter())
line->offset = (result.width - line->width) / 2;
}

mViewSize = result;
}

size_t TextView::getCursorPosition(const IntPoint& _value)
{
const int height = mFontHeight;
size_t result = 0;
int top = 0;

for (VectorLineInfo::const_iterator line = mLineInfo.begin(); line != mLineInfo.end(); ++line)
{
// это последняя строка
bool lastline = !(line + 1 != mLineInfo.end());

// наша строчка
if (top + height > _value.top || lastline)