コード例 #1
0
void Histogram1DDataBlock::ComputeTemplate(const TOCBlock* source,
                                           uint64_t iLevel) {
  // compute histogram by iterating over all bricks of the given level
  UINT64VECTOR3 bricksInSourceLevel = source->GetBrickCount(iLevel);

  size_t iCompcount = size_t(source->GetComponentCount());
  T* pTempBrickData = new T[size_t(source->GetMaxBrickSize().volume())
                            *iCompcount];

  uint32_t iOverlap =source->GetOverlap();

  ProgressTimer timer;
  timer.Start();

  for (uint64_t bz = 0;bz<bricksInSourceLevel.z;bz++) {
    for (uint64_t by = 0;by<bricksInSourceLevel.y;by++) {
      for (uint64_t bx = 0;bx<bricksInSourceLevel.x;bx++) {
        UINT64VECTOR4 brickCoords(bx,by,bz,iLevel);
        source->GetData((uint8_t*)pTempBrickData, brickCoords);
        UINTVECTOR3 bricksize = UINTVECTOR3(source->GetBrickSize(brickCoords));

        for (uint32_t z = iOverlap;z<bricksize.z-iOverlap;z++) {
          for (uint32_t y = iOverlap;y<bricksize.y-iOverlap;y++) {
            for (uint32_t x = iOverlap;x<bricksize.x-iOverlap;x++) {
              // TODO: think about what todo with multi component data
              //       right now we only pick the first component
              size_t val = size_t(pTempBrickData[iCompcount*(x+y*bricksize.x+z*bricksize.x*bricksize.y)]);
              m_vHistData[val]++;
            }
          }
        }
      }
    }

    float progress = float(bz)/float(bricksInSourceLevel.z);
    MESSAGE("Computing 1D Histogram %5.2f%% (%s)", 
            progress * 100.0f,
            timer.GetProgressMessage(progress).c_str());
  }
  delete [] pTempBrickData;
}