more robust outline flipping

This commit is contained in:
jrkb 2023-09-19 12:44:16 +02:00
parent dda49a89ea
commit 1890926805

View file

@ -714,6 +714,7 @@ class Font {
//cout << "but charcode is r or n" << endl; //cout << "but charcode is r or n" << endl;
continue; continue;
} }
// if does exist already
if(glyphs.count(glyphIdentity) != 0){ if(glyphs.count(glyphIdentity) != 0){
continue; continue;
} }
@ -936,9 +937,10 @@ class Font {
convertContour(curves[i], directions[i], bbs[i], &face->glyph->outline, start, face->glyph->outline.contours[i], emSize); convertContour(curves[i], directions[i], bbs[i], &face->glyph->outline, start, face->glyph->outline.contours[i], emSize);
start = face->glyph->outline.contours[i] + 1; 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++){ for(int i = 0; i < n_contours; i++){
if(directions[i] < 0){ int insideAnother = 0;
bool flip = true;
for(int j = 0; j < n_contours; j++){ for(int j = 0; j < n_contours; j++){
if(i != j){ if(i != j){
bool inside = bbs[j].xMin <= bbs[i].xMin bool inside = bbs[j].xMin <= bbs[i].xMin
@ -946,11 +948,15 @@ class Font {
&& bbs[j].yMin <= bbs[i].yMin && bbs[j].yMin <= bbs[i].yMin
&& bbs[j].yMax >= bbs[i].yMax; && bbs[j].yMax >= bbs[i].yMax;
if(inside){ if(inside){
flip = false; insideAnother++;
break;
} }
} }
} }
bool flip = false;
if((insideAnother % 2 == 0 && directions[i] < 0)
|| (insideAnother % 2 == 1 && directions[i] > 0)){
flip = true;
}
if(flip){ if(flip){
for(BufferCurve & curve : curves[i]){ for(BufferCurve & curve : curves[i]){
float tmp_x = curve.x0; float tmp_x = curve.x0;
@ -962,7 +968,7 @@ class Font {
} }
std::reverse(curves[i].begin(), curves[i].end()); std::reverse(curves[i].begin(), curves[i].end());
} }
} //}
bufferCurves.insert(bufferCurves.end(), curves[i].begin(), curves[i].end()); bufferCurves.insert(bufferCurves.end(), curves[i].begin(), curves[i].end());
} }
}else{ }else{