summaryrefslogtreecommitdiff
path: root/control-image.c
diff options
context:
space:
mode:
Diffstat (limited to 'control-image.c')
-rw-r--r--control-image.c1137
1 files changed, 1137 insertions, 0 deletions
diff --git a/control-image.c b/control-image.c
new file mode 100644
index 0000000..b109c50
--- /dev/null
+++ b/control-image.c
@@ -0,0 +1,1137 @@
+/*
+* Image plugin to VDR (C++)
+*
+* (C) 2004 Andreas Brachold <vdr04 -at- deltab.de>
+* based on (C) 2003 Kai Tobias Burwieck <kai -at- burwieck.net>
+*
+* This code is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This code is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+* Or, point your browser to http://www.gnu.org/copyleft/gpl.html
+*/
+
+#include <time.h>
+
+#include "player-image.h"
+#include "control-image.h"
+#include "data-image.h"
+#include "setup-image.h"
+#include "i18n.h"
+#include "menu-commands.h"
+#include "list.h"
+
+#include <vdr/status.h>
+#include <vdr/tools.h>
+#include <vdr/plugin.h>
+
+
+#if VDRVERSNUM < 10307
+// --- cProgressBar ------------------------------------------------------------
+class cProgressBar:public cBitmap {
+ public:
+ cProgressBar(int nWidth, int nHeight, int nProgressBegin, int nProgressEnd, int nProgressRange)
+ :cBitmap(nWidth, nHeight,2)
+ {
+ if(nProgressRange > 0)
+ {
+ if(nProgressBegin>0)
+ {
+ int b = nProgressBegin * width / nProgressRange;
+ int p = nProgressEnd * width / nProgressRange;
+ Fill(0, 0, b, nHeight - 1, clrWhite);
+ Fill(b + 1, 0, p, nHeight - 1, clrGreen);
+ Fill(p + 1, 0, nHeight - 1, nHeight - 1, clrWhite);
+ }
+ else
+ {
+ int p = nProgressEnd * width / nProgressRange;
+ Fill(0, 0, p, nHeight - 1, clrGreen);
+ Fill(p + 1, 0, nWidth - 1, nHeight - 1, clrWhite);
+ }
+ }
+ }
+};
+#endif
+
+
+// --- cImageControl ---------------------------------------------------------
+
+char* cImageControl::m_szLastShowStatusMsg = 0;
+
+void cImageControl::SetSlideShow(cSlideShow * pNewSlideShow)
+{
+ // Remove old session
+ if(cControl::Control())
+ cControl::Shutdown();
+
+ if(pNewSlideShow) {
+ cImageControl* pControl = new cImageControl(pNewSlideShow);
+ cControl::Launch(pControl);
+ }
+}
+//////////////////////////////////////////////////////////////////////////////
+/** C-tor Create for control-object to control the image-player
+*/
+cImageControl::cImageControl(cSlideShow * pNewSlideShow)
+ : cControl(player = new cImagePlayer(pNewSlideShow))
+ , m_pImageMenu(NULL)
+#if VDRVERSNUM >= 10307
+ , m_pDisplayReplay(NULL)
+#endif
+{
+ // Notity all cStatusMonitor
+ cStatus::MsgReplaying(this, "[image]");
+
+ m_tStarted = time(NULL);
+
+ m_eOSDStatusIsOpen = eDisplayNothing;
+ // Depends the Setup of ShowReplayMode is ModeOnly visable
+ m_eOSDStatusVisable = Setup.ShowReplayMode?eDisplayModeOnly:eDisplayNothing;
+
+ m_ePlayMode = ePlayModeNormal;
+ m_bSlideShowActiv = ImageSetup.SlideShow;
+ m_bSlideShowBefore = false;
+
+ // Support for Zoom
+ m_nZoomFactor = 0;
+ m_nRealImageWidth = 0;
+ m_nRealImageHeight = 0;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+/** D-tor Destroy control-object to control the image-player
+*/
+cImageControl::~cImageControl()
+{
+ if(m_pImageMenu)
+ delete m_pImageMenu;
+ m_pImageMenu = NULL;
+ // Notity cleanup all cStatusMonitor
+ cStatus::MsgReplaying(this, NULL);
+ // Hide OSD
+ HideOSD();
+#if VDRVERSNUM >= 10307
+ if(m_pDisplayReplay) {
+ delete m_pDisplayReplay;
+ m_pDisplayReplay = NULL;
+ }
+#endif
+ // Stop Playback
+ Stop();
+ if(player)
+ delete player;
+ player = NULL;
+
+ if(m_szLastShowStatusMsg)
+ free(m_szLastShowStatusMsg);
+ m_szLastShowStatusMsg = 0;
+}
+
+void cImageControl::Show(void)
+{
+ ShowOSD();
+}
+
+void cImageControl::Hide(void)
+{
+ m_eOSDStatusVisable = eDisplayNothing;
+ HideOSD();
+
+ if(m_szLastShowStatusMsg)
+ free(m_szLastShowStatusMsg);
+ m_szLastShowStatusMsg = 0;
+}
+
+void cImageControl::ShowOSD()
+{
+ switch(m_eOSDStatusVisable) {
+ case eDisplayNothing: HideOSD(); break;
+ case eDisplayModeOnly: ShowMode(); break;
+ case eDisplayProgress: ShowProgress(); break;
+ }
+}
+
+void cImageControl::HideOSD(void)
+{
+ if(eDisplayNothing != m_eOSDStatusIsOpen) {
+#if VDRVERSNUM < 10307
+ Interface->Close();
+#else
+ if(m_pDisplayReplay) {
+ delete m_pDisplayReplay;
+ m_pDisplayReplay = NULL;
+ }
+#endif
+ m_eOSDStatusIsOpen = eDisplayNothing;
+ }
+
+ if (m_pImageMenu) {
+ delete m_pImageMenu;
+ m_pImageMenu = NULL;
+ }
+}
+//////////////////////////////////////////////////////////////////////////
+/** Send Message if changed to any statusmonitor
+*/
+void cImageControl::ShowStatusMsg()
+{
+ char* sz = 0;
+ if(IsConvertRunning()) // Display that convert is running
+ {
+ asprintf(&sz,"[image] %s",tr("Convert..."));
+ }
+ else
+ {
+ switch(m_ePlayMode)
+ {
+ case ePlayModeNormal: asprintf(&sz,"[image] %s",FileName());break;
+ case ePlayModeJump: asprintf(&sz,"[image] %s",tr("Select picture via key 1..9!"));break;
+ case ePlayModeZoom: asprintf(&sz,"[image] %s %dx",tr("Zoom"),m_nZoomFactor);break;
+ }
+ }
+ if(sz)
+ {
+ if(!m_szLastShowStatusMsg
+ || 0 != strcmp(m_szLastShowStatusMsg,sz))
+ {
+ if(m_szLastShowStatusMsg)
+ free(m_szLastShowStatusMsg);
+ m_szLastShowStatusMsg = sz;
+ cStatus::MsgReplaying(this, m_szLastShowStatusMsg);
+ }
+ else
+ free(sz);
+ }
+}
+
+void cImageControl::ShowMode(void)
+{
+ if(eDisplayModeOnly != m_eOSDStatusIsOpen)
+ {
+#if VDRVERSNUM < 10307
+ Interface->Open(0, -1);
+#else
+ m_pDisplayReplay = Skins.Current()->DisplayReplay(m_eOSDStatusVisable==eDisplayModeOnly);
+#endif
+ m_eOSDStatusIsOpen = eDisplayModeOnly;
+ }
+
+#if VDRVERSNUM < 10307
+ bool bFixFont = false;
+ int nMaxCharacter = Interface->Width(); //Get OSD-Display width
+#else
+ int nMaxCharacter = m_pDisplayReplay->EditableWidth(); //FIXME Get OSD-Display width
+#endif
+
+ char *sz = MALLOC(char, nMaxCharacter + 1);
+
+ if(IsConvertRunning()) // Display that convert is running
+ {
+ strn0cpy(sz, tr("Convert..."), nMaxCharacter);
+ }
+ else // else Display depends on current play the status
+ {
+ switch(m_ePlayMode)
+ {
+ // Display normal playstatus
+ default:
+ case ePlayModeNormal:
+ {
+#if VDRVERSNUM < 10307
+ if(m_bSlideShowActiv)
+ { strn0cpy(sz, " > ", nMaxCharacter); bFixFont = true; }
+ else
+ { strn0cpy(sz, " || ", nMaxCharacter); bFixFont = true; }
+#else
+ // Get the current activ filename
+ const char* szFileName = FileName();
+ if(!szFileName)
+ return;
+ snprintf(sz, nMaxCharacter, "%s", szFileName);
+#endif
+ break;
+ }
+ // Display jumpmode playstatus
+ case ePlayModeJump:
+ {
+ strn0cpy(sz, tr("Select picture via key 1..9!"), nMaxCharacter);
+ break;
+ }
+ // Display zoommode playstatus
+ case ePlayModeZoom:
+ {
+ snprintf(sz, nMaxCharacter, "%s %dx",tr("Zoom"),m_nZoomFactor);
+ }
+ }
+ }
+
+#if VDRVERSNUM < 10307
+ if(bFixFont) {
+ eDvbFont OldFont;
+ OldFont = Interface->SetFont(fontFix);
+ DisplayAtBottom(sz);
+ Interface->SetFont(OldFont);
+ }
+ else {
+ DisplayAtBottom(sz);
+ }
+#else
+ m_pDisplayReplay->SetMode(m_ePlayMode == ePlayModeNormal && m_bSlideShowActiv, true, 1);
+ if(m_eOSDStatusVisable!=eDisplayModeOnly)
+ m_pDisplayReplay->SetTitle(sz);
+#endif
+ free(sz);
+}
+
+#if VDRVERSNUM < 10307
+void cImageControl::DisplayAtBottom(const char *s)
+{
+ const int p = (eDisplayModeOnly == m_eOSDStatusVisable) ? 0 : 2;// ???? Unused
+ if(s) {
+ const int d = std::max(Width() - cOsd::WidthInCells(s), 0) / 2;
+ if(eDisplayModeOnly == m_eOSDStatusVisable)
+ Interface->Fill(0, p, Interface->Width(), 1, clrTransparent);
+ Interface->Write(d, p, s);
+ }
+ else
+ Interface->Fill(12, p, Width() - 22, 1, clrBackground);
+}
+#endif
+
+void cImageControl::ShowProgress(void)
+{
+ // Get the current activ filename
+ const char* szFileName = FileName();
+ if(!szFileName)
+ return;
+
+ if(eDisplayProgress != m_eOSDStatusIsOpen) {
+ HideOSD();
+#if VDRVERSNUM < 10307
+ Interface->Open(Setup.OSDwidth, -3);
+#else
+ m_pDisplayReplay = Skins.Current()->DisplayReplay(m_eOSDStatusVisable==eDisplayModeOnly);
+ m_pDisplayReplay->SetMarks(&m_Marks);
+#endif
+ m_eOSDStatusIsOpen = eDisplayProgress;
+ }
+
+#if VDRVERSNUM < 10307
+ Interface->Clear();
+ int nMaxCharacter = Interface->Width(); //Get OSD-Display width
+#else
+ int nMaxCharacter = m_pDisplayReplay->EditableWidth(); //FIXME Get OSD-Display width
+#endif
+ //********************************************************************
+ // build first Line
+ char *sz = MALLOC(char, nMaxCharacter + 1);
+
+ if(IsConvertRunning()) // Display that convert is running
+ {
+ snprintf(sz, nMaxCharacter, "%s", tr("Convert..."));
+ }
+ else
+ {
+#if VDRVERSNUM < 10307
+ int n = strlen(szFileName);
+ if(n > nMaxCharacter) { //Clip long filenames
+ n = n - Width() + 4;
+ if(n < 0) n = 0;
+ snprintf(sz, nMaxCharacter, "... %s", szFileName + n);
+ }
+ else {
+ snprintf(sz, nMaxCharacter, "%s", szFileName);
+ }
+#else
+ switch(m_ePlayMode) {
+ case ePlayModeJump:
+ snprintf(sz, nMaxCharacter, "%s",
+ tr("Select picture via key 1..9!"));
+ break;
+ case ePlayModeZoom:
+ snprintf(sz, nMaxCharacter, "%s: %dx (%dx%d)",tr("Zoom"),
+ m_nZoomFactor,
+ m_nRealImageWidth * m_nZoomFactor,
+ m_nRealImageHeight * m_nZoomFactor);
+ break;
+ case ePlayModeNormal:
+ snprintf(sz, nMaxCharacter, "%s", szFileName);
+ break;
+ }
+#endif
+ }
+
+#if VDRVERSNUM < 10307
+ Interface->Write(0, 0, sz);
+#else
+ m_pDisplayReplay->SetTitle(sz);
+#endif
+
+ //********************************************************************
+ // show on second line the progressbar
+#if VDRVERSNUM < 10307
+ {
+ int nProgressBegin = 0;
+ int nProgressEnd = ImageCurrent();
+ int nProgressRange = ImageTotal();
+
+ if(ePlayModeJump == m_ePlayMode) // Show on Jump mode only the selected Range
+ {
+ nProgressBegin = std::max(0, nProgressEnd - 1);
+ nProgressEnd = std::min(nProgressBegin + 9,nProgressRange);
+ }
+
+ cProgressBar ProgressBar(Width() * cOsd::CellWidth(),
+ cOsd::LineHeight(), nProgressBegin, nProgressEnd, nProgressRange);
+ Interface->SetBitmap(0, cOsd::LineHeight(), ProgressBar);
+ }
+#else
+ m_pDisplayReplay->SetProgress(ImageCurrent(), ImageTotal());
+
+ snprintf(sz, nMaxCharacter, "%3d", ImageCurrent());
+ m_pDisplayReplay->SetCurrent(sz);
+ snprintf(sz, nMaxCharacter, "%3d",
+ m_ePlayMode==ePlayModeJump?
+ std::min(ImageCurrent()+9,ImageTotal())
+ :ImageTotal());
+ m_pDisplayReplay->SetTotal(sz);
+ // Remember to me : SetTotal/SetCurrent need clean Screen if changed stringformat
+#endif
+
+#if VDRVERSNUM < 10307
+ //********************************************************************
+ // show on third line a more information
+ switch(m_ePlayMode)
+ {
+ case ePlayModeJump:
+ {
+ snprintf(sz, nMaxCharacter, "%s",
+ tr("Select picture via key 1..9!"));
+ // center the Message
+ const int d = std::max(Width() - cOsd::WidthInCells(sz),0) / 2;
+ Interface->Write(d, 2,sz);
+ break;
+ }
+ case ePlayModeZoom:
+ {
+ snprintf(sz, nMaxCharacter, "%s: %dx (%dx%d)",tr("Zoom"),
+ m_nZoomFactor,
+ m_nRealImageWidth * m_nZoomFactor,
+ m_nRealImageHeight * m_nZoomFactor);
+ // center the Message
+ const int d = std::max(Width() - cOsd::WidthInCells(sz),0) / 2;
+ Interface->Write(d, 2,sz);
+ break;
+ }
+ case ePlayModeNormal:
+ {
+ char szSlideShowInfo[32];
+ szSlideShowInfo[0] = '\0';
+
+ if(m_bSlideShowActiv && !IsConvertRunning())
+ {
+ int t = time(NULL) - m_tStarted + 1;
+ snprintf(szSlideShowInfo, sizeof(szSlideShowInfo), " | %d/%d",
+ t, ImageSetup.SSsec);
+ }
+ snprintf(sz,nMaxCharacter, "(%3d/%3d)%s",
+ ImageCurrent(), ImageTotal(), szSlideShowInfo);
+ Interface->Write(0, 2, sz);
+
+ if(ImageSetup.ShowDate && !IsConvertRunning())
+ {
+ struct stat stFile;
+ if(0 != stat(szFileName, &stFile)) {
+ char szErr[128];
+ int nErr = errno;
+ szErr[sizeof(szErr)-1] = '\0';
+ if(0 != strerror_r(nErr,szErr,sizeof(szErr)-1)) {
+ szErr[0] = '\0';
+ }
+ esyslog("imageplugin: can't get filestate %s (%d)%s.\n",szFileName,nErr,szErr);
+ }
+ else
+ {
+ struct tm *timestr;
+ if((timestr = localtime(&(stFile.st_mtime))))
+ {
+ snprintf(sz,nMaxCharacter,
+ "(%2.2d.%2.2d.%2.2d-%2.2d:%2.2d)",
+ (int)timestr->tm_mday,
+ (int)timestr->tm_mon + 1,
+ (int)timestr->tm_year % 100,
+ (int)timestr->tm_hour,
+ (int)timestr->tm_min);
+
+ Interface->Write(nMaxCharacter - strlen(sz), 2, sz);
+ }
+ else {
+ char szErr[128];
+ int nErr = errno;
+ szErr[sizeof(szErr)-1] = '\0';
+ if(0 != strerror_r(nErr,szErr,sizeof(szErr)-1)) {
+ szErr[0] = '\0';
+ }
+ esyslog("imageplugin: can't get mtime from %s (%d)%s.\n",szFileName,nErr,szErr);
+ }
+ }
+ }
+ }
+ }
+#endif
+
+#if VDRVERSNUM < 10307
+ Interface->Flush();
+#else
+ m_pDisplayReplay->Flush();
+#endif
+ free(sz);
+}
+
+
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+/** VDR-Callback entry for Key was processed
+@return eOSState
+@param eKeys Key - the processed Keycode
+*/
+eOSState cImageControl::ProcessKey(eKeys nKey)
+{
+ // Check for next image
+ SlideImage();
+
+ eOSState eOSRet = osContinue;
+
+ if(m_pImageMenu
+ || (m_ePlayMode != ePlayModeJump && (nKey == kRed)))
+ {
+ return ProcessKeyCommands(nKey);
+ }
+ else
+ {
+ switch(nKey)
+ {
+ //processed global keybindings
+ //None key, check for ErrorMsg from Worker
+ case kNone: if(player)player->ErrorMsg(); break;
+ case kOk: ToogleShowMode(); break;
+ // Toggle between Play/Pause
+ case kPlay:
+ case kPause: ToogleSlideShowActiv(); break;
+ // Stop Plugin
+ case kStop:
+ case kBlue: eOSRet = ProcessKeyStopped(); break;
+
+ default: //processed PlayMode depends keybindings
+ {
+ switch(m_ePlayMode)
+ {
+ case ePlayModeNormal: eOSRet = ProcessKeyPlayMode(nKey); break;
+ case ePlayModeZoom: eOSRet = ProcessKeyZoomMode(nKey); break;
+ case ePlayModeJump: eOSRet = ProcessKeyJumpMode(nKey); break;
+ }
+ }
+ }
+ }
+ // show current state at OSD
+ if(eOSRet == osContinue)
+ {
+ ShowOSD();
+ ShowStatusMsg();
+ }
+ return eOSRet;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/** Handle a Key stroke on normal playmode
+@return eOSState
+@param eKeys Key - the processed Keycode
+*/
+eOSState cImageControl::ProcessKeyPlayMode(eKeys Key)
+{
+ switch (Key)
+ {
+ // Mode select
+ case kBack: return ProcessKeyStopped();
+ case k0: OriginalImage(false); break;
+ case k8: ProcessKeyBeginJump(); break;
+ case k5: ProcessKeyBeginZoom(); break;
+
+ // Rotate the image
+ case k1: LFlipImage(); break;
+ case k3: RFlipImage(); break;
+
+ // Change time how long image is see
+ case k4|k_Repeat:
+ case k4: DecSlideTime(); break;
+ case k6|k_Repeat:
+ case k6: IncSlideTime(); break;
+
+ // Navigate between images
+ case kLeft: PrevImage(1); break;
+ case kRight:NextImage(1); break;
+ case kDown: PrevImage(3); break;
+ case kUp: NextImage(3); break;
+ case k7: PrevImage(5); break;
+ case k9: NextImage(5); break;
+
+ default: break;
+ }
+
+ return osContinue;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/** Handle a Key stroke on jumpmode
+@return eOSState
+@param eKeys Key - the processed Keycode
+*/
+eOSState cImageControl::ProcessKeyJumpMode(eKeys nKey)
+{
+ switch (nKey)
+ {
+ case kBack: // Restore Originalimage
+ case k0: OriginalImage(true); break;
+
+ case k1...k9: //Picture select
+ {
+ const int nPicture = nKey - k1;
+ NextImage(nPicture);
+ break;
+ }
+
+ // Navigate between images
+ case kLeft: ConvertJump(-9); break;
+ case kRight: ConvertJump(9); break;
+
+ default: break;
+ }
+
+ return osContinue;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/** Handle a Key stroke on jumpmode
+@return eOSState
+@param eKeys Key - the processed Keycode
+*/
+eOSState cImageControl::ProcessKeyZoomMode(eKeys nKey)
+{
+ switch (nKey)
+ {
+ // Mode select
+ case k0: OriginalImage(true); break;
+ case kBack:
+ case k8: ZoomOut(); break;
+ case k5: ZoomIn(); break;
+
+ // Navigate inside image
+ case kLeft: MoveZoomWindow(eLeft); break;
+ case kRight:MoveZoomWindow(eRight); break;
+ case kUp: MoveZoomWindow(eUp); break;
+ case kDown: MoveZoomWindow(eDown); break;
+
+ default: break;
+ }
+
+ return osContinue;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/** Zoom inside a image
+*/
+void cImageControl::ZoomIn()
+{
+ if(m_nZoomFactor < (m_nZoomMin + 5)) //Allow 5 Zoomlevel
+ {
+ ++m_nZoomFactor;
+ ConvertZoom();
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/** Zoom outside a image
+*/
+void cImageControl::ZoomOut()
+{
+ if(m_nZoomFactor > m_nZoomMin)
+ {
+ --m_nZoomFactor;
+ ConvertZoom();
+ }
+ else
+ {
+ OriginalImage(true);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/** Navigate inside a zoomed image
+@param eDirection nDirection - the wished navigation direction
+*/
+void cImageControl::MoveZoomWindow(eDirection nDirection)
+{
+ bool bReZoomImage = false;
+
+ switch(nDirection)
+ {
+ case eRight:
+ if(m_nZoomXMax > 0 && m_nMoveStepX < (m_nMaxStepX-1))
+ {
+ ++m_nMoveStepX;
+ bReZoomImage = true;
+ }
+ break;
+ case eLeft:
+ if(m_nZoomXMax > 0 && m_nMoveStepX > (m_nMaxStepX-1)*-1)
+ {
+ --m_nMoveStepX;
+ bReZoomImage = true;
+ }
+ break;
+ case eDown:
+ if(m_nZoomYMax > 0 && m_nMoveStepY < (m_nMaxStepY-1))
+ {
+ ++m_nMoveStepY;
+ bReZoomImage = true;
+ }
+ break;
+ case eUp:
+ if(m_nZoomYMax > 0 && m_nMoveStepY > (m_nMaxStepY-1)*-1)
+ {
+ --m_nMoveStepY;
+ bReZoomImage = true;
+ }
+ break;
+ }
+ if(bReZoomImage)
+ ConvertZoom();
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/** Check if key for pluginstop was processed
+@return eOSState
+@param eKeys Key - the processed Keycode
+*/
+eOSState cImageControl::ProcessKeyStopped()
+{
+ if(player)
+ {
+ if(ePlayModeNormal != m_ePlayMode)
+ {
+ OriginalImage(true);
+ return osContinue;
+ }
+
+ if(IsConvertRunning())
+ return osContinue;
+ }
+
+ HideOSD();
+ Stop();
+ return osEnd;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+/** Key was processed for Jumpmode
+*/
+void cImageControl::ProcessKeyBeginJump()
+{
+ m_bSlideShowBefore = m_bSlideShowActiv;
+
+ m_bSlideShowActiv = false;
+
+ ConvertJump(0);
+ m_ePlayMode = ePlayModeJump;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/** Key was processed for Zoommode
+*/
+void cImageControl::ProcessKeyBeginZoom()
+{
+ m_bSlideShowBefore = m_bSlideShowActiv;
+
+ m_bSlideShowActiv = false;
+ PictureZoomInitial();
+ m_ePlayMode = ePlayModeZoom;
+}
+
+ //////////////////////////////////////////////////////////////////////////////
+/** Toogle between all supported OSD Modes
+*/
+void cImageControl::ToogleShowMode(void)
+{
+ switch(m_eOSDStatusVisable)
+ {
+ case eDisplayNothing: m_eOSDStatusVisable = eDisplayModeOnly; break;
+ case eDisplayModeOnly: m_eOSDStatusVisable = eDisplayProgress; break;
+ case eDisplayProgress: m_eOSDStatusVisable = eDisplayNothing; break;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/** Toogle between Play and Stop of the current SlideShow
+*/
+void cImageControl::ToogleSlideShowActiv(void)
+{
+ m_nZoomFactor = 0;
+ m_bSlideShowActiv = !m_bSlideShowActiv;
+ m_ePlayMode = ePlayModeNormal;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/** Handle a Key stroke on commandsmenu
+@return eOSState
+@param eKeys Key - the processed Keycode
+*/
+eOSState cImageControl::ProcessKeyCommands(eKeys nKey)
+{
+ if(m_pImageMenu)
+ {
+ eOSState eOSRet = m_pImageMenu->ProcessKey(nKey);
+ switch(eOSRet)
+ {
+ case osEnd:
+ case osBack:
+ if(m_pImageMenu->HasImageChanged())
+ OriginalImage(false);
+ delete m_pImageMenu;
+ m_pImageMenu = NULL;
+ return osContinue;
+ default:
+ return eOSRet;
+ }
+ }
+ else
+ {
+ if(!CheckAccess()) {
+ OSD_ErrorNumMsg(errno,tr("Operation failed"));
+ return osContinue;
+ }
+
+ cImageCommands* pCmd = new cImageCommands;
+ if(!pCmd)
+ return osContinue;
+
+ // Load additional Commands
+ pCmd->Load(AddDirectory(cPlugin::ConfigDirectory(), "imagecmds.conf"));
+
+ if(pCmd->Count() <= 0) {
+ delete pCmd;
+ return osContinue;
+ }
+
+ Hide();
+
+ const char* szFileName = FileName();
+ char* szTitle;
+ asprintf(&szTitle,"%s (%s)",tr("Commands"),basename(szFileName));
+ m_pImageMenu = new cImageMenuCommands(szTitle,pCmd,szFileName);
+ free(szTitle);
+
+ return osContinue;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/** Check to get access for to viewed file
+@return bool - false access was denied
+*/
+bool cImageControl::CheckAccess() const
+{
+ if(!player) // Playback stopped ?
+ {
+ errno = EFAULT;
+ return false;
+ }
+
+ errno = 0; // unset error
+ const char *szFileName = player->FileName();
+ if(szFileName
+ && 0 == access(szFileName,F_OK))
+ {
+ return true;
+ }
+ if(!errno) // if unknown error
+ errno = ENOENT;
+ return false;
+}
+
+void cImageControl::OriginalImage(bool bCached)
+{
+ m_nZoomFactor = 0;
+ m_ePlayMode = ePlayModeNormal;
+ if(!CheckAccess()
+ || !player->Convert(bCached?"":"original"))
+ {
+ OSD_ErrorNumMsg(errno,tr("Operation failed"));
+ }
+}
+
+void cImageControl::RFlipImage(void)
+{
+ m_ePlayMode = ePlayModeNormal;
+ if(!CheckAccess()
+ || !player->Convert("right"))
+ {
+ OSD_ErrorNumMsg(errno,tr("Operation failed"));
+ }
+}
+
+void cImageControl::LFlipImage(void)
+{
+ m_ePlayMode = ePlayModeNormal;
+ if(!CheckAccess()
+ || !player->Convert("left"))
+ {
+ OSD_ErrorNumMsg(errno,tr("Operation failed"));
+ }
+}
+
+void cImageControl::PictureZoomInitial(void)
+{
+
+ char *szFileName;
+ FILE *f;
+ char buf[80];
+
+ cImage* pImage = theSlideShow.GetImage();
+ if(!pImage)
+ return;
+
+ asprintf(&szFileName, "%s.par", pImage->NamePNM());
+
+ if(!szFileName)
+ return;
+
+ strcpy(zoom_command, "original");
+
+ m_nRealImageWidth = 720;
+ m_nRealImageHeight = 576;
+
+ if((f = fopen(szFileName, "rt")))
+ {
+ dsyslog("imageplugin: open file %s", szFileName);
+ fgets(buf, sizeof(buf) - 1, f);
+ dsyslog("imageplugin: line=%s", buf);
+ sscanf(buf, "%d %d %s", &m_nRealImageWidth,&m_nRealImageHeight,zoom_command);
+ fclose(f);
+ }
+ else
+ {
+ esyslog("imageplugin: error by open file %s", szFileName);
+ }
+
+ free(szFileName);
+
+ if(m_nRealImageWidth <= 0
+ || m_nRealImageWidth > 720
+ || m_nRealImageHeight > 576 )
+ m_nZoomMin = 1;
+ else
+ {
+ m_nZoomMin = 800/m_nRealImageWidth;
+ }
+ if (m_nZoomMin < 0)
+ m_nZoomMin = 1;
+
+ // Start with minimum zoom
+ m_nZoomFactor = m_nZoomMin;
+ // Set Move to center
+ m_nMoveStepX = 0;
+ m_nMoveStepY = 0;
+
+ ConvertZoom();
+}
+
+void cImageControl::ConvertZoom()
+{
+ if(!player)
+ return;
+
+ m_ePlayMode = ePlayModeZoom;
+
+ // How may pixel are outside screen after zoom
+ m_nZoomXMax = ((m_nRealImageWidth * m_nZoomFactor) - player->UseWidth());
+ m_nZoomYMax = ((m_nRealImageHeight * m_nZoomFactor) - player->UseHeight());
+
+ // If image bigger than screen, how many step can i'm move in zoomed image
+ if(m_nZoomXMax > 0)
+ {
+ m_nMaxStepX = (m_nRealImageWidth * m_nZoomFactor) / player->UseWidth() * 2;
+ if(m_nMoveStepX >= m_nMaxStepX)
+ m_nMoveStepX = m_nMaxStepX;
+ if(m_nMoveStepX <= -m_nMaxStepX)
+ m_nMoveStepX = (m_nMaxStepX)*-1;
+ }
+ else
+ {
+ m_nMoveStepX = 0;
+ m_nMaxStepX = 0;
+ }
+
+ if(m_nZoomYMax > 0)
+ {
+ m_nMaxStepY = (m_nRealImageHeight * m_nZoomFactor) / player->UseHeight() * 2;
+ if(m_nMoveStepY >= m_nMaxStepY)
+ m_nMoveStepY = m_nMaxStepY-1;
+ if(m_nMoveStepY <= -m_nMaxStepY)
+ m_nMoveStepY = (m_nMaxStepY)*-1;
+ }
+ else
+ {
+ m_nMoveStepY = 0;
+ m_nMaxStepY = 0;
+ }
+
+ // Set Offset to center
+ int nZoomXoff = m_nZoomXMax/2;
+ int nZoomYoff = m_nZoomYMax/2;
+
+ // Add to offset the moved position
+ if(m_nMaxStepX > 0)
+ nZoomXoff += (m_nZoomXMax/m_nMaxStepX)*m_nMoveStepX;
+ if(m_nMaxStepY > 0)
+ nZoomYoff += (m_nZoomYMax/m_nMaxStepY)*m_nMoveStepY;
+
+ // execute
+ if(!CheckAccess()
+ || !player->ConvertZoom(zoom_command, m_nZoomFactor, nZoomXoff, nZoomYoff))
+ {
+ OSD_ErrorNumMsg(errno,tr("Operation failed"));
+ }
+}
+
+void cImageControl::ConvertJump(int nOffset)
+{
+ m_ePlayMode = ePlayModeJump;
+ if(!CheckAccess()
+ || !player->ConvertJump(nOffset))
+ {
+ OSD_ErrorNumMsg(errno,tr("Operation failed"));
+ }
+}
+
+bool cImageControl::IsConvertRunning() const
+{
+ if(player)
+ return player->IsConvertRunning();
+ return false;
+}
+
+
+void cImageControl::NextImage(int Step)
+{
+ if(!player)
+ return;
+ if(ePlayModeNormal != m_ePlayMode)
+ {
+ m_ePlayMode = ePlayModeNormal;
+ m_bSlideShowActiv = m_bSlideShowBefore;
+ }
+ if(player->NextImage(Step))
+ OriginalImage(true);
+ m_tStarted = time(NULL);
+}
+
+
+
+void cImageControl::PrevImage(int Step)
+{
+ if(!player)
+ return;
+ if(ePlayModeNormal != m_ePlayMode)
+ {
+ m_ePlayMode = ePlayModeNormal;
+ m_bSlideShowActiv = m_bSlideShowBefore;
+ }
+ if(player->PrevImage(Step))
+ OriginalImage(true);
+ m_tStarted = time(NULL);
+}
+
+
+void cImageControl::GotoImage(int Pict)
+{
+ if(!player)
+ return;
+ if(ePlayModeNormal != m_ePlayMode)
+ {
+ m_ePlayMode = ePlayModeNormal;
+ m_bSlideShowActiv = m_bSlideShowBefore;
+ }
+ if(player->GotoImage(Pict))
+ OriginalImage(true);
+ m_tStarted = time(NULL);
+}
+
+
+int cImageControl::ImageTotal(void) const
+{
+ if(!player)
+ return 0;
+ return theSlideShow.ImageTotal();
+}
+
+int cImageControl::ImageCurrent(void) const
+{
+ if(!player)
+ return 0;
+ return theSlideShow.ImageCurrent();
+}
+
+const char* cImageControl::FileName(void) const
+{
+ if(!player)
+ return 0;
+ return player->FileName();
+}
+
+
+
+void cImageControl::SlideImage()
+{
+ if(m_bSlideShowActiv && !IsConvertRunning())
+ {
+ if(ImageSetup.SSsec <=
+ (time(NULL) - m_tStarted))
+ {
+ NextImage(1);
+ }
+ }
+}
+
+void cImageControl::Stop(void)
+{
+ delete player;
+ player = NULL;
+}
+
+void cImageControl::IncSlideTime(void)
+{
+ if(ImageSetup.SSsec < cImageSetup::m_cSSMax) {
+ ImageSetup.SSsec++;
+ }
+}
+
+void cImageControl::DecSlideTime(void)
+{
+ if(ImageSetup.SSsec > cImageSetup::m_cSSMin) {
+ ImageSetup.SSsec--;
+ }
+}