ossimRefPtr<ossimImageData> ossimImageToPlaneNormalFilter::getTile( const ossimIrect& tileRect, ossim_uint32 resLevel) { if(!isSourceEnabled()||!theInputConnection) { return ossimImageSourceFilter::getTile(tileRect, resLevel); } if(!theTile.valid()) { initialize(); } if(!theTile.valid()) { return ossimImageSourceFilter::getTile(tileRect, resLevel); } theTile->setImageRectangle(tileRect); theBlankTile->setImageRectangle(tileRect); ossimIrect requestRect(tileRect.ul().x - 1, tileRect.ul().y - 1, tileRect.lr().x + 1, tileRect.lr().y + 1); ossimRefPtr<ossimImageData> input = theInputConnection->getTile(requestRect, resLevel); if(!input||(input->getDataObjectStatus()==OSSIM_EMPTY)||!input->getBuf()) { return theBlankTile; } double oldScaleX = theXScale; double oldScaleY = theYScale; if(resLevel > 0) { ossimDpt scaleFactor; theInputConnection->getDecimationFactor(resLevel, scaleFactor); if(!scaleFactor.hasNans()) { theXScale *= scaleFactor.x; theYScale *= scaleFactor.y; } } computeNormals(input, theTile); theXScale = oldScaleX; theYScale = oldScaleY; theTile->validate(); return theTile; }
rspfRefPtr<rspfImageData> rspfConvolutionSource::getTile( const rspfIrect& tileRect, rspf_uint32 resLevel) { if(!theInputConnection) return rspfRefPtr<rspfImageData>(); if((!isSourceEnabled())|| (theConvolutionKernelList.size() < 1)) { return theInputConnection->getTile(tileRect, resLevel); } if(!theTile.valid()) { allocate(); if(!theTile.valid()) // Throw exception??? { return theInputConnection->getTile(tileRect, resLevel); } } rspf_uint32 w = tileRect.width(); rspf_uint32 h = tileRect.height(); rspf_uint32 tw = theTile->getWidth(); rspf_uint32 th = theTile->getHeight(); theTile->setWidth(w); theTile->setHeight(h); if((w*h)!=(tw*th)) { theTile->initialize(); theTile->makeBlank(); } else { theTile->makeBlank(); } theTile->setOrigin(tileRect.ul()); long offsetX = (theMaxKernelWidth)/2; long offsetY = (theMaxKernelHeight)/2; rspfIrect requestRect(tileRect.ul().x - offsetX, tileRect.ul().y - offsetY, tileRect.lr().x + offsetX, tileRect.lr().y + offsetY); rspfRefPtr<rspfImageData> input = theInputConnection->getTile(requestRect, resLevel); if(!input.valid() || (input->getDataObjectStatus() == RSPF_NULL)|| (input->getDataObjectStatus() == RSPF_EMPTY)) { return input; } switch(theTile->getScalarType()) { case RSPF_UCHAR: { if(theConvolutionKernelList.size() == 1) { convolve(static_cast<rspf_uint8>(0), input, theConvolutionKernelList[0]); } else { rspf_uint32 upperBound = (rspf_uint32)theConvolutionKernelList.size(); rspf_uint32 idx; for(idx = 0; idx < upperBound; ++idx) { convolve(static_cast<rspf_uint8>(0), input, theConvolutionKernelList[idx]); input->loadTile(theTile.get()); } } break; } case RSPF_USHORT16: case RSPF_USHORT11: { if(theConvolutionKernelList.size() == 1) { convolve(static_cast<rspf_uint16>(0), input, theConvolutionKernelList[0]); } else { rspf_uint32 upperBound = (rspf_uint32)theConvolutionKernelList.size(); rspf_uint32 idx; for(idx = 0; idx < upperBound; ++idx) { convolve(static_cast<rspf_uint16>(0), input, theConvolutionKernelList[idx]); input->loadTile(theTile.get()); } } break; } case RSPF_SSHORT16: { if(theConvolutionKernelList.size() == 1) { convolve(static_cast<rspf_sint16>(0), input, theConvolutionKernelList[0]); } else { rspf_uint32 upperBound = (rspf_uint32)theConvolutionKernelList.size(); rspf_uint32 idx; for(idx = 0; idx < upperBound; ++idx) { convolve(static_cast<rspf_sint16>(0), input, theConvolutionKernelList[idx]); input->loadTile(theTile.get()); } } break; } case RSPF_FLOAT: case RSPF_NORMALIZED_FLOAT: { if(theConvolutionKernelList.size() == 1) { convolve(static_cast<float>(0), input, theConvolutionKernelList[0]); } else { rspf_uint32 upperBound = (rspf_uint32)theConvolutionKernelList.size(); rspf_uint32 idx; for(idx = 0; idx < upperBound; ++idx) { convolve(static_cast<float>(0), input, theConvolutionKernelList[idx]); input->loadTile(theTile.get()); } } break; } case RSPF_DOUBLE: case RSPF_NORMALIZED_DOUBLE: { if(theConvolutionKernelList.size() == 1) { convolve(static_cast<double>(0), input, theConvolutionKernelList[0]); } else { rspf_uint32 upperBound = (rspf_uint32)theConvolutionKernelList.size(); rspf_uint32 idx; for(idx = 0; idx < upperBound; ++idx) { convolve(static_cast<double>(0), input, theConvolutionKernelList[idx]); input->loadTile(theTile.get()); } } break; } default: { theTile->loadTile(input.get()); } } theTile->validate(); return theTile; }