boost::uint32_t DecimationFilterSequentialIterator::readBufferImpl(PointBuffer& dstData) { // The client has asked us for dstData.getCapacity() points. // We will read from our previous stage until we get that amount (or // until the previous stage runs out of points). boost::uint32_t numPointsNeeded = dstData.getCapacity(); assert(dstData.getNumPoints() == 0); // set up buffer to be filled by prev stage PointBuffer srcData(dstData.getSchemaLayout(), numPointsNeeded); while (numPointsNeeded > 0) { // read from prev stage const boost::uint64_t srcStartIndex = getPrevIterator().getIndex(); const boost::uint32_t numSrcPointsRead = getPrevIterator().read(srcData); assert(numSrcPointsRead <= srcData.getNumPoints()); //assert(numSrcPointsRead <= numPointsNeeded); // we got no data, and there is no more to get -- exit the loop if (numSrcPointsRead == 0) break; // copy points from src (prev stage) into dst (our stage), // based on the CropFilter's rules (i.e. its bounds) const boost::uint32_t numPointsAdded = m_filter.processBuffer(dstData, srcData, srcStartIndex); numPointsNeeded -= numPointsAdded; //printf(".");fflush(stdout); } const boost::uint32_t numPointsAchieved = dstData.getNumPoints(); return numPointsAchieved; }