<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:΢ź
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>
Hi all, I'm using vtkImageStencil to create ROIs on an image. The vtkImageStencilData::Add() works well for me, but vtkImageStencilData::Subtract() will cause my program to crash form time to time.<br>By looking at the source code, the program crashes in vtkImageStencil.cxx line 194 where "tmpPtr" becomes invalid and (outSpanEndPtr - outPtr) becomes negative. I'm not sure whether vtkImageStencilData::Subtract() causes this problem or it's sth. else. Can anyone give some suggestions? <br>Lewes.<br>//////////////////////////<br>Environment: VC2009, WinXP, VTK5.8<br>crash point:<br>//----------------------------------------------------------------------------<br>template &lt;class T&gt;<br>void vtkImageStencilExecute(vtkImageStencil *self,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkImageData *inData, T *,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkImageData *inData2, T *,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkImageData *outData, T *,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int outExt[6], int id,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkInformation *outInfo)<br>{<br>&nbsp; vtkImageStencilData *stencil = self-&gt;GetStencil();<br><br>&nbsp; vtkImageIterator&lt;T&gt; inIter(inData, outExt);<br>&nbsp; vtkImageStencilIterator&lt;T&gt; outIter(outData, stencil, outExt, self, id);<br><br>&nbsp; int numscalars = outData-&gt;GetNumberOfScalarComponents();<br><br>&nbsp; // whether to reverse the stencil<br>&nbsp; bool reverseStencil = (self-&gt;GetReverseStencil() != 0);<br><br>&nbsp; // if no background image is provided in inData2<br>&nbsp; if (inData2 == 0)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; // set color for area outside of input volume extent<br>&nbsp;&nbsp;&nbsp; T *background;<br>&nbsp;&nbsp;&nbsp; vtkAllocBackground(self, background, outInfo);<br><br>&nbsp;&nbsp;&nbsp; T *inPtr = inIter.BeginSpan();<br>&nbsp;&nbsp;&nbsp; T *inSpanEndPtr = inIter.EndSpan();<br>&nbsp;&nbsp;&nbsp; while (!outIter.IsAtEnd())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T* outPtr = outIter.BeginSpan();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T* outSpanEndPtr = outIter.EndSpan();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T *tmpPtr = inPtr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int tmpInc = numscalars;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(outIter.IsInStencil() ^ reverseStencil))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmpPtr = background;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmpInc = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // move inPtr forward by the span size<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inPtr += (outSpanEndPtr - outPtr);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (outPtr != outSpanEndPtr)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // CopyPixel increments outPtr but not tmpPtr<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkCopyPixel(outPtr, tmpPtr, numscalars); // crashes here<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmpPtr += tmpInc;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outIter.NextSpan();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // this occurs at the end of a full row<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (inPtr == inSpanEndPtr)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inIter.NextSpan();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inPtr = inIter.BeginSpan();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inSpanEndPtr = inIter.EndSpan();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; vtkFreeBackground(self, background);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp; // if a background image is given in inData2<br>&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; vtkImageIterator&lt;T&gt; inIter2(inData2, outExt);<br><br>&nbsp;&nbsp;&nbsp; T *inPtr = inIter.BeginSpan();<br>&nbsp;&nbsp;&nbsp; T *inPtr2 = inIter2.BeginSpan();<br>&nbsp;&nbsp;&nbsp; T *inSpanEndPtr = inIter.EndSpan();<br>&nbsp;&nbsp;&nbsp; while (!outIter.IsAtEnd())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T* outPtr = outIter.BeginSpan();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T* outSpanEndPtr = outIter.EndSpan();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T *tmpPtr = inPtr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(outIter.IsInStencil() ^ reverseStencil))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmpPtr = inPtr2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // move inPtr forward by the span size<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inPtr += (outSpanEndPtr - outPtr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inPtr2 += (outSpanEndPtr - outPtr);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (outPtr != outSpanEndPtr)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // CopyPixel increments outPtr but not tmpPtr<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkCopyPixel(outPtr, tmpPtr, numscalars);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmpPtr += numscalars;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outIter.NextSpan();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // this occurs at the end of a full row<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (inPtr == inSpanEndPtr)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inIter.NextSpan();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inIter2.NextSpan();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inPtr = inIter.BeginSpan();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inPtr2 = inIter2.BeginSpan();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inSpanEndPtr = inIter.EndSpan();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>                                               </div></body>
</html>