mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-21 02:22:41 +08:00
240 lines
8.5 KiB
C++
240 lines
8.5 KiB
C++
#include "stdafx.h"
|
|
#include "./../Converter.h"
|
|
|
|
#include "Logic/Transitions/EmptyTransition.h"
|
|
#include "Logic/Transitions/OrientationTransition.h"
|
|
#include "Logic/Transitions/EightDirectionTransition.h"
|
|
#include "Logic/Transitions/OptionalBlackTransition.h"
|
|
#include "Logic/Transitions/SideDirectionTransition.h"
|
|
#include "Logic/Transitions/CornerDirectionTransition.h"
|
|
#include "Logic/Transitions/WheelTransition.h"
|
|
#include "Logic/Transitions/SplitTransition.h"
|
|
#include "Logic/Transitions/ZoomTransition.h"
|
|
|
|
#import "..\..\..\..\Redist\AVSVideoFile3.dll" raw_interfaces_only
|
|
|
|
namespace PPTX2DrawingXML
|
|
{
|
|
DWORD Converter::GetTransitionSpeedFromStr(const std::string& str)
|
|
{
|
|
if(str == "fast") return 250;//2;
|
|
if(str == "med") return 500;//1;
|
|
if(str == "slow") return 750;//0;
|
|
return 250;//2;
|
|
}
|
|
|
|
int Converter::TransitionConvert(const DWORD SldNum, const boost::shared_ptr<PPTX::Slide> Slide, CDrawingDocument& pDocument)
|
|
{
|
|
ODCSlideShowSlideInfoAtom lDestTransition;
|
|
|
|
lDestTransition.m_nEffectType = 255;
|
|
|
|
const PPTX::Logic::Transition pTransition = Slide->transition.get();
|
|
|
|
if(pTransition.base.is<PPTX::Logic::EmptyTransition>())
|
|
{
|
|
const std::string name = pTransition.base.as<PPTX::Logic::EmptyTransition>().name.get();
|
|
|
|
if(name == "random")
|
|
lDestTransition.m_nEffectType = 1;
|
|
else if(name == "circle")
|
|
{
|
|
lDestTransition.m_nEffectType = 27;
|
|
lDestTransition.m_nEffectDirection = 0;
|
|
}
|
|
else if(name == "dissolve")
|
|
{
|
|
lDestTransition.m_nEffectType = 5;
|
|
lDestTransition.m_nEffectDirection = 0;
|
|
}
|
|
else if(name == "diamond")
|
|
{
|
|
lDestTransition.m_nEffectType = 17;
|
|
lDestTransition.m_nEffectDirection = 0;
|
|
}
|
|
else if(name == "newsflash")
|
|
{
|
|
lDestTransition.m_nEffectType = 22;
|
|
lDestTransition.m_nEffectDirection = 0;
|
|
}
|
|
else if(name == "plus")
|
|
{
|
|
lDestTransition.m_nEffectType = 18;
|
|
lDestTransition.m_nEffectDirection = 0;
|
|
}
|
|
else if(name == "wedge")
|
|
{
|
|
lDestTransition.m_nEffectType = 19;
|
|
lDestTransition.m_nEffectDirection = 0;
|
|
}
|
|
}
|
|
else if(pTransition.base.is<PPTX::Logic::OrientationTransition>())
|
|
{
|
|
const std::string name = pTransition.base.as<PPTX::Logic::OrientationTransition>().name.get();
|
|
const std::string dir = pTransition.base.as<PPTX::Logic::OrientationTransition>().dir.get_value_or("horz");
|
|
|
|
if(name == "blinds")
|
|
lDestTransition.m_nEffectType = 2;
|
|
else if(name == "checker")
|
|
lDestTransition.m_nEffectType = 3;
|
|
else if(name == "comb")
|
|
lDestTransition.m_nEffectType = 21;
|
|
else if(name == "randomBar")
|
|
lDestTransition.m_nEffectType = 8;
|
|
|
|
if(dir == "horz")
|
|
lDestTransition.m_nEffectDirection = 0;
|
|
else if(dir == "vert")
|
|
lDestTransition.m_nEffectDirection = 1;
|
|
}
|
|
else if(pTransition.base.is<PPTX::Logic::SideDirectionTransition>())
|
|
{
|
|
const std::string name = pTransition.base.as<PPTX::Logic::SideDirectionTransition>().name.get();
|
|
const std::string dir = pTransition.base.as<PPTX::Logic::SideDirectionTransition>().dir.get_value_or("l");
|
|
|
|
if(name == "push")
|
|
lDestTransition.m_nEffectType = 20;
|
|
else if(name == "wipe")
|
|
lDestTransition.m_nEffectType = 10;
|
|
|
|
if(dir == "l")
|
|
lDestTransition.m_nEffectDirection = 0;
|
|
else if(dir == "u")
|
|
lDestTransition.m_nEffectDirection = 1;
|
|
else if(dir == "r")
|
|
lDestTransition.m_nEffectDirection = 2;
|
|
else if(dir == "d")
|
|
lDestTransition.m_nEffectDirection = 3;
|
|
}
|
|
else if(pTransition.base.is<PPTX::Logic::EightDirectionTransition>())
|
|
{
|
|
const std::string name = pTransition.base.as<PPTX::Logic::EightDirectionTransition>().name.get();
|
|
const std::string dir = pTransition.base.as<PPTX::Logic::EightDirectionTransition>().dir.get_value_or("l");
|
|
|
|
if(name == "cover")
|
|
lDestTransition.m_nEffectType = 4;
|
|
else if(name == "pull")
|
|
lDestTransition.m_nEffectType = 7;
|
|
|
|
if(dir == "l")
|
|
lDestTransition.m_nEffectDirection = 0;
|
|
else if(dir == "u")
|
|
lDestTransition.m_nEffectDirection = 1;
|
|
else if(dir == "r")
|
|
lDestTransition.m_nEffectDirection = 2;
|
|
else if(dir == "d")
|
|
lDestTransition.m_nEffectDirection = 3;
|
|
else if(dir == "lu")
|
|
lDestTransition.m_nEffectDirection = 4;
|
|
else if(dir == "ru")
|
|
lDestTransition.m_nEffectDirection = 5;
|
|
else if(dir == "ld")
|
|
lDestTransition.m_nEffectDirection = 6;
|
|
else if(dir == "rd")
|
|
lDestTransition.m_nEffectDirection = 7;
|
|
}
|
|
else if(pTransition.base.is<PPTX::Logic::CornerDirectionTransition>())
|
|
{
|
|
const std::string name = pTransition.base.as<PPTX::Logic::CornerDirectionTransition>().name.get();
|
|
const std::string dir = pTransition.base.as<PPTX::Logic::CornerDirectionTransition>().dir.get_value_or("lu");
|
|
|
|
if(name == "strips")
|
|
lDestTransition.m_nEffectType = 9;
|
|
|
|
if(dir == "lu")
|
|
lDestTransition.m_nEffectDirection = 4;
|
|
else if(dir == "ru")
|
|
lDestTransition.m_nEffectDirection = 5;
|
|
else if(dir == "ld")
|
|
lDestTransition.m_nEffectDirection = 6;
|
|
else if(dir == "rd")
|
|
lDestTransition.m_nEffectDirection = 7;
|
|
}
|
|
else if(pTransition.base.is<PPTX::Logic::OptionalBlackTransition>())
|
|
{
|
|
const std::string name = pTransition.base.as<PPTX::Logic::OptionalBlackTransition>().name.get();
|
|
|
|
if(name == "fade")
|
|
{
|
|
lDestTransition.m_nEffectType = 6;
|
|
lDestTransition.m_nEffectDirection = 0;
|
|
}
|
|
else if(name == "cut")
|
|
{
|
|
lDestTransition.m_nEffectType = 0;
|
|
lDestTransition.m_nEffectDirection = pTransition.base.as<PPTX::Logic::OptionalBlackTransition>().thruBlk.get_value_or(false)?1:0;
|
|
}
|
|
}
|
|
else if(pTransition.base.is<PPTX::Logic::WheelTransition>())
|
|
{
|
|
lDestTransition.m_nEffectType = 26;
|
|
lDestTransition.m_nEffectDirection = pTransition.base.as<PPTX::Logic::WheelTransition>().spokes.get_value_or(4);
|
|
}
|
|
else if(pTransition.base.is<PPTX::Logic::SplitTransition>())
|
|
{
|
|
const std::string orient = pTransition.base.as<PPTX::Logic::SplitTransition>().orient.get_value_or("horz");
|
|
const std::string dir = pTransition.base.as<PPTX::Logic::SplitTransition>().dir.get_value_or("out");
|
|
|
|
lDestTransition.m_nEffectType = 13;
|
|
if(orient == "horz")
|
|
lDestTransition.m_nEffectDirection = 0;
|
|
else if(orient == "vert")
|
|
lDestTransition.m_nEffectDirection = 2;
|
|
if(dir == "in")
|
|
lDestTransition.m_nEffectDirection++;
|
|
}
|
|
else if(pTransition.base.is<PPTX::Logic::ZoomTransition>())
|
|
{
|
|
lDestTransition.m_nEffectType = 11;
|
|
lDestTransition.m_nEffectDirection = pTransition.base.as<PPTX::Logic::ZoomTransition>().dir.get_value_or("out") == "in"?1:0;
|
|
}
|
|
|
|
//lDestTransition.m_nSpeed = GetTransitionSpeedFromStr(pTransition.spd.get_value_or("fast"));
|
|
lDestTransition.m_nTime = GetTransitionSpeedFromStr(pTransition.spd.get_value_or("fast"));
|
|
pDocument.m_mapTransitions.Add(SldNum, lDestTransition);
|
|
|
|
if(pTransition.sndAc.is_init())
|
|
{
|
|
if(pTransition.sndAc->stSnd.is_init())
|
|
{
|
|
CAudioElement* lpAudioElement = new CAudioElement;
|
|
lpAudioElement->m_strFileName = CStringW(Slide->GetLinkFromRId(pTransition.sndAc->stSnd->embed.get()).c_str());
|
|
|
|
int lIndex = lpAudioElement->m_strFileName.Find(L"file:///");
|
|
if (0 == lIndex)
|
|
{
|
|
lpAudioElement->m_strFileName = lpAudioElement->m_strFileName.Mid(8);
|
|
//lpAudioElement->m_strFileName.Replace('/', '\\');
|
|
//lpAudioElement->m_strFileName.Replace(L"%20", L" ");
|
|
}
|
|
//lpAudioElement->m_strFileName.Replace(L"&", L"&");
|
|
//lpAudioElement->m_strFileName.Replace('/', '\\');
|
|
//lpAudioElement->m_strFileName.Replace(L"%20", L" ");
|
|
//lpAudioElement->m_strFileName.Replace(L">", L">");
|
|
//lpAudioElement->m_strFileName.Replace(L"<", L"<");
|
|
//lpAudioElement->m_strFileName.Replace(L"'", L"'");
|
|
//lpAudioElement->m_strFileName.Replace(L"\"", L""");
|
|
|
|
BSTR bstrFile = lpAudioElement->m_strFileName.AllocSysString();
|
|
|
|
AVSVideoFile3::IVideoFile3* pVideoFile = NULL;
|
|
CoCreateInstance(__uuidof(AVSVideoFile3::CVideoFile3), NULL, CLSCTX_ALL, __uuidof(AVSVideoFile3::IVideoFile3), (void**)(&pVideoFile));
|
|
|
|
double dDuration = 0;
|
|
if (NULL != pVideoFile)
|
|
{
|
|
pVideoFile->OpenFile(bstrFile);
|
|
pVideoFile->get_audioDuration(&dDuration);
|
|
pVideoFile->CloseFile();
|
|
}
|
|
SysFreeString(bstrFile);
|
|
|
|
lpAudioElement->m_dStartTime = pDocument.m_arPages[SldNum]->m_dStartTime;
|
|
lpAudioElement->m_dEndTime = lpAudioElement->m_dStartTime + dDuration;
|
|
|
|
pDocument.m_arPages[SldNum]->m_arElements.Add(lpAudioElement);
|
|
}
|
|
}
|
|
return pTransition.advTm.get_value_or(0);
|
|
}
|
|
} // namespace PPTX2DrawingXML
|