Game client codebase including: - CharacterActionControl: Character and creature management - GlobalScript: Network, items, skills, quests, utilities - RYLClient: Main client application with GUI and event handlers - Engine: 3D rendering engine (RYLGL) - MemoryManager: Custom memory allocation - Library: Third-party dependencies (DirectX, boost, etc.) - Tools: Development utilities 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
465 lines
12 KiB
C++
465 lines
12 KiB
C++
//------------------------------------------------------------------------------
|
|
// File: allocpresenter.cpp
|
|
//
|
|
// Desc: DirectShow sample code - Custom allocator-presenter
|
|
//
|
|
// Copyright (c) 2000-2001 Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------------------------
|
|
|
|
#include <streams.h>
|
|
#include <mmreg.h>
|
|
#include "project.h"
|
|
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
#include <initguid.h>
|
|
|
|
|
|
// {99d54f63-1a69-41ae-aa4d-c976eb3f0713}
|
|
//DEFINE_GUID(CLSID_AllocPresenter, 0x99d54f63, 0x1a69, 0x41ae, 0xaa, 0x4d, 0xc9, 0x76, 0xeb, 0x3f, 0x07, 0x13);
|
|
|
|
template <typename T>
|
|
__inline void INITDDSTRUCT(T& dd)
|
|
{
|
|
ZeroMemory(&dd, sizeof(dd));
|
|
dd.dwSize = sizeof(dd);
|
|
}
|
|
|
|
|
|
/*****************************Private*Routine******************************\
|
|
* CreateDefaultAllocatorPresenter
|
|
*
|
|
\**************************************************************************/
|
|
HRESULT
|
|
CMpegMovie::CreateDefaultAllocatorPresenter()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
__try {
|
|
CHECK_HR(hr = CoCreateInstance(CLSID_AllocPresenter, NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_IVMRSurfaceAllocator,
|
|
(LPVOID*)&m_lpDefSA));
|
|
|
|
CHECK_HR(hr = m_lpDefSA->QueryInterface(IID_IVMRImagePresenter,
|
|
(LPVOID*)&m_lpDefIP));
|
|
|
|
CHECK_HR(hr = m_lpDefSA->QueryInterface(IID_IVMRWindowlessControl,
|
|
(LPVOID*)&m_lpDefWC));
|
|
|
|
CHECK_HR(hr = m_lpDefWC->SetVideoClippingWindow(m_hwndApp));
|
|
CHECK_HR(hr = m_lpDefSA->AdviseNotify(this));
|
|
}
|
|
__finally {
|
|
|
|
if(FAILED(hr)) {
|
|
RELEASE(m_lpDefWC);
|
|
RELEASE(m_lpDefIP);
|
|
RELEASE(m_lpDefSA);
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* NonDelegatingQueryInterface
|
|
*
|
|
\**************************************************************************/
|
|
STDMETHODIMP
|
|
CMpegMovie::NonDelegatingQueryInterface(
|
|
REFIID riid,
|
|
void** ppv
|
|
)
|
|
{
|
|
if(riid == IID_IVMRSurfaceAllocator)
|
|
{
|
|
return GetInterface((IVMRSurfaceAllocator*)this, ppv);
|
|
}
|
|
else if(riid == IID_IVMRImagePresenter)
|
|
{
|
|
return GetInterface((IVMRImagePresenter*)this, ppv);
|
|
}
|
|
|
|
return CUnknown::NonDelegatingQueryInterface(riid,ppv);
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// IVMRSurfaceAllocator
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
/******************************Public*Routine******************************\
|
|
* AllocateSurfaces
|
|
*
|
|
\**************************************************************************/
|
|
STDMETHODIMP
|
|
CMpegMovie::AllocateSurface(
|
|
DWORD_PTR dwUserID,
|
|
VMRALLOCATIONINFO* lpAllocInfo,
|
|
DWORD* lpdwBuffer,
|
|
LPDIRECTDRAWSURFACE7* lplpSurface
|
|
)
|
|
{
|
|
return m_lpDefSA->AllocateSurface(dwUserID, lpAllocInfo,
|
|
lpdwBuffer, lplpSurface);
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* FreeSurfaces()
|
|
*
|
|
\**************************************************************************/
|
|
STDMETHODIMP
|
|
CMpegMovie::FreeSurface(
|
|
DWORD_PTR dwUserID
|
|
)
|
|
{
|
|
return m_lpDefSA->FreeSurface(dwUserID);
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* PrepareSurface
|
|
*
|
|
\**************************************************************************/
|
|
STDMETHODIMP
|
|
CMpegMovie::PrepareSurface(
|
|
DWORD_PTR dwUserID,
|
|
LPDIRECTDRAWSURFACE7 lplpSurface,
|
|
DWORD dwSurfaceFlags
|
|
)
|
|
{
|
|
return m_lpDefSA->PrepareSurface(dwUserID, lplpSurface, dwSurfaceFlags);
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* AdviseNotify
|
|
*
|
|
\**************************************************************************/
|
|
STDMETHODIMP
|
|
CMpegMovie::AdviseNotify(
|
|
IVMRSurfaceAllocatorNotify* lpIVMRSurfAllocNotify
|
|
)
|
|
{
|
|
return m_lpDefSA->AdviseNotify(lpIVMRSurfAllocNotify);
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// IVMRSurfaceAllocatorNotify
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
/******************************Public*Routine******************************\
|
|
* AdviseSurfaceAllocator
|
|
*
|
|
\**************************************************************************/
|
|
STDMETHODIMP
|
|
CMpegMovie::AdviseSurfaceAllocator(
|
|
DWORD_PTR dwUserID,
|
|
IVMRSurfaceAllocator* lpIVRMSurfaceAllocator
|
|
)
|
|
{
|
|
return m_lpDefSAN->AdviseSurfaceAllocator(dwUserID, lpIVRMSurfaceAllocator);
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* SetDDrawDevice
|
|
*
|
|
\**************************************************************************/
|
|
STDMETHODIMP
|
|
CMpegMovie::SetDDrawDevice(LPDIRECTDRAW7 lpDDrawDevice,HMONITOR hMonitor)
|
|
{
|
|
return m_lpDefSAN->SetDDrawDevice(lpDDrawDevice, hMonitor);
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* ChangeDDrawDevice
|
|
*
|
|
\**************************************************************************/
|
|
STDMETHODIMP
|
|
CMpegMovie::ChangeDDrawDevice(LPDIRECTDRAW7 lpDDrawDevice,HMONITOR hMonitor)
|
|
{
|
|
return m_lpDefSAN->ChangeDDrawDevice(lpDDrawDevice, hMonitor);
|
|
}
|
|
|
|
|
|
/*****************************Private*Routine******************************\
|
|
* DDSurfEnumFunc
|
|
*
|
|
\**************************************************************************/
|
|
HRESULT WINAPI
|
|
DDSurfEnumFunc(
|
|
LPDIRECTDRAWSURFACE7 pdds,
|
|
DDSURFACEDESC2* pddsd,
|
|
void* lpContext
|
|
)
|
|
{
|
|
LPDIRECTDRAWSURFACE7* ppdds = (LPDIRECTDRAWSURFACE7*)lpContext;
|
|
|
|
DDSURFACEDESC2 ddsd;
|
|
INITDDSTRUCT(ddsd);
|
|
|
|
HRESULT hr = pdds->GetSurfaceDesc(&ddsd);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
if(ddsd.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
|
|
{
|
|
*ppdds = pdds;
|
|
return DDENUMRET_CANCEL;
|
|
|
|
}
|
|
}
|
|
|
|
pdds->Release();
|
|
return DDENUMRET_OK;
|
|
}
|
|
|
|
|
|
/*****************************Private*Routine******************************\
|
|
* OnSetDDrawDevice
|
|
*
|
|
\**************************************************************************/
|
|
HRESULT
|
|
CMpegMovie::OnSetDDrawDevice(
|
|
LPDIRECTDRAW7 pDD,
|
|
HMONITOR hMon
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
RELEASE(m_pddsRenderT);
|
|
RELEASE(m_pddsPriText);
|
|
RELEASE(m_pddsPrimary);
|
|
|
|
__try
|
|
{
|
|
|
|
DDSURFACEDESC2 ddsd; // A surface description structure
|
|
INITDDSTRUCT(ddsd);
|
|
ddsd.dwFlags = DDSD_CAPS;
|
|
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
|
|
|
|
CHECK_HR(hr = pDD->EnumSurfaces(DDENUMSURFACES_DOESEXIST |
|
|
DDENUMSURFACES_ALL,
|
|
&ddsd,
|
|
&m_pddsPrimary,
|
|
DDSurfEnumFunc));
|
|
if(!m_pddsPrimary)
|
|
{
|
|
hr = E_FAIL;
|
|
__leave;
|
|
}
|
|
|
|
MONITORINFOEX miInfoEx;
|
|
miInfoEx.cbSize = sizeof(miInfoEx);
|
|
GetMonitorInfo(hMon, &miInfoEx);
|
|
|
|
INITDDSTRUCT(ddsd);
|
|
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
|
|
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
|
|
ddsd.dwWidth = (miInfoEx.rcMonitor.right - miInfoEx.rcMonitor.left);
|
|
ddsd.dwHeight = (miInfoEx.rcMonitor.bottom - miInfoEx.rcMonitor.top);
|
|
|
|
CHECK_HR(hr = pDD->CreateSurface(&ddsd, &m_pddsPriText, NULL));
|
|
CHECK_HR(hr = pDD->CreateSurface(&ddsd, &m_pddsRenderT, NULL));
|
|
|
|
}
|
|
__finally
|
|
{
|
|
if(FAILED(hr))
|
|
{
|
|
RELEASE(m_pddsRenderT);
|
|
RELEASE(m_pddsPriText);
|
|
RELEASE(m_pddsPrimary);
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* RestoreDDrawSurfaces
|
|
*
|
|
\**************************************************************************/
|
|
STDMETHODIMP CMpegMovie::RestoreDDrawSurfaces()
|
|
{
|
|
return m_lpDefSAN->RestoreDDrawSurfaces();
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* RestoreDDrawSurfaces
|
|
*
|
|
\**************************************************************************/
|
|
STDMETHODIMP
|
|
CMpegMovie::NotifyEvent(LONG EventCode, LONG_PTR lp1, LONG_PTR lp2)
|
|
{
|
|
return m_lpDefSAN->NotifyEvent(EventCode, lp1, lp2);
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* SetBorderColor
|
|
*
|
|
\**************************************************************************/
|
|
STDMETHODIMP
|
|
CMpegMovie::SetBorderColor(
|
|
COLORREF clr
|
|
)
|
|
{
|
|
return m_lpDefSAN->SetBorderColor(clr);
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// IVMRImagePresenter
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
/******************************Public*Routine******************************\
|
|
* StartPresenting()
|
|
*
|
|
\**************************************************************************/
|
|
STDMETHODIMP
|
|
CMpegMovie::StartPresenting(DWORD_PTR dwUserID)
|
|
{
|
|
return m_lpDefIP->StartPresenting(dwUserID);
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* StopPresenting()
|
|
*
|
|
\**************************************************************************/
|
|
STDMETHODIMP
|
|
CMpegMovie::StopPresenting(DWORD_PTR dwUserID)
|
|
{
|
|
return m_lpDefIP->StopPresenting(dwUserID);
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* PresentImage
|
|
*
|
|
\**************************************************************************/
|
|
STDMETHODIMP
|
|
CMpegMovie::PresentImage(
|
|
DWORD_PTR dwUserID,
|
|
VMRPRESENTATIONINFO* lpPresInfo
|
|
)
|
|
{
|
|
#if 0
|
|
LPDIRECTDRAWSURFACE7 lpSurface = lpPresInfo->lpSurf;
|
|
const REFERENCE_TIME rtNow = lpPresInfo->rtStart;
|
|
const DWORD dwSurfaceFlags = lpPresInfo->dwFlags;
|
|
|
|
if(m_iDuration > 0)
|
|
{
|
|
HRESULT hr;
|
|
RECT rs, rd;
|
|
DDSURFACEDESC2 ddsdV;
|
|
|
|
INITDDSTRUCT(ddsdV);
|
|
hr = lpSurface->GetSurfaceDesc(&ddsdV);
|
|
|
|
DDSURFACEDESC2 ddsdP;
|
|
INITDDSTRUCT(ddsdP);
|
|
hr = m_pddsPriText->GetSurfaceDesc(&ddsdP);
|
|
|
|
FLOAT fPos = (FLOAT)m_iDuration / 30.0F;
|
|
FLOAT fPosInv = 1.0F - fPos;
|
|
|
|
SetRect(&rs, 0, 0,
|
|
MulDiv((int)ddsdV.dwWidth, 30 - m_iDuration, 30),
|
|
ddsdV.dwHeight);
|
|
|
|
SetRect(&rd, 0, 0,
|
|
MulDiv((int)ddsdP.dwWidth, 30 - m_iDuration, 30),
|
|
ddsdP.dwHeight);
|
|
|
|
hr = m_pddsRenderT->Blt(&rd, lpSurface,
|
|
&rs, DDBLT_WAIT, NULL);
|
|
|
|
SetRect(&rs, 0, 0,
|
|
MulDiv((int)ddsdP.dwWidth, m_iDuration, 30),
|
|
ddsdP.dwHeight);
|
|
|
|
SetRect(&rd,
|
|
(int)ddsdP.dwWidth - MulDiv((int)ddsdP.dwWidth, m_iDuration, 30),
|
|
0,
|
|
ddsdP.dwWidth,
|
|
ddsdP.dwHeight);
|
|
|
|
hr = m_pddsRenderT->Blt(&rd, m_pddsPriText,
|
|
&rs, DDBLT_WAIT, NULL);
|
|
|
|
//
|
|
// need to wait for VBlank before blt-ing
|
|
//
|
|
{
|
|
LPDIRECTDRAW lpdd;
|
|
hr = m_pddsPrimary->GetDDInterface((LPVOID*)&lpdd);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
DWORD dwScanLine;
|
|
for(; ;)
|
|
{
|
|
hr = lpdd->GetScanLine(&dwScanLine);
|
|
|
|
if(hr == DDERR_VERTICALBLANKINPROGRESS)
|
|
{
|
|
break;
|
|
}
|
|
|
|
if(FAILED(hr))
|
|
{
|
|
break;
|
|
}
|
|
|
|
if((LONG)dwScanLine>= rd.top)
|
|
{
|
|
if((LONG)dwScanLine <= rd.bottom)
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
RELEASE(lpdd);
|
|
}
|
|
}
|
|
|
|
hr = m_pddsPrimary->Blt(NULL, m_pddsRenderT,
|
|
NULL, DDBLT_WAIT, NULL);
|
|
|
|
m_iDuration--;
|
|
if(m_iDuration == 0 && (ddsdV.ddsCaps.dwCaps & DDSCAPS_OVERLAY))
|
|
{
|
|
// need to get the color key visible again.
|
|
InvalidateRect(m_hwndApp, NULL, FALSE);
|
|
}
|
|
return hr;
|
|
}
|
|
else
|
|
{
|
|
return m_lpDefIP->PresentImage(dwUserID, lpPresInfo);
|
|
}
|
|
#endif
|
|
|
|
return m_lpDefIP->PresentImage(dwUserID, lpPresInfo);
|
|
}
|
|
|