[cairo] Shouldn't Cairo use/offer degrees rather than radians?

David Kastrup dak at gnu.org
Thu Jun 29 04:37:50 UTC 2017


Lawrence D'Oliveiro <ldo at geek-central.gen.nz> writes:

> On Wed, 28 Jun 2017 12:34:34 +0200, David Kastrup wrote:
>
>> That is more than Cairo can deliver right now.
>
> Only by special-casing
> <http://git.ghostscript.com/?p=ghostpdl.git;a=blob;f=base/gsmisc.c;h=1ade8db12a9f0ac685396421107333e9347404a2;hb=HEAD>:
>
>     static const int isincos[5] =
>     {0, 1, 0, -1, 0};
>
>     /* GCC with -ffast-math compiles ang/90. as ang*(1/90.), losing precission.
>      * This doesn't happen when the numeral is replaced with a non-const variable.
>      * So we define the variable to work around the GCC problem.
>      */
>     double const_90_degrees = 90.;
>
>     double
>     gs_sin_degrees(double ang)
>     {
>         double quot = ang / const_90_degrees;
>
>         if (floor(quot) == quot) {
>             /*
>              * We need 4.0, rather than 4, here because of non-ANSI compilers.
>              * The & 3 is because quot might be negative.
>              */
>             return isincos[(int)fmod(quot, 4.0) & 3];
>         }
>         return sin(ang * (M_PI / 180));
>     }
>
>     double
>     gs_cos_degrees(double ang)
>     {
>         double quot = ang / const_90_degrees;
>
>         if (floor(quot) == quot) {
>             /* See above re the following line. */
>             return isincos[((int)fmod(quot, 4.0) & 3) + 1];
>         }
>         return cos(ang * (M_PI / 180));
>     }
>
> Do you really want to see hacks like that in the Cairo code?

No: I already showed the kind of code I was going to use instead and
that would avoid any discontinuities and would make for perfect
periodicity (the "discontinuity" would get stuffed into sin(pi/2+eps)
which is approximately 1+eps^2/2 and thus not likely to show any
staircasing).

But of course having to create seeming perfection from underlying
imperfection will remain a hack.

-- 
David Kastrup



More information about the cairo mailing list