📄 smldoc.cpp
字号:
/* ***** BEGIN LICENSE BLOCK *****
* Version: RCSL 1.0/RPSL 1.0
*
* Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
*
* The contents of this file, and the files included with this file, are
* subject to the current version of the RealNetworks Public Source License
* Version 1.0 (the "RPSL") available at
* http://www.helixcommunity.org/content/rpsl unless you have licensed
* the file under the RealNetworks Community Source License Version 1.0
* (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
* in which case the RCSL will apply. You may also obtain the license terms
* directly from RealNetworks. You may not use this file except in
* compliance with the RPSL or, if you have a valid RCSL with RealNetworks
* applicable to this file, the RCSL. Please see the applicable RPSL or
* RCSL for the rights, obligations and limitations governing use of the
* contents of the file.
*
* This file is part of the Helix DNA Technology. RealNetworks is the
* developer of the Original Code and owns the copyrights in the portions
* it created.
*
* This file, and the files included with this file, is distributed and made
* available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
*
* Technology Compatibility Kit Test Suite(s) Location:
* http://www.helixcommunity.org/content/tck
*
* Contributor(s):
*
* ***** END LICENSE BLOCK ***** */
// system
#include <time.h>
#include <math.h>
#include <ctype.h> /* for isspace() */
#if defined(_UNIX) && (!(defined(_BEOS))) && defined(USE_XWINDOWS)
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#endif
// include
#include "hxtypes.h"
#include "hxwintyp.h"
#include "hxcom.h"
#include "smiltype.h"
#include "hxcomm.h"
#include "ihxpckts.h"
#include "hxprefs.h"
#include "hxplugn.h"
#include "hxcore.h"
#include "hxwin.h"
#include "hxsite2.h"
#include "hxrendr.h"
#include "hxgroup.h"
#include "hxevent.h"
#include "hxvsurf.h"
#include "hxhyper.h"
#include "hxxml.h"
#include "hxvport.h"
#include "hxfiles.h"
#include "hxausvc.h"
#include "hxclsnk.h"
#if !defined(XXXEH_NEED_TO_ADD_51_PRCNT_OPAQUE_SITE_ON_TOP_TO_DISABLE)
#include "hxvctrl.h"
#endif
#include "hxmmrkr.h"
#include "hxinter.h"
#include "hxupgrd.h"
#include "hxsm2sm.h"
#include "hxerror.h"
// pncont
#include "hxslist.h"
#include "chxpckts.h"
#include "hxstring.h"
#include "hxmap.h"
#include "hxordval.h"
#include "hxstack.h"
#include "rtsputil.h"
// pnmisc
#include "hxurl.h"
#include "hxstrutl.h"
#include "hxwinver.h"
#include "hxtick.h"
#include "dllpath.h"
// rnxmllib
#include "hxxmlprs.h"
// coreres
#include "smilres.h"
// pxcomlib
#include "buffutil.h"
// rmasmil
#include "smlelem.h"
#include "smlparse.h"
#include "smlprstime.h"
#include "smlerror.h"
#include "smlutil.h"
// smlrendr
#include "smlrendr.h"
#include "smlrtype.h"
#include "animattr.h"
#include "animsand.h"
#include "evnthook.h"
#include "siteuser.h"
#include "sitewatc.h"
#include "layout.h"
#include "passivsw.h"
#include "layevent.h"
#include "smcallbk.h"
#include "xdata.h"
#include "smldoc.h"
#if defined(_WINDOWS)
#include "hxalloc.h"
#define IDC_HANDCURSOR 102
#elif defined (_MACINTOSH)
#include "hxmm.h"
#include "cresload.h"
extern FSSpec g_DLLFSpec;
#endif
#if defined(_UNIX) && (!(defined(_BEOS))) && defined(USE_XWINDOWS)
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/cursorfont.h>
/* USE_SHM doesn't work yet */
#ifdef USE_SHM
#undef USE_SHM
#endif /* USE_SHM */
#endif
// pndebug
#include "errdbg.h"
#include "debugout.h"
#include "smlrmlog.h"
#include "hxheap.h"
#ifdef _DEBUG
#undef HX_THIS_FILE
static const char HX_THIS_FILE[] = __FILE__;
#endif
#ifdef _WINDOWS
extern HINSTANCE g_hInstance;
#endif
// /This got removed, accidentally, by huge optimization HEAD check-in on
// 11/7/2001, causing show="new" and target="[someLPP]" (launching of LPP)
// to stop working. Putting this back in fixes PR 69905:
#define XXXEH_USE_OPENWINDOW_METHOD
#define HANDLE_DISCRETE_MEDIA_IN_TrackDurationSet 1
// /XXXEH- talk to core devs; we need them to be able to
// deal with an added track that all of a sudden has its
// duration changed to zero; this seems to work fine for
// tracks that have a zero delay, but subsequent ones
// hang the system when their durations are set to zero:
#define XXXEH_WAITING_FOR_PLAYER_CORE_FIX_FOR_RESETTING_DUR_TO_ZERO
#if defined(XXXEH_WAITING_FOR_PLAYER_CORE_FIX_FOR_RESETTING_DUR_TO_ZERO)
#define ZERO_DUR 1 /* 1 millisecond to trick core. */
#else
#define ZERO_DUR 0
#endif
// /For case where destinationLevel < 10 on a new player and we need to set
// the shared-by-all-players volume to accomodate this, we need to limit it
// for now so source player's volume doesn't cut out:
#define XXXEH_MIN_DEST_AUDIOPLAYER_VOL 10
// /Clamp track soundLevel at some arbitrary, high value; MEH chose 1000% (10x)
// for max-allowed animation of soundLevel; use 1000 until someone complains
// and then ask them what would be better:
#define MAX_ALLOWED_SOUNDLEVEL 1000.0
// /#define XXXEH_DEBUG_HANDLESOURCE_AND_TRACKDURATIONSET
// /#define XXXEH_DEBUGOUT_TRACKSTOPPAUSERESUME
// /#define XXXEH_DEBUGOUT_RESOLVEGROUPDUR
/*
* CSmilDocumentRenderer methods
*/
CSmilDocumentRenderer::CSmilDocumentRenderer(
CSmilRenderer* pParent, IUnknown* pContext):
m_pParent(pParent),
m_pSmilParser(0),
m_ulParseResult(HXR_OK),
m_lRefCount(0),
m_pRegionMap(0),
m_pRootLayout(NULL),
m_pViewportList(NULL),
m_pRegPointMap(NULL),
#if defined(HELIX_FEATURE_SMIL2_TRANSITIONS)
m_pTransitionMap(0),
#endif /* #if defined(HELIX_FEATURE_SMIL2_TRANSITIONS) */
m_pSiteInfoByRendererMap(0),
m_pSiteWatcherMap(0),
m_pGroupInfoMap(0),
m_pGroupMap(0),
m_pDeferredSourceMap(0),
m_pDeferrededRemoveTrackMap(NULL),
m_bInTrackDurationSetCall(FALSE),
m_bEventSinkWasSetup(FALSE),
m_pPausedAndDisabledIDMap(NULL),
m_pPausedAndDisabledBrightnessMap(NULL),
m_pPrefetchTrackElementMap(0),
m_pSiteInfoList(0),
m_uCurrentGroupIndex(-1),
m_pPlayToAssocList(0),
m_pZOrderList(0),
m_pSiteMgr(0),
m_pScheduler(0),
m_pEventList(0),
m_pFragment(0),
m_ulCurrentTime(0),
m_ulEventListPosition(0),
m_bFirstTimeSync(FALSE),
m_bSettingFragment(FALSE),
m_bFragFoundAndResolved(FALSE),
m_ulFragmentTimeOffset(0),
m_bInHyperlink(FALSE),
m_pStatusMessage(0),
m_bStatusMessageSet(FALSE),
m_bMetadataPassedOffAlready(FALSE),
m_pPersistentLayoutStream(NULL),
m_bIsRootLayoutSetup(FALSE),
m_ulNoLayoutRendererCount(0),
m_pErrorMessages(NULL),
m_bDestPlaystateIsPause(FALSE),
#ifdef _WINDOWS
m_hPreHyperlinkCursor(0),
m_hHyperlinkCursor(0),
m_bNeedToSetHyperlinkCursor(FALSE),
#endif
#ifdef _MACINTOSH
m_hHyperlinkCursor(0),
m_bResetCursor(FALSE),
#endif
#if defined(_UNIX) && (!(defined(_BEOS))) && defined(USE_XWINDOWS)
m_hHyperlinkCursor(0),
m_hCurrentCursor(0),
m_pDisplay(0),
m_Window(0),
m_pPixmapDisplay(NULL),
m_pVisualInfo(NULL),
#endif
m_bSiteLayoutComplete(FALSE),
m_nFragmentTracks(0),
m_dResizeXScale(1.0),
m_dResizeYScale(1.0),
m_pActiveTransitions(NULL),
m_pActiveAnimations(NULL),
m_pRegionMapIterator(NULL),
m_pAnimationMap(NULL),
m_pDelayedRendererCloseList(NULL),
m_bSMILPresentationHasEnded(FALSE),
m_pSMILDefaultNamespaceStr(NULL),
m_pViewPortManager(NULL)
#ifdef XXXMEH_DO_VIEWPORT_TLC
,m_pViewPortSiteMap(NULL)
,m_bSMILViewportClose(FALSE)
#endif
, m_pPlayerResumeStack(NULL)
#if defined(BE_SITE_SUPPLIER_20010205)
, m_pIndependentPlayer(NULL)
, m_pChildSiteInfoMap(NULL)
#endif /* BE_SITE_SUPPLIER_20010205 */
, m_ulGroupIndex(0)
, m_ulTrackIndex(0)
, m_uGroupIndexWithin(0)
, m_bSitesDetached(FALSE)
, m_ulPersistentComponentID(0)
, m_uPersistentGroupID(0)
, m_uPersistentTrackID(0)
, m_pPersistentProperties(NULL)
, m_pPersistentParentRenderer(NULL)
, m_pExternalMediaMarkerList(NULL)
, m_bLayoutElementPresent(FALSE)
, m_bEmptyLayout(FALSE)
, m_bDoNotZoom(FALSE)
, m_AnimationIterator(NULL)
, m_pAnimSiteRedrawMap(NULL)
, m_pAnimRegionRecomputeMap(NULL)
, m_bAnimateRootLayout(FALSE)
, m_pAnimTopLayoutMap(NULL)
, m_usAnimBaseGroupIndex(0)
, m_ulAnimDuration(0)
, m_ulCurGroupDuration(0)
, m_pSoundLevelMutex(NULL)
, m_bCloseCalled(FALSE)
, m_bRootLayoutSiteDetached(FALSE)
, m_pHandlePendingSchedulingCallback(NULL)
, m_pHyperlinkCallback(NULL)
, m_pMediaID2RendererMap(NULL)
, m_pMediaID2RendererSiteMap(NULL)
, m_pMediaID2RendererSiteWatcherMap(NULL)
, m_pEventSinkList(NULL)
, m_ulPktnum(0)
, m_usOldXPos(0)
, m_usOldYPos(0)
{
m_pContext = pContext;
HX_ASSERT(m_pContext);
if(m_pContext)
{
m_pContext->AddRef();
HX_VERIFY(HXR_OK == m_pContext->
QueryInterface(IID_IHXSiteManager,(void**)&m_pSiteMgr));
HX_VERIFY(HXR_OK == m_pContext->
QueryInterface(IID_IHXScheduler, (void**)&m_pScheduler));
if (HXR_OK != m_pContext->QueryInterface(IID_IHXStatusMessage,
(void**)&m_pStatusMessage))
{
// not an error, just a feature waiting to happen...
m_pStatusMessage = NULL;
}
#if defined(HELIX_FEATURE_SMIL2_MULTIWINDOWLAYOUT)
// QI for IHXViewPortManager
m_pContext->QueryInterface(IID_IHXViewPortManager,
(void**) &m_pViewPortManager);
if (m_pViewPortManager)
{
// Add ourselves as a view port sink
IHXViewPortSink* pSink = NULL;
QueryInterface(IID_IHXViewPortSink, (void**) &pSink);
if (pSink)
{
m_pViewPortManager->AddViewPortSink(pSink);
}
HX_RELEASE(pSink);
}
#endif /* #if defined(HELIX_FEATURE_SMIL2_MULTIWINDOWLAYOUT) */
// Add ourselves as a media marker sink
// TRUE adds us, FALSE removes us
addRemoveMediaMarkerSink(TRUE);
// Add ourselves as an error sink
addRemoveErrorSink(TRUE);
// QI for IHXErrorMessages - ok if not implemented
m_pContext->QueryInterface(IID_IHXErrorMessages,
(void**) &m_pErrorMessages);
}
#ifdef _WINDOWS
m_hHyperlinkCursor = LoadCursor(g_hInstance,
MAKEINTRESOURCE(IDC_HANDCURSOR));
#endif
#ifdef _MACINTOSH
const short HAND_CURSOR = 1313;
m_pResourceLoader = CResourceLoader::CreateInstance(g_DLLFSpec);
m_hHyperlinkCursor = (CursHandle)m_pResourceLoader->LoadResource('CURS', HAND_CURSOR);
#endif
#ifdef _DEBUG
BOOL bShowDependencies = FALSE;
::getBooleanPreference(m_pContext,
"showdependencies",
bShowDependencies);
if(bShowDependencies)
{
// mark file boundary
#ifdef _WINDOWS
const char* pszDepFile = "\\smildep.txt";
#else
const char* pszDepFile = "smildep.txt";
#endif
FILE* fp = fopen(pszDepFile, "a");
if(fp)
{
fprintf(fp, "===========================\n");
fclose(fp);
}
}
#endif
}
CSmilDocumentRenderer::~CSmilDocumentRenderer()
{
HX_RELEASE(m_pSiteMgr);
HX_DELETE(m_pRootLayout);
#if defined(HELIX_FEATURE_SMIL2_MULTIWINDOWLAYOUT)
closeViewports();
removeViewports();
HX_DELETE(m_pViewportList);
HX_RELEASE(m_pViewPortManager);
#ifdef XXXMEH_DO_VIEWPORT_TLC
clearViewportMap();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -