#include "SkSweepGradient.h"
+#include <algorithm>
+
static SkMatrix translate(SkScalar dx, SkScalar dy) {
SkMatrix matrix;
matrix.setTranslate(dx, dy);
: INHERITED(shader, rec) {}
// returns angle in a circle [0..2PI) -> [0..255]
+#ifdef SK_LEGACY_SWEEP_GRADIENT
static unsigned SkATan2_255(float y, float x) {
// static const float g255Over2PI = 255 / (2 * SK_ScalarPI);
static const float g255Over2PI = 40.584510488433314f;
SkASSERT(ir >= 0 && ir <= 255);
return ir;
}
+#else
+static unsigned SkATan2_255(float y, float x) {
+ if (y == 0 && x == 0) return 0;
+ float yabs = sk_float_abs(y),
+ xabs = sk_float_abs(x);
+ float little, big;
+ std::tie(little, big) = std::minmax(yabs, xabs);
+ float a = little/big;
+ float s = a * a;
+ float r = a*(40.57589784014689f
+ + s*(-13.222755844396332f + s*(6.314046289038564f - s*1.7989502668982151f)));
+ r = xabs < yabs ? 255/4.0f - r : r;
+ r = x < 0.0f ? 255/2.0f - r : r;
+ r = y < 0.0f ? 255 - r : r;
+
+ int ir = (int)r;
+ SkASSERT(ir >= 0 && ir <= 255);
+ return ir;
+}
+#endif
void SkSweepGradient::SweepGradientContext::shadeSpan(int x, int y, SkPMColor* SK_RESTRICT dstC,
int count) {