From 166e1f40fe88603667f250c2b1633a94ff0cc095 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Thu, 8 Jan 2015 03:55:19 +0100 Subject: [PATCH 1/5] Misc fixes in settings dialog. --- app/qml/ApplicationSettings.qml | 8 +++++++ app/qml/CheckableSlider.qml | 19 +++++----------- app/qml/Components/SizedLabel.qml | 35 ++++++++++++++++++++++++++++++ app/qml/SettingsGeneralTab.qml | 1 + app/qml/SettingsPerformanceTab.qml | 19 ++++++++-------- app/qml/SettingsScreenTab.qml | 6 ++--- app/qml/SettingsTerminalTab.qml | 12 +++++----- app/qml/SimpleSlider.qml | 14 ++++-------- app/qml/resources.qrc | 1 + 9 files changed, 75 insertions(+), 40 deletions(-) create mode 100644 app/qml/Components/SizedLabel.qml diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml index b7a3b67..c3d4583 100644 --- a/app/qml/ApplicationSettings.qml +++ b/app/qml/ApplicationSettings.qml @@ -19,6 +19,7 @@ *******************************************************************************/ import QtQuick 2.2 +import QtQuick.Controls 1.0 import "utils.js" as Utils @@ -455,4 +456,11 @@ QtObject{ storeCustomProfiles(); //storage.dropSettings(); //DROPS THE SETTINGS!.. REMEMBER TO DISABLE ONCE ENABLED!! } + + // VARS /////////////////////////////////////////////////////////////////// + + property Label _sampleLabel: Label { + text: "100%" + } + property real labelWidth: _sampleLabel.width } diff --git a/app/qml/CheckableSlider.qml b/app/qml/CheckableSlider.qml index ceb9c4f..086eeb7 100644 --- a/app/qml/CheckableSlider.qml +++ b/app/qml/CheckableSlider.qml @@ -22,6 +22,8 @@ import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Layouts 1.1 +import "Components" + RowLayout { property alias name: check.text @@ -35,7 +37,6 @@ RowLayout { id: setting_component anchors.left: parent.left anchors.right: parent.right - spacing: 25 onValueChanged: { check.checked = !(value == 0); @@ -45,7 +46,7 @@ RowLayout { CheckBox{ id: check - implicitWidth: 150 + implicitWidth: 160 onClicked: { if(!checked){ checked = false; @@ -66,16 +67,8 @@ RowLayout { newValue(value); } } - Text{ - id: textfield - property string unformattedText: Math.round(((value - min_value) / (max_value - min_value)) * 100) - text: formatNumber(unformattedText) - } - function formatNumber(num) { - var n = "" + num; - while (n.length < 3) { - n = " " + n; - } - return n + "%"; + SizedLabel { + anchors { top: parent.top; bottom: parent.bottom } + text: Math.round(((value - min_value) / (max_value - min_value)) * 100) + "%" } } diff --git a/app/qml/Components/SizedLabel.qml b/app/qml/Components/SizedLabel.qml new file mode 100644 index 0000000..a3dbfea --- /dev/null +++ b/app/qml/Components/SizedLabel.qml @@ -0,0 +1,35 @@ +/******************************************************************************* +* Copyright (c) 2013 "Filippo Scognamiglio" +* https://github.com/Swordfish90/cool-retro-term +* +* This file is part of cool-retro-term. +* +* cool-retro-term is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*******************************************************************************/ + + +import QtQuick 2.0 +import QtQuick.Controls 1.0 + +// This component is simply a label with a predifined size. +// Used to improve alignment. + +Item { + property alias text: textfield.text + width: appSettings.labelWidth + Label{ + id: textfield + anchors { right: parent.right; verticalCenter: parent.verticalCenter } + } +} diff --git a/app/qml/SettingsGeneralTab.qml b/app/qml/SettingsGeneralTab.qml index 18f72a6..80dfa9a 100644 --- a/app/qml/SettingsGeneralTab.qml +++ b/app/qml/SettingsGeneralTab.qml @@ -88,6 +88,7 @@ Tab{ Item { // Spacing Layout.fillHeight: true + visible: false } Button{ Layout.fillWidth: true diff --git a/app/qml/SettingsPerformanceTab.qml b/app/qml/SettingsPerformanceTab.qml index 7d938a8..bf821c0 100644 --- a/app/qml/SettingsPerformanceTab.qml +++ b/app/qml/SettingsPerformanceTab.qml @@ -22,6 +22,8 @@ import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Layouts 1.1 +import "Components" + Tab{ ColumnLayout{ anchors.fill: parent @@ -47,10 +49,10 @@ Tab{ maximumValue: 60 minimumValue: 1 enabled: appSettings.fps !== 0 - value: appSettings.fps !== 0 ? appSettings.fps : 60 + value: appSettings.fps !== 0 ? appSettings.fps : 24 } - Text{text: slider.value} - Text{text: qsTr("Texture Quality")} + SizedLabel { text: slider.value } + Label{text: qsTr("Texture Quality")} Slider{ Layout.fillWidth: true id: txtslider @@ -63,7 +65,7 @@ Tab{ enabled = true; } } - Text{text: Math.round(txtslider.value * 100) + "%"} + SizedLabel{text: Math.round(txtslider.value * 100) + "%"} } } GroupBox{ @@ -74,8 +76,7 @@ Tab{ GridLayout{ id: bloomQualityContainer anchors.fill: parent - - Text{text: qsTr("Bloom Quality")} + Label{text: qsTr("Bloom Quality")} Slider{ Layout.fillWidth: true id: bloomSlider @@ -88,7 +89,7 @@ Tab{ enabled = true; } } - Text{text: Math.round(bloomSlider.value * 100) + "%"} + SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"} } } GroupBox{ @@ -100,7 +101,7 @@ Tab{ id: blurQualityContainer anchors.fill: parent - Text{text: qsTr("BurnIn Quality")} + Label{text: qsTr("BurnIn Quality")} Slider{ Layout.fillWidth: true id: burnInSlider @@ -113,7 +114,7 @@ Tab{ enabled = true; } } - Text{text: Math.round(burnInSlider.value * 100) + "%"} + SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"} } } GroupBox{ diff --git a/app/qml/SettingsScreenTab.qml b/app/qml/SettingsScreenTab.qml index 7374624..5777e65 100644 --- a/app/qml/SettingsScreenTab.qml +++ b/app/qml/SettingsScreenTab.qml @@ -46,17 +46,17 @@ Tab{ GridLayout{ anchors.fill: parent columns: 2 - Text{ text: qsTr("Brightness") } + Label{ text: qsTr("Brightness") } SimpleSlider{ onValueChanged: appSettings.brightness = value value: appSettings.brightness } - Text{ text: qsTr("Contrast") } + Label{ text: qsTr("Contrast") } SimpleSlider{ onValueChanged: appSettings.contrast = value value: appSettings.contrast } - Text{ text: qsTr("Opacity") } + Label{ text: qsTr("Opacity") } SimpleSlider{ onValueChanged: appSettings.windowOpacity = value value: appSettings.windowOpacity diff --git a/app/qml/SettingsTerminalTab.qml b/app/qml/SettingsTerminalTab.qml index 439ee8e..ae0e719 100644 --- a/app/qml/SettingsTerminalTab.qml +++ b/app/qml/SettingsTerminalTab.qml @@ -22,6 +22,8 @@ import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Layouts 1.1 +import "Components" + Tab{ ColumnLayout{ anchors.fill: parent @@ -32,7 +34,7 @@ Tab{ GridLayout{ anchors.fill: parent columns: 2 - Text{ text: qsTr("Name") } + Label{ text: qsTr("Name") } ComboBox{ id: fontChanger Layout.fillWidth: true @@ -54,7 +56,7 @@ Tab{ } Component.onCompleted: updateIndex(); } - Text{ text: qsTr("Scaling") } + Label{ text: qsTr("Scaling") } RowLayout{ Layout.fillWidth: true Slider{ @@ -74,11 +76,11 @@ Tab{ onFontScalingChanged: fontScalingChanger.value = appSettings.fontScaling; } } - Text{ + SizedLabel{ text: Math.round(fontScalingChanger.value * 100) + "%" } } - Text{ text: qsTr("Font Width") } + Label{ text: qsTr("Font Width") } RowLayout{ Layout.fillWidth: true Slider{ @@ -93,7 +95,7 @@ Tab{ maximumValue = 1.5; } } - Text{ + SizedLabel{ text: Math.round(widthChanger.value * 100) + "%" } } diff --git a/app/qml/SimpleSlider.qml b/app/qml/SimpleSlider.qml index 7b741aa..44d3608 100644 --- a/app/qml/SimpleSlider.qml +++ b/app/qml/SimpleSlider.qml @@ -22,6 +22,8 @@ import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Layouts 1.1 +import "Components" + RowLayout { property alias value: slider.value property alias stepSize: slider.stepSize @@ -36,15 +38,7 @@ RowLayout { stepSize: parent.stepSize Layout.fillWidth: true } - Text{ - id: textfield - text: formatNumber(Math.round(value * maxMultiplier)) - } - function formatNumber(num) { - var n = "" + num; - while (n.length < 3) { - n = " " + n; - } - return n + "%"; + SizedLabel{ + text: Math.round(value * maxMultiplier) + "%" } } diff --git a/app/qml/resources.qrc b/app/qml/resources.qrc index ac03023..6cb8a7c 100644 --- a/app/qml/resources.qrc +++ b/app/qml/resources.qrc @@ -51,5 +51,6 @@ fonts/modern-inconsolata/Inconsolata.otf SettingsScreenTab.qml fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf + Components/SizedLabel.qml From a7bab660e960787d7f25045cac01b76521ca763e Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Mon, 19 Jan 2015 17:31:37 +0100 Subject: [PATCH 2/5] Improved burnin. This is a very important optimizatoin for mesa linux machines. --- app/qml/PreprocessedTerminal.qml | 34 +++++++++++++++++++++----------- app/qml/ShaderTerminal.qml | 7 ++----- qmltermwidget | 2 +- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index b5fcdbe..7d3988e 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -44,11 +44,13 @@ Item{ anchors.topMargin: frame.displacementTop * appSettings.windowScaling anchors.bottomMargin: frame.displacementBottom * appSettings.windowScaling - //The blur effect has to take into account the framerate - property real mBlur: Math.sqrt(appSettings.burnIn) - property real motionBlurCoefficient: Utils.lint(_minBlurCoefficient, _maxBlurCoefficient, mBlur) - property real _minBlurCoefficient: 0.2 - property real _maxBlurCoefficient: 0.02 + //Parameters for the burnIn effect. + property real burnIn: appSettings.burnIn + property real fps: appSettings.fps !== 0 ? appSettings.fps : 60 + property real burnInFadeTime: Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn) + property real motionBlurCoefficient: 1.0 / (fps * burnInFadeTime) + property real _minBurnInFadeTime: 0.16 + property real _maxBurnInFadeTime: 1.6 property size terminalSize: kterminal.terminalSize property size fontMetrics: kterminal.fontMetrics @@ -228,13 +230,15 @@ Item{ Loader{ id: blurredSourceLoader asynchronous: true - active: mBlur !== 0 + active: burnIn !== 0 sourceComponent: ShaderEffectSource{ + property bool updateBurnIn: false + id: _blurredSourceEffect sourceItem: blurredTerminalLoader.item recursive: true - live: true + live: false hideSource: true wrapMode: kterminalSource.wrapMode @@ -244,6 +248,13 @@ Item{ livetimer.restart(); } + // This updates the burnin synched with the timer. + Connections { + target: updateBurnIn ? mainShader : null + ignoreUnknownSignals: false + onTimeChanged: _blurredSourceEffect.scheduleUpdate(); + } + Timer{ id: livetimer @@ -251,14 +262,15 @@ Item{ // 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: (1 / motionBlurCoefficient) * 60 * 1.1 + interval: burnInFadeTime * 1000 * 1.1 running: true - onTriggered: _blurredSourceEffect.live = false; + onTriggered: _blurredSourceEffect.updateBurnIn = false; } Connections{ target: kterminal onImagePainted:{ - _blurredSourceEffect.live = true; + _blurredSourceEffect.scheduleUpdate(); + _blurredSourceEffect.updateBurnIn = true; livetimer.restart(); } } @@ -289,7 +301,7 @@ Item{ ? kterminal.height * Math.max(1, burnInScaling) : kterminal.height * scaleTexture * appSettings.burnInQuality - active: mBlur !== 0 + active: burnIn !== 0 asynchronous: true sourceComponent: ShaderEffect { diff --git a/app/qml/ShaderTerminal.qml b/app/qml/ShaderTerminal.qml index e9b91c3..aa024b0 100644 --- a/app/qml/ShaderTerminal.qml +++ b/app/qml/ShaderTerminal.qml @@ -26,8 +26,6 @@ ShaderEffect { property ShaderEffectSource blurredSource property ShaderEffectSource bloomSource - property real liveBlur: blurredSource && blurredSource.live ? 1.0 : 0.0 - property color fontColor: appSettings.fontColor property color backgroundColor: appSettings.backgroundColor property real bloom: appSettings.bloom * 2.5 @@ -162,8 +160,7 @@ ShaderEffect { uniform highp sampler2D bloomSource; uniform lowp float bloom;" : "") + (burnIn !== 0 ? " - uniform sampler2D blurredSource; - uniform lowp float liveBlur;" : "") + + uniform sampler2D blurredSource;" : "") + (staticNoise !== 0 ? " uniform highp float staticNoise;" : "") + (((staticNoise !== 0 || jitter !== 0 || rbgShift) @@ -269,7 +266,7 @@ ShaderEffect { "vec3 txt_color = texture2D(source, txt_coords).rgb;" + (burnIn !== 0 ? " - vec4 txt_blur = liveBlur * texture2D(blurredSource, txt_coords); + vec4 txt_blur = texture2D(blurredSource, txt_coords); txt_color = txt_color + txt_blur.rgb * txt_blur.a;" : "") + diff --git a/qmltermwidget b/qmltermwidget index 4b3fd27..dbf93d1 160000 --- a/qmltermwidget +++ b/qmltermwidget @@ -1 +1 @@ -Subproject commit 4b3fd2729bac10a8e292bcf027737509d10e9c74 +Subproject commit dbf93d175c66ab9d6cdbf42443569d4a1c83c5b2 From 32f792365297b7613215011f7825cabb5428d475 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Mon, 19 Jan 2015 18:20:23 +0100 Subject: [PATCH 3/5] Fix: use arrow cursor when terminal application uses mouse. --- app/qml/PreprocessedTerminal.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index 7d3988e..1e6d2a0 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -178,7 +178,7 @@ Item{ MouseArea{ acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton anchors.fill: parent - cursorShape: Qt.IBeamCursor + cursorShape: kterminal.terminalUsesMouse ? Qt.ArrowCursor : Qt.IBeamCursor onWheel:{ if(wheel.modifiers & Qt.ControlModifier){ wheel.angleDelta.y > 0 ? zoomIn.trigger() : zoomOut.trigger(); From 2bc88768b6951ce4fd4b3b1a634919b02f03ded6 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Tue, 20 Jan 2015 00:57:23 +0100 Subject: [PATCH 4/5] Reduce minimum scaling value and fix aliasing issues with small fonts and rasterization. --- app/qml/ApplicationSettings.qml | 11 ++++++++--- app/qml/SettingsTerminalTab.qml | 4 ++-- app/qml/ShaderTerminal.qml | 15 +++++++++++++-- app/qml/utils.js | 8 +++++++- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml index c3d4583..1b4fd8b 100644 --- a/app/qml/ApplicationSettings.qml +++ b/app/qml/ApplicationSettings.qml @@ -26,7 +26,12 @@ import "utils.js" as Utils QtObject{ property string version: "1.0.0 RC1" - // GENERAL SETTINGS /////////////////////////////////////////////////// + // STATIC CONSTANTS //////////////////////////////////////////////////////// + + readonly property real minimumFontScaling: 0.25 + readonly property real maximumFontScaling: 2.50 + + // GENERAL SETTINGS /////////////////////////////////////////////////////// property bool fullscreen: false property bool showMenubar: true @@ -114,12 +119,12 @@ QtObject{ } function incrementScaling(){ - fontScaling = Math.min(fontScaling + 0.05, 2.50); + fontScaling = Math.min(fontScaling + 0.05, maximumFontScaling); handleFontChanged(); } function decrementScaling(){ - fontScaling = Math.max(fontScaling - 0.05, 0.50); + fontScaling = Math.max(fontScaling - 0.05, minimumFontScaling); handleFontChanged(); } diff --git a/app/qml/SettingsTerminalTab.qml b/app/qml/SettingsTerminalTab.qml index ae0e719..32f458f 100644 --- a/app/qml/SettingsTerminalTab.qml +++ b/app/qml/SettingsTerminalTab.qml @@ -66,8 +66,8 @@ Tab{ stepSize: 0.05 enabled: false // Another trick to fix initial bad behavior. Component.onCompleted: { - minimumValue = 0.5; - maximumValue = 2.5; + minimumValue = appSettings.minimumFontScaling; + maximumValue = appSettings.maximumFontScaling; value = appSettings.fontScaling; enabled = true; } diff --git a/app/qml/ShaderTerminal.qml b/app/qml/ShaderTerminal.qml index aa024b0..f3478e2 100644 --- a/app/qml/ShaderTerminal.qml +++ b/app/qml/ShaderTerminal.qml @@ -21,6 +21,8 @@ import QtQuick 2.2 import QtGraphicalEffects 1.0 +import "utils.js" as Utils + ShaderEffect { property ShaderEffectSource source property ShaderEffectSource blurredSource @@ -56,6 +58,12 @@ ShaderEffect { property real screen_brightness: appSettings.brightness * 1.5 + 0.5 + // This is the average value of the abs(sin) function. Needed to avoid aliasing. + readonly property real absSinAvg: 0.63661828335466886 + property size rasterizationSmooth: Qt.size( + Utils.clamp(2.0 * virtual_resolution.width / width, 0.0, 1.0), + Utils.clamp(2.0 * virtual_resolution.height / height, 0.0, 1.0)) + property real dispX property real dispY property size virtual_resolution @@ -153,6 +161,7 @@ ShaderEffect { uniform lowp float screen_brightness; uniform highp vec2 virtual_resolution; + uniform highp vec2 rasterizationSmooth; uniform highp float dispX; uniform highp float dispY;" + @@ -198,9 +207,11 @@ ShaderEffect { highp float result = 1.0;" + (appSettings.rasterization != appSettings.no_rasterization ? - "result *= abs(sin(coords.y * virtual_resolution.y * "+Math.PI+"));" : "") + + "float val = abs(sin(coords.y * virtual_resolution.y * "+Math.PI+")); + result *= mix(val, " + absSinAvg + ", rasterizationSmooth.y);" : "") + (appSettings.rasterization == appSettings.pixel_rasterization ? - "result *= abs(sin(coords.x * virtual_resolution.x * "+Math.PI+"));" : "") + " + "val = abs(sin(coords.x * virtual_resolution.x * "+Math.PI+")); + result *= mix(val, " + absSinAvg + ", rasterizationSmooth.x);" : "") + " return result; } diff --git a/app/qml/utils.js b/app/qml/utils.js index b7daf2d..ba8ae04 100644 --- a/app/qml/utils.js +++ b/app/qml/utils.js @@ -1,5 +1,11 @@ .pragma library - +function clamp(x, min, max) { + if (x <= min) + return min; + if (x >= max) + return max; + return x; +} function lint(a, b, t) { return (1 - t) * a + (t) * b; } From 265e19def803f0f952ee8f9686cb77d0792e1586 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Tue, 20 Jan 2015 01:05:27 +0100 Subject: [PATCH 5/5] Revert invisibility of spacing item in settings dialog. --- app/qml/SettingsGeneralTab.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/qml/SettingsGeneralTab.qml b/app/qml/SettingsGeneralTab.qml index 80dfa9a..18f72a6 100644 --- a/app/qml/SettingsGeneralTab.qml +++ b/app/qml/SettingsGeneralTab.qml @@ -88,7 +88,6 @@ Tab{ Item { // Spacing Layout.fillHeight: true - visible: false } Button{ Layout.fillWidth: true