MCPcopy Create free account
hub / github.com/MyGUI/mygui / edgeColoringSimple

Function edgeColoringSimple

MyGUIEngine/src/msdfgen/core/edge-coloring.cpp:68–142  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

66}
67
68void edgeColoringSimple(Shape &shape, double angleThreshold, unsigned long long seed) {
69 double crossThreshold = sin(angleThreshold);
70 EdgeColor color = initColor(seed);
71 std::vector<int> corners;
72 for (std::vector<Contour>::iterator contour = shape.contours.begin(); contour != shape.contours.end(); ++contour) {
73 if (contour->edges.empty())
74 continue;
75 { // Identify corners
76 corners.clear();
77 Vector2 prevDirection = contour->edges.back()->direction(1);
78 int index = 0;
79 for (std::vector<EdgeHolder>::const_iterator edge = contour->edges.begin(); edge != contour->edges.end(); ++edge, ++index) {
80 if (isCorner(prevDirection.normalize(), (*edge)->direction(0).normalize(), crossThreshold))
81 corners.push_back(index);
82 prevDirection = (*edge)->direction(1);
83 }
84 }
85
86 // Smooth contour
87 if (corners.empty()) {
88 switchColor(color, seed);
89 for (std::vector<EdgeHolder>::iterator edge = contour->edges.begin(); edge != contour->edges.end(); ++edge)
90 (*edge)->color = color;
91 }
92 // "Teardrop" case
93 else if (corners.size() == 1) {
94 EdgeColor colors[3];
95 switchColor(color, seed);
96 colors[0] = color;
97 colors[1] = WHITE;
98 switchColor(color, seed);
99 colors[2] = color;
100 int corner = corners[0];
101 if (contour->edges.size() >= 3) {
102 int m = (int) contour->edges.size();
103 for (int i = 0; i < m; ++i)
104 contour->edges[(corner+i)%m]->color = colors[1+symmetricalTrichotomy(i, m)];
105 } else if (contour->edges.size() >= 1) {
106 // Less than three edge segments for three colors => edges must be split
107 EdgeSegment *parts[7] = { };
108 contour->edges[0]->splitInThirds(parts[0+3*corner], parts[1+3*corner], parts[2+3*corner]);
109 if (contour->edges.size() >= 2) {
110 contour->edges[1]->splitInThirds(parts[3-3*corner], parts[4-3*corner], parts[5-3*corner]);
111 parts[0]->color = parts[1]->color = colors[0];
112 parts[2]->color = parts[3]->color = colors[1];
113 parts[4]->color = parts[5]->color = colors[2];
114 } else {
115 parts[0]->color = colors[0];
116 parts[1]->color = colors[1];
117 parts[2]->color = colors[2];
118 }
119 contour->edges.clear();
120 for (int i = 0; parts[i]; ++i)
121 contour->edges.push_back(EdgeHolder(parts[i]));
122 }
123 }
124 // Multiple corners
125 else {

Callers 1

renderMsdfGlyphsMethod · 0.85

Calls 15

initColorFunction · 0.85
isCornerFunction · 0.85
switchColorFunction · 0.85
symmetricalTrichotomyFunction · 0.85
EdgeHolderClass · 0.85
EdgeColorEnum · 0.85
directionMethod · 0.80
splitInThirdsMethod · 0.80
beginMethod · 0.45
endMethod · 0.45
emptyMethod · 0.45
clearMethod · 0.45

Tested by

no test coverage detected