The original code was using double precision floating point to perform the
color corrections for the creation of the standard colormap. This precision
is not necessary because color coding is 16 bits anyway, and on some
architecture the double precision comes with a cost.

Signed-off-by: Christophe CURIS <christophe.cu...@free.fr>
---
 m4/wm_libmath.m4 |  1 +
 wrlib/context.c  | 26 +++++++++++++++-----------
 2 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/m4/wm_libmath.m4 b/m4/wm_libmath.m4
index 77ed8d7..5a8143c 100644
--- a/m4/wm_libmath.m4
+++ b/m4/wm_libmath.m4
@@ -70,6 +70,7 @@ AC_CACHE_CHECK([if sinf+cosf are defined in math.h], 
[wm_cv_libm_sinf],
   a = atan2f(a, b);
   b = cosf(a);
   a = sinf(b);
+  a = powf(a, b);
   return (int)a;])],
            [wm_cv_libm_sinf="`echo "$wm_arg" | sed -e 's,^.*% *,,' `" ; break])
      done
diff --git a/wrlib/context.c b/wrlib/context.c
index d74bf53..ee0b993 100644
--- a/wrlib/context.c
+++ b/wrlib/context.c
@@ -38,6 +38,10 @@
 #include "scale.h"
 
 
+#ifndef HAVE_FLOAT_MATHFUNC
+#define powf(x, y) ((float) pow((double)(x), (double)(y)))
+#endif
+
 static Bool bestContext(Display * dpy, int screen_number, RContext * context);
 
 static const RContextAttributes DEFAULT_CONTEXT_ATTRIBS = {
@@ -248,13 +252,13 @@ static Bool allocatePseudoColor(RContext *ctx)
 
        if ((ctx->attribs->flags & RC_GammaCorrection) && ctx->attribs->rgamma 
> 0
            && ctx->attribs->ggamma > 0 && ctx->attribs->bgamma > 0) {
-               double rg, gg, bg;
-               double tmp;
+               float rg, gg, bg;
+               float tmp;
 
                /* do gamma correction */
-               rg = 1.0 / ctx->attribs->rgamma;
-               gg = 1.0 / ctx->attribs->ggamma;
-               bg = 1.0 / ctx->attribs->bgamma;
+               rg = 1.0F / ctx->attribs->rgamma;
+               gg = 1.0F / ctx->attribs->ggamma;
+               bg = 1.0F / ctx->attribs->bgamma;
                for (r = 0; r < cpc; r++) {
                        for (g = 0; g < cpc; g++) {
                                for (b = 0; b < cpc; b++) {
@@ -263,14 +267,14 @@ static Bool allocatePseudoColor(RContext *ctx)
                                        colors[i].blue = (b * 0xffff) / (cpc - 
1);
                                        colors[i].flags = DoRed | DoGreen | 
DoBlue;
 
-                                       tmp = (double)colors[i].red / 65536.0;
-                                       colors[i].red = (unsigned 
short)(65536.0 * pow(tmp, rg));
+                                       tmp = (float) colors[i].red / 65536.0F;
+                                       colors[i].red = (unsigned 
short)(65536.0F * powf(tmp, rg));
 
-                                       tmp = (double)colors[i].green / 65536.0;
-                                       colors[i].green = (unsigned 
short)(65536.0 * pow(tmp, gg));
+                                       tmp = (float) colors[i].green / 
65536.0F;
+                                       colors[i].green = (unsigned 
short)(65536.0F * powf(tmp, gg));
 
-                                       tmp = (double)colors[i].blue / 65536.0;
-                                       colors[i].blue = (unsigned 
short)(65536.0 * pow(tmp, bg));
+                                       tmp = (float) colors[i].blue / 65536.0F;
+                                       colors[i].blue = (unsigned 
short)(65536.0F * powf(tmp, bg));
 
                                        i++;
                                }
-- 
2.1.4


-- 
To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.

Reply via email to