本文整理汇总了C++中FontFace::GetGlyph方法的典型用法代码示例。如果您正苦于以下问题:C++ FontFace::GetGlyph方法的具体用法?C++ FontFace::GetGlyph怎么用?C++ FontFace::GetGlyph使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类FontFace
的用法示例。
在下文中一共展示了FontFace::GetGlyph方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: UpdateCharLocations
void Text::UpdateCharLocations()
{
// Remember the font face to see if it's still valid when it's time to render
FontFace* face = font_ ? font_->GetFace(fontSize_) : nullptr;
if (!face)
return;
fontFace_ = face;
auto rowHeight = RoundToInt(rowSpacing_ * rowHeight_);
// Store position & size of each character, and locations per texture page
unsigned numChars = unicodeText_.size();
charLocations_.resize(numChars + 1);
pageGlyphLocations_.resize(face->GetTextures().size());
for (unsigned i = 0; i < pageGlyphLocations_.size(); ++i)
pageGlyphLocations_[i].clear();
IntVector2 offset = font_->GetTotalGlyphOffset(fontSize_);
unsigned rowIndex = 0;
unsigned lastFilled = 0;
float x = Round(GetRowStartPosition(rowIndex) + offset.x_);
float y = Round(offset.y_);
for (unsigned i = 0; i < printText_.size(); ++i)
{
CharLocation loc;
loc.position_ = Vector2(x, y);
unsigned c = printText_[i];
if (c != '\n')
{
const FontGlyph* glyph = face->GetGlyph(c);
loc.size_ = Vector2(glyph ? glyph->advanceX_ : 0, rowHeight_);
if (glyph)
{
// Store glyph's location for rendering. Verify that glyph page is valid
if (glyph->page_ < pageGlyphLocations_.size())
pageGlyphLocations_[glyph->page_].push_back(GlyphLocation(x, y, glyph));
x += glyph->advanceX_;
if (i < printText_.size() - 1)
x += face->GetKerning(c, printText_[i + 1]);
}
}
else
{
loc.size_ = Vector2::ZERO;
x = GetRowStartPosition(++rowIndex);
y += rowHeight;
}
if (lastFilled > printToText_[i])
lastFilled = printToText_[i];
// Fill gaps in case characters were skipped from printing
for (unsigned j = lastFilled; j <= printToText_[i]; ++j)
charLocations_[j] = loc;
lastFilled = printToText_[i] + 1;
}
// Store the ending position
charLocations_[numChars].position_ = Vector2(x, y);
charLocations_[numChars].size_ = Vector2::ZERO;
charLocationsDirty_ = false;
}
示例2: GetBatches
void Text::GetBatches(ea::vector<UIBatch>& batches, ea::vector<float>& vertexData, const IntRect& currentScissor)
{
FontFace* face = font_ ? font_->GetFace(fontSize_) : nullptr;
if (!face)
{
hovering_ = false;
return;
}
// If face has changed or char locations are not valid anymore, update before rendering
if (charLocationsDirty_ || !fontFace_ || face != fontFace_)
UpdateCharLocations();
// If face uses mutable glyphs mechanism, reacquire glyphs before rendering to make sure they are in the texture
else if (face->HasMutableGlyphs())
{
for (unsigned i = 0; i < printText_.size(); ++i)
face->GetGlyph(printText_[i]);
}
// Hovering and/or whole selection batch
UISelectable::GetBatches(batches, vertexData, currentScissor);
// Partial selection batch
if (!selected_ && selectionLength_ && charLocations_.size() >= selectionStart_ + selectionLength_ && selectionColor_.a_ > 0.0f)
{
UIBatch batch(this, BLEND_ALPHA, currentScissor, nullptr, &vertexData);
batch.SetColor(selectionColor_);
Vector2 currentStart = charLocations_[selectionStart_].position_;
Vector2 currentEnd = currentStart;
for (unsigned i = selectionStart_; i < selectionStart_ + selectionLength_; ++i)
{
// Check if row changes, and start a new quad in that case
if (charLocations_[i].size_ != Vector2::ZERO)
{
if (charLocations_[i].position_.y_ != currentStart.y_)
{
batch.AddQuad(currentStart.x_, currentStart.y_, currentEnd.x_ - currentStart.x_,
currentEnd.y_ - currentStart.y_, 0, 0);
currentStart = charLocations_[i].position_;
currentEnd = currentStart + charLocations_[i].size_;
}
else
{
currentEnd.x_ += charLocations_[i].size_.x_;
currentEnd.y_ = Max(currentStart.y_ + charLocations_[i].size_.y_, currentEnd.y_);
}
}
}
if (currentEnd != currentStart)
{
batch.AddQuad(currentStart.x_, currentStart.y_, currentEnd.x_ - currentStart.x_, currentEnd.y_ - currentStart.y_, 0, 0);
}
UIBatch::AddOrMerge(batch, batches);
}
// Text batch
TextEffect textEffect = font_->IsSDFFont() ? TE_NONE : textEffect_;
const ea::vector<ea::shared_ptr<Texture2D> >& textures = face->GetTextures();
for (unsigned n = 0; n < textures.size() && n < pageGlyphLocations_.size(); ++n)
{
// One batch per texture/page
UIBatch pageBatch(this, BLEND_ALPHA, currentScissor, textures[n], &vertexData);
const ea::vector<GlyphLocation>& pageGlyphLocation = pageGlyphLocations_[n];
switch (textEffect)
{
case TE_NONE:
ConstructBatch(pageBatch, pageGlyphLocation, 0, 0);
break;
case TE_SHADOW:
ConstructBatch(pageBatch, pageGlyphLocation, shadowOffset_.x_, shadowOffset_.y_, &effectColor_, effectDepthBias_);
ConstructBatch(pageBatch, pageGlyphLocation, 0, 0);
break;
case TE_STROKE:
if (roundStroke_)
{
// Samples should be even or glyph may be redrawn in wrong x y pos making stroke corners rough
// Adding to thickness helps with thickness of 1 not having enought samples for this formula
// or certain fonts with reflex corners requiring more glyph samples for a smooth stroke when large
int thickness = Min(strokeThickness_, fontSize_);
int samples = thickness * thickness + (thickness % 2 == 0 ? 4 : 3);
float angle = 360.f / samples;
auto floatThickness = (float)thickness;
for (int i = 0; i < samples; ++i)
{
float x = Cos(angle * i) * floatThickness;
float y = Sin(angle * i) * floatThickness;
ConstructBatch(pageBatch, pageGlyphLocation, x, y, &effectColor_, effectDepthBias_);
}
}
else
{
int thickness = Min(strokeThickness_, fontSize_);
int x, y;
for (x = -thickness; x <= thickness; ++x)
//.........这里部分代码省略.........
示例3: UpdateText
void Text::UpdateText(bool onResize)
{
rowWidths_.clear();
printText_.clear();
if (font_)
{
FontFace* face = font_->GetFace(fontSize_);
if (!face)
return;
rowHeight_ = face->GetRowHeight();
int width = 0;
int height = 0;
int rowWidth = 0;
auto rowHeight = RoundToInt(rowSpacing_ * rowHeight_);
// First see if the text must be split up
if (!wordWrap_)
{
printText_ = unicodeText_;
printToText_.resize(printText_.size());
for (unsigned i = 0; i < printText_.size(); ++i)
printToText_[i] = i;
}
else
{
int maxWidth = GetWidth();
unsigned nextBreak = 0;
unsigned lineStart = 0;
printToText_.clear();
for (unsigned i = 0; i < unicodeText_.size(); ++i)
{
unsigned j;
unsigned c = unicodeText_[i];
if (c != '\n')
{
bool ok = true;
if (nextBreak <= i)
{
int futureRowWidth = rowWidth;
for (j = i; j < unicodeText_.size(); ++j)
{
unsigned d = unicodeText_[j];
if (d == ' ' || d == '\n')
{
nextBreak = j;
break;
}
const FontGlyph* glyph = face->GetGlyph(d);
if (glyph)
{
futureRowWidth += glyph->advanceX_;
if (j < unicodeText_.size() - 1)
futureRowWidth += face->GetKerning(d, unicodeText_[j + 1]);
}
if (d == '-' && futureRowWidth <= maxWidth)
{
nextBreak = j + 1;
break;
}
if (futureRowWidth > maxWidth)
{
ok = false;
break;
}
}
}
if (!ok)
{
// If did not find any breaks on the line, copy until j, or at least 1 char, to prevent infinite loop
if (nextBreak == lineStart)
{
while (i < j)
{
printText_.push_back(unicodeText_[i]);
printToText_.push_back(i);
++i;
}
}
// Eliminate spaces that have been copied before the forced break
while (printText_.size() && printText_.back() == ' ')
{
printText_.pop_back();
printToText_.pop_back();
}
printText_.push_back('\n');
printToText_.push_back(Min(i, unicodeText_.size() - 1));
rowWidth = 0;
nextBreak = lineStart = i;
}
if (i < unicodeText_.size())
{
// When copying a space, position is allowed to be over row width
//.........这里部分代码省略.........
示例4: GetBatches
void Text::GetBatches(PODVector<UIBatch>& batches, PODVector<float>& vertexData, const IntRect& currentScissor)
{
FontFace* face = font_ ? font_->GetFace(fontSize_) : (FontFace*)0;
if (!face)
{
hovering_ = false;
return;
}
// If face has changed or char locations are not valid anymore, update before rendering
if (charLocationsDirty_ || !fontFace_ || face != fontFace_)
UpdateCharLocations();
// If face uses mutable glyphs mechanism, reacquire glyphs before rendering to make sure they are in the texture
else if (face->HasMutableGlyphs())
{
for (unsigned i = 0; i < printText_.Size(); ++i)
face->GetGlyph(printText_[i]);
}
// Hovering and/or whole selection batch
if ((hovering_ && hoverColor_.a_ > 0.0) || (selected_ && selectionColor_.a_ > 0.0f))
{
bool both = hovering_ && selected_ && hoverColor_.a_ > 0.0 && selectionColor_.a_ > 0.0f;
UIBatch batch(this, BLEND_ALPHA, currentScissor, 0, &vertexData);
batch.SetColor(both ? selectionColor_.Lerp(hoverColor_, 0.5f) :
(selected_ && selectionColor_.a_ > 0.0f ? selectionColor_ : hoverColor_));
batch.AddQuad(0, 0, GetWidth(), GetHeight(), 0, 0);
UIBatch::AddOrMerge(batch, batches);
}
// Partial selection batch
if (!selected_ && selectionLength_ && charLocations_.Size() >= selectionStart_ + selectionLength_ && selectionColor_.a_ > 0.0f)
{
UIBatch batch(this, BLEND_ALPHA, currentScissor, 0, &vertexData);
batch.SetColor(selectionColor_);
IntVector2 currentStart = charLocations_[selectionStart_].position_;
IntVector2 currentEnd = currentStart;
for (unsigned i = selectionStart_; i < selectionStart_ + selectionLength_; ++i)
{
// Check if row changes, and start a new quad in that case
if (charLocations_[i].size_ != IntVector2::ZERO)
{
if (charLocations_[i].position_.y_ != currentStart.y_)
{
batch.AddQuad(currentStart.x_, currentStart.y_, currentEnd.x_ - currentStart.x_,
currentEnd.y_ - currentStart.y_, 0, 0);
currentStart = charLocations_[i].position_;
currentEnd = currentStart + charLocations_[i].size_;
}
else
{
currentEnd.x_ += charLocations_[i].size_.x_;
currentEnd.y_ = Max(currentStart.y_ + charLocations_[i].size_.y_, currentEnd.y_);
}
}
}
if (currentEnd != currentStart)
{
batch.AddQuad(currentStart.x_, currentStart.y_, currentEnd.x_ - currentStart.x_, currentEnd.y_ - currentStart.y_, 0, 0);
}
UIBatch::AddOrMerge(batch, batches);
}
// Text batch
TextEffect textEffect = font_->IsSDFFont() ? TE_NONE : textEffect_;
const Vector<SharedPtr<Texture2D> >& textures = face->GetTextures();
for (unsigned n = 0; n < textures.Size() && n < pageGlyphLocations_.Size(); ++n)
{
// One batch per texture/page
UIBatch pageBatch(this, BLEND_ALPHA, currentScissor, textures[n], &vertexData);
const PODVector<GlyphLocation>& pageGlyphLocation = pageGlyphLocations_[n];
switch (textEffect)
{
case TE_NONE:
ConstructBatch(pageBatch, pageGlyphLocation, 0, 0);
break;
case TE_SHADOW:
ConstructBatch(pageBatch, pageGlyphLocation, 1, 1, &effectColor_, effectDepthBias_);
ConstructBatch(pageBatch, pageGlyphLocation, 0, 0);
break;
case TE_STROKE:
ConstructBatch(pageBatch, pageGlyphLocation, -1, -1, &effectColor_, effectDepthBias_);
ConstructBatch(pageBatch, pageGlyphLocation, 0, -1, &effectColor_, effectDepthBias_);
ConstructBatch(pageBatch, pageGlyphLocation, 1, -1, &effectColor_, effectDepthBias_);
ConstructBatch(pageBatch, pageGlyphLocation, -1, 0, &effectColor_, effectDepthBias_);
ConstructBatch(pageBatch, pageGlyphLocation, 1, 0, &effectColor_, effectDepthBias_);
ConstructBatch(pageBatch, pageGlyphLocation, -1, 1, &effectColor_, effectDepthBias_);
ConstructBatch(pageBatch, pageGlyphLocation, 0, 1, &effectColor_, effectDepthBias_);
ConstructBatch(pageBatch, pageGlyphLocation, 1, 1, &effectColor_, effectDepthBias_);
ConstructBatch(pageBatch, pageGlyphLocation, 0, 0);
break;
}
UIBatch::AddOrMerge(pageBatch, batches);
//.........这里部分代码省略.........