Skip to content

Commit 4053f81

Browse files
committed
fix #104
1 parent 7dc9afe commit 4053f81

File tree

3 files changed

+48
-4
lines changed

3 files changed

+48
-4
lines changed

OpenGlass/GlassRenderer.cpp

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,20 @@ namespace OpenGlass::GlassRenderer
5555
ID2D1Brush* brush,
5656
ID2D1Brush* opacityBrush
5757
);
58+
HRESULT STDMETHODCALLTYPE MyCCachedVisualImage_CCachedTarget_Update(
59+
dwmcore::CCachedVisualImage::CCachedTarget* This,
60+
const D2D1_RECT_F& rect,
61+
DWM::MilStretch mode,
62+
const dwmcore::RenderTargetInfo& info
63+
);
5864

5965
PVOID g_CRenderData_TryDrawCommandAsDrawList_Org{ nullptr };
6066
decltype(&MyCGeometry_Destructor) g_CGeometry_Destructor_Org{ nullptr };
6167
decltype(&MyCDrawingContext_DrawGeometry) g_CDrawingContext_DrawGeometry_Org{ nullptr };
6268
decltype(&MyCDrawingContext_DrawGeometry)* g_CDrawingContext_DrawGeometry_Org_Address{ nullptr };
6369
decltype(&MyID2D1DeviceContext_FillGeometry) g_ID2D1DeviceContext_FillGeometry_Org{ nullptr };
6470
decltype(&MyID2D1DeviceContext_FillGeometry)* g_ID2D1DeviceContext_FillGeometry_Org_Address{ nullptr };
71+
decltype(&MyCCachedVisualImage_CCachedTarget_Update) g_CCachedVisualImage_CCachedTarget_Update_Org{ nullptr };
6572

6673
enum RenderFlag
6774
{
@@ -74,6 +81,7 @@ namespace OpenGlass::GlassRenderer
7481
std::bitset<2> g_renderFlag{};
7582
ID2D1Device* g_deviceNoRef{};
7683
winrt::com_ptr<ID2D1SolidColorBrush> g_brush{};
84+
size_t g_CVIHierarchy{};
7785

7886
int g_drawGeometryCommandType{ 0 };
7987
winrt::com_ptr<CGlassRealizer> g_glassRealizer{ nullptr };
@@ -372,11 +380,24 @@ HRESULT STDMETHODCALLTYPE GlassRenderer::MyCDrawingContext_DrawGeometry(
372380
afterglowBalance
373381
);
374382
!opaque &&
375-
extendedAmount
383+
extendedAmount &&
384+
!(
385+
(
386+
!desktopTree ||
387+
HookHelper::vftbl_of(currentVisualTree) != dwmcore::CDesktopTree::vftable
388+
) &&
389+
g_CVIHierarchy &&
390+
(
391+
renderTargetBitmap = drawingContext->AcquireRenderTargetBitmap(true),
392+
renderTargetBitmap->GetPixelFormat().alphaMode == D2D1_ALPHA_MODE_PREMULTIPLIED
393+
)
394+
)
376395
)
377396
{
378-
renderTargetBitmap = drawingContext->AcquireRenderTargetBitmap(true);
379-
397+
if (!renderTargetBitmap)
398+
{
399+
renderTargetBitmap = drawingContext->AcquireRenderTargetBitmap(true);
400+
}
380401
g_glassInput.d2dContext = d2dContext;
381402
g_glassInput.drawingWorldBounds = &drawingWorldBounds;
382403
g_glassInput.renderTargetBitmap = renderTargetBitmap.get();
@@ -548,6 +569,24 @@ void STDMETHODCALLTYPE GlassRenderer::MyID2D1DeviceContext_FillGeometry(
548569
g_renderFlag.reset();
549570
}
550571

572+
HRESULT STDMETHODCALLTYPE GlassRenderer::MyCCachedVisualImage_CCachedTarget_Update(
573+
dwmcore::CCachedVisualImage::CCachedTarget* This,
574+
const D2D1_RECT_F& rect,
575+
DWM::MilStretch mode,
576+
const dwmcore::RenderTargetInfo& info
577+
)
578+
{
579+
g_CVIHierarchy += 1;
580+
const auto hr = g_CCachedVisualImage_CCachedTarget_Update_Org(
581+
This,
582+
rect,
583+
mode,
584+
info
585+
);
586+
g_CVIHierarchy -= 1;
587+
return hr;
588+
}
589+
551590
void GlassRenderer::Update(GlassEngine::UpdateType type)
552591
{
553592
if (type & GlassEngine::UpdateType::Backdrop)
@@ -585,7 +624,8 @@ void GlassRenderer::Startup()
585624

586625
dwmcore::g_projectionArray.ApplyToVariable("CGeometry::~CGeometry", g_CGeometry_Destructor_Org);
587626
dwmcore::g_projectionArray.ApplyToVariable("CRenderData::TryDrawCommandAsDrawList", g_CRenderData_TryDrawCommandAsDrawList_Org);
588-
627+
dwmcore::g_projectionArray.ApplyToVariable("CCachedVisualImage::CCachedTarget::Update", g_CCachedVisualImage_CCachedTarget_Update_Org);
628+
589629
if (!g_drawGeometryCommandType)
590630
{
591631
switch (dwmcore::g_buildNumber)
@@ -659,6 +699,7 @@ void GlassRenderer::Startup()
659699
{
660700
HookHelper::Detours::Attach(&g_CRenderData_TryDrawCommandAsDrawList_Org, MyCRenderData_TryDrawCommandAsDrawList_Win11);
661701
}
702+
HookHelper::Detours::Attach(&g_CCachedVisualImage_CCachedTarget_Update_Org, MyCCachedVisualImage_CCachedTarget_Update);
662703
})
663704
);
664705
}
@@ -677,6 +718,7 @@ void GlassRenderer::Shutdown()
677718
{
678719
HookHelper::Detours::Detach(&g_CRenderData_TryDrawCommandAsDrawList_Org, MyCRenderData_TryDrawCommandAsDrawList_Win11);
679720
}
721+
HookHelper::Detours::Detach(&g_CCachedVisualImage_CCachedTarget_Update_Org, MyCCachedVisualImage_CCachedTarget_Update);
680722
})
681723
);
682724

OpenGlass/OpenGlass.rc

0 Bytes
Binary file not shown.

OpenGlass/dwmcoreProjection.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,6 +1127,8 @@ namespace OpenGlass::dwmcore
11271127
MAKE_EMPTY_PROJECTION_TUPLE("CDirtyRegion::GetOptimizedRect", os::build_w11_21h2, os::build_w11_24h2),
11281128
MAKE_EMPTY_PROJECTION_TUPLE("CTreeDirty::GetOptimizedRect", os::build_w11_24h2, 0),
11291129

1130+
MAKE_EMPTY_PROJECTION_TUPLE("CCachedVisualImage::CCachedTarget::Update", 0, 0),
1131+
11301132
MAKE_FUNCTION_PROJECTION_TUPLE(GetCurrentFrameId, 0, 0),
11311133

11321134
MAKE_VARIABLE_PROJECTION_TUPLE(CCommonRegistryData::m_dwOverlayTestMode, 0, 0),

0 commit comments

Comments
 (0)