00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "stdafx.h"
00026
00027 #include <cfl/resource.h>
00028
00029 #include <Camera/InterfaceDll.h>
00030
00031
00032 #include <cfl/ScanFilterTest.h>
00033 #include <cfl/FilterDlg_Test.h>
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
00043 LPCTSTR CScanFilterTest::m_lpcsFilterName = _T( "Test" );
00044
00045 LPCTSTR CScanFilterTest::m_lpcsShortFilterName = CScanFilterTest::m_lpcsFilterName;
00046
00047 IMPLEMENT_SERIAL( CScanFilterTest, CScanFilter, CFL_SCHEMAVERSION_FILTERTEST )
00048
00049
00050
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
00065
00066 CScanFilterTest::~CScanFilterTest()
00067 {
00068 ;
00069 }
00070
00071
00072
00073
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
00093
00094
00095 void CScanFilterTest::ReadFilterSettings()
00096 {
00097
00098
00099 CWinApp* pApp = AfxGetApp();
00100
00101 if ( Q_INVALID( NULL == pApp ) )
00102 return ;
00103
00104
00105
00106
00107 SetParameters( pApp->GetProfileString( gCflRegistrySubkey, m_lpcsFilterName, _T( "0" ) ) );
00108 }
00109
00110
00111
00112
00113
00114 void CScanFilterTest::WriteFilterSettings() const
00115 {
00116
00117
00118 CWinApp* pApp = AfxGetApp();
00119
00120 if ( Q_INVALID( NULL == pApp ) )
00121 return ;
00122
00123
00124
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
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 }
00184
00185
00186
00187
00188
00189
00190 LPCTSTR CScanFilterTest::GetParameters() const
00191 {
00192
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
00212
00213
00214 BOOL CScanFilterTest::SetParameters( LPCTSTR lpParameters )
00215 {
00216
00217
00218 if ( Q_INVALID( NULL == lpParameters && "CScanFilterTest (SetParameters): parameters expected, none provided (NULL)." ) )
00219 {
00220 return FALSE;
00221 }
00222
00223
00224
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
00257
00258
00259 BOOL CScanFilterTest::RunModeless( CWnd* pParentWnd, CDocument* pDoc )
00260 {
00261
00262
00263 CFilterDlg_TestPtr pDlg = new CFilterDlg_Test();
00264
00265 if ( Q_INVALID( NULL == pDlg ) )
00266 return FALSE;
00267
00268 pDlg->SetParameters( this, pDoc );
00269
00270
00271
00272
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
00290
00291
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
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
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
00385
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
00459
00460