Filter Library Camera Interface Physics

ScanFilterTest.cpp

00001 /*
00002  * ScanFilterTest.cpp - test filter.
00003  *
00004  * This file is part of the Camera Filter Library.
00005  * Computer Aided Measurement Environment for Realtime Atomic imaging (Camera)
00006  *
00007  * Copyright (C) 2004-2005, Leiden Probe Microscopy.
00008  * Copyright (C) 2004-2005, Universiteit Leiden.
00009  *
00010  * Authors: M. Seynen (original), Martin J. Moene
00011  *
00012  * $Id: ScanFilterTest.cpp 446 2006-12-13 12:20:25Z moene $
00013  */
00014 
00015 /*
00016  * configuration defines:
00017  */
00018 
00019 // currently nothing
00020 
00021 /*
00022  * end of configuration defines.
00023  */
00024 
00025 #include "stdafx.h"                     // for common (pre-compiled) headers
00026 //#include <cfl/stdafx.h>                 // for common (pre-compiled) headers
00027 #include <cfl/resource.h>               // for messages and other resources
00028 
00029 #include <Camera/InterfaceDll.h>        // Camera--Filter Library interface
00030 //#include <Camera/CameraGeneralDefines.h>// for g_d2PI
00031 
00032 #include <cfl/ScanFilterTest.h>         // this filter's header
00033 #include <cfl/FilterDlg_Test.h>         // this filter's dialog
00034 
00035 #ifdef _DEBUG
00036 #undef THIS_FILE
00037 static char THIS_FILE[]=__FILE__;
00038 #define new DEBUG_NEW
00039 #endif
00040 
00041 #define CFL_SCHEMAVERSION_FILTERTEST 0  // permanent storage schema version
00042                                         // this filter's name
00043 LPCTSTR CScanFilterTest::m_lpcsFilterName = _T( "Test" );
00044                                         // this filter's short name
00045 LPCTSTR CScanFilterTest::m_lpcsShortFilterName = CScanFilterTest::m_lpcsFilterName;
00046                                         // serialization
00047 IMPLEMENT_SERIAL( CScanFilterTest, CScanFilter, CFL_SCHEMAVERSION_FILTERTEST )
00048 
00049 /*
00050  * constructor.
00051  */
00052 CScanFilterTest::CScanFilterTest() :
00053    m_eModeL2R( MODE_SIN ),
00054    m_eModeR2L( MODE_SIN )
00055 {
00056    m_csFilterName = m_lpcsFilterName;
00057 
00058    srand( static_cast<unsigned int>(time( 0 ) ) );
00059 
00060    ReadFilterSettings();
00061 }
00062 
00063 /*
00064  * destructor.
00065  */
00066 CScanFilterTest::~CScanFilterTest()
00067 {
00068    ; // do nothing
00069 }
00070 
00071 /*
00072  * store or retrieve the object's settings;
00073  * see also CScanFilterNull::Serialize().
00074  */
00075 void CScanFilterTest::Serialize(CArchive& ar)
00076 {
00077    CScanFilter::Serialize( ar );
00078 
00079    if ( ar.IsStoring() )
00080    {
00081       ar << static_cast< int >( m_eModeL2R ) << static_cast< int >( m_eModeR2L );
00082    }
00083    else
00084    {
00085       int op;
00086       ar >> op;  m_eModeL2R = static_cast< ModeType >( op );
00087       ar >> op;  m_eModeR2L = static_cast< ModeType >( op );
00088    }
00089 };
00090 
00091 /*
00092  * \brief configure filter with settings as provided by the application on the
00093  * filterlist window (e.g. via registry); see also CScanFilterNull::ReadFilterSettings().
00094  */
00095 void CScanFilterTest::ReadFilterSettings()
00096 {
00097 //   Q_LOG( _T("CScanFilterTest::ReadFilterSettings()") );
00098 
00099    CWinApp* pApp = AfxGetApp();
00100 
00101    if ( Q_INVALID( NULL == pApp ) )
00102       return ;
00103 
00104    /*
00105     * parameter string:
00106     */
00107    SetParameters( pApp->GetProfileString( gCflRegistrySubkey, m_lpcsFilterName, _T( "0" ) ) );
00108 }
00109 
00110 /*
00111  * \brief save filter settings e.g. for use with the filterlist window (e.g. via registry);
00112  * see also ReadFilterSettings().
00113  */
00114 void CScanFilterTest::WriteFilterSettings() const
00115 {
00116 //   Q_LOG( _T("CScanFilterTest::WriteFilterSettings()") );
00117 
00118    CWinApp* pApp = AfxGetApp();
00119 
00120    if ( Q_INVALID( NULL == pApp ) )
00121       return ;
00122 
00123    /*
00124     * parameter string:
00125     */
00126    LPCTSTR pStr = GetParameters();
00127 
00128    if ( pStr )
00129    {
00130       pApp->WriteProfileString( gCflRegistrySubkey, m_lpcsFilterName, pStr );
00131       delete const_cast<LPTSTR>( pStr );
00132    }
00133 }
00134 
00135 /*
00136  * anonymous namespace
00137  */
00138 namespace
00139 {
00140    struct Table
00141    {
00142       char* name; CScanFilterTest::ModeType mode;
00143    }
00144    table[] =
00145    {
00146       { "sin"   , CScanFilterTest::MODE_SIN,    },
00147       { "saw"   , CScanFilterTest::MODE_SAW,    },
00148       { "ramp"  , CScanFilterTest::MODE_RAMP,   },
00149       { "zero"  , CScanFilterTest::MODE_ZERO,   },
00150       { "neg"   , CScanFilterTest::MODE_NEG,    },
00151       { "copy"  , CScanFilterTest::MODE_COPY,   },
00152       { "box"   , CScanFilterTest::MODE_BOX,    },
00153       { "ripple", CScanFilterTest::MODE_RIPPLE, },
00154       { "noise" , CScanFilterTest::MODE_NOISE,  },
00155    };
00156 
00157    bool findMode( const char* name, CScanFilterTest::ModeType& mode )
00158    {
00159       for ( Table* p = table; p < table + dim(table); ++p )
00160       {
00161          if ( 0 == _stricmp( name, p->name ) )
00162          {
00163             mode = p->mode;
00164             return true;
00165          }
00166       }
00167       return false;
00168    }
00169 
00170    bool findName( CScanFilterTest::ModeType mode, char*& name )
00171    {
00172       for ( Table* p = table; p < table + dim(table); ++p )
00173       {
00174          if ( mode == p->mode )
00175          {
00176             name = p->name;
00177             return true;
00178          }
00179       }
00180       return false;
00181    }
00182 
00183 } // anonymous namespace
00184 
00185 /*
00186  * provide current filter parameter(s) for filter-scripting capture
00187  * in the main application;
00188  * see also CScanFilterNull::GetParameters().
00189  */
00190 LPCTSTR CScanFilterTest::GetParameters() const
00191 {
00192 //   Q_LOG( _T("CScanFilterTest::GetParameters()") );
00193 
00194    char* partl2r = NULL;
00195    char* partr2l = NULL;
00196 
00197    if ( Q_INVALID( ( !findName( m_eModeL2R, partl2r ) || !findName( m_eModeR2L, partr2l ) &&
00198            "CScanFilterTest (GetParameters): invalid function name." ) ) )
00199    {
00200       return NULL;
00201    }
00202 
00203    CString csParameters;
00204 
00205    csParameters.Format( _T( "%s,%s" ), partl2r, partr2l );
00206 
00207    return strcpy( new TCHAR[ csParameters.GetLength() + 1 ], csParameters );
00208 }
00209 
00210 /*
00211  * set parameters for filter-script execution of filter;
00212  * see also CScanFilterNull::SetParameters().
00213  */
00214 BOOL CScanFilterTest::SetParameters( LPCTSTR lpParameters )
00215 {
00216 //   Q_LOG( _T("CScanFilterTest::SetParameters()") );
00217 
00218    if ( Q_INVALID( NULL == lpParameters && "CScanFilterTest (SetParameters): parameters expected, none provided (NULL)." ) )
00219    {
00220       return FALSE;
00221    }
00222 
00223    /*
00224     * set defaults, read parameter string with factor and optional offset:
00225     */
00226    char l2rname[10]; l2rname[0] = '\0';
00227    char r2lname[10]; r2lname[0] = '\0';
00228 
00229    int nfields = _stscanf( lpParameters, _T( "%[a-zA-Z],%[a-zA-Z]" ), l2rname, r2lname );
00230 
00231    if ( Q_INVALID( 2 > nfields && "CScanFilterTest (SetParameters): two function names expected, got fewer." ) )
00232    {
00233       Q_LOG( l2rname );
00234       Q_LOG( r2lname );
00235       return FALSE;
00236    }
00237 
00238    if ( !findMode( l2rname, m_eModeL2R ) )
00239    {
00240       Q_LOG( "CScanFilterTest (SetParameters): invalid L2R function name." );
00241       Q_LOG( l2rname );
00242       return FALSE;
00243    }
00244 
00245    if ( !findMode( r2lname, m_eModeR2L ) )
00246    {
00247       Q_LOG( "CScanFilterTest (SetParameters): invalid R2L function name." );
00248       Q_LOG( r2lname );
00249       return FALSE;
00250    }
00251 
00252    return TRUE;
00253 }
00254 
00255 /*
00256  * create filter dialog and pre Apply() filter to view result;
00257  * see also CScanFilterNull::RunModeless().
00258  */
00259 BOOL CScanFilterTest::RunModeless( CWnd* pParentWnd, CDocument* pDoc )
00260 {
00261 //   Q_LOG( _T("CScanFilterShift::RunModeless()") );
00262 
00263    CFilterDlg_TestPtr pDlg = new CFilterDlg_Test();
00264 
00265    if ( Q_INVALID( NULL == pDlg ) )
00266       return FALSE;
00267 
00268    pDlg->SetParameters( this, pDoc );   // (void) method
00269 
00270    /*
00271     * Create returns non-zero if dialog was created and initialized succesfully.
00272     * Note: no pDlg->DestroyWindow() must be done.
00273     */
00274    pDlg->Create( IDD_FILTERDLG_TEST, pParentWnd );
00275 
00276    m_pDlg = pDlg;
00277 
00278    BOOL bRet = Apply();
00279 
00280    if ( bRet )
00281    {
00282       pDlg->UpdateView();
00283    }
00284 
00285    return bRet;
00286 }
00287 
00288 /*
00289  * check parameters, take care of a properly sized output buffer,
00290  * set its name and copy filter parameters and process;
00291  * see also CScanFilterNull::ApplyCore().
00292  */
00293 BOOL CScanFilterTest::Apply()
00294 {
00295    if ( Q_INVALID( NULL == m_lpsbIn && "ensure input buffer") )
00296       return FALSE;
00297 
00298    if ( Q_INVALID( NULL == m_lpsbOut && "ensure output buffer" ) )
00299       return FALSE;
00300 
00301    /*
00302     * create output buffer:
00303     */
00304    Q_RETURN( m_lpsbOut->CreateOutputBufferFor( *m_lpsbIn ) );
00305 
00306    m_lpsbOut->m_csBufferName = m_lpsbIn->m_csBufferName + _T(" - ") + m_lpcsShortFilterName;
00307 
00308    if ( IsInteractive() )
00309    {
00310       m_pDlg->SetDlgItemText( IDC_BUFFEROUTNAME, m_lpsbOut->m_csBufferName );
00311    }
00312 
00313    DWORD i;
00314 
00315 //   if (m_lpsbIn->m_dwFlags & SPM_SDBF_LEFT2RIGHT)
00316    if ( m_lpsbIn->HasLeftToRightScan () )
00317    {
00318       switch (m_eModeL2R)
00319       {
00320          case MODE_SAW:
00321             for (i=m_lpsbIn->m_dwPixelOffset; i<(m_lpsbIn->m_dwPixelOffset + m_lpsbIn->m_dwPixelCount); i++)
00322             {
00323                m_lpsbOut->m_pwData[i] = (short)(4*(i % (m_lpsbIn->m_dwSizeX/4)));
00324             }
00325             break;
00326 
00327          case MODE_SIN:
00328             for (i=m_lpsbIn->m_dwPixelOffset; i<(m_lpsbIn->m_dwPixelOffset + m_lpsbIn->m_dwPixelCount); i++)
00329             {
00330                m_lpsbOut->m_pwData[i] = (short)(m_lpsbIn->m_dwSizeX * sin (5.0 * g_2PI * (i % m_lpsbIn->m_dwSizeX) / m_lpsbIn->m_dwSizeX));
00331             }
00332             break;
00333 
00334          case MODE_RAMP:
00335             for (i=m_lpsbIn->m_dwPixelOffset; i<(m_lpsbIn->m_dwPixelOffset + m_lpsbIn->m_dwPixelCount); i++)
00336             {
00337                m_lpsbOut->m_pwData[i] = (short)(i % m_lpsbIn->m_dwSizeX);
00338             }
00339             break;
00340 
00341          case MODE_ZERO:
00342             ZeroMemory(m_lpsbOut->m_pwData + m_lpsbIn->m_dwPixelOffset, m_lpsbIn->m_dwPixelCount * sizeof(short));
00343             break;
00344 
00345          case MODE_NEG:
00346             for (i=m_lpsbIn->m_dwPixelOffset; i<(m_lpsbIn->m_dwPixelOffset + m_lpsbIn->m_dwPixelCount); i++)
00347             {
00348                m_lpsbOut->m_pwData[i] = (short) -m_lpsbIn->m_pwData[i];
00349             }
00350             break;
00351 
00352          case MODE_COPY:
00353             memcpy(m_lpsbOut->m_pwData + m_lpsbIn->m_dwPixelOffset, m_lpsbIn->m_pwData + m_lpsbIn->m_dwPixelOffset, m_lpsbIn->m_dwPixelCount * sizeof(short));
00354             break;
00355 
00356          case MODE_BOX:
00357             for (i=m_lpsbIn->m_dwPixelOffset; i<(m_lpsbIn->m_dwPixelOffset + m_lpsbIn->m_dwPixelCount); i++)
00358             {
00359                int x = i % m_lpsbIn->m_dwSizeX;
00360                int y = i / m_lpsbIn->m_dwSizeX;
00361                m_lpsbOut->m_pwData[i] = (y%32<16)&&(x%32<16)? (short) 8192 : (short) 0;
00362             }
00363             break;
00364 
00365          case MODE_RIPPLE:
00366             for (i=m_lpsbIn->m_dwPixelOffset; i<(m_lpsbIn->m_dwPixelOffset + m_lpsbIn->m_dwPixelCount); i++)
00367             {
00368                int x = (i % m_lpsbIn->m_dwSizeX) - m_lpsbIn->m_dwSizeX/2;
00369                int y = (i / m_lpsbIn->m_dwSizeX) - m_lpsbIn->m_dwSizeY/2;
00370                m_lpsbOut->m_pwData[i] = (short)(1024.0*sin ( g_2PI*sqrt((double)x*x + (double)y*y)/200.0 ));
00371             }
00372             break;
00373 
00374          case MODE_NOISE:
00375             for (i=m_lpsbIn->m_dwPixelOffset; i<(m_lpsbIn->m_dwPixelOffset + m_lpsbIn->m_dwPixelCount); i++)
00376             {
00377                m_lpsbOut->m_pwData[i] = (short) rand();
00378             }
00379             break;
00380       }
00381    }
00382 
00383 
00384 // If we have a double buffer, L2R and R2L, process that part too.
00385 //if ((m_lpsbIn->m_dwFlags & SPM_SDBF_RIGHT2LEFT) && (m_lpsbIn->m_dwFlags & SPM_SDBF_LEFT2RIGHT))
00386    if ( m_lpsbIn->HasRightToLeftScan() )
00387    {
00388       DWORD dwOffsetR2L = m_lpsbIn->m_dwSizeX*m_lpsbIn->m_dwSizeY;
00389       switch (m_eModeR2L)
00390       {
00391          case MODE_SAW:
00392             for (i=m_lpsbIn->m_dwPixelOffset; i<(m_lpsbIn->m_dwPixelOffset + m_lpsbIn->m_dwPixelCount); i++)
00393             {
00394                m_lpsbOut->m_pwData[i + dwOffsetR2L] = (short)(4*(i % (m_lpsbIn->m_dwSizeX/4)));
00395             }
00396             break;
00397 
00398          case MODE_SIN:
00399             for (i=m_lpsbIn->m_dwPixelOffset; i<(m_lpsbIn->m_dwPixelOffset + m_lpsbIn->m_dwPixelCount); i++)
00400             {
00401                m_lpsbOut->m_pwData[i + dwOffsetR2L] = (short)(m_lpsbIn->m_dwSizeX * sin (5.0 * g_2PI * (i % m_lpsbIn->m_dwSizeX) / m_lpsbIn->m_dwSizeX));
00402             }
00403             break;
00404 
00405          case MODE_NEG:
00406             for (i=m_lpsbIn->m_dwPixelOffset; i<(m_lpsbIn->m_dwPixelOffset + m_lpsbIn->m_dwPixelCount); i++)
00407             {
00408                m_lpsbOut->m_pwData[i + dwOffsetR2L] = (short) -m_lpsbIn->m_pwData[i + dwOffsetR2L];
00409             }
00410             break;
00411 
00412          case MODE_ZERO:
00413             ZeroMemory(m_lpsbOut->m_pwData + m_lpsbIn->m_dwPixelOffset + dwOffsetR2L, m_lpsbIn->m_dwPixelCount * sizeof(short));
00414             break;
00415 
00416          case MODE_RAMP:
00417             for (i=m_lpsbIn->m_dwPixelOffset; i<(m_lpsbIn->m_dwPixelOffset + m_lpsbIn->m_dwPixelCount); i++)
00418             {
00419                m_lpsbOut->m_pwData[i + dwOffsetR2L] = (short)(i % m_lpsbIn->m_dwSizeX);
00420             }
00421             break;
00422 
00423          case MODE_COPY:
00424             memcpy(m_lpsbOut->m_pwData + m_lpsbIn->m_dwPixelOffset + dwOffsetR2L, m_lpsbIn->m_pwData + m_lpsbIn->m_dwPixelOffset + dwOffsetR2L, m_lpsbIn->m_dwPixelCount * sizeof(short));
00425             break;
00426 
00427          case MODE_BOX:
00428             for (i=m_lpsbIn->m_dwPixelOffset; i<(m_lpsbIn->m_dwPixelOffset + m_lpsbIn->m_dwPixelCount); i++)
00429             {
00430                int x = i % m_lpsbIn->m_dwSizeX;
00431                int y = i / m_lpsbIn->m_dwSizeX;
00432                m_lpsbOut->m_pwData[i + dwOffsetR2L] = (y%32<16)&&(x%32<16)? (short) 8192 : (short) 0;
00433             }
00434             break;
00435 
00436          case MODE_RIPPLE:
00437             for (i=m_lpsbIn->m_dwPixelOffset; i<(m_lpsbIn->m_dwPixelOffset + m_lpsbIn->m_dwPixelCount); i++)
00438             {
00439                int x = (i % m_lpsbIn->m_dwSizeX) - m_lpsbIn->m_dwSizeX/2;
00440                int y = (i / m_lpsbIn->m_dwSizeX) - m_lpsbIn->m_dwSizeY/2;
00441                m_lpsbOut->m_pwData[i + dwOffsetR2L] = (short)(1024.0*sin ( g_2PI*sqrt((double)x*x + (double)y*y)/200.0 ));
00442             }
00443             break;
00444 
00445          case MODE_NOISE:
00446             for (i=m_lpsbIn->m_dwPixelOffset; i<(m_lpsbIn->m_dwPixelOffset + m_lpsbIn->m_dwPixelCount); i++)
00447             {
00448                m_lpsbOut->m_pwData[i + dwOffsetR2L] = (short) rand();
00449             }
00450             break;
00451       }
00452    }
00453    
00454    return TRUE;
00455 }
00456 
00457 /*
00458  * end of file
00459  */
00460 

Camera Filter Library documentation © 2004-2007 by Leiden Probe Microscopy