r7928: support 64-bit long ints
authorKevin M. Rosenberg <kevin@rosenberg.net>
Tue, 30 Sep 2003 08:24:40 +0000 (08:24 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Tue, 30 Sep 2003 08:24:40 +0000 (08:24 +0000)
libctsim/backprojectors.cpp

index 26455facaa9facfd9d2629807a9d66ec82a7362a..b7d320d49aab76f31668b96e3efbfd178f00289a 100644 (file)
@@ -572,17 +572,21 @@ void
 BackprojectIntDiff::BackprojectView (const double* const filteredProj, const double view_angle)
 {
   double theta = view_angle;  // add half PI to view angle to get perpendicular theta angle
+#if SIZEOF_LONG == 4
   static const int scaleShift = 16;
-  static const kint32 scale = (1 << scaleShift);
-  static const kint32 scaleBitmask = scale - 1;
-  static const kint32 halfScale = scale / 2;
+#elif SIZEOF_LONG == 8
+  static const int scaleShift = 32;
+#endif
+  static const long scale = (1 << scaleShift);
+  static const long scaleBitmask = scale - 1;
+  static const long halfScale = scale / 2;
   static const double dInvScale = 1. / scale;
   
-  const kint32 det_dx = nearest<kint32> (xInc * cos (theta) / detInc * scale);
-  const kint32 det_dy = nearest<kint32> (yInc * sin (theta) / detInc * scale);
+  const long det_dx = nearest<long> (xInc * cos (theta) / detInc * scale);
+  const long det_dy = nearest<long> (yInc * sin (theta) / detInc * scale);
   
   // calculate L for first point in image (0, 0) 
-  kint32 detPosColStart = nearest<kint32> ((start_r * cos (theta - start_phi) / detInc + iDetCenter) * scale);
+  long detPosColStart = nearest<long> ((start_r * cos (theta - start_phi) / detInc + iDetCenter) * scale);
   
   double* deltaFilteredProj = NULL;  
   CubicPolyInterpolator* pCubicInterp = NULL;
@@ -603,26 +607,26 @@ BackprojectIntDiff::BackprojectView (const double* const filteredProj, const dou
     
     if (interpType == Backprojector::INTERP_NEAREST) {
       for (int iy = 0; iy < ny; iy++, curDetPos += det_dy) {
-        const int iDetPos = (curDetPos + halfScale) >> 16;
+        const int iDetPos = (curDetPos + halfScale) >> scaleShift;
         if (iDetPos >= 0 && iDetPos <= iLastDet)
           *pImCol++ += filteredProj[iDetPos];
       }        // end for iy
     } else if (interpType == Backprojector::INTERP_FREQ_PREINTERPOLATION) {
       for (int iy = 0; iy < ny; iy++, curDetPos += det_dy) {
-        const int iDetPos = ((curDetPos + halfScale) >> 16) * m_interpFactor;
+        const int iDetPos = ((curDetPos + halfScale) >> scaleShift) * m_interpFactor;
         if (iDetPos >= 0 && iDetPos <= iLastDet)
           *pImCol++ += filteredProj[iDetPos];
       }        // end for iy
     } else if (interpType == Backprojector::INTERP_LINEAR) {
       for (int iy = 0; iy < ny; iy++, curDetPos += det_dy) {
-        const kint32 iDetPos = curDetPos >> scaleShift;
-        const kint32 detRemainder = curDetPos & scaleBitmask;
+        const long iDetPos = curDetPos >> scaleShift;
+        const long detRemainder = curDetPos & scaleBitmask;
         if (iDetPos >= 0 && iDetPos <= iLastDet)
           *pImCol++ += filteredProj[iDetPos] + (detRemainder * deltaFilteredProj[iDetPos]);
       }        // end for iy
     } else if (interpType == Backprojector::INTERP_CUBIC) {
       for (int iy = 0; iy < ny; iy++, curDetPos += det_dy) {
-        *pImCol++ += pCubicInterp->interpolate (static_cast<double>(curDetPos) / 65536);
+        *pImCol++ += pCubicInterp->interpolate (static_cast<double>(curDetPos) / scale);
       }
     } // end Cubic
   } // end for ix