@@ -11,6 +11,10 @@ using namespace OpenGlass;
11
11
12
12
namespace OpenGlass ::GlassRenderer
13
13
{
14
+ bool STDMETHODCALLTYPE MyCSolidColorLegacyMilBrush_IsOfType (
15
+ dwmcore::CSolidColorLegacyMilBrush* This,
16
+ UINT type
17
+ );
14
18
HRESULT STDMETHODCALLTYPE MyCRenderData_TryDrawCommandAsDrawList (
15
19
dwmcore::CResource* This,
16
20
dwmcore::CDrawingContext* drawingContext,
@@ -21,19 +25,6 @@ namespace OpenGlass::GlassRenderer
21
25
dwmcore::CResource** resources,
22
26
bool * succeeded
23
27
);
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
- );
37
28
HRESULT STDMETHODCALLTYPE MyCDrawingContext_DrawGeometry (
38
29
dwmcore::IDrawingContext* This,
39
30
dwmcore::CLegacyMilBrush* brush,
@@ -53,10 +44,8 @@ namespace OpenGlass::GlassRenderer
53
44
);
54
45
void STDMETHODCALLTYPE MyCGeometry_Destructor (dwmcore::CGeometry* This);
55
46
47
+ decltype (&MyCSolidColorLegacyMilBrush_IsOfType) g_CSolidColorLegacyMilBrush_IsOfType_Org{ nullptr };
56
48
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 };
60
49
decltype (&MyCDrawingContext_DrawGeometry) g_CDrawingContext_DrawGeometry_Org{ nullptr };
61
50
decltype (&MyCDrawingContext_DrawGeometry)* g_CDrawingContext_DrawGeometry_Org_Address{ nullptr };
62
51
decltype (&MyID2D1DeviceContext_FillGeometry) g_ID2D1DeviceContext_FillGeometry_Org{ nullptr };
@@ -65,10 +54,19 @@ namespace OpenGlass::GlassRenderer
65
54
decltype (&MyCGeometry_Destructor) g_CGeometry_Destructor_Org{ nullptr };
66
55
PVOID* g_CSolidColorLegacyMilBrush_vftable{ nullptr };
67
56
68
- std::optional<D2D1_COLOR_F> g_drawColor{};
69
57
IGlassEffect* g_glassEffectNoRef{ nullptr };
70
58
ID2D1Device* g_deviceNoRef{ nullptr };
71
59
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);
72
70
}
73
71
74
72
HRESULT STDMETHODCALLTYPE GlassRenderer::MyCRenderData_TryDrawCommandAsDrawList (
@@ -82,69 +80,22 @@ HRESULT STDMETHODCALLTYPE GlassRenderer::MyCRenderData_TryDrawCommandAsDrawList(
82
80
bool * succeeded
83
81
)
84
82
{
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);
108
85
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
+ {
114
88
if (!g_CDrawingContext_DrawGeometry_Org)
115
89
{
116
90
g_CDrawingContext_DrawGeometry_Org_Address = reinterpret_cast <decltype (g_CDrawingContext_DrawGeometry_Org_Address)>(&(HookHelper::vtbl_of (drawingContext->GetInterface ())[4 ]));
117
91
g_CDrawingContext_DrawGeometry_Org = HookHelper::WritePointer (g_CDrawingContext_DrawGeometry_Org_Address, MyCDrawingContext_DrawGeometry);
118
92
}
93
+ *succeeded = false ;
119
94
120
95
return S_OK;
121
96
}
122
97
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;
148
99
}
149
100
150
101
HRESULT STDMETHODCALLTYPE GlassRenderer::MyCDrawingContext_DrawGeometry (
@@ -156,15 +107,13 @@ HRESULT STDMETHODCALLTYPE GlassRenderer::MyCDrawingContext_DrawGeometry(
156
107
if (
157
108
!brush ||
158
109
!geometry ||
159
- HookHelper::vtbl_of (brush) != g_CSolidColorLegacyMilBrush_vftable ||
160
- !g_drawColor.has_value ()
110
+ HookHelper::vtbl_of (brush) != g_CSolidColorLegacyMilBrush_vftable
161
111
)
162
112
{
163
113
return g_CDrawingContext_DrawGeometry_Org (This, brush, geometry);
164
114
}
165
115
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 ());
168
117
169
118
// shape is nullptr or empty
170
119
dwmcore::CShapePtr geometryShape{};
@@ -296,6 +245,16 @@ HRESULT STDMETHODCALLTYPE GlassRenderer::MyCDirtyRegion__Add(
296
245
const D2D1_RECT_F& lprc
297
246
)
298
247
{
248
+ if (Shared::g_enableFullDirty)
249
+ {
250
+ return g_CDirtyRegion__Add_Org (
251
+ This,
252
+ visual,
253
+ unknown,
254
+ lprc
255
+ );
256
+ }
257
+
299
258
// at high blur radius, there is no need to extend that much,
300
259
// it will only cause severe flickering
301
260
float extendAmount{ min (Shared::g_blurAmount * 3 .f + 0 .5f , 15 .5f ) };
@@ -379,15 +338,15 @@ void GlassRenderer::UpdateConfiguration(ConfigurationFramework::UpdateType type)
379
338
HRESULT GlassRenderer::Startup ()
380
339
{
381
340
dwmcore::GetAddressFromSymbolMap (" CRenderData::TryDrawCommandAsDrawList" , g_CRenderData_TryDrawCommandAsDrawList_Org);
382
- dwmcore::GetAddressFromSymbolMap (" CRenderData::DrawSolidColorRectangle" , g_CRenderData_DrawSolidColorRectangle_Org);
383
341
dwmcore::GetAddressFromSymbolMap (" CDirtyRegion::_Add" , g_CDirtyRegion__Add_Org);
384
342
dwmcore::GetAddressFromSymbolMap (" CGeometry::~CGeometry" , g_CGeometry_Destructor_Org);
385
343
dwmcore::GetAddressFromSymbolMap (" CSolidColorLegacyMilBrush::`vftable'" , g_CSolidColorLegacyMilBrush_vftable);
344
+ dwmcore::GetAddressFromSymbolMap (" CSolidColorLegacyMilBrush::IsOfType" , g_CSolidColorLegacyMilBrush_IsOfType_Org);
386
345
387
346
return HookHelper::Detours::Write ([]()
388
347
{
348
+ HookHelper::Detours::Attach (&g_CSolidColorLegacyMilBrush_IsOfType_Org, MyCSolidColorLegacyMilBrush_IsOfType);
389
349
HookHelper::Detours::Attach (&g_CRenderData_TryDrawCommandAsDrawList_Org, MyCRenderData_TryDrawCommandAsDrawList);
390
- HookHelper::Detours::Attach (&g_CRenderData_DrawSolidColorRectangle_Org, MyCRenderData_DrawSolidColorRectangle);
391
350
HookHelper::Detours::Attach (&g_CDirtyRegion__Add_Org, MyCDirtyRegion__Add);
392
351
HookHelper::Detours::Attach (&g_CGeometry_Destructor_Org, MyCGeometry_Destructor);
393
352
});
@@ -397,8 +356,8 @@ void GlassRenderer::Shutdown()
397
356
{
398
357
HookHelper::Detours::Write ([]()
399
358
{
359
+ HookHelper::Detours::Detach (&g_CSolidColorLegacyMilBrush_IsOfType_Org, MyCSolidColorLegacyMilBrush_IsOfType);
400
360
HookHelper::Detours::Detach (&g_CRenderData_TryDrawCommandAsDrawList_Org, MyCRenderData_TryDrawCommandAsDrawList);
401
- HookHelper::Detours::Detach (&g_CRenderData_DrawSolidColorRectangle_Org, MyCRenderData_DrawSolidColorRectangle);
402
361
HookHelper::Detours::Detach (&g_CDirtyRegion__Add_Org, MyCDirtyRegion__Add);
403
362
HookHelper::Detours::Detach (&g_CGeometry_Destructor_Org, MyCGeometry_Destructor);
404
363
});
@@ -415,12 +374,6 @@ void GlassRenderer::Shutdown()
415
374
g_CDrawingContext_DrawGeometry_Org_Address = nullptr ;
416
375
g_CDrawingContext_DrawGeometry_Org = nullptr ;
417
376
}
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
- }
424
377
425
378
GlassEffectFactory::Shutdown ();
426
379
ReflectionEffect::Reset ();
0 commit comments