/* <= is slower than < for floats, so we use < for our tolerance test
*/
-inline bool SkScalarNearlyZero(SkScalar x, SkScalar tolerance = SK_ScalarNearlyZero)
-{
+static inline bool SkScalarNearlyZero(SkScalar x,
+ SkScalar tolerance = SK_ScalarNearlyZero) {
SkASSERT(tolerance > 0);
return SkScalarAbs(x) < tolerance;
}
else interpolate.
t must be [0..SK_Scalar1]
*/
-inline SkScalar SkScalarInterp(SkScalar A, SkScalar B, SkScalar t)
-{
+static inline SkScalar SkScalarInterp(SkScalar A, SkScalar B, SkScalar t) {
SkASSERT(t >= 0 && t <= SK_Scalar1);
return A + SkScalarMul(B - A, t);
}
#include "SkFloatBits.h"
#include "SkRect.h"
+/** Skia can spend a lot of time just comparing scalars (e.g. quickReject).
+ When scalar==fixed, this is very fast, and when scalar==hardware-float, this
+ is also reasonable, but if scalar==software-float, then each compare can be
+ a function call and take real time. To account for that, we have the flag
+ SK_SCALAR_SLOW_COMPARES.
+
+ If this is defined, we have a special trick where we quickly convert floats
+ to a 2's compliment form, and then treat them as signed 32bit integers. In
+ this form we lose a few subtlties (e.g. NaNs always comparing false) but
+ we gain the speed of integer compares.
+ */
+
#ifdef SK_SCALAR_SLOW_COMPARES
typedef int32_t SkScalarCompareType;
typedef SkIRect SkRectCompareType;
SkPath tmp;
tmp.addRect(rect);
tmp.setFillType(SkPath::kWinding_FillType);
- this->drawPath(tmp, paint);
+ this->drawPath(tmp, paint, NULL, true);
return;
}