3gppttrenderer.cpp
来自「symbian 下的helix player源代码」· C++ 代码 · 共 1,765 行 · 第 1/5 页
CPP
1,765 行
if(m_LPBITMAPINFO)
{
delete m_LPBITMAPINFO;
m_LPBITMAPINFO = NULL;
}
#endif // /USE_DIB_SECTION.
if(m_pDeviceContextMemory)
{
DeleteDC((HDC)m_pDeviceContextMemory);
}
#elif defined(_MACINTOSH)
if(m_pOffScreenWorld)
{
DisposeGWorld(m_pOffScreenWorld);
m_pOffScreenWorld=NULL;
}
#elif defined(_SYMBIAN)
if (m_pBitMap)
{
HX_DELETE(m_pBitMap);
m_pDrawOutputBuffer = NULL;
}
// /Discard and destroy the font:
if (m_pFont)
{
if (m_pGCOffscreen)
{
m_pGCOffscreen->DiscardFont();
HX_DELETE(m_pGCOffscreen);
}
// /m_pGCSite is not ours to delete.
if (m_pScreenDevice)
{
m_pScreenDevice->ReleaseFont(m_pFont);
}
m_pFont = NULL;
}
#endif // /_WINDOWS elif _MACINTOSH elif _SYMBIAN _____^^^^^^^^^^^^^^^^^^^^^^^^^^_____
HX_RELEASE(m_pHeader);
HX_RELEASE(m_pLatestPacket);
HX_RELEASE(m_pContext);
HX_RELEASE(m_pHyperNavigate);
#if defined(HELIX_3GPPTT_USE_STATUS_BAR)
HX_RELEASE(m_pStatusMessage);
HX_VECTOR_DELETE(m_pszHLinkToDisplay);
#endif /* HELIX_3GPPTT_USE_STATUS_BAR */
HX_RELEASE(m_pCommonClassFactory);
HX_RELEASE(m_pPlayer);
}
// IHXSiteUser Interface Methods
/****************************************************************************
* IHXSiteUser::AttachSite ref: hxwin.h
*
*/
STDMETHODIMP
C3GPPTimedTextRenderer::AttachSite(IHXSite* /*IN*/ pSite)
{
if (m_pMISUSSite)
{
return HXR_UNEXPECTED;
}
m_pMISUSSite = pSite;
m_pMISUSSite->AddRef();
m_pMISUSSite->SetSize(m_size);
#if defined(_SYMBIAN) // / -----vvvvvvvvvvvvvvvvvvvvvvvvvv-----
IHXSiteWindowed* pSiteWindowed = NULL;
if (m_pMISUSSite->QueryInterface(IID_IHXSiteWindowed,
(void**) &pSiteWindowed)
== HXR_OK)
{
HXxWindow* pHXxWindow = pSiteWindowed->GetWindow();
HX_ASSERT(pHXxWindow);
if (pHXxWindow)
{
CDirectScreenAccess* pDirectScreen = pHXxWindow->iDSA;
if (pDirectScreen)
{
m_pScreenDevice = pDirectScreen->ScreenDevice();
if(m_pScreenDevice)
{
m_pGCSite = pDirectScreen->Gc();
}
}
}
}
HX_RELEASE(pSiteWindowed);
HX_ASSERT(m_pScreenDevice);
HX_ASSERT(m_pGCSite);
#endif /* _SYMBIAN */ // / _____^^^^^^^^^^^^^^^^^^^^^^^^^^_____
// /XXXEH- once we get text site to same postion as video site, we can QI
// site for IHXSite2 and then call MoveSiteToTop() to make sure it's on
// top of the video.
/* // /XXXEH- We need to use a site watcher to watch for TLC moving our window
// because in RealOne player, the TLC tiles multiple sites if no explicit
// layout exists. On mobile players, the TLC leaves everyt site at (0,0).
HXxPoint point;
m_pMISUSSite->GetPosition(point);
// /XXXEH- we need to move the video to client area (0,0) so text can
// appear on top of video as well as below. Coords of display rect of
// 3GPP TT assumes origin of region (this site) is same as video's, but
// our default site-layout code puts our origin at (0, video's bottom):
point.x -= ulTransformX;
point.y -= ulTransformY; // /XXXEH- this doesn't work; it's still Blt'ing
// in the same place, below the vid.
HX_RESULT hxr = m_pMISUSSite->SetPosition(point);
m_pMISUSSite->GetPosition(point); // /TESTING: [X] returns changed-position point
*/
return HXR_OK;
}
/****************************************************************************
* IHXSiteUser::DetachSite ref: hxwin.h
*
*/
STDMETHODIMP
C3GPPTimedTextRenderer::DetachSite()
{
HX_RELEASE(m_pMISUSSite);
// We're done with these...
if (m_pMISUS) m_pMISUS->ReleaseSingleSiteUser();
HX_RELEASE(m_pMISUS);
return HXR_OK;
}
/****************************************************************************
* IHXSiteUser::NeedsWindowedSites ref: hxwin.h
*
*/
STDMETHODIMP_(BOOL)
C3GPPTimedTextRenderer::NeedsWindowedSites()
{
return FALSE;
};
/****************************************************************************
* IHXSiteUser::HandleEvent ref: hxwin.h
*
*/
STDMETHODIMP
C3GPPTimedTextRenderer::HandleEvent(HXxEvent* /*IN*/ pEvent)
{
HX_RESULT hxrslt = HXR_OK;
pEvent->handled = FALSE;
pEvent->result = 0;
#if defined(_UNIX) && (!(defined(_BEOS)))
// XEvent* xevent = (XEvent*)pEvent->param1;
// what is pEvent->window?
#endif
#if defined(_UNIX) && (!(defined(_BEOS)))
//XXX: This assumes a single window for the duration
if( !m_window )
{
m_window = (Window)pEvent->window;
if( !m_window )
return HXR_OK;
}
if( !m_gc )
{
XGCValues vals;
HXxWindow *pWnd = (HXxWindow*)pEvent->param2;
m_pdisp = (Display*)pWnd->display;
if( !m_pdisp ) return HXR_OK;
XFontStruct* pfs = XLoadQueryFont( m_pdisp, "6x10" );
if( !pfs ) return HXR_OK;
//XXX: Could use WhitePixel() and BlackPixel()
vals.foreground = 0xffffffff;
vals.background = 0;
vals.font = pfs->fid;
m_gc = XCreateGC( m_pdisp, m_window, (GCForeground|GCBackground|GCFont), &vals );
if( !m_gc ) return HXR_OK;
}
#endif /* _UNIX && !_BEOS */
switch (pEvent->event)
{
case HX_MOUSE_ENTER:
case HX_MOUSE_LEAVE:
case HX_MOUSE_MOVE:
{
pEvent->handled = TRUE;
m_pEvent = pEvent;
HXxPoint* mousePt = (HXxPoint*) pEvent->param1;
OnMouseMove (0, (INT16)mousePt->x, (INT16)mousePt->y);
}
break;
case HX_PRIMARY_BUTTON_UP:
{
HXxPoint* mousePt = (HXxPoint*) pEvent->param1;
hxrslt = HandleClick(0, (INT16)mousePt->x, (INT16)mousePt->y);
pEvent->handled = TRUE;
}
break;
case HX_SURFACE_UPDATE:
{
m_pEvent = pEvent;
IHXVideoSurface *pSurface = (IHXVideoSurface*) (pEvent->param1);
HX_ASSERT(pSurface);
if (pSurface)
{
hxrslt = Draw(pSurface);
}
pEvent->handled = TRUE;
m_pEvent = NULL;
}
break;
#if defined(_WINDOWS) // / -----vvvvvvvvvvvvvvvvvvvvvvvvvv-----
case WM_SETCURSOR:
{
pEvent->handled = TRUE;
if(m_bNeedToSetHyperlinkHandCursor)
{
m_hPreHyperlinkCursor = SetCursor(m_hHyperlinkCursor);
}
else
{
// /set the cursor back to arrow cursor:
SetCursor(LoadCursor(NULL, IDC_ARROW));
}
}
break;
#endif // /_WINDOWS _____^^^^^^^^^^^^^^^^^^^^^^^^^^_____
}
return hxrslt;
}
//
// Called to ensure cached output buffer pointer is valid before
// we use it. On most platforms this remains constant. On Symbian
// this can change (e.g., when menus go up).
//
void C3GPPTimedTextRenderer::SetDrawOutputBuffer()
{
#if defined(_SYMBIAN)
m_pDrawOutputBuffer = m_pBitMap ? (UCHAR*)m_pBitMap->DataAddress() : 0;
#endif
}
/****************************************************************************
* C3GPPTimedTextRenderer::Draw ref: 3gppttrender.h
*
*/
HX_RESULT
C3GPPTimedTextRenderer::UpdateDisplay(UINT32 ulTime)
{
HX_RESULT hxrslt = HXR_OK;
C3GPPTextContainer* pTextContainer = NULL;
const C3GPPTextSampleEntry* pLastHandledTextSampleEntry = NULL;
INT32 lXScrollOffset = 0;
INT32 lYScrollOffset = 0;
BOOL bIsScrollingOut = FALSE;
double dScrollFactor = 0.0;
UINT32 ulBgColorARGB = 0x0;
BOOL bHasNonOpaqueAlpha = FALSE;
SetDrawOutputBuffer();
#if defined(_WINDOWS) // / -----vvvvvvvvvvvvvvvvvvvvvvvvvv-----
HDC hDC = (HDC)m_pDeviceContextMemory;
#endif // /_WINDOWS _____^^^^^^^^^^^^^^^^^^^^^^^^^^_____
#if defined(_SYMBIAN) // / -----vvvvvvvvvvvvvvvvvvvvvvvvvv-----
HBufC16* pHBufUTF16Text = NULL;
HBufC8* pHBufUTF8Text = NULL;
HX_ASSERT(m_pGCSite && m_pGCOffscreen);
if (!m_pGCSite || !m_pGCOffscreen)
{
hxrslt = HXR_UNEXPECTED;
goto cleanup;
}
#endif // /_SYMBIAN _____^^^^^^^^^^^^^^^^^^^^^^^^^^_____
#if !defined(USE_DIB_SECTION) /* else DIB_SECTION code below will create it */ // /-----vvvvvvvvvvvvvvvvvvvvvvvvvv-----
HX_ASSERT(m_pDrawOutputBuffer); // /Should have been created in OnHeader().
if (m_pDrawOutputBuffer &&
#else // /else USE_DIB_SECTION
if (
#endif // /(else of) !USE_DIB_SECTION // /_____^^^^^^^^^^^^^^^^^^^^^^^^^^_____
(m_pTextContainerList && m_pTextContainerListFutureTimePos)
// /Or, maybe we're done with new text and we need to redraw
// current text:
|| (m_pTextContainerRedrawList &&
m_pTextContainerRedrawList->GetCount()) )
{
//------------- TEXT DRAWING CODE -- MOVE OUT TO X-PLAT CALL! -------
//------------------ START TEXT PUT-GLYPHS-TO-cANVAS CODE: ---------
INT32 liCursorX = INITIAL_CURSOR_X;
INT32 liCursorY = INITIAL_CURSOR_Y;
BOOL bFinishedWithCurTimeTCs = FALSE;
UINT32 ulTextContainersHandled = 0;
// /If we haven't yet gotten an OnTimeSync(), then don't draw anything:
if (HX_3GPPTT_INVALID_TIME == m_ulTimeOfLastTimeSync)
{
goto cleanup;
}
// /If we find that all T.C.s from the main list (at or beyond the
// future list pos) are all still in the future, then we might be here
// because of some T.C. needing redrawing (for scrolling or blinking):
BOOL bGetTextContainersFromRedrawList = FALSE;
BOOL bTextContainerIsFromMainList = FALSE;
BOOL bATextContainerFromMainListWasHandled = FALSE;
UINT32 ulKaraokeHighlightStartTimeInGlobalTime = HX_3GPPTT_INVALID_TIME;
UINT32 ulKaraokeHighlightEndTimeInGlobalTime = HX_3GPPTT_INVALID_TIME;
do // /Go through textContainers and draw all that are valid @ present:
{
BOOL bReuseTCsPriorDrawRect = FALSE;
if (!bGetTextContainersFromRedrawList &&
NULL != m_pTextContainerListFutureTimePos)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?