Files
funnygame/external/steamworks/steamworksexample/htmlsurface.cpp
2025-07-13 15:47:42 +03:00

225 lines
8.5 KiB
C++

//========= Copyright © 1996-2008, Valve LLC, All rights reserved. ============
//
// Purpose: Class to render a HTML page on the screen
//
// $NoKeywords: $
//=============================================================================
#include "stdafx.h"
#include "htmlsurface.h"
#include "SpaceWarClient.h"
#define HTML_TEXT_HEIGHT 20
//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CHTMLSurface::CHTMLSurface( IGameEngine *pGameEngine )
{
m_pGameEngine = pGameEngine;
m_unBrowserHandle = INVALID_HTMLBROWSER;
m_hHTMLTexture = -1;
m_unHTMLWide = m_pGameEngine->GetViewportWidth() - 100;
m_unHTMLTall = m_pGameEngine->GetViewportHeight() - 100;
SteamHTMLSurface()->Init();
SteamHTMLSurface()->SetSize( m_unBrowserHandle, m_unHTMLWide, m_unHTMLTall );
}
//-----------------------------------------------------------------------------
// Purpose: Destructor
//-----------------------------------------------------------------------------
CHTMLSurface::~CHTMLSurface()
{
if ( m_unBrowserHandle )
SteamHTMLSurface()->RemoveBrowser( m_unBrowserHandle );
m_unBrowserHandle = INVALID_HTMLBROWSER;
}
//-----------------------------------------------------------------------------
// Purpose: RunFrame
//-----------------------------------------------------------------------------
void CHTMLSurface::RunFrame()
{
if ( m_pGameEngine->BIsKeyDown( VK_ESCAPE ) ||
m_pGameEngine->BIsControllerActionActive( eControllerDigitalAction_MenuCancel ) )
{
SpaceWarClient()->SetGameState( k_EClientGameMenu );
}
}
//-----------------------------------------------------------------------------
// Purpose: draw the page
//-----------------------------------------------------------------------------
void CHTMLSurface::Render()
{
if (m_hHTMLTexture >= 0)
{
RECT rect;
rect.left = 50;
rect.top = 50;
rect.right = m_unHTMLWide + rect.left;
rect.bottom = m_unHTMLTall + rect.top;
m_pGameEngine->BDrawTexturedRect( (float)rect.left, (float)rect.top, (float)rect.right, (float)rect.bottom,
0.0f, 0.0f, 1.0, 1.0, D3DCOLOR_ARGB( 255, 255, 255, 255 ), m_hHTMLTexture );
}
RECT rect;
rect.top = m_unHTMLTall + 70;
rect.bottom = rect.top + HTML_TEXT_HEIGHT;
rect.left = m_unHTMLWide/2 - 200;
rect.right = rect.left + 400;
char rgchBuffer[256];
sprintf_safe( rgchBuffer, "Hit ESC to return to main menu" );
m_pGameEngine->BDrawString( m_hDisplayFont, rect, D3DCOLOR_ARGB( 255, 25, 200, 25 ), TEXTPOS_CENTER | TEXTPOS_VCENTER, rgchBuffer );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHTMLSurface::Show()
{
m_hDisplayFont = m_pGameEngine->HCreateFont(HTML_TEXT_HEIGHT, FW_MEDIUM, false, "Arial");
if (!m_hDisplayFont)
OutputDebugString("RemoteStorage font was not created properly, text won't draw\n");
SteamAPICall_t hSteamAPICall = SteamHTMLSurface()->CreateBrowser( "SpaceWars Test", NULL );
m_SteamCallResultBrowserReady.Set( hSteamAPICall, this, &CHTMLSurface::OnBrowserReady );
}
//-----------------------------------------------------------------------------
// Purpose: the page asked to be closed
//-----------------------------------------------------------------------------
void CHTMLSurface::OnCloseBrowser( HTML_CloseBrowser_t *pParam )
{
m_unBrowserHandle = INVALID_HTMLBROWSER;
}
//-----------------------------------------------------------------------------
// Purpose: the browser is ready to load pages and start sending us textures to render
//-----------------------------------------------------------------------------
void CHTMLSurface::OnBrowserReady( HTML_BrowserReady_t *pBrowserReady, bool bIOFailure )
{
if (bIOFailure)
return;
m_unBrowserHandle = pBrowserReady->unBrowserHandle;
SteamHTMLSurface()->SetSize( m_unBrowserHandle, m_unHTMLWide, m_unHTMLTall );
SteamHTMLSurface()->SetDPIScalingFactor( m_unBrowserHandle, 2.0f );
SteamHTMLSurface()->LoadURL( m_unBrowserHandle, "http://steamcommunity.com/", NULL );
}
//-----------------------------------------------------------------------------
// Purpose: we have a new texture to present
//-----------------------------------------------------------------------------
void CHTMLSurface::OnNeedsPaint( HTML_NeedsPaint_t *pParam )
{
if ( m_hHTMLTexture < 0 )
m_hHTMLTexture = m_pGameEngine->HCreateTexture( (byte *)pParam->pBGRA, pParam->unWide, pParam->unTall, eTextureFormat_BGRA );
else
m_pGameEngine->UpdateTexture( m_hHTMLTexture, (byte *)pParam->pBGRA, pParam->unWide, pParam->unTall, eTextureFormat_BGRA );
if (pParam->unWide != m_unHTMLWide)
OutputDebugString( "bad texture width for html\n" );
if (pParam->unTall != m_unHTMLTall)
OutputDebugString( "bad texture height for html\n" );
}
//-----------------------------------------------------------------------------
// Purpose: the underlying browser object restarted, update our handle if needed
//-----------------------------------------------------------------------------
void CHTMLSurface::OnBrowserRestarted( HTML_BrowserRestarted_t *pParam )
{
if ( pParam->unOldBrowserHandle == m_unBrowserHandle )
{
HTML_BrowserReady_t ready;
ready.unBrowserHandle = pParam->unBrowserHandle;;
OnBrowserReady( &ready, false );
}
}
//-----------------------------------------------------------------------------
// Purpose: the page requested that a URL be loaded, should we allow it?
//-----------------------------------------------------------------------------
void CHTMLSurface::OnStartRequest( HTML_StartRequest_t *pParam )
{
// MUST call AllowStartRequest once for every OnStartRequest callback!
SteamHTMLSurface()->AllowStartRequest( m_unBrowserHandle, true );
}
//-----------------------------------------------------------------------------
// Purpose: the page has requested a modal javascript message box
//-----------------------------------------------------------------------------
void CHTMLSurface::OnJSAlert( HTML_JSAlert_t *pParam )
{
// MUST call JSDialogResponse once for every OnJSAlert callback!
// ShowModalMessageBox( pParam->pchMessage );
SteamHTMLSurface()->JSDialogResponse( m_unBrowserHandle, true );
}
//-----------------------------------------------------------------------------
// Purpose: the page has requested a modal javascript yes/no dialog box
//-----------------------------------------------------------------------------
void CHTMLSurface::OnJSConfirm( HTML_JSConfirm_t *pParam )
{
// MUST call JSDialogResponse once for every OnJSConfirm callback!
// if ( ShowModalYesNoDialogBox( pParam->pchMessage ) == BUTTON_NO );
// SteamHTMLSurface()->JSDialogResponse( m_unBrowserHandle, false );
// else
SteamHTMLSurface()->JSDialogResponse( m_unBrowserHandle, true );
}
//-----------------------------------------------------------------------------
// Purpose: the page has requested a local file upload dialog box.
//-----------------------------------------------------------------------------
void CHTMLSurface::OnUploadLocalFile( HTML_FileOpenDialog_t *pParam )
{
// MUST call FileLoadDialogResponse once for every OnLocalFileBrowse callback!
// Most applications do NOT want to allow the web browser to upload local file
// content from the customer's hard drive to the remote web server! That would
// be a pretty big security hole, unless you carefully vetted every file path.
SteamHTMLSurface()->FileLoadDialogResponse( m_unBrowserHandle, NULL );
// But if you did want to allow it, you would do something like this:
// ... show modal file selection dialog box ...
// ... verify that the selected files are safe to upload ...
// std::vector< const char * > vecUTF8FilenamesArray;
// ... populate vecUTF8FilenamesArray ...
// vecUTF8FilenamesArray.push_back( NULL );
// SteamHTMLSurface()->FileLoadDialogResponse( m_unBrowserHandle, &vecUTF8FilenamesArray[0] );
}
//-----------------------------------------------------------------------------
// Purpose: the page is now fully loaded
//-----------------------------------------------------------------------------
void CHTMLSurface::OnFinishedRequest( HTML_FinishedRequest_t *pParam )
{
// Uncomment this if you want to scale a pages contents when you display it
//SteamHTMLSurface()->SetPageScaleFactor( m_unBrowserHandle, 2.0, 0, 0 );
}