Skip to content

Commit 17a4e22

Browse files
committed
fix(Studio): Rendering of fonts on transparent backgrounds on WPF
1 parent 4e5ba9a commit 17a4e22

2 files changed

Lines changed: 37 additions & 8 deletions

File tree

Studio/CelesteStudio.WPF/SkiaDrawableHandler.cs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,18 @@
22
using CelesteStudio.Util;
33
using System;
44
using System.Windows;
5-
using System.Windows.Media;
65
using System.Windows.Media.Imaging;
76
using Eto.Wpf.Forms;
87
using SkiaSharp;
98
using System.Windows.Controls;
109
using Eto.Wpf;
10+
using Eto;
11+
using Eto.Drawing;
12+
using Eto.Forms;
13+
using System.Windows.Media;
14+
using EtoControl = Eto.Forms.Control;
15+
using EtoColor = Eto.Drawing.Color;
16+
using EtoColors = Eto.Drawing.Colors;
1117

1218
namespace CelesteStudio.WPF;
1319

@@ -53,7 +59,21 @@ protected override void OnRender(DrawingContext drawingContext) {
5359

5460
var canvas = surface.Canvas;
5561
using (new SKAutoCanvasRestore(surface.Canvas, true)) {
56-
canvas.Clear(drawable.BackgroundColor.ToSkia());
62+
// Traverse transparent background color tree
63+
EtoControl? currWidget = drawable;
64+
EtoColor bgColor = drawable.BackgroundColor;
65+
while (bgColor.A <= 0.01f && currWidget != null) {
66+
currWidget = currWidget.Parent;
67+
bgColor = currWidget?.BackgroundColor ?? EtoColors.Transparent;
68+
}
69+
70+
if (bgColor.A <= 0.01f) {
71+
// Use native background color
72+
canvas.Clear(Settings.Instance.Theme.DarkMode ? Settings.Instance.Theme.Background.ToSkia() : SKColors.White);
73+
} else {
74+
canvas.Clear(bgColor.ToSkia());
75+
}
76+
5777
drawable.Draw(surface);
5878
}
5979
canvas.Flush();
@@ -81,7 +101,21 @@ protected override void OnRender(DrawingContext drawingContext) {
81101

82102
var canvas = surface.Canvas;
83103
using (new SKAutoCanvasRestore(surface.Canvas, true)) {
84-
canvas.Clear(drawable.BackgroundColor.ToSkia());
104+
// Traverse transparent background color tree
105+
EtoControl? currWidget = drawable;
106+
EtoColor bgColor = drawable.BackgroundColor;
107+
while (bgColor.A <= 0.01f && currWidget != null) {
108+
currWidget = currWidget.Parent;
109+
bgColor = currWidget?.BackgroundColor ?? EtoColors.Transparent;
110+
}
111+
112+
if (bgColor.A <= 0.01f) {
113+
// Use native background color
114+
canvas.Clear(Settings.Instance.Theme.DarkMode ? Settings.Instance.Theme.Background.ToSkia() : SKColors.White);
115+
} else {
116+
canvas.Clear(bgColor.ToSkia());
117+
}
118+
85119
canvas.Translate(-drawable.DrawX, -drawable.DrawY);
86120
drawable.Draw(surface);
87121
}

Studio/CelesteStudio/Editing/GameInfo.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -211,11 +211,6 @@ protected override void DrawCurrentLineHighlight(SKCanvas canvas, float carY, SK
211211
}
212212

213213
private sealed class SubpixelIndicator : SkiaDrawable {
214-
public SubpixelIndicator() {
215-
BackgroundColor = Settings.Instance.Theme.StatusBg;
216-
Settings.ThemeChanged += () => BackgroundColor = Settings.Instance.Theme.StatusBg;
217-
}
218-
219214
public override void Draw(SKSurface surface) {
220215
var canvas = surface.Canvas;
221216

0 commit comments

Comments
 (0)