DirectVobSub.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:19k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #include "stdafx.h"
  22. #include "DirectVobSub.h"
  23. #include "VSFilter.h"
  24. CDirectVobSub::CDirectVobSub()
  25. {
  26. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  27. BYTE* pData;
  28. UINT nSize;
  29. m_iSelectedLanguage = 0;
  30. m_fHideSubtitles = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_HIDE), 0);
  31. m_fDoPreBuffering = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DOPREBUFFERING), 1);
  32. m_fOverridePlacement = !!theApp.GetProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_OVERRIDEPLACEMENT), 0);
  33. m_PlacementXperc = theApp.GetProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_XPERC), 50);
  34. m_PlacementYperc = theApp.GetProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_YPERC), 90);
  35. m_fBufferVobSub = !!theApp.GetProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_BUFFER), 1);
  36. m_fOnlyShowForcedVobSubs = !!theApp.GetProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_ONLYSHOWFORCEDSUBS), 0);
  37. m_fPolygonize = !!theApp.GetProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_POLYGONIZE), 0);
  38. m_defStyle <<= theApp.GetProfileString(ResStr(IDS_R_TEXT), ResStr(IDS_RT_STYLE), _T(""));
  39. m_fFlipPicture = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPPICTURE), 0);
  40. m_fFlipSubtitles = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPSUBTITLES), 0);
  41. m_fOSD = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SHOWOSDSTATS), 0);
  42. m_fSaveFullPath = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SAVEFULLPATH), 0);
  43. m_nReloaderDisableCount = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DISABLERELOADER), 0) ? 1 : 0;
  44. m_SubtitleDelay = theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLEDELAY), 0);
  45. m_SubtitleSpeedMul = theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDMUL), 1000);
  46. m_SubtitleSpeedDiv = theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDDIV), 1000);
  47. m_fMediaFPSEnabled = !!theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPSENABLED), 0);
  48. pData = NULL;
  49. if(theApp.GetProfileBinary(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPS), &pData, &nSize) && pData)
  50. {
  51. if(nSize != sizeof(m_MediaFPS)) m_MediaFPS = 25.0;
  52. else memcpy(&m_MediaFPS, pData, sizeof(m_MediaFPS));
  53. delete [] pData;
  54. }
  55. m_ZoomRect.left = m_ZoomRect.top = 0;
  56. m_ZoomRect.right = m_ZoomRect.bottom = 1;
  57. m_fForced = false;
  58. }
  59. CDirectVobSub::~CDirectVobSub()
  60. {
  61. CAutoLock cAutoLock(&m_propsLock);
  62. }
  63. STDMETHODIMP CDirectVobSub::get_FileName(WCHAR* fn)
  64. {
  65. CAutoLock cAutoLock(&m_propsLock);
  66. if(!fn) return E_POINTER;
  67. #ifdef UNICODE
  68. wcscpy(fn, m_FileName);
  69. #else
  70. mbstowcs(fn, m_FileName, m_FileName.GetLength()+1);
  71. #endif
  72.     return S_OK;
  73. }
  74. STDMETHODIMP CDirectVobSub::put_FileName(WCHAR* fn)
  75. {
  76. CAutoLock cAutoLock(&m_propsLock);
  77. if(!fn) return E_POINTER;
  78. CString tmp = fn;
  79. if(!m_FileName.Left(m_FileName.ReverseFind('.')+1).CompareNoCase(tmp.Left(tmp.ReverseFind('.')+1))) return S_FALSE;
  80. #ifdef UNICODE
  81. m_FileName = fn;
  82. #else
  83. CHARSETINFO cs={0};
  84. ::TranslateCharsetInfo((DWORD *)DEFAULT_CHARSET, &cs, TCI_SRCCHARSET);
  85. CHAR* buff = m_FileName.GetBuffer(MAX_PATH*2);
  86. int len = WideCharToMultiByte(cs.ciACP/*CP_OEMCP*/, NULL, fn, -1, buff, MAX_PATH*2, NULL, NULL);
  87. m_FileName.ReleaseBuffer(len+1);
  88. #endif
  89. return S_OK;
  90. }
  91. STDMETHODIMP CDirectVobSub::get_LanguageCount(int* nLangs)
  92. {
  93. CAutoLock cAutoLock(&m_propsLock);
  94. return nLangs ? *nLangs = 0, S_OK : E_POINTER;
  95. }
  96. STDMETHODIMP CDirectVobSub::get_LanguageName(int iLanguage, WCHAR** ppName)
  97. {
  98. return S_OK;
  99. }
  100. STDMETHODIMP CDirectVobSub::get_SelectedLanguage(int* iSelected)
  101. {
  102. CAutoLock cAutoLock(&m_propsLock);
  103. return iSelected ? *iSelected = m_iSelectedLanguage, S_OK : E_POINTER;
  104. }
  105. STDMETHODIMP CDirectVobSub::put_SelectedLanguage(int iSelected)
  106. {
  107. CAutoLock cAutoLock(&m_propsLock);
  108. if(m_iSelectedLanguage == iSelected) return S_FALSE;
  109. int nCount;
  110. if(FAILED(get_LanguageCount(&nCount))
  111. || iSelected < 0 
  112. || iSelected >= nCount) 
  113. return E_FAIL;
  114. m_iSelectedLanguage = iSelected;
  115. return S_OK;
  116. }
  117. STDMETHODIMP CDirectVobSub::get_HideSubtitles(bool* fHideSubtitles)
  118. {
  119. CAutoLock cAutoLock(&m_propsLock);
  120. return fHideSubtitles ? *fHideSubtitles = m_fHideSubtitles, S_OK : E_POINTER;
  121. }
  122. STDMETHODIMP CDirectVobSub::put_HideSubtitles(bool fHideSubtitles)
  123. {
  124. CAutoLock cAutoLock(&m_propsLock);
  125. if(m_fHideSubtitles == fHideSubtitles) return S_FALSE;
  126. m_fHideSubtitles = fHideSubtitles;
  127. return S_OK;
  128. }
  129. STDMETHODIMP CDirectVobSub::get_PreBuffering(bool* fDoPreBuffering)
  130. {
  131. CAutoLock cAutoLock(&m_propsLock);
  132. return fDoPreBuffering ? *fDoPreBuffering = m_fDoPreBuffering, S_OK : E_POINTER;
  133. }
  134. STDMETHODIMP CDirectVobSub::put_PreBuffering(bool fDoPreBuffering)
  135. {
  136. CAutoLock cAutoLock(&m_propsLock);
  137. if(m_fDoPreBuffering == fDoPreBuffering) return S_FALSE;
  138. m_fDoPreBuffering = fDoPreBuffering;
  139. return S_OK;
  140. }
  141. STDMETHODIMP CDirectVobSub::get_Placement(bool* fOverridePlacement, int* xperc, int* yperc)
  142. {
  143. CAutoLock cAutoLock(&m_propsLock);
  144. if(fOverridePlacement) *fOverridePlacement = m_fOverridePlacement;
  145. if(xperc) *xperc = m_PlacementXperc;
  146. if(yperc) *yperc = m_PlacementYperc;
  147. return S_OK;
  148. }
  149. STDMETHODIMP CDirectVobSub::put_Placement(bool fOverridePlacement, int xperc, int yperc)
  150. {
  151. CAutoLock cAutoLock(&m_propsLock);
  152. if(m_fOverridePlacement == fOverridePlacement && m_PlacementXperc == xperc && m_PlacementYperc == yperc) return S_FALSE;
  153. m_fOverridePlacement = fOverridePlacement;
  154. m_PlacementXperc = xperc;
  155. m_PlacementYperc = yperc;
  156. return S_OK;
  157. }
  158. STDMETHODIMP CDirectVobSub::get_VobSubSettings(bool* fBuffer, bool* fOnlyShowForcedSubs, bool* fPolygonize)
  159. {
  160. CAutoLock cAutoLock(&m_propsLock);
  161. if(fBuffer) *fBuffer = m_fBufferVobSub;
  162. if(fOnlyShowForcedSubs) *fOnlyShowForcedSubs = m_fOnlyShowForcedVobSubs;
  163. if(fPolygonize) *fPolygonize = m_fPolygonize;
  164. return S_OK;
  165. }
  166. STDMETHODIMP CDirectVobSub::put_VobSubSettings(bool fBuffer, bool fOnlyShowForcedSubs, bool fPolygonize)
  167. {
  168. CAutoLock cAutoLock(&m_propsLock);
  169. if(m_fBufferVobSub == fBuffer && m_fOnlyShowForcedVobSubs == fOnlyShowForcedSubs && m_fPolygonize == fPolygonize) return S_FALSE;
  170. m_fBufferVobSub = fBuffer;
  171. m_fOnlyShowForcedVobSubs = fOnlyShowForcedSubs;
  172. m_fPolygonize = fPolygonize;
  173. return S_OK;
  174. }
  175. STDMETHODIMP CDirectVobSub::get_TextSettings(void* lf, int lflen, COLORREF* color, bool* fShadow, bool* fOutline, bool* fAdvancedRenderer)
  176. {
  177. CAutoLock cAutoLock(&m_propsLock);
  178. if(lf)
  179. {
  180. if(lflen == sizeof(LOGFONTA))
  181. strcpy(((LOGFONTA*)lf)->lfFaceName, CStringA(m_defStyle.fontName));
  182. else if(lflen == sizeof(LOGFONTW))
  183. wcscpy(((LOGFONTW*)lf)->lfFaceName, CStringW(m_defStyle.fontName));
  184. else
  185. return E_INVALIDARG;
  186. ((LOGFONT*)lf)->lfCharSet = m_defStyle.charSet;
  187. ((LOGFONT*)lf)->lfItalic = m_defStyle.fItalic;
  188. ((LOGFONT*)lf)->lfHeight = m_defStyle.fontSize;
  189. ((LOGFONT*)lf)->lfWeight = m_defStyle.fontWeight;
  190. ((LOGFONT*)lf)->lfStrikeOut = m_defStyle.fStrikeOut;
  191. ((LOGFONT*)lf)->lfUnderline = m_defStyle.fUnderline;
  192. }
  193. if(color) *color = m_defStyle.colors[0];
  194. if(fShadow) *fShadow = m_defStyle.shadowDepth>0;
  195. if(fOutline) *fOutline = m_defStyle.outlineWidth>0;
  196. if(fAdvancedRenderer) *fAdvancedRenderer = m_fAdvancedRenderer;
  197. return S_OK;
  198. }
  199. STDMETHODIMP CDirectVobSub::put_TextSettings(void* lf, int lflen, COLORREF color, bool fShadow, bool fOutline, bool fAdvancedRenderer)
  200. {
  201. CAutoLock cAutoLock(&m_propsLock);
  202. if(lf)
  203. {
  204. if(lflen == sizeof(LOGFONTA))
  205. m_defStyle.fontName = ((LOGFONTA*)lf)->lfFaceName;
  206. else if(lflen == sizeof(LOGFONTW))
  207. m_defStyle.fontName = ((LOGFONTW*)lf)->lfFaceName;
  208. else
  209. return E_INVALIDARG;
  210. m_defStyle.charSet = ((LOGFONT*)lf)->lfCharSet;
  211. m_defStyle.fItalic = !!((LOGFONT*)lf)->lfItalic;
  212. m_defStyle.fontSize = ((LOGFONT*)lf)->lfHeight;
  213. m_defStyle.fontWeight = ((LOGFONT*)lf)->lfWeight;
  214. m_defStyle.fStrikeOut = !!((LOGFONT*)lf)->lfStrikeOut;
  215. m_defStyle.fUnderline = !!((LOGFONT*)lf)->lfUnderline;
  216. if(m_defStyle.fontSize < 0)
  217. {
  218. HDC hdc = ::GetDC(0);
  219. m_defStyle.fontSize = -m_defStyle.fontSize * 72 / GetDeviceCaps(hdc, LOGPIXELSY);
  220. ::ReleaseDC(0, hdc);
  221. }
  222. }
  223. m_defStyle.colors[0] = color;
  224. m_defStyle.shadowDepth = fShadow?2:0;
  225. m_defStyle.outlineWidth = fOutline?2:0;
  226. return S_OK;
  227. }
  228. STDMETHODIMP CDirectVobSub::get_Flip(bool* fPicture, bool* fSubtitles)
  229. {
  230. CAutoLock cAutoLock(&m_propsLock);
  231. if(fPicture) *fPicture = m_fFlipPicture;
  232. if(fSubtitles) *fSubtitles = m_fFlipSubtitles;
  233. return S_OK;
  234. }
  235. STDMETHODIMP CDirectVobSub::put_Flip(bool fPicture, bool fSubtitles)
  236. {
  237. CAutoLock cAutoLock(&m_propsLock);
  238. if(m_fFlipPicture == fPicture && m_fFlipSubtitles == fSubtitles) return S_FALSE;
  239. m_fFlipPicture = fPicture;
  240. m_fFlipSubtitles = fSubtitles;
  241. return S_OK;
  242. }
  243. STDMETHODIMP CDirectVobSub::get_OSD(bool* fOSD)
  244. {
  245. CAutoLock cAutoLock(&m_propsLock);
  246. return fOSD ? *fOSD = m_fOSD, S_OK : E_POINTER;
  247. }
  248. STDMETHODIMP CDirectVobSub::put_OSD(bool fOSD)
  249. {
  250. CAutoLock cAutoLock(&m_propsLock);
  251. if(m_fOSD == fOSD) return S_FALSE;
  252. m_fOSD = fOSD;
  253. return S_OK;
  254. }
  255. STDMETHODIMP CDirectVobSub::get_SaveFullPath(bool* fSaveFullPath)
  256. {
  257. CAutoLock cAutoLock(&m_propsLock);
  258. return fSaveFullPath ? *fSaveFullPath = m_fSaveFullPath, S_OK : E_POINTER;
  259. }
  260. STDMETHODIMP CDirectVobSub::put_SaveFullPath(bool fSaveFullPath)
  261. {
  262. CAutoLock cAutoLock(&m_propsLock);
  263. if(m_fSaveFullPath == fSaveFullPath) return S_FALSE;
  264. m_fSaveFullPath = fSaveFullPath;
  265. return S_OK;
  266. }
  267. STDMETHODIMP CDirectVobSub::get_SubtitleTiming(int* delay, int* speedmul, int* speeddiv)
  268. {
  269. CAutoLock cAutoLock(&m_propsLock);
  270. if(delay) *delay = m_SubtitleDelay;
  271. if(speedmul) *speedmul = m_SubtitleSpeedMul;
  272. if(speeddiv) *speeddiv = m_SubtitleSpeedDiv;
  273. return S_OK;
  274. }
  275. STDMETHODIMP CDirectVobSub::put_SubtitleTiming(int delay, int speedmul, int speeddiv)
  276. {
  277. CAutoLock cAutoLock(&m_propsLock);
  278. if(m_SubtitleDelay == delay && m_SubtitleSpeedMul == speedmul && m_SubtitleSpeedDiv == speeddiv) return S_FALSE;
  279. m_SubtitleDelay = delay;
  280. m_SubtitleSpeedMul = speedmul;
  281. if(speeddiv > 0) m_SubtitleSpeedDiv = speeddiv;
  282. return S_OK;
  283. }
  284. STDMETHODIMP CDirectVobSub::get_MediaFPS(bool* fEnabled, double* fps)
  285. {
  286. CAutoLock cAutoLock(&m_propsLock);
  287. if(fEnabled) *fEnabled = m_fMediaFPSEnabled;
  288. if(fps) *fps = m_MediaFPS;
  289. return S_OK;
  290. }
  291. STDMETHODIMP CDirectVobSub::put_MediaFPS(bool fEnabled, double fps)
  292. {
  293. CAutoLock cAutoLock(&m_propsLock);
  294. if(m_fMediaFPSEnabled == fEnabled && m_MediaFPS == fps) return S_FALSE;
  295. m_fMediaFPSEnabled = fEnabled;
  296. if(fps > 0) m_MediaFPS = fps;
  297. return S_OK;
  298. }
  299. STDMETHODIMP CDirectVobSub::get_ZoomRect(NORMALIZEDRECT* rect)
  300. {
  301. CAutoLock cAutoLock(&m_propsLock);
  302. if(!rect) return E_POINTER;
  303. *rect = m_ZoomRect;
  304. return S_OK;
  305. }
  306. STDMETHODIMP CDirectVobSub::put_ZoomRect(NORMALIZEDRECT* rect)
  307. {
  308. CAutoLock cAutoLock(&m_propsLock);
  309. if(!rect) return E_POINTER;
  310. if(!memcmp(&m_ZoomRect, rect, sizeof(m_ZoomRect))) return S_FALSE;
  311. m_ZoomRect = *rect;
  312. return S_OK;
  313. }
  314. STDMETHODIMP CDirectVobSub::UpdateRegistry()
  315. {
  316. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  317. CAutoLock cAutoLock(&m_propsLock);
  318. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_HIDE), m_fHideSubtitles);
  319. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DOPREBUFFERING), m_fDoPreBuffering);
  320. theApp.WriteProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_OVERRIDEPLACEMENT), m_fOverridePlacement);
  321. theApp.WriteProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_XPERC), m_PlacementXperc);
  322. theApp.WriteProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_YPERC), m_PlacementYperc);
  323. theApp.WriteProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_BUFFER), m_fBufferVobSub);
  324. theApp.WriteProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_ONLYSHOWFORCEDSUBS), m_fOnlyShowForcedVobSubs);
  325. theApp.WriteProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_POLYGONIZE), m_fPolygonize);
  326. CString style;
  327. theApp.WriteProfileString(ResStr(IDS_R_TEXT), ResStr(IDS_RT_STYLE), style <<= m_defStyle);
  328. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPPICTURE), m_fFlipPicture);
  329. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPSUBTITLES), m_fFlipSubtitles);
  330. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SHOWOSDSTATS), m_fOSD);
  331. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SAVEFULLPATH), m_fSaveFullPath);
  332. theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLEDELAY), m_SubtitleDelay);
  333. theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDMUL), m_SubtitleSpeedMul);
  334. theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDDIV), m_SubtitleSpeedDiv);
  335. theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPSENABLED), m_fMediaFPSEnabled);
  336. theApp.WriteProfileBinary(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPS), (BYTE*)&m_MediaFPS, sizeof(m_MediaFPS));
  337. return S_OK;
  338. }
  339. STDMETHODIMP CDirectVobSub::HasConfigDialog(int iSelected)
  340. {
  341. return E_NOTIMPL;
  342. }
  343. STDMETHODIMP CDirectVobSub::ShowConfigDialog(int iSelected, HWND hWndParent)
  344. {
  345. return E_NOTIMPL;
  346. }
  347. STDMETHODIMP CDirectVobSub::IsSubtitleReloaderLocked(bool* fLocked)
  348. {
  349. CAutoLock cAutoLock(&m_propsLock);
  350. if(!fLocked) return E_POINTER; 
  351. bool fDisabled;
  352. get_SubtitleReloader(&fDisabled);
  353. *fLocked = fDisabled || m_nReloaderDisableCount > 0;
  354. return S_OK;
  355. }
  356. STDMETHODIMP CDirectVobSub::LockSubtitleReloader(bool fLock)
  357. {
  358. CAutoLock cAutoLock(&m_propsLock);
  359. if(fLock) m_nReloaderDisableCount++;
  360. else m_nReloaderDisableCount--;
  361. ASSERT(m_nReloaderDisableCount >= 0);
  362. if(m_nReloaderDisableCount < 0) m_nReloaderDisableCount = 0;
  363. return S_OK;
  364. }
  365. STDMETHODIMP CDirectVobSub::get_SubtitleReloader(bool* fDisabled)
  366. {
  367. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  368. CAutoLock cAutoLock(&m_propsLock);
  369. if(fDisabled) *fDisabled = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DISABLERELOADER), 0);
  370. return S_OK;
  371. }
  372. STDMETHODIMP CDirectVobSub::put_SubtitleReloader(bool fDisable)
  373. {
  374. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  375. CAutoLock cAutoLock(&m_propsLock);
  376. bool b;
  377. get_SubtitleReloader(&b);
  378. if(b == fDisable) return S_FALSE;
  379. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DISABLERELOADER), fDisable);
  380. return S_OK;
  381. }
  382. STDMETHODIMP CDirectVobSub::get_ExtendPicture(int* horizontal, int* vertical, int* resx2, int* resx2minw, int* resx2minh)
  383. {
  384. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  385. CAutoLock cAutoLock(&m_propsLock);
  386. if(horizontal) *horizontal = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_MOD32FIX), 0) & 1;
  387. if(vertical) *vertical = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTPIC), 1);
  388. if(resx2) *resx2 = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2), 2) & 3;
  389. if(resx2minw) *resx2minw = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINW), 384);
  390. if(resx2minh) *resx2minh = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINH), 288);
  391. return S_OK;
  392. }
  393. STDMETHODIMP CDirectVobSub::put_ExtendPicture(int horizontal, int vertical, int resx2, int resx2minw, int resx2minh)
  394. {
  395. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  396. CAutoLock cAutoLock(&m_propsLock);
  397. int i[5];
  398. get_ExtendPicture(i, i+1, i+2, i+3, i+4);
  399. if(i[0] == horizontal && i[1] == vertical && i[2] == resx2 && i[3] == resx2minw && i[4] == resx2minh) return S_FALSE;
  400. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_MOD32FIX), horizontal & 1);
  401. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTPIC), vertical);
  402. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2), resx2 & 3);
  403. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINW), resx2minw);
  404. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINH), resx2minh);
  405. return S_OK;
  406. }
  407. STDMETHODIMP CDirectVobSub::get_LoadSettings(int* level, bool* fExternalLoad, bool* fWebLoad, bool* fEmbeddedLoad)
  408. {
  409. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  410. CAutoLock cAutoLock(&m_propsLock);
  411. if(level) *level = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_LOADLEVEL), 0) & 3;
  412. if(fExternalLoad) *fExternalLoad = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTERNALLOAD), 1);
  413. if(fWebLoad) *fWebLoad = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_WEBLOAD), 0);
  414. if(fEmbeddedLoad) *fEmbeddedLoad = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EMBEDDEDLOAD), 1);
  415. return S_OK;
  416. }
  417. STDMETHODIMP CDirectVobSub::put_LoadSettings(int level, bool fExternalLoad, bool fWebLoad, bool fEmbeddedLoad)
  418. {
  419. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  420. CAutoLock cAutoLock(&m_propsLock);
  421. int i;
  422. bool b[3];
  423. get_LoadSettings(&i, b, b+1, b+2);
  424. if(i == level && b[0] == fExternalLoad && b[1] == fWebLoad && b[2] == fEmbeddedLoad) return S_FALSE;
  425. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_LOADLEVEL), level & 3);
  426. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTERNALLOAD), fExternalLoad);
  427. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_WEBLOAD), fWebLoad);
  428. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EMBEDDEDLOAD), fEmbeddedLoad);
  429. return S_OK;
  430. }
  431. // IDirectVobSub2
  432. STDMETHODIMP CDirectVobSub::AdviseSubClock(ISubClock* pSubClock)
  433. {
  434. m_pSubClock = pSubClock;
  435. return S_OK;
  436. }
  437. STDMETHODIMP_(bool) CDirectVobSub::get_Forced()
  438. {
  439. return m_fForced;
  440. }
  441. STDMETHODIMP CDirectVobSub::put_Forced(bool fForced)
  442. {
  443. m_fForced = fForced;
  444. return S_OK;
  445. }
  446. STDMETHODIMP CDirectVobSub::get_TextSettings(STSStyle* pDefStyle)
  447. {
  448. CheckPointer(pDefStyle, E_POINTER);
  449. CAutoLock cAutoLock(&m_propsLock);
  450. *pDefStyle = m_defStyle;
  451. return S_OK;
  452. }
  453. STDMETHODIMP CDirectVobSub::put_TextSettings(STSStyle* pDefStyle)
  454. {
  455. CheckPointer(pDefStyle, E_POINTER);
  456. CAutoLock cAutoLock(&m_propsLock);
  457. if(!memcmp(&m_defStyle, pDefStyle, sizeof(m_defStyle)))
  458. return S_FALSE;
  459. m_defStyle = *pDefStyle;
  460. return S_OK;
  461. }
  462. // IFilterVersion
  463. STDMETHODIMP_(DWORD) CDirectVobSub::GetFilterVersion()
  464. {
  465. return 0x0234;
  466. }