more robust outline flipping
This commit is contained in:
parent
dda49a89ea
commit
1890926805
1 changed files with 29 additions and 23 deletions
|
@ -714,6 +714,7 @@ class Font {
|
|||
//cout << "but charcode is r or n" << endl;
|
||||
continue;
|
||||
}
|
||||
// if does exist already
|
||||
if(glyphs.count(glyphIdentity) != 0){
|
||||
continue;
|
||||
}
|
||||
|
@ -936,33 +937,38 @@ class Font {
|
|||
convertContour(curves[i], directions[i], bbs[i], &face->glyph->outline, start, face->glyph->outline.contours[i], emSize);
|
||||
start = face->glyph->outline.contours[i] + 1;
|
||||
}
|
||||
// outmost outline must be clock-wise
|
||||
// then flip direction the deeper we go inside
|
||||
for(int i = 0; i < n_contours; i++){
|
||||
if(directions[i] < 0){
|
||||
bool flip = true;
|
||||
for(int j = 0; j < n_contours; j++){
|
||||
if(i != j){
|
||||
bool inside = bbs[j].xMin <= bbs[i].xMin
|
||||
&& bbs[j].xMax >= bbs[i].xMax
|
||||
&& bbs[j].yMin <= bbs[i].yMin
|
||||
&& bbs[j].yMax >= bbs[i].yMax;
|
||||
if(inside){
|
||||
flip = false;
|
||||
break;
|
||||
}
|
||||
int insideAnother = 0;
|
||||
for(int j = 0; j < n_contours; j++){
|
||||
if(i != j){
|
||||
bool inside = bbs[j].xMin <= bbs[i].xMin
|
||||
&& bbs[j].xMax >= bbs[i].xMax
|
||||
&& bbs[j].yMin <= bbs[i].yMin
|
||||
&& bbs[j].yMax >= bbs[i].yMax;
|
||||
if(inside){
|
||||
insideAnother++;
|
||||
}
|
||||
}
|
||||
if(flip){
|
||||
for(BufferCurve & curve : curves[i]){
|
||||
float tmp_x = curve.x0;
|
||||
float tmp_y = curve.y0;
|
||||
curve.x0 = curve.x2;
|
||||
curve.y0 = curve.y2;
|
||||
curve.x2 = tmp_x;
|
||||
curve.y2 = tmp_y;
|
||||
}
|
||||
std::reverse(curves[i].begin(), curves[i].end());
|
||||
}
|
||||
}
|
||||
bool flip = false;
|
||||
if((insideAnother % 2 == 0 && directions[i] < 0)
|
||||
|| (insideAnother % 2 == 1 && directions[i] > 0)){
|
||||
flip = true;
|
||||
}
|
||||
if(flip){
|
||||
for(BufferCurve & curve : curves[i]){
|
||||
float tmp_x = curve.x0;
|
||||
float tmp_y = curve.y0;
|
||||
curve.x0 = curve.x2;
|
||||
curve.y0 = curve.y2;
|
||||
curve.x2 = tmp_x;
|
||||
curve.y2 = tmp_y;
|
||||
}
|
||||
std::reverse(curves[i].begin(), curves[i].end());
|
||||
}
|
||||
//}
|
||||
bufferCurves.insert(bufferCurves.end(), curves[i].begin(), curves[i].end());
|
||||
}
|
||||
}else{
|
||||
|
|
Loading…
Reference in a new issue