Initial commit: Complete open-source Decal rebuild

All 5 phases of the open-source Decal rebuild:

Phase 1: 14 decompiled .NET projects (Interop.*, Adapter, FileService, DecalUtil)
Phase 2: 10 native DLLs rewritten as C# COM servers with matching GUIDs
  - DecalDat, DHS, SpellFilter, DecalInput, DecalNet, DecalFilters
  - Decal.Core, DecalControls, DecalRender, D3DService
Phase 3: C++ shims for Inject.DLL (D3D9 hooking) and LauncherHook.DLL
Phase 4: DenAgent WinForms tray application
Phase 5: WiX installer and build script

25 C# projects building with 0 errors.
Native C++ projects require VS 2022 + Windows SDK (x86).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
erik 2026-02-08 18:27:56 +01:00
commit d1442e3747
1382 changed files with 170725 additions and 0 deletions

View file

@ -0,0 +1,323 @@
// Progress.cpp : Implementation of cProgress
#include "stdafx.h"
#include "DecalControls.h"
#include "Progress.h"
#include <sstream>
/////////////////////////////////////////////////////////////////////////////
// cProgress
STDMETHODIMP cProgress::get_Value(long *pVal)
{
_ASSERTE( pVal );
*pVal = m_nProgress;
return S_OK;
}
STDMETHODIMP cProgress::put_Value(long newVal)
{
_ASSERTE( newVal <= m_nMaxProgress );
m_nProgress = newVal;
m_pSite->Invalidate();
m_pSite->Reformat();
return S_OK;
}
STDMETHODIMP cProgress::SchemaLoad(IView *pView, IUnknown *pSchema)
{
CComPtr< IPluginSite > pPlugin;
m_pSite->get_PluginSite(&pPlugin);
pPlugin->CreateFontSchema(14, 0, pSchema, &m_pFont);
MSXML::IXMLDOMElementPtr pElement = pSchema;
_variant_t vValue = pElement->getAttribute(_T("value"));
_variant_t vMaxValue = pElement->getAttribute(_T("max"));
_variant_t vFaceColor = pElement->getAttribute(_T("facecolor"));
_variant_t vFillColor = pElement->getAttribute(_T("fillcolor"));
_variant_t vTextColor = pElement->getAttribute(_T("textcolor"));
_variant_t vBorderColor = pElement->getAttribute(_T("bordercolor"));
_variant_t vPreText = pElement->getAttribute(_T("pretext"));
_variant_t vPostText = pElement->getAttribute(_T("posttext"));
_variant_t vAlignment = pElement->getAttribute(_T("align"));
_variant_t vDrawText = pElement->getAttribute(_T("drawtext"));
_variant_t vBorderWidth = pElement->getAttribute(_T("border"));
// This is a required element
_ASSERTE( vValue.vt == VT_I4 || vValue.vt == VT_I2 );
m_nProgress = vValue;
if( vMaxValue.vt != VT_NULL )
{
try
{
m_nMaxProgress = static_cast< long >(vMaxValue);
}
catch( ... )
{
// Type conversion error
_ASSERTE( FALSE );
}
}
if( vFaceColor.vt != VT_NULL )
{
try
{
m_nFaceColor = static_cast< long >(vFaceColor);
}
catch( ... )
{
// Type conversion error
_ASSERTE( FALSE );
}
}
if( vFillColor.vt != VT_NULL )
{
try
{
m_nFillColor = static_cast< long >(vFillColor);
}
catch( ... )
{
// Type conversion error
_ASSERTE( FALSE );
}
}
if( vTextColor.vt != VT_NULL )
{
try
{
m_nTextColor = static_cast< long >(vTextColor);
}
catch( ... )
{
// Type conversion error
_ASSERTE( FALSE );
}
}
if( vBorderColor.vt != VT_NULL )
{
try
{
m_nBorderColor = static_cast< long >(vBorderColor);
}
catch( ... )
{
// Type conversion error
_ASSERTE( FALSE );
}
}
if (vPreText.vt == VT_BSTR)
put_PreText(vPreText.bstrVal);
if (vPostText.vt == VT_BSTR)
put_PostText(vPostText.bstrVal);
if (vAlignment.vt == VT_BSTR)
put_Alignment(vAlignment.bstrVal);
if( vDrawText.vt != VT_NULL )
{
try
{
m_nDrawText = static_cast< long >(vDrawText);
}
catch( ... )
{
// Type conversion error
_ASSERTE( FALSE );
}
}
if( vBorderWidth.vt != VT_NULL )
{
try
{
m_nBorderWidth = static_cast< long >(vBorderWidth);
}
catch( ... )
{
// Type conversion error
_ASSERTE( FALSE );
}
}
return S_OK;
}
STDMETHODIMP cProgress::Reformat()
{
if (!m_pFont.p)
{
// No font was specified, create the default font
CComPtr< IPluginSite > pPlugin;
m_pSite->get_PluginSite(&pPlugin);
BSTR bstrFontName;
pPlugin->get_FontName(&bstrFontName);
pPlugin->CreateFont(bstrFontName /*_bstr_t(_T( "Times New Roman" ))*/, 14, 0, &m_pFont);
}
// build string
std::stringstream strText;
strText << m_strPre << m_nProgress << m_strPost;
m_bstrText = strText.str().c_str();
RECT rc;
m_pSite->get_Position(&rc);
SIZE szText;
m_pFont->MeasureText(m_bstrText, &szText);
// align vertically center
m_ptText.y = ((rc.bottom - rc.top) - szText.cy) / 2;
// align left
if (m_nAlignment == 0)
m_ptText.x = m_nBorderWidth + 1;
// align center
if (m_nAlignment == 1)
m_ptText.x = ((rc.right - rc.left) - szText.cx) / 2;
// align right
if (m_nAlignment == 2)
m_ptText.x = ((rc.right - szText.cx) - m_nBorderWidth) - 6;
return S_OK;
}
STDMETHODIMP cProgress::Render(ICanvas *pCanvas)
{
_ASSERTE( pCanvas != NULL );
_ASSERTE( m_pSite.p != NULL );
RECT rcPos;
m_pSite->get_Position(&rcPos);
RECT rcClient = { 0, 0, rcPos.right - rcPos.left, rcPos.bottom - rcPos.top };
RECT rcCenter = { m_nBorderWidth, m_nBorderWidth,
(rcPos.right - rcPos.left) - m_nBorderWidth,
(rcPos.bottom - rcPos.top) - m_nBorderWidth };
pCanvas->Fill(&rcClient, m_nBorderColor); // draw border
pCanvas->Fill(&rcCenter, m_nFaceColor); // fill background
// calculate fill width
long nPixelWidth = ((float)rcCenter.right / (float)m_nMaxProgress) * (float)m_nProgress;
RECT rcProgress = { m_nBorderWidth, m_nBorderWidth,
nPixelWidth - m_nBorderWidth,
rcCenter.bottom };
pCanvas->Fill(&rcProgress, m_nFillColor); // fill progress
// draw text
if (m_nDrawText)
m_pFont->DrawText(&m_ptText, m_bstrText, m_nTextColor, pCanvas);
return S_OK;
}
STDMETHODIMP cProgress::put_FaceColor(long newVal)
{
m_nFaceColor = newVal;
m_pSite->Invalidate();
return S_OK;
}
STDMETHODIMP cProgress::put_FillColor(long newVal)
{
m_nFillColor = newVal;
m_pSite->Invalidate();
return S_OK;
}
STDMETHODIMP cProgress::put_TextColor(long newVal)
{
m_nTextColor = newVal;
m_pSite->Invalidate();
return S_OK;
}
STDMETHODIMP cProgress::put_MaxValue(long newVal)
{
m_nMaxProgress = newVal;
m_pSite->Invalidate();
return S_OK;
}
STDMETHODIMP cProgress::put_PreText(BSTR newVal)
{
USES_CONVERSION;
m_strPre = OLE2A(newVal);
m_pSite->Invalidate();
return S_OK;
}
STDMETHODIMP cProgress::put_PostText(BSTR newVal)
{
USES_CONVERSION;
m_strPost = OLE2A(newVal);
m_pSite->Invalidate();
return S_OK;
}
STDMETHODIMP cProgress::put_Alignment(BSTR newVal)
{
USES_CONVERSION;
std::string val = OLE2A(newVal);
if (!val.compare("left"))
m_nAlignment = 0;
if (!val.compare("center"))
m_nAlignment = 1;
if (!val.compare("right"))
m_nAlignment = 2;
m_pSite->Invalidate();
return S_OK;
}
STDMETHODIMP cProgress::put_DrawText(VARIANT_BOOL newVal)
{
if (newVal == VARIANT_TRUE)
m_nDrawText = true;
else
m_nDrawText = false;
m_pSite->Invalidate();
return S_OK;
}
STDMETHODIMP cProgress::put_BorderWidth(long newVal)
{
m_nBorderWidth = newVal;
m_pSite->Invalidate();
return S_OK;
}
STDMETHODIMP cProgress::put_BorderColor(long newVal)
{
m_nBorderColor = newVal;
m_pSite->Invalidate();
return S_OK;
}