Skip to content

Commit 7e94ce8

Browse files
committed
v1.3
1 parent a0f22c0 commit 7e94ce8

File tree

4 files changed

+62
-99
lines changed

4 files changed

+62
-99
lines changed

OpenGlass/GlassFramework.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ namespace OpenGlass::GlassFramework
3838
int g_roundRectRadius{};
3939

4040
UINT g_dwOverlayTestMode{};
41+
winrt::com_ptr<IDCompositionVisual2> g_hackVisual{ nullptr };
4142
}
4243

4344
HRGN WINAPI GlassFramework::MyCreateRoundRectRgn(int x1, int y1, int x2, int y2, int w, int h)
@@ -55,21 +56,12 @@ HRESULT STDMETHODCALLTYPE GlassFramework::MyCDrawGeometryInstruction_Create(uDwm
5556
{
5657
if (g_capturedWindow && g_capturedWindow->GetData()->GetHwnd() != uDwm::GetShellWindowForCurrentDesktop())
5758
{
58-
HRGN region{ GeometryRecorder::GetRegionFromGeometry(geometry) };
59-
RECT rgnBox{};
60-
if (GetRgnBox(region, &rgnBox) != NULLREGION && !IsRectEmpty(&rgnBox))
61-
{
62-
winrt::com_ptr<uDwm::CRgnGeometryProxy> rgnGeometry{ nullptr };
63-
uDwm::ResourceHelper::CreateGeometryFromHRGN(region, rgnGeometry.put());
64-
65-
auto color =
66-
Shared::g_forceAccentColorization ?
67-
dwmcore::Convert_D2D1_COLOR_F_sRGB_To_D2D1_COLOR_F_scRGB(g_capturedWindow->TreatAsActiveWindow() ? Shared::g_accentColor : Shared::g_accentColorInactive) :
68-
g_capturedWindow->GetTitlebarColorizationParameters()->getArgbcolor();
69-
color.a = g_capturedWindow->TreatAsActiveWindow() ? 0.5f : 0.0f;
70-
RETURN_IF_FAILED(reinterpret_cast<uDwm::CSolidColorLegacyMilBrushProxy*>(brush)->Update(1.0, color));
71-
return g_CDrawGeometryInstruction_Create_Org(brush, rgnGeometry.get(), instruction);
72-
}
59+
auto color =
60+
Shared::g_forceAccentColorization ?
61+
dwmcore::Convert_D2D1_COLOR_F_sRGB_To_D2D1_COLOR_F_scRGB(g_capturedWindow->TreatAsActiveWindow() ? Shared::g_accentColor : Shared::g_accentColorInactive) :
62+
g_capturedWindow->GetTitlebarColorizationParameters()->getArgbcolor();
63+
color.a = g_capturedWindow->TreatAsActiveWindow() ? 0.5f : 0.0f;
64+
RETURN_IF_FAILED(reinterpret_cast<uDwm::CSolidColorLegacyMilBrushProxy*>(brush)->Update(1.0, color));
7365
}
7466

7567
return g_CDrawGeometryInstruction_Create_Org(brush, geometry, instruction);
@@ -349,6 +341,10 @@ void GlassFramework::UpdateConfiguration(ConfigurationFramework::UpdateType type
349341
Shared::g_accentColor = Utils::FromAbgr(accentColor);
350342
Shared::g_accentColorInactive = Utils::FromAbgr(accentColorInactive);
351343
}
344+
345+
Shared::g_enableFullDirty = static_cast<bool>(ConfigurationFramework::DwmGetDwordFromHKCUAndHKLM(L"EnableFullDirty"));
346+
Shared::g_enableFullDirty ? g_hackVisual.as<IDCompositionVisualDebug>()->EnableRedrawRegions() : g_hackVisual.as<IDCompositionVisualDebug>()->DisableRedrawRegions();
347+
LOG_IF_FAILED(uDwm::CDesktopManager::s_pDesktopManagerInstance->GetDCompDevice()->Commit());
352348
}
353349

354350
auto lock = wil::EnterCriticalSection(uDwm::CDesktopManager::s_csDwmInstance);
@@ -380,6 +376,8 @@ HRESULT GlassFramework::Startup()
380376
g_dwOverlayTestMode = *dwmcore::CCommonRegistryData::m_dwOverlayTestMode;
381377
*dwmcore::CCommonRegistryData::m_dwOverlayTestMode = 0x5;
382378

379+
RETURN_IF_FAILED(uDwm::CDesktopManager::s_pDesktopManagerInstance->GetDCompDevice()->CreateVisual(g_hackVisual.put()));
380+
383381
uDwm::GetAddressFromSymbolMap("CDrawGeometryInstruction::Create", g_CDrawGeometryInstruction_Create_Org);
384382
uDwm::GetAddressFromSymbolMap("CTopLevelWindow::UpdateNCAreaBackground", g_CTopLevelWindow_UpdateNCAreaBackground_Org);
385383
uDwm::GetAddressFromSymbolMap("CTopLevelWindow::UpdateClientBlur", g_CTopLevelWindow_UpdateClientBlur_Org);
@@ -456,4 +454,6 @@ void GlassFramework::Shutdown()
456454
VisualManager::RedrawTopLevelWindow(window);
457455
LOG_IF_FAILED(window->ValidateVisual());
458456
}
457+
458+
g_hackVisual = nullptr;
459459
}

