fix text alignment
This commit is contained in:
parent
8952672e84
commit
20ad951c46
1 changed files with 19 additions and 17 deletions
|
@ -794,12 +794,9 @@ int GPUFontAtlasLayerCombo::wrapBoundingBoxes(std::vector <ofxGPUFont::Font::Bou
|
|||
float advanceY,
|
||||
float textAlignment){
|
||||
|
||||
int n_wraps = 0;
|
||||
std::vector <int> lineBreaks;
|
||||
std::vector <int> goodCharacters;
|
||||
int lastGoodCharacter = -1;
|
||||
//textAlignment = ofMap(sin(ofGetElapsedTimef()), -1, 1, 0, 1);
|
||||
std::vector <int> vis;
|
||||
std::vector <int> wrapIndices;
|
||||
|
||||
{ // collect existing linebreaks, wrapindices and good characters
|
||||
|
@ -824,7 +821,6 @@ int GPUFontAtlasLayerCombo::wrapBoundingBoxes(std::vector <ofxGPUFont::Font::Bou
|
|||
vi++;
|
||||
}else{
|
||||
hasGoodCharacter = true;
|
||||
goodCharacters.push_back(vi);
|
||||
}
|
||||
}
|
||||
if(variationText[vi].charcode == '-'){
|
||||
|
@ -838,15 +834,14 @@ int GPUFontAtlasLayerCombo::wrapBoundingBoxes(std::vector <ofxGPUFont::Font::Bou
|
|||
vi++;
|
||||
}
|
||||
}
|
||||
int n_wraps = 0;
|
||||
{ // add new linebreaks at wrapindices
|
||||
int i = 0;
|
||||
float wrapWidth;
|
||||
int lastBrokenWrapIndex = -1;
|
||||
for(ofxGPUFont::Font::BoundingBox & bb : bbs){
|
||||
int wrapIndex = wrapIndices[i];
|
||||
if(width > 0 && bb.p1.x > width){
|
||||
if(wrapIndex >= 0 && std::find(lineBreaks.begin(), lineBreaks.end(), wrapIndex - 1) == lineBreaks.end()){
|
||||
lastBrokenWrapIndex = wrapIndex;
|
||||
wrapWidth = bbs[wrapIndex].p0.x;
|
||||
int nextLineBreak = INT_MAX;
|
||||
for(int lb = 0; lb < lineBreaks.size(); lb++){
|
||||
|
@ -855,6 +850,7 @@ int GPUFontAtlasLayerCombo::wrapBoundingBoxes(std::vector <ofxGPUFont::Font::Bou
|
|||
break;
|
||||
}
|
||||
}
|
||||
// TODO: should be possible without iterating bbs
|
||||
for(int w = wrapIndex; w < bbs.size(); w++){
|
||||
if(w <= nextLineBreak){
|
||||
bbs[w].p0.x -= wrapWidth;
|
||||
|
@ -875,24 +871,30 @@ int GPUFontAtlasLayerCombo::wrapBoundingBoxes(std::vector <ofxGPUFont::Font::Bou
|
|||
}
|
||||
}
|
||||
|
||||
float maxX = -1 * FLT_MAX;
|
||||
for(const auto & bb : bbs){
|
||||
maxX = max(maxX, bb.p1.x);
|
||||
}
|
||||
|
||||
if(textAlignment != 0){
|
||||
if(lineBreaks.size() > 0){
|
||||
lineBreaks.push_back(lastGoodCharacter);
|
||||
}
|
||||
//float w = width > 0 ? width : maxX;
|
||||
float w = maxX;
|
||||
std::sort(lineBreaks.begin(), lineBreaks.end());
|
||||
|
||||
// following may seem overcomplicated, though:
|
||||
// if width is set, we use width to shift text alignment
|
||||
// if not, we calculate maximum x and use that
|
||||
// the syntax makes it possible to only calculate
|
||||
// when we need it
|
||||
float w = width > 0 ? width :
|
||||
std::accumulate(bbs.begin(),
|
||||
bbs.end(),
|
||||
-1 * FLT_MAX,
|
||||
[](float a,
|
||||
const ofxGPUFont::Font::BoundingBox & bb)
|
||||
{
|
||||
return max(a, bb.p1.x);
|
||||
});
|
||||
int startFromCharacter = 0;
|
||||
for(int lineBreak : lineBreaks){
|
||||
ofxGPUFont::Font::BoundingBox & bbb = bbs[lineBreak];
|
||||
int vi = vis[lineBreak];
|
||||
int vi2 = vis[startFromCharacter];
|
||||
variationTextAppearance[vi].color[0] = 1.0;
|
||||
variationTextAppearance[vi2].color[1] = 1.0;
|
||||
|
||||
float shiftX = (w - bbb.p1.x) * textAlignment;
|
||||
for(int i = startFromCharacter; i <= lineBreak; i++){
|
||||
auto & bb = bbs[i];
|
||||
|
|
Loading…
Reference in a new issue