diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml
index 3d73a3f..7ab3088 100644
--- a/app/qml/ApplicationSettings.qml
+++ b/app/qml/ApplicationSettings.qml
@@ -33,6 +33,9 @@ QtObject{
readonly property real minimumFontScaling: 0.25
readonly property real maximumFontScaling: 2.50
+ readonly property real minBurnInFadeTime: 160
+ readonly property real maxBurnInFadeTime: 1600
+
// GENERAL SETTINGS ///////////////////////////////////////////////////////
property int x: 100
@@ -52,7 +55,9 @@ QtObject{
property bool verbose: false
property real bloomQuality: 0.5
+
property real burnInQuality: 0.5
+ property bool useFastBurnIn: Qt.platform.os === "osx" ? false : true
onWindowScalingChanged: handleFontChanged();
@@ -202,7 +207,8 @@ QtObject{
bloomQuality: bloomQuality,
burnInQuality: burnInQuality,
useCustomCommand: useCustomCommand,
- customCommand: customCommand
+ customCommand: customCommand,
+ useFastBurnIn: useFastBurnIn
}
return stringify(settings);
}
@@ -288,6 +294,8 @@ QtObject{
useCustomCommand = settings.useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand
customCommand = settings.customCommand !== undefined ? settings.customCommand : customCommand
+
+ useFastBurnIn = settings.useFastBurnIn !== undefined ? settings.useFastBurnIn : useFastBurnIn;
}
function loadProfileString(profileString){
diff --git a/app/qml/BurnInEffect.qml b/app/qml/BurnInEffect.qml
index 437e00a..2d4f223 100644
--- a/app/qml/BurnInEffect.qml
+++ b/app/qml/BurnInEffect.qml
@@ -13,10 +13,12 @@ Loader {
property real delay: (1.0 / appSettings.fps) * 1000
property real burnIn: appSettings.burnIn
property real burnInFadeTime: 1 / Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn)
- property real _minBurnInFadeTime: 160
- property real _maxBurnInFadeTime: 1600
+ property real _minBurnInFadeTime: appSettings.minBurnInFadeTime
+ property real _maxBurnInFadeTime: appSettings.maxBurnInFadeTime
- active: appSettings.burnIn !== 0
+ active: appSettings.useFastBurnIn && appSettings.burnIn !== 0
+
+ anchors.fill: parent
function completelyUpdate() {
prevLastUpdate = lastUpdate;
@@ -33,16 +35,6 @@ Loader {
sourceComponent: Item {
property alias source: burnInEffectSource
- property int burnInScaling: scaleTexture * appSettings.burnInQuality
-
- width: appSettings.lowResolutionFont
- ? kterminal.totalWidth * Math.max(1, burnInScaling)
- : kterminal.totalWidth * scaleTexture * appSettings.burnInQuality
-
- height: appSettings.lowResolutionFont
- ? kterminal.totalHeight * Math.max(1, burnInScaling)
- : kterminal.totalHeight * scaleTexture * appSettings.burnInQuality
-
ShaderEffectSource {
id: burnInEffectSource
@@ -88,7 +80,6 @@ Loader {
property real prevLastUpdate: burnInEffect.prevLastUpdate
anchors.fill: parent
-
blending: false
fragmentShader:
diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml
index e9bfc45..b8d61e4 100644
--- a/app/qml/PreprocessedTerminal.qml
+++ b/app/qml/PreprocessedTerminal.qml
@@ -33,6 +33,7 @@ Item{
property ShaderEffectSource mainSource: kterminalSource
property BurnInEffect burnInEffect: burnInEffect
+ property SlowBurnIn slowBurnInEffect: slowBurnInEffect
property real fontWidth: 1.0
property real screenScaling: 1.0
property real scaleTexture: 1.0
@@ -227,7 +228,26 @@ Item{
sourceRect: Qt.rect(-kterminal.margin, -kterminal.margin, kterminal.totalWidth, kterminal.totalHeight)
}
- BurnInEffect {
- id: burnInEffect
+ Item {
+ id: burnInContainer
+
+ property int burnInScaling: scaleTexture * appSettings.burnInQuality
+
+ width: Math.round(appSettings.lowResolutionFont
+ ? kterminal.totalWidth * Math.max(1, burnInScaling)
+ : kterminal.totalWidth * scaleTexture * appSettings.burnInQuality)
+
+ height: Math.round(appSettings.lowResolutionFont
+ ? kterminal.totalHeight * Math.max(1, burnInScaling)
+ : kterminal.totalHeight * scaleTexture * appSettings.burnInQuality)
+
+
+ BurnInEffect {
+ id: burnInEffect
+ }
+
+ SlowBurnIn {
+ id: slowBurnInEffect
+ }
}
}
diff --git a/app/qml/SettingsAdvancedTab.qml b/app/qml/SettingsAdvancedTab.qml
index 06d20f5..c0d486a 100644
--- a/app/qml/SettingsAdvancedTab.qml
+++ b/app/qml/SettingsAdvancedTab.qml
@@ -133,6 +133,12 @@ Tab{
}
}
SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"}
+ CheckBox{
+ Layout.columnSpan: 2
+ text: qsTr("Burnin optimization (Might display timing artifacts)")
+ checked: appSettings.useFastBurnIn
+ onCheckedChanged: appSettings.useFastBurnIn = checked
+ }
}
}
}
diff --git a/app/qml/ShaderTerminal.qml b/app/qml/ShaderTerminal.qml
index d480961..ed367af 100644
--- a/app/qml/ShaderTerminal.qml
+++ b/app/qml/ShaderTerminal.qml
@@ -24,6 +24,7 @@ import QtGraphicalEffects 1.0
import "utils.js" as Utils
Item {
+ property SlowBurnIn slowBurnInEffect
property ShaderEffectSource source
property BurnInEffect burnInEffect
property ShaderEffectSource bloomSource
@@ -56,9 +57,16 @@ Item {
property real horizontalSync: appSettings.horizontalSync
property real horizontalSyncStrength: Utils.lint(0.05, 0.35, horizontalSync)
property real glowingLine: appSettings.glowingLine * 0.2
- property real burnIn: appSettings.burnIn
+
+ // Fast burnin properties
+ property real burnIn: appSettings.useFastBurnIn ? appSettings.burnIn : 0
property real burnInLastUpdate: burnInEffect.lastUpdate
property real burnInTime: burnInEffect.burnInFadeTime
+
+ // Slow burnin properties
+ property real slowBurnIn: appSettings.useFastBurnIn ? 0 : appSettings.burnIn
+ property ShaderEffectSource slowBurnInSource: slowBurnInEffect.source
+
property real jitter: appSettings.jitter
property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter)
property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight)
@@ -162,6 +170,8 @@ Item {
uniform sampler2D burnInSource;
uniform highp float burnInLastUpdate;
uniform highp float burnInTime;" : "") +
+ (slowBurnIn !== 0 ? "
+ uniform sampler2D slowBurnInSource;" : "") +
(staticNoise !== 0 ? "
uniform highp float staticNoise;" : "") +
(((staticNoise !== 0 || jitter !== 0)
@@ -292,6 +302,11 @@ Item {
txt_color = max(txt_color, convertWithChroma(burnInColor));"
: "") +
+ (slowBurnIn !== 0 ? "
+ vec4 txt_blur = texture2D(slowBurnInSource, staticCoords);
+ txt_color = max(txt_color, convertWithChroma(txt_blur.rgb * txt_blur.a));
+ " : "") +
+
"txt_color += fontColor.rgb * vec3(color);" +
"vec3 finalColor = txt_color;" +
diff --git a/app/qml/SlowBurnIn.qml b/app/qml/SlowBurnIn.qml
new file mode 100644
index 0000000..44f53e9
--- /dev/null
+++ b/app/qml/SlowBurnIn.qml
@@ -0,0 +1,122 @@
+import QtQuick 2.0
+
+import "utils.js" as Utils
+
+Loader {
+ property ShaderEffectSource source: item ? item.source : null
+
+ active: !appSettings.useFastBurnIn && appSettings.burnIn !== 0
+
+ anchors.fill: parent
+
+ sourceComponent: Item {
+ property alias source: burnInSourceEffect
+
+ property int burnInScaling: scaleTexture * appSettings.burnInQuality
+
+ ShaderEffectSource {
+ property bool updateBurnIn: false
+ property real burnIn: appSettings.burnIn
+ property real fps: appSettings.fps !== 0 ? appSettings.fps : 60
+ property real burnInFadeTime: Utils.lint(minBurnInFadeTime, maxBurnInFadeTime, burnIn)
+ property real burnInCoefficient: 1000 / (fps * burnInFadeTime)
+ property real minBurnInFadeTime: appSettings.minBurnInFadeTime
+ property real maxBurnInFadeTime: appSettings.maxBurnInFadeTime
+
+ id: burnInSourceEffect
+
+ anchors.fill: parent
+
+ sourceItem: burnInEffect
+ recursive: true
+ live: false
+ hideSource: true
+ wrapMode: kterminalSource.wrapMode
+
+ visible: false
+
+ function restartBlurSource(){
+ livetimer.restart();
+ }
+
+ // This updates the burnin synched with the timer.
+ Connections {
+ target: burnInSourceEffect.updateBurnIn ? timeManager : null
+ ignoreUnknownSignals: false
+ onTimeChanged: {
+ burnInSourceEffect.scheduleUpdate();
+ }
+ }
+
+ Timer{
+ id: livetimer
+
+ // The interval assumes 60 fps. This is the time needed burnout a white pixel.
+ // We multiply 1.1 to have a little bit of margin over the theoretical value.
+ // This solution is not extremely clean, but it's probably the best to avoid measuring fps.
+
+ interval: burnInSourceEffect.burnInFadeTime * 1.1
+ running: true
+ onTriggered: burnInSourceEffect.updateBurnIn = false;
+ }
+ Connections{
+ target: kterminal
+ onImagePainted:{
+ burnInSourceEffect.scheduleUpdate();
+ burnInSourceEffect.updateBurnIn = true;
+ livetimer.restart();
+ }
+ }
+ // Restart blurred source settings change.
+ Connections{
+ target: appSettings
+ onBurnInChanged: burnInSourceEffect.restartBlurSource();
+ onTerminalFontChanged: burnInSourceEffect.restartBlurSource();
+ onRasterizationChanged: burnInSourceEffect.restartBlurSource();
+ onBurnInQualityChanged: burnInSourceEffect.restartBlurSource();
+ }
+ Connections {
+ target: kterminalScrollbar
+ onOpacityChanged: burnInSourceEffect.restartBlurSource();
+ }
+
+ ShaderEffect {
+ id: burnInEffect
+
+ property variant txt_source: kterminalSource
+ property variant blurredSource: burnInSourceEffect
+ property real burnInCoefficient: burnInSourceEffect.burnInCoefficient
+
+ anchors.fill: parent
+ blending: false
+
+ fragmentShader:
+ "#ifdef GL_ES
+ precision mediump float;
+ #endif\n" +
+
+ "uniform lowp float qt_Opacity;" +
+ "uniform lowp sampler2D txt_source;" +
+
+ "varying highp vec2 qt_TexCoord0;
+ uniform lowp sampler2D blurredSource;
+ uniform highp float burnInCoefficient;" +
+
+ "float max3(vec3 v) {
+ return max (max (v.x, v.y), v.z);
+ }" +
+
+ "void main() {" +
+ "vec2 coords = qt_TexCoord0;" +
+ "vec3 origColor = texture2D(txt_source, coords).rgb;" +
+ "vec3 blur_color = texture2D(blurredSource, coords).rgb - vec3(burnInCoefficient);" +
+ "vec3 color = min(origColor + blur_color, max(origColor, blur_color));" +
+
+ "gl_FragColor = vec4(color, max3(color - origColor));" +
+ "}"
+
+ onStatusChanged: if (log) console.log(log) //Print warning messages
+ }
+ }
+ }
+}
diff --git a/app/qml/TerminalContainer.qml b/app/qml/TerminalContainer.qml
index ea390ab..48d6ec1 100644
--- a/app/qml/TerminalContainer.qml
+++ b/app/qml/TerminalContainer.qml
@@ -12,6 +12,7 @@ ShaderTerminal {
source: terminal.mainSource
burnInEffect: terminal.burnInEffect
+ slowBurnInEffect: terminal.slowBurnInEffect
virtual_resolution: terminal.virtualResolution
TimeManager{
diff --git a/app/qml/resources.qrc b/app/qml/resources.qrc
index 65ca840..8df465f 100644
--- a/app/qml/resources.qrc
+++ b/app/qml/resources.qrc
@@ -43,5 +43,6 @@
BurnInEffect.qml
fonts/modern-terminus/TerminusTTF-4.46.0.ttf
NewTerminalFrame.qml
+ SlowBurnIn.qml