43 typename DestImageT::SinglePixel padValue)
44 : _srcImage(srcImage),
45 _kernelPtr(control.getWarpingKernel()),
46 _maskKernelPtr(control.getMaskWarpingKernel()),
47 _hasMaskKernel(control.getMaskWarpingKernel()),
48 _kernelCtr(_kernelPtr->getCtr()),
49 _maskKernelCtr(_maskKernelPtr ? _maskKernelPtr->getCtr() :
lsst::geom::Point2I(0, 0)),
50 _growFullMask(control.getGrowFullMask()),
51 _xList(_kernelPtr->getWidth()),
52 _yList(_kernelPtr->getHeight()),
53 _maskXList(_maskKernelPtr ? _maskKernelPtr->getWidth() : 0),
54 _maskYList(_maskKernelPtr ? _maskKernelPtr->getHeight() : 0),
56 _srcGoodBBox(_kernelPtr->shrinkBBox(srcImage.getBBox(
lsst::afw::
image::LOCAL))){};
69 if (srcIndFracX.second < 0) {
73 if (srcIndFracY.second < 0) {
81 int srcStartX = srcIndFracX.first - _kernelCtr[0];
82 int srcStartY = srcIndFracY.first - _kernelCtr[1];
85 double kSum = _setFracIndex(srcIndFracX.second, srcIndFracY.second);
87 typename SrcImageT::const_xy_locator srcLoc = _srcImage.xy_at(srcStartX, srcStartY);
89 *destXIter = lsst::afw::math::convolveAtAPoint<DestImageT, SrcImageT>(srcLoc, _xList, _yList);
90 *destXIter *= relativeArea / kSum;
94 *destXIter = _padValue;
111 if (srcIndFracX.second < 0) {
112 ++srcIndFracX.second;
115 if (srcIndFracY.second < 0) {
116 ++srcIndFracY.second;
123 int srcStartX = srcIndFracX.first - _kernelCtr[0];
124 int srcStartY = srcIndFracY.first - _kernelCtr[1];
127 double kSum = _setFracIndex(srcIndFracX.second, srcIndFracY.second);
129 typename SrcImageT::const_xy_locator srcLoc = _srcImage.xy_at(srcStartX, srcStartY);
131 *destXIter = lsst::afw::math::convolveAtAPoint<DestImageT, SrcImageT>(srcLoc, _xList, _yList);
132 *destXIter *= relativeArea / kSum;
134 if (_hasMaskKernel) {
136 int maskStartX = srcIndFracX.first - _maskKernelCtr[0];
137 int maskStartY = srcIndFracY.first - _maskKernelCtr[1];
139 typename SrcImageT::Mask::const_xy_locator srcMaskLoc =
140 _srcImage.getMask()->xy_at(maskStartX, maskStartY);
142 using k_iter =
typename std::vector<lsst::afw::math::Kernel::Pixel>::const_iterator;
144 typename DestImageT::Mask::SinglePixel destMaskValue = 0;
145 for (
double kValY : _maskYList) {
146 typename DestImageT::Mask::SinglePixel destMaskValueY = 0;
147 for (k_iter kernelXIter = _maskXList.
begin(), xEnd = _maskXList.
end();
148 kernelXIter != xEnd; ++kernelXIter, ++srcMaskLoc.x()) {
151 destMaskValueY |= *srcMaskLoc;
156 destMaskValue |= destMaskValueY;
159 srcMaskLoc += lsst::afw::image::detail::difference_type(-_maskXList.
size(), 1);
162 destXIter.mask() = (destXIter.mask() & _growFullMask) | destMaskValue;
167 *destXIter = _padValue;