@@ -11,6 +11,28 @@ import (
1111 "github.com/huanfeng/wind_input/pkg/theme"
1212)
1313
14+ // shadowMargins 返回窗口画布为投影额外预留的四向 margin(像素)。
15+ // blur/spread > 0 时四向扩展(与 paintBlurredShadow 的 3-sigma 公式对齐);
16+ // 否则仅右下留出偏移空间(向后兼容无模糊投影)。sh==nil 或 Color==nil 时全零。
17+ func shadowMargins (sh * ViewShadow ) (marginLeft , marginTop , marginRight , marginBottom int ) {
18+ if sh == nil || sh .Color == nil {
19+ return
20+ }
21+ if sh .Blur > 0 || sh .Spread > 0 {
22+ sigma := math .Sqrt (float64 (sh .Blur ) * float64 (sh .Blur + 2 ))
23+ pad := int (math .Ceil (3 * sigma )) + 2
24+ base := pad + sh .Spread
25+ marginLeft = base + maxInt (- sh .OffsetX , 0 )
26+ marginTop = base + maxInt (- sh .OffsetY , 0 )
27+ marginRight = base + maxInt (sh .OffsetX , 0 )
28+ marginBottom = base + maxInt (sh .OffsetY , 0 )
29+ } else {
30+ marginRight = maxInt (sh .OffsetX , 0 )
31+ marginBottom = maxInt (sh .OffsetY , 0 )
32+ }
33+ return
34+ }
35+
1436// refreshResolvedViews 重建 r.resolvedViews,由渲染入口 render*V2 每次调用。
1537// 候选窗外观直接消费 theme 包解析结果 ResolveCandidateViews(views 已 merge defaultViews
1638// 基线、几何+颜色权威);字号/行高/竖排宽是运行时值(用户全局字号派生 + DPI scale),在此回填。
@@ -95,23 +117,7 @@ func (r *Renderer) renderTree(tree *candWindowTree) (*image.RGBA, *RenderResult)
95117 root := tree .root
96118
97119 // 先计算阴影四向 margin,再以 (marginLeft, marginTop) 为起点 layout。
98- // blur/spread > 0:四向扩展,offset 决定不对称量;否则退化为旧右下扩展。
99- marginLeft , marginTop , marginRight , marginBottom := 0 , 0 , 0 , 0
100- if sh := root .Shadow ; sh != nil {
101- if sh .Blur > 0 || sh .Spread > 0 {
102- // 与 paintBlurredShadow 相同的公式:3-sigma 覆盖 99.7% 模糊梯度。
103- sigma := math .Sqrt (float64 (sh .Blur ) * float64 (sh .Blur + 2 ))
104- pad := int (math .Ceil (3 * sigma )) + 2
105- base := pad + sh .Spread
106- marginLeft = base + maxInt (- sh .OffsetX , 0 )
107- marginTop = base + maxInt (- sh .OffsetY , 0 )
108- marginRight = base + maxInt (sh .OffsetX , 0 )
109- marginBottom = base + maxInt (sh .OffsetY , 0 )
110- } else {
111- marginRight = maxInt (sh .OffsetX , 0 )
112- marginBottom = maxInt (sh .OffsetY , 0 )
113- }
114- }
120+ marginLeft , marginTop , marginRight , marginBottom := shadowMargins (root .Shadow )
115121 Layout (root , marginLeft , marginTop , td )
116122
117123 w := root .Rect ().Dx () + marginLeft + marginRight
@@ -127,7 +133,13 @@ func (r *Renderer) renderTree(tree *candWindowTree) (*image.RGBA, *RenderResult)
127133 PaintTree (root , dc , img , td )
128134 DrawDebugBanner (img )
129135
130- res := & RenderResult {Rects : make ([]CandidateRect , len (tree .items ))}
136+ res := & RenderResult {
137+ Rects : make ([]CandidateRect , len (tree .items )),
138+ ShadowMarginLeft : marginLeft ,
139+ ShadowMarginTop : marginTop ,
140+ ShadowMarginRight : marginRight ,
141+ ShadowMarginBottom : marginBottom ,
142+ }
131143 for i , it := range tree .items {
132144 res .Rects [i ] = rectOf (i , it )
133145 }
0 commit comments