Using sincos (was Re: [cairo] Questions and optimizations in
cairo-arc)
Owen Taylor
otaylor at redhat.com
Mon Aug 22 14:43:08 PDT 2005
On Tue, 2005-07-26 at 20:20 -0400, Behdad Esfahbod wrote:
>
> > > Please feel free to put a patch together for this change alone, (along
> > > with the necessary configure magic to define HAVE_SINCOS
> > > appropriately).
>
> Infact the check for sincos was already in configure and in one
> place in the code it was conditionally used. The attached patch
> defines a macro named _cairo_sincos and uses it all over the
> code. (not that many places really)
>
> I had to introduce AC_GNU_SOURCE in configure.in, as sincos is
> not declared in math.h unless __USE_GNU is defined... But we do
> want to use GNU extensions, so AC_GNU_SOURCE should be harmless.
It does make it easier for stuff to creep in, but that's hard to
prevent anyways. I'd probably just #define _GNU_SOURCE in cairoint.h
though rather than using a configure check ... it's less complex
and easily amenable to a comment like
#define _GNU_SOURCE /* Needed for sincos() in math.h */
The AC_CHECK_FUNCS call doesn't use header files, so it doesn't
need the define.
-AC_CHECK_FUNCS(vasnprintf)
-
+AC_CHECK_FUNCS(vasnprintf, sincos)
+
AC_CHECK_LIBM
I'd put the sincos check after the libm check ... I'm not sure how
it is working before without libm in LIBS so I don't trust it to
stay working.
+ double sin_, cos_;
+
+ _cairo_sincos (angle / 4, &sin_, &cos_);
+ return 2.0/27.0 * pow (sin_, 6) / pow (cos_, 2);
I don't know Carl's opinion, but I find the sin_, cos_ names sort
of ugly like this. My personal preference would be to use 's'
and 'c' - since the scope of the use is just over two lines, the
short names don't hurt.
- double dx = radius * cos (reflect ? -theta : theta);
- double dy = radius * sin (reflect ? -theta : theta);
+ double dx, dy;
+
+ _cairo_sincos (reflect ? -theta : theta, &dx, &dy);
+ dx *= radius;
+ dy *= radius;
I'd use separate variables here - let the compiler do the
register allocation, it's better at it. :-)
+#if HAVE_SINCOS
+# define _cairo_sincos(angle,s,c) sincos((angle), (s), (c))
+#else
+# define _cairo_sincos(angle,s,c) do { \
+ double _sincos_angle = (angle); \
+ *(s) = sin(_sincos_angle); \
+ *(c) = cos(_sincos_angle); \
+ } while (0)
+#endif
Needs some 'fn((' => fn ()' fixes.
Other than those issues, the patch looks fine to me. If you don't get
to it immediately, you might want to file a bug in bugzilla so we
don't forget.
Regards,
Owen
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
Url : http://lists.freedesktop.org/archives/cairo/attachments/20050822/d899e9a8/attachment-0001.pgp
More information about the cairo
mailing list