Code

remove non-portable fast_sqrt; turns out simply sqrt(x*x+y*y) works even faster than...
authorbuliabyak <buliabyak@users.sourceforge.net>
Mon, 26 Jun 2006 22:00:19 +0000 (22:00 +0000)
committerbuliabyak <buliabyak@users.sourceforge.net>
Mon, 26 Jun 2006 22:00:19 +0000 (22:00 +0000)
src/libnr/nr-gradient.cpp

index 9e9360147298475572fbc0ebe0c7a2514a5a2b43..4553eb598d84a4f2a8437903e8e50b14b241465a 100644 (file)
@@ -114,17 +114,6 @@ nr_rgradient_render_block_end(NRRenderer *r, NRPixBlock *pb, NRPixBlock *m)
     nr_blit_pixblock_mask_rgba32(pb, m, (c[0] << 24) | (c[1] << 16) | (c[2] << 8) | c[3]);
 }
 
-float fast_sqrt (float in)
-{
-    float x = in;
-    float xhalf = 0.5f*x;
-    int i = *(int*)&x;
-    i = 0x5f3759df - (i >> 1); // This line hides a LOT of math!
-    x = *(float*)&i;
-    x = x*(1.5f - xhalf*x*x); // repeat this statement for a better approximation
-    return x * in;
-}
-
 /*
  * The archetype is following
  *
@@ -161,7 +150,7 @@ nr_rgradient_render_generic_symmetric(NRRGradientRenderer *rgr, NRPixBlock *pb)
             NR::Coord gx = rgr->px2gs.c[0] * pb->area.x0 + rgr->px2gs.c[2] * y + rgr->px2gs.c[4];
             NR::Coord gy = rgr->px2gs.c[1] * pb->area.x0 + rgr->px2gs.c[3] * y + rgr->px2gs.c[5];
             for (int x = pb->area.x0; x < pb->area.x1; x++) {
-                float const pos = fast_sqrt((gx*gx) + (gy*gy));
+                NR::Coord const pos = sqrt(((gx*gx) + (gy*gy)));
                 int idx;
                 if (rgr->spread == NR_GRADIENT_SPREAD_REFLECT) {
                     idx = (int) ((long long) pos & NRG_2MASK);
@@ -187,7 +176,7 @@ nr_rgradient_render_generic_symmetric(NRRGradientRenderer *rgr, NRPixBlock *pb)
             NR::Coord gx = rgr->px2gs.c[0] * pb->area.x0 + rgr->px2gs.c[2] * y + rgr->px2gs.c[4];
             NR::Coord gy = rgr->px2gs.c[1] * pb->area.x0 + rgr->px2gs.c[3] * y + rgr->px2gs.c[5];
             for (int x = pb->area.x0; x < pb->area.x1; x++) {
-                float pos = fast_sqrt((gx*gx) + (gy*gy));
+                NR::Coord const pos = sqrt(((gx*gx) + (gy*gy)));
                 int idx;
                 if (rgr->spread == NR_GRADIENT_SPREAD_REFLECT) {
                     idx = (int) ((long long) pos & NRG_2MASK);
@@ -232,7 +221,7 @@ nr_rgradient_render_generic_symmetric(NRRGradientRenderer *rgr, NRPixBlock *pb)
             NR::Coord gx = rgr->px2gs.c[0] * pb->area.x0 + rgr->px2gs.c[2] * y + rgr->px2gs.c[4];
             NR::Coord gy = rgr->px2gs.c[1] * pb->area.x0 + rgr->px2gs.c[3] * y + rgr->px2gs.c[5];
             for (int x = pb->area.x0; x < pb->area.x1; x++) {
-                NR::Coord const pos = fast_sqrt((gx*gx) + (gy*gy));
+                NR::Coord const pos = sqrt(((gx*gx) + (gy*gy)));
                 int idx;
                 if (rgr->spread == NR_GRADIENT_SPREAD_REFLECT) {
                     idx = (int) ((long long) pos & NRG_2MASK);