OpenGlass/GlassRenderer.cpp

Lines changed: 36 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ using namespace OpenGlass;
1111

1212
namespace OpenGlass::GlassRenderer
1313
{
14+
bool STDMETHODCALLTYPE MyCSolidColorLegacyMilBrush_IsOfType(
15+
dwmcore::CSolidColorLegacyMilBrush* This,
16+
UINT type
17+
);
1418
HRESULT STDMETHODCALLTYPE MyCRenderData_TryDrawCommandAsDrawList(
1519
dwmcore::CResource* This,
1620
dwmcore::CDrawingContext* drawingContext,
@@ -21,19 +25,6 @@ namespace OpenGlass::GlassRenderer
2125
dwmcore::CResource** resources,
2226
bool* succeeded
2327
);
24-
HRESULT STDMETHODCALLTYPE MyCRenderData_DrawSolidColorRectangle(
25-
dwmcore::CResource* This,
26-
dwmcore::CDrawingContext* drawingContext,
27-
dwmcore::CResource* drawListEntryBuilder,
28-
bool unknwon,
29-
const D2D1_RECT_F& lprc,
30-
const D2D1_COLOR_F& color
31-
);
32-
HRESULT STDMETHODCALLTYPE MyCDrawingContext_DrawSolidRectangle(
33-
dwmcore::IDrawingContext* This,
34-
const D2D1_RECT_F& rectangle,
35-
const D2D1_COLOR_F& color
36-
);
3728
HRESULT STDMETHODCALLTYPE MyCDrawingContext_DrawGeometry(
3829
dwmcore::IDrawingContext* This,
3930
dwmcore::CLegacyMilBrush* brush,
@@ -53,10 +44,8 @@ namespace OpenGlass::GlassRenderer
5344
);
5445
void STDMETHODCALLTYPE MyCGeometry_Destructor(dwmcore::CGeometry* This);
5546

47+
decltype(&MyCSolidColorLegacyMilBrush_IsOfType) g_CSolidColorLegacyMilBrush_IsOfType_Org{ nullptr };
5648
decltype(&MyCRenderData_TryDrawCommandAsDrawList) g_CRenderData_TryDrawCommandAsDrawList_Org{ nullptr };
57-
decltype(&MyCRenderData_DrawSolidColorRectangle) g_CRenderData_DrawSolidColorRectangle_Org{ nullptr };
58-
decltype(&MyCDrawingContext_DrawSolidRectangle) g_CDrawingContext_DrawSolidRectangle_Org{ nullptr };
59-
decltype(&MyCDrawingContext_DrawSolidRectangle)* g_CDrawingContext_DrawSolidRectangle_Org_Address{ nullptr };
6049
decltype(&MyCDrawingContext_DrawGeometry) g_CDrawingContext_DrawGeometry_Org{ nullptr };
6150
decltype(&MyCDrawingContext_DrawGeometry)* g_CDrawingContext_DrawGeometry_Org_Address{ nullptr };
6251
decltype(&MyID2D1DeviceContext_FillGeometry) g_ID2D1DeviceContext_FillGeometry_Org{ nullptr };
@@ -65,10 +54,19 @@ namespace OpenGlass::GlassRenderer
6554
decltype(&MyCGeometry_Destructor) g_CGeometry_Destructor_Org{ nullptr };
6655
PVOID* g_CSolidColorLegacyMilBrush_vftable{ nullptr };
6756

68-
std::optional<D2D1_COLOR_F> g_drawColor{};
6957
IGlassEffect* g_glassEffectNoRef{ nullptr };
7058
ID2D1Device* g_deviceNoRef{ nullptr };
7159
dwmcore::IDrawingContext* g_drawingContextNoRef{ nullptr };
60+
bool g_solidColorLegacyMilBrush{ false };
61+
}
62+
63+
bool STDMETHODCALLTYPE GlassRenderer::MyCSolidColorLegacyMilBrush_IsOfType(
64+
dwmcore::CSolidColorLegacyMilBrush* This,
65+
UINT type
66+
)
67+
{
68+
g_solidColorLegacyMilBrush = true;
69+
return g_CSolidColorLegacyMilBrush_IsOfType_Org(This, type);
7270
}
7371

