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. | This terminal emulator works under Linux and macOS and requires Qt 5.2 or higher. | ||||||
|  |  | ||||||
| ## Screenshots | ## Screenshots | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ## Get cool-retro-term | ## Install | ||||||
| You can either build cool-retro-term yourself (see below) or walk the easy way and install one of these packages: | 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 |     yaourt -S aur/cool-retro-term-git | ||||||
|  |  | ||||||
| @@ -34,25 +34,27 @@ or use: | |||||||
|  |  | ||||||
| to install precompiled from community repository. | 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 |     USE="git" emerge app-portage/layman | ||||||
|     wget https://www.gerczei.eu/files/gerczei.xml -O /etc/layman/overlays/gerczei.xml |     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 |     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. | 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! | 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 instructions (Linux) | ||||||
|  |  | ||||||
|  | Build cool-retro-term yourself, you know, the retro way. | ||||||
|  |  | ||||||
| ## Dependencies | ## Dependencies | ||||||
| Make sure to install these first. | Make sure to install these first. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -33,6 +33,9 @@ QtObject{ | |||||||
|     readonly property real minimumFontScaling: 0.25 |     readonly property real minimumFontScaling: 0.25 | ||||||
|     readonly property real maximumFontScaling: 2.50 |     readonly property real maximumFontScaling: 2.50 | ||||||
|  |  | ||||||
|  |     readonly property real minBurnInFadeTime: 160 | ||||||
|  |     readonly property real maxBurnInFadeTime: 1600 | ||||||
|  |  | ||||||
|     // GENERAL SETTINGS /////////////////////////////////////////////////////// |     // GENERAL SETTINGS /////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     property int x: 100 |     property int x: 100 | ||||||
| @@ -52,7 +55,9 @@ QtObject{ | |||||||
|     property bool verbose: false |     property bool verbose: false | ||||||
|  |  | ||||||
|     property real bloomQuality: 0.5 |     property real bloomQuality: 0.5 | ||||||
|  |  | ||||||
|     property real burnInQuality: 0.5 |     property real burnInQuality: 0.5 | ||||||
|  |     property bool useFastBurnIn: Qt.platform.os === "osx" ? false : true | ||||||
|  |  | ||||||
|     onWindowScalingChanged: handleFontChanged(); |     onWindowScalingChanged: handleFontChanged(); | ||||||
|  |  | ||||||
| @@ -88,6 +93,9 @@ QtObject{ | |||||||
|  |  | ||||||
|     property real rbgShift: 0.0 |     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 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 | ||||||
| @@ -199,7 +207,8 @@ QtObject{ | |||||||
|             bloomQuality: bloomQuality, |             bloomQuality: bloomQuality, | ||||||
|             burnInQuality: burnInQuality, |             burnInQuality: burnInQuality, | ||||||
|             useCustomCommand: useCustomCommand, |             useCustomCommand: useCustomCommand, | ||||||
|             customCommand: customCommand |             customCommand: customCommand, | ||||||
|  |             useFastBurnIn: useFastBurnIn | ||||||
|         } |         } | ||||||
|         return stringify(settings); |         return stringify(settings); | ||||||
|     } |     } | ||||||
| @@ -225,7 +234,8 @@ QtObject{ | |||||||
|             ambientLight: ambientLight, |             ambientLight: ambientLight, | ||||||
|             windowOpacity: windowOpacity, |             windowOpacity: windowOpacity, | ||||||
|             fontName: fontNames[rasterization], |             fontName: fontNames[rasterization], | ||||||
|             fontWidth: fontWidth |             fontWidth: fontWidth, | ||||||
|  |             margin: _margin | ||||||
|         } |         } | ||||||
|         return settings; |         return settings; | ||||||
|     } |     } | ||||||
| @@ -284,6 +294,8 @@ QtObject{ | |||||||
|  |  | ||||||
|         useCustomCommand = settings.useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand |         useCustomCommand = settings.useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand | ||||||
|         customCommand = settings.customCommand !== undefined ? settings.customCommand : customCommand |         customCommand = settings.customCommand !== undefined ? settings.customCommand : customCommand | ||||||
|  |  | ||||||
|  |         useFastBurnIn = settings.useFastBurnIn !== undefined ? settings.useFastBurnIn : useFastBurnIn; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function loadProfileString(profileString){ |     function loadProfileString(profileString){ | ||||||
| @@ -317,6 +329,8 @@ QtObject{ | |||||||
|         fontNames[rasterization] = settings.fontName !== undefined ? settings.fontName : fontNames[rasterization]; |         fontNames[rasterization] = settings.fontName !== undefined ? settings.fontName : fontNames[rasterization]; | ||||||
|         fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth; |         fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth; | ||||||
|  |  | ||||||
|  |         _margin = settings.margin !== undefined ? settings.margin : _margin; | ||||||
|  |  | ||||||
|         handleFontChanged(); |         handleFontChanged(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -386,7 +400,8 @@ QtObject{ | |||||||
|                   "saturationColor": 0.2483, |                   "saturationColor": 0.2483, | ||||||
|                   "screenCurvature": 0.3, |                   "screenCurvature": 0.3, | ||||||
|                   "staticNoise": 0.1198, |                   "staticNoise": 0.1198, | ||||||
|                   "windowOpacity": 1 |                   "windowOpacity": 1, | ||||||
|  |                   "margin": 0.5 | ||||||
|                 }' |                 }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
| @@ -413,7 +428,8 @@ QtObject{ | |||||||
|                   "saturationColor": 0.0, |                   "saturationColor": 0.0, | ||||||
|                   "screenCurvature": 0.3, |                   "screenCurvature": 0.3, | ||||||
|                   "staticNoise": 0.1198, |                   "staticNoise": 0.1198, | ||||||
|                   "windowOpacity": 1 |                   "windowOpacity": 1, | ||||||
|  |                   "margin": 0.5 | ||||||
|                 }' |                 }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
| @@ -440,7 +456,8 @@ QtObject{ | |||||||
|                   "saturationColor": 0.5, |                   "saturationColor": 0.5, | ||||||
|                   "screenCurvature": 0.3, |                   "screenCurvature": 0.3, | ||||||
|                   "staticNoise": 0.15, |                   "staticNoise": 0.15, | ||||||
|                   "windowOpacity": 1 |                   "windowOpacity": 1, | ||||||
|  |                   "margin": 0.5 | ||||||
|                 }' |                 }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
| @@ -467,7 +484,8 @@ QtObject{ | |||||||
|                   "saturationColor": 0, |                   "saturationColor": 0, | ||||||
|                   "screenCurvature": 0, |                   "screenCurvature": 0, | ||||||
|                   "staticNoise": 0.15, |                   "staticNoise": 0.15, | ||||||
|                   "windowOpacity": 1 |                   "windowOpacity": 1, | ||||||
|  |                   "margin": 0.5 | ||||||
|                 }' |                 }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
| @@ -494,7 +512,8 @@ QtObject{ | |||||||
|                   "saturationColor": 0, |                   "saturationColor": 0, | ||||||
|                   "screenCurvature": 0.5, |                   "screenCurvature": 0.5, | ||||||
|                   "staticNoise": 0.099, |                   "staticNoise": 0.099, | ||||||
|                   "windowOpacity": 1 |                   "windowOpacity": 1, | ||||||
|  |                   "margin": 0.5 | ||||||
|                 }' |                 }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
| @@ -521,7 +540,8 @@ QtObject{ | |||||||
|                   "saturationColor": 0, |                   "saturationColor": 0, | ||||||
|                   "screenCurvature": 0.5, |                   "screenCurvature": 0.5, | ||||||
|                   "staticNoise": 0.2969, |                   "staticNoise": 0.2969, | ||||||
|                   "windowOpacity": 1 |                   "windowOpacity": 1, | ||||||
|  |                   "margin": 0.5 | ||||||
|                 }' |                 }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
| @@ -548,7 +568,8 @@ QtObject{ | |||||||
|                   "saturationColor": 0, |                   "saturationColor": 0, | ||||||
|                   "screenCurvature": 0.4, |                   "screenCurvature": 0.4, | ||||||
|                   "staticNoise": 0.0503, |                   "staticNoise": 0.0503, | ||||||
|                   "windowOpacity": 1 |                   "windowOpacity": 1, | ||||||
|  |                   "margin": 0.5 | ||||||
|                 }' |                 }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
| @@ -575,7 +596,8 @@ QtObject{ | |||||||
|                   "saturationColor": 0, |                   "saturationColor": 0, | ||||||
|                   "screenCurvature": 0.2, |                   "screenCurvature": 0.2, | ||||||
|                   "staticNoise": 0, |                   "staticNoise": 0, | ||||||
|                   "windowOpacity": 1 |                   "windowOpacity": 1, | ||||||
|  |                   "margin": 0.5 | ||||||
|                 }' |                 }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
| @@ -602,7 +624,8 @@ QtObject{ | |||||||
|                   "saturationColor": 0.4983, |                   "saturationColor": 0.4983, | ||||||
|                   "screenCurvature": 0, |                   "screenCurvature": 0, | ||||||
|                   "staticNoise": 0.0955, |                   "staticNoise": 0.0955, | ||||||
|                   "windowOpacity": 0.7 |                   "windowOpacity": 0.7, | ||||||
|  |                   "margin": 0.1 | ||||||
|                 }' |                 }' | ||||||
|             builtin: true |             builtin: true | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -13,10 +13,12 @@ Loader { | |||||||
|     property real delay: (1.0 / appSettings.fps) * 1000 |     property real delay: (1.0 / appSettings.fps) * 1000 | ||||||
|     property real burnIn: appSettings.burnIn |     property real burnIn: appSettings.burnIn | ||||||
|     property real burnInFadeTime: 1 / Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn) |     property real burnInFadeTime: 1 / Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn) | ||||||
|     property real _minBurnInFadeTime: 160 |     property real _minBurnInFadeTime: appSettings.minBurnInFadeTime | ||||||
|     property real _maxBurnInFadeTime: 1600 |     property real _maxBurnInFadeTime: appSettings.maxBurnInFadeTime | ||||||
|  |  | ||||||
|     active: appSettings.burnIn !== 0 |     active: appSettings.useFastBurnIn && appSettings.burnIn !== 0 | ||||||
|  |  | ||||||
|  |     anchors.fill: parent | ||||||
|  |  | ||||||
|     function completelyUpdate() { |     function completelyUpdate() { | ||||||
|         prevLastUpdate = lastUpdate; |         prevLastUpdate = lastUpdate; | ||||||
| @@ -33,16 +35,6 @@ Loader { | |||||||
|     sourceComponent: Item { |     sourceComponent: Item { | ||||||
|         property alias source: burnInEffectSource |         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 { |         ShaderEffectSource { | ||||||
|             id: burnInEffectSource |             id: burnInEffectSource | ||||||
|  |  | ||||||
| @@ -52,13 +44,10 @@ Loader { | |||||||
|             live: false |             live: false | ||||||
|             recursive: true |             recursive: true | ||||||
|             hideSource: true |             hideSource: true | ||||||
|             wrapMode: kterminalSource.wrapMode |             wrapMode: ShaderEffectSource.ClampToEdge | ||||||
|  |  | ||||||
|             format: ShaderEffectSource.RGBA |             format: ShaderEffectSource.RGBA | ||||||
|  |             smooth: true | ||||||
|             // 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 |  | ||||||
|  |  | ||||||
|             visible: false |             visible: false | ||||||
|  |  | ||||||
| @@ -91,7 +80,6 @@ Loader { | |||||||
|             property real prevLastUpdate: burnInEffect.prevLastUpdate |             property real prevLastUpdate: burnInEffect.prevLastUpdate | ||||||
|  |  | ||||||
|             anchors.fill: parent |             anchors.fill: parent | ||||||
|  |  | ||||||
|             blending: false |             blending: false | ||||||
|  |  | ||||||
|             fragmentShader: |             fragmentShader: | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ import QtQuick 2.0 | |||||||
| import "utils.js" as Utils | import "utils.js" as Utils | ||||||
|  |  | ||||||
| ShaderEffect { | ShaderEffect { | ||||||
|     property color _staticFrameColor: "#dedede" |     property color _staticFrameColor: "#ffffff" | ||||||
|     property color _backgroundColor: appSettings.backgroundColor |     property color _backgroundColor: appSettings.backgroundColor | ||||||
|     property color _fontColor: appSettings.fontColor |     property color _fontColor: appSettings.fontColor | ||||||
|     property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2) |     property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2) | ||||||
| @@ -13,6 +13,8 @@ ShaderEffect { | |||||||
|     property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize |     property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize | ||||||
|     property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight) |     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: " |     fragmentShader: " | ||||||
|         #ifdef GL_ES |         #ifdef GL_ES | ||||||
|             precision mediump float; |             precision mediump float; | ||||||
| @@ -22,6 +24,7 @@ ShaderEffect { | |||||||
|         uniform lowp float shadowLength; |         uniform lowp float shadowLength; | ||||||
|         uniform highp float qt_Opacity; |         uniform highp float qt_Opacity; | ||||||
|         uniform lowp vec4 frameColor; |         uniform lowp vec4 frameColor; | ||||||
|  |         uniform mediump vec2 aadelta; | ||||||
|  |  | ||||||
|         varying highp vec2 qt_TexCoord0; |         varying highp vec2 qt_TexCoord0; | ||||||
|  |  | ||||||
| @@ -39,6 +42,10 @@ ShaderEffect { | |||||||
|             return min(v.x, v.y); |             return min(v.x, v.y); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         float prod2(vec2 v) { | ||||||
|  |             return v.x * v.y; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         float sum2(vec2 v) { |         float sum2(vec2 v) { | ||||||
|             return v.x + v.y; |             return v.x + v.y; | ||||||
|         } |         } | ||||||
| @@ -51,12 +58,17 @@ ShaderEffect { | |||||||
|             float alpha = 0.0; |             float alpha = 0.0; | ||||||
|  |  | ||||||
|             float outShadowLength = shadowLength; |             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)); |             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); |             outShadow = clamp(sqrt(outShadow), 0.0, 1.0); | ||||||
|             color += frameColor.rgb * sqrt(outShadow); |             color += frameColor.rgb * outShadow; | ||||||
|             alpha = sum2(1.0 - step(0.0, coords) + step(1.0, coords)); |             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, sqrt(outShadow)); |             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); |             gl_FragColor = vec4(color * alpha, alpha); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -28,11 +28,12 @@ import "utils.js" as Utils | |||||||
| Item{ | Item{ | ||||||
|     id: terminalContainer |     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 alias mainTerminal: kterminal | ||||||
|  |  | ||||||
|     property ShaderEffectSource mainSource: kterminalSource |     property ShaderEffectSource mainSource: kterminalSource | ||||||
|     property BurnInEffect burnInEffect: burnInEffect |     property BurnInEffect burnInEffect: burnInEffect | ||||||
|  |     property SlowBurnIn slowBurnInEffect: slowBurnInEffect | ||||||
|     property real fontWidth: 1.0 |     property real fontWidth: 1.0 | ||||||
|     property real screenScaling: 1.0 |     property real screenScaling: 1.0 | ||||||
|     property real scaleTexture: 1.0 |     property real scaleTexture: 1.0 | ||||||
| @@ -69,8 +70,24 @@ Item{ | |||||||
|  |  | ||||||
|     QMLTermWidget { |     QMLTermWidget { | ||||||
|         id: kterminal |         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" |         colorScheme: "cool-retro-term" | ||||||
|  |  | ||||||
| @@ -167,6 +184,8 @@ Item{ | |||||||
|     property alias contextmenu: menuLoader.item |     property alias contextmenu: menuLoader.item | ||||||
|  |  | ||||||
|     MouseArea{ |     MouseArea{ | ||||||
|  |         property real margin: appSettings.margin | ||||||
|  |  | ||||||
|         acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton |         acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton | ||||||
|         anchors.fill: parent |         anchors.fill: parent | ||||||
|         cursorShape: kterminal.terminalUsesMouse ? Qt.ArrowCursor : Qt.IBeamCursor |         cursorShape: kterminal.terminalUsesMouse ? Qt.ArrowCursor : Qt.IBeamCursor | ||||||
| @@ -200,14 +219,14 @@ Item{ | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         function correctDistortion(x, y){ |         function correctDistortion(x, y){ | ||||||
|             x = x / width; |             x = (x - margin) / width; | ||||||
|             y = y / height; |             y = (y - margin) / height; | ||||||
|  |  | ||||||
|             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.width, |             return Qt.point((x - cc.width  * (1+distortion) * distortion) * kterminal.totalWidth, | ||||||
|                            (y - cc.height * (1+distortion) * distortion) * kterminal.height) |                            (y - cc.height * (1+distortion) * distortion) * kterminal.totalHeight) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     ShaderEffectSource{ |     ShaderEffectSource{ | ||||||
| @@ -216,10 +235,30 @@ Item{ | |||||||
|         hideSource: true |         hideSource: true | ||||||
|         wrapMode: ShaderEffectSource.Repeat |         wrapMode: ShaderEffectSource.Repeat | ||||||
|         visible: false |         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 { |     Item { | ||||||
|         id: burnInEffect |         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{ | Tab{ | ||||||
|     ColumnLayout{ |     ColumnLayout{ | ||||||
|         anchors.fill: parent |         anchors.fill: parent | ||||||
|  | 
 | ||||||
|         GroupBox{ |         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 |             Layout.fillWidth: true | ||||||
|             GridLayout{ |             GridLayout{ | ||||||
|                 anchors.fill: parent |                 anchors.fill: parent | ||||||
|                 rows: 2 |                 rows: 2 | ||||||
|                 columns: 3 |                 columns: 3 | ||||||
|  | 
 | ||||||
|                 Label{text: qsTr("Effects FPS")} |                 Label{text: qsTr("Effects FPS")} | ||||||
|                 Slider{ |                 Slider{ | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
| @@ -52,6 +87,7 @@ Tab{ | |||||||
|                         enabled = true; |                         enabled = true; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  | 
 | ||||||
|                 SizedLabel{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")} |                 SizedLabel{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")} | ||||||
|                 Label{text: qsTr("Texture Quality")} |                 Label{text: qsTr("Texture Quality")} | ||||||
|                 Slider{ |                 Slider{ | ||||||
| @@ -67,14 +103,7 @@ Tab{ | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 SizedLabel{text: Math.round(txtslider.value * 100) + "%"} |                 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")} |                 Label{text: qsTr("Bloom Quality")} | ||||||
|                 Slider{ |                 Slider{ | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
| @@ -89,14 +118,6 @@ Tab{ | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"} |                 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")} |                 Label{text: qsTr("BurnIn Quality")} | ||||||
|                 Slider{ |                 Slider{ | ||||||
| @@ -112,6 +133,12 @@ Tab{ | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"} |                 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 |                     Layout.fillWidth: false | ||||||
|                     Button{ |                     Button{ | ||||||
|                         Layout.fillWidth: true |                         Layout.fillWidth: true | ||||||
|                         text: qsTr("New") |                         text: qsTr("Save") | ||||||
|                         onClicked: { |                         onClicked: { | ||||||
|                             insertname.profileName = ""; |                             insertname.profileName = ""; | ||||||
|                             insertname.show() |                             insertname.show() | ||||||
| @@ -164,34 +164,30 @@ Tab{ | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         GroupBox{ |         GroupBox{ | ||||||
|  |             title: qsTr("Screen") | ||||||
|             Layout.fillWidth: true |             Layout.fillWidth: true | ||||||
|             title: qsTr("Command") |             GridLayout{ | ||||||
|             ColumnLayout { |  | ||||||
|                 anchors.fill: parent |                 anchors.fill: parent | ||||||
|                 CheckBox{ |                 columns: 2 | ||||||
|                     id: useCustomCommand |                 Label{ text: qsTr("Brightness") } | ||||||
|                     text: qsTr("Use custom command instead of shell at startup") |                 SimpleSlider{ | ||||||
|                     checked: appSettings.useCustomCommand |                     onValueChanged: appSettings.brightness = value | ||||||
|                     onCheckedChanged: appSettings.useCustomCommand = checked |                     value: appSettings.brightness | ||||||
|                 } |                 } | ||||||
|                 // Workaround for QTBUG-31627 for pre 5.3.0 |                 Label{ text: qsTr("Contrast") } | ||||||
|                 Binding{ |                 SimpleSlider{ | ||||||
|                     target: useCustomCommand |                     onValueChanged: appSettings.contrast = value | ||||||
|                     property: "checked" |                     value: appSettings.contrast | ||||||
|                     value: appSettings.useCustomCommand |  | ||||||
|                 } |                 } | ||||||
|                 TextField{ |                 Label{ text: qsTr("Margin") } | ||||||
|                     id: customCommand |                 SimpleSlider{ | ||||||
|                     Layout.fillWidth: true |                     onValueChanged: appSettings._margin = value | ||||||
|                     text: appSettings.customCommand |                     value: appSettings._margin | ||||||
|                     enabled: useCustomCommand.checked |                 } | ||||||
|                     onEditingFinished: appSettings.customCommand = text |                 Label{ text: qsTr("Opacity") } | ||||||
|  |                 SimpleSlider{ | ||||||
|                     // Save text even if user forgets to press enter or unfocus |                     onValueChanged: appSettings.windowOpacity = value | ||||||
|                     function saveSetting() { |                     value: appSettings.windowOpacity | ||||||
|                         appSettings.customCommand = text; |  | ||||||
|                     } |  | ||||||
|                     Component.onCompleted: settings_window.closing.connect(saveSetting) |  | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ Window { | |||||||
|     id: settings_window |     id: settings_window | ||||||
|     title: qsTr("Settings") |     title: qsTr("Settings") | ||||||
|     width: 580 |     width: 580 | ||||||
|     height: 500 |     height: 400 | ||||||
|  |  | ||||||
|     property int tabmargins: 15 |     property int tabmargins: 15 | ||||||
|  |  | ||||||
| @@ -36,27 +36,27 @@ Window { | |||||||
|         id: tabView |         id: tabView | ||||||
|         anchors.fill: parent |         anchors.fill: parent | ||||||
|         anchors.margins: 10 |         anchors.margins: 10 | ||||||
|         SettingsGeneralTab{ |         SettingsGeneralTab { | ||||||
|             id: generalTab |             id: generalTab | ||||||
|             title: qsTr("General") |             title: qsTr("General") | ||||||
|             anchors.fill: parent |             anchors.fill: parent | ||||||
|             anchors.margins: tabmargins |             anchors.margins: tabmargins | ||||||
|         } |         } | ||||||
|         SettingsTerminalTab{ |         SettingsTerminalTab { | ||||||
|             id: terminalTab |             id: terminalTab | ||||||
|             title: qsTr("Terminal") |             title: qsTr("Terminal") | ||||||
|             anchors.fill: parent |             anchors.fill: parent | ||||||
|             anchors.margins: tabmargins |             anchors.margins: tabmargins | ||||||
|         } |         } | ||||||
|         SettingsEffectsTab{ |         SettingsEffectsTab { | ||||||
|             id: effectsTab |             id: effectsTab | ||||||
|             title: qsTr("Effects") |             title: qsTr("Effects") | ||||||
|             anchors.fill: parent |             anchors.fill: parent | ||||||
|             anchors.margins: tabmargins |             anchors.margins: tabmargins | ||||||
|         } |         } | ||||||
|         SettingsPerformanceTab{ |         SettingsAdvancedTab { | ||||||
|             id: performanceTab |             id: performanceTab | ||||||
|             title: qsTr("Performance") |             title: qsTr("Advanced") | ||||||
|             anchors.fill: parent |             anchors.fill: parent | ||||||
|             anchors.margins: tabmargins |             anchors.margins: tabmargins | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -24,6 +24,7 @@ import QtGraphicalEffects 1.0 | |||||||
| import "utils.js" as Utils | import "utils.js" as Utils | ||||||
|  |  | ||||||
| Item { | Item { | ||||||
|  |     property SlowBurnIn slowBurnInEffect | ||||||
|     property ShaderEffectSource source |     property ShaderEffectSource source | ||||||
|     property BurnInEffect burnInEffect |     property BurnInEffect burnInEffect | ||||||
|     property ShaderEffectSource bloomSource |     property ShaderEffectSource bloomSource | ||||||
| @@ -44,6 +45,7 @@ Item { | |||||||
|  |  | ||||||
|          property ShaderEffectSource screenBuffer: frameBuffer |          property ShaderEffectSource screenBuffer: frameBuffer | ||||||
|          property ShaderEffectSource burnInSource: burnInEffect.source |          property ShaderEffectSource burnInSource: burnInEffect.source | ||||||
|  |          property ShaderEffectSource frameSource: terminalFrameLoader.item | ||||||
|  |  | ||||||
|          property color fontColor: parent.fontColor |          property color fontColor: parent.fontColor | ||||||
|          property color backgroundColor: parent.backgroundColor |          property color backgroundColor: parent.backgroundColor | ||||||
| @@ -52,11 +54,19 @@ Item { | |||||||
|          property real ambientLight: parent.ambientLight |          property real ambientLight: parent.ambientLight | ||||||
|  |  | ||||||
|          property real flickering: appSettings.flickering |          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 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 burnInLastUpdate: burnInEffect.lastUpdate | ||||||
|          property real burnInTime: burnInEffect.burnInFadeTime |          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 real jitter: appSettings.jitter | ||||||
|          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) | ||||||
| @@ -114,7 +124,7 @@ Item { | |||||||
|                  uniform lowp float flickering;" : "") + |                  uniform lowp float flickering;" : "") + | ||||||
|  |  | ||||||
|              (!fallBack && horizontalSync !== 0.0 ?" |              (!fallBack && horizontalSync !== 0.0 ?" | ||||||
|                  uniform lowp float horizontalSync; |                  uniform lowp float horizontalSyncStrength; | ||||||
|                  varying lowp float distortionScale; |                  varying lowp float distortionScale; | ||||||
|                  varying lowp float distortionFreq;" : "") + |                  varying lowp float distortionFreq;" : "") + | ||||||
|  |  | ||||||
| @@ -132,8 +142,8 @@ Item { | |||||||
|                  : "") + |                  : "") + | ||||||
|  |  | ||||||
|                  (!fallBack && horizontalSync !== 0.0 ? " |                  (!fallBack && horizontalSync !== 0.0 ? " | ||||||
|                      float randval = horizontalSync - initialNoiseTexel.r; |                      float randval = horizontalSyncStrength - initialNoiseTexel.r; | ||||||
|                      distortionScale = step(0.0, randval) * randval * horizontalSync; |                      distortionScale = step(0.0, randval) * randval * horizontalSyncStrength; | ||||||
|                      distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" |                      distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" | ||||||
|                  : "") + |                  : "") + | ||||||
|  |  | ||||||
| @@ -160,6 +170,8 @@ Item { | |||||||
|                  uniform sampler2D burnInSource; |                  uniform sampler2D burnInSource; | ||||||
|                  uniform highp float burnInLastUpdate; |                  uniform highp float burnInLastUpdate; | ||||||
|                  uniform highp float burnInTime;" : "") + |                  uniform highp float burnInTime;" : "") + | ||||||
|  |              (slowBurnIn !== 0 ? " | ||||||
|  |                  uniform sampler2D slowBurnInSource;" : "") + | ||||||
|              (staticNoise !== 0 ? " |              (staticNoise !== 0 ? " | ||||||
|                  uniform highp float staticNoise;" : "") + |                  uniform highp float staticNoise;" : "") + | ||||||
|              (((staticNoise !== 0 || jitter !== 0) |              (((staticNoise !== 0 || jitter !== 0) | ||||||
| @@ -167,7 +179,8 @@ Item { | |||||||
|                  uniform lowp sampler2D noiseSource; |                  uniform lowp sampler2D noiseSource; | ||||||
|                  uniform highp vec2 scaleNoiseSize;" : "") + |                  uniform highp vec2 scaleNoiseSize;" : "") + | ||||||
|              (screenCurvature !== 0 ? " |              (screenCurvature !== 0 ? " | ||||||
|                  uniform highp float screenCurvature;" : "") + |                  uniform highp float screenCurvature; | ||||||
|  |                  uniform lowp sampler2D frameSource;" : "") + | ||||||
|              (glowingLine !== 0 ? " |              (glowingLine !== 0 ? " | ||||||
|                  uniform highp float glowingLine;" : "") + |                  uniform highp float glowingLine;" : "") + | ||||||
|              (chromaColor !== 0 ? " |              (chromaColor !== 0 ? " | ||||||
| @@ -178,7 +191,7 @@ Item { | |||||||
|                  uniform lowp float ambientLight;" : "") + |                  uniform lowp float ambientLight;" : "") + | ||||||
|  |  | ||||||
|              (fallBack && horizontalSync !== 0 ? " |              (fallBack && horizontalSync !== 0 ? " | ||||||
|                  uniform lowp float horizontalSync;" : "") + |                  uniform lowp float horizontalSyncStrength;" : "") + | ||||||
|              (fallBack && flickering !== 0.0 ?" |              (fallBack && flickering !== 0.0 ?" | ||||||
|                  uniform lowp float flickering;" : "") + |                  uniform lowp float flickering;" : "") + | ||||||
|              (!fallBack && flickering !== 0 ? " |              (!fallBack && flickering !== 0 ? " | ||||||
| @@ -238,8 +251,8 @@ Item { | |||||||
|                      float brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" |                      float brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" | ||||||
|                  : "") + |                  : "") + | ||||||
|                  (fallBack && horizontalSync !== 0.0 ? " |                  (fallBack && horizontalSync !== 0.0 ? " | ||||||
|                      float randval = horizontalSync - initialNoiseTexel.r; |                      float randval = horizontalSyncStrength - initialNoiseTexel.r; | ||||||
|                      float distortionScale = step(0.0, randval) * randval * horizontalSync; |                      float distortionScale = step(0.0, randval) * randval * horizontalSyncStrength; | ||||||
|                      float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" |                      float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" | ||||||
|                  : "") + |                  : "") + | ||||||
|  |  | ||||||
| @@ -247,12 +260,9 @@ Item { | |||||||
|                      float noise = staticNoise;" : "") + |                      float noise = staticNoise;" : "") + | ||||||
|  |  | ||||||
|                  (screenCurvature !== 0 ? " |                  (screenCurvature !== 0 ? " | ||||||
|                      vec2 curvatureCoords = barrel(qt_TexCoord0, cc); |                      vec2 staticCoords = barrel(qt_TexCoord0, cc);" | ||||||
|                      float staticInScreen = min2(step(0.0, curvatureCoords) - step(1.0, curvatureCoords)); |  | ||||||
|                      vec2 staticCoords = curvatureCoords;" |  | ||||||
|                  :" |                  :" | ||||||
|                      vec2 staticCoords = qt_TexCoord0; |                      vec2 staticCoords = qt_TexCoord0;") + | ||||||
|                      float staticInScreen = 1.0;") + |  | ||||||
|  |  | ||||||
|                  "vec2 coords = qt_TexCoord0;" + |                  "vec2 coords = qt_TexCoord0;" + | ||||||
|  |  | ||||||
| @@ -283,10 +293,7 @@ Item { | |||||||
|                  (glowingLine !== 0 ? " |                  (glowingLine !== 0 ? " | ||||||
|                      color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + |                      color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + | ||||||
|  |  | ||||||
|                  "txt_coords = mix(qt_TexCoord0, txt_coords, staticInScreen); |                  "vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" + | ||||||
|                   float inScreen2 = isInScreen(barrel(txt_coords, cc)); |  | ||||||
|                   vec3 origTxtColor = texture2D(screenBuffer, txt_coords).rgb; |  | ||||||
|                   vec3 txt_color = mix(backgroundColor.rgb, origTxtColor, inScreen2);" + |  | ||||||
|  |  | ||||||
|                  (burnIn !== 0 ? " |                  (burnIn !== 0 ? " | ||||||
|                      vec4 txt_blur = texture2D(burnInSource, staticCoords); |                      vec4 txt_blur = texture2D(burnInSource, staticCoords); | ||||||
| @@ -295,6 +302,11 @@ Item { | |||||||
|                      txt_color = max(txt_color, convertWithChroma(burnInColor));" |                      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);" + |                   "txt_color += fontColor.rgb * vec3(color);" + | ||||||
|  |  | ||||||
|                  "vec3 finalColor = txt_color;" + |                  "vec3 finalColor = txt_color;" + | ||||||
| @@ -305,13 +317,12 @@ 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 ? | ||||||
|  |                     "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)); |                  "gl_FragColor = vec4(finalColor, qt_Opacity);" + | ||||||
|                   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);" + |  | ||||||
|              "}" |              "}" | ||||||
|  |  | ||||||
|           onStatusChanged: { |           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 { |      ShaderEffect { | ||||||
|          id: staticShader |          id: staticShader | ||||||
|  |  | ||||||
| @@ -415,6 +449,10 @@ Item { | |||||||
|                  return min(v.x, v.y); |                  return min(v.x, v.y); | ||||||
|              } |              } | ||||||
|  |  | ||||||
|  |              float sum2(vec2 v) { | ||||||
|  |                  return v.x + v.y; | ||||||
|  |              } | ||||||
|  |  | ||||||
|              float rgb2grey(vec3 v){ |              float rgb2grey(vec3 v){ | ||||||
|                  return dot(v, vec3(0.21, 0.72, 0.04)); |                  return dot(v, vec3(0.21, 0.72, 0.04)); | ||||||
|              }" + |              }" + | ||||||
| @@ -457,11 +495,17 @@ Item { | |||||||
|                   "txt_color += vec3(0.0001);" + |                   "txt_color += vec3(0.0001);" + | ||||||
|                   "float greyscale_color = rgb2grey(txt_color);" + |                   "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 ? |                  (chromaColor !== 0 ? | ||||||
|                      "vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor); |                      "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 ? |                      (bloom !== 0 ? | ||||||
|                          "vec4 bloomFullColor = texture2D(bloomSource, txt_coords); |                          "vec4 bloomFullColor = texture2D(bloomSource, txt_coords); | ||||||
| @@ -473,23 +517,9 @@ Item { | |||||||
|  |  | ||||||
|                  "finalColor *= screen_brightness;" + |                  "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);" + |                  "gl_FragColor = vec4(finalColor, qt_Opacity);" + | ||||||
|              "}" |              "}" | ||||||
|  |  | ||||||
|          Loader { |  | ||||||
|              anchors.fill: parent |  | ||||||
|              active: screenCurvature !== 0 |  | ||||||
|  |  | ||||||
|              sourceComponent: NewTerminalFrame { |  | ||||||
|                  blending: true |  | ||||||
|              } |  | ||||||
|          } |  | ||||||
|  |  | ||||||
|          onStatusChanged: { |          onStatusChanged: { | ||||||
|              // Print warning messages |              // Print warning messages | ||||||
|              if (log) console.log(log); |              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 |     source: terminal.mainSource | ||||||
|     burnInEffect: terminal.burnInEffect |     burnInEffect: terminal.burnInEffect | ||||||
|  |     slowBurnInEffect: terminal.slowBurnInEffect | ||||||
|     virtual_resolution: terminal.virtualResolution |     virtual_resolution: terminal.virtualResolution | ||||||
|  |  | ||||||
|     TimeManager{ |     TimeManager{ | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ | |||||||
|         <file>fonts/1971-ibm-3278/3270Medium.ttf</file> |         <file>fonts/1971-ibm-3278/3270Medium.ttf</file> | ||||||
|         <file>Storage.qml</file> |         <file>Storage.qml</file> | ||||||
|         <file>CRTMainMenuBar.qml</file> |         <file>CRTMainMenuBar.qml</file> | ||||||
|         <file>SettingsPerformanceTab.qml</file> |         <file>SettingsAdvancedTab.qml</file> | ||||||
|         <file>TerminalContainer.qml</file> |         <file>TerminalContainer.qml</file> | ||||||
|         <file>images/crt256.png</file> |         <file>images/crt256.png</file> | ||||||
|         <file>utils.js</file> |         <file>utils.js</file> | ||||||
| @@ -43,5 +43,6 @@ | |||||||
|         <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>NewTerminalFrame.qml</file> | ||||||
|  |         <file>SlowBurnIn.qml</file> | ||||||
|     </qresource> |     </qresource> | ||||||
| </RCC> | </RCC> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user