class SkScaleToSides { public: // This code assumes that a and b fit in a float, and therefore the resulting smaller value // of a and b will fit in a float. The side of the rectangle may be larger than a float. // Scale must be less than or equal to the ratio limit / (*a + *b). // This code assumes that NaN and Inf are never passed in. staticvoid AdjustRadii(double limit, double scale, SkScalar* a, SkScalar* b) {
SkASSERTF(scale < 1.0 && scale > 0.0, "scale: %g", scale);
// Force minRadius to be the smaller of the two. if (*minRadius > *maxRadius) { using std::swap;
swap(minRadius, maxRadius);
}
// newMinRadius must be float in order to give the actual value of the radius. // The newMinRadius will always be smaller than limit. The largest that minRadius can be // is 1/2 the ratio of minRadius : (minRadius + maxRadius), therefore in the resulting // division, minRadius can be no larger than 1/2 limit + ULP. float newMinRadius = *minRadius;
// Reduce newMaxRadius an ulp at a time until it fits. This usually never happens, // but if it does it could be 1 or 2 times. In certain pathological cases it could be // more. Max iterations seen so far is 17. while (newMaxRadius + newMinRadius > limit) {
newMaxRadius = nextafterf(newMaxRadius, 0.0f);
}
*maxRadius = newMaxRadius;
}
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.