diff -r 000000000000 -r 40261b775718 mmlibs/mmfw/src/Client/Video/mmfsubtitleutility.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmlibs/mmfw/src/Client/Video/mmfsubtitleutility.cpp Tue Feb 02 01:56:55 2010 +0200 @@ -0,0 +1,226 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @internalComponent +*/ + +#include "mmfsubtitleutility.h" + + +CMMFSubtitleUtility* CMMFSubtitleUtility::NewL(RMMFController& aController, RWsSession &aWs) + { + CMMFSubtitleUtility* self = new(ELeave) CMMFSubtitleUtility(aController); + CleanupStack::PushL(self); + self->ConstructL(aWs); + CleanupStack::Pop(); + return self; + } + +CMMFSubtitleUtility::CMMFSubtitleUtility(RMMFController& aController): iSubtitleSupportCustomCommands(aController) + { + } + +void CMMFSubtitleUtility::ConstructL(RWsSession &aWs) + { + iDevice = new (ELeave) CWsScreenDevice(aWs); + User::LeaveIfError(iDevice->Construct()); + iSubtitleGc = new (ELeave) CWindowGc(iDevice); + User::LeaveIfError(iSubtitleGc->Construct()); + } + +CMMFSubtitleUtility::~CMMFSubtitleUtility() + { + delete iSubtitleGc; + delete iDevice; + iSubtitleLanguages.Close(); + iCrpDataArray.Close(); + } + +// Add subtitle related config to controller +TInt CMMFSubtitleUtility::AddSubtitleConfig(const TMMFSubtitleWindowConfig& aConfig) + { + TCrpData crpData(aConfig.iWindowId); + // Add the crp data before calling custom commands in case append fails + TInt err = iCrpDataArray.Append(crpData); + if (KErrNone == err) + { + err = iSubtitleSupportCustomCommands.AddSubtitleConfig(aConfig); + + if (KErrNone != err) + { + // removed the added crp data on error + iCrpDataArray.Remove(iCrpDataArray.Count()-1); + } + } + + return err; + } + +// Found the index of the subtitle data in iCrpDataArray given aWindowId +TInt CMMFSubtitleUtility::FindCrpArrayIndex(TInt aWindowId) + { + TInt ret = KErrNotFound; + for (TInt i = iCrpDataArray.Count(); --i >= 0; ) + { + if (iCrpDataArray[i].iWindowId == aWindowId) + { + ret = i; + break; + } + } + return ret; + } + +// Remove subtitle related config from controller +TInt CMMFSubtitleUtility::RemoveSubtitleConfig(TInt aWindowId) + { + TInt ret = FindCrpArrayIndex(aWindowId); + if (ret >= 0) + { + iCrpDataArray.Remove(ret); + ret = iSubtitleSupportCustomCommands.RemoveSubtitleConfig(aWindowId); + } + return ret; + } + +// Update subtitle related config from controller and clear the subtitle region +TInt CMMFSubtitleUtility::UpdateSubtitleConfig(const TMMFSubtitleWindowConfig& aConfig) + { + TInt ret = FindCrpArrayIndex(aConfig.iWindowId); + if (ret >= 0) + { + // clear the CRP id + iCrpDataArray[ret].iCrpId.Set(0); + + ret = iSubtitleSupportCustomCommands.UpdateSubtitleConfig(aConfig); + } + return ret; + } + +// Return if subtitle is available +TBool CMMFSubtitleUtility::SubtitlesAvailable(RMMFController& aController) + { + TBool available = EFalse; + RMMFVideoPlaySubtitleSupportCustomCommands subtitleSupportCustomCommands(aController); + subtitleSupportCustomCommands.GetSubtitlesAvailable(available); + return available; + } + +TInt CMMFSubtitleUtility::EnableSubtitles() + { + return iSubtitleSupportCustomCommands.EnableSubtitles(); + } + +void CMMFSubtitleUtility::DisableSubtitles() + { + for (TInt i = iCrpDataArray.Count(); --i >= 0; ) + { + iSubtitleSupportCustomCommands.RemoveSubtitleConfig(iCrpDataArray[i].iWindowId); + } + + iCrpDataArray.Reset(); + + // still need to send disable command to controller event if array count was 0 + // because window may have been removed after subtitle is enabled + iSubtitleSupportCustomCommands.DisableSubtitles(); + } + +// Helper function to draw CRP +void CMMFSubtitleUtility::DrawCrp(RWindow& aWindow, TInt aCrpIdx, TBool aCallBeginRedraw) + { + TCrpData& crpData = iCrpDataArray[aCrpIdx]; + + if (crpData.iCrpId.Id() != 0) + { + + if (aCallBeginRedraw) + { + // CRP is ready to be drawn + aWindow.Invalidate(crpData.iCrpRect); + aWindow.BeginRedraw(crpData.iCrpRect); + } + + iSubtitleGc->Activate(aWindow); + iSubtitleGc->DrawWsGraphic(crpData.iCrpId, crpData.iCrpRect); + iSubtitleGc->Deactivate(); + + if (aCallBeginRedraw) + { + aWindow.EndRedraw(); + } + } + } + +// Handle CRP ready event from controller and draw the CRP +void CMMFSubtitleUtility::HandleCrpReady(RWindow& aWindow) + { + TInt index = FindCrpArrayIndex(aWindow.WsHandle()); + if (index >= 0) + { + TCrpData& crpData = iCrpDataArray[index]; + TInt err = iSubtitleSupportCustomCommands.GetCrpParameters(aWindow.WsHandle(), + crpData.iCrpId, + crpData.iCrpRect); + + if (KErrNone == err) + { + DrawCrp(aWindow, index, ETrue); + } + else + { + // Window may have been removed before the event was received, ignore event + RDebug::Print(_L("CMMFSubtitleUtility::HandleCrpReady aWindowId=%d, err==%d"), aWindow.WsHandle(), err); + } + } + } + +// Redraw subtitle CRP if redraw rect intersect with subtitle region +void CMMFSubtitleUtility::RedrawSubtitle(RWindow& aWindow, const TRect& aRedrawRect) + { + TInt index = FindCrpArrayIndex(aWindow.WsHandle()); + if (index >= 0 && aRedrawRect.Intersects(iCrpDataArray[index].iCrpRect)) + { + DrawCrp(aWindow, index, EFalse); + } + } + +TInt CMMFSubtitleUtility::SetSubtitleLanguage(TLanguage aSubtitleLanguage) + { + return iSubtitleSupportCustomCommands.SetSubtitleLanguage(aSubtitleLanguage); + } + +TArray CMMFSubtitleUtility::SupportedSubtitleLanguagesL() + { + TRAPD(err, iSubtitleSupportCustomCommands.GetSupportedSubtitleLanguagesL(iSubtitleLanguages)); + + // Do not propagate KErrNotSupported; return empty list of languages. + if (KErrNone != err && KErrNotSupported != err) + { + User::Leave(err); + } + return iSubtitleLanguages.Array(); + } + +TLanguage CMMFSubtitleUtility::SubtitleLanguage() + { + TLanguage language = ELangNone; + + // ignore returned value, language parameter is unchanged on error + iSubtitleSupportCustomCommands.GetSubtitleLanguage(language); + + return language; + }