3gppttrenderer.cpp

来自「symbian 下的helix player源代码」· C++ 代码 · 共 1,765 行 · 第 1/5 页

CPP
1,765
字号
                // /XXXEH- handle possible time-offset!
                pTextContainer->GetNextActivityTime() <= ulTime)
        {
            bForceDraw = TRUE;
        }
    }

    if (bForceDraw)
    {
        UpdateDisplay(ulTime);

        // Draw the new text by damaging the entire area of our data
        HXxRect damageRect = {0, 0, m_size.cx, m_size.cy };
        m_pMISUSSite->DamageRect(damageRect);
        m_pMISUSSite->ForceRedraw();
    }

    return HXR_OK;
}


/****************************************************************************
 *  IHXRenderer::OnPreSeek                                  ref:  hxrendr.h
 *
 *  This routine is called by the Helix core before a seek is about to occur.
 *  The stream's time value just before the seek, and the time value just
 *  after the seek are provided.
 */
STDMETHODIMP
C3GPPTimedTextRenderer::OnPreSeek(UINT32 ulOldTime, UINT32 ulNewTime)
{
#if defined(XXXEH_DEBUGOUT_DRAW_3GPPTT)
pFile = fopen("c:\\3gppttdrawPos.txt", ulCount?"a+":"w");
if (pFile)
{
    fprintf(pFile, "[OnPreSeek] at %ld\tulNewTime=%lu,\tulOldTime=%lu,\n",
            HX_GET_BETTERTICKCOUNT(), ulOldTime, ulNewTime);
    fclose(pFile);
}
ulCount++;
#endif // /XXXEH_DEBUGOUT_DRAW_3GPPTT.

    m_bInSeekMode   = TRUE;
    return HXR_OK;
}


/****************************************************************************
 *  IHXRenderer::OnPostSeek                                 ref:  hxrendr.h
 *
 *  This routine is called by the Helix core just after a seek has occured.
 *  The stream's time value just before the seek, and the time value just
 *  after the seek are provided.
 */
STDMETHODIMP
C3GPPTimedTextRenderer::OnPostSeek(UINT32 ulOldTime, UINT32 ulNewTime)
{
#if defined(XXXEH_DEBUGOUT_DRAW_3GPPTT)
pFile = fopen("c:\\3gppttdrawPos.txt", ulCount?"a+":"w");
if (pFile)
{
    fprintf(pFile, "[OnPostSeek] at %ld\tulNewTime=%lu,\tulOldTime=%lu,\n",
            HX_GET_BETTERTICKCOUNT(), ulOldTime, ulNewTime);
    fclose(pFile);
}
ulCount++;
#endif // /XXXEH_DEBUGOUT_DRAW_3GPPTT.

    RecomputeTextContainerDrawList(ulNewTime);

    m_bInSeekMode   = FALSE;
    return HXR_OK;
}


/****************************************************************************
 *  IHXRenderer::OnPause                                    ref:  hxrendr.h
 *
 *  This routine is called by the Helix core just after a pause has occured.
 *  The stream's time value just before pausing is provided.
 */
STDMETHODIMP
C3GPPTimedTextRenderer::OnPause(UINT32 ulTime)
{
    return HXR_OK;
}


/****************************************************************************
 *  IHXRenderer::OnBuffering                                ref:  hxrendr.h
 *
 *  This routine is called by the Helix core to inform the Renderer that
 *  buffering of data is occuring. The reason for buffering (e.g. start-up
 *  of stream, seek has occured, network congestion, etc.), as well as the
 *  percentage of the buffering process complete are provided.
 */
STDMETHODIMP
C3GPPTimedTextRenderer::OnBuffering(UINT32 ulFlags, UINT16 unPercentComplete)
{
#if defined(XXXEH_DEBUGOUT_DRAW_3GPPTT)
pFile = fopen("c:\\3gppttdrawPos.txt", ulCount?"a+":"w");
if (pFile)
{
    fprintf(pFile, "[OnBuffering] at %ld\tunPercentComplete=%u",
            HX_GET_BETTERTICKCOUNT(), unPercentComplete);
    fclose(pFile);
}
ulCount++;
#endif // /XXXEH_DEBUGOUT_DRAW_3GPPTT.

    return HXR_OK;
}


/****************************************************************************
 *  IHXRenderer::OnEndofPackets                             ref:  hxrendr.h
 *
 *  Called by client engine to inform the renderer that all the
 *  packets have been delivered. However, if the user seeks before
 *  EndStream() is called, renderer may start getting packets again
 *  and the client engine will eventually call this function again.
 */
STDMETHODIMP
C3GPPTimedTextRenderer::OnEndofPackets(void)
{
    m_bGotAllPacketsAlready = TRUE;
    return HXR_OK;
}


