///////////////////////////////////////////////////////////////////////////// // // This sequence is (almost) identical to the VisSDK CVisSequence with the // exception, that this sequence handle CDImageApp images // // This file contains a full copy of the VisSequence class code // from the file vissequence.inl // // Copyright © 1999 // // IMM, Department of Mathematical Modelling // Section for Image Analysis // Technical University of Denmark, Building 321 // DK-2800 Lyngby, Denmark // http://www.imm.dtu.dk/~diva // // author: Rune Fisker // // Disclaimer: // // No guarantees of performance accompany this software, // nor is any responsibility assumed on the part of the author(s). // The software has been tested extensively and every effort has been // made to insure its reliability. // // This software is provided by IMM and the contributor(s) ``as is'' and // any express or implied warranties, including, but not limited to, the // implied warranties of merchantability and fitness for a particular purpose // are disclaimed. In no event shall IMM or the contributor(s) be liable // for any direct, indirect, incidental, special, exemplary, or consequential // damages (including, but not limited to, procurement of substitute goods // or services; loss of use, data, or profits; or business interruption) // however caused and on any theory of liability, whether in contract, strict // liability, or tort (including negligence or otherwise) arising in any way // out of the use of this software, even if advised of the possibility of // such damage. // // This software is partly based on the Microsoft Vision Software Developers Kit VisSDK // ///////////////////////////////////////////////////////////////////////////// #ifndef __VIS_APP_IMAGEQUEUE_INL__ #define __VIS_APP_IMAGEQUEUE_INL__ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #ifdef _DEBUG #undef new #define new DEBUG_NEW #undef THIS_FILE #define THIS_FILE __FILE__ #endif // _DEBUG template inline CDVisSequence::CDVisSequence(int nLength, int evissequence) : CVisSequenceBase(EVisPixFmtGet(), evissequence) { Assign(nLength); } template inline CDVisSequence::CDVisSequence(int nLength, const CDVisSequence::T_Image& refimage, int evissequence) : CVisSequenceBase(EVisPixFmtGet(), evissequence), m_IsDying(false) { Assign(nLength, refimage); } template inline CDVisSequence::CDVisSequence(int nLength, const CVisShape& refshape, int evissequence) : CVisSequenceBase(EVisPixFmtGet(), evissequence), m_IsDying(false) { Assign(nLength, refshape); } template inline CDVisSequence::CDVisSequence( const CDVisSequence& refsequence, int iFirst, int iLim) : CVisSequenceBase(EVisPixFmtGet(), refsequence.SequenceOptions()), m_IsDying(false) { assert(PixFmt() == refsequence.PixFmt()); Assign(refsequence, iFirst, iLim); CopyPImageSource(&(refsequence.ImageSource())); } template inline CDVisSequence::CDVisSequence( const CDVisSequence& refsequence, int iFirst, int iLim, int evissequence) : CVisSequenceBase(EVisPixFmtGet(), evissequence), m_IsDying(false) { assert(PixFmt() == refsequence.PixFmt()); Assign(refsequence, iFirst, iLim); CopyPImageSource(&(refsequence.ImageSource())); } template inline CDVisSequence& CDVisSequence::operator=( const CDVisSequence& refsequence) { CVisSequenceBase::operator=(refsequence); return *this; } template inline CDVisSequence::~CDVisSequence(void) { m_IsDying = true; SequenceIsDying(); } template inline const CDVisSequence::T_Image& CDVisSequence::Front(void) const { return (const CDVisSequence::T_Image&) CVisSequenceBase::Front(); } template inline CDVisSequence::T_Image& CDVisSequence::Front(void) { return (CDVisSequence::T_Image&) CVisSequenceBase::Front(); } template inline const CDVisSequence::T_Image& CDVisSequence::Back(void) const { return (const CDVisSequence::T_Image&) CVisSequenceBase::Back(); } template inline CDVisSequence::T_Image& CDVisSequence::Back(void) { return (CDVisSequence::T_Image&) CVisSequenceBase::Back(); } template inline const CDVisSequence::T_Image& CDVisSequence::At(int i) const { // old line was not working for CVisApp<> only for CVisImage<> (rf) return (dynamic_cast (CVisSequenceBase::At(i)) ); // return (const CDVisSequence::T_Image&) CVisSequenceBase::At(i); } template inline CDVisSequence::T_Image& CDVisSequence::At(int i) { // old line was not working for CVisApp<> only for CVisImage<> (rf) return (dynamic_cast (CVisSequenceBase::At(i)) ); // return (CDVisSequence::T_Image&) CVisSequenceBase::At(i); } template inline const CDVisSequence::T_Image& CDVisSequence::operator[](int i) const { // old line was not working for CVisApp<> only for CVisImage<> (rf) return (dynamic_cast (CVisSequenceBase::At(i)) ); // return (const CDVisSequence::T_Image&) CVisSequenceBase::At(i); } template inline CDVisSequence::T_Image& CDVisSequence::operator[](int i) { // old line was not working for CVisApp<> only for CVisImage<> (rf) return (dynamic_cast (CVisSequenceBase::At(i)) ); // return (CDVisSequence::T_Image&) CVisSequenceBase::At(i); } template inline bool CDVisSequence::GetFront( CDVisSequence::T_Image& refimage, DWORD cmsTimeout) { return CVisSequenceBase::GetFront(refimage, cmsTimeout); } template inline bool CDVisSequence::GetBack( CDVisSequence::T_Image& refimage, DWORD cmsTimeout) { return CVisSequenceBase::GetBack(refimage, cmsTimeout); } template inline bool CDVisSequence::GetAt(int i, CDVisSequence::T_Image& refimage, DWORD cmsTimeout) { return CVisSequenceBase::GetAt(i, refimage, cmsTimeout); } template inline void CDVisSequence::Push(void) { CVisSequenceBase::PushBack(); } template inline void CDVisSequence::Push( const CDVisSequence::T_Image& refimage) { CVisSequenceBase::PushBack(refimage); } template inline void CDVisSequence::Push(const CVisShape& refshape) { CVisSequenceBase::PushBack(refshape); } template inline bool CDVisSequence::Pop(void) { return CVisSequenceBase::PopFront(); } template inline bool CDVisSequence::Pop(DWORD cmsTimeout) { return CVisSequenceBase::PopFront(cmsTimeout); } template inline bool CDVisSequence::Pop( CDVisSequence::T_Image& refimage, DWORD cmsTimeout) { return CVisSequenceBase::PopFront(refimage, cmsTimeout); } template inline void CDVisSequence::PushFront(void) { CVisSequenceBase::PushFront(); } template inline void CDVisSequence::PushFront( const CDVisSequence::T_Image& refimage) { CVisSequenceBase::PushFront(refimage); } template inline void CDVisSequence::PushFront(const CVisShape& refshape) { CVisSequenceBase::PushFront(refshape); } template inline bool CDVisSequence::PopFront(void) { return CVisSequenceBase::PopFront(); } template inline bool CDVisSequence::PopFront( CDVisSequence::T_Image& refimage, DWORD cmsTimeout) { return CVisSequenceBase::PopFront(refimage, cmsTimeout); } template inline void CDVisSequence::PushBack(void) { CVisSequenceBase::PushBack(); } template inline void CDVisSequence::PushBack( const CDVisSequence::T_Image& refimage) { CVisSequenceBase::PushBack(refimage); } template inline void CDVisSequence::PushBack(const CVisShape& refshape) { CVisSequenceBase::PushBack(refshape); } template inline bool CDVisSequence::PopBack(void) { return CVisSequenceBase::PopBack(); } template inline bool CDVisSequence::PopBack( CDVisSequence::T_Image& refimage, DWORD cmsTimeout) { return CVisSequenceBase::PopBack(refimage, cmsTimeout); } template inline void CDVisSequence::Assign(int n) { CVisSequenceBase::Assign(n); } template inline void CDVisSequence::Assign(int n, const CDVisSequence::T_Image& refimage) { CVisSequenceBase::Assign(n, refimage); } template inline void CDVisSequence::Assign(int n, const CVisShape& refshape) { CVisSequenceBase::Assign(n, refshape); } template inline void CDVisSequence::Assign( const CDVisSequence& refsequence, int iFirst, int iLim) { CVisSequenceBase::Assign(refsequence, iFirst, iLim); } #ifdef LATER // Build problems template inline void CDVisSequence::Assign( CDVisSequence& refsequence, int iFirst, int iLim) { CVisSequenceBase::Assign(refsequence, iFirst, iLim); } #endif // LATER template inline void CDVisSequence::Resize(int n) { CVisSequenceBase::Resize(n); } template inline void CDVisSequence::Resize(int n, const CDVisSequence::T_Image& refimage) { CVisSequenceBase::Resize(n, refimage); } template inline void CDVisSequence::Resize(int n, const CVisShape& refshape) { CVisSequenceBase::Resize(n, refshape); } template inline void CDVisSequence::Insert(int i) { CVisSequenceBase::Insert(i); } template inline void CDVisSequence::Insert(int i, int n) { CVisSequenceBase::Insert(n, n); } template inline void CDVisSequence::Insert(int i, const CVisShape& refshape) { CVisSequenceBase::Insert(i, refshape); } template inline void CDVisSequence::Insert(int i, int n, const CVisShape& refshape) { CVisSequenceBase::Insert(i, n, refshape); } template inline void CDVisSequence::Insert(int i, const CDVisSequence::T_Image& refimage) { CVisSequenceBase::Insert(i, refimage); } template inline void CDVisSequence::Insert(int i, int n, const CDVisSequence::T_Image& refimage) { CVisSequenceBase::Insert(i, n, refimage); } template inline void CDVisSequence::Insert(int i, const CDVisSequence& refsequence, int iFirst, int iLim) { CVisSequenceBase::Insert(i, refsequence, iFirst, iLim); } #ifdef LATER // Build problems template inline void CDVisSequence::Insert(int i, CDVisSequence& refsequence, int iFirst, int iLim) { CVisSequenceBase::Insert(i, refsequence, iFirst, iLim); } #endif // LATER template inline bool CDVisSequence::Swap(int i) { return CVisSequenceBase::Swap(i); } template inline bool CDVisSequence::Swap(int i, int j) { return CVisSequenceBase::Swap(i, j); } template inline void CDVisSequence::Swap( CDVisSequence& refsequence) { CVisSequenceBase::Swap(refsequence); } template inline const CDVisSequence::T_Image& CDVisSequence::Cur(void) const { return At(ICur()); } template inline CDVisSequence::T_Image& CDVisSequence::Cur(void) { return At(ICur()); } template inline bool CDVisSequence::GetCur( CDVisSequence::T_Image& refimage) { return GetAt(ICur(), refimage); } template inline const type_info& CDVisSequence::PixelTypeInfo(void) const { return typeid(TPixel); } template inline const type_info& CDVisSequence::ImageTypeInfo(void) const { return typeid(CDVisSequence::T_Image); } template inline const type_info& CDVisSequence::ObjectTypeInfo(int iLevel) const { if (iLevel == 0) return typeid(CVisSequenceBase); return typeid(CDVisSequence); } template inline CVisSequenceBase *CDVisSequence::Clone(bool fCopyThis) const { if (fCopyThis) return new CDVisSequence(*this); return new CDVisSequence; } template inline CVisImageBase *CDVisSequence::PImageNew(void) const { return new CDVisSequence::T_Image; } template inline CVisImageBase *CDVisSequence::PImageNew( const CVisShape& refshape) const { return new CDVisSequence::T_Image(refshape); } template inline CVisImageBase *CDVisSequence::PImageNew( const CVisImageBase& refimage) const { assert(&refimage != 0); assert(refimage.PixelTypeInfo() == PixelTypeInfo()); // get CVisImage reference and assert (rf) const CDVisSequence::T_Image& refimageapp = dynamic_cast::T_Image &> (refimage); assert(&refimageapp != 0); return new CDVisSequence::T_Image(refimageapp); // old line not working for CVisApp<> only for CVisImage<> (rf) // return new CDVisSequence::T_Image(const CDVisSequence::T_Image &) refimage); } // template inline EVisPixFmt CDVisSequence::EVisPixFmtGet(void) { static EVisPixFmt evispixfmt = evispixfmtNil; if (evispixfmt == evispixfmtNil) { evispixfmt = VisPixFmtGetTPixel(TPixel()); } return evispixfmt; } template inline void CDVisSequence::AddCallback(T_PfnCallback pfnCallback, void *pvUser, bool fCallOnChange, bool fCallWhenDying) { SCallbackInfo callbackinfo; callbackinfo.m_pfnCallback = pfnCallback; callbackinfo.m_pvUser = pvUser; callbackinfo.m_fCallOnChange = fCallOnChange; callbackinfo.m_fCallWhenDying = fCallWhenDying; m_rgcallback.push_back(callbackinfo); } template inline void CDVisSequence::RemoveCallback(T_PfnCallback pfnCallback) { T_Rgcallback::iterator iteratorCur = m_rgcallback.begin(); T_Rgcallback::iterator iteratorLim = m_rgcallback.end(); for (; iteratorCur != iteratorLim; ++iteratorCur) { if (iteratorCur->m_pfnCallback == pfnCallback) { m_rgcallback.erase(iteratorCur); break; } } } template inline bool CDVisSequence::IsDying(void) const { return m_IsDying; } template inline void CDVisSequence::SequenceChanged(void) { T_Rgcallback::iterator iteratorCur = m_rgcallback.begin(); T_Rgcallback::iterator iteratorLim = m_rgcallback.end(); for (; iteratorCur != iteratorLim; ++iteratorCur) { assert(iteratorCur->m_pfnCallback != 0); if (iteratorCur->m_fCallOnChange) { ((T_PfnCallback) (iteratorCur->m_pfnCallback))(*this, iteratorCur->m_pvUser); } } } template inline void CDVisSequence::SequenceIsDying(void) { T_Rgcallback::iterator iteratorCur = m_rgcallback.begin(); T_Rgcallback::iterator iteratorLim = m_rgcallback.end(); for (; iteratorCur != iteratorLim; ++iteratorCur) { assert(iteratorCur->m_pfnCallback != 0); if (iteratorCur->m_fCallWhenDying) { ((T_PfnCallback) (iteratorCur->m_pfnCallback))(*this, iteratorCur->m_pvUser); } } } #endif // __VIS_APP_IMAGEQUEUE_INL__