Compare commits
	
		
			20 Commits
		
	
	
		
			framebuffe
			...
			old-burnin
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | ff3f02fb8c | ||
|   | 0af2b20b3a | ||
|   | f2f38c0e0d | ||
|   | 4046bdbc6a | ||
|   | c83cc206fd | ||
|   | 41ac14fbd3 | ||
|   | e4c1cad1a7 | ||
|   | 863c1ac27a | ||
|   | c85eba617c | ||
|   | dcb7b7c309 | ||
|   | 3cee186663 | ||
|   | 06afe507f6 | ||
|   | 4268d4d770 | ||
|   | d61dae5ab4 | ||
|   | b5f39c1d53 | ||
|   | 767a61b86e | ||
|   | 0d3c0a2233 | ||
|   | 0431103a1d | ||
|   | 633e4e642c | ||
|   | db7a7f38f7 | 
							
								
								
									
										28
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								README.md
									
									
									
									
									
								
							| @@ -13,18 +13,18 @@ It uses the QML port of qtermwidget (Konsole) developed by me: https://github.co | ||||
| This terminal emulator works under Linux and macOS and requires Qt 5.2 or higher. | ||||
|  | ||||
| ## Screenshots | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Get cool-retro-term | ||||
| You can either build cool-retro-term yourself (see below) or walk the easy way and install one of these packages: | ||||
| ## Install | ||||
| Walk the easy way and install cool-retro-term using one of these convenient packages: | ||||
|  | ||||
| Fedora has the `cool-retro-term` in the offcial repositories. All you have to do is `sudo dnf install cool-retro-term`. | ||||
| **Fedora** has the `cool-retro-term` in the offcial repositories. All you have to do is `sudo dnf install cool-retro-term`. | ||||
|  | ||||
| Users of openSUSE can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term). | ||||
| Users of **openSUSE** can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term). | ||||
|  | ||||
| Arch users can install this [package](https://aur.archlinux.org/packages/cool-retro-term-git/) directly via the [AUR](https://aur.archlinux.org): | ||||
| **Arch** users can install this [package](https://aur.archlinux.org/packages/cool-retro-term-git/) directly via the [AUR](https://aur.archlinux.org): | ||||
|  | ||||
|     yaourt -S aur/cool-retro-term-git | ||||
|  | ||||
| @@ -34,25 +34,27 @@ or use: | ||||
|  | ||||
| to install precompiled from community repository. | ||||
|  | ||||
| Gentoo users can now install the second release "1.0.1" from a 3rd-party repository preferably via layman: | ||||
| **Gentoo** users can now install the third release "1.1.0" from a 3rd-party repository preferably via layman: | ||||
|  | ||||
|     USE="git" emerge app-portage/layman | ||||
|     wget https://www.gerczei.eu/files/gerczei.xml -O /etc/layman/overlays/gerczei.xml | ||||
|     layman -f -a qt -a gerczei # those who've added the repo before 27/08/17 should remove, update and add it again as its source has changed | ||||
|     ACCEPT_KEYWORDS="~*" emerge =x11-terms/cool-retro-term-1.0.1::gerczei | ||||
|     ACCEPT_KEYWORDS="~*" emerge =x11-terms/cool-retro-term-1.1.0::gerczei | ||||
|  | ||||
| The live ebuild (version 9999-r1) tracking the bleeding-edge WIP codebase also remains available. | ||||
|  | ||||
| A word of warning: USE flags and keywords are to be added to portage's configuration files and every emerge operation should be executed with '-p' (short option for --pretend) appended to the command line first as per best practice! | ||||
|  | ||||
| Ubuntu users of 14.04 LTS (Trusty) up to 15.10 (Wily) can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb). | ||||
| Users of **Ubuntu 14.04 LTS (Trusty) up to 15.10 (Wily)** can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb). | ||||
|  | ||||
| Ubuntu 17.10 can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term) | ||||
| **Ubuntu 17.10** can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term) | ||||
|  | ||||
| macOS users can grab the latest dmg from the release page: https://github.com/Swordfish90/cool-retro-term/releases | ||||
| **macOS** users can grab the latest dmg from the release page: https://github.com/Swordfish90/cool-retro-term/releases | ||||
|  | ||||
| ## Build instructions (Linux) | ||||
|  | ||||
| Build cool-retro-term yourself, you know, the retro way. | ||||
|  | ||||
| ## Dependencies | ||||
| Make sure to install these first. | ||||
|  | ||||
|   | ||||
| @@ -33,6 +33,9 @@ QtObject{ | ||||
|     readonly property real minimumFontScaling: 0.25 | ||||
|     readonly property real maximumFontScaling: 2.50 | ||||
|  | ||||
|     readonly property real minBurnInFadeTime: 160 | ||||
|     readonly property real maxBurnInFadeTime: 1600 | ||||
|  | ||||
|     // GENERAL SETTINGS /////////////////////////////////////////////////////// | ||||
|  | ||||
|     property int x: 100 | ||||
| @@ -52,7 +55,9 @@ QtObject{ | ||||
|     property bool verbose: false | ||||
|  | ||||
|     property real bloomQuality: 0.5 | ||||
|  | ||||
|     property real burnInQuality: 0.5 | ||||
|     property bool useFastBurnIn: Qt.platform.os === "osx" ? false : true | ||||
|  | ||||
|     onWindowScalingChanged: handleFontChanged(); | ||||
|  | ||||
| @@ -88,6 +93,9 @@ QtObject{ | ||||
|  | ||||
|     property real rbgShift: 0.0 | ||||
|  | ||||
|     property real _margin: 0.5 | ||||
|     property real margin: Utils.lint(1.0, 20.0, _margin) | ||||
|  | ||||
|     readonly property int no_rasterization: 0 | ||||
|     readonly property int scanline_rasterization: 1 | ||||
|     readonly property int pixel_rasterization: 2 | ||||
| @@ -199,7 +207,8 @@ QtObject{ | ||||
|             bloomQuality: bloomQuality, | ||||
|             burnInQuality: burnInQuality, | ||||
|             useCustomCommand: useCustomCommand, | ||||
|             customCommand: customCommand | ||||
|             customCommand: customCommand, | ||||
|             useFastBurnIn: useFastBurnIn | ||||
|         } | ||||
|         return stringify(settings); | ||||
|     } | ||||
| @@ -225,7 +234,8 @@ QtObject{ | ||||
|             ambientLight: ambientLight, | ||||
|             windowOpacity: windowOpacity, | ||||
|             fontName: fontNames[rasterization], | ||||
|             fontWidth: fontWidth | ||||
|             fontWidth: fontWidth, | ||||
|             margin: _margin | ||||
|         } | ||||
|         return settings; | ||||
|     } | ||||
| @@ -284,6 +294,8 @@ QtObject{ | ||||
|  | ||||
|         useCustomCommand = settings.useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand | ||||
|         customCommand = settings.customCommand !== undefined ? settings.customCommand : customCommand | ||||
|  | ||||
|         useFastBurnIn = settings.useFastBurnIn !== undefined ? settings.useFastBurnIn : useFastBurnIn; | ||||
|     } | ||||
|  | ||||
|     function loadProfileString(profileString){ | ||||
| @@ -317,6 +329,8 @@ QtObject{ | ||||
|         fontNames[rasterization] = settings.fontName !== undefined ? settings.fontName : fontNames[rasterization]; | ||||
|         fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth; | ||||
|  | ||||
|         _margin = settings.margin !== undefined ? settings.margin : _margin; | ||||
|  | ||||
|         handleFontChanged(); | ||||
|     } | ||||
|  | ||||
| @@ -386,7 +400,8 @@ QtObject{ | ||||
|                   "saturationColor": 0.2483, | ||||
|                   "screenCurvature": 0.3, | ||||
|                   "staticNoise": 0.1198, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -413,7 +428,8 @@ QtObject{ | ||||
|                   "saturationColor": 0.0, | ||||
|                   "screenCurvature": 0.3, | ||||
|                   "staticNoise": 0.1198, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -440,7 +456,8 @@ QtObject{ | ||||
|                   "saturationColor": 0.5, | ||||
|                   "screenCurvature": 0.3, | ||||
|                   "staticNoise": 0.15, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -467,7 +484,8 @@ QtObject{ | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0, | ||||
|                   "staticNoise": 0.15, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -494,7 +512,8 @@ QtObject{ | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.5, | ||||
|                   "staticNoise": 0.099, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -521,7 +540,8 @@ QtObject{ | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.5, | ||||
|                   "staticNoise": 0.2969, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -548,7 +568,8 @@ QtObject{ | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.4, | ||||
|                   "staticNoise": 0.0503, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -575,7 +596,8 @@ QtObject{ | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.2, | ||||
|                   "staticNoise": 0, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -602,7 +624,8 @@ QtObject{ | ||||
|                   "saturationColor": 0.4983, | ||||
|                   "screenCurvature": 0, | ||||
|                   "staticNoise": 0.0955, | ||||
|                   "windowOpacity": 0.7 | ||||
|                   "windowOpacity": 0.7, | ||||
|                   "margin": 0.1 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
|   | ||||
| @@ -13,10 +13,12 @@ Loader { | ||||
|     property real delay: (1.0 / appSettings.fps) * 1000 | ||||
|     property real burnIn: appSettings.burnIn | ||||
|     property real burnInFadeTime: 1 / Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn) | ||||
|     property real _minBurnInFadeTime: 160 | ||||
|     property real _maxBurnInFadeTime: 1600 | ||||
|     property real _minBurnInFadeTime: appSettings.minBurnInFadeTime | ||||
|     property real _maxBurnInFadeTime: appSettings.maxBurnInFadeTime | ||||
|  | ||||
|     active: appSettings.burnIn !== 0 | ||||
|     active: appSettings.useFastBurnIn && appSettings.burnIn !== 0 | ||||
|  | ||||
|     anchors.fill: parent | ||||
|  | ||||
|     function completelyUpdate() { | ||||
|         prevLastUpdate = lastUpdate; | ||||
| @@ -33,16 +35,6 @@ Loader { | ||||
|     sourceComponent: Item { | ||||
|         property alias source: burnInEffectSource | ||||
|  | ||||
|         property int burnInScaling: scaleTexture * appSettings.burnInQuality | ||||
|  | ||||
|         width: appSettings.lowResolutionFont | ||||
|                ? kterminal.width * Math.max(1, burnInScaling) | ||||
|                : kterminal.width * scaleTexture * appSettings.burnInQuality | ||||
|  | ||||
|         height: appSettings.lowResolutionFont | ||||
|                 ? kterminal.height * Math.max(1, burnInScaling) | ||||
|                 : kterminal.height * scaleTexture * appSettings.burnInQuality | ||||
|  | ||||
|         ShaderEffectSource { | ||||
|             id: burnInEffectSource | ||||
|  | ||||
| @@ -52,13 +44,10 @@ Loader { | ||||
|             live: false | ||||
|             recursive: true | ||||
|             hideSource: true | ||||
|             wrapMode: kterminalSource.wrapMode | ||||
|             wrapMode: ShaderEffectSource.ClampToEdge | ||||
|  | ||||
|             format: ShaderEffectSource.RGBA | ||||
|  | ||||
|             // Enabling smooth with a low burnInQuality causes bad artifacts because the FBO | ||||
|             // has different values when it's read back. This lowers the quality, but makes it more consistent. | ||||
|             smooth: appSettings.burnInQuality === 1.0 | ||||
|             smooth: true | ||||
|  | ||||
|             visible: false | ||||
|  | ||||
| @@ -91,7 +80,6 @@ Loader { | ||||
|             property real prevLastUpdate: burnInEffect.prevLastUpdate | ||||
|  | ||||
|             anchors.fill: parent | ||||
|  | ||||
|             blending: false | ||||
|  | ||||
|             fragmentShader: | ||||
|   | ||||
| @@ -3,7 +3,7 @@ import QtQuick 2.0 | ||||
| import "utils.js" as Utils | ||||
|  | ||||
| ShaderEffect { | ||||
|     property color _staticFrameColor: "#dedede" | ||||
|     property color _staticFrameColor: "#ffffff" | ||||
|     property color _backgroundColor: appSettings.backgroundColor | ||||
|     property color _fontColor: appSettings.fontColor | ||||
|     property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2) | ||||
| @@ -13,6 +13,8 @@ ShaderEffect { | ||||
|     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; | ||||
| @@ -22,6 +24,7 @@ ShaderEffect { | ||||
|         uniform lowp float shadowLength; | ||||
|         uniform highp float qt_Opacity; | ||||
|         uniform lowp vec4 frameColor; | ||||
|         uniform mediump vec2 aadelta; | ||||
|  | ||||
|         varying highp vec2 qt_TexCoord0; | ||||
|  | ||||
| @@ -39,6 +42,10 @@ ShaderEffect { | ||||
|             return min(v.x, v.y); | ||||
|         } | ||||
|  | ||||
|         float prod2(vec2 v) { | ||||
|             return v.x * v.y; | ||||
|         } | ||||
|  | ||||
|         float sum2(vec2 v) { | ||||
|             return v.x + v.y; | ||||
|         } | ||||
| @@ -51,12 +58,17 @@ ShaderEffect { | ||||
|             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(0.0, 1.0, outShadow); | ||||
|             color += frameColor.rgb * sqrt(outShadow); | ||||
|             alpha = sum2(1.0 - step(0.0, coords) + step(1.0, coords)); | ||||
|             alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, sqrt(outShadow)); | ||||
|             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); | ||||
|         } | ||||
|   | ||||
| @@ -28,11 +28,12 @@ import "utils.js" as Utils | ||||
| Item{ | ||||
|     id: terminalContainer | ||||
|  | ||||
|     property size virtualResolution: Qt.size(kterminal.width, kterminal.height) | ||||
|     property size virtualResolution: Qt.size(kterminal.totalWidth, kterminal.totalHeight) | ||||
|     property alias mainTerminal: kterminal | ||||
|  | ||||
|     property ShaderEffectSource mainSource: kterminalSource | ||||
|     property BurnInEffect burnInEffect: burnInEffect | ||||
|     property SlowBurnIn slowBurnInEffect: slowBurnInEffect | ||||
|     property real fontWidth: 1.0 | ||||
|     property real screenScaling: 1.0 | ||||
|     property real scaleTexture: 1.0 | ||||
| @@ -69,8 +70,24 @@ Item{ | ||||
|  | ||||
|     QMLTermWidget { | ||||
|         id: kterminal | ||||
|         width: Math.floor(parent.width / (screenScaling * fontWidth)) | ||||
|         height: Math.floor(parent.height / screenScaling) | ||||
|  | ||||
|         property int textureResolutionScale: appSettings.lowResolutionFont ? devicePixelRatio : 1 | ||||
|         property int margin: appSettings.margin / screenScaling | ||||
|         property int totalWidth: Math.floor(parent.width / (screenScaling * fontWidth)) | ||||
|         property int totalHeight: Math.floor(parent.height / screenScaling) | ||||
|  | ||||
|         property int rawWidth: totalWidth - 2 * margin | ||||
|         property int rawHeight: totalHeight - 2 * margin | ||||
|  | ||||
|         textureSize: Qt.size(width / textureResolutionScale, height / textureResolutionScale) | ||||
|  | ||||
|         width: ensureMultiple(rawWidth, devicePixelRatio) | ||||
|         height: ensureMultiple(rawHeight, devicePixelRatio) | ||||
|  | ||||
|         /** Ensure size is a multiple of factor. This is needed for pixel perfect scaling on highdpi screens. */ | ||||
|         function ensureMultiple(size, factor) { | ||||
|             return Math.round(size / factor) * factor; | ||||
|         } | ||||
|  | ||||
|         colorScheme: "cool-retro-term" | ||||
|  | ||||
| @@ -167,6 +184,8 @@ Item{ | ||||
|     property alias contextmenu: menuLoader.item | ||||
|  | ||||
|     MouseArea{ | ||||
|         property real margin: appSettings.margin | ||||
|  | ||||
|         acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton | ||||
|         anchors.fill: parent | ||||
|         cursorShape: kterminal.terminalUsesMouse ? Qt.ArrowCursor : Qt.IBeamCursor | ||||
| @@ -200,14 +219,14 @@ Item{ | ||||
|         } | ||||
|  | ||||
|         function correctDistortion(x, y){ | ||||
|             x = x / width; | ||||
|             y = y / height; | ||||
|             x = (x - margin) / width; | ||||
|             y = (y - margin) / height; | ||||
|  | ||||
|             var cc = Qt.size(0.5 - x, 0.5 - y); | ||||
|             var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize; | ||||
|  | ||||
|             return Qt.point((x - cc.width  * (1+distortion) * distortion) * kterminal.width, | ||||
|                            (y - cc.height * (1+distortion) * distortion) * kterminal.height) | ||||
|             return Qt.point((x - cc.width  * (1+distortion) * distortion) * kterminal.totalWidth, | ||||
|                            (y - cc.height * (1+distortion) * distortion) * kterminal.totalHeight) | ||||
|         } | ||||
|     } | ||||
|     ShaderEffectSource{ | ||||
| @@ -216,10 +235,30 @@ Item{ | ||||
|         hideSource: true | ||||
|         wrapMode: ShaderEffectSource.Repeat | ||||
|         visible: false | ||||
|         textureSize: Qt.size(kterminal.width * scaleTexture, kterminal.height * scaleTexture); | ||||
|         textureSize: Qt.size(kterminal.totalWidth * scaleTexture, kterminal.totalHeight * scaleTexture) | ||||
|         sourceRect: Qt.rect(-kterminal.margin, -kterminal.margin, kterminal.totalWidth, kterminal.totalHeight) | ||||
|     } | ||||
|  | ||||
|     BurnInEffect { | ||||
|         id: burnInEffect | ||||
|     Item { | ||||
|         id: burnInContainer | ||||
|  | ||||
|         property int burnInScaling: scaleTexture * appSettings.burnInQuality | ||||
|  | ||||
|         width: Math.round(appSettings.lowResolutionFont | ||||
|                ? kterminal.totalWidth * Math.max(1, burnInScaling) | ||||
|                : kterminal.totalWidth * scaleTexture * appSettings.burnInQuality) | ||||
|  | ||||
|         height: Math.round(appSettings.lowResolutionFont | ||||
|                 ? kterminal.totalHeight * Math.max(1, burnInScaling) | ||||
|                 : kterminal.totalHeight * scaleTexture * appSettings.burnInQuality) | ||||
|  | ||||
|  | ||||
|         BurnInEffect { | ||||
|             id: burnInEffect | ||||
|         } | ||||
|  | ||||
|         SlowBurnIn { | ||||
|             id: slowBurnInEffect | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -27,13 +27,48 @@ import "Components" | ||||
| Tab{ | ||||
|     ColumnLayout{ | ||||
|         anchors.fill: parent | ||||
| 
 | ||||
|         GroupBox{ | ||||
|             title: qsTr("General") | ||||
|             Layout.fillWidth: true | ||||
|             title: qsTr("Command") | ||||
|             ColumnLayout { | ||||
|                 anchors.fill: parent | ||||
|                 CheckBox{ | ||||
|                     id: useCustomCommand | ||||
|                     text: qsTr("Use custom command instead of shell at startup") | ||||
|                     checked: appSettings.useCustomCommand | ||||
|                     onCheckedChanged: appSettings.useCustomCommand = checked | ||||
|                 } | ||||
|                 // Workaround for QTBUG-31627 for pre 5.3.0 | ||||
|                 Binding{ | ||||
|                     target: useCustomCommand | ||||
|                     property: "checked" | ||||
|                     value: appSettings.useCustomCommand | ||||
|                 } | ||||
|                 TextField{ | ||||
|                     id: customCommand | ||||
|                     Layout.fillWidth: true | ||||
|                     text: appSettings.customCommand | ||||
|                     enabled: useCustomCommand.checked | ||||
|                     onEditingFinished: appSettings.customCommand = text | ||||
| 
 | ||||
|                     // Save text even if user forgets to press enter or unfocus | ||||
|                     function saveSetting() { | ||||
|                         appSettings.customCommand = text; | ||||
|                     } | ||||
|                     Component.onCompleted: settings_window.closing.connect(saveSetting) | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         GroupBox{ | ||||
|             title: qsTr("Performance") | ||||
|             Layout.fillWidth: true | ||||
|             GridLayout{ | ||||
|                 anchors.fill: parent | ||||
|                 rows: 2 | ||||
|                 columns: 3 | ||||
| 
 | ||||
|                 Label{text: qsTr("Effects FPS")} | ||||
|                 Slider{ | ||||
|                     Layout.fillWidth: true | ||||
| @@ -52,6 +87,7 @@ Tab{ | ||||
|                         enabled = true; | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 SizedLabel{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")} | ||||
|                 Label{text: qsTr("Texture Quality")} | ||||
|                 Slider{ | ||||
| @@ -67,14 +103,7 @@ Tab{ | ||||
|                     } | ||||
|                 } | ||||
|                 SizedLabel{text: Math.round(txtslider.value * 100) + "%"} | ||||
|             } | ||||
|         } | ||||
|         GroupBox{ | ||||
|             title: qsTr("Bloom") | ||||
|             Layout.fillWidth: true | ||||
|             GridLayout{ | ||||
|                 id: bloomQualityContainer | ||||
|                 anchors.fill: parent | ||||
| 
 | ||||
|                 Label{text: qsTr("Bloom Quality")} | ||||
|                 Slider{ | ||||
|                     Layout.fillWidth: true | ||||
| @@ -89,14 +118,6 @@ Tab{ | ||||
|                     } | ||||
|                 } | ||||
|                 SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"} | ||||
|             } | ||||
|         } | ||||
|         GroupBox{ | ||||
|             title: qsTr("BurnIn") | ||||
|             Layout.fillWidth: true | ||||
|             GridLayout{ | ||||
|                 id: blurQualityContainer | ||||
|                 anchors.fill: parent | ||||
| 
 | ||||
|                 Label{text: qsTr("BurnIn Quality")} | ||||
|                 Slider{ | ||||
| @@ -112,6 +133,12 @@ Tab{ | ||||
|                     } | ||||
|                 } | ||||
|                 SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"} | ||||
|                 CheckBox{ | ||||
|                     Layout.columnSpan: 2 | ||||
|                     text: qsTr("Burnin optimization (Might display timing artifacts)") | ||||
|                     checked: appSettings.useFastBurnIn | ||||
|                     onCheckedChanged: appSettings.useFastBurnIn = checked | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -87,29 +87,5 @@ Tab{ | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         GroupBox{ | ||||
|             title: qsTr("Lights") | ||||
|             Layout.fillWidth: true | ||||
|             GridLayout{ | ||||
|                 anchors.fill: parent | ||||
|                 columns: 2 | ||||
|                 Label{ text: qsTr("Brightness") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings.brightness = value | ||||
|                     value: appSettings.brightness | ||||
|                 } | ||||
|                 Label{ text: qsTr("Contrast") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings.contrast = value | ||||
|                     value: appSettings.contrast | ||||
|                 } | ||||
|                 Label{ text: qsTr("Opacity") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings.windowOpacity = value | ||||
|                     value: appSettings.windowOpacity | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -52,7 +52,7 @@ Tab{ | ||||
|                     Layout.fillWidth: false | ||||
|                     Button{ | ||||
|                         Layout.fillWidth: true | ||||
|                         text: qsTr("New") | ||||
|                         text: qsTr("Save") | ||||
|                         onClicked: { | ||||
|                             insertname.profileName = ""; | ||||
|                             insertname.show() | ||||
| @@ -164,34 +164,30 @@ Tab{ | ||||
|         } | ||||
|  | ||||
|         GroupBox{ | ||||
|             title: qsTr("Screen") | ||||
|             Layout.fillWidth: true | ||||
|             title: qsTr("Command") | ||||
|             ColumnLayout { | ||||
|             GridLayout{ | ||||
|                 anchors.fill: parent | ||||
|                 CheckBox{ | ||||
|                     id: useCustomCommand | ||||
|                     text: qsTr("Use custom command instead of shell at startup") | ||||
|                     checked: appSettings.useCustomCommand | ||||
|                     onCheckedChanged: appSettings.useCustomCommand = checked | ||||
|                 columns: 2 | ||||
|                 Label{ text: qsTr("Brightness") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings.brightness = value | ||||
|                     value: appSettings.brightness | ||||
|                 } | ||||
|                 // Workaround for QTBUG-31627 for pre 5.3.0 | ||||
|                 Binding{ | ||||
|                     target: useCustomCommand | ||||
|                     property: "checked" | ||||
|                     value: appSettings.useCustomCommand | ||||
|                 Label{ text: qsTr("Contrast") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings.contrast = value | ||||
|                     value: appSettings.contrast | ||||
|                 } | ||||
|                 TextField{ | ||||
|                     id: customCommand | ||||
|                     Layout.fillWidth: true | ||||
|                     text: appSettings.customCommand | ||||
|                     enabled: useCustomCommand.checked | ||||
|                     onEditingFinished: appSettings.customCommand = text | ||||
|  | ||||
|                     // Save text even if user forgets to press enter or unfocus | ||||
|                     function saveSetting() { | ||||
|                         appSettings.customCommand = text; | ||||
|                     } | ||||
|                     Component.onCompleted: settings_window.closing.connect(saveSetting) | ||||
|                 Label{ text: qsTr("Margin") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings._margin = value | ||||
|                     value: appSettings._margin | ||||
|                 } | ||||
|                 Label{ text: qsTr("Opacity") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings.windowOpacity = value | ||||
|                     value: appSettings.windowOpacity | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -28,7 +28,7 @@ Window { | ||||
|     id: settings_window | ||||
|     title: qsTr("Settings") | ||||
|     width: 580 | ||||
|     height: 500 | ||||
|     height: 400 | ||||
|  | ||||
|     property int tabmargins: 15 | ||||
|  | ||||
| @@ -36,27 +36,27 @@ Window { | ||||
|         id: tabView | ||||
|         anchors.fill: parent | ||||
|         anchors.margins: 10 | ||||
|         SettingsGeneralTab{ | ||||
|         SettingsGeneralTab { | ||||
|             id: generalTab | ||||
|             title: qsTr("General") | ||||
|             anchors.fill: parent | ||||
|             anchors.margins: tabmargins | ||||
|         } | ||||
|         SettingsTerminalTab{ | ||||
|         SettingsTerminalTab { | ||||
|             id: terminalTab | ||||
|             title: qsTr("Terminal") | ||||
|             anchors.fill: parent | ||||
|             anchors.margins: tabmargins | ||||
|         } | ||||
|         SettingsEffectsTab{ | ||||
|         SettingsEffectsTab { | ||||
|             id: effectsTab | ||||
|             title: qsTr("Effects") | ||||
|             anchors.fill: parent | ||||
|             anchors.margins: tabmargins | ||||
|         } | ||||
|         SettingsPerformanceTab{ | ||||
|         SettingsAdvancedTab { | ||||
|             id: performanceTab | ||||
|             title: qsTr("Performance") | ||||
|             title: qsTr("Advanced") | ||||
|             anchors.fill: parent | ||||
|             anchors.margins: tabmargins | ||||
|         } | ||||
|   | ||||
| @@ -24,6 +24,7 @@ import QtGraphicalEffects 1.0 | ||||
| import "utils.js" as Utils | ||||
|  | ||||
| Item { | ||||
|     property SlowBurnIn slowBurnInEffect | ||||
|     property ShaderEffectSource source | ||||
|     property BurnInEffect burnInEffect | ||||
|     property ShaderEffectSource bloomSource | ||||
| @@ -44,6 +45,7 @@ Item { | ||||
|  | ||||
|          property ShaderEffectSource screenBuffer: frameBuffer | ||||
|          property ShaderEffectSource burnInSource: burnInEffect.source | ||||
|          property ShaderEffectSource frameSource: terminalFrameLoader.item | ||||
|  | ||||
|          property color fontColor: parent.fontColor | ||||
|          property color backgroundColor: parent.backgroundColor | ||||
| @@ -52,11 +54,19 @@ Item { | ||||
|          property real ambientLight: parent.ambientLight | ||||
|  | ||||
|          property real flickering: appSettings.flickering | ||||
|          property real horizontalSync: appSettings.horizontalSync * 0.5 | ||||
|          property real horizontalSync: appSettings.horizontalSync | ||||
|          property real horizontalSyncStrength: Utils.lint(0.05, 0.35, horizontalSync) | ||||
|          property real glowingLine: appSettings.glowingLine * 0.2 | ||||
|          property real burnIn: appSettings.burnIn | ||||
|  | ||||
|          // Fast burnin properties | ||||
|          property real burnIn: appSettings.useFastBurnIn ? appSettings.burnIn : 0 | ||||
|          property real burnInLastUpdate: burnInEffect.lastUpdate | ||||
|          property real burnInTime: burnInEffect.burnInFadeTime | ||||
|  | ||||
|          // Slow burnin properties | ||||
|          property real slowBurnIn: appSettings.useFastBurnIn ? 0 : appSettings.burnIn | ||||
|          property ShaderEffectSource slowBurnInSource: slowBurnInEffect.source | ||||
|  | ||||
|          property real jitter: appSettings.jitter | ||||
|          property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter) | ||||
|          property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight) | ||||
| @@ -114,7 +124,7 @@ Item { | ||||
|                  uniform lowp float flickering;" : "") + | ||||
|  | ||||
|              (!fallBack && horizontalSync !== 0.0 ?" | ||||
|                  uniform lowp float horizontalSync; | ||||
|                  uniform lowp float horizontalSyncStrength; | ||||
|                  varying lowp float distortionScale; | ||||
|                  varying lowp float distortionFreq;" : "") + | ||||
|  | ||||
| @@ -132,8 +142,8 @@ Item { | ||||
|                  : "") + | ||||
|  | ||||
|                  (!fallBack && horizontalSync !== 0.0 ? " | ||||
|                      float randval = horizontalSync - initialNoiseTexel.r; | ||||
|                      distortionScale = step(0.0, randval) * randval * horizontalSync; | ||||
|                      float randval = horizontalSyncStrength - initialNoiseTexel.r; | ||||
|                      distortionScale = step(0.0, randval) * randval * horizontalSyncStrength; | ||||
|                      distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" | ||||
|                  : "") + | ||||
|  | ||||
| @@ -160,6 +170,8 @@ Item { | ||||
|                  uniform sampler2D burnInSource; | ||||
|                  uniform highp float burnInLastUpdate; | ||||
|                  uniform highp float burnInTime;" : "") + | ||||
|              (slowBurnIn !== 0 ? " | ||||
|                  uniform sampler2D slowBurnInSource;" : "") + | ||||
|              (staticNoise !== 0 ? " | ||||
|                  uniform highp float staticNoise;" : "") + | ||||
|              (((staticNoise !== 0 || jitter !== 0) | ||||
| @@ -167,7 +179,8 @@ Item { | ||||
|                  uniform lowp sampler2D noiseSource; | ||||
|                  uniform highp vec2 scaleNoiseSize;" : "") + | ||||
|              (screenCurvature !== 0 ? " | ||||
|                  uniform highp float screenCurvature;" : "") + | ||||
|                  uniform highp float screenCurvature; | ||||
|                  uniform lowp sampler2D frameSource;" : "") + | ||||
|              (glowingLine !== 0 ? " | ||||
|                  uniform highp float glowingLine;" : "") + | ||||
|              (chromaColor !== 0 ? " | ||||
| @@ -178,7 +191,7 @@ Item { | ||||
|                  uniform lowp float ambientLight;" : "") + | ||||
|  | ||||
|              (fallBack && horizontalSync !== 0 ? " | ||||
|                  uniform lowp float horizontalSync;" : "") + | ||||
|                  uniform lowp float horizontalSyncStrength;" : "") + | ||||
|              (fallBack && flickering !== 0.0 ?" | ||||
|                  uniform lowp float flickering;" : "") + | ||||
|              (!fallBack && flickering !== 0 ? " | ||||
| @@ -238,8 +251,8 @@ Item { | ||||
|                      float brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" | ||||
|                  : "") + | ||||
|                  (fallBack && horizontalSync !== 0.0 ? " | ||||
|                      float randval = horizontalSync - initialNoiseTexel.r; | ||||
|                      float distortionScale = step(0.0, randval) * randval * horizontalSync; | ||||
|                      float randval = horizontalSyncStrength - initialNoiseTexel.r; | ||||
|                      float distortionScale = step(0.0, randval) * randval * horizontalSyncStrength; | ||||
|                      float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" | ||||
|                  : "") + | ||||
|  | ||||
| @@ -247,12 +260,9 @@ Item { | ||||
|                      float noise = staticNoise;" : "") + | ||||
|  | ||||
|                  (screenCurvature !== 0 ? " | ||||
|                      vec2 curvatureCoords = barrel(qt_TexCoord0, cc); | ||||
|                      float staticInScreen = min2(step(0.0, curvatureCoords) - step(1.0, curvatureCoords)); | ||||
|                      vec2 staticCoords = curvatureCoords;" | ||||
|                      vec2 staticCoords = barrel(qt_TexCoord0, cc);" | ||||
|                  :" | ||||
|                      vec2 staticCoords = qt_TexCoord0; | ||||
|                      float staticInScreen = 1.0;") + | ||||
|                      vec2 staticCoords = qt_TexCoord0;") + | ||||
|  | ||||
|                  "vec2 coords = qt_TexCoord0;" + | ||||
|  | ||||
| @@ -283,10 +293,7 @@ Item { | ||||
|                  (glowingLine !== 0 ? " | ||||
|                      color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + | ||||
|  | ||||
|                  "txt_coords = mix(qt_TexCoord0, txt_coords, staticInScreen); | ||||
|                   float inScreen2 = isInScreen(barrel(txt_coords, cc)); | ||||
|                   vec3 origTxtColor = texture2D(screenBuffer, txt_coords).rgb; | ||||
|                   vec3 txt_color = mix(backgroundColor.rgb, origTxtColor, inScreen2);" + | ||||
|                  "vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" + | ||||
|  | ||||
|                  (burnIn !== 0 ? " | ||||
|                      vec4 txt_blur = texture2D(burnInSource, staticCoords); | ||||
| @@ -295,6 +302,11 @@ Item { | ||||
|                      txt_color = max(txt_color, convertWithChroma(burnInColor));" | ||||
|                  : "") + | ||||
|  | ||||
|                  (slowBurnIn !== 0 ? " | ||||
|                      vec4 txt_blur = texture2D(slowBurnInSource, staticCoords); | ||||
|                      txt_color = max(txt_color, convertWithChroma(txt_blur.rgb * txt_blur.a)); | ||||
|                  " : "") + | ||||
|  | ||||
|                   "txt_color += fontColor.rgb * vec3(color);" + | ||||
|  | ||||
|                  "vec3 finalColor = txt_color;" + | ||||
| @@ -305,13 +317,12 @@ Item { | ||||
|                  (ambientLight !== 0 ? " | ||||
|                      finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") + | ||||
|  | ||||
|                  (screenCurvature !== 0 ? | ||||
|                     "vec4 frameColor = texture2D(frameSource, qt_TexCoord0); | ||||
|                      finalColor = mix(finalColor, frameColor.rgb, frameColor.a);" | ||||
|                  : "") + | ||||
|  | ||||
|                  "float inShadow = 1.0 - min2(smoothstep(0.0, shadowLength, staticCoords) - smoothstep(1.0 - shadowLength, 1.0, staticCoords)); | ||||
|                   inShadow = pow(inShadow, 100.0) + 0.35 * inShadow * inShadow;  // Inner shadow and antialiasing when screen background is bright. | ||||
|                   finalColor = mix(finalColor, vec3(0.0), inShadow); | ||||
|  | ||||
|                   finalColor = mix(origTxtColor, finalColor, staticInScreen); | ||||
|                   gl_FragColor = vec4(finalColor, qt_Opacity);" + | ||||
|                  "gl_FragColor = vec4(finalColor, qt_Opacity);" + | ||||
|              "}" | ||||
|  | ||||
|           onStatusChanged: { | ||||
| @@ -326,6 +337,29 @@ Item { | ||||
|           } | ||||
|      } | ||||
|  | ||||
|      Loader { | ||||
|          id: terminalFrameLoader | ||||
|  | ||||
|          active: screenCurvature !== 0 | ||||
|  | ||||
|          width: staticShader.width | ||||
|          height: staticShader.height | ||||
|  | ||||
|          sourceComponent: ShaderEffectSource { | ||||
|  | ||||
|              sourceItem: terminalFrame | ||||
|              hideSource: true | ||||
|              visible: false | ||||
|              format: ShaderEffectSource.RGBA | ||||
|  | ||||
|              NewTerminalFrame { | ||||
|                  id: terminalFrame | ||||
|                  blending: false | ||||
|                  anchors.fill: parent | ||||
|              } | ||||
|          } | ||||
|      } | ||||
|  | ||||
|      ShaderEffect { | ||||
|          id: staticShader | ||||
|  | ||||
| @@ -415,6 +449,10 @@ Item { | ||||
|                  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)); | ||||
|              }" + | ||||
| @@ -457,11 +495,17 @@ Item { | ||||
|                   "txt_color += vec3(0.0001);" + | ||||
|                   "float greyscale_color = rgb2grey(txt_color);" + | ||||
|  | ||||
|                  (screenCurvature !== 0 ? " | ||||
|                      float reflectionMask = sum2(step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords)); | ||||
|                      reflectionMask = clamp(reflectionMask, 0.0, 1.0);" | ||||
|                  : | ||||
|                      "float reflectionMask = 1.0;") + | ||||
|  | ||||
|                  (chromaColor !== 0 ? | ||||
|                      "vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor); | ||||
|                       vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color);" | ||||
|                       vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color * reflectionMask);" | ||||
|                  : | ||||
|                      "vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color);") + | ||||
|                      "vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color * reflectionMask);") + | ||||
|  | ||||
|                      (bloom !== 0 ? | ||||
|                          "vec4 bloomFullColor = texture2D(bloomSource, txt_coords); | ||||
| @@ -473,23 +517,9 @@ Item { | ||||
|  | ||||
|                  "finalColor *= screen_brightness;" + | ||||
|  | ||||
|                  (screenCurvature !== 0 ? " | ||||
|                      vec2 curvatureMask = step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords); | ||||
|                      finalColor *= clamp(0.0, 1.0, curvatureMask.x + curvatureMask.y);" | ||||
|                  :"") + | ||||
|  | ||||
|                  "gl_FragColor = vec4(finalColor, qt_Opacity);" + | ||||
|              "}" | ||||
|  | ||||
|          Loader { | ||||
|              anchors.fill: parent | ||||
|              active: screenCurvature !== 0 | ||||
|  | ||||
|              sourceComponent: NewTerminalFrame { | ||||
|                  blending: true | ||||
|              } | ||||
|          } | ||||
|  | ||||
|          onStatusChanged: { | ||||
|              // Print warning messages | ||||
|              if (log) console.log(log); | ||||
|   | ||||
							
								
								
									
										122
									
								
								app/qml/SlowBurnIn.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								app/qml/SlowBurnIn.qml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,122 @@ | ||||
| import QtQuick 2.0 | ||||
|  | ||||
| import "utils.js" as Utils | ||||
|  | ||||
| Loader { | ||||
|     property ShaderEffectSource source: item ? item.source : null | ||||
|  | ||||
|     active: !appSettings.useFastBurnIn && appSettings.burnIn !== 0 | ||||
|  | ||||
|     anchors.fill: parent | ||||
|  | ||||
|     sourceComponent: Item { | ||||
|         property alias source: burnInSourceEffect | ||||
|  | ||||
|         property int burnInScaling: scaleTexture * appSettings.burnInQuality | ||||
|  | ||||
|         ShaderEffectSource { | ||||
|             property bool updateBurnIn: false | ||||
|             property real burnIn: appSettings.burnIn | ||||
|             property real fps: appSettings.fps !== 0 ? appSettings.fps : 60 | ||||
|             property real burnInFadeTime: Utils.lint(minBurnInFadeTime, maxBurnInFadeTime, burnIn) | ||||
|             property real burnInCoefficient: 1000 / (fps * burnInFadeTime) | ||||
|             property real minBurnInFadeTime: appSettings.minBurnInFadeTime | ||||
|             property real maxBurnInFadeTime: appSettings.maxBurnInFadeTime | ||||
|  | ||||
|             id: burnInSourceEffect | ||||
|  | ||||
|             anchors.fill: parent | ||||
|  | ||||
|             sourceItem: burnInEffect | ||||
|             recursive: true | ||||
|             live: false | ||||
|             hideSource: true | ||||
|             wrapMode: kterminalSource.wrapMode | ||||
|  | ||||
|             visible: false | ||||
|  | ||||
|             function restartBlurSource(){ | ||||
|                 livetimer.restart(); | ||||
|             } | ||||
|  | ||||
|             // This updates the burnin synched with the timer. | ||||
|             Connections { | ||||
|                 target: burnInSourceEffect.updateBurnIn ? timeManager : null | ||||
|                 ignoreUnknownSignals: false | ||||
|                 onTimeChanged: { | ||||
|                     burnInSourceEffect.scheduleUpdate(); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             Timer{ | ||||
|                 id: livetimer | ||||
|  | ||||
|                 // The interval assumes 60 fps. This is the time needed burnout a white pixel. | ||||
|                 // We multiply 1.1 to have a little bit of margin over the theoretical value. | ||||
|                 // This solution is not extremely clean, but it's probably the best to avoid measuring fps. | ||||
|  | ||||
|                 interval: burnInSourceEffect.burnInFadeTime * 1.1 | ||||
|                 running: true | ||||
|                 onTriggered: burnInSourceEffect.updateBurnIn = false; | ||||
|             } | ||||
|             Connections{ | ||||
|                 target: kterminal | ||||
|                 onImagePainted:{ | ||||
|                     burnInSourceEffect.scheduleUpdate(); | ||||
|                     burnInSourceEffect.updateBurnIn = true; | ||||
|                     livetimer.restart(); | ||||
|                 } | ||||
|             } | ||||
|             // Restart blurred source settings change. | ||||
|             Connections{ | ||||
|                 target: appSettings | ||||
|                 onBurnInChanged: burnInSourceEffect.restartBlurSource(); | ||||
|                 onTerminalFontChanged: burnInSourceEffect.restartBlurSource(); | ||||
|                 onRasterizationChanged: burnInSourceEffect.restartBlurSource(); | ||||
|                 onBurnInQualityChanged: burnInSourceEffect.restartBlurSource(); | ||||
|             } | ||||
|             Connections { | ||||
|                 target: kterminalScrollbar | ||||
|                 onOpacityChanged: burnInSourceEffect.restartBlurSource(); | ||||
|             } | ||||
|  | ||||
|             ShaderEffect { | ||||
|                 id: burnInEffect | ||||
|  | ||||
|                 property variant txt_source: kterminalSource | ||||
|                 property variant blurredSource: burnInSourceEffect | ||||
|                 property real burnInCoefficient: burnInSourceEffect.burnInCoefficient | ||||
|  | ||||
|                 anchors.fill: parent | ||||
|                 blending: false | ||||
|  | ||||
|                 fragmentShader: | ||||
|                     "#ifdef GL_ES | ||||
|                     precision mediump float; | ||||
|                 #endif\n" + | ||||
|  | ||||
|                 "uniform lowp float qt_Opacity;" + | ||||
|                 "uniform lowp sampler2D txt_source;" + | ||||
|  | ||||
|                 "varying highp vec2 qt_TexCoord0; | ||||
|              uniform lowp sampler2D blurredSource; | ||||
|              uniform highp float burnInCoefficient;" + | ||||
|  | ||||
|                 "float max3(vec3 v) { | ||||
|                      return max (max (v.x, v.y), v.z); | ||||
|                 }" + | ||||
|  | ||||
|                 "void main() {" + | ||||
|                     "vec2 coords = qt_TexCoord0;" + | ||||
|                     "vec3 origColor = texture2D(txt_source, coords).rgb;" + | ||||
|                     "vec3 blur_color = texture2D(blurredSource, coords).rgb - vec3(burnInCoefficient);" + | ||||
|                     "vec3 color = min(origColor + blur_color, max(origColor, blur_color));" + | ||||
|  | ||||
|                     "gl_FragColor = vec4(color, max3(color - origColor));" + | ||||
|                 "}" | ||||
|  | ||||
|                 onStatusChanged: if (log) console.log(log) //Print warning messages | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -12,6 +12,7 @@ ShaderTerminal { | ||||
|  | ||||
|     source: terminal.mainSource | ||||
|     burnInEffect: terminal.burnInEffect | ||||
|     slowBurnInEffect: terminal.slowBurnInEffect | ||||
|     virtual_resolution: terminal.virtualResolution | ||||
|  | ||||
|     TimeManager{ | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
|         <file>fonts/1971-ibm-3278/3270Medium.ttf</file> | ||||
|         <file>Storage.qml</file> | ||||
|         <file>CRTMainMenuBar.qml</file> | ||||
|         <file>SettingsPerformanceTab.qml</file> | ||||
|         <file>SettingsAdvancedTab.qml</file> | ||||
|         <file>TerminalContainer.qml</file> | ||||
|         <file>images/crt256.png</file> | ||||
|         <file>utils.js</file> | ||||
| @@ -43,5 +43,6 @@ | ||||
|         <file>BurnInEffect.qml</file> | ||||
|         <file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file> | ||||
|         <file>NewTerminalFrame.qml</file> | ||||
|         <file>SlowBurnIn.qml</file> | ||||
|     </qresource> | ||||
| </RCC> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user