44 for (VectorRangeInfo::iterator iter=mVectorRangeInfo.begin(); iter!=mVectorRangeInfo.end(); ++iter)
47 if (info ==
nullptr)
continue;
51 return &mSpaceGlyphInfo;
54 void ResourceManualFont::checkTexture()
56 if (mTexture ==
nullptr)
60 if (mTexture ==
nullptr)
68 void ResourceManualFont::addGlyph(GlyphInfo * _info,
Char _index,
int _left,
int _top,
int _right,
int _bottom,
int _finalw,
int _finalh,
float _aspect,
int _addHeight)
70 _info->codePoint = _index;
71 _info->uvRect.left = (float)_left / (
float)_finalw;
72 _info->uvRect.top = (float)(_top + _addHeight) / (float)_finalh;
73 _info->uvRect.right = (float)( _right ) / (float)_finalw;
74 _info->uvRect.bottom = ( _bottom + _addHeight ) / (
float)_finalh;
75 _info->width = _right - _left;
78 void ResourceManualFont::addGlyph(
Char _code,
const IntCoord& _coord)
80 mVectorPairCodeCoord.push_back(PairCodeCoord(_code, _coord));
83 void ResourceManualFont::initialise()
85 if (mVectorPairCodeCoord.empty())
return;
87 std::sort(mVectorPairCodeCoord.begin(), mVectorPairCodeCoord.end());
90 float aspect = (float)size.width / (
float)size.height;
92 Char code = mVectorPairCodeCoord.front().code;
93 size_t count = mVectorPairCodeCoord.size();
96 for (
size_t pos=1; pos<count; ++pos)
99 if (code + 1 != mVectorPairCodeCoord[pos].code)
101 addRange(mVectorPairCodeCoord, first, pos-1, size.width, size.height, aspect);
102 code = mVectorPairCodeCoord[pos].code;
111 addRange(mVectorPairCodeCoord, first, count-1, size.width, size.height, aspect);
114 VectorPairCodeCoord tmp;
115 std::swap(tmp, mVectorPairCodeCoord);
120 void ResourceManualFont::addRange(VectorPairCodeCoord& _info,
size_t _first,
size_t _last,
int _width,
int _height,
float _aspect)
122 RangeInfo range = RangeInfo(_info[_first].code, _info[_last].code);
124 for (
size_t pos=_first; pos<=_last; ++pos)
126 GlyphInfo * info = range.getInfo(_info[pos].code);
127 const IntCoord& coord = _info[pos].coord;
128 addGlyph(info, _info[pos].code, coord.left, coord.top, coord.right(), coord.bottom(), _width, _height, _aspect);
131 mSpaceGlyphInfo = *info;
134 mVectorRangeInfo.push_back(range);
144 if (node->
getName() ==
"Property")
148 if (key ==
"Source") mSource = value;
151 else if (node->
getName() ==
"Codes")
154 while (range.
next(
"Code"))
156 std::string range_value;
157 std::vector<std::string> parse_range;
162 if (range_value ==
"cursor")
164 else if (range_value ==
"selected")
166 else if (range_value ==
"selected_back")
171 addGlyph(
id, utility::parseValue<IntCoord>(range->
findAttribute(
"coord")));