/****************************************************************************
 *  IHXRenderer::EndStream                                  ref:  hxrendr.h
 *
 *  This routine is called by the Helix core when the rendering of the stream
 *  has completed. Deallocation of any resources should be done here.
 */
STDMETHODIMP
C3GPPTimedTextRenderer::EndStream()
{
    /* Send report of a mouse click to the fileformat if backchannel 
     * is supported
     */
    if (m_pBackChannel && m_pCommonClassFactory && m_pStream)
    {
        IHXPacket* pPacket = 0;
        IHXBuffer* pBuffer = 0;
        char tmpStr[100];
        if ((HXR_OK == m_pCommonClassFactory->CreateInstance(CLSID_IHXBuffer,
                                               (void**)&pBuffer)) &&
            (HXR_OK == m_pCommonClassFactory->CreateInstance(CLSID_IHXPacket,
                                               (void**)&pPacket)))
        {
            ::sprintf(tmpStr, "Number of clicks = %lu\n", m_ulNumberOfClicks);

            pBuffer->Set((UCHAR*) tmpStr, ::strlen(tmpStr) + 1);
            pPacket->Set(pBuffer,0,m_pStream->GetStreamNumber(),
                         HX_ASM_SWITCH_ON, 0);
            pBuffer->Release();

            m_pBackChannel->PacketReady(pPacket);

            pPacket->Release();
        }

    }

    // You can't use IHXStream, IHXSourceStream, IHXBackChannel, or
    // IHXASMStream after EndStream has been called.
    HX_RELEASE(m_pStream);
    HX_RELEASE(m_pBackChannel);
    HX_RELEASE(m_pASMStream);

    return HXR_OK;
}


/****************************************************************************
 *  C3GPPTimedTextRenderer::ClearTextContainerLists      ref:  3gppttrender.h
 *
 *  Removes all contents of the list of text packets
 */
void
C3GPPTimedTextRenderer::ClearTextContainerLists(BOOL bDeleteListPtrWhenCleared)
{
    if (m_pTextContainerRedrawList)
    {
        // /We don't need to delete the text containers inside since they are
        // owned by (& will be cleaned up by) the m_pTextContainerList, below:
        m_pTextContainerRedrawList->RemoveAll();
    }

    if (m_pTextContainerList)
    {
        LISTPOSITION pos = m_pTextContainerList->GetHeadPosition();
        while (pos)
        {
            C3GPPTextContainer* pTextContainer =
                    (C3GPPTextContainer*)m_pTextContainerList->GetNext(pos);
            HX_ASSERT(pTextContainer);
            if (pTextContainer)
            {
                HX_DELETE(pTextContainer);
            }
        }
        m_pTextContainerList->RemoveAll();
    }

    if (bDeleteListPtrWhenCleared)
    {
        HX_DELETE(m_pTextContainerList);
        HX_DELETE(m_pTextContainerRedrawList);
    }
}

/****************************************************************************
 *  C3GPPTimedTextRenderer::C3GPPTimedTextRenderer       ref:  3gppttrender.h
 *
 *  Constructor
 */
C3GPPTimedTextRenderer::C3GPPTimedTextRenderer()
        : m_lRefCount(0)
        , m_pContext(NULL)
        , m_pStream(NULL)
        , m_pPlayer(NULL)
        , m_pHeader(NULL)
        , m_pLatestPacket(NULL)
        , m_bGotAllPacketsAlready(FALSE)
        , m_ulTimeOfLastTimeSync(HX_3GPPTT_INVALID_TIME)
        , m_ulLastPacketTime(HX_3GPPTT_INVALID_TIME)
        , m_ulLastRealPacketTime(HX_3GPPTT_INVALID_TIME)
        , m_pHyperNavigate(NULL)
        , m_pBackChannel(NULL)
        , m_pASMStream(NULL)
        , m_pCommonClassFactory(NULL)
        , m_ulNumberOfClicks(0)
        , m_bIsSubscribed(TRUE)
        , m_pMISUS(NULL)
        , m_pMISUSSite(NULL)
        , m_bInSeekMode(FALSE)
        , m_bRTPPacketTested(FALSE)
        , m_bUsesRTPPackets(FALSE)
        , m_ulDuration(0)
        , m_ulNumTextSampleEntries(0)
        , m_p3GPPTextSampleEntryPackedArray(NULL)
        , m_pTextContainerList(NULL)
        , m_pTextContainerListFutureTimePos(NULL)
        , m_pTextContainerRedrawList(NULL)
        , m_nLastMouseMoveXPos(0)
        , m_nLastMouseMoveYPos(0)
        , m_pEvent(NULL)
        , m_pDrawOutputBuffer(NULL)
        , m_ulDrawOutputBufferSizeInBytes(0)
        , m_ulBitsPerPixel(HX_3GPPTT_DEFAULT_bits_PER_PIXEL)
        , m_lXScrollOffset(0)
        , m_lYScrollOffset(0)
        , m_dScrollFactor(0.0)
        , m_bDrawInNonTextScrollArea(FALSE)
        , m_pRuleToFlagMap(NULL)