7472
HRESULT STDMETHODCALLTYPE GlassRenderer::MyCRenderData_TryDrawCommandAsDrawList(
@@ -82,69 +80,22 @@ HRESULT STDMETHODCALLTYPE GlassRenderer::MyCRenderData_TryDrawCommandAsDrawList(
8280
bool* succeeded
8381
)
8482
{
85-
g_drawColor = std::nullopt;
86-
HRESULT hr{ g_CRenderData_TryDrawCommandAsDrawList_Org(This, drawingContext, drawListCache, drawListEntryBuilder, unknwon, commandType, resources, succeeded) };
87-
if (SUCCEEDED(hr) && g_drawColor)
88-
{
89-
*succeeded = false;
90-
}
91-
return hr;
92-
}
93-
HRESULT STDMETHODCALLTYPE GlassRenderer::MyCRenderData_DrawSolidColorRectangle(
94-
dwmcore::CResource* This,
95-
dwmcore::CDrawingContext* drawingContext,
96-
dwmcore::CResource* drawListEntryBuilder,
97-
bool unknwon,
98-
const D2D1_RECT_F& lprc,
99-
const D2D1_COLOR_F& color
100-
)
101-
{
102-
if (
103-
color.a != 1.f &&
104-
Shared::IsBackdropAllowed()
105-
)
106-
{
107-
g_drawColor = color;
83+
g_solidColorLegacyMilBrush = false;
84+
auto hr = g_CRenderData_TryDrawCommandAsDrawList_Org(This, drawingContext, drawListCache, drawListEntryBuilder, unknwon, commandType, resources, succeeded);
10885

109-
if (!g_CDrawingContext_DrawSolidRectangle_Org)
110-
{
111-
g_CDrawingContext_DrawSolidRectangle_Org_Address = reinterpret_cast<decltype(g_CDrawingContext_DrawSolidRectangle_Org_Address)>(&(HookHelper::vtbl_of(drawingContext->GetInterface())[2]));
112-
g_CDrawingContext_DrawSolidRectangle_Org = HookHelper::WritePointer(g_CDrawingContext_DrawSolidRectangle_Org_Address, MyCDrawingContext_DrawSolidRectangle);
113-
}
86+
if (SUCCEEDED(hr) && g_solidColorLegacyMilBrush && commandType == 461)
87+
{
11488
if (!g_CDrawingContext_DrawGeometry_Org)
11589
{
11690
g_CDrawingContext_DrawGeometry_Org_Address = reinterpret_cast<decltype(g_CDrawingContext_DrawGeometry_Org_Address)>(&(HookHelper::vtbl_of(drawingContext->GetInterface())[4]));
11791
g_CDrawingContext_DrawGeometry_Org = HookHelper::WritePointer(g_CDrawingContext_DrawGeometry_Org_Address, MyCDrawingContext_DrawGeometry);
11892
}
93+
*succeeded = false;
11994

12095
return S_OK;
12196
}
12297

123-
return g_CRenderData_DrawSolidColorRectangle_Org(
124-
This,
125-
drawingContext,
126-
drawListEntryBuilder,
127-
unknwon,
128-
lprc,
129-
color
130-
);
131-
}
132-
133-
134-
HRESULT STDMETHODCALLTYPE GlassRenderer::MyCDrawingContext_DrawSolidRectangle(
135-
dwmcore::IDrawingContext* This,
136-
const D2D1_RECT_F& rectangle,
137-
const D2D1_COLOR_F& color
138-
)
139-
{
140-
if (!g_drawColor.has_value())
141-
{
142-
return g_CDrawingContext_DrawSolidRectangle_Org(This, rectangle, color);
143-
}
144-
145-
D2D1_COLOR_F convertedColor{ dwmcore::Convert_D2D1_COLOR_F_scRGB_To_D2D1_COLOR_F_sRGB(g_drawColor.value()) };
146-
g_drawColor = std::nullopt;
147-
return g_CDrawingContext_DrawSolidRectangle_Org(This, rectangle, convertedColor);
98+
return hr;
14899
}
149100

150101
HRESULT STDMETHODCALLTYPE GlassRenderer::MyCDrawingContext_DrawGeometry(
@@ -156,15 +107,13 @@ HRESULT STDMETHODCALLTYPE GlassRenderer::MyCDrawingContext_DrawGeometry(
156107
if (
157108
!brush ||
158109
!geometry ||
159-
HookHelper::vtbl_of(brush) != g_CSolidColorLegacyMilBrush_vftable ||
160-
!g_drawColor.has_value()
110+
HookHelper::vtbl_of(brush) != g_CSolidColorLegacyMilBrush_vftable
161111
)
162112
{
163113
return g_CDrawingContext_DrawGeometry_Org(This, brush, geometry);
164114
}
165115

166-
auto cleanUp = wil::scope_exit([] { g_drawColor = std::nullopt; });
167-
auto color = dwmcore::Convert_D2D1_COLOR_F_scRGB_To_D2D1_COLOR_F_sRGB(g_drawColor.value());
116+
auto color = dwmcore::Convert_D2D1_COLOR_F_scRGB_To_D2D1_COLOR_F_sRGB(reinterpret_cast<dwmcore::CSolidColorLegacyMilBrush*>(brush)->GetRealizedColor());
168117

169118
// shape is nullptr or empty
170119
dwmcore::CShapePtr geometryShape{};
@@ -296,6 +245,16 @@ HRESULT STDMETHODCALLTYPE GlassRenderer::MyCDirtyRegion__Add(
296245
const D2D1_RECT_F& lprc
297246
)
298247
{
248+
if (Shared::g_enableFullDirty)
249+
{
250+
return g_CDirtyRegion__Add_Org(
251+
This,
252+
visual,
253+
unknown,
254+
lprc
255+
);
256+
}
257+
299258
// at high blur radius, there is no need to extend that much,
300259
// it will only cause severe flickering
301260
float extendAmount{ min(Shared::g_blurAmount * 3.f + 0.5f, 15.5f) };
@@ -379,15 +338,15 @@ void GlassRenderer::UpdateConfiguration(ConfigurationFramework::UpdateType type)
379338
HRESULT GlassRenderer::Startup()
380339
{
381340
dwmcore::GetAddressFromSymbolMap("CRenderData::TryDrawCommandAsDrawList", g_CRenderData_TryDrawCommandAsDrawList_Org);
382-
dwmcore::GetAddressFromSymbolMap("CRenderData::DrawSolidColorRectangle", g_CRenderData_DrawSolidColorRectangle_Org);
383341
dwmcore::GetAddressFromSymbolMap("CDirtyRegion::_Add", g_CDirtyRegion__Add_Org);
384342
dwmcore::GetAddressFromSymbolMap("CGeometry::~CGeometry", g_CGeometry_Destructor_Org);
385343
dwmcore::GetAddressFromSymbolMap("CSolidColorLegacyMilBrush::`vftable'", g_CSolidColorLegacyMilBrush_vftable);
344+
dwmcore::GetAddressFromSymbolMap("CSolidColorLegacyMilBrush::IsOfType", g_CSolidColorLegacyMilBrush_IsOfType_Org);
386345

387346
return HookHelper::Detours::Write([]()
388347
{
348+
HookHelper::Detours::Attach(&g_CSolidColorLegacyMilBrush_IsOfType_Org, MyCSolidColorLegacyMilBrush_IsOfType);
389349
HookHelper::Detours::Attach(&g_CRenderData_TryDrawCommandAsDrawList_Org, MyCRenderData_TryDrawCommandAsDrawList);
390-
HookHelper::Detours::Attach(&g_CRenderData_DrawSolidColorRectangle_Org, MyCRenderData_DrawSolidColorRectangle);
391350
HookHelper::Detours::Attach(&g_CDirtyRegion__Add_Org, MyCDirtyRegion__Add);
392351
HookHelper::Detours::Attach(&g_CGeometry_Destructor_Org, MyCGeometry_Destructor);
393352
});
@@ -397,8 +356,8 @@ void GlassRenderer::Shutdown()
397356
{
398357
HookHelper::Detours::Write([]()
399358
{
359+
HookHelper::Detours::Detach(&g_CSolidColorLegacyMilBrush_IsOfType_Org, MyCSolidColorLegacyMilBrush_IsOfType);
400360
HookHelper::Detours::Detach(&g_CRenderData_TryDrawCommandAsDrawList_Org, MyCRenderData_TryDrawCommandAsDrawList);
401-
HookHelper::Detours::Detach(&g_CRenderData_DrawSolidColorRectangle_Org, MyCRenderData_DrawSolidColorRectangle);
402361
HookHelper::Detours::Detach(&g_CDirtyRegion__Add_Org, MyCDirtyRegion__Add);
403362
HookHelper::Detours::Detach(&g_CGeometry_Destructor_Org, MyCGeometry_Destructor);
404363
});
@@ -415,12 +374,6 @@ void GlassRenderer::Shutdown()
415374
g_CDrawingContext_DrawGeometry_Org_Address = nullptr;
416375
g_CDrawingContext_DrawGeometry_Org = nullptr;
417376
}
418-
if (g_CDrawingContext_DrawSolidRectangle_Org)
419-
{
420-
HookHelper::WritePointer(g_CDrawingContext_DrawSolidRectangle_Org_Address, g_CDrawingContext_DrawSolidRectangle_Org);
421-
g_CDrawingContext_DrawSolidRectangle_Org_Address = nullptr;
422-
g_CDrawingContext_DrawSolidRectangle_Org = nullptr;
423-
}
424377

425378
GlassEffectFactory::Shutdown();
426379
ReflectionEffect::Reset();

OpenGlass/Shared.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,6 @@ namespace OpenGlass::Shared
5454

5555
return true;
5656
}
57+
58+
inline bool g_enableFullDirty{ false };
5759
}

OpenGlass/dwmcoreProjection.hpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,14 @@ namespace OpenGlass::dwmcore
207207

208208
typedef D2D1_MATRIX_5X4_F CMILMatrix;
209209
struct CLegacyMilBrush : CResource {};
210+
struct CSolidColorLegacyMilBrush : CLegacyMilBrush
211+
{
212+
const D2D1_COLOR_F& GetRealizedColor() const
213+
{
214+
return *reinterpret_cast<D2D1_COLOR_F*>(reinterpret_cast<ULONG_PTR>(this) + 88);
215+
}
216+
};
217+
210218
struct CTransform : CResource {};
211219
struct CShape
212220
{
@@ -577,13 +585,13 @@ namespace OpenGlass::dwmcore
577585
fullyUnDecoratedFunctionName == "CChannel::CombinedGeometryUpdate" ||
578586
fullyUnDecoratedFunctionName == "CResource::GetOwningProcessId" ||
579587
fullyUnDecoratedFunctionName == "CRenderData::TryDrawCommandAsDrawList" ||
580-
fullyUnDecoratedFunctionName == "CRenderData::DrawSolidColorRectangle" ||
581588
fullyUnDecoratedFunctionName == "CGeometry::GetShapeData" ||
582589
fullyUnDecoratedFunctionName == "CGeometry::~CGeometry" ||
583590
fullyUnDecoratedFunctionName == "CDirtyRegion::SetFullDirty" ||
584591
fullyUnDecoratedFunctionName == "CDirtyRegion::_Add" ||
585592
fullyUnDecoratedFunctionName == "CVisual::GetHwnd" ||
586593
fullyUnDecoratedFunctionName == "CD2DContext::GetClip" ||
594+
fullyUnDecoratedFunctionName == "CSolidColorLegacyMilBrush::IsOfType" ||
587595
(
588596
fullyUnDecoratedFunctionName.starts_with("CDrawingContext::") &&
589597
fullyUnDecoratedFunctionName != "CDrawingContext::IsOccluded"

0 commit comments

Comments
 (0)