@@ -55,13 +55,20 @@ namespace OpenGlass::GlassRenderer
55
55
ID2D1Brush* brush,
56
56
ID2D1Brush* opacityBrush
57
57
);
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
+ );
58
64
59
65
PVOID g_CRenderData_TryDrawCommandAsDrawList_Org{ nullptr };
60
66
decltype (&MyCGeometry_Destructor) g_CGeometry_Destructor_Org{ nullptr };
61
67
decltype (&MyCDrawingContext_DrawGeometry) g_CDrawingContext_DrawGeometry_Org{ nullptr };
62
68
decltype (&MyCDrawingContext_DrawGeometry)* g_CDrawingContext_DrawGeometry_Org_Address{ nullptr };
63
69
decltype (&MyID2D1DeviceContext_FillGeometry) g_ID2D1DeviceContext_FillGeometry_Org{ nullptr };
64
70
decltype (&MyID2D1DeviceContext_FillGeometry)* g_ID2D1DeviceContext_FillGeometry_Org_Address{ nullptr };
71
+ decltype (&MyCCachedVisualImage_CCachedTarget_Update) g_CCachedVisualImage_CCachedTarget_Update_Org{ nullptr };
65
72
66
73
enum RenderFlag
67
74
{
@@ -74,6 +81,7 @@ namespace OpenGlass::GlassRenderer
74
81
std::bitset<2 > g_renderFlag{};
75
82
ID2D1Device* g_deviceNoRef{};
76
83
winrt::com_ptr<ID2D1SolidColorBrush> g_brush{};
84
+ size_t g_CVIHierarchy{};
77
85
78
86
int g_drawGeometryCommandType{ 0 };
79
87
winrt::com_ptr<CGlassRealizer> g_glassRealizer{ nullptr };
@@ -372,11 +380,24 @@ HRESULT STDMETHODCALLTYPE GlassRenderer::MyCDrawingContext_DrawGeometry(
372
380
afterglowBalance
373
381
);
374
382
!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
+ )
376
395
)
377
396
{
378
- renderTargetBitmap = drawingContext->AcquireRenderTargetBitmap (true );
379
-
397
+ if (!renderTargetBitmap)
398
+ {
399
+ renderTargetBitmap = drawingContext->AcquireRenderTargetBitmap (true );
400
+ }
380
401
g_glassInput.d2dContext = d2dContext;
381
402
g_glassInput.drawingWorldBounds = &drawingWorldBounds;
382
403
g_glassInput.renderTargetBitmap = renderTargetBitmap.get ();
@@ -548,6 +569,24 @@ void STDMETHODCALLTYPE GlassRenderer::MyID2D1DeviceContext_FillGeometry(
548
569
g_renderFlag.reset ();
549
570
}
550
571
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
+
551
590
void GlassRenderer::Update (GlassEngine::UpdateType type)
552
591
{
553
592
if (type & GlassEngine::UpdateType::Backdrop)
@@ -585,7 +624,8 @@ void GlassRenderer::Startup()
585
624
586
625
dwmcore::g_projectionArray.ApplyToVariable (" CGeometry::~CGeometry" , g_CGeometry_Destructor_Org);
587
626
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
+
589
629
if (!g_drawGeometryCommandType)
590
630
{
591
631
switch (dwmcore::g_buildNumber)
@@ -659,6 +699,7 @@ void GlassRenderer::Startup()
659
699
{
660
700
HookHelper::Detours::Attach (&g_CRenderData_TryDrawCommandAsDrawList_Org, MyCRenderData_TryDrawCommandAsDrawList_Win11);
661
701
}
702
+ HookHelper::Detours::Attach (&g_CCachedVisualImage_CCachedTarget_Update_Org, MyCCachedVisualImage_CCachedTarget_Update);
662
703
})
663
704
);
664
705
}
@@ -677,6 +718,7 @@ void GlassRenderer::Shutdown()
677
718
{
678
719
HookHelper::Detours::Detach (&g_CRenderData_TryDrawCommandAsDrawList_Org, MyCRenderData_TryDrawCommandAsDrawList_Win11);
679
720
}
721
+ HookHelper::Detours::Detach (&g_CCachedVisualImage_CCachedTarget_Update_Org, MyCCachedVisualImage_CCachedTarget_Update);
680
722
})
681
723
);
682
724
0 commit comments