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 + -
显示快捷键?