00001
00002
00003
00004
00005
00006 #ifndef Impala_Visualization_DirImViewer_h
00007 #define Impala_Visualization_DirImViewer_h
00008
00009 #include <time.h>
00010
00011 #include "OglGui/FramesPerSecond.h"
00012 #include "OglGui/DocDimensions.h"
00013 #include "OglGui/DocFlowDrag.h"
00014 #include "Util/DirImageFileNames.h"
00015 #include "Core/Array/ReadFile.h"
00016 #include "Visualization/RgbOglImage.h"
00017
00018 #ifndef NO_RAW
00019 #include "Core/Stream/RgbDataSrcFactory.h"
00020 #endif
00021
00022 namespace Impala {
00023 namespace Visualization {
00024
00025 class DirImViewer : public OglGui::Window,
00026 public OglGui::DocDimensions
00027 {
00028 public:
00029 typedef OglGui::Window Window;
00030 typedef Core::Array::Array2dVec3UInt8 Array2dVec3UInt8;
00031 #ifndef NO_RAW
00032 typedef Core::Stream::RgbDataSrcFactory RgbDataSrcFactory;
00033 typedef Core::Stream::RgbDataSrc RgbDataSrc;
00034 #endif
00035
00036 DirImViewer(int x, int y, int w, int h, int nOnRow=4) :
00037 Window(x,y,w,h)
00038 {
00039 Init(w,h,nOnRow);
00040 }
00041
00042 DirImViewer(Window* parent, int w, int h, int nOnRow=4) :
00043 Window(parent,w,h)
00044 {
00045 Init(w,h,nOnRow);
00046 }
00047
00048 DirImViewer(Window* parent, int x, int y, int w, int h, int nOnRow=4) :
00049 Window(parent,x,y,w,h)
00050 {
00051 Init(w,h,nOnRow);
00052 }
00053
00054 ~DirImViewer()
00055 {
00056 ClearFiles();
00057 }
00058
00059 void OpenDir(strconst dirName)
00060 {
00061 ClearFiles();
00062 mDirName = dirName;
00063 String fExt = FileNameExt(dirName);
00064 #ifndef NO_RAW
00065 if ((fExt == "raw") || (fExt == "mpg") || (fExt == "mpeg"))
00066 {
00067 #ifdef REPOSITORY_USED
00068 OpenSrc(Persistency::RgbDataSrcLocator("file:", "abs", dirName));
00069 #else
00070 RgbDataSrcFactory& f = RgbDataSrcFactory::Instance();
00071 mRgbDataSrc = f.Construct(dirName, fExt);
00072 #endif //REPOSITORY_USED
00073 }
00074 #endif // NO_RAW
00075 Util::DirImageFileNames(dirName, mFileNames);
00076 HandleDocDimensions(true,true);
00077 }
00078
00079 #if !defined(NO_RAW) && defined(REPOSITORY_USED)
00080 void OpenSrc(const Persistency::RgbDataSrcLocator& loc)
00081 {
00082 ClearFiles();
00083 mDirName = loc.GetName();
00084 RgbDataSrcFactory& f = RgbDataSrcFactory::Instance();
00085
00086 mRgbDataSrc = f.Construct(loc, "");
00087 HandleDocDimensions(true,true);
00088 }
00089 #endif
00090
00091 void NrOfImOnRow(int n) { mFixedCellDims = !(mNrOfImOnRow = n); }
00092 int NrOfImOnRow() { return mNrOfImOnRow; }
00093 void ShowNames(bool mode) { mExtH = (mShowNames = mode) ? 6 : 0; }
00094 bool ShowNames() { return mShowNames; }
00095 void ShowDims(bool mode) { mShowDims = mode; }
00096 bool ShowDims() { return mShowDims; }
00097 int CellWidth() { return mCellW; }
00098 int CellHeight() { return mCellH; }
00099 void PagingExtra(int x) { mPagingExtra = x; }
00100 int PagingExtra() { return mPagingExtra; }
00101
00102 void MaxZoom(double mz) { mMaxZoom = mz; }
00103
00104 int NrOfFiles()
00105 {
00106 #ifndef NO_RAW
00107 if (mRgbDataSrc)
00108 return mRgbDataSrc->LastFrame();
00109 #endif
00110 return mFileNames.size();
00111 }
00112
00113 void FixedCellWidth(int w)
00114 {
00115 if (mFixedCellDims = (w > 20))
00116 mCellH = mExtH + (mCellW = w);
00117 else
00118 mCellH = mExtH + (mCellW = 128);
00119 }
00120
00121 int ClampImIdx(int& idx)
00122 {
00123 if (idx < 0)
00124 idx = 0;
00125 if (idx > NrOfFiles()-1)
00126 idx = NrOfFiles()-1;
00127 return idx;
00128 }
00129
00130 int ClampViewIdx(int& idx)
00131 {
00132 if (idx < 0)
00133 idx = 0;
00134 if (idx > mViews.size()-1)
00135 idx = mViews.size()-1;
00136 return idx;
00137 }
00138
00139 void ClearFiles()
00140 {
00141 #ifndef NO_RAW
00142 if (mRgbDataSrc)
00143 {
00144 delete mRgbDataSrc;
00145 mRgbDataSrc = 0;
00146 }
00147 #endif
00148 unsigned int i;
00149 for (i=0 ; i<mFileNames.size() ; i++)
00150 delete mFileNames[i];
00151 mFileNames.clear();
00152 }
00153
00154 void ClearViews(int start=0, int end=10000)
00155 {
00156 ClampViewIdx(start);
00157 ClampViewIdx(end);
00158 for (int i=start; i<end; i++)
00159 {
00160 viewSys.SetImage(mViews[i], 0);
00161 viewSys.ClearTags(mViews[i], visibleTag);
00162 mViews[i]->UserData1 = (void*)-1;
00163 }
00164 }
00165
00166 int Y2Row(int y)
00167 {
00168 return (mDocY + mDocH - y) / mCellH;
00169 }
00170 int Row2Y(int row)
00171 {
00172 return (mDocY+mDocH-(row+1)*mCellH);
00173 }
00174
00175 int NrRows()
00176 {
00177 return NrOfFiles() / mNrOfImOnRow;
00178 }
00179
00180 int FindFirstVisible()
00181 {
00182 int first = Y2Row(H()) * mNrOfImOnRow;
00183 return ClampImIdx(first);
00184 }
00185 int FindLastVisible()
00186 {
00187 int last = Y2Row(-mCellH) * mNrOfImOnRow;
00188 return ClampImIdx(last);
00189 }
00190
00191 int FindIndexFwd(int imIdx, int start=0)
00192 {
00193 ClampViewIdx(start);
00194 for (int i=start; i<mViews.size(); i++)
00195 {
00196 if (imIdx == (long long) mViews[i]->UserData1)
00197 return i;
00198 }
00199 return -1;
00200 }
00201
00202 int FindIndexBwd(int imIdx, int start=10000)
00203 {
00204 ClampViewIdx(start);
00205 for (int i=start; i>=0; i--)
00206 {
00207 if (imIdx == (long long) mViews[i]->UserData1)
00208 return i;
00209 }
00210 return -1;
00211 }
00212
00213 int FindIndex(int imIdx, int start, bool backward=false)
00214 {
00215 if (backward)
00216 return FindIndexBwd(imIdx, start);
00217 else
00218 return FindIndexFwd(imIdx, start);
00219 }
00220
00221 void HandleDocDimensions(bool resizing=false, bool reset=false)
00222 {
00223 if (!mFixedCellDims)
00224 {
00225 mCellW = W() / mNrOfImOnRow;
00226 mCellH = mCellW + (mShowNames ? mExtH : 0);
00227 }
00228 else if ((mNrOfImOnRow = W() / mCellW)<1)
00229 mNrOfImOnRow = 1;
00230
00231 int docH = (NrOfFiles() / mNrOfImOnRow) * mCellH;
00232
00233 if (resizing && mOldStartIm != -1)
00234 {
00235 int row = mOldStartIm / mNrOfImOnRow;
00236 mDocY = H() - (NrRows() - row) * mCellH;
00237 }
00238 if (mDocY < (-docH+H()))
00239 mDocY = -docH+H();
00240 if (reset)
00241 SetDocDimensions(0,-docH+H(),W(), docH);
00242 else
00243 SetDocDimensions(mDocX, mDocY, W(), docH);
00244 }
00245
00246 void HandleViewText(OGLVIEW* oglView)
00247 {
00248 if (!(mShowNames || mShowDims))
00249 return;
00250
00251 OGLIMAGE* oglIm = oglView->im;
00252 int txtX = oglView->x;
00253 int txtY = oglView->y-14;
00254 std::string txt = "";
00255
00256 if (mShowNames)
00257 {
00258 int userData1 = (long long)oglView->UserData1;
00259 #ifndef NO_RAW
00260 if (mRgbDataSrc)
00261 txt = "im " + MakeString(userData1) + " ";
00262 else
00263 #endif
00264 txt = *mFileNames[userData1] + " ";
00265 }
00266 if (mShowDims)
00267 {
00268 char buf[20];
00269 sprintf(buf, "[%dx%d]", oglIm->w, oglIm->h);
00270 txt += buf;
00271 }
00272 oglSys.StartScissor(mOglWnd,txtX,txtY-4,oglView->w,20);
00273 oglSys.PosColPrintf(mOglWnd,txtX,txtY,GetForeground(),"%s",txt.c_str());
00274 oglSys.EndScissor();
00275 }
00276
00277 void HandleViewZoom(OGLVIEW* oglView)
00278 {
00279 OGLIMAGE* oglIm = oglView->im;
00280 float zoomX, zoomY;
00281
00282 if (oglIm->w >= oglIm->h)
00283 zoomY = zoomX = (oglView->w)/(float)oglIm->w;
00284 else
00285 zoomX = zoomY = (oglView->h)/(float)oglIm->h;
00286 if (zoomX > mMaxZoom)
00287 zoomX = zoomY = mMaxZoom;
00288 viewSys.SetZoom(oglView, zoomX, zoomY);
00289 }
00290
00291 virtual void HandleViewDecoration(OGLVIEW* view)
00292 {
00293 SetSolidLineColor(oglLIGHTGREY);
00294 DrawRectangle(view->x-2, view->y-2, view->w+4, view->h+4);
00295 }
00296
00297 void HandleViewSettings(int vIdx)
00298 {
00299 OGLVIEW* oglView;
00300 if (vIdx<0 || vIdx>mViews.size() || !(oglView=mViews[vIdx]))
00301 return;
00302 if (!mViews[vIdx]->im)
00303 return;
00304 HandleViewZoom(oglView);
00305 HandleViewText(oglView);
00306 HandleViewDecoration(oglView);
00307 }
00308
00309 void ViewCreateImage(int dstIdx, int imIdx)
00310 {
00311 Array2dVec3UInt8* ar = 0;
00312 #ifndef NO_RAW
00313 if (mRgbDataSrc)
00314 {
00315 mRgbDataSrc->GotoFrame(imIdx);
00316 int imW = mRgbDataSrc->FrameWidth();
00317 int imH = mRgbDataSrc->FrameHeight();
00318 ar = new Array2dVec3UInt8(imW, imH, 0, 0, 0, false);
00319 memcpy( (void *) ar->CPB(0, 0), mRgbDataSrc->DataPtr(), imW*imH*3 );
00320 }
00321 else
00322 #endif
00323 {
00324 std::string fName = mDirName + "/" + *mFileNames[imIdx];
00325 #ifndef REPOSITORY_USED // Here comes the deprecated stuff
00326 Core::Array::ReadFile(ar, fName, &Util::Database::GetInstance());
00327 #else // REPOSITORY_USED
00328
00329 Persistency::FileLocator loc(fName);
00330 typedef Persistency::RepositoryInFileSystem FS;
00331 Persistency::File f = FS::GetInstance().GetFile(loc, false, false);
00332 Core::Array::ReadFile(ar, f);
00333 #endif // REPOSITORY_USED
00334 if (ar == 0)
00335 {
00336 ILOG_WARN("Could not read file: " << fName);
00337 }
00338 }
00339 if (ar != 0)
00340 {
00341 OGLIMAGE* oglIm = RgbOglImage::OglImage(ar);
00342 viewSys.SetImage(mViews[dstIdx],oglIm);
00343 ReleaseOglImage(oglIm);
00344 } else {
00345 ILOG_WARN("array = 0, image not loaded.");
00346 viewSys.SetImage(mViews[dstIdx], 0);
00347 }
00348 mViews[dstIdx]->UserData1 = (void *) imIdx;
00349 }
00350
00351 void CopyImageFromView(int dstIdx, int srcIdx, int imIdx)
00352 {
00353 viewSys.SetImage(mViews[dstIdx], mViews[srcIdx]->im);
00354 mViews[dstIdx]->UserData1 = (void *) imIdx;
00355 }
00356
00357 bool ViewNewPositionNeedsIm(int vIdx, int imIdx)
00358 {
00359 int row = imIdx / mNrOfImOnRow;
00360 int x = (imIdx%mNrOfImOnRow) * mCellW + 4;
00361 int y = Row2Y(row) + 12 + mExtH;
00362 int w = mCellW - 8;
00363 int h = mCellH - (18+mExtH);
00364
00365 viewSys.SetDimensions(mViews[vIdx], x, y, w, h);
00366 viewSys.SetTags(mViews[vIdx], visibleTag);
00367 return ((long long) mViews[vIdx]->UserData1) != imIdx;
00368 }
00369
00370 virtual void ReshapeFunc(int w, int h)
00371 {
00372 Window::ReshapeFunc(w,h);
00373 HandleDocDimensions(true,false);
00374 }
00375
00376 void HandleView(int vIdx, int imIdx, bool bwd)
00377 {
00378 if (vIdx < 0 || vIdx > mViews.size()-1)
00379 return;
00380 if (ViewNewPositionNeedsIm(vIdx,imIdx))
00381 {
00382 int foundIdx;
00383 if ((foundIdx = FindIndex(imIdx,vIdx,bwd))!=-1)
00384 CopyImageFromView(vIdx,foundIdx,imIdx);
00385 else
00386 ViewCreateImage(vIdx,imIdx);
00387 }
00388 HandleViewSettings(vIdx);
00389 }
00390
00391 virtual void DisplayFunc()
00392 {
00393 int cellH = CellHeight();
00394 int h = H();
00395 int dif = (cellH > h) ? h-cellH : h % cellH;
00396
00397 mFlowDragger.SetFlowPageExtra(dif-mPagingExtra);
00398 mFlowDragger.FlowDragDisplay();
00399 OGC myOGC;
00400 OGCSave(&myOGC);
00401 int first = FindFirstVisible();
00402 int last = FindLastVisible();
00403 int range = last - first + 1;
00404 int i, vIdx;
00405 if (mOldStartIm <= first)
00406 {
00407 for (i=first, vIdx=-1; i<=last; i++)
00408 HandleView(++vIdx,i,false);
00409 ClearViews(vIdx+1);
00410 }
00411 else
00412 {
00413 for (i=last, vIdx=range; i>=first; i--)
00414 HandleView(--vIdx, i, true);
00415 ClearViews(range);
00416 }
00417 mOldStartIm = first;
00418 OGCRestore(&myOGC);
00419 Window::DisplayFunc();
00420 }
00421
00422 virtual void KeyboardFunc(int c, int state)
00423 {
00424 int oldDocY = mDocY;
00425 mFlowDragger.KeyboardFunc(c,state);
00426
00427 if (c == '~')
00428 mFixedCellDims = !mFixedCellDims;
00429
00430 Window::KeyboardFunc(c, state);
00431
00432 if (oldDocY != mDocY)
00433 return;
00434 if (c==oglPAGEDOWN)
00435 mDocY += H();
00436 if (c==oglPAGEUP)
00437 mDocY -= H();
00438 if (c==oglUP)
00439 mDocY += 10;
00440 if (c==oglDOWN)
00441 mDocY -= 10;
00442 }
00443
00444 virtual void MouseFunc(int msg, int but, int state, int x, int y)
00445 {
00446 mFlowDragger.MouseFunc(msg,but,state,x,y);
00447 Window::MouseFunc(msg,but,state,x,y);
00448 }
00449
00450 private:
00451
00452 void Init(int w, int h, int nOnRow)
00453 {
00454 mFlowDragger.SetDocWnd(this,this);
00455 SetDocDimensions(0,0,w,h);
00456 ShowNames(true);
00457 ShowDims(true);
00458 FixedCellWidth(132);
00459 NrOfImOnRow(nOnRow);
00460 ShowNames(true);
00461 ShowDims(true);
00462 mOldStartIm = -1;
00463 mPagingExtra = 1;
00464 mMaxZoom = 2;
00465 for (int i=0; i<1000; i++)
00466 {
00467 OGLVIEW* view = viewSys.View2D(mOglWnd,0,0,0,128,128);
00468 viewSys.SetTags(view, FlexViewTags);
00469 viewSys.ClearTags(view, visibleTag|showBorderTag|showBgTag|selectableTag);
00470
00471 viewSys.SetColor(view, OGL_BG, oglTrLIGHTGREY);
00472 view->UserData1 = (void *) -1;
00473 mViews.push_back(view);
00474 }
00475 #ifndef NO_RAW
00476 mRgbDataSrc = 0;
00477 #endif
00478 }
00479
00480 std::string mDirName;
00481 std::vector<std::string*> mFileNames;
00482 std::vector<OGLVIEW*> mViews;
00483 #ifndef NO_RAW
00484 RgbDataSrc* mRgbDataSrc;
00485 #endif
00486
00487 bool mFixedCellDims;
00488 bool mShowNames;
00489 bool mShowDims;
00490 int mNrOfImOnRow;
00491 int mCellW;
00492 int mCellH;
00493 int mExtH;
00494
00495 int mOldStartIm;
00496 int mPagingExtra;
00497
00498 double mMaxZoom;
00499 OglGui::DocFlowDrag mFlowDragger;
00500
00501 ILOG_VAR_DEC;
00502 };
00503
00504 ILOG_VAR_INIT(DirImViewer, Visualization);
00505
00506 }
00507 }
00508 #endif