DirectVobSub.cpp

00001 /* 
00002  *      Copyright (C) 2003-2005 Gabest
00003  *      http://www.gabest.org
00004  *
00005  *  This Program is free software; you can redistribute it and/or modify
00006  *  it under the terms of the GNU General Public License as published by
00007  *  the Free Software Foundation; either version 2, or (at your option)
00008  *  any later version.
00009  *   
00010  *  This Program is distributed in the hope that it will be useful,
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00013  *  GNU General Public License for more details.
00014  *   
00015  *  You should have received a copy of the GNU General Public License
00016  *  along with GNU Make; see the file COPYING.  If not, write to
00017  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
00018  *  http://www.gnu.org/copyleft/gpl.html
00019  *
00020  */
00021 
00022 #include "stdafx.h"
00023 #include "DirectVobSub.h"
00024 #include "VSFilter.h"
00025 
00026 CDirectVobSub::CDirectVobSub()
00027 {
00028         AFX_MANAGE_STATE(AfxGetStaticModuleState());
00029 
00030         BYTE* pData;
00031         UINT nSize;
00032 
00033         m_iSelectedLanguage = 0;
00034         m_fHideSubtitles = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_HIDE), 0);
00035         m_fDoPreBuffering = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DOPREBUFFERING), 1);
00036         m_fOverridePlacement = !!theApp.GetProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_OVERRIDEPLACEMENT), 0);
00037         m_PlacementXperc = theApp.GetProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_XPERC), 50);
00038         m_PlacementYperc = theApp.GetProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_YPERC), 90);
00039         m_fBufferVobSub = !!theApp.GetProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_BUFFER), 1);
00040         m_fOnlyShowForcedVobSubs = !!theApp.GetProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_ONLYSHOWFORCEDSUBS), 0);
00041         m_fPolygonize = !!theApp.GetProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_POLYGONIZE), 0);
00042         m_defStyle <<= theApp.GetProfileString(ResStr(IDS_R_TEXT), ResStr(IDS_RT_STYLE), _T(""));
00043         m_fFlipPicture = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPPICTURE), 0);
00044         m_fFlipSubtitles = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPSUBTITLES), 0);
00045         m_fOSD = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SHOWOSDSTATS), 0);
00046         m_fSaveFullPath = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SAVEFULLPATH), 0);
00047         m_nReloaderDisableCount = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DISABLERELOADER), 0) ? 1 : 0;
00048         m_SubtitleDelay = theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLEDELAY), 0);
00049         m_SubtitleSpeedMul = theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDMUL), 1000);
00050         m_SubtitleSpeedDiv = theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDDIV), 1000);
00051         m_fMediaFPSEnabled = !!theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPSENABLED), 0);
00052         pData = NULL;
00053         if(theApp.GetProfileBinary(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPS), &pData, &nSize) && pData)
00054         {
00055                 if(nSize != sizeof(m_MediaFPS)) m_MediaFPS = 25.0;
00056                 else memcpy(&m_MediaFPS, pData, sizeof(m_MediaFPS));
00057                 delete [] pData;
00058         }
00059         m_ZoomRect.left = m_ZoomRect.top = 0;
00060         m_ZoomRect.right = m_ZoomRect.bottom = 1;
00061 
00062         m_fForced = false;
00063 }
00064 
00065 CDirectVobSub::~CDirectVobSub()
00066 {
00067         CAutoLock cAutoLock(&m_propsLock);
00068 }
00069 
00070 STDMETHODIMP CDirectVobSub::get_FileName(WCHAR* fn)
00071 {
00072         CAutoLock cAutoLock(&m_propsLock);
00073 
00074         if(!fn) return E_POINTER;
00075 
00076 #ifdef UNICODE
00077         wcscpy(fn, m_FileName);
00078 #else
00079         mbstowcs(fn, m_FileName, m_FileName.GetLength()+1);
00080 #endif
00081 
00082     return S_OK;
00083 }
00084 
00085 STDMETHODIMP CDirectVobSub::put_FileName(WCHAR* fn)
00086 {
00087         CAutoLock cAutoLock(&m_propsLock);
00088 
00089         if(!fn) return E_POINTER;
00090 
00091         CString tmp = fn;
00092         if(!m_FileName.Left(m_FileName.ReverseFind('.')+1).CompareNoCase(tmp.Left(tmp.ReverseFind('.')+1))) return S_FALSE;
00093 
00094 #ifdef UNICODE
00095         m_FileName = fn;
00096 #else
00097         CHARSETINFO cs={0};
00098         ::TranslateCharsetInfo((DWORD *)DEFAULT_CHARSET, &cs, TCI_SRCCHARSET);
00099         CHAR* buff = m_FileName.GetBuffer(MAX_PATH*2);
00100         int len = WideCharToMultiByte(cs.ciACP/*CP_OEMCP*/, NULL, fn, -1, buff, MAX_PATH*2, NULL, NULL);
00101         m_FileName.ReleaseBuffer(len+1);
00102 #endif
00103 
00104         return S_OK;
00105 }
00106 
00107 STDMETHODIMP CDirectVobSub::get_LanguageCount(int* nLangs)
00108 {
00109         CAutoLock cAutoLock(&m_propsLock);
00110 
00111         return nLangs ? *nLangs = 0, S_OK : E_POINTER;
00112 }
00113 
00114 STDMETHODIMP CDirectVobSub::get_LanguageName(int iLanguage, WCHAR** ppName)
00115 {
00116         return S_OK;
00117 }
00118 
00119 STDMETHODIMP CDirectVobSub::get_SelectedLanguage(int* iSelected)
00120 {
00121         CAutoLock cAutoLock(&m_propsLock);
00122 
00123         return iSelected ? *iSelected = m_iSelectedLanguage, S_OK : E_POINTER;
00124 }
00125 
00126 STDMETHODIMP CDirectVobSub::put_SelectedLanguage(int iSelected)
00127 {
00128         CAutoLock cAutoLock(&m_propsLock);
00129 
00130         if(m_iSelectedLanguage == iSelected) return S_FALSE;
00131 
00132         int nCount;
00133         if(FAILED(get_LanguageCount(&nCount))
00134         || iSelected < 0 
00135         || iSelected >= nCount) 
00136                 return E_FAIL;
00137 
00138         m_iSelectedLanguage = iSelected;
00139 
00140         return S_OK;
00141 }
00142 
00143 STDMETHODIMP CDirectVobSub::get_HideSubtitles(bool* fHideSubtitles)
00144 {
00145         CAutoLock cAutoLock(&m_propsLock);
00146 
00147         return fHideSubtitles ? *fHideSubtitles = m_fHideSubtitles, S_OK : E_POINTER;
00148 }
00149 
00150 STDMETHODIMP CDirectVobSub::put_HideSubtitles(bool fHideSubtitles)
00151 {
00152         CAutoLock cAutoLock(&m_propsLock);
00153 
00154         if(m_fHideSubtitles == fHideSubtitles) return S_FALSE;
00155 
00156         m_fHideSubtitles = fHideSubtitles;
00157 
00158         return S_OK;
00159 }
00160 
00161 STDMETHODIMP CDirectVobSub::get_PreBuffering(bool* fDoPreBuffering)
00162 {
00163         CAutoLock cAutoLock(&m_propsLock);
00164 
00165         return fDoPreBuffering ? *fDoPreBuffering = m_fDoPreBuffering, S_OK : E_POINTER;
00166 }
00167 
00168 STDMETHODIMP CDirectVobSub::put_PreBuffering(bool fDoPreBuffering)
00169 {
00170         CAutoLock cAutoLock(&m_propsLock);
00171 
00172         if(m_fDoPreBuffering == fDoPreBuffering) return S_FALSE;
00173 
00174         m_fDoPreBuffering = fDoPreBuffering;
00175 
00176         return S_OK;
00177 }
00178 
00179 STDMETHODIMP CDirectVobSub::get_Placement(bool* fOverridePlacement, int* xperc, int* yperc)
00180 {
00181         CAutoLock cAutoLock(&m_propsLock);
00182 
00183         if(fOverridePlacement) *fOverridePlacement = m_fOverridePlacement;
00184         if(xperc) *xperc = m_PlacementXperc;
00185         if(yperc) *yperc = m_PlacementYperc;
00186 
00187         return S_OK;
00188 }
00189 
00190 STDMETHODIMP CDirectVobSub::put_Placement(bool fOverridePlacement, int xperc, int yperc)
00191 {
00192         CAutoLock cAutoLock(&m_propsLock);
00193 
00194         if(m_fOverridePlacement == fOverridePlacement && m_PlacementXperc == xperc && m_PlacementYperc == yperc) return S_FALSE;
00195 
00196         m_fOverridePlacement = fOverridePlacement;
00197         m_PlacementXperc = xperc;
00198         m_PlacementYperc = yperc;
00199 
00200         return S_OK;
00201 }
00202 
00203 STDMETHODIMP CDirectVobSub::get_VobSubSettings(bool* fBuffer, bool* fOnlyShowForcedSubs, bool* fPolygonize)
00204 {
00205         CAutoLock cAutoLock(&m_propsLock);
00206 
00207         if(fBuffer) *fBuffer = m_fBufferVobSub;
00208         if(fOnlyShowForcedSubs) *fOnlyShowForcedSubs = m_fOnlyShowForcedVobSubs;
00209         if(fPolygonize) *fPolygonize = m_fPolygonize;
00210 
00211         return S_OK;
00212 }
00213 
00214 STDMETHODIMP CDirectVobSub::put_VobSubSettings(bool fBuffer, bool fOnlyShowForcedSubs, bool fPolygonize)
00215 {
00216         CAutoLock cAutoLock(&m_propsLock);
00217 
00218         if(m_fBufferVobSub == fBuffer && m_fOnlyShowForcedVobSubs == fOnlyShowForcedSubs && m_fPolygonize == fPolygonize) return S_FALSE;
00219 
00220         m_fBufferVobSub = fBuffer;
00221         m_fOnlyShowForcedVobSubs = fOnlyShowForcedSubs;
00222         m_fPolygonize = fPolygonize;
00223 
00224         return S_OK;
00225 }
00226 
00227 STDMETHODIMP CDirectVobSub::get_TextSettings(void* lf, int lflen, COLORREF* color, bool* fShadow, bool* fOutline, bool* fAdvancedRenderer)
00228 {
00229         CAutoLock cAutoLock(&m_propsLock);
00230 
00231         if(lf)
00232         {
00233                 if(lflen == sizeof(LOGFONTA))
00234                         strcpy(((LOGFONTA*)lf)->lfFaceName, CStringA(m_defStyle.fontName));
00235                 else if(lflen == sizeof(LOGFONTW))
00236                         wcscpy(((LOGFONTW*)lf)->lfFaceName, CStringW(m_defStyle.fontName));
00237                 else
00238                         return E_INVALIDARG;
00239 
00240                 ((LOGFONT*)lf)->lfCharSet = m_defStyle.charSet;
00241                 ((LOGFONT*)lf)->lfItalic = m_defStyle.fItalic;
00242                 ((LOGFONT*)lf)->lfHeight = m_defStyle.fontSize;
00243                 ((LOGFONT*)lf)->lfWeight = m_defStyle.fontWeight;
00244                 ((LOGFONT*)lf)->lfStrikeOut = m_defStyle.fStrikeOut;
00245                 ((LOGFONT*)lf)->lfUnderline = m_defStyle.fUnderline;
00246         }
00247 
00248         if(color) *color = m_defStyle.colors[0];
00249         if(fShadow) *fShadow = m_defStyle.shadowDepth>0;
00250         if(fOutline) *fOutline = m_defStyle.outlineWidth>0;
00251         if(fAdvancedRenderer) *fAdvancedRenderer = m_fAdvancedRenderer;
00252 
00253         return S_OK;
00254 }
00255 
00256 STDMETHODIMP CDirectVobSub::put_TextSettings(void* lf, int lflen, COLORREF color, bool fShadow, bool fOutline, bool fAdvancedRenderer)
00257 {
00258         CAutoLock cAutoLock(&m_propsLock);
00259 
00260         if(lf)
00261         {
00262                 if(lflen == sizeof(LOGFONTA))
00263                         m_defStyle.fontName = ((LOGFONTA*)lf)->lfFaceName;
00264                 else if(lflen == sizeof(LOGFONTW))
00265                         m_defStyle.fontName = ((LOGFONTW*)lf)->lfFaceName;
00266                 else
00267                         return E_INVALIDARG;
00268 
00269                 m_defStyle.charSet = ((LOGFONT*)lf)->lfCharSet;
00270                 m_defStyle.fItalic = !!((LOGFONT*)lf)->lfItalic;
00271                 m_defStyle.fontSize = ((LOGFONT*)lf)->lfHeight;
00272                 m_defStyle.fontWeight = ((LOGFONT*)lf)->lfWeight;
00273                 m_defStyle.fStrikeOut = !!((LOGFONT*)lf)->lfStrikeOut;
00274                 m_defStyle.fUnderline = !!((LOGFONT*)lf)->lfUnderline;
00275 
00276                 if(m_defStyle.fontSize < 0)
00277                 {
00278                         HDC hdc = ::GetDC(0);
00279                         m_defStyle.fontSize = -m_defStyle.fontSize * 72 / GetDeviceCaps(hdc, LOGPIXELSY);
00280                         ::ReleaseDC(0, hdc);
00281                 }
00282 
00283         }
00284 
00285         m_defStyle.colors[0] = color;
00286         m_defStyle.shadowDepth = fShadow?2:0;
00287         m_defStyle.outlineWidth = fOutline?2:0;
00288 
00289         return S_OK;
00290 
00291 }
00292 
00293 STDMETHODIMP CDirectVobSub::get_Flip(bool* fPicture, bool* fSubtitles)
00294 {
00295         CAutoLock cAutoLock(&m_propsLock);
00296 
00297         if(fPicture) *fPicture = m_fFlipPicture;
00298         if(fSubtitles) *fSubtitles = m_fFlipSubtitles;
00299 
00300         return S_OK;
00301 }
00302 
00303 STDMETHODIMP CDirectVobSub::put_Flip(bool fPicture, bool fSubtitles)
00304 {
00305         CAutoLock cAutoLock(&m_propsLock);
00306 
00307         if(m_fFlipPicture == fPicture && m_fFlipSubtitles == fSubtitles) return S_FALSE;
00308 
00309         m_fFlipPicture = fPicture;
00310         m_fFlipSubtitles = fSubtitles;
00311 
00312         return S_OK;
00313 }
00314 
00315 STDMETHODIMP CDirectVobSub::get_OSD(bool* fOSD)
00316 {
00317         CAutoLock cAutoLock(&m_propsLock);
00318 
00319         return fOSD ? *fOSD = m_fOSD, S_OK : E_POINTER;
00320 }
00321 
00322 STDMETHODIMP CDirectVobSub::put_OSD(bool fOSD)
00323 {
00324         CAutoLock cAutoLock(&m_propsLock);
00325 
00326         if(m_fOSD == fOSD) return S_FALSE;
00327 
00328         m_fOSD = fOSD;
00329 
00330         return S_OK;
00331 }
00332 
00333 STDMETHODIMP CDirectVobSub::get_SaveFullPath(bool* fSaveFullPath)
00334 {
00335         CAutoLock cAutoLock(&m_propsLock);
00336 
00337         return fSaveFullPath ? *fSaveFullPath = m_fSaveFullPath, S_OK : E_POINTER;
00338 }
00339 
00340 STDMETHODIMP CDirectVobSub::put_SaveFullPath(bool fSaveFullPath)
00341 {
00342         CAutoLock cAutoLock(&m_propsLock);
00343 
00344         if(m_fSaveFullPath == fSaveFullPath) return S_FALSE;
00345 
00346         m_fSaveFullPath = fSaveFullPath;
00347 
00348         return S_OK;
00349 }
00350 
00351 STDMETHODIMP CDirectVobSub::get_SubtitleTiming(int* delay, int* speedmul, int* speeddiv)
00352 {
00353         CAutoLock cAutoLock(&m_propsLock);
00354 
00355         if(delay) *delay = m_SubtitleDelay;
00356         if(speedmul) *speedmul = m_SubtitleSpeedMul;
00357         if(speeddiv) *speeddiv = m_SubtitleSpeedDiv;
00358 
00359         return S_OK;
00360 }
00361 
00362 STDMETHODIMP CDirectVobSub::put_SubtitleTiming(int delay, int speedmul, int speeddiv)
00363 {
00364         CAutoLock cAutoLock(&m_propsLock);
00365 
00366         if(m_SubtitleDelay == delay && m_SubtitleSpeedMul == speedmul && m_SubtitleSpeedDiv == speeddiv) return S_FALSE;
00367 
00368         m_SubtitleDelay = delay;
00369         m_SubtitleSpeedMul = speedmul;
00370         if(speeddiv > 0) m_SubtitleSpeedDiv = speeddiv;
00371 
00372         return S_OK;
00373 }
00374 
00375 STDMETHODIMP CDirectVobSub::get_MediaFPS(bool* fEnabled, double* fps)
00376 {
00377         CAutoLock cAutoLock(&m_propsLock);
00378 
00379         if(fEnabled) *fEnabled = m_fMediaFPSEnabled;
00380         if(fps) *fps = m_MediaFPS;
00381 
00382         return S_OK;
00383 }
00384 
00385 STDMETHODIMP CDirectVobSub::put_MediaFPS(bool fEnabled, double fps)
00386 {
00387         CAutoLock cAutoLock(&m_propsLock);
00388 
00389         if(m_fMediaFPSEnabled == fEnabled && m_MediaFPS == fps) return S_FALSE;
00390 
00391         m_fMediaFPSEnabled = fEnabled;
00392         if(fps > 0) m_MediaFPS = fps;
00393 
00394         return S_OK;
00395 }
00396 
00397 STDMETHODIMP CDirectVobSub::get_ZoomRect(NORMALIZEDRECT* rect)
00398 {
00399         CAutoLock cAutoLock(&m_propsLock);
00400 
00401         if(!rect) return E_POINTER;
00402 
00403         *rect = m_ZoomRect;
00404 
00405         return S_OK;
00406 }
00407 
00408 STDMETHODIMP CDirectVobSub::put_ZoomRect(NORMALIZEDRECT* rect)
00409 {
00410         CAutoLock cAutoLock(&m_propsLock);
00411 
00412         if(!rect) return E_POINTER;
00413 
00414         if(!memcmp(&m_ZoomRect, rect, sizeof(m_ZoomRect))) return S_FALSE;
00415 
00416         m_ZoomRect = *rect;
00417 
00418         return S_OK;
00419 }
00420 
00421 STDMETHODIMP CDirectVobSub::UpdateRegistry()
00422 {
00423         AFX_MANAGE_STATE(AfxGetStaticModuleState());
00424 
00425         CAutoLock cAutoLock(&m_propsLock);
00426 
00427         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_HIDE), m_fHideSubtitles);
00428         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DOPREBUFFERING), m_fDoPreBuffering);
00429         theApp.WriteProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_OVERRIDEPLACEMENT), m_fOverridePlacement);
00430         theApp.WriteProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_XPERC), m_PlacementXperc);
00431         theApp.WriteProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_YPERC), m_PlacementYperc);
00432         theApp.WriteProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_BUFFER), m_fBufferVobSub);
00433         theApp.WriteProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_ONLYSHOWFORCEDSUBS), m_fOnlyShowForcedVobSubs);
00434         theApp.WriteProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_POLYGONIZE), m_fPolygonize);
00435         CString style;
00436         theApp.WriteProfileString(ResStr(IDS_R_TEXT), ResStr(IDS_RT_STYLE), style <<= m_defStyle);
00437         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPPICTURE), m_fFlipPicture);
00438         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPSUBTITLES), m_fFlipSubtitles);
00439         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SHOWOSDSTATS), m_fOSD);
00440         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SAVEFULLPATH), m_fSaveFullPath);
00441         theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLEDELAY), m_SubtitleDelay);
00442         theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDMUL), m_SubtitleSpeedMul);
00443         theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDDIV), m_SubtitleSpeedDiv);
00444         theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPSENABLED), m_fMediaFPSEnabled);
00445         theApp.WriteProfileBinary(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPS), (BYTE*)&m_MediaFPS, sizeof(m_MediaFPS));
00446 
00447         return S_OK;
00448 }
00449 
00450 STDMETHODIMP CDirectVobSub::HasConfigDialog(int iSelected)
00451 {
00452         return E_NOTIMPL;
00453 }
00454 
00455 STDMETHODIMP CDirectVobSub::ShowConfigDialog(int iSelected, HWND hWndParent)
00456 {
00457         return E_NOTIMPL;
00458 }
00459 
00460 STDMETHODIMP CDirectVobSub::IsSubtitleReloaderLocked(bool* fLocked)
00461 {
00462         CAutoLock cAutoLock(&m_propsLock);
00463 
00464         if(!fLocked) return E_POINTER; 
00465 
00466         bool fDisabled;
00467         get_SubtitleReloader(&fDisabled);
00468 
00469         *fLocked = fDisabled || m_nReloaderDisableCount > 0;
00470 
00471         return S_OK;
00472 }
00473 
00474 STDMETHODIMP CDirectVobSub::LockSubtitleReloader(bool fLock)
00475 {
00476         CAutoLock cAutoLock(&m_propsLock);
00477 
00478         if(fLock) m_nReloaderDisableCount++;
00479         else m_nReloaderDisableCount--;
00480 
00481         ASSERT(m_nReloaderDisableCount >= 0);
00482         if(m_nReloaderDisableCount < 0) m_nReloaderDisableCount = 0;
00483 
00484         return S_OK;
00485 }
00486 
00487 STDMETHODIMP CDirectVobSub::get_SubtitleReloader(bool* fDisabled)
00488 {
00489         AFX_MANAGE_STATE(AfxGetStaticModuleState());
00490 
00491         CAutoLock cAutoLock(&m_propsLock);
00492 
00493         if(fDisabled) *fDisabled = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DISABLERELOADER), 0);
00494 
00495         return S_OK;
00496 }
00497 
00498 STDMETHODIMP CDirectVobSub::put_SubtitleReloader(bool fDisable)
00499 {
00500         AFX_MANAGE_STATE(AfxGetStaticModuleState());
00501 
00502         CAutoLock cAutoLock(&m_propsLock);
00503 
00504         bool b;
00505         get_SubtitleReloader(&b);
00506         if(b == fDisable) return S_FALSE;
00507 
00508         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DISABLERELOADER), fDisable);
00509 
00510         return S_OK;
00511 }
00512 
00513 STDMETHODIMP CDirectVobSub::get_ExtendPicture(int* horizontal, int* vertical, int* resx2, int* resx2minw, int* resx2minh)
00514 {
00515         AFX_MANAGE_STATE(AfxGetStaticModuleState());
00516 
00517         CAutoLock cAutoLock(&m_propsLock);
00518 
00519         if(horizontal) *horizontal = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_MOD32FIX), 0) & 1;
00520         if(vertical) *vertical = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTPIC), 1);
00521         if(resx2) *resx2 = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2), 2) & 3;
00522         if(resx2minw) *resx2minw = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINW), 384);
00523         if(resx2minh) *resx2minh = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINH), 288);
00524 
00525         return S_OK;
00526 }
00527 
00528 STDMETHODIMP CDirectVobSub::put_ExtendPicture(int horizontal, int vertical, int resx2, int resx2minw, int resx2minh)
00529 {
00530         AFX_MANAGE_STATE(AfxGetStaticModuleState());
00531 
00532         CAutoLock cAutoLock(&m_propsLock);
00533 
00534         int i[5];
00535         get_ExtendPicture(i, i+1, i+2, i+3, i+4);
00536         if(i[0] == horizontal && i[1] == vertical && i[2] == resx2 && i[3] == resx2minw && i[4] == resx2minh) return S_FALSE;
00537 
00538         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_MOD32FIX), horizontal & 1);
00539         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTPIC), vertical);
00540         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2), resx2 & 3);
00541         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINW), resx2minw);
00542         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINH), resx2minh);
00543 
00544         return S_OK;
00545 }
00546 
00547 STDMETHODIMP CDirectVobSub::get_LoadSettings(int* level, bool* fExternalLoad, bool* fWebLoad, bool* fEmbeddedLoad)
00548 {
00549         AFX_MANAGE_STATE(AfxGetStaticModuleState());
00550 
00551         CAutoLock cAutoLock(&m_propsLock);
00552 
00553         if(level) *level = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_LOADLEVEL), 0) & 3;
00554         if(fExternalLoad) *fExternalLoad = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTERNALLOAD), 1);
00555         if(fWebLoad) *fWebLoad = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_WEBLOAD), 0);
00556         if(fEmbeddedLoad) *fEmbeddedLoad = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EMBEDDEDLOAD), 1);
00557 
00558         return S_OK;
00559 }
00560 
00561 STDMETHODIMP CDirectVobSub::put_LoadSettings(int level, bool fExternalLoad, bool fWebLoad, bool fEmbeddedLoad)
00562 {
00563         AFX_MANAGE_STATE(AfxGetStaticModuleState());
00564 
00565         CAutoLock cAutoLock(&m_propsLock);
00566 
00567         int i;
00568         bool b[3];
00569         get_LoadSettings(&i, b, b+1, b+2);
00570         if(i == level && b[0] == fExternalLoad && b[1] == fWebLoad && b[2] == fEmbeddedLoad) return S_FALSE;
00571 
00572         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_LOADLEVEL), level & 3);
00573         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTERNALLOAD), fExternalLoad);
00574         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_WEBLOAD), fWebLoad);
00575         theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EMBEDDEDLOAD), fEmbeddedLoad);
00576 
00577         return S_OK;
00578 }
00579 
00580 // IDirectVobSub2
00581 
00582 STDMETHODIMP CDirectVobSub::AdviseSubClock(ISubClock* pSubClock)
00583 {
00584         m_pSubClock = pSubClock;
00585         return S_OK;
00586 }
00587 
00588 STDMETHODIMP_(bool) CDirectVobSub::get_Forced()
00589 {
00590         return m_fForced;
00591 }
00592 
00593 STDMETHODIMP CDirectVobSub::put_Forced(bool fForced)
00594 {
00595         m_fForced = fForced;
00596         return S_OK;
00597 }
00598 
00599 STDMETHODIMP CDirectVobSub::get_TextSettings(STSStyle* pDefStyle)
00600 {
00601         CheckPointer(pDefStyle, E_POINTER);
00602 
00603         CAutoLock cAutoLock(&m_propsLock);
00604 
00605         *pDefStyle = m_defStyle;
00606 
00607         return S_OK;
00608 }
00609 
00610 STDMETHODIMP CDirectVobSub::put_TextSettings(STSStyle* pDefStyle)
00611 {
00612         CheckPointer(pDefStyle, E_POINTER);
00613 
00614         CAutoLock cAutoLock(&m_propsLock);
00615 
00616         if(!memcmp(&m_defStyle, pDefStyle, sizeof(m_defStyle)))
00617                 return S_FALSE;
00618 
00619         m_defStyle = *pDefStyle;
00620 
00621         return S_OK;
00622 }
00623 
00624 // IFilterVersion
00625 
00626 STDMETHODIMP_(DWORD) CDirectVobSub::GetFilterVersion()
00627 {
00628         return 0x0234;
00629 }

Generated on Tue Dec 13 14:47:51 2005 for guliverkli by  doxygen 1.4.5