staticbool chopMonoQuadAt(SkScalar c0, SkScalar c1, SkScalar c2,
SkScalar target, SkScalar* t) { /* Solve F(t) = y where F(t) := [0](1-t)^2 + 2[1]t(1-t) + [2]t^2 *Wesolvefort,usingquadraticequation,hencewehavetorearrange *ourcooefficentstolooklikeAt^2+Bt+C
*/
SkScalar A = c0 - c1 - c1 + c2;
SkScalar B = 2*(c1 - c0);
SkScalar C = c0 - target;
SkScalar roots[2]; // we only expect one, but make room for 2 for safety int count = SkFindUnitQuadRoots(A, B, C, roots); if (count) {
*t = roots[0]; return true;
} returnfalse;
}
staticbool chopMonoQuadAtY(SkPoint pts[3], SkScalar y, SkScalar* t) { return chopMonoQuadAt(pts[0].fY, pts[1].fY, pts[2].fY, y, t);
}
/* If we somehow returned the fact that we had to flip the pts in Y, we could communicatethattosetQuadratic,andthenavoidhavingtoflipitback here(onlytohavesetQuadraticdotheflipagain)
*/ bool SkQuadClipper::clipQuad(const SkPoint srcPts[3], SkPoint dst[3]) { bool reverse;
// we need the data to be monotonically increasing in Y if (srcPts[0].fY > srcPts[2].fY) {
dst[0] = srcPts[2];
dst[1] = srcPts[1];
dst[2] = srcPts[0];
reverse = true;
} else {
memcpy(dst, srcPts, 3 * sizeof(SkPoint));
reverse = false;
}
// are we completely above or below const SkScalar ctop = fClip.fTop; const SkScalar cbot = fClip.fBottom; if (dst[2].fY <= ctop || dst[0].fY >= cbot) { returnfalse;
}
SkScalar t;
SkPoint tmp[5]; // for SkChopQuadAt
// are we partially above if (dst[0].fY < ctop) { if (chopMonoQuadAtY(dst, ctop, &t)) { // take the 2nd chopped quad
SkChopQuadAt(dst, tmp, t);
dst[0] = tmp[2];
dst[1] = tmp[3];
} else { // if chopMonoQuadAtY failed, then we may have hit inexact numerics // so we just clamp against the top for (int i = 0; i < 3; i++) { if (dst[i].fY < ctop) {
dst[i].fY = ctop;
}
}
}
}
// are we partially below if (dst[2].fY > cbot) { if (chopMonoQuadAtY(dst, cbot, &t)) {
SkChopQuadAt(dst, tmp, t);
dst[1] = tmp[1];
dst[2] = tmp[2];
} else { // if chopMonoQuadAtY failed, then we may have hit inexact numerics // so we just clamp against the bottom for (int i = 0; i < 3; i++) { if (dst[i].fY > cbot) {
dst[i].fY = cbot;
}
}
}
}
if (reverse) {
using std::swap;
swap(dst[0], dst[2]);
} return true;
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.19 Sekunden
(vorverarbeitet am 2026-08-26)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.