mirror of
				https://github.com/Swordfish90/cool-retro-term.git
				synced 2025-10-31 15:12:28 +00:00 
			
		
		
		
	Merge pull request #665 from Swordfish90/unstable
Improve rasterization and terminal frame. Some refactoring.
This commit is contained in:
		| @@ -1,3 +1,22 @@ | |||||||
|  | /******************************************************************************* | ||||||
|  | * Copyright (c) 2013-2021 "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 <http://www.gnu.org/licenses/>. | ||||||
|  | *******************************************************************************/ | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.2 | import QtQuick.Controls 2.2 | ||||||
| import QtQuick.Layouts 1.1 | import QtQuick.Layouts 1.1 | ||||||
| @@ -18,7 +37,10 @@ Window{ | |||||||
|         Text { |         Text { | ||||||
|             Layout.alignment: Qt.AlignHCenter |             Layout.alignment: Qt.AlignHCenter | ||||||
|             text: "cool-retro-term" |             text: "cool-retro-term" | ||||||
|             font {bold: true; pointSize: 18} |             font { | ||||||
|  |                 bold: true | ||||||
|  |                 pointSize: 18 | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         Loader { |         Loader { | ||||||
|             id: mainContent |             id: mainContent | ||||||
| @@ -41,7 +63,7 @@ Window{ | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             ] |             ] | ||||||
|             Component.onCompleted: mainContent.state = "Default"; |             Component.onCompleted: mainContent.state = "Default" | ||||||
|         } |         } | ||||||
|         Item { |         Item { | ||||||
|             Layout.fillWidth: true |             Layout.fillWidth: true | ||||||
| @@ -50,13 +72,14 @@ Window{ | |||||||
|                 anchors.left: parent.left |                 anchors.left: parent.left | ||||||
|                 text: qsTr("License") |                 text: qsTr("License") | ||||||
|                 onClicked: { |                 onClicked: { | ||||||
|                     mainContent.state == "Default" ? mainContent.state = "License" : mainContent.state = "Default" |                     mainContent.state == "Default" ? mainContent.state | ||||||
|  |                                                      = "License" : mainContent.state = "Default" | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             Button { |             Button { | ||||||
|                 anchors.right: parent.right |                 anchors.right: parent.right | ||||||
|                 text: qsTr("Close") |                 text: qsTr("Close") | ||||||
|                 onClicked: dialogwindow.close(); |                 onClicked: dialogwindow.close() | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -77,10 +100,10 @@ Window{ | |||||||
|             Text { |             Text { | ||||||
|                 Layout.alignment: Qt.AlignCenter |                 Layout.alignment: Qt.AlignCenter | ||||||
|                 horizontalAlignment: Text.AlignHCenter |                 horizontalAlignment: Text.AlignHCenter | ||||||
|                 text: appSettings.version + "\n" + |                 text: appSettings.version + "\n" + qsTr( | ||||||
|                       qsTr("Author: ") + "Filippo Scognamiglio\n" + |                           "Author: ") + "Filippo Scognamiglio\n" + qsTr( | ||||||
|                       qsTr("Email: ")  + "flscogna@gmail.com\n" + |                           "Email: ") + "flscogna@gmail.com\n" + qsTr( | ||||||
|                       qsTr("Source: ") + "https://github.com/Swordfish90/cool-retro-term\n" |                           "Source: ") + "https://github.com/Swordfish90/cool-retro-term\n" | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -92,21 +115,18 @@ Window{ | |||||||
|             TextArea { |             TextArea { | ||||||
|                 readOnly: true |                 readOnly: true | ||||||
|                 wrapMode: TextEdit.Wrap |                 wrapMode: TextEdit.Wrap | ||||||
|                 text: "Copyright (c) 2013 Filippo Scognamiglio <flscogna@gmail.com>\n\n" + |                 text: "Copyright (c) 2013-2021 Filippo Scognamiglio <flscogna@gmail.com>\n\n" | ||||||
|                       "https://github.com/Swordfish90/cool-retro-term\n\n" + |                       + "https://github.com/Swordfish90/cool-retro-term\n\n" + | ||||||
|  |                       "cool-retro-term is free software: you can redistribute it and/or modify " | ||||||
|                       "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 " | ||||||
|                       "it under the terms of the GNU General Public License as published by " + |                       + "the Free Software Foundation, either version 3 of the License, or " | ||||||
|                       "the Free Software Foundation, either version 3 of the License, or " + |                       + "(at your option) any later version.\n\n" + | ||||||
|                       "(at your option) any later version.\n\n" + |                       "This program is distributed in the hope that it will be useful, " | ||||||
|  |                       + "but WITHOUT ANY WARRANTY; without even the implied warranty of " | ||||||
|                       "This program is distributed in the hope that it will be useful, " + |                       + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the " | ||||||
|                       "but WITHOUT ANY WARRANTY; without even the implied warranty of " + |                       + "GNU General Public License for more details.\n\n" + | ||||||
|                       "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the " + |                       "You should have received a copy of the GNU General Public License " | ||||||
|                       "GNU General Public License for more details.\n\n" + |                       + "along with this program.  If not, see <http://www.gnu.org/licenses/>." | ||||||
|  |  | ||||||
|                       "You should have received a copy of the GNU General Public License " + |  | ||||||
|                       "along with this program.  If not, see <http://www.gnu.org/licenses/>." |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,7 +17,6 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.0 | import QtQuick.Controls 2.0 | ||||||
|  |  | ||||||
| @@ -28,7 +27,6 @@ QtObject{ | |||||||
|     readonly property int profileVersion: 2 |     readonly property int profileVersion: 2 | ||||||
|  |  | ||||||
|     // STATIC CONSTANTS //////////////////////////////////////////////////////// |     // STATIC CONSTANTS //////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     readonly property real screenCurvatureSize: 0.4 |     readonly property real screenCurvatureSize: 0.4 | ||||||
|     readonly property real minimumFontScaling: 0.25 |     readonly property real minimumFontScaling: 0.25 | ||||||
|     readonly property real maximumFontScaling: 2.50 |     readonly property real maximumFontScaling: 2.50 | ||||||
| @@ -37,7 +35,6 @@ QtObject{ | |||||||
|     readonly property real maxBurnInFadeTime: 1600 |     readonly property real maxBurnInFadeTime: 1600 | ||||||
|  |  | ||||||
|     // GENERAL SETTINGS /////////////////////////////////////////////////////// |     // GENERAL SETTINGS /////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     property int x: 100 |     property int x: 100 | ||||||
|     property int y: 100 |     property int y: 100 | ||||||
|     property int width: 1024 |     property int width: 1024 | ||||||
| @@ -61,10 +58,9 @@ QtObject{ | |||||||
|  |  | ||||||
|     property bool blinkingCursor: false |     property bool blinkingCursor: false | ||||||
|  |  | ||||||
|     onWindowScalingChanged: handleFontChanged(); |     onWindowScalingChanged: handleFontChanged() | ||||||
|  |  | ||||||
|     // PROFILE SETTINGS /////////////////////////////////////////////////////// |     // PROFILE SETTINGS /////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     property real windowOpacity: 1.0 |     property real windowOpacity: 1.0 | ||||||
|     property real ambientLight: 0.2 |     property real ambientLight: 0.2 | ||||||
|     property real contrast: 0.80 |     property real contrast: 0.80 | ||||||
| @@ -75,9 +71,16 @@ QtObject{ | |||||||
|  |  | ||||||
|     property string _backgroundColor: "#000000" |     property string _backgroundColor: "#000000" | ||||||
|     property string _fontColor: "#ff8100" |     property string _fontColor: "#ff8100" | ||||||
|     property string saturatedColor: Utils.mix(Utils.strToColor("#FFFFFF"), Utils.strToColor(_fontColor), saturationColor * 0.5) |     property string saturatedColor: Utils.mix(Utils.strToColor("#FFFFFF"), | ||||||
|     property color fontColor: Utils.mix(Utils.strToColor(saturatedColor), Utils.strToColor(_backgroundColor), 0.7 + (contrast * 0.3)) |                                               Utils.strToColor(_fontColor), | ||||||
|     property color backgroundColor: Utils.mix(Utils.strToColor(_backgroundColor), Utils.strToColor(saturatedColor), 0.7 + (contrast * 0.3)) |                                               saturationColor * 0.5) | ||||||
|  |     property color fontColor: Utils.mix(Utils.strToColor(saturatedColor), | ||||||
|  |                                         Utils.strToColor(_backgroundColor), | ||||||
|  |                                         0.7 + (contrast * 0.3)) | ||||||
|  |     property color backgroundColor: Utils.mix(Utils.strToColor( | ||||||
|  |                                                   _backgroundColor), | ||||||
|  |                                               Utils.strToColor(saturatedColor), | ||||||
|  |                                               0.7 + (contrast * 0.3)) | ||||||
|  |  | ||||||
|     property real staticNoise: 0.12 |     property real staticNoise: 0.12 | ||||||
|     property real screenCurvature: 0.3 |     property real screenCurvature: 0.3 | ||||||
| @@ -96,16 +99,21 @@ QtObject{ | |||||||
|     property real rbgShift: 0.0 |     property real rbgShift: 0.0 | ||||||
|  |  | ||||||
|     property real _margin: 0.5 |     property real _margin: 0.5 | ||||||
|  |     property real _frameMargin: 0.5 | ||||||
|  |  | ||||||
|     property real margin: Utils.lint(1.0, 20.0, _margin) |     property real margin: Utils.lint(1.0, 20.0, _margin) | ||||||
|  |     property real frameMargin: Utils.lint(1.0, 50.0, _frameMargin) | ||||||
|  |  | ||||||
|  |     property real totalMargin: frameMargin + margin | ||||||
|  |  | ||||||
|     readonly property int no_rasterization: 0 |     readonly property int no_rasterization: 0 | ||||||
|     readonly property int scanline_rasterization: 1 |     readonly property int scanline_rasterization: 1 | ||||||
|     readonly property int pixel_rasterization: 2 |     readonly property int pixel_rasterization: 2 | ||||||
|  |     readonly property int subpixel_rasterization: 3 | ||||||
|  |  | ||||||
|     property int rasterization: no_rasterization |     property int rasterization: no_rasterization | ||||||
|  |  | ||||||
|     // FONTS ////////////////////////////////////////////////////////////////// |     // FONTS ////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     readonly property real baseFontScaling: 0.75 |     readonly property real baseFontScaling: 0.75 | ||||||
|     property real fontScaling: 1.0 |     property real fontScaling: 1.0 | ||||||
|     property real totalFontScaling: baseFontScaling * fontScaling |     property real totalFontScaling: baseFontScaling * fontScaling | ||||||
| @@ -119,16 +127,38 @@ QtObject{ | |||||||
|  |  | ||||||
|     signal terminalFontChanged(string fontFamily, int pixelSize, int lineSpacing, real screenScaling, real fontWidth) |     signal terminalFontChanged(string fontFamily, int pixelSize, int lineSpacing, real screenScaling, real fontWidth) | ||||||
|  |  | ||||||
|     signal initializedSettings() |     signal initializedSettings | ||||||
|  |  | ||||||
|     property Loader fontManager: Loader { |     property Loader fontManager: Loader { | ||||||
|         states: [ |         states: [ | ||||||
|             State { when: rasterization == no_rasterization |             State { | ||||||
|                 PropertyChanges {target: fontManager; source: "Fonts.qml" } }, |                 when: rasterization == no_rasterization | ||||||
|             State { when: rasterization == scanline_rasterization |                 PropertyChanges { | ||||||
|                 PropertyChanges {target: fontManager; source: "FontScanlines.qml" } }, |                     target: fontManager | ||||||
|             State { when: rasterization == pixel_rasterization; |                     source: "Fonts.qml" | ||||||
|                 PropertyChanges {target: fontManager; source: "FontPixels.qml" } } |                 } | ||||||
|  |             }, | ||||||
|  |             State { | ||||||
|  |                 when: rasterization == scanline_rasterization | ||||||
|  |                 PropertyChanges { | ||||||
|  |                     target: fontManager | ||||||
|  |                     source: "FontScanlines.qml" | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             State { | ||||||
|  |                 when: rasterization == pixel_rasterization | ||||||
|  |                 PropertyChanges { | ||||||
|  |                     target: fontManager | ||||||
|  |                     source: "FontPixels.qml" | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             State { | ||||||
|  |                 when: rasterization == subpixel_rasterization | ||||||
|  |                 PropertyChanges { | ||||||
|  |                     target: fontManager | ||||||
|  |                     source: "FontPixels.qml" | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|         ] |         ] | ||||||
|  |  | ||||||
|         onLoaded: handleFontChanged() |         onLoaded: handleFontChanged() | ||||||
| @@ -136,151 +166,159 @@ QtObject{ | |||||||
|  |  | ||||||
|     property FontLoader fontLoader: FontLoader {} |     property FontLoader fontLoader: FontLoader {} | ||||||
|  |  | ||||||
|     onTotalFontScalingChanged: handleFontChanged(); |     onTotalFontScalingChanged: handleFontChanged() | ||||||
|     onFontWidthChanged: handleFontChanged(); |     onFontWidthChanged: handleFontChanged() | ||||||
|  |  | ||||||
|     function getIndexByName(name) { |     function getIndexByName(name) { | ||||||
|         for (var i = 0; i < fontlist.count; i++) { |         for (var i = 0; i < fontlist.count; i++) { | ||||||
|             var requestedName = fontlist.get(i).name; |             var requestedName = fontlist.get(i).name | ||||||
|             if (name === requestedName) |             if (name === requestedName) | ||||||
|                 return i; |                 return i | ||||||
|         } |         } | ||||||
|         return 0; // If the font is not available default to 0. |         return 0 // If the font is not available default to 0. | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function incrementScaling() { |     function incrementScaling() { | ||||||
|         fontScaling = Math.min(fontScaling + 0.05, maximumFontScaling); |         fontScaling = Math.min(fontScaling + 0.05, maximumFontScaling) | ||||||
|         handleFontChanged(); |         handleFontChanged() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function decrementScaling() { |     function decrementScaling() { | ||||||
|         fontScaling = Math.max(fontScaling - 0.05, minimumFontScaling); |         fontScaling = Math.max(fontScaling - 0.05, minimumFontScaling) | ||||||
|         handleFontChanged(); |         handleFontChanged() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function handleFontChanged() { |     function handleFontChanged() { | ||||||
|         if (!fontManager.item) return; |         if (!fontManager.item) | ||||||
|  |             return | ||||||
|  |  | ||||||
|         var index = getIndexByName(fontNames[rasterization]); |         var index = getIndexByName(fontNames[rasterization]) | ||||||
|         if (index === undefined) return; |         if (index === undefined) | ||||||
|  |             return | ||||||
|  |  | ||||||
|         fontManager.item.selectedFontIndex = index; |         fontManager.item.selectedFontIndex = index | ||||||
|         fontManager.item.scaling = totalFontScaling; |         fontManager.item.scaling = totalFontScaling | ||||||
|  |  | ||||||
|         var fontSource = fontManager.item.source; |         var fontSource = fontManager.item.source | ||||||
|         var pixelSize = fontManager.item.pixelSize; |         var pixelSize = fontManager.item.pixelSize | ||||||
|         var lineSpacing = fontManager.item.lineSpacing; |         var lineSpacing = fontManager.item.lineSpacing | ||||||
|         var screenScaling = fontManager.item.screenScaling; |         var screenScaling = fontManager.item.screenScaling | ||||||
|         var fontWidth = fontManager.item.defaultFontWidth * appSettings.fontWidth; |         var fontWidth = fontManager.item.defaultFontWidth * appSettings.fontWidth | ||||||
|         var fontFamily = fontManager.item.family; |         var fontFamily = fontManager.item.family | ||||||
|         var isSystemFont = fontManager.item.isSystemFont; |         var isSystemFont = fontManager.item.isSystemFont | ||||||
|  |  | ||||||
|         lowResolutionFont = fontManager.item.lowResolutionFont; |         lowResolutionFont = fontManager.item.lowResolutionFont | ||||||
|  |  | ||||||
|         if (!isSystemFont) { |         if (!isSystemFont) { | ||||||
|             fontLoader.source = fontSource; |             fontLoader.source = fontSource | ||||||
|             fontFamily = fontLoader.name; |             fontFamily = fontLoader.name | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         terminalFontChanged(fontFamily, pixelSize, lineSpacing, screenScaling, fontWidth); |         terminalFontChanged(fontFamily, pixelSize, lineSpacing, screenScaling, | ||||||
|  |                             fontWidth) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     property Storage storage: Storage {} |     property Storage storage: Storage {} | ||||||
|  |  | ||||||
|     function stringify(obj) { |     function stringify(obj) { | ||||||
|         var replacer = function (key, val) { |         var replacer = function (key, val) { | ||||||
|             return val.toFixed ? Number(val.toFixed(4)) : val; |             return val.toFixed ? Number(val.toFixed(4)) : val | ||||||
|         } |         } | ||||||
|         return JSON.stringify(obj, replacer, 2); |         return JSON.stringify(obj, replacer, 2) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function composeSettingsString() { |     function composeSettingsString() { | ||||||
|         var settings = { |         var settings = { | ||||||
|             fps: fps, |             "fps": fps, | ||||||
|             x: x, |             "x": x, | ||||||
|             y: y, |             "y": y, | ||||||
|             width: width, |             "width": width, | ||||||
|             height: height, |             "height": height, | ||||||
|             windowScaling: windowScaling, |             "windowScaling": windowScaling, | ||||||
|             showTerminalSize: showTerminalSize, |             "showTerminalSize": showTerminalSize, | ||||||
|             fontScaling: fontScaling, |             "fontScaling": fontScaling, | ||||||
|             fontNames: fontNames, |             "fontNames": fontNames, | ||||||
|             showMenubar: showMenubar, |             "showMenubar": showMenubar, | ||||||
|             bloomQuality: bloomQuality, |             "bloomQuality": bloomQuality, | ||||||
|             burnInQuality: burnInQuality, |             "burnInQuality": burnInQuality, | ||||||
|             useCustomCommand: useCustomCommand, |             "useCustomCommand": useCustomCommand, | ||||||
|             customCommand: customCommand, |             "customCommand": customCommand, | ||||||
|             useFastBurnIn: useFastBurnIn, |             "useFastBurnIn": useFastBurnIn | ||||||
|             blinkingCursor: blinkingCursor |  | ||||||
|         } |         } | ||||||
|         return stringify(settings); |         return stringify(settings) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function composeProfileObject() { |     function composeProfileObject() { | ||||||
|         var settings = { |         var settings = { | ||||||
|             backgroundColor: _backgroundColor, |             "backgroundColor": _backgroundColor, | ||||||
|             fontColor: _fontColor, |             "fontColor": _fontColor, | ||||||
|             flickering: flickering, |             "flickering": flickering, | ||||||
|             horizontalSync: horizontalSync, |             "horizontalSync": horizontalSync, | ||||||
|             staticNoise: staticNoise, |             "staticNoise": staticNoise, | ||||||
|             chromaColor: chromaColor, |             "chromaColor": chromaColor, | ||||||
|             saturationColor: saturationColor, |             "saturationColor": saturationColor, | ||||||
|             screenCurvature: screenCurvature, |             "screenCurvature": screenCurvature, | ||||||
|             glowingLine: glowingLine, |             "glowingLine": glowingLine, | ||||||
|             burnIn: burnIn, |             "burnIn": burnIn, | ||||||
|             bloom: bloom, |             "bloom": bloom, | ||||||
|             rasterization: rasterization, |             "rasterization": rasterization, | ||||||
|             jitter: jitter, |             "jitter": jitter, | ||||||
|             rbgShift: rbgShift, |             "rbgShift": rbgShift, | ||||||
|             brightness: brightness, |             "brightness": brightness, | ||||||
|             contrast: contrast, |             "contrast": contrast, | ||||||
|             ambientLight: ambientLight, |             "ambientLight": ambientLight, | ||||||
|             windowOpacity: windowOpacity, |             "windowOpacity": windowOpacity, | ||||||
|             fontName: fontNames[rasterization], |             "fontName": fontNames[rasterization], | ||||||
|             fontWidth: fontWidth, |             "fontWidth": fontWidth, | ||||||
|             margin: _margin |             "margin": _margin, | ||||||
|  |             "blinkingCursor": blinkingCursor, | ||||||
|  |             "frameMargin": _frameMargin, | ||||||
|         } |         } | ||||||
|         return settings; |         return settings | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function composeProfileString() { |     function composeProfileString() { | ||||||
|         return stringify(composeProfileObject()); |         return stringify(composeProfileObject()) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function loadSettings() { |     function loadSettings() { | ||||||
|         var settingsString = storage.getSetting("_CURRENT_SETTINGS"); |         var settingsString = storage.getSetting("_CURRENT_SETTINGS") | ||||||
|         var profileString = storage.getSetting("_CURRENT_PROFILE"); |         var profileString = storage.getSetting("_CURRENT_PROFILE") | ||||||
|  |  | ||||||
|         if(!settingsString) return; |         if (!settingsString) | ||||||
|         if(!profileString) return; |             return | ||||||
|  |         if (!profileString) | ||||||
|  |             return | ||||||
|  |  | ||||||
|         loadSettingsString(settingsString); |         loadSettingsString(settingsString) | ||||||
|         loadProfileString(profileString); |         loadProfileString(profileString) | ||||||
|  |  | ||||||
|         if (verbose) |         if (verbose) | ||||||
|             console.log("Loading settings: " + settingsString + profileString); |             console.log("Loading settings: " + settingsString + profileString) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function storeSettings() { |     function storeSettings() { | ||||||
|         var settingsString = composeSettingsString(); |         var settingsString = composeSettingsString() | ||||||
|         var profileString = composeProfileString(); |         var profileString = composeProfileString() | ||||||
|  |  | ||||||
|         storage.setSetting("_CURRENT_SETTINGS", settingsString); |         storage.setSetting("_CURRENT_SETTINGS", settingsString) | ||||||
|         storage.setSetting("_CURRENT_PROFILE", profileString); |         storage.setSetting("_CURRENT_PROFILE", profileString) | ||||||
|  |  | ||||||
|         if (verbose) { |         if (verbose) { | ||||||
|             console.log("Storing settings: " + settingsString); |             console.log("Storing settings: " + settingsString) | ||||||
|             console.log("Storing profile: " + profileString); |             console.log("Storing profile: " + profileString) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function loadSettingsString(settingsString) { |     function loadSettingsString(settingsString) { | ||||||
|         var settings = JSON.parse(settingsString); |         var settings = JSON.parse(settingsString) | ||||||
|  |  | ||||||
|         showTerminalSize = settings.showTerminalSize !== undefined ? settings.showTerminalSize : showTerminalSize |         showTerminalSize = settings.showTerminalSize | ||||||
|  |                 !== undefined ? settings.showTerminalSize : showTerminalSize | ||||||
|  |  | ||||||
|         fps = settings.fps !== undefined ? settings.fps : fps |         fps = settings.fps !== undefined ? settings.fps : fps | ||||||
|         windowScaling = settings.windowScaling !== undefined ? settings.windowScaling : windowScaling |         windowScaling = settings.windowScaling | ||||||
|  |                 !== undefined ? settings.windowScaling : windowScaling | ||||||
|  |  | ||||||
|         x = settings.x !== undefined ? settings.x : x |         x = settings.x !== undefined ? settings.x : x | ||||||
|         y = settings.y !== undefined ? settings.y : y |         y = settings.y !== undefined ? settings.y : y | ||||||
| @@ -290,99 +328,119 @@ QtObject{ | |||||||
|         fontNames = settings.fontNames !== undefined ? settings.fontNames : fontNames |         fontNames = settings.fontNames !== undefined ? settings.fontNames : fontNames | ||||||
|         fontScaling = settings.fontScaling !== undefined ? settings.fontScaling : fontScaling |         fontScaling = settings.fontScaling !== undefined ? settings.fontScaling : fontScaling | ||||||
|  |  | ||||||
|         showMenubar = settings.showMenubar !== undefined ? settings.showMenubar : showMenubar; |         showMenubar = settings.showMenubar !== undefined ? settings.showMenubar : showMenubar | ||||||
|  |  | ||||||
|         bloomQuality = settings.bloomQuality !== undefined ? settings.bloomQuality : bloomQuality; |         bloomQuality = settings.bloomQuality !== undefined ? settings.bloomQuality : bloomQuality | ||||||
|         burnInQuality = settings.burnInQuality !== undefined ? settings.burnInQuality : burnInQuality; |         burnInQuality = settings.burnInQuality | ||||||
|  |                 !== undefined ? settings.burnInQuality : burnInQuality | ||||||
|  |  | ||||||
|         useCustomCommand = settings.useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand |         useCustomCommand = settings.useCustomCommand | ||||||
|         customCommand = settings.customCommand !== undefined ? settings.customCommand : customCommand |                 !== undefined ? settings.useCustomCommand : useCustomCommand | ||||||
|  |         customCommand = settings.customCommand | ||||||
|  |                 !== undefined ? settings.customCommand : customCommand | ||||||
|  |  | ||||||
|         useFastBurnIn = settings.useFastBurnIn !== undefined ? settings.useFastBurnIn : useFastBurnIn; |         useFastBurnIn = settings.useFastBurnIn | ||||||
|  |                 !== undefined ? settings.useFastBurnIn : useFastBurnIn | ||||||
|         blinkingCursor = settings.blinkingCursor !== undefined ? settings.blinkingCursor : blinkingCursor |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function loadProfileString(profileString) { |     function loadProfileString(profileString) { | ||||||
|         var settings = JSON.parse(profileString); |         var settings = JSON.parse(profileString) | ||||||
|  |  | ||||||
|         _backgroundColor = settings.backgroundColor !== undefined ? settings.backgroundColor : _backgroundColor; |         _backgroundColor = settings.backgroundColor | ||||||
|         _fontColor = settings.fontColor !== undefined ? settings.fontColor : _fontColor; |                 !== undefined ? settings.backgroundColor : _backgroundColor | ||||||
|  |         _fontColor = settings.fontColor !== undefined ? settings.fontColor : _fontColor | ||||||
|  |  | ||||||
|         horizontalSync = settings.horizontalSync !== undefined ? settings.horizontalSync : horizontalSync |         horizontalSync = settings.horizontalSync | ||||||
|         flickering = settings.flickering !== undefined ? settings.flickering : flickering; |                 !== undefined ? settings.horizontalSync : horizontalSync | ||||||
|         staticNoise = settings.staticNoise !== undefined ? settings.staticNoise : staticNoise; |         flickering = settings.flickering !== undefined ? settings.flickering : flickering | ||||||
|         chromaColor = settings.chromaColor !== undefined ? settings.chromaColor : chromaColor; |         staticNoise = settings.staticNoise !== undefined ? settings.staticNoise : staticNoise | ||||||
|         saturationColor = settings.saturationColor !== undefined ? settings.saturationColor : saturationColor; |         chromaColor = settings.chromaColor !== undefined ? settings.chromaColor : chromaColor | ||||||
|         screenCurvature = settings.screenCurvature !== undefined ? settings.screenCurvature : screenCurvature; |         saturationColor = settings.saturationColor | ||||||
|         glowingLine = settings.glowingLine !== undefined ? settings.glowingLine : glowingLine; |                 !== undefined ? settings.saturationColor : saturationColor | ||||||
|  |         screenCurvature = settings.screenCurvature | ||||||
|  |                 !== undefined ? settings.screenCurvature : screenCurvature | ||||||
|  |         glowingLine = settings.glowingLine !== undefined ? settings.glowingLine : glowingLine | ||||||
|  |  | ||||||
|         burnIn = settings.burnIn !== undefined ? settings.burnIn : burnIn |         burnIn = settings.burnIn !== undefined ? settings.burnIn : burnIn | ||||||
|         bloom = settings.bloom !== undefined ? settings.bloom : bloom |         bloom = settings.bloom !== undefined ? settings.bloom : bloom | ||||||
|  |  | ||||||
|         rasterization = settings.rasterization !== undefined ? settings.rasterization : rasterization; |         rasterization = settings.rasterization | ||||||
|  |                 !== undefined ? settings.rasterization : rasterization | ||||||
|  |  | ||||||
|         jitter = settings.jitter !== undefined ? settings.jitter : jitter; |         jitter = settings.jitter !== undefined ? settings.jitter : jitter | ||||||
|  |  | ||||||
|         rbgShift = settings.rbgShift !== undefined ? settings.rbgShift : rbgShift; |         rbgShift = settings.rbgShift !== undefined ? settings.rbgShift : rbgShift | ||||||
|  |  | ||||||
|         ambientLight = settings.ambientLight !== undefined ? settings.ambientLight : ambientLight; |         ambientLight = settings.ambientLight !== undefined ? settings.ambientLight : ambientLight | ||||||
|         contrast = settings.contrast !== undefined ? settings.contrast : contrast; |         contrast = settings.contrast !== undefined ? settings.contrast : contrast | ||||||
|         brightness = settings.brightness !== undefined ? settings.brightness : brightness; |         brightness = settings.brightness !== undefined ? settings.brightness : brightness | ||||||
|         windowOpacity = settings.windowOpacity !== undefined ? settings.windowOpacity : windowOpacity; |         windowOpacity = settings.windowOpacity | ||||||
|  |                 !== undefined ? settings.windowOpacity : windowOpacity | ||||||
|  |  | ||||||
|         fontNames[rasterization] = settings.fontName !== undefined ? settings.fontName : fontNames[rasterization]; |         fontNames[rasterization] = settings.fontName | ||||||
|         fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth; |                 !== undefined ? settings.fontName : fontNames[rasterization] | ||||||
|  |         fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth | ||||||
|  |  | ||||||
|         _margin = settings.margin !== undefined ? settings.margin : _margin; |         _margin = settings.margin !== undefined ? settings.margin : _margin | ||||||
|  |         _frameMargin = settings.frameMargin !== undefined ? settings.frameMargin : _frameMargin | ||||||
|  |  | ||||||
|  |         blinkingCursor = settings.blinkingCursor !== undefined ? settings.blinkingCursor : blinkingCursor | ||||||
|  |  | ||||||
|         handleFontChanged(); |         handleFontChanged() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function storeCustomProfiles() { |     function storeCustomProfiles() { | ||||||
|         storage.setSetting("_CUSTOM_PROFILES", composeCustomProfilesString()); |         storage.setSetting("_CUSTOM_PROFILES", composeCustomProfilesString()) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function loadCustomProfiles() { |     function loadCustomProfiles() { | ||||||
|         var customProfileString = storage.getSetting("_CUSTOM_PROFILES"); |         var customProfileString = storage.getSetting("_CUSTOM_PROFILES") | ||||||
|         if(customProfileString === undefined) customProfileString = "[]"; |         if (customProfileString === undefined) | ||||||
|         loadCustomProfilesString(customProfileString); |             customProfileString = "[]" | ||||||
|  |         loadCustomProfilesString(customProfileString) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function loadCustomProfilesString(customProfilesString) { |     function loadCustomProfilesString(customProfilesString) { | ||||||
|         var customProfiles = JSON.parse(customProfilesString); |         var customProfiles = JSON.parse(customProfilesString) | ||||||
|         for (var i = 0; i < customProfiles.length; i++) { |         for (var i = 0; i < customProfiles.length; i++) { | ||||||
|             var profile = customProfiles[i]; |             var profile = customProfiles[i] | ||||||
|  |  | ||||||
|             if (verbose) |             if (verbose) | ||||||
|                 console.log("Loading custom profile: " + stringify(profile)); |                 console.log("Loading custom profile: " + stringify(profile)) | ||||||
|  |  | ||||||
|             profilesList.append(profile); |             profilesList.append(profile) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function composeCustomProfilesString() { |     function composeCustomProfilesString() { | ||||||
|         var customProfiles = [] |         var customProfiles = [] | ||||||
|         for (var i = 0; i < profilesList.count; i++) { |         for (var i = 0; i < profilesList.count; i++) { | ||||||
|             var profile = profilesList.get(i); |             var profile = profilesList.get(i) | ||||||
|             if(profile.builtin) continue; |             if (profile.builtin) | ||||||
|             customProfiles.push({text: profile.text, obj_string: profile.obj_string, builtin: false}) |                 continue | ||||||
|  |             customProfiles.push({ | ||||||
|  |                                     "text": profile.text, | ||||||
|  |                                     "obj_string": profile.obj_string, | ||||||
|  |                                     "builtin": false | ||||||
|  |                                 }) | ||||||
|         } |         } | ||||||
|         return stringify(customProfiles); |         return stringify(customProfiles) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function loadProfile(index) { |     function loadProfile(index) { | ||||||
|         var profile = profilesList.get(index); |         var profile = profilesList.get(index) | ||||||
|         loadProfileString(profile.obj_string); |         loadProfileString(profile.obj_string) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function appendCustomProfile(name, profileString) { |     function appendCustomProfile(name, profileString) { | ||||||
|         profilesList.append({text: name, obj_string: profileString, builtin: false}); |         profilesList.append({ | ||||||
|  |                                 "text": name, | ||||||
|  |                                 "obj_string": profileString, | ||||||
|  |                                 "builtin": false | ||||||
|  |                             }) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // PROFILES /////////////////////////////////////////////////////////////// |     // PROFILES /////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     property ListModel profilesList: ListModel { |     property ListModel profilesList: ListModel { | ||||||
|         ListElement { |         ListElement { | ||||||
|             text: "Default Amber" |             text: "Default Amber" | ||||||
| @@ -407,14 +465,15 @@ QtObject{ | |||||||
|                 "screenCurvature": 0.3, |                 "screenCurvature": 0.3, | ||||||
|                 "staticNoise": 0.1198, |                 "staticNoise": 0.1198, | ||||||
|                 "windowOpacity": 1, |                 "windowOpacity": 1, | ||||||
|                   "margin": 0.5 |                 "margin": 0.5, | ||||||
|  |                 "blinkingCursor": false, | ||||||
|  |                 "frameMargin": 0.1 | ||||||
|             }' |             }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement { | ||||||
|             text: "Monochrome Green" |             text: "Monochrome Green" | ||||||
|             obj_string: ' |             obj_string: '{ | ||||||
|                 { |  | ||||||
|                 "ambientLight": 0.2, |                 "ambientLight": 0.2, | ||||||
|                 "backgroundColor": "#000000", |                 "backgroundColor": "#000000", | ||||||
|                 "bloom": 0.5538, |                 "bloom": 0.5538, | ||||||
| @@ -435,14 +494,15 @@ QtObject{ | |||||||
|                 "screenCurvature": 0.3, |                 "screenCurvature": 0.3, | ||||||
|                 "staticNoise": 0.1198, |                 "staticNoise": 0.1198, | ||||||
|                 "windowOpacity": 1, |                 "windowOpacity": 1, | ||||||
|                   "margin": 0.5 |                 "margin": 0.5, | ||||||
|  |                 "blinkingCursor": false, | ||||||
|  |                 "frameMargin": 0.1 | ||||||
|             }' |             }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement { | ||||||
|             text: "Green Scanlines" |             text: "Green Scanlines" | ||||||
|             obj_string: ' |             obj_string: '{ | ||||||
|                 { |  | ||||||
|                 "ambientLight": 0, |                 "ambientLight": 0, | ||||||
|                 "backgroundColor": "#000000", |                 "backgroundColor": "#000000", | ||||||
|                 "bloom": 0.6, |                 "bloom": 0.6, | ||||||
| @@ -463,14 +523,15 @@ QtObject{ | |||||||
|                 "screenCurvature": 0.3, |                 "screenCurvature": 0.3, | ||||||
|                 "staticNoise": 0.15, |                 "staticNoise": 0.15, | ||||||
|                 "windowOpacity": 1, |                 "windowOpacity": 1, | ||||||
|                   "margin": 0.5 |                 "margin": 0.5, | ||||||
|  |                 "blinkingCursor": false, | ||||||
|  |                 "frameMargin": 0.1 | ||||||
|             }' |             }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement { | ||||||
|             text: "Default Pixelated" |             text: "Default Pixelated" | ||||||
|             obj_string: ' |             obj_string: '{ | ||||||
|                 { |  | ||||||
|                 "ambientLight": 0, |                 "ambientLight": 0, | ||||||
|                 "backgroundColor": "#000000", |                 "backgroundColor": "#000000", | ||||||
|                 "bloom": 0.4045, |                 "bloom": 0.4045, | ||||||
| @@ -491,14 +552,15 @@ QtObject{ | |||||||
|                 "screenCurvature": 0, |                 "screenCurvature": 0, | ||||||
|                 "staticNoise": 0.15, |                 "staticNoise": 0.15, | ||||||
|                 "windowOpacity": 1, |                 "windowOpacity": 1, | ||||||
|                   "margin": 0.5 |                 "margin": 0.5, | ||||||
|  |                 "blinkingCursor": false, | ||||||
|  |                 "frameMargin": 0.1 | ||||||
|             }' |             }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement { | ||||||
|             text: "Apple ][" |             text: "Apple ][" | ||||||
|             obj_string: |             obj_string: '{ | ||||||
|                 '{ |  | ||||||
|                 "ambientLight": 0.3038, |                 "ambientLight": 0.3038, | ||||||
|                 "backgroundColor": "#000000", |                 "backgroundColor": "#000000", | ||||||
|                 "bloom": 0.5, |                 "bloom": 0.5, | ||||||
| @@ -519,14 +581,15 @@ QtObject{ | |||||||
|                 "screenCurvature": 0.5, |                 "screenCurvature": 0.5, | ||||||
|                 "staticNoise": 0.099, |                 "staticNoise": 0.099, | ||||||
|                 "windowOpacity": 1, |                 "windowOpacity": 1, | ||||||
|                   "margin": 0.5 |                 "margin": 0.5, | ||||||
|  |                 "blinkingCursor": false, | ||||||
|  |                 "frameMargin": 0.2 | ||||||
|             }' |             }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement { | ||||||
|             text: "Vintage" |             text: "Vintage" | ||||||
|             obj_string: ' |             obj_string: '{ | ||||||
|                 { |  | ||||||
|                 "ambientLight": 0.5, |                 "ambientLight": 0.5, | ||||||
|                 "backgroundColor": "#000000", |                 "backgroundColor": "#000000", | ||||||
|                 "bloom": 0.4983, |                 "bloom": 0.4983, | ||||||
| @@ -547,14 +610,15 @@ QtObject{ | |||||||
|                 "screenCurvature": 0.5, |                 "screenCurvature": 0.5, | ||||||
|                 "staticNoise": 0.2969, |                 "staticNoise": 0.2969, | ||||||
|                 "windowOpacity": 1, |                 "windowOpacity": 1, | ||||||
|                   "margin": 0.5 |                 "margin": 0.5, | ||||||
|  |                 "blinkingCursor": false, | ||||||
|  |                 "frameMargin": 0.5 | ||||||
|             }' |             }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement { | ||||||
|             text: "IBM Dos" |             text: "IBM Dos" | ||||||
|             obj_string: |             obj_string: '{ | ||||||
|                 '{ |  | ||||||
|                 "ambientLight": 0.151, |                 "ambientLight": 0.151, | ||||||
|                 "backgroundColor": "#000000", |                 "backgroundColor": "#000000", | ||||||
|                 "bloom": 0.2969, |                 "bloom": 0.2969, | ||||||
| @@ -575,14 +639,15 @@ QtObject{ | |||||||
|                 "screenCurvature": 0.4, |                 "screenCurvature": 0.4, | ||||||
|                 "staticNoise": 0.0503, |                 "staticNoise": 0.0503, | ||||||
|                 "windowOpacity": 1, |                 "windowOpacity": 1, | ||||||
|                   "margin": 0.5 |                 "margin": 0.5, | ||||||
|  |                 "blinkingCursor": false, | ||||||
|  |                 "frameMargin": 0.2 | ||||||
|             }' |             }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement { | ||||||
|             text: "IBM 3278" |             text: "IBM 3278" | ||||||
|             obj_string: |             obj_string: '{ | ||||||
|                 '{ |  | ||||||
|                 "ambientLight": 0.1, |                 "ambientLight": 0.1, | ||||||
|                 "backgroundColor": "#000000", |                 "backgroundColor": "#000000", | ||||||
|                 "bloom": 0.2969, |                 "bloom": 0.2969, | ||||||
| @@ -603,14 +668,15 @@ QtObject{ | |||||||
|                 "screenCurvature": 0.2, |                 "screenCurvature": 0.2, | ||||||
|                 "staticNoise": 0, |                 "staticNoise": 0, | ||||||
|                 "windowOpacity": 1, |                 "windowOpacity": 1, | ||||||
|                   "margin": 0.5 |                 "margin": 0.5, | ||||||
|  |                 "blinkingCursor": false, | ||||||
|  |                 "frameMargin": 0.1 | ||||||
|             }' |             }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement { | ||||||
|             text: "Futuristic" |             text: "Futuristic" | ||||||
|             obj_string: |             obj_string: '{ | ||||||
|                 '{ |  | ||||||
|                 "ambientLight": 0, |                 "ambientLight": 0, | ||||||
|                 "backgroundColor": "#000000", |                 "backgroundColor": "#000000", | ||||||
|                 "bloom": 0.5017, |                 "bloom": 0.5017, | ||||||
| @@ -631,7 +697,9 @@ QtObject{ | |||||||
|                 "screenCurvature": 0, |                 "screenCurvature": 0, | ||||||
|                 "staticNoise": 0.0955, |                 "staticNoise": 0.0955, | ||||||
|                 "windowOpacity": 0.7, |                 "windowOpacity": 0.7, | ||||||
|                   "margin": 0.1 |                 "margin": 0.1, | ||||||
|  |                 "blinkingCursor": false, | ||||||
|  |                 "frameMargin": 0 | ||||||
|             }' |             }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
| @@ -640,51 +708,51 @@ QtObject{ | |||||||
|     function getProfileIndexByName(name) { |     function getProfileIndexByName(name) { | ||||||
|         for (var i = 0; i < profilesList.count; i++) { |         for (var i = 0; i < profilesList.count; i++) { | ||||||
|             if (profilesList.get(i).text === name) |             if (profilesList.get(i).text === name) | ||||||
|                 return i; |                 return i | ||||||
|         } |         } | ||||||
|         return -1; |         return -1 | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     Component.onCompleted: { |     Component.onCompleted: { | ||||||
|         // Manage the arguments from the QML side. |         // Manage the arguments from the QML side. | ||||||
|         var args = Qt.application.arguments; |         var args = Qt.application.arguments | ||||||
|         if (args.indexOf("--verbose") !== -1) { |         if (args.indexOf("--verbose") !== -1) { | ||||||
|             verbose = true; |             verbose = true | ||||||
|         } |         } | ||||||
|         if (args.indexOf("--default-settings") === -1) { |         if (args.indexOf("--default-settings") === -1) { | ||||||
|             loadSettings(); |             loadSettings() | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         loadCustomProfiles(); |         loadCustomProfiles() | ||||||
|  |  | ||||||
|         var profileArgPosition = args.indexOf("--profile"); |         var profileArgPosition = args.indexOf("--profile") | ||||||
|         if (profileArgPosition !== -1) { |         if (profileArgPosition !== -1) { | ||||||
|             var profileIndex = getProfileIndexByName(args[profileArgPosition + 1]); |             var profileIndex = getProfileIndexByName( | ||||||
|  |                         args[profileArgPosition + 1]) | ||||||
|             if (profileIndex !== -1) |             if (profileIndex !== -1) | ||||||
|                 loadProfile(profileIndex); |                 loadProfile(profileIndex) | ||||||
|             else |             else | ||||||
|                 console.log("Warning: selected profile is not valid; ignoring it"); |                 console.log("Warning: selected profile is not valid; ignoring it") | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (args.indexOf("--fullscreen") !== -1) { |         if (args.indexOf("--fullscreen") !== -1) { | ||||||
|             fullscreen = true; |             fullscreen = true | ||||||
|             showMenubar = false; |             showMenubar = false | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (args.indexOf("-T") !== -1) { |         if (args.indexOf("-T") !== -1) { | ||||||
|             wintitle = args[args.indexOf("-T") + 1] |             wintitle = args[args.indexOf("-T") + 1] | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         initializedSettings(); |         initializedSettings() | ||||||
|     } |     } | ||||||
|     Component.onDestruction: { |     Component.onDestruction: { | ||||||
|         storeSettings(); |         storeSettings() | ||||||
|         storeCustomProfiles(); |         storeCustomProfiles() | ||||||
|         //        storage.dropSettings(); //DROPS THE SETTINGS!.. REMEMBER TO DISABLE ONCE ENABLED!! |         //        storage.dropSettings(); //DROPS THE SETTINGS!.. REMEMBER TO DISABLE ONCE ENABLED!! | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // VARS /////////////////////////////////////////////////////////////////// |     // VARS /////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     property Label _sampleLabel: Label { |     property Label _sampleLabel: Label { | ||||||
|         text: "100%" |         text: "100%" | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,3 +1,22 @@ | |||||||
|  | /******************************************************************************* | ||||||
|  | * Copyright (c) 2013-2021 "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 <http://www.gnu.org/licenses/>. | ||||||
|  | *******************************************************************************/ | ||||||
| import QtQuick 2.0 | import QtQuick 2.0 | ||||||
|  |  | ||||||
| import "utils.js" as Utils | import "utils.js" as Utils | ||||||
| @@ -70,6 +89,10 @@ Loader { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         ShaderLibrary { | ||||||
|  |             id: shaderLibrary | ||||||
|  |         } | ||||||
|  |  | ||||||
|         ShaderEffect { |         ShaderEffect { | ||||||
|             id: burnInShaderEffect |             id: burnInShaderEffect | ||||||
|  |  | ||||||
| @@ -99,9 +122,7 @@ Loader { | |||||||
|  |  | ||||||
|                  uniform highp float prevLastUpdate;" + |                  uniform highp float prevLastUpdate;" + | ||||||
|  |  | ||||||
|                 "float rgb2grey(vec3 v){ |                 shaderLibrary.rgb2grey + | ||||||
|                     return dot(v, vec3(0.21, 0.72, 0.04)); |  | ||||||
|                 }" + |  | ||||||
|  |  | ||||||
|                 "void main() { |                 "void main() { | ||||||
|                     vec2 coords = qt_TexCoord0; |                     vec2 coords = qt_TexCoord0; | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,7 +17,6 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.0 | import QtQuick.Controls 2.0 | ||||||
| import QtQuick.Layouts 1.1 | import QtQuick.Layouts 1.1 | ||||||
| @@ -32,15 +31,15 @@ RowLayout { | |||||||
|     property alias max_value: slider.to |     property alias max_value: slider.to | ||||||
|     property alias stepSize: slider.stepSize |     property alias stepSize: slider.stepSize | ||||||
|  |  | ||||||
|     signal newValue(real newValue); |     signal newValue(real newValue) | ||||||
|  |  | ||||||
|     id: setting_component |     id: setting_component | ||||||
|     Layout.fillWidth: true |     Layout.fillWidth: true | ||||||
|  |  | ||||||
|     onValueChanged: { |     onValueChanged: { | ||||||
|         check.checked = !(value == 0); |         check.checked = !(value == 0) | ||||||
|         if (check.checked) |         if (check.checked) | ||||||
|             slider.value = value; |             slider.value = value | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     CheckBox { |     CheckBox { | ||||||
| @@ -48,13 +47,13 @@ RowLayout { | |||||||
|         implicitWidth: 160 |         implicitWidth: 160 | ||||||
|         onClicked: { |         onClicked: { | ||||||
|             if (!checked) { |             if (!checked) { | ||||||
|                 checked = false; |                 checked = false | ||||||
|                 slider.enabled = false; |                 slider.enabled = false | ||||||
|                 newValue(0); |                 newValue(0) | ||||||
|             } else { |             } else { | ||||||
|                 checked = true; |                 checked = true | ||||||
|                 newValue(slider.value); |                 newValue(slider.value) | ||||||
|                 slider.enabled = true; |                 slider.enabled = true | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -63,10 +62,11 @@ RowLayout { | |||||||
|         stepSize: parent.stepSize |         stepSize: parent.stepSize | ||||||
|         Layout.fillWidth: true |         Layout.fillWidth: true | ||||||
|         onValueChanged: { |         onValueChanged: { | ||||||
|             newValue(value); |             newValue(value) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     SizedLabel { |     SizedLabel { | ||||||
|         text: Math.round(((value - min_value) / (max_value - min_value)) * 100) + "%" |         text: Math.round( | ||||||
|  |                   ((value - min_value) / (max_value - min_value)) * 100) + "%" | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,7 +17,6 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Dialogs 1.1 | import QtQuick.Dialogs 1.1 | ||||||
|  |  | ||||||
| @@ -35,8 +34,10 @@ Item { | |||||||
|         visible: false |         visible: false | ||||||
|  |  | ||||||
|         //This is a workaround to a Qt 5.2 bug. |         //This is a workaround to a Qt 5.2 bug. | ||||||
|         onColorChanged: if (Qt.platform.os !== "osx") colorSelected(color) |         onColorChanged: if (Qt.platform.os !== "osx") | ||||||
|         onAccepted: if (Qt.platform.os === "osx") colorSelected(color) |                             colorSelected(color) | ||||||
|  |         onAccepted: if (Qt.platform.os === "osx") | ||||||
|  |                         colorSelected(color) | ||||||
|     } |     } | ||||||
|     Rectangle { |     Rectangle { | ||||||
|         anchors.fill: parent |         anchors.fill: parent | ||||||
| @@ -58,6 +59,6 @@ Item { | |||||||
|     } |     } | ||||||
|     MouseArea { |     MouseArea { | ||||||
|         anchors.fill: parent |         anchors.fill: parent | ||||||
|         onClicked: colorDialog.visible = true; |         onClicked: colorDialog.visible = true | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,7 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,15 +19,12 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
|  |  | ||||||
| import QtQuick 2.0 | import QtQuick 2.0 | ||||||
| import QtQuick.Controls 2.0 | import QtQuick.Controls 2.0 | ||||||
| import QtQuick.Layouts 1.0 | import QtQuick.Layouts 1.0 | ||||||
|  |  | ||||||
| // This component is simply a label with a predefined size. | // This component is simply a label with a predefined size. | ||||||
| // Used to improve alignment. | // Used to improve alignment. | ||||||
|  |  | ||||||
| Label { | Label { | ||||||
|     id: textfield |     id: textfield | ||||||
|     Layout.minimumWidth: appSettings.labelWidth |     Layout.minimumWidth: appSettings.labelWidth | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,7 +17,6 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
|  |  | ||||||
| QtObject { | QtObject { | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,7 +17,6 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
|  |  | ||||||
| QtObject { | QtObject { | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,7 +17,6 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
|  |  | ||||||
| QtObject { | QtObject { | ||||||
| @@ -27,17 +26,11 @@ QtObject{ | |||||||
|     property var _font: fontlist.get(selectedFontIndex) |     property var _font: fontlist.get(selectedFontIndex) | ||||||
|     property bool lowResolutionFont: _font.lowResolutionFont |     property bool lowResolutionFont: _font.lowResolutionFont | ||||||
|  |  | ||||||
|     property int pixelSize: lowResolutionFont |     property int pixelSize: lowResolutionFont ? _font.pixelSize : _font.pixelSize * scaling | ||||||
|                                  ? _font.pixelSize |  | ||||||
|                                  : _font.pixelSize * scaling |  | ||||||
|  |  | ||||||
|     property int lineSpacing: lowResolutionFont |     property int lineSpacing: lowResolutionFont ? _font.lineSpacing : pixelSize * _font.lineSpacing | ||||||
|                                   ? _font.lineSpacing |  | ||||||
|                                   : pixelSize * _font.lineSpacing |  | ||||||
|  |  | ||||||
|     property real screenScaling: lowResolutionFont |     property real screenScaling: lowResolutionFont ? _font.baseScaling * scaling : 1.0 | ||||||
|                                      ? _font.baseScaling * scaling |  | ||||||
|                                      : 1.0 |  | ||||||
|  |  | ||||||
|     property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth |     property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth | ||||||
|  |  | ||||||
| @@ -52,7 +45,6 @@ QtObject{ | |||||||
|     // High resolution fonts are instead drawn on a texture which has the |     // High resolution fonts are instead drawn on a texture which has the | ||||||
|     // size of the screen, and the scaling directly controls their pixels size. |     // size of the screen, and the scaling directly controls their pixels size. | ||||||
|     // Those are slower to render but are not pixelated. |     // Those are slower to render but are not pixelated. | ||||||
|  |  | ||||||
|     property ListModel fontlist: ListModel { |     property ListModel fontlist: ListModel { | ||||||
|         ListElement { |         ListElement { | ||||||
|             name: "TERMINUS_SCALED" |             name: "TERMINUS_SCALED" | ||||||
| @@ -234,7 +226,7 @@ QtObject{ | |||||||
|     Component.onCompleted: addSystemFonts() |     Component.onCompleted: addSystemFonts() | ||||||
|  |  | ||||||
|     function addSystemFonts() { |     function addSystemFonts() { | ||||||
|         var families = monospaceSystemFonts; |         var families = monospaceSystemFonts | ||||||
|         for (var i = 0; i < families.length; i++) { |         for (var i = 0; i < families.length; i++) { | ||||||
|             if (verbose) { |             if (verbose) { | ||||||
|                 console.log("Adding system font: ", families[i]) |                 console.log("Adding system font: ", families[i]) | ||||||
| @@ -245,16 +237,16 @@ QtObject{ | |||||||
|  |  | ||||||
|     function convertToListElement(family) { |     function convertToListElement(family) { | ||||||
|         return { |         return { | ||||||
|             name: "System: " + family, |             "name": "System: " + family, | ||||||
|             text: qsTr("System: ") + family, |             "text": qsTr("System: ") + family, | ||||||
|             source: "", |             "source": "", | ||||||
|             lineSpacing: 0.1, |             "lineSpacing": 0.1, | ||||||
|             pixelSize: 30, |             "pixelSize": 30, | ||||||
|             fontWidth: 1.0, |             "fontWidth": 1.0, | ||||||
|             baseScaling: 1.0, |             "baseScaling": 1.0, | ||||||
|             lowResolutionFont: false, |             "lowResolutionFont": false, | ||||||
|             isSystemFont: true, |             "isSystemFont": true, | ||||||
|             family: family |             "family": family | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,7 +17,6 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Window 2.0 | import QtQuick.Window 2.0 | ||||||
| import QtQuick.Controls 2.0 | import QtQuick.Controls 2.0 | ||||||
| @@ -40,23 +39,25 @@ Window{ | |||||||
|         visible: false |         visible: false | ||||||
|  |  | ||||||
|         function showError(message) { |         function showError(message) { | ||||||
|             text = message; |             text = message | ||||||
|             open(); |             open() | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function validateName(name) { |     function validateName(name) { | ||||||
|         var profile_list = appSettings.profilesList; |         var profile_list = appSettings.profilesList | ||||||
|         if (name === "") |         if (name === "") | ||||||
|             return 1; |             return 1 | ||||||
|         return 0; |         return 0 | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     ColumnLayout { |     ColumnLayout { | ||||||
|         anchors.margins: 10 |         anchors.margins: 10 | ||||||
|         anchors.fill: parent |         anchors.fill: parent | ||||||
|         RowLayout { |         RowLayout { | ||||||
|             Label{text: qsTr("Name")} |             Label { | ||||||
|  |                 text: qsTr("Name") | ||||||
|  |             } | ||||||
|             TextField { |             TextField { | ||||||
|                 id: namefield |                 id: namefield | ||||||
|                 Layout.fillWidth: true |                 Layout.fillWidth: true | ||||||
| @@ -71,14 +72,15 @@ Window{ | |||||||
|                 text: qsTr("OK") |                 text: qsTr("OK") | ||||||
|                 onClicked: clickAction() |                 onClicked: clickAction() | ||||||
|                 function clickAction() { |                 function clickAction() { | ||||||
|                     var name = namefield.text; |                     var name = namefield.text | ||||||
|                     switch (validateName(name)) { |                     switch (validateName(name)) { | ||||||
|                     case 1: |                     case 1: | ||||||
|                         errorDialog.showError(qsTr("The name you inserted is empty. Please choose a different one.")); |                         errorDialog.showError( | ||||||
|                         break; |                                     qsTr("The name you inserted is empty. Please choose a different one.")) | ||||||
|  |                         break | ||||||
|                     default: |                     default: | ||||||
|                         nameSelected(name); |                         nameSelected(name) | ||||||
|                         close(); |                         close() | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -1,78 +0,0 @@ | |||||||
| import QtQuick 2.0 |  | ||||||
|  |  | ||||||
| import "utils.js" as Utils |  | ||||||
|  |  | ||||||
| ShaderEffect { |  | ||||||
|     property color _staticFrameColor: "#ffffff" |  | ||||||
|     property color _backgroundColor: appSettings.backgroundColor |  | ||||||
|     property color _fontColor: appSettings.fontColor |  | ||||||
|     property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2) |  | ||||||
|     property real _ambientLight: Utils.lint(0.2, 0.8, appSettings.ambientLight) |  | ||||||
|  |  | ||||||
|     property color frameColor: Utils.mix(_staticFrameColor, _lightColor, _ambientLight) |  | ||||||
|     property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize |  | ||||||
|     property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight) |  | ||||||
|  |  | ||||||
|     property size aadelta: Qt.size(1.0 / width, 1.0 / height) |  | ||||||
|  |  | ||||||
|     fragmentShader: " |  | ||||||
|         #ifdef GL_ES |  | ||||||
|             precision mediump float; |  | ||||||
|         #endif |  | ||||||
|  |  | ||||||
|         uniform lowp float screenCurvature; |  | ||||||
|         uniform lowp float shadowLength; |  | ||||||
|         uniform highp float qt_Opacity; |  | ||||||
|         uniform lowp vec4 frameColor; |  | ||||||
|         uniform mediump vec2 aadelta; |  | ||||||
|  |  | ||||||
|         varying highp vec2 qt_TexCoord0; |  | ||||||
|  |  | ||||||
|         vec2 distortCoordinates(vec2 coords){ |  | ||||||
|             vec2 cc = (coords - vec2(0.5)); |  | ||||||
|             float dist = dot(cc, cc) * screenCurvature; |  | ||||||
|             return (coords + cc * (1.0 + dist) * dist); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         float max2(vec2 v) { |  | ||||||
|             return max(v.x, v.y); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         float min2(vec2 v) { |  | ||||||
|             return min(v.x, v.y); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         float prod2(vec2 v) { |  | ||||||
|             return v.x * v.y; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         float sum2(vec2 v) { |  | ||||||
|             return v.x + v.y; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         void main(){ |  | ||||||
|             vec2 staticCoords = qt_TexCoord0; |  | ||||||
|             vec2 coords = distortCoordinates(staticCoords); |  | ||||||
|  |  | ||||||
|             vec3 color = vec3(0.0); |  | ||||||
|             float alpha = 0.0; |  | ||||||
|  |  | ||||||
|             float outShadowLength = shadowLength; |  | ||||||
|             float inShadowLength = shadowLength * 0.5; |  | ||||||
|  |  | ||||||
|             float outShadow = max2(1.0 - smoothstep(vec2(-outShadowLength), vec2(0.0), coords) + smoothstep(vec2(1.0), vec2(1.0 + outShadowLength), coords)); |  | ||||||
|             outShadow = clamp(sqrt(outShadow), 0.0, 1.0); |  | ||||||
|             color += frameColor.rgb * outShadow; |  | ||||||
|             alpha = sum2(1.0 - smoothstep(vec2(0.0), aadelta, coords) + smoothstep(vec2(1.0) - aadelta, vec2(1.0), coords)); |  | ||||||
|             alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, outShadow); |  | ||||||
|  |  | ||||||
|             float inShadow = 1.0 - prod2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords)); |  | ||||||
|             inShadow = 0.5 * inShadow * inShadow; |  | ||||||
|             alpha = max(alpha, inShadow); |  | ||||||
|  |  | ||||||
|             gl_FragColor = vec4(color * alpha, alpha); |  | ||||||
|         } |  | ||||||
|     " |  | ||||||
|  |  | ||||||
|     onStatusChanged: if (log) console.log(log) //Print warning messages |  | ||||||
| } |  | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -73,7 +73,7 @@ Item{ | |||||||
|         id: kterminal |         id: kterminal | ||||||
|  |  | ||||||
|         property int textureResolutionScale: appSettings.lowResolutionFont ? devicePixelRatio : 1 |         property int textureResolutionScale: appSettings.lowResolutionFont ? devicePixelRatio : 1 | ||||||
|         property int margin: appSettings.margin / screenScaling |         property int margin: appSettings.totalMargin / screenScaling | ||||||
|         property int totalWidth: Math.floor(parent.width / (screenScaling * fontWidth)) |         property int totalWidth: Math.floor(parent.width / (screenScaling * fontWidth)) | ||||||
|         property int totalHeight: Math.floor(parent.height / screenScaling) |         property int totalHeight: Math.floor(parent.height / screenScaling) | ||||||
|  |  | ||||||
| @@ -178,7 +178,7 @@ Item{ | |||||||
|     property alias contextmenu: menuLoader.item |     property alias contextmenu: menuLoader.item | ||||||
|  |  | ||||||
|     MouseArea { |     MouseArea { | ||||||
|         property real margin: appSettings.margin |         property real margin: appSettings.totalMargin | ||||||
|  |  | ||||||
|         acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton |         acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton | ||||||
|         anchors.fill: parent |         anchors.fill: parent | ||||||
| @@ -219,8 +219,8 @@ Item{ | |||||||
|             var cc = Qt.size(0.5 - x, 0.5 - y); |             var cc = Qt.size(0.5 - x, 0.5 - y); | ||||||
|             var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize; |             var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize; | ||||||
|  |  | ||||||
|             return Qt.point((x - cc.width  * (1+distortion) * distortion) * kterminal.totalWidth, |             return Qt.point((x - cc.width  * (1+distortion) * distortion) * (kterminal.totalWidth), | ||||||
|                            (y - cc.height * (1+distortion) * distortion) * kterminal.totalHeight) |                            (y - cc.height * (1+distortion) * distortion) * (kterminal.totalHeight)) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     ShaderEffectSource{ |     ShaderEffectSource{ | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,7 +17,6 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.0 | import QtQuick.Controls 2.0 | ||||||
| import QtQuick.Layouts 1.1 | import QtQuick.Layouts 1.1 | ||||||
| @@ -53,9 +52,10 @@ ColumnLayout{ | |||||||
|  |  | ||||||
|                 // Save text even if user forgets to press enter or unfocus |                 // Save text even if user forgets to press enter or unfocus | ||||||
|                 function saveSetting() { |                 function saveSetting() { | ||||||
|                     appSettings.customCommand = text; |                     appSettings.customCommand = text | ||||||
|                 } |                 } | ||||||
|                 Component.onCompleted: settings_window.closing.connect(saveSetting) |                 Component.onCompleted: settings_window.closing.connect( | ||||||
|  |                                            saveSetting) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -67,74 +67,93 @@ ColumnLayout{ | |||||||
|             anchors.fill: parent |             anchors.fill: parent | ||||||
|             columns: 4 |             columns: 4 | ||||||
|  |  | ||||||
|             Label{text: qsTr("Effects FPS")} |             Label { | ||||||
|  |                 text: qsTr("Effects FPS") | ||||||
|  |             } | ||||||
|             Slider { |             Slider { | ||||||
|                 Layout.fillWidth: true |                 Layout.fillWidth: true | ||||||
|                 Layout.columnSpan: 2 |                 Layout.columnSpan: 2 | ||||||
|                 id: fpsSlider |                 id: fpsSlider | ||||||
|                 onValueChanged: { |                 onValueChanged: { | ||||||
|                     if (enabled) { |                     if (enabled) { | ||||||
|                         appSettings.fps = value !== 60 ? value + 1 : 0; |                         appSettings.fps = value !== 60 ? value + 1 : 0 | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 stepSize: 1 |                 stepSize: 1 | ||||||
|                 enabled: false |                 enabled: false | ||||||
|                 Component.onCompleted: { |                 Component.onCompleted: { | ||||||
|                     from = 0; |                     from = 0 | ||||||
|                     to = 60; |                     to = 60 | ||||||
|                     value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60; |                     value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60 | ||||||
|                     enabled = true; |                     enabled = true | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             Label{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")} |             Label { | ||||||
|             Label{text: qsTr("Texture Quality")} |                 text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max") | ||||||
|  |             } | ||||||
|  |             Label { | ||||||
|  |                 text: qsTr("Texture Quality") | ||||||
|  |             } | ||||||
|             Slider { |             Slider { | ||||||
|                 id: txtslider |                 id: txtslider | ||||||
|                 Layout.fillWidth: true |                 Layout.fillWidth: true | ||||||
|                 Layout.columnSpan: 2 |                 Layout.columnSpan: 2 | ||||||
|                 onValueChanged: if (enabled) appSettings.windowScaling = value; |                 onValueChanged: if (enabled) | ||||||
|  |                                     appSettings.windowScaling = value | ||||||
|                 stepSize: 0.05 |                 stepSize: 0.05 | ||||||
|                 enabled: false |                 enabled: false | ||||||
|                 Component.onCompleted: { |                 Component.onCompleted: { | ||||||
|                     from = 0.25 //Without this value gets set to 0.5 |                     from = 0.25 //Without this value gets set to 0.5 | ||||||
|                     value = appSettings.windowScaling; |                     value = appSettings.windowScaling | ||||||
|                     enabled = true; |                     enabled = true | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             Label{text: Math.round(txtslider.value * 100) + "%"} |             Label { | ||||||
|  |                 text: Math.round(txtslider.value * 100) + "%" | ||||||
|  |             } | ||||||
|  |  | ||||||
|             Label{text: qsTr("Bloom Quality")} |             Label { | ||||||
|  |                 text: qsTr("Bloom Quality") | ||||||
|  |             } | ||||||
|             Slider { |             Slider { | ||||||
|                 Layout.fillWidth: true |                 Layout.fillWidth: true | ||||||
|                 Layout.columnSpan: 2 |                 Layout.columnSpan: 2 | ||||||
|                 id: bloomSlider |                 id: bloomSlider | ||||||
|                 onValueChanged: if (enabled) appSettings.bloomQuality = value; |                 onValueChanged: if (enabled) | ||||||
|  |                                     appSettings.bloomQuality = value | ||||||
|                 stepSize: 0.05 |                 stepSize: 0.05 | ||||||
|                 enabled: false |                 enabled: false | ||||||
|                 Component.onCompleted: { |                 Component.onCompleted: { | ||||||
|                     from = 0.25 |                     from = 0.25 | ||||||
|                     value = appSettings.bloomQuality; |                     value = appSettings.bloomQuality | ||||||
|                     enabled = true; |                     enabled = true | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             Label{text: Math.round(bloomSlider.value * 100) + "%"} |             Label { | ||||||
|  |                 text: Math.round(bloomSlider.value * 100) + "%" | ||||||
|  |             } | ||||||
|  |  | ||||||
|             Label{text: qsTr("BurnIn Quality")} |             Label { | ||||||
|  |                 text: qsTr("BurnIn Quality") | ||||||
|  |             } | ||||||
|             Slider { |             Slider { | ||||||
|                 Layout.fillWidth: true |                 Layout.fillWidth: true | ||||||
|                 id: burnInSlider |                 id: burnInSlider | ||||||
|                 Layout.columnSpan: 2 |                 Layout.columnSpan: 2 | ||||||
|                 onValueChanged: if (enabled) appSettings.burnInQuality = value; |                 onValueChanged: if (enabled) | ||||||
|  |                                     appSettings.burnInQuality = value | ||||||
|                 stepSize: 0.05 |                 stepSize: 0.05 | ||||||
|                 enabled: false |                 enabled: false | ||||||
|                 Component.onCompleted: { |                 Component.onCompleted: { | ||||||
|                     from = 0.25 |                     from = 0.25 | ||||||
|                     value = appSettings.burnInQuality; |                     value = appSettings.burnInQuality | ||||||
|                     enabled = true; |                     enabled = true | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             Label{text: Math.round(burnInSlider.value * 100) + "%"} |             Label { | ||||||
|  |                 text: Math.round(burnInSlider.value * 100) + "%" | ||||||
|  |             } | ||||||
|             CheckBox { |             CheckBox { | ||||||
|                 Layout.columnSpan: 2 |                 Layout.columnSpan: 2 | ||||||
|                 text: qsTr("Burnin optimization (Might display timing artifacts)") |                 text: qsTr("Burnin optimization (Might display timing artifacts)") | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,7 +17,6 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.0 | import QtQuick.Controls 2.0 | ||||||
| import QtQuick.Layouts 1.1 | import QtQuick.Layouts 1.1 | ||||||
| @@ -54,34 +53,34 @@ ColumnLayout{ | |||||||
|             } |             } | ||||||
|             CheckableSlider { |             CheckableSlider { | ||||||
|                 name: qsTr("Glow Line") |                 name: qsTr("Glow Line") | ||||||
|                 onNewValue: appSettings.glowingLine = newValue; |                 onNewValue: appSettings.glowingLine = newValue | ||||||
|                 value: appSettings.glowingLine |                 value: appSettings.glowingLine | ||||||
|             } |             } | ||||||
|             CheckableSlider { |             CheckableSlider { | ||||||
|                 name: qsTr("Screen Curvature") |                 name: qsTr("Screen Curvature") | ||||||
|                 onNewValue: appSettings.screenCurvature = newValue; |                 onNewValue: appSettings.screenCurvature = newValue | ||||||
|                 value: appSettings.screenCurvature; |                 value: appSettings.screenCurvature | ||||||
|             } |             } | ||||||
|             CheckableSlider { |             CheckableSlider { | ||||||
|                 name: qsTr("Ambient Light") |                 name: qsTr("Ambient Light") | ||||||
|                 onNewValue: appSettings.ambientLight = newValue; |                 onNewValue: appSettings.ambientLight = newValue | ||||||
|                 value: appSettings.ambientLight |                 value: appSettings.ambientLight | ||||||
|                 enabled: appSettings.framesIndex !== 0 |                 enabled: appSettings.framesIndex !== 0 | ||||||
|             } |             } | ||||||
|             CheckableSlider { |             CheckableSlider { | ||||||
|                 name: qsTr("Flickering") |                 name: qsTr("Flickering") | ||||||
|                 onNewValue: appSettings.flickering = newValue; |                 onNewValue: appSettings.flickering = newValue | ||||||
|                 value: appSettings.flickering; |                 value: appSettings.flickering | ||||||
|             } |             } | ||||||
|             CheckableSlider { |             CheckableSlider { | ||||||
|                 name: qsTr("Horizontal Sync") |                 name: qsTr("Horizontal Sync") | ||||||
|                 onNewValue: appSettings.horizontalSync = newValue; |                 onNewValue: appSettings.horizontalSync = newValue | ||||||
|                 value: appSettings.horizontalSync; |                 value: appSettings.horizontalSync | ||||||
|             } |             } | ||||||
|             CheckableSlider { |             CheckableSlider { | ||||||
|                 name: qsTr("RGB Shift") |                 name: qsTr("RGB Shift") | ||||||
|                 onNewValue: appSettings.rbgShift = newValue; |                 onNewValue: appSettings.rbgShift = newValue | ||||||
|                 value: appSettings.rbgShift; |                 value: appSettings.rbgShift | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,7 +17,6 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.4 | import QtQuick.Controls 2.4 | ||||||
| import QtQuick.Layouts 1.1 | import QtQuick.Layouts 1.1 | ||||||
| @@ -56,7 +55,7 @@ ColumnLayout{ | |||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                     text: qsTr("Save") |                     text: qsTr("Save") | ||||||
|                     onClicked: { |                     onClicked: { | ||||||
|                         insertname.profileName = ""; |                         insertname.profileName = "" | ||||||
|                         insertname.show() |                         insertname.show() | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| @@ -66,9 +65,9 @@ ColumnLayout{ | |||||||
|                     enabled: currentIndex >= 0 |                     enabled: currentIndex >= 0 | ||||||
|                     text: qsTr("Load") |                     text: qsTr("Load") | ||||||
|                     onClicked: { |                     onClicked: { | ||||||
|                         var index = currentIndex; |                         var index = currentIndex | ||||||
|                         if (index >= 0) |                         if (index >= 0) | ||||||
|                             appSettings.loadProfile(index); |                             appSettings.loadProfile(index) | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 Button { |                 Button { | ||||||
| @@ -76,14 +75,15 @@ ColumnLayout{ | |||||||
|                     text: qsTr("Remove") |                     text: qsTr("Remove") | ||||||
|                     property alias currentIndex: profilesView.currentIndex |                     property alias currentIndex: profilesView.currentIndex | ||||||
|  |  | ||||||
|                     enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin |                     enabled: currentIndex >= 0 && !appSettings.profilesList.get( | ||||||
|  |                                  currentIndex).builtin | ||||||
|                     onClicked: { |                     onClicked: { | ||||||
|                         appSettings.profilesList.remove(currentIndex); |                         appSettings.profilesList.remove(currentIndex) | ||||||
|                         profilesView.selection.clear(); |                         profilesView.selection.clear() | ||||||
|  |  | ||||||
|                         // TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2. |                         // TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2. | ||||||
|                         profilesView.model = 0; |                         profilesView.model = 0 | ||||||
|                         profilesView.model = appSettings.profilesList; |                         profilesView.model = appSettings.profilesList | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 Item { |                 Item { | ||||||
| @@ -94,31 +94,36 @@ ColumnLayout{ | |||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                     text: qsTr("Import") |                     text: qsTr("Import") | ||||||
|                     onClicked: { |                     onClicked: { | ||||||
|                         fileDialog.selectExisting = true; |                         fileDialog.selectExisting = true | ||||||
|                         fileDialog.callBack = function (url) {loadFile(url);}; |                         fileDialog.callBack = function (url) { | ||||||
|                         fileDialog.open(); |                             loadFile(url) | ||||||
|  |                         } | ||||||
|  |                         fileDialog.open() | ||||||
|                     } |                     } | ||||||
|                     function loadFile(url) { |                     function loadFile(url) { | ||||||
|                         try { |                         try { | ||||||
|                             if (appSettings.verbose) |                             if (appSettings.verbose) | ||||||
|                                 console.log("Loading file: " + url); |                                 console.log("Loading file: " + url) | ||||||
|  |  | ||||||
|                             var profileObject = JSON.parse(fileIO.read(url)); |                             var profileObject = JSON.parse(fileIO.read(url)) | ||||||
|                             var name = profileObject.name; |                             var name = profileObject.name | ||||||
|  |  | ||||||
|                             if (!name) |                             if (!name) | ||||||
|                                 throw "Profile doesn't have a name"; |                                 throw "Profile doesn't have a name" | ||||||
|  |  | ||||||
|                             var version = profileObject.version !== undefined ? profileObject.version : 1; |                             var version = profileObject.version | ||||||
|  |                                     !== undefined ? profileObject.version : 1 | ||||||
|                             if (version !== appSettings.profileVersion) |                             if (version !== appSettings.profileVersion) | ||||||
|                                 throw "This profile is not supported on this version of CRT."; |                                 throw "This profile is not supported on this version of CRT." | ||||||
|  |  | ||||||
|                             delete profileObject.name; |                             delete profileObject.name | ||||||
|  |  | ||||||
|                             appSettings.appendCustomProfile(name, JSON.stringify(profileObject)); |                             appSettings.appendCustomProfile(name, | ||||||
|  |                                                             JSON.stringify( | ||||||
|  |                                                                 profileObject)) | ||||||
|                         } catch (err) { |                         } catch (err) { | ||||||
|                             messageDialog.text = qsTr(err) |                             messageDialog.text = qsTr(err) | ||||||
|                             messageDialog.open(); |                             messageDialog.open() | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| @@ -128,36 +133,45 @@ ColumnLayout{ | |||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|  |  | ||||||
|                     text: qsTr("Export") |                     text: qsTr("Export") | ||||||
|                     enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin |                     enabled: currentIndex >= 0 && !appSettings.profilesList.get( | ||||||
|  |                                  currentIndex).builtin | ||||||
|                     onClicked: { |                     onClicked: { | ||||||
|                         fileDialog.selectExisting = false; |                         fileDialog.selectExisting = false | ||||||
|                         fileDialog.callBack = function (url) {storeFile(url);}; |                         fileDialog.callBack = function (url) { | ||||||
|                         fileDialog.open(); |                             storeFile(url) | ||||||
|  |                         } | ||||||
|  |                         fileDialog.open() | ||||||
|                     } |                     } | ||||||
|                     function storeFile(url) { |                     function storeFile(url) { | ||||||
|                         try { |                         try { | ||||||
|                             var urlString = url.toString(); |                             var urlString = url.toString() | ||||||
|  |  | ||||||
|                             // Fix the extension if it's missing. |                             // Fix the extension if it's missing. | ||||||
|                             var extension = urlString.substring(urlString.length - 5, urlString.length); |                             var extension = urlString.substring( | ||||||
|                             var urlTail = (extension === ".json" ? "" : ".json"); |                                         urlString.length - 5, urlString.length) | ||||||
|                             url += urlTail; |                             var urlTail = (extension === ".json" ? "" : ".json") | ||||||
|  |                             url += urlTail | ||||||
|  |  | ||||||
|                             if (true) |                             if (true) | ||||||
|                                 console.log("Storing file: " + url); |                                 console.log("Storing file: " + url) | ||||||
|  |  | ||||||
|                             var profileObject = appSettings.profilesList.get(currentIndex); |                             var profileObject = appSettings.profilesList.get( | ||||||
|                             var profileSettings = JSON.parse(profileObject.obj_string); |                                         currentIndex) | ||||||
|                             profileSettings["name"] = profileObject.text; |                             var profileSettings = JSON.parse( | ||||||
|                             profileSettings["version"] = appSettings.profileVersion; |                                         profileObject.obj_string) | ||||||
|  |                             profileSettings["name"] = profileObject.text | ||||||
|  |                             profileSettings["version"] = appSettings.profileVersion | ||||||
|  |  | ||||||
|                             var result = fileIO.write(url, JSON.stringify(profileSettings, undefined, 2)); |                             var result = fileIO.write(url, JSON.stringify( | ||||||
|  |                                                           profileSettings, | ||||||
|  |                                                           undefined, 2)) | ||||||
|                             if (!result) |                             if (!result) | ||||||
|                                 throw "The file could not be written."; |                                 throw "The file could not be written." | ||||||
|                         } catch (err) { |                         } catch (err) { | ||||||
|                             console.log(err); |                             console.log(err) | ||||||
|                             messageDialog.text = qsTr("There has been an error storing the file.") |                             messageDialog.text = qsTr( | ||||||
|                             messageDialog.open(); |                                         "There has been an error storing the file.") | ||||||
|  |                             messageDialog.open() | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| @@ -171,22 +185,37 @@ ColumnLayout{ | |||||||
|         GridLayout { |         GridLayout { | ||||||
|             anchors.fill: parent |             anchors.fill: parent | ||||||
|             columns: 2 |             columns: 2 | ||||||
|             Label{ text: qsTr("Brightness") } |             Label { | ||||||
|  |                 text: qsTr("Brightness") | ||||||
|  |             } | ||||||
|             SimpleSlider { |             SimpleSlider { | ||||||
|                 onValueChanged: appSettings.brightness = value |                 onValueChanged: appSettings.brightness = value | ||||||
|                 value: appSettings.brightness |                 value: appSettings.brightness | ||||||
|             } |             } | ||||||
|             Label{ text: qsTr("Contrast") } |             Label { | ||||||
|  |                 text: qsTr("Contrast") | ||||||
|  |             } | ||||||
|             SimpleSlider { |             SimpleSlider { | ||||||
|                 onValueChanged: appSettings.contrast = value |                 onValueChanged: appSettings.contrast = value | ||||||
|                 value: appSettings.contrast |                 value: appSettings.contrast | ||||||
|             } |             } | ||||||
|             Label{ text: qsTr("Margin") } |             Label { | ||||||
|  |                 text: qsTr("Margin") | ||||||
|  |             } | ||||||
|             SimpleSlider { |             SimpleSlider { | ||||||
|                 onValueChanged: appSettings._margin = value |                 onValueChanged: appSettings._margin = value | ||||||
|                 value: appSettings._margin |                 value: appSettings._margin | ||||||
|             } |             } | ||||||
|             Label{ text: qsTr("Opacity") } |             Label { | ||||||
|  |                 text: qsTr("Frame size") | ||||||
|  |             } | ||||||
|  |             SimpleSlider { | ||||||
|  |                 onValueChanged: appSettings._frameMargin = value | ||||||
|  |                 value: appSettings._frameMargin | ||||||
|  |             } | ||||||
|  |             Label { | ||||||
|  |                 text: qsTr("Opacity") | ||||||
|  |             } | ||||||
|             SimpleSlider { |             SimpleSlider { | ||||||
|                 onValueChanged: appSettings.windowOpacity = value |                 onValueChanged: appSettings.windowOpacity = value | ||||||
|                 value: appSettings.windowOpacity |                 value: appSettings.windowOpacity | ||||||
| @@ -198,14 +227,15 @@ ColumnLayout{ | |||||||
|     InsertNameDialog { |     InsertNameDialog { | ||||||
|         id: insertname |         id: insertname | ||||||
|         onNameSelected: { |         onNameSelected: { | ||||||
|             appSettings.appendCustomProfile(name, appSettings.composeProfileString()); |             appSettings.appendCustomProfile(name, | ||||||
|  |                                             appSettings.composeProfileString()) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     MessageDialog { |     MessageDialog { | ||||||
|         id: messageDialog |         id: messageDialog | ||||||
|         title: qsTr("File Error") |         title: qsTr("File Error") | ||||||
|         onAccepted: { |         onAccepted: { | ||||||
|             messageDialog.close(); |             messageDialog.close() | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     Loader { |     Loader { | ||||||
| @@ -218,18 +248,18 @@ ColumnLayout{ | |||||||
|             selectMultiple: false |             selectMultiple: false | ||||||
|             selectFolder: false |             selectFolder: false | ||||||
|             selectExisting: fileDialog.selectExisting |             selectExisting: fileDialog.selectExisting | ||||||
|             onAccepted: callBack(fileUrl); |             onAccepted: callBack(fileUrl) | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         onSelectExistingChanged: reload() |         onSelectExistingChanged: reload() | ||||||
|  |  | ||||||
|         function open() { |         function open() { | ||||||
|             item.open(); |             item.open() | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         function reload() { |         function reload() { | ||||||
|             active = false; |             active = false | ||||||
|             active = true; |             active = true | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,7 +17,6 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.1 | import QtQuick.Controls 2.1 | ||||||
| import QtQuick.Layouts 1.1 | import QtQuick.Layouts 1.1 | ||||||
| @@ -33,43 +32,49 @@ ColumnLayout{ | |||||||
|         GridLayout { |         GridLayout { | ||||||
|             anchors.fill: parent |             anchors.fill: parent | ||||||
|             columns: 2 |             columns: 2 | ||||||
|             Label { text: qsTr("Rasterization") } |             Label { | ||||||
|  |                 text: qsTr("Rasterization") | ||||||
|  |             } | ||||||
|             ComboBox { |             ComboBox { | ||||||
|                 id: rasterizationBox |                 id: rasterizationBox | ||||||
|  |  | ||||||
|                 property string selectedElement: model[currentIndex] |                 property string selectedElement: model[currentIndex] | ||||||
|  |  | ||||||
|                 Layout.fillWidth: true |                 Layout.fillWidth: true | ||||||
|                 model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")] |                 model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels"), qsTr("Sub-Pixels")] | ||||||
|                 currentIndex: appSettings.rasterization |                 currentIndex: appSettings.rasterization | ||||||
|                 onCurrentIndexChanged: { |                 onCurrentIndexChanged: { | ||||||
|                     appSettings.rasterization = currentIndex |                     appSettings.rasterization = currentIndex | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             Label{ text: qsTr("Name") } |             Label { | ||||||
|  |                 text: qsTr("Name") | ||||||
|  |             } | ||||||
|             ComboBox { |             ComboBox { | ||||||
|                 id: fontChanger |                 id: fontChanger | ||||||
|                 Layout.fillWidth: true |                 Layout.fillWidth: true | ||||||
|                 model: appSettings.fontlist |                 model: appSettings.fontlist | ||||||
|                 textRole: "text" |                 textRole: "text" | ||||||
|                 onActivated: { |                 onActivated: { | ||||||
|                     var name = appSettings.fontlist.get(index).name; |                     var name = appSettings.fontlist.get(index).name | ||||||
|                     appSettings.fontNames[appSettings.rasterization] = name; |                     appSettings.fontNames[appSettings.rasterization] = name | ||||||
|                     appSettings.handleFontChanged(); |                     appSettings.handleFontChanged() | ||||||
|                 } |                 } | ||||||
|                 function updateIndex() { |                 function updateIndex() { | ||||||
|                     var name = appSettings.fontNames[appSettings.rasterization]; |                     var name = appSettings.fontNames[appSettings.rasterization] | ||||||
|                     var index = appSettings.getIndexByName(name); |                     var index = appSettings.getIndexByName(name) | ||||||
|                     if (index !== undefined) |                     if (index !== undefined) | ||||||
|                         currentIndex = index; |                         currentIndex = index | ||||||
|                 } |                 } | ||||||
|                 Connections { |                 Connections { | ||||||
|                     target: appSettings |                     target: appSettings | ||||||
|                     onTerminalFontChanged: fontChanger.updateIndex(); |                     onTerminalFontChanged: fontChanger.updateIndex() | ||||||
|                 } |                 } | ||||||
|                 Component.onCompleted: updateIndex(); |                 Component.onCompleted: updateIndex() | ||||||
|  |             } | ||||||
|  |             Label { | ||||||
|  |                 text: qsTr("Scaling") | ||||||
|             } |             } | ||||||
|             Label{ text: qsTr("Scaling") } |  | ||||||
|             RowLayout { |             RowLayout { | ||||||
|                 Layout.fillWidth: true |                 Layout.fillWidth: true | ||||||
|                 Slider { |                 Slider { | ||||||
| @@ -78,20 +83,22 @@ ColumnLayout{ | |||||||
|                     onValueChanged: appSettings.fontScaling = value |                     onValueChanged: appSettings.fontScaling = value | ||||||
|                     value: appSettings.fontScaling |                     value: appSettings.fontScaling | ||||||
|                     stepSize: 0.05 |                     stepSize: 0.05 | ||||||
|                     from: appSettings.minimumFontScaling; |                     from: appSettings.minimumFontScaling | ||||||
|                     to: appSettings.maximumFontScaling; |                     to: appSettings.maximumFontScaling | ||||||
|                 } |                 } | ||||||
|                 SizedLabel { |                 SizedLabel { | ||||||
|                     text: Math.round(fontScalingChanger.value * 100) + "%" |                     text: Math.round(fontScalingChanger.value * 100) + "%" | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             Label{ text: qsTr("Font Width") } |             Label { | ||||||
|  |                 text: qsTr("Font Width") | ||||||
|  |             } | ||||||
|             RowLayout { |             RowLayout { | ||||||
|                 Layout.fillWidth: true |                 Layout.fillWidth: true | ||||||
|                 Slider { |                 Slider { | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                     id: widthChanger |                     id: widthChanger | ||||||
|                     onValueChanged: appSettings.fontWidth = value; |                     onValueChanged: appSettings.fontWidth = value | ||||||
|                     value: appSettings.fontWidth |                     value: appSettings.fontWidth | ||||||
|                     stepSize: 0.05 |                     stepSize: 0.05 | ||||||
|                     from: 0.5 |                     from: 0.5 | ||||||
| @@ -146,14 +153,14 @@ ColumnLayout{ | |||||||
|                     name: qsTr("Font") |                     name: qsTr("Font") | ||||||
|                     height: 50 |                     height: 50 | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                     onColorSelected: appSettings._fontColor = color; |                     onColorSelected: appSettings._fontColor = color | ||||||
|                     color: appSettings._fontColor |                     color: appSettings._fontColor | ||||||
|                 } |                 } | ||||||
|                 ColorButton { |                 ColorButton { | ||||||
|                     name: qsTr("Background") |                     name: qsTr("Background") | ||||||
|                     height: 50 |                     height: 50 | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                     onColorSelected: appSettings._backgroundColor = color; |                     onColorSelected: appSettings._backgroundColor = color | ||||||
|                     color: appSettings._backgroundColor |                     color: appSettings._backgroundColor | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
|   | |||||||
							
								
								
									
										91
									
								
								app/qml/ShaderLibrary.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								app/qml/ShaderLibrary.qml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | |||||||
|  | import QtQuick 2.0 | ||||||
|  |  | ||||||
|  | QtObject { | ||||||
|  |     property string rasterizationShader: | ||||||
|  |         (appSettings.rasterization === appSettings.no_rasterization ? " | ||||||
|  |             lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) { | ||||||
|  |                 return texel; | ||||||
|  |             }" : "") + | ||||||
|  |  | ||||||
|  |         (appSettings.rasterization === appSettings.scanline_rasterization ? " | ||||||
|  |             #define INTENSITY 0.30 | ||||||
|  |             #define BRIGHTBOOST 0.30 | ||||||
|  |  | ||||||
|  |             lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) { | ||||||
|  |                 lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel; | ||||||
|  |                 lowp vec3 pixelLow  = ((1.0 - INTENSITY) + (0.1 * texel)) * texel; | ||||||
|  |  | ||||||
|  |                 vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0); | ||||||
|  |                 lowp float mask = 1.0 - abs(coords.y); | ||||||
|  |  | ||||||
|  |                 lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask); | ||||||
|  |                 return mix(texel, rasterizationColor, intensity); | ||||||
|  |             }" : "") + | ||||||
|  |  | ||||||
|  |         (appSettings.rasterization === appSettings.pixel_rasterization ? " | ||||||
|  |             #define INTENSITY 0.30 | ||||||
|  |             #define BRIGHTBOOST 0.30 | ||||||
|  |  | ||||||
|  |             lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) { | ||||||
|  |                 lowp vec3 result = texel; | ||||||
|  |  | ||||||
|  |                 lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel; | ||||||
|  |                 lowp vec3 pixelLow  = ((1.0 - INTENSITY) + (0.1 * texel)) * texel; | ||||||
|  |  | ||||||
|  |                 vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0); | ||||||
|  |                 coords = coords * coords; | ||||||
|  |                 lowp float mask = 1.0 - coords.x - coords.y; | ||||||
|  |  | ||||||
|  |                 lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask); | ||||||
|  |                 return mix(texel, rasterizationColor, intensity); | ||||||
|  |             }" : "") + | ||||||
|  |  | ||||||
|  |         (appSettings.rasterization === appSettings.subpixel_rasterization ? " | ||||||
|  |             #define INTENSITY 0.30 | ||||||
|  |             #define BRIGHTBOOST 0.30 | ||||||
|  |             #define SUBPIXELS 3.0 | ||||||
|  |             const vec3 offsets = vec3(3.141592654) * vec3(1.0/2.0,1.0/2.0 - 2.0/3.0,1.0/2.0-4.0/3.0); | ||||||
|  |  | ||||||
|  |             lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) { | ||||||
|  |                 vec2 omega = vec2(3.141592654) * vec2(2.0) * virtualResolution; | ||||||
|  |                 vec2 angle = screenCoords * omega; | ||||||
|  |                 vec3 xfactors = (SUBPIXELS + sin(angle.x + offsets)) / (SUBPIXELS + 1.0); | ||||||
|  |  | ||||||
|  |                 lowp vec3 result = texel * xfactors; | ||||||
|  |                 lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * result)) * result; | ||||||
|  |                 lowp vec3 pixelLow  = ((1.0 - INTENSITY) + (0.1 * result)) * result; | ||||||
|  |  | ||||||
|  |                 vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0); | ||||||
|  |                 lowp float mask = 1.0 - abs(coords.y); | ||||||
|  |  | ||||||
|  |                 lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask); | ||||||
|  |                 return mix(texel, rasterizationColor, intensity); | ||||||
|  |             }" : "") + | ||||||
|  |  | ||||||
|  |         "\n\n" | ||||||
|  |  | ||||||
|  |     property string min2: " | ||||||
|  |         float min2(vec2 v) { | ||||||
|  |             return min(v.x, v.y); | ||||||
|  |         }\n\n" | ||||||
|  |  | ||||||
|  |     property string rgb2grey: " | ||||||
|  |         float rgb2grey(vec3 v) { | ||||||
|  |             return dot(v, vec3(0.21, 0.72, 0.04)); | ||||||
|  |         }\n\n" | ||||||
|  |  | ||||||
|  |     property string max2: " | ||||||
|  |         float max2(vec2 v) { | ||||||
|  |             return max(v.x, v.y); | ||||||
|  |         }\n\n" | ||||||
|  |  | ||||||
|  |     property string prod2: " | ||||||
|  |         float prod2(vec2 v) { | ||||||
|  |             return v.x * v.y; | ||||||
|  |         }\n\n" | ||||||
|  |  | ||||||
|  |     property string sum2: " | ||||||
|  |         float sum2(vec2 v) { | ||||||
|  |             return v.x + v.y; | ||||||
|  |         }\n\n" | ||||||
|  | } | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -38,11 +38,19 @@ Item { | |||||||
|  |  | ||||||
|     property real ambientLight: appSettings.ambientLight * 0.2 |     property real ambientLight: appSettings.ambientLight * 0.2 | ||||||
|  |  | ||||||
|     property size virtual_resolution |     property size virtualResolution | ||||||
|  |     property size screenResolution | ||||||
|  |  | ||||||
|  |     property real _screenDensity: Math.min( | ||||||
|  |         screenResolution.width / virtualResolution.width, | ||||||
|  |         screenResolution.height / virtualResolution.height | ||||||
|  |     ) | ||||||
|  |  | ||||||
|      ShaderEffect { |      ShaderEffect { | ||||||
|          id: dynamicShader |          id: dynamicShader | ||||||
|  |  | ||||||
|  |          property ShaderLibrary shaderLibrary: ShaderLibrary { } | ||||||
|  |  | ||||||
|          property ShaderEffectSource screenBuffer: frameBuffer |          property ShaderEffectSource screenBuffer: frameBuffer | ||||||
|          property ShaderEffectSource burnInSource: burnInEffect.source |          property ShaderEffectSource burnInSource: burnInEffect.source | ||||||
|          property ShaderEffectSource frameSource: terminalFrameLoader.item |          property ShaderEffectSource frameSource: terminalFrameLoader.item | ||||||
| @@ -71,10 +79,16 @@ Item { | |||||||
|          property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * 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) |          property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight) | ||||||
|          property real staticNoise: appSettings.staticNoise |          property real staticNoise: appSettings.staticNoise | ||||||
|          property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling), |          property size scaleNoiseSize: Qt.size((width * 0.75) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling), | ||||||
|                                                (height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling)) |                                                (height * 0.75) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling)) | ||||||
|  |  | ||||||
|          property size virtual_resolution: parent.virtual_resolution |          property size virtualResolution: parent.virtualResolution | ||||||
|  |  | ||||||
|  |          // Rasterization might display oversamping issues if virtual resolution is close to physical display resolution. | ||||||
|  |          // We progressively disable rasterization from 4x up to 2x resolution. | ||||||
|  |          property real rasterizationIntensity: Utils.smoothstep(2.0, 4.0, _screenDensity) | ||||||
|  |  | ||||||
|  |          property real displayTerminalFrame: appSettings._frameMargin > 0 || appSettings.screenCurvature > 0 | ||||||
|  |  | ||||||
|          property real time: timeManager.time |          property real time: timeManager.time | ||||||
|          property ShaderEffectSource noiseSource: noiseShaderSource |          property ShaderEffectSource noiseSource: noiseShaderSource | ||||||
| @@ -164,7 +178,8 @@ Item { | |||||||
|              uniform highp vec4 backgroundColor; |              uniform highp vec4 backgroundColor; | ||||||
|              uniform lowp float shadowLength; |              uniform lowp float shadowLength; | ||||||
|  |  | ||||||
|              uniform highp vec2 virtual_resolution;" + |              uniform highp vec2 virtualResolution; | ||||||
|  |              uniform lowp float rasterizationIntensity;\n" + | ||||||
|  |  | ||||||
|              (burnIn !== 0 ? " |              (burnIn !== 0 ? " | ||||||
|                  uniform sampler2D burnInSource; |                  uniform sampler2D burnInSource; | ||||||
| @@ -174,13 +189,13 @@ Item { | |||||||
|                  uniform sampler2D slowBurnInSource;" : "") + |                  uniform sampler2D slowBurnInSource;" : "") + | ||||||
|              (staticNoise !== 0 ? " |              (staticNoise !== 0 ? " | ||||||
|                  uniform highp float staticNoise;" : "") + |                  uniform highp float staticNoise;" : "") + | ||||||
|              (((staticNoise !== 0 || jitter !== 0) |              (((staticNoise !== 0 || jitter !== 0) ||(fallBack && (flickering || horizontalSync))) ? " | ||||||
|                ||(fallBack && (flickering || horizontalSync))) ? " |  | ||||||
|                  uniform lowp sampler2D noiseSource; |                  uniform lowp sampler2D noiseSource; | ||||||
|                  uniform highp vec2 scaleNoiseSize;" : "") + |                  uniform highp vec2 scaleNoiseSize;" : "") + | ||||||
|              (screenCurvature !== 0 ? " |              (displayTerminalFrame ? " | ||||||
|                  uniform highp float screenCurvature; |  | ||||||
|                  uniform lowp sampler2D frameSource;" : "") + |                  uniform lowp sampler2D frameSource;" : "") + | ||||||
|  |              (screenCurvature !== 0 ? " | ||||||
|  |                  uniform highp float screenCurvature;" : "") + | ||||||
|              (glowingLine !== 0 ? " |              (glowingLine !== 0 ? " | ||||||
|                  uniform highp float glowingLine;" : "") + |                  uniform highp float glowingLine;" : "") + | ||||||
|              (chromaColor !== 0 ? " |              (chromaColor !== 0 ? " | ||||||
| @@ -203,17 +218,14 @@ Item { | |||||||
|  |  | ||||||
|              (glowingLine !== 0 ? " |              (glowingLine !== 0 ? " | ||||||
|                  float randomPass(vec2 coords){ |                  float randomPass(vec2 coords){ | ||||||
|                      return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015))); |                      return fract(smoothstep(-120.0, 0.0, coords.y - (virtualResolution.y + 120.0) * fract(time * 0.00015))); | ||||||
|                  }" : "") + |                  }" : "") + | ||||||
|  |  | ||||||
|              "float min2(vec2 v) { |              shaderLibrary.min2 + | ||||||
|                  return min(v.x, v.y); |              shaderLibrary.rgb2grey + | ||||||
|              } |              shaderLibrary.rasterizationShader + | ||||||
|  |  | ||||||
|              float rgb2grey(vec3 v){ |  | ||||||
|                  return dot(v, vec3(0.21, 0.72, 0.04)); |  | ||||||
|              } |  | ||||||
|  |  | ||||||
|  |              " | ||||||
|              float isInScreen(vec2 v) { |              float isInScreen(vec2 v) { | ||||||
|                  return min2(step(0.0, v) - step(1.0, v)); |                  return min2(step(0.0, v) - step(1.0, v)); | ||||||
|              } |              } | ||||||
| @@ -291,7 +303,7 @@ Item { | |||||||
|                      color += noiseVal * noise * (1.0 - distance * 1.3);" : "") + |                      color += noiseVal * noise * (1.0 - distance * 1.3);" : "") + | ||||||
|  |  | ||||||
|                  (glowingLine !== 0 ? " |                  (glowingLine !== 0 ? " | ||||||
|                      color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + |                      color += randomPass(coords * virtualResolution) * glowingLine;" : "") + | ||||||
|  |  | ||||||
|                  "vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" + |                  "vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" + | ||||||
|  |  | ||||||
| @@ -309,6 +321,8 @@ Item { | |||||||
|  |  | ||||||
|                   "txt_color += fontColor.rgb * vec3(color);" + |                   "txt_color += fontColor.rgb * vec3(color);" + | ||||||
|  |  | ||||||
|  |                   "txt_color = applyRasterization(staticCoords, txt_color, virtualResolution, rasterizationIntensity);\n" + | ||||||
|  |  | ||||||
|                  "vec3 finalColor = txt_color;" + |                  "vec3 finalColor = txt_color;" + | ||||||
|  |  | ||||||
|                  (flickering !== 0 ? " |                  (flickering !== 0 ? " | ||||||
| @@ -317,7 +331,7 @@ Item { | |||||||
|                  (ambientLight !== 0 ? " |                  (ambientLight !== 0 ? " | ||||||
|                      finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") + |                      finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") + | ||||||
|  |  | ||||||
|                  (screenCurvature !== 0 ? |                  (displayTerminalFrame ? | ||||||
|                     "vec4 frameColor = texture2D(frameSource, qt_TexCoord0); |                     "vec4 frameColor = texture2D(frameSource, qt_TexCoord0); | ||||||
|                      finalColor = mix(finalColor, frameColor.rgb, frameColor.a);" |                      finalColor = mix(finalColor, frameColor.rgb, frameColor.a);" | ||||||
|                  : "") + |                  : "") + | ||||||
| @@ -340,7 +354,7 @@ Item { | |||||||
|      Loader { |      Loader { | ||||||
|          id: terminalFrameLoader |          id: terminalFrameLoader | ||||||
|  |  | ||||||
|          active: screenCurvature !== 0 |          active: dynamicShader.displayTerminalFrame | ||||||
|  |  | ||||||
|          width: staticShader.width |          width: staticShader.width | ||||||
|          height: staticShader.height |          height: staticShader.height | ||||||
| @@ -352,7 +366,7 @@ Item { | |||||||
|              visible: false |              visible: false | ||||||
|              format: ShaderEffectSource.RGBA |              format: ShaderEffectSource.RGBA | ||||||
|  |  | ||||||
|              NewTerminalFrame { |              TerminalFrame { | ||||||
|                  id: terminalFrame |                  id: terminalFrame | ||||||
|                  blending: false |                  blending: false | ||||||
|                  anchors.fill: parent |                  anchors.fill: parent | ||||||
| @@ -360,6 +374,10 @@ Item { | |||||||
|          } |          } | ||||||
|      } |      } | ||||||
|  |  | ||||||
|  |      ShaderLibrary { | ||||||
|  |          id: shaderLibrary | ||||||
|  |      } | ||||||
|  |  | ||||||
|      ShaderEffect { |      ShaderEffect { | ||||||
|          id: staticShader |          id: staticShader | ||||||
|  |  | ||||||
| @@ -385,7 +403,7 @@ Item { | |||||||
|  |  | ||||||
|          property real ambientLight: parent.ambientLight |          property real ambientLight: parent.ambientLight | ||||||
|  |  | ||||||
|          property size virtual_resolution: parent.virtual_resolution |          property size virtualResolution: parent.virtualResolution | ||||||
|  |  | ||||||
|          blending: false |          blending: false | ||||||
|          visible: false |          visible: false | ||||||
| @@ -408,7 +426,7 @@ Item { | |||||||
|              uniform highp vec4 backgroundColor; |              uniform highp vec4 backgroundColor; | ||||||
|              uniform lowp float screen_brightness; |              uniform lowp float screen_brightness; | ||||||
|  |  | ||||||
|              uniform highp vec2 virtual_resolution;" + |              uniform highp vec2 virtualResolution;" + | ||||||
|  |  | ||||||
|              (bloom !== 0 ? " |              (bloom !== 0 ? " | ||||||
|                  uniform highp sampler2D bloomSource; |                  uniform highp sampler2D bloomSource; | ||||||
| @@ -426,36 +444,9 @@ Item { | |||||||
|              (ambientLight !== 0 ? " |              (ambientLight !== 0 ? " | ||||||
|                  uniform lowp float ambientLight;" : "") + |                  uniform lowp float ambientLight;" : "") + | ||||||
|  |  | ||||||
|              "highp float getScanlineIntensity(vec2 coords) { |              shaderLibrary.min2 + | ||||||
|                  float result = 1.0;" + |              shaderLibrary.sum2 + | ||||||
|  |              shaderLibrary.rgb2grey + | ||||||
|                 (appSettings.rasterization != appSettings.no_rasterization ? |  | ||||||
|                     "float val = 0.0; |  | ||||||
|                      vec2 rasterizationCoords = fract(coords * virtual_resolution); |  | ||||||
|                      val += smoothstep(0.0, 0.5, rasterizationCoords.y); |  | ||||||
|                      val -= smoothstep(0.5, 1.0, rasterizationCoords.y); |  | ||||||
|                      result *= mix(0.5, 1.0, val);" : "") + |  | ||||||
|  |  | ||||||
|                 (appSettings.rasterization == appSettings.pixel_rasterization ? |  | ||||||
|                     "val = 0.0; |  | ||||||
|                      val += smoothstep(0.0, 0.5, rasterizationCoords.x); |  | ||||||
|                      val -= smoothstep(0.5, 1.0, rasterizationCoords.x); |  | ||||||
|                      result *= mix(0.5, 1.0, val);" : "") + " |  | ||||||
|  |  | ||||||
|                 return result; |  | ||||||
|              } |  | ||||||
|  |  | ||||||
|              float min2(vec2 v) { |  | ||||||
|                  return min(v.x, v.y); |  | ||||||
|              } |  | ||||||
|  |  | ||||||
|              float sum2(vec2 v) { |  | ||||||
|                  return v.x + v.y; |  | ||||||
|              } |  | ||||||
|  |  | ||||||
|              float rgb2grey(vec3 v){ |  | ||||||
|                  return dot(v, vec3(0.21, 0.72, 0.04)); |  | ||||||
|              }" + |  | ||||||
|  |  | ||||||
|              "vec3 convertWithChroma(vec3 inColor) { |              "vec3 convertWithChroma(vec3 inColor) { | ||||||
|                 vec3 outColor = inColor;" + |                 vec3 outColor = inColor;" + | ||||||
| @@ -468,6 +459,7 @@ Item { | |||||||
|              "  return outColor; |              "  return outColor; | ||||||
|              }" + |              }" + | ||||||
|  |  | ||||||
|  |              shaderLibrary.rasterizationShader + | ||||||
|  |  | ||||||
|              "void main() {" + |              "void main() {" + | ||||||
|                  "vec2 cc = vec2(0.5) - qt_TexCoord0;" + |                  "vec2 cc = vec2(0.5) - qt_TexCoord0;" + | ||||||
| @@ -490,8 +482,6 @@ Item { | |||||||
|                      txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60; |                      txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60; | ||||||
|                  " : "") + |                  " : "") + | ||||||
|  |  | ||||||
|                   "txt_color *= getScanlineIntensity(txt_coords);" + |  | ||||||
|  |  | ||||||
|                   "txt_color += vec3(0.0001);" + |                   "txt_color += vec3(0.0001);" + | ||||||
|                   "float greyscale_color = rgb2grey(txt_color);" + |                   "float greyscale_color = rgb2grey(txt_color);" + | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,7 +17,6 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.0 | import QtQuick.Controls 2.0 | ||||||
| import QtQuick.Layouts 1.1 | import QtQuick.Layouts 1.1 | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,12 +17,12 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
|  |  | ||||||
| Rectangle { | Rectangle { | ||||||
|     property size terminalSize |     property size terminalSize | ||||||
|     property real topOpacity: 0.6 |     property real topOpacity: 0.6 | ||||||
|  |  | ||||||
|     width: textSize.width * 2 |     width: textSize.width * 2 | ||||||
|     height: textSize.height * 2 |     height: textSize.height * 2 | ||||||
|     radius: 5 |     radius: 5 | ||||||
| @@ -31,7 +31,11 @@ Rectangle{ | |||||||
|     color: "black" |     color: "black" | ||||||
|     opacity: sizetimer.running ? 0.6 : 0.0 |     opacity: sizetimer.running ? 0.6 : 0.0 | ||||||
|  |  | ||||||
|     Behavior on opacity{NumberAnimation{duration: 200}} |     Behavior on opacity { | ||||||
|  |         NumberAnimation { | ||||||
|  |             duration: 200 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     onTerminalSizeChanged: sizetimer.restart() |     onTerminalSizeChanged: sizetimer.restart() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,3 +1,23 @@ | |||||||
|  | /******************************************************************************* | ||||||
|  | * Copyright (c) 2013-2021 "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 <http://www.gnu.org/licenses/>. | ||||||
|  | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.0 | import QtQuick 2.0 | ||||||
|  |  | ||||||
| import "utils.js" as Utils | import "utils.js" as Utils | ||||||
| @@ -6,12 +26,10 @@ Loader { | |||||||
|     property ShaderEffectSource source: item ? item.source : null |     property ShaderEffectSource source: item ? item.source : null | ||||||
|  |  | ||||||
|     active: !appSettings.useFastBurnIn && appSettings.burnIn !== 0 |     active: !appSettings.useFastBurnIn && appSettings.burnIn !== 0 | ||||||
|  |  | ||||||
|     anchors.fill: parent |     anchors.fill: parent | ||||||
|  |  | ||||||
|     sourceComponent: Item { |     sourceComponent: Item { | ||||||
|         property alias source: burnInSourceEffect |         property alias source: burnInSourceEffect | ||||||
|  |  | ||||||
|         property int burnInScaling: scaleTexture * appSettings.burnInQuality |         property int burnInScaling: scaleTexture * appSettings.burnInQuality | ||||||
|  |  | ||||||
|         ShaderEffectSource { |         ShaderEffectSource { | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -27,7 +27,7 @@ QtObject { | |||||||
|     property bool initialized: false |     property bool initialized: false | ||||||
|  |  | ||||||
|     function getDatabase() { |     function getDatabase() { | ||||||
|          return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000); |          return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function initialize() { |     function initialize() { | ||||||
| @@ -35,9 +35,10 @@ QtObject { | |||||||
|         db.transaction( |         db.transaction( | ||||||
|             function(tx) { |             function(tx) { | ||||||
|                 tx.executeSql('CREATE TABLE IF NOT EXISTS settings(setting TEXT UNIQUE, value TEXT)'); |                 tx.executeSql('CREATE TABLE IF NOT EXISTS settings(setting TEXT UNIQUE, value TEXT)'); | ||||||
|           }); |             } | ||||||
|  |         ) | ||||||
|  |  | ||||||
|         initialized = true; |         initialized = true | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function setSetting(setting, value) { |     function setSetting(setting, value) { | ||||||
| @@ -45,7 +46,8 @@ QtObject { | |||||||
|  |  | ||||||
|         var db = getDatabase(); |         var db = getDatabase(); | ||||||
|         var res = ""; |         var res = ""; | ||||||
|        db.transaction(function(tx) { |         db.transaction( | ||||||
|  |             function(tx) { | ||||||
|                 var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]); |                 var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]); | ||||||
|                 //console.log(rs.rowsAffected) |                 //console.log(rs.rowsAffected) | ||||||
|                 if (rs.rowsAffected > 0) { |                 if (rs.rowsAffected > 0) { | ||||||
| @@ -54,23 +56,25 @@ QtObject { | |||||||
|                     res = "Error"; |                     res = "Error"; | ||||||
|                 } |                 } | ||||||
|            } |            } | ||||||
|       ); |       ) | ||||||
|       // The function returns “OK” if it was successful, or “Error” if it wasn't |       // The function returns “OK” if it was successful, or “Error” if it wasn't | ||||||
|       return res; |       return res | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function getSetting(setting) { |     function getSetting(setting) { | ||||||
|         if(!initialized) initialize(); |         if(!initialized) initialize(); | ||||||
|         var db = getDatabase(); |         var db = getDatabase(); | ||||||
|         var res = ""; |         var res = ""; | ||||||
|        db.transaction(function(tx) { |         db.transaction( | ||||||
|  |             function(tx) { | ||||||
|                 var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]); |                 var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]); | ||||||
|                 if (rs.rows.length > 0) { |                 if (rs.rows.length > 0) { | ||||||
|                 res = rs.rows.item(0).value; |                 res = rs.rows.item(0).value; | ||||||
|                 } else { |                 } else { | ||||||
|                 res = undefined; |                 res = undefined; | ||||||
|                 } |                 } | ||||||
|       }) |             } | ||||||
|  |         ) | ||||||
|         return res |         return res | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -79,6 +83,7 @@ QtObject { | |||||||
|         db.transaction( |         db.transaction( | ||||||
|             function(tx) { |             function(tx) { | ||||||
|                 tx.executeSql('DROP TABLE settings'); |                 tx.executeSql('DROP TABLE settings'); | ||||||
|           }); |             } | ||||||
|  |         ) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,3 +1,22 @@ | |||||||
|  | /******************************************************************************* | ||||||
|  | * Copyright (c) 2013-2021 "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 <http://www.gnu.org/licenses/>. | ||||||
|  | *******************************************************************************/ | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtGraphicalEffects 1.0 | import QtGraphicalEffects 1.0 | ||||||
|  |  | ||||||
| @@ -7,13 +26,19 @@ ShaderTerminal { | |||||||
|     property alias title: terminal.title |     property alias title: terminal.title | ||||||
|     property alias terminalSize: terminal.terminalSize |     property alias terminalSize: terminal.terminalSize | ||||||
|  |  | ||||||
|  |     property real devicePixelRatio: terminalWindow.screen.devicePixelRatio | ||||||
|  |  | ||||||
|     id: mainShader |     id: mainShader | ||||||
|     opacity: appSettings.windowOpacity * 0.3 + 0.7 |     opacity: appSettings.windowOpacity * 0.3 + 0.7 | ||||||
|  |  | ||||||
|     source: terminal.mainSource |     source: terminal.mainSource | ||||||
|     burnInEffect: terminal.burnInEffect |     burnInEffect: terminal.burnInEffect | ||||||
|     slowBurnInEffect: terminal.slowBurnInEffect |     slowBurnInEffect: terminal.slowBurnInEffect | ||||||
|     virtual_resolution: terminal.virtualResolution |     virtualResolution: terminal.virtualResolution | ||||||
|  |     screenResolution: Qt.size( | ||||||
|  |         terminalWindow.width * devicePixelRatio * appSettings.windowScaling, | ||||||
|  |         terminalWindow.height * devicePixelRatio * appSettings.windowScaling | ||||||
|  |     ) | ||||||
|  |  | ||||||
|     TimeManager { |     TimeManager { | ||||||
|         id: timeManager |         id: timeManager | ||||||
| @@ -26,7 +51,6 @@ ShaderTerminal { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     //  EFFECTS  //////////////////////////////////////////////////////////////// |     //  EFFECTS  //////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     Loader { |     Loader { | ||||||
|         id: bloomEffectLoader |         id: bloomEffectLoader | ||||||
|         active: appSettings.bloom |         active: appSettings.bloom | ||||||
| @@ -35,7 +59,7 @@ ShaderTerminal { | |||||||
|         height: parent.height * appSettings.bloomQuality |         height: parent.height * appSettings.bloomQuality | ||||||
|  |  | ||||||
|         sourceComponent: FastBlur { |         sourceComponent: FastBlur { | ||||||
|             radius: Utils.lint(16, 64, appSettings.bloomQuality); |             radius: Utils.lint(16, 64, appSettings.bloomQuality) | ||||||
|             source: terminal.mainSource |             source: terminal.mainSource | ||||||
|             transparentBorder: true |             transparentBorder: true | ||||||
|         } |         } | ||||||
| @@ -54,71 +78,4 @@ ShaderTerminal { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     bloomSource: bloomSourceLoader.item |     bloomSource: bloomSourceLoader.item | ||||||
|  |  | ||||||
| //    NewTerminalFrame { |  | ||||||
| //        id: terminalFrame |  | ||||||
| //        anchors.fill: parent |  | ||||||
| //        blending: true |  | ||||||
| //    } |  | ||||||
|  |  | ||||||
|     // This shader might be useful in the future. Since we used it only for a couple |  | ||||||
|     // of calculations is probably best to move those in the main shader. If in the future |  | ||||||
|     // we need to store another fullScreen channel this might be handy. |  | ||||||
|  |  | ||||||
| //    ShaderEffect { |  | ||||||
| //        id: rasterizationEffect |  | ||||||
| //        width: parent.width |  | ||||||
| //        height: parent.height |  | ||||||
| //        property real outColor: 0.0 |  | ||||||
| //        property real dispX: (5 / width) * appSettings.windowScaling |  | ||||||
| //        property real dispY: (5 / height) * appSettings.windowScaling |  | ||||||
| //        property size virtual_resolution: terminal.virtualResolution |  | ||||||
|  |  | ||||||
| //        blending: false |  | ||||||
|  |  | ||||||
| //        fragmentShader: |  | ||||||
| //            "uniform lowp float qt_Opacity;" + |  | ||||||
|  |  | ||||||
| //            "varying highp vec2 qt_TexCoord0; |  | ||||||
| //             uniform highp vec2 virtual_resolution; |  | ||||||
| //             uniform highp float dispX; |  | ||||||
| //             uniform highp float dispY; |  | ||||||
| //             uniform mediump float outColor; |  | ||||||
|  |  | ||||||
| //             highp float getScanlineIntensity(vec2 coords) { |  | ||||||
| //                 highp float result = 1.0;" + |  | ||||||
|  |  | ||||||
| //                (appSettings.rasterization != appSettings.no_rasterization ? |  | ||||||
| //                    "result *= abs(sin(coords.y * virtual_resolution.y * "+Math.PI+"));" : "") + |  | ||||||
| //                (appSettings.rasterization == appSettings.pixel_rasterization ? |  | ||||||
| //                    "result *= abs(sin(coords.x * virtual_resolution.x * "+Math.PI+"));" : "") + " |  | ||||||
|  |  | ||||||
| //                return result; |  | ||||||
| //             }" + |  | ||||||
|  |  | ||||||
| //            "void main() {" + |  | ||||||
| //                "highp float color = getScanlineIntensity(qt_TexCoord0);" + |  | ||||||
|  |  | ||||||
| //                "float distance = length(vec2(0.5) - qt_TexCoord0);" + |  | ||||||
| //                "color = mix(color, 0.0, 1.2 * distance * distance);" + |  | ||||||
|  |  | ||||||
| //                "color *= outColor + smoothstep(0.00, dispX, qt_TexCoord0.x) * (1.0 - outColor);" + |  | ||||||
| //                "color *= outColor + smoothstep(0.00, dispY, qt_TexCoord0.y) * (1.0 - outColor);" + |  | ||||||
| //                "color *= outColor + (1.0 - smoothstep(1.00 - dispX, 1.00, qt_TexCoord0.x)) * (1.0 - outColor);" + |  | ||||||
| //                "color *= outColor + (1.0 - smoothstep(1.00 - dispY, 1.00, qt_TexCoord0.y)) * (1.0 - outColor);" + |  | ||||||
|  |  | ||||||
| //                "gl_FragColor.a = color;" + |  | ||||||
| //            "}" |  | ||||||
|  |  | ||||||
| //        onStatusChanged: if (log) console.log(log) //Print warning messages |  | ||||||
| //    } |  | ||||||
|  |  | ||||||
| //    rasterizationSource: ShaderEffectSource{ |  | ||||||
| //        id: rasterizationEffectSource |  | ||||||
| //        sourceItem: rasterizationEffect |  | ||||||
| //        hideSource: true |  | ||||||
| //        smooth: true |  | ||||||
| //        wrapMode: ShaderEffectSource.ClampToEdge |  | ||||||
| //        visible: false |  | ||||||
| //    } |  | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										104
									
								
								app/qml/TerminalFrame.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								app/qml/TerminalFrame.qml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,104 @@ | |||||||
|  | /******************************************************************************* | ||||||
|  | * Copyright (c) 2013-2021 "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 <http://www.gnu.org/licenses/>. | ||||||
|  | *******************************************************************************/ | ||||||
|  | import QtQuick 2.0 | ||||||
|  |  | ||||||
|  | import "utils.js" as Utils | ||||||
|  |  | ||||||
|  | ShaderEffect { | ||||||
|  |     property color _staticFrameColor: "#fff" | ||||||
|  |     property color _backgroundColor: appSettings.backgroundColor | ||||||
|  |     property color _fontColor: appSettings.fontColor | ||||||
|  |     property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2) | ||||||
|  |     property real _ambientLight: Utils.lint(0.2, 0.8, appSettings.ambientLight) | ||||||
|  |  | ||||||
|  |     property color frameColor: Utils.mix(_staticFrameColor, _lightColor, _ambientLight) | ||||||
|  |     property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize | ||||||
|  |  | ||||||
|  |     // Coefficient of the log curve used to approximate shadowing | ||||||
|  |     property real screenShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight) | ||||||
|  |     property real frameShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight) | ||||||
|  |  | ||||||
|  |     property size margin: Qt.size( | ||||||
|  |         appSettings.frameMargin / width * appSettings.windowScaling, | ||||||
|  |         appSettings.frameMargin / height * appSettings.windowScaling | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |     ShaderLibrary { | ||||||
|  |         id: shaderLibrary | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fragmentShader: " | ||||||
|  |         #ifdef GL_ES | ||||||
|  |             precision mediump float; | ||||||
|  |         #endif | ||||||
|  |  | ||||||
|  |         uniform lowp float screenCurvature; | ||||||
|  |         uniform lowp float screenShadowCoeff; | ||||||
|  |         uniform lowp float frameShadowCoeff; | ||||||
|  |         uniform highp float qt_Opacity; | ||||||
|  |         uniform lowp vec4 frameColor; | ||||||
|  |         uniform mediump vec2 margin; | ||||||
|  |  | ||||||
|  |         varying highp vec2 qt_TexCoord0; | ||||||
|  |  | ||||||
|  |         vec2 distortCoordinates(vec2 coords){ | ||||||
|  |             vec2 cc = (coords - vec2(0.5)); | ||||||
|  |             float dist = dot(cc, cc) * screenCurvature; | ||||||
|  |             return (coords + cc * (1.0 + dist) * dist); | ||||||
|  |         } | ||||||
|  |         " + | ||||||
|  |  | ||||||
|  |         shaderLibrary.max2 + | ||||||
|  |         shaderLibrary.min2 + | ||||||
|  |         shaderLibrary.prod2 + | ||||||
|  |         shaderLibrary.sum2 + | ||||||
|  |  | ||||||
|  |         " | ||||||
|  |  | ||||||
|  |         vec2 positiveLog(vec2 x) { | ||||||
|  |             return clamp(log(x), vec2(0.0), vec2(100.0)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         void main() { | ||||||
|  |             vec2 staticCoords = qt_TexCoord0; | ||||||
|  |             vec2 coords = distortCoordinates(staticCoords) * (vec2(1.0) + margin * 2.0) - margin; | ||||||
|  |  | ||||||
|  |             vec2 vignetteCoords = staticCoords * (1.0 - staticCoords.yx); | ||||||
|  |             float vignette = pow(prod2(vignetteCoords) * 15.0, 0.25); | ||||||
|  |  | ||||||
|  |             vec3 color = frameColor.rgb * vec3(1.0 - vignette); | ||||||
|  |             float alpha = 0.0; | ||||||
|  |  | ||||||
|  |             float frameShadow = max2(positiveLog(-coords * frameShadowCoeff + vec2(1.0)) + positiveLog(coords * frameShadowCoeff - (vec2(frameShadowCoeff) - vec2(1.0)))); | ||||||
|  |             frameShadow = max(sqrt(frameShadow), 0.0); | ||||||
|  |             color *= frameShadow; | ||||||
|  |             alpha = sum2(1.0 - step(vec2(0.0), coords) + step(vec2(1.0), coords)); | ||||||
|  |             alpha = clamp(alpha, 0.0, 1.0); | ||||||
|  |             alpha *= mix(1.0, 0.9, frameShadow); | ||||||
|  |  | ||||||
|  |             float screenShadow = 1.0 - prod2(positiveLog(coords * screenShadowCoeff + vec2(1.0)) * positiveLog(-coords * screenShadowCoeff + vec2(screenShadowCoeff + 1.0))); | ||||||
|  |             alpha = max(0.8 * screenShadow, alpha); | ||||||
|  |  | ||||||
|  |             gl_FragColor = vec4(color * alpha, alpha); | ||||||
|  |         } | ||||||
|  |     " | ||||||
|  |  | ||||||
|  |     onStatusChanged: if (log) console.log(log) //Print warning messages | ||||||
|  | } | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,7 +17,6 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
|  |  | ||||||
| Timer { | Timer { | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | * Copyright (c) 2013-2021 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,7 +17,6 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Window 2.1 | import QtQuick.Window 2.1 | ||||||
| import QtQuick.Controls 2.3 | import QtQuick.Controls 2.3 | ||||||
| @@ -78,7 +77,7 @@ ApplicationWindow{ | |||||||
|         text: qsTr("Fullscreen") |         text: qsTr("Fullscreen") | ||||||
|         enabled: Qt.platform.os !== "osx" |         enabled: Qt.platform.os !== "osx" | ||||||
|         shortcut: "Alt+F11" |         shortcut: "Alt+F11" | ||||||
|         onTriggered: appSettings.fullscreen = !appSettings.fullscreen; |         onTriggered: appSettings.fullscreen = !appSettings.fullscreen | ||||||
|         checkable: true |         checkable: true | ||||||
|         checked: appSettings.fullscreen |         checked: appSettings.fullscreen | ||||||
|     } |     } | ||||||
| @@ -86,15 +85,15 @@ ApplicationWindow{ | |||||||
|         id: quitAction |         id: quitAction | ||||||
|         text: qsTr("Quit") |         text: qsTr("Quit") | ||||||
|         shortcut: "Ctrl+Shift+Q" |         shortcut: "Ctrl+Shift+Q" | ||||||
|         onTriggered: Qt.quit(); |         onTriggered: Qt.quit() | ||||||
|     } |     } | ||||||
|     Action { |     Action { | ||||||
|         id: showsettingsAction |         id: showsettingsAction | ||||||
|         text: qsTr("Settings") |         text: qsTr("Settings") | ||||||
|         onTriggered: { |         onTriggered: { | ||||||
|             settingswindow.show(); |             settingswindow.show() | ||||||
|             settingswindow.requestActivate(); |             settingswindow.requestActivate() | ||||||
|             settingswindow.raise(); |             settingswindow.raise() | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     Action { |     Action { | ||||||
| @@ -111,21 +110,21 @@ ApplicationWindow{ | |||||||
|         id: zoomIn |         id: zoomIn | ||||||
|         text: qsTr("Zoom In") |         text: qsTr("Zoom In") | ||||||
|         shortcut: "Ctrl++" |         shortcut: "Ctrl++" | ||||||
|         onTriggered: appSettings.incrementScaling(); |         onTriggered: appSettings.incrementScaling() | ||||||
|     } |     } | ||||||
|     Action { |     Action { | ||||||
|         id: zoomOut |         id: zoomOut | ||||||
|         text: qsTr("Zoom Out") |         text: qsTr("Zoom Out") | ||||||
|         shortcut: "Ctrl+-" |         shortcut: "Ctrl+-" | ||||||
|         onTriggered: appSettings.decrementScaling(); |         onTriggered: appSettings.decrementScaling() | ||||||
|     } |     } | ||||||
|     Action { |     Action { | ||||||
|         id: showAboutAction |         id: showAboutAction | ||||||
|         text: qsTr("About") |         text: qsTr("About") | ||||||
|         onTriggered: { |         onTriggered: { | ||||||
|             aboutDialog.show(); |             aboutDialog.show() | ||||||
|             aboutDialog.requestActivate(); |             aboutDialog.requestActivate() | ||||||
|             aboutDialog.raise(); |             aboutDialog.raise() | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     ApplicationSettings { |     ApplicationSettings { | ||||||
|   | |||||||
| @@ -17,15 +17,20 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.3 | import QtQuick.Controls 2.3 | ||||||
|  |  | ||||||
| Menu { | Menu { | ||||||
|     id: contextmenu |     id: contextmenu | ||||||
|     MenuItem { action: copyAction } |     MenuItem { | ||||||
|     MenuItem { action: pasteAction } |         action: copyAction | ||||||
|     MenuItem { action: showsettingsAction } |     } | ||||||
|  |     MenuItem { | ||||||
|  |         action: pasteAction | ||||||
|  |     } | ||||||
|  |     MenuItem { | ||||||
|  |         action: showsettingsAction | ||||||
|  |     } | ||||||
|  |  | ||||||
|     MenuSeparator {} |     MenuSeparator {} | ||||||
|  |  | ||||||
| @@ -37,17 +42,33 @@ Menu{ | |||||||
|     } |     } | ||||||
|     Menu { |     Menu { | ||||||
|         title: qsTr("Edit") |         title: qsTr("Edit") | ||||||
|         MenuItem {action: copyAction} |         MenuItem { | ||||||
|         MenuItem {action: pasteAction} |             action: copyAction | ||||||
|  |         } | ||||||
|  |         MenuItem { | ||||||
|  |             action: pasteAction | ||||||
|  |         } | ||||||
|         MenuSeparator {} |         MenuSeparator {} | ||||||
|         MenuItem {action: showsettingsAction} |         MenuItem { | ||||||
|  |             action: showsettingsAction | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     Menu { |     Menu { | ||||||
|         title: qsTr("View") |         title: qsTr("View") | ||||||
|         MenuItem {action: fullscreenAction; visible: fullscreenAction.enabled} |         MenuItem { | ||||||
|         MenuItem {action: showMenubarAction; visible: showMenubarAction.enabled} |             action: fullscreenAction | ||||||
|         MenuItem {action: zoomIn} |             visible: fullscreenAction.enabled | ||||||
|         MenuItem {action: zoomOut} |         } | ||||||
|  |         MenuItem { | ||||||
|  |             action: showMenubarAction | ||||||
|  |             visible: showMenubarAction.enabled | ||||||
|  |         } | ||||||
|  |         MenuItem { | ||||||
|  |             action: zoomIn | ||||||
|  |         } | ||||||
|  |         MenuItem { | ||||||
|  |             action: zoomOut | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     Menu { |     Menu { | ||||||
|         id: profilesMenu |         id: profilesMenu | ||||||
| @@ -57,8 +78,8 @@ Menu{ | |||||||
|             delegate: MenuItem { |             delegate: MenuItem { | ||||||
|                 text: model.text |                 text: model.text | ||||||
|                 onTriggered: { |                 onTriggered: { | ||||||
|                     appSettings.loadProfileString(obj_string); |                     appSettings.loadProfileString(obj_string) | ||||||
|                     appSettings.handleFontChanged(); |                     appSettings.handleFontChanged() | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             onObjectAdded: profilesMenu.insertItem(index, object) |             onObjectAdded: profilesMenu.insertItem(index, object) | ||||||
| @@ -67,6 +88,8 @@ Menu{ | |||||||
|     } |     } | ||||||
|     Menu { |     Menu { | ||||||
|         title: qsTr("Help") |         title: qsTr("Help") | ||||||
|         MenuItem {action: showAboutAction} |         MenuItem { | ||||||
|  |             action: showAboutAction | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -17,12 +17,15 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.3 | import QtQuick.Controls 2.3 | ||||||
|  |  | ||||||
| Menu { | Menu { | ||||||
|     id: contextmenu |     id: contextmenu | ||||||
|     MenuItem { action: copyAction } |     MenuItem { | ||||||
|     MenuItem { action: pasteAction } |         action: copyAction | ||||||
|  |     } | ||||||
|  |     MenuItem { | ||||||
|  |         action: pasteAction | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -17,7 +17,6 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.3 | import QtQuick.Controls 2.3 | ||||||
|  |  | ||||||
| @@ -27,21 +26,39 @@ MenuBar { | |||||||
|  |  | ||||||
|     Menu { |     Menu { | ||||||
|         title: qsTr("File") |         title: qsTr("File") | ||||||
|         MenuItem {action: quitAction} |         MenuItem { | ||||||
|  |             action: quitAction | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     Menu { |     Menu { | ||||||
|         title: qsTr("Edit") |         title: qsTr("Edit") | ||||||
|         MenuItem {action: copyAction} |         MenuItem { | ||||||
|         MenuItem {action: pasteAction} |             action: copyAction | ||||||
|  |         } | ||||||
|  |         MenuItem { | ||||||
|  |             action: pasteAction | ||||||
|  |         } | ||||||
|         MenuSeparator {} |         MenuSeparator {} | ||||||
|         MenuItem {action: showsettingsAction} |         MenuItem { | ||||||
|  |             action: showsettingsAction | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     Menu { |     Menu { | ||||||
|         title: qsTr("View") |         title: qsTr("View") | ||||||
|         MenuItem {action: fullscreenAction; visible: fullscreenAction.enabled} |         MenuItem { | ||||||
|         MenuItem {action: showMenubarAction; visible: showMenubarAction.enabled} |             action: fullscreenAction | ||||||
|         MenuItem {action: zoomIn} |             visible: fullscreenAction.enabled | ||||||
|         MenuItem {action: zoomOut} |         } | ||||||
|  |         MenuItem { | ||||||
|  |             action: showMenubarAction | ||||||
|  |             visible: showMenubarAction.enabled | ||||||
|  |         } | ||||||
|  |         MenuItem { | ||||||
|  |             action: zoomIn | ||||||
|  |         } | ||||||
|  |         MenuItem { | ||||||
|  |             action: zoomOut | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     Menu { |     Menu { | ||||||
|         id: profilesMenu |         id: profilesMenu | ||||||
| @@ -51,8 +68,8 @@ MenuBar { | |||||||
|             delegate: MenuItem { |             delegate: MenuItem { | ||||||
|                 text: model.text |                 text: model.text | ||||||
|                 onTriggered: { |                 onTriggered: { | ||||||
|                     appSettings.loadProfileString(obj_string); |                     appSettings.loadProfileString(obj_string) | ||||||
|                     appSettings.handleFontChanged(); |                     appSettings.handleFontChanged() | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             onObjectAdded: profilesMenu.insertItem(index, object) |             onObjectAdded: profilesMenu.insertItem(index, object) | ||||||
| @@ -61,6 +78,8 @@ MenuBar { | |||||||
|     } |     } | ||||||
|     Menu { |     Menu { | ||||||
|         title: qsTr("Help") |         title: qsTr("Help") | ||||||
|         MenuItem {action: showAboutAction} |         MenuItem { | ||||||
|  |             action: showAboutAction | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -40,10 +40,11 @@ | |||||||
|         <file>fonts/1977-commodore-pet/PetMe.ttf</file> |         <file>fonts/1977-commodore-pet/PetMe.ttf</file> | ||||||
|         <file>BurnInEffect.qml</file> |         <file>BurnInEffect.qml</file> | ||||||
|         <file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file> |         <file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file> | ||||||
|         <file>NewTerminalFrame.qml</file> |         <file>TerminalFrame.qml</file> | ||||||
|         <file>SlowBurnIn.qml</file> |         <file>SlowBurnIn.qml</file> | ||||||
|         <file>menus/WindowMenu.qml</file> |         <file>menus/WindowMenu.qml</file> | ||||||
|         <file>menus/FullContextMenu.qml</file> |         <file>menus/FullContextMenu.qml</file> | ||||||
|         <file>menus/ShortContextMenu.qml</file> |         <file>menus/ShortContextMenu.qml</file> | ||||||
|  |         <file>ShaderLibrary.qml</file> | ||||||
|     </qresource> |     </qresource> | ||||||
| </RCC> | </RCC> | ||||||
|   | |||||||
| @@ -1,3 +1,23 @@ | |||||||
|  | /******************************************************************************* | ||||||
|  | * Copyright (c) 2013-2021 "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 <http://www.gnu.org/licenses/>. | ||||||
|  | *******************************************************************************/ | ||||||
|  |  | ||||||
| .pragma library | .pragma library | ||||||
| function clamp(x, min, max) { | function clamp(x, min, max) { | ||||||
|     if (x <= min) |     if (x <= min) | ||||||
| @@ -6,15 +26,23 @@ function clamp(x, min, max) { | |||||||
|         return max; |         return max; | ||||||
|     return x; |     return x; | ||||||
| } | } | ||||||
|  |  | ||||||
| function lint(a, b, t) { | function lint(a, b, t) { | ||||||
|     return (1 - t) * a + (t) * b; |     return (1 - t) * a + (t) * b; | ||||||
| } | } | ||||||
|  |  | ||||||
| function mix(c1, c2, alpha) { | function mix(c1, c2, alpha) { | ||||||
|     return Qt.rgba(c1.r * alpha + c2.r * (1-alpha), |     return Qt.rgba(c1.r * alpha + c2.r * (1-alpha), | ||||||
|                    c1.g * alpha + c2.g * (1-alpha), |                    c1.g * alpha + c2.g * (1-alpha), | ||||||
|                    c1.b * alpha + c2.b * (1-alpha), |                    c1.b * alpha + c2.b * (1-alpha), | ||||||
|                    c1.a * alpha + c2.a * (1-alpha)) |                    c1.a * alpha + c2.a * (1-alpha)) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function smoothstep(min, max, value) { | ||||||
|  |     let x = Math.max(0, Math.min(1, (value - min) / (max - min))); | ||||||
|  |     return x * x * (3 - 2 * x); | ||||||
|  | } | ||||||
|  |  | ||||||
| function strToColor(s){ | function strToColor(s){ | ||||||
|     var r = parseInt(s.substring(1,3), 16) / 256; |     var r = parseInt(s.substring(1,3), 16) / 256; | ||||||
|     var g = parseInt(s.substring(3,5), 16) / 256; |     var g = parseInt(s.substring(3,5), 16) / 256; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user