diff options
Diffstat (limited to 'src/jumper/SkJumper_stages.cpp')
-rw-r--r-- | src/jumper/SkJumper_stages.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/jumper/SkJumper_stages.cpp b/src/jumper/SkJumper_stages.cpp index 61ef73a46d..83c806026f 100644 --- a/src/jumper/SkJumper_stages.cpp +++ b/src/jumper/SkJumper_stages.cpp @@ -945,6 +945,32 @@ STAGE(linear_gradient_2stops) { a = mad(t, c->f[3], c->b[3]); } +STAGE(xy_to_polar_unit) { + F X = r, + Y = g; + F xabs = abs_(X), + yabs = abs_(Y); + + F slope = min(xabs, yabs)/max(xabs, yabs); + F s = slope * slope; + + // Use a 7th degree polynomial to approximate atan. + // This was generated using sollya.gforge.inria.fr. + // A float optimized polynomial was generated using the following command. + // P1 = fpminimax((1/(2*Pi))*atan(x),[|1,3,5,7|],[|24...|],[2^(-40),1],relative); + F phi = slope + * (0.15912117063999176025390625f + s + * (-5.185396969318389892578125e-2f + s + * (2.476101927459239959716796875e-2f + s + * (-7.0547382347285747528076171875e-3f)))); + + phi = if_then_else(xabs < yabs, 1.0f/4.0f - phi, phi); + phi = if_then_else(X < 0.0f , 1.0f/2.0f - phi, phi); + phi = if_then_else(Y < 0.0f , 1.0f - phi , phi); + phi = if_then_else(phi != phi , 0 , phi); // Check for NaN. + r = phi; +} + STAGE(save_xy) { auto c = (SkJumper_SamplerCtx*)ctx; |