⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sm1doc.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    {	bSetOriginalSize = TRUE;	m_dResizeXScale = 1.0;	m_dResizeYScale = 1.0;    }    else    {	m_dResizeXScale = dXScale;	m_dResizeYScale = dYScale;    }    if(m_pRegionMap)    {	// scale regions	CHXMapStringToOb::Iterator i = m_pRegionMap->Begin();	for(; i != m_pRegionMap->End(); ++i)	{            BOOL bAbs = FALSE;	    CSmil1BasicRegion* pRegion = (CSmil1BasicRegion*)(*i);            if ((m_bRootLayoutWidthSet || m_ulNoRootLayoutWidth) &&                (m_bRootLayoutHeightSet || m_ulNoRootLayoutHeight) &&                !pRegion->m_bWidthUnspecified &&                !pRegion->m_bHeightUnspecified)            {                bAbs = TRUE;//                char szDbgStr[128];//                DEBUGPRINTF(szDbgStr, "region %s abs resizing to ", (const char*) pRegion->m_region);                resizeRegionSiteAbs(pRegion, dXAbsScale, dYAbsScale);            }            else            {//                char szDbgStr[128];//                DEBUGPRINTF(szDbgStr, "region %s resizing to ", (const char*) pRegion->m_region);                resizeSite(pRegion->m_pSite, dXScale, dYScale);            }	    SMIL1PlayToAssoc* pAssoc = getPlayToAssoc(pRegion->m_region);	    if(bSetOriginalSize)	    {		pRegion->m_rect = pRegion->m_originalRect;		//Helps fix PR 11265:		pRegion->m_mediaSize.cx = pRegion->m_originalMediaSize.cx;		pRegion->m_mediaSize.cy = pRegion->m_originalMediaSize.cy;		if(pAssoc && pAssoc->m_pHyperlinks)		{		    CHXSimpleList::Iterator i = pAssoc->m_pHyperlinks->Begin();		    for(; i != pAssoc->m_pHyperlinks->End(); ++i)		    {			CSmil1AAnchorElement* pAnchor = 			    (CSmil1AAnchorElement*)(*i);			pAnchor->rescale(0.0, 0.0, TRUE);   // set to original coords		    }		}	    }	    else            {                if (!bAbs)                {		    // Fix for PR 17415		    // dXScale & dYScale are reletive to the current size, 		    UINT32 ulNewLeft = (INT32)(dXScale * 		        (double)(pRegion->m_rect.left) + 0.5);		    UINT32 ulNewTop = (INT32)(dYScale * 		        (double)(pRegion->m_rect.top) + 0.5);		    UINT32 ulNewWidth = (INT32)(dXScale *          	        (double)(pRegion->m_rect.right -		        pRegion->m_rect.left) + 0.5);		    UINT32 ulNewHeight = (INT32)(dYScale * 		        (double)(pRegion->m_rect.bottom -		        pRegion->m_rect.top) + 0.5);		    pRegion->m_rect.left = ulNewLeft;		    pRegion->m_rect.top = ulNewTop;		    pRegion->m_rect.right = ulNewLeft + ulNewWidth;		    pRegion->m_rect.bottom = ulNewTop + ulNewHeight;		    //Fixes PR 11265:		    pRegion->m_mediaSize.cx = ulNewWidth;		    pRegion->m_mediaSize.cy = ulNewHeight;                }		if(pAssoc && pAssoc->m_pHyperlinks)		{		    CHXSimpleList::Iterator i = pAssoc->m_pHyperlinks->Begin();		    for(; i != pAssoc->m_pHyperlinks->End(); ++i)		    {			CSmil1AAnchorElement* pAnchor = 			    (CSmil1AAnchorElement*)(*i);			pAnchor->rescale(dXScale, dYScale, FALSE);		    }		}	    }	}    }    if(m_pSiteInfoList)    {	// scale current renderer sites	CHXSimpleList::Iterator i = m_pSiteInfoList->Begin();	for(; i != m_pSiteInfoList->End(); ++i)	{	    SMIL1SiteInfo* pSiteInfo = (SMIL1SiteInfo*)(*i);//            char szDbgStr[128];//            DEBUGPRINTF(szDbgStr, "media in region %s resizing to ",//                        (const char*) pSiteInfo->m_regionID);            // See if we can look up a region            CSmil1BasicRegion* pReg = getRegion((const char*) pSiteInfo->m_regionID);            if (pReg)            {                // Compute the media layout at original scale                HXxSize cOrigRegSize = {0, 0};                cOrigRegSize.cx      = HXxRECT_WIDTH(pReg->m_originalRect);                cOrigRegSize.cy      = HXxRECT_HEIGHT(pReg->m_originalRect);                HXxSize cFitSize     = pReg->m_originalMediaSize;                computeMediaFitSize(cOrigRegSize, pReg->m_originalMediaSize,                                    pReg->m_fit, cFitSize);                // Now scale the original media size                HXxSize cScaledFitSize = {0, 0};                cScaledFitSize.cx = (INT32) ((double) cFitSize.cx * dXAbsScale + 0.5);                cScaledFitSize.cy = (INT32) ((double) cFitSize.cy * dYAbsScale + 0.5);                // Get the site watcher                CSmil1SiteWatcher* pSW = NULL;                if(m_pSiteWatcherMap)                {                    void* pVoid = NULL;                    if (m_pSiteWatcherMap->Lookup(pSiteInfo->m_pRendererSite, pVoid))                    {                        pSW = (CSmil1SiteWatcher*) pVoid;                    }                }                // Set the "disable" flag in the site watcher                if (pSW) pSW->SiteChangingSize(TRUE);                // Set the size//                DEBUGPRINTF(szDbgStr, "(%ld,%ld)\n", cScaledFitSize.cx, cScaledFitSize.cy);                if(pSiteInfo && pSiteInfo->m_pRendererSite)                      pSiteInfo->m_pRendererSite->SetSize(cScaledFitSize);                                // Clear the "disable" flag in the site watcher                if (pSW) pSW->SiteChangingSize(FALSE);            }            else            {                // Do what we normally do                resizeSite(pSiteInfo->m_pRendererSite, dXScale, dYScale);            }	}    }}HX_RESULTCSmil1DocumentRenderer::onTimeSync(UINT32 ulTimeValue){//    char szDbgStr[128];//    DEBUGPRINTF(szDbgStr, "onTimeSync(%lu)\n", ulTimeValue);    HX_RESULT rc = HXR_OK;    m_ulCurrentTime = ulTimeValue;    if(!m_bFirstTimeSync)    {	// draw background and regions	m_bFirstTimeSync = TRUE;	// now I should force a background redraw...	if(m_pMISUSSite)	{	    HXxSize siteWinSize;	    m_pMISUSSite->GetSize(siteWinSize);	    CHXxRect updateRect(0, 0, siteWinSize.cx, siteWinSize.cy);	    m_pMISUSSite->DamageRect(updateRect);	    m_pMISUSSite->ForceRedraw();	    if(m_pRegionMap)	    {		CHXMapStringToOb::Iterator i = m_pRegionMap->Begin();		for(; i != m_pRegionMap->End(); ++i)		{		    CSmil1BasicRegion* pRegion = (CSmil1BasicRegion*)(*i);		    if(pRegion->m_pSite)		    {			pRegion->m_pSite->GetSize(siteWinSize);			CHXxRect siteRect(0, 0, siteWinSize.cx, siteWinSize.cy);			pRegion->m_pSite->DamageRect(siteRect);			pRegion->m_pSite->ForceRedraw();		    }		}	    }	}    }    rc = flushAllEvents( ulTimeValue, TRUE );    return rc;}voidCSmil1DocumentRenderer::RemoveEvents(UINT32 ulGroupIndex, IHXSite* pSite){    // handle all events up to time ulFlushToTime + ulGranularity    HX_RESULT rc = HXR_OK;    if(m_pEventList)    {	LISTPOSITION lPos = m_pEventList->GetHeadPosition();	while(lPos && m_pEventList->GetCount())	{	    // handle all events at or before ulTimeValue	    CSmil1ShowSiteEvent* pEvent = (CSmil1ShowSiteEvent*)m_pEventList->GetAt(lPos);	    if(pEvent->m_uGroupIndex == ulGroupIndex &&	       pEvent->getRendererSite() == pSite)	    {		HX_DELETE(pEvent);		lPos = m_pEventList->RemoveAt(lPos);	    }	    else	    {		m_pEventList->GetNext(lPos);	    }	}	// set list position member	m_ulEventListPosition = m_pEventList->GetHeadPosition();    }    return;}HX_RESULT CSmil1DocumentRenderer::flushAllEvents( UINT32 ulFlushToTime, BOOL bBreak){    // handle all events up to time ulFlushToTime + ulGranularity    HX_RESULT rc = HXR_OK;    if(m_pEventList && m_pEventList->GetCount() > 0)    {	//LISTPOSITION lPos = m_pEventList->GetHeadPosition();	while(m_ulEventListPosition)	{	    // handle events which have eventTime<=ulFlushToTime+ulGranularity	    CSmil1LayoutEvent* pEvent		= (CSmil1LayoutEvent*) m_pEventList->GetAt(m_ulEventListPosition);//{FILE* f1 = ::fopen("c:\\temp\\out.txt", "a+"); ::fprintf(f1, "Flush Events pEvent=%lu\n", pEvent);::fclose(f1);}	    #ifdef _MACINTOSH	    // XXXBobClark:	    // On the Mac side, our site's ShowSite implementation	    // draws synchronously: right then. On Windows, it draws	    // asynchronously by setting up a callback. The upshot is	    // that on Windows you can get away with a ShowSite(TRUE)	    // followed immediately by a ShowSite(FALSE), because the	    // actual screen won't get updated while the site is	    // briefly visible. But on the Mac it will show a visible	    // flicker. So the interim workaround here is to check the	    // events we're flushing; if we're showing a site that will	    // be hidden by the time the flush is done (or vice versa),	    // we ignore that event.	    LISTPOSITION tempPos = m_ulEventListPosition;	    BOOL bCurrentEventCancelledOutByFutureEvent = FALSE;	    CSmil1ShowSiteEvent* pCurrentEvent = (CSmil1ShowSiteEvent*)pEvent;	    m_pEventList->GetNext(tempPos); // to start with the next position...	    while (tempPos)	    {		CSmil1ShowSiteEvent* pFutureEvent = (CSmil1ShowSiteEvent*)m_pEventList->GetAt(tempPos);		if ( !pFutureEvent		     || pFutureEvent->m_ulEventTime > ulFlushToTime)		{		    break;		}				if ( pFutureEvent && pCurrentEvent			&& pCurrentEvent->m_pSite == pFutureEvent->m_pSite			&& pCurrentEvent->m_pRegionSite == pFutureEvent->m_pRegionSite			&& pCurrentEvent->m_bShowSite != pFutureEvent->m_bShowSite )		{		    bCurrentEventCancelledOutByFutureEvent = TRUE;		    break;		}				m_pEventList->GetNext(tempPos);	    }#endif	    // no need of granularity since the core will	    // ensure we call OnTimeSync at the end of its duration	    if (pEvent &&		pEvent->m_ulEventTime <= ulFlushToTime)	    {#ifdef _MACINTOSH	      if (!bCurrentEventCancelledOutByFutureEvent)#endif		rc = pEvent->handleEvent();		//lPos = m_pEventList->RemoveAt(lPos);	    }	    else if( bBreak )	    {		break;	    }	    m_pEventList->GetNext(m_ulEventListPosition);	}    }    return rc;}BOOLCSmil1DocumentRenderer::IsFullScreen(){    BOOL bRet = FALSE;    if (m_pMISUSSite)    {	IHXSiteFullScreen* pFull = NULL;	m_pMISUSSite->QueryInterface(IID_IHXSiteFullScreen, (void**) &pFull);	if (pFull)	{	    bRet = pFull->IsFullScreen();	}	HX_RELEASE(pFull);    }    return bRet;}void CSmil1DocumentRenderer::computeMediaFitSize(HXxSize      cRegSize,                                                 HXxSize      cMedSize,                                                 const char*  pszFitAttr,                                                 REF(HXxSize) rcFitSize){    UINT32 ulFit = 0; // 0=hidden, 1=fill, 2=meet, 3=slice, 4=scroll    if (pszFitAttr)    {        if (!strcmp(pszFitAttr, "hidden"))        {            ulFit = 0;        }        else if (!strcmp(pszFitAttr, "fill"))        {            ulFit = 1;        }        else if (!strcmp(pszFitAttr, "meet"))        {            ulFit = 2;        }        else if (!strcmp(pszFitAttr, "slice"))        {            ulFit = 3;        }        else if (!strcmp(pszFitAttr, "scroll"))        {            ulFit = 4;        }    }    switch (ulFit)    {        case 0:            {                // fit="hidden"                rcFitSize = cMedSize;            }            break;        case 1:            {                // fit="fill"                rcFitSize = cRegSize;            }            break;        case 2:            {                // fit="meet"                double dMedAspectRatio = 1.0;                if(cMedSize.cx != 0 && cMedSize.cy != 0)                {                    dMedAspectRatio = (double) cMedSize.cx / (double) cMedSize.cy;                }                INT32 lTryHeight = (INT32)((double) cRegSize.cx / dMedAspectRatio + 0.5);                if(lTryHeight > cRegSize.cy)                {                    rcFitSize.cx = (INT32) ((double) cRegSize.cy * dMedAspectRatio + 0.5);                    rcFitSize.cy = cRegSize.cy;                }                else                {                    rcFitSize.cx = cRegSize.cx;                    rcFitSize.cy = lTryHeight;                }            }            break;        case 3:            {                // fit="slice"                double dMedAspectRatio  = 1.0;                if(cMedSize.cx != 0 && cMedSize.cy != 0)                {                    dMedAspectRatio = (double) cMedSize.cx / (double) cMedSize.cy;                }                double dRegAspectRatio = 1.0;                if (cRegSize.cx != 0 && cRegSize.cy != 0)                {                    dRegAspectRatio = (double) cRegSize.cx / (double) cRegSize.cy;                }                // fit to greater of region height or width                if(dRegAspectRatio > dMedAspectRatio)                {                    rcFitSize.cx = cRegSize.cx;                    rcFitSize.cy = (INT32)((double) cRegSize.cx / dMedAspectRatio + 0.5);                }                else                {                    rcFitSize.cx = (INT32)((double) cRegSize.cy * dMedAspectRatio + 0.5);                    rcFitSize.cy = cRegSize.cy;                }            }            break;        case 4:            {                // fit="scroll"                rcFitSize = cMedSize;            }            break;    }}HX_RESULT CSmil1DocumentRenderer::getPreference(IUnknown*        pContext,                                                const char*      pszKey,                                                REF(IHXBuffer*) rpValue){    HX_RESULT retVal = HXR_FAIL;    if (pContext && pszKey)    {        IHXPreferences* pPreferences = NULL;        retVal = pContext->QueryInterface(IID_IHXPreferences,                                          (void**) &pPreferences);        if (SUCCEEDED(retVal))        {            IHXBuffer* pBuf = NULL;            retVal = pPreferences->ReadPref(pszKey, pBuf);            if (SUCCEEDED(retVal))            {                HX_RELEASE(rpValue);                rpValue = pBuf;                rpValue->AddRef();            }            HX_RELEASE(pBuf);        }        HX_RELEASE(pPreferences);    }    return retVal;}HX_RESULT CSmil1DocumentRenderer::getBooleanPreference(IUnknown*   pContext,                                                       const char* pszKey,                                                       REF(BOOL)   rbValue){    HX_RESULT retVal = HXR_FAIL;    if (pContext && pszKey)    {        IHXBuffer* pBuf = NULL;        retVal = getPreference(pContext, pszKey, pBuf);        if (SUCCEEDED(retVal))        {            INT32 lValue = ::atoi((const char*) pBuf->GetBuffer());            if (lValue == 1)            {                rbValue = TRUE;            }        }        HX_RELEASE(pBuf);    }    return retVal;}HX_RESULTCSmil1DocumentRenderer::onPreSeek(UINT32 ulOldTime, UINT32 ulNewTime){    HX_RESULT rc = HXR_OK;//{FILE* f1 = ::fopen("c:\\temp\\out.txt", "a+"); ::fprintf(f1, "onPreSeek\n");::fclose(f1);}    if(m_pSiteInfoList)    {	// hide all regions/sites in current group	CHXSimpleList::Iterator i = m_pSiteInfoList->Begin();	for(; i != m_pSiteInfoList->End(); ++i)	{	    SMIL1SiteInfo* pSiteInfo = (SMIL1SiteInfo*)(*i);	    if(pSiteIn

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -