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>
286 lines
7.6 KiB
C++
286 lines
7.6 KiB
C++
//------------------------------------------------------------------------------
|
|
// File: alloclib.cpp
|
|
//
|
|
// Desc: DirectShow sample code
|
|
//
|
|
// Copyright (c) 2000-2001 Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------------------------
|
|
|
|
#include <streams.h>
|
|
#include <malloc.h>
|
|
|
|
#include "AllocLib.h"
|
|
|
|
|
|
/*****************************Private*Routine******************************\
|
|
* YV12PaintSurfaceBlack
|
|
*
|
|
\**************************************************************************/
|
|
HRESULT
|
|
YV12PaintSurfaceBlack(
|
|
LPDIRECTDRAWSURFACE7 pDDrawSurface
|
|
)
|
|
{
|
|
AMTRACE((TEXT("YV12PaintSurfaceBlack")));
|
|
HRESULT hr = NOERROR;
|
|
DDSURFACEDESC2 ddsd;
|
|
|
|
// now lock the surface so we can start filling the surface with black
|
|
ddsd.dwSize = sizeof(ddsd);
|
|
|
|
for ( ;; ) {
|
|
|
|
hr = pDDrawSurface->Lock(NULL, &ddsd,
|
|
DDLOCK_NOSYSLOCK | DDLOCK_WAIT, NULL);
|
|
|
|
if (hr == DD_OK || hr != DDERR_WASSTILLDRAWING) {
|
|
break;
|
|
}
|
|
|
|
Sleep(1);
|
|
}
|
|
|
|
if (hr == DD_OK)
|
|
{
|
|
DWORD y;
|
|
LPBYTE pDst = (LPBYTE)ddsd.lpSurface;
|
|
LONG OutStride = ddsd.lPitch;
|
|
DWORD VSize = ddsd.dwHeight;
|
|
DWORD HSize = ddsd.dwWidth;
|
|
|
|
// Y Component
|
|
for (y = 0; y < VSize; y++) {
|
|
FillMemory(pDst, HSize, (BYTE)0x10); // 1 line at a time
|
|
pDst += OutStride;
|
|
}
|
|
|
|
HSize /= 2;
|
|
VSize /= 2;
|
|
OutStride /= 2;
|
|
|
|
// Cb Component
|
|
for (y = 0; y < VSize; y++) {
|
|
FillMemory(pDst, HSize, (BYTE)0x80); // 1 line at a time
|
|
pDst += OutStride;
|
|
}
|
|
|
|
// Cr Component
|
|
for (y = 0; y < VSize; y++) {
|
|
FillMemory(pDst, HSize, (BYTE)0x80); // 1 line at a time
|
|
pDst += OutStride;
|
|
}
|
|
|
|
pDDrawSurface->Unlock(NULL);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* YUV16PaintSurfaceBlack
|
|
*
|
|
\**************************************************************************/
|
|
HRESULT
|
|
YUV16PaintSurfaceBlack(
|
|
LPDIRECTDRAWSURFACE7 pdds,
|
|
DWORD dwBlack
|
|
)
|
|
{
|
|
AMTRACE((TEXT("YUV16PaintSurfaceBlack")));
|
|
HRESULT hr = NOERROR;
|
|
DDSURFACEDESC2 ddsd;
|
|
|
|
// now lock the surface so we can start filling the surface with black
|
|
ddsd.dwSize = sizeof(ddsd);
|
|
|
|
for ( ;; ) {
|
|
|
|
hr = pdds->Lock(NULL, &ddsd, DDLOCK_NOSYSLOCK | DDLOCK_WAIT, NULL);
|
|
|
|
if (hr == DD_OK || hr != DDERR_WASSTILLDRAWING) {
|
|
break;
|
|
}
|
|
|
|
Sleep(1);
|
|
}
|
|
|
|
if (hr == DD_OK)
|
|
{
|
|
DWORD y, x;
|
|
LPDWORD pDst = (LPDWORD)ddsd.lpSurface;
|
|
LONG OutStride = ddsd.lPitch;
|
|
|
|
for (y = 0; y < ddsd.dwHeight; y++) {
|
|
|
|
for (x = 0; x < ddsd.dwWidth / 2; x++) {
|
|
pDst[x] = dwBlack;
|
|
}
|
|
|
|
// Dont forget that the stride is a byte count
|
|
*((LPBYTE*)&pDst) += OutStride;
|
|
}
|
|
|
|
pdds->Unlock(NULL);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/*****************************Private*Routine******************************\
|
|
* BlackPaintProc
|
|
*
|
|
\**************************************************************************/
|
|
HRESULT
|
|
BlackPaintProc(
|
|
LPDIRECTDRAWSURFACE7 pDDrawSurface,
|
|
DDSURFACEDESC2* lpddSurfaceDesc
|
|
)
|
|
{
|
|
AMTRACE((TEXT("BlackPaintProc")));
|
|
|
|
//
|
|
// If the surface is YUV take care of the types that we
|
|
// know the pixel format for. Those surfaces that we don't know
|
|
// about will get painted '0' which may be bright green for
|
|
// YUV surfaces.
|
|
//
|
|
|
|
if (lpddSurfaceDesc->ddpfPixelFormat.dwFlags & DDPF_FOURCC) {
|
|
|
|
//
|
|
// compute the black value if the fourCC code is suitable,
|
|
// otherwise can't handle it
|
|
//
|
|
|
|
switch (lpddSurfaceDesc->ddpfPixelFormat.dwFourCC) {
|
|
|
|
case mmioFOURCC('Y','V','1','2'):
|
|
case mmioFOURCC('I','4','2','0'):
|
|
case mmioFOURCC('I','Y','U','V'):
|
|
return YV12PaintSurfaceBlack(pDDrawSurface);
|
|
|
|
case mmioFOURCC('Y','U','Y','2'):
|
|
return YUV16PaintSurfaceBlack(pDDrawSurface, 0x80108010);
|
|
|
|
case mmioFOURCC('U','Y','V','Y'):
|
|
return YUV16PaintSurfaceBlack(pDDrawSurface, 0x10801080);
|
|
}
|
|
}
|
|
|
|
DDBLTFX ddFX;
|
|
INITDDSTRUCT(ddFX);
|
|
return pDDrawSurface->Blt(NULL, NULL, NULL, DDBLT_COLORFILL, &ddFX);
|
|
}
|
|
|
|
|
|
/*****************************Private*Routine******************************\
|
|
* PaintSurfaceBlack
|
|
*
|
|
\**************************************************************************/
|
|
HRESULT
|
|
PaintDDrawSurfaceBlack(
|
|
LPDIRECTDRAWSURFACE7 pDDrawSurface
|
|
)
|
|
{
|
|
AMTRACE((TEXT("PaintDDrawSurfaceBlack")));
|
|
|
|
LPDIRECTDRAWSURFACE7 *ppDDrawSurface = NULL;
|
|
DDSCAPS2 ddSurfaceCaps;
|
|
DDSURFACEDESC2 ddSurfaceDesc;
|
|
DWORD dwAllocSize;
|
|
DWORD i = 0, dwBackBufferCount = 0;
|
|
|
|
// get the surface description
|
|
INITDDSTRUCT(ddSurfaceDesc);
|
|
HRESULT hr = pDDrawSurface->GetSurfaceDesc(&ddSurfaceDesc);
|
|
if (SUCCEEDED(hr)) {
|
|
|
|
if (ddSurfaceDesc.dwFlags & DDSD_BACKBUFFERCOUNT) {
|
|
dwBackBufferCount = ddSurfaceDesc.dwBackBufferCount;
|
|
}
|
|
|
|
hr = BlackPaintProc(pDDrawSurface, &ddSurfaceDesc);
|
|
if (FAILED(hr))
|
|
{
|
|
DbgLog((LOG_ERROR,1,
|
|
TEXT("pDDrawSurface->Blt failed, hr = 0x%x"), hr));
|
|
return hr;
|
|
}
|
|
|
|
if (dwBackBufferCount > 0) {
|
|
|
|
dwAllocSize = (dwBackBufferCount + 1) * sizeof(LPDIRECTDRAWSURFACE);
|
|
ppDDrawSurface = (LPDIRECTDRAWSURFACE7*)_alloca(dwAllocSize);
|
|
|
|
ZeroMemory(ppDDrawSurface, dwAllocSize);
|
|
ZeroMemory(&ddSurfaceCaps, sizeof(ddSurfaceCaps));
|
|
ddSurfaceCaps.dwCaps = DDSCAPS_FLIP | DDSCAPS_COMPLEX;
|
|
|
|
if( DDSCAPS_OVERLAY & ddSurfaceDesc.ddsCaps.dwCaps ) {
|
|
ddSurfaceCaps.dwCaps |= DDSCAPS_OVERLAY;
|
|
}
|
|
|
|
for (i = 0; i < dwBackBufferCount; i++) {
|
|
|
|
LPDIRECTDRAWSURFACE7 pCurrentDDrawSurface = NULL;
|
|
if (i == 0) {
|
|
pCurrentDDrawSurface = pDDrawSurface;
|
|
}
|
|
else {
|
|
pCurrentDDrawSurface = ppDDrawSurface[i];
|
|
}
|
|
ASSERT(pCurrentDDrawSurface);
|
|
|
|
|
|
//
|
|
// Get the back buffer surface and store it in the
|
|
// next (in the circular sense) entry
|
|
//
|
|
|
|
hr = pCurrentDDrawSurface->GetAttachedSurface(
|
|
&ddSurfaceCaps,
|
|
&ppDDrawSurface[i + 1]);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
DbgLog((LOG_ERROR,1,
|
|
TEXT("Function pDDrawSurface->GetAttachedSurface ")
|
|
TEXT("failed, hr = 0x%x"), hr ));
|
|
break;
|
|
}
|
|
|
|
ASSERT(ppDDrawSurface[i+1]);
|
|
|
|
//
|
|
// Peform a DirectDraw colorfill BLT
|
|
//
|
|
|
|
hr = BlackPaintProc(ppDDrawSurface[i + 1], &ddSurfaceDesc);
|
|
if (FAILED(hr)) {
|
|
DbgLog((LOG_ERROR,1,
|
|
TEXT("ppDDrawSurface[i + 1]->Blt failed, ")
|
|
TEXT("hr = 0x%x"), hr));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (ppDDrawSurface) {
|
|
for (i = 0; i < dwBackBufferCount + 1; i++) {
|
|
if (ppDDrawSurface[i]) {
|
|
ppDDrawSurface[i]->Release();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (hr != DD_OK) {
|
|
DbgLog((LOG_ERROR, 1, TEXT("PaintSurfaceBlack failed")));
|
|
hr = S_OK;
|
|
}
|
|
|
|
return hr;
|
|
}
|