#if defined(HELIX_3GPPTT_USE_STATUS_BAR)
        , m_pStatusMessage(NULL)
        , m_bStatusMsgWillNeedErasing(FALSE)
        , m_pszHLinkToDisplay(NULL)
#endif // /HELIX_3GPPTT_USE_STATUS_BAR
#if defined(_WINDOWS) // /                                                     -----vvvvvvvvvvvvvvvvvvvvvvvvvv-----
        , m_bNeedToSetHyperlinkHandCursor(FALSE)
        , m_hPreHyperlinkCursor(NULL)
        , m_hHyperlinkCursor(NULL)
        , m_pDeviceContextMemory(NULL)
        , m_pFont(NULL)
        , m_pFontOld(NULL)

#if defined(USE_DIB_SECTION)
        , m_hBitmap(NULL)
        , m_hOldBitmap(NULL)
        , m_LPBITMAPINFO(NULL)
#endif /* USE_DIB_SECTION */
#elif defined(_MACINTOSH)
        , m_CurrentCursor(CURSOR_ARROW)
        , m_pOffScreenWorld(NULL)
#elif defined(_UNIX) && (!(defined(_BEOS)))
        , m_hHyperlinkCursor(0)
        , m_bHandActivated(FALSE)
        , m_pdisp(NULL)
        , m_window(NULL)
        , m_gc(NULL)
#elif defined(_SYMBIAN)
        , m_pBitMap(NULL)
        , m_pFont(NULL)
        , m_pScreenDevice(NULL)
        , m_pGCSite(NULL)
        , m_pGCOffscreen(NULL)

#endif // /_WINDOWS -else- _MACINTOSH -else- (_UNIX && !_BEOS)                 _____^^^^^^^^^^^^^^^^^^^^^^^^^^_____

    {
        m_originTransformXY.x = m_originTransformXY.y = 0;
        m_size.cx = 0;
        m_size.cy = 0;
        memset(&m_BitmapInfoHeader, 0, sizeof(HXBitmapInfoHeader));

#if defined(_WINDOWS) // /                                                     -----vvvvvvvvvvvvvvvvvvvvvvvvvv-----
        m_pDeviceContextMemory = (void*)CreateCompatibleDC(NULL);
#endif // /_WINDOWS                                                            _____^^^^^^^^^^^^^^^^^^^^^^^^^^_____
#if defined(_MACINTOSH)
        const short HAND_CURSOR = 1313;
        m_pResourceLoader = CResourceLoader::CreateInstance(g_DLLFSpec);
        m_hHyperlinkCursor = (CursHandle)m_pResourceLoader->LoadResource('CURS', HAND_CURSOR);
#endif // /_MACINTOSH
    }


/****************************************************************************
 *  C3GPPTimedTextRenderer::~C3GPPTimedTextRenderer      ref:  3gppttrender.h
 *
 *  Destructor
 */
C3GPPTimedTextRenderer::~C3GPPTimedTextRenderer()
{
    for ( UINT32 idx = 0; idx != m_textSampleEntries.GetCount(); ++idx )
    {
	C3GPPTextSampleEntry*& pEntry = (C3GPPTextSampleEntry*&)(m_textSampleEntries[idx]);
	delete pEntry;
    }

    m_textSampleEntries.Reset(0);


    // /TRUE = delete m_pTextContainerList & m_pTextContainerRedrawList:
    ClearTextContainerLists(TRUE);

    /* Free the draw output buffer (but not w/DIB section) */
#if !defined(USE_DIB_SECTION)  &&  !defined(_SYMBIAN)
    if (m_pDrawOutputBuffer) // /Note: in Symbian, this points into m_pBitMap:
    {
        HX_VECTOR_DELETE(m_pDrawOutputBuffer);
        m_pDrawOutputBuffer = NULL;
        m_ulDrawOutputBufferSizeInBytes = 0;
    }
#endif // /!USE_DIB_SECTION.

#if defined(_WINDOWS) // /                                                     -----vvvvvvvvvvvvvvvvvvvvvvvvvv-----
    // /Free the DIB-section-only data:
#if defined(USE_DIB_SECTION)
    if(m_hBitmap)
    {
        DeleteObject(m_hBitmap);
    }
    if(m_hOldBitmap  &&  m_pDeviceContextMemory)
    {
        SelectObject((HDC)m_pDeviceContextMemory, m_hOldBitmap);
    }
    m_hOldBitmap = NULL;
    

⌨️ 快捷键说明

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