32 Commits

Author SHA1 Message Date
Filippo Scognamiglio
ff3f02fb8c Improve highdpi support. 2019-01-09 19:26:02 +01:00
Filippo Scognamiglio
0af2b20b3a Settings optin for old burinin version. It seems to be working better on osx. 2019-01-09 19:01:11 +01:00
Filippo Scognamiglio
f2f38c0e0d Fixes issue #491. 2019-01-02 22:01:57 +01:00
Filippo Scognamiglio
4046bdbc6a Merge pull request #488 from tgerczei/master
new ebuild available for 1.1.0
2018-12-19 21:56:50 +01:00
Tamás Gérczei
c83cc206fd new ebuild available for 1.1.0 2018-12-19 18:15:10 +01:00
Filippo Scognamiglio
41ac14fbd3 Merge pull request #482 from dagostinelli/patch-1
Update README.md
2018-12-19 09:30:27 +01:00
Filippo Scognamiglio
e4c1cad1a7 Update README.md 2018-12-18 23:40:24 +01:00
Filippo Scognamiglio
863c1ac27a Reduce horizontal sync possible minimum value. 2018-12-18 23:09:06 +01:00
Filippo Scognamiglio
c85eba617c Revert "Change burnin masking function to max. Should preseve darker colors."
This reverts commit 3cee186663.
2018-12-18 23:03:52 +01:00
Filippo Scognamiglio
dcb7b7c309 Reduce horizontal sync maximum strength. 2018-12-17 19:44:28 +01:00
Filippo Scognamiglio
3cee186663 Change burnin masking function to max. Should preseve darker colors. 2018-12-17 19:21:26 +01:00
Filippo Scognamiglio
06afe507f6 Change the way margin is used. This slightly improves quality. 2018-12-17 19:09:19 +01:00
Filippo Scognamiglio
4268d4d770 Remove comment. 2018-12-17 19:06:49 +01:00
Filippo Scognamiglio
d61dae5ab4 Let's reenable smoothing in burnin to see which artifact is actually better. 2018-12-17 00:36:22 +01:00
Filippo Scognamiglio
b5f39c1d53 Force integer values for new margins. 2018-12-17 00:10:26 +01:00
Filippo Scognamiglio
767a61b86e Improve settings layout. 2018-12-16 23:46:05 +01:00
Filippo Scognamiglio
0d3c0a2233 Allow screen margin customization. 2018-12-16 22:30:03 +01:00
Filippo Scognamiglio
0431103a1d Move frame to separate framebuffer. This fixes some glitches in terminal
frame.
2018-12-15 18:27:35 +01:00
Filippo Scognamiglio
633e4e642c Merge pull request #487 from Swordfish90/framebuffer
Separate dynamic effects (the one based on time) from static ones. This caches a lot of computations and reduce resource consumption.
2018-12-03 22:18:43 +01:00
Filippo Scognamiglio
77dc82a381 Unload frame when not needed. 2018-12-03 19:28:50 +01:00
Filippo Scognamiglio
44a63d4aaa Change default curvature values. 2018-12-03 17:12:41 +01:00
Filippo Scognamiglio
5b3297f916 Tweak some shader constants. 2018-12-03 16:55:44 +01:00
Filippo Scognamiglio
41413d4712 Rearrange settings window. 2018-12-03 16:39:20 +01:00
Filippo Scognamiglio
fd2e5ce71e Reduce default fps to 20. It looks good with new burnin and saves some gpu. 2018-12-03 16:06:48 +01:00
Filippo Scognamiglio
e9ddd7d3b8 Split effects into static (cached) and dynamic computed at every frame. 2018-12-03 14:58:34 +01:00
Filippo Scognamiglio
da6795f002 Use window scaling parameter for framebuffer size. 2018-12-03 12:43:40 +01:00
Filippo Scognamiglio
f497bb4b44 First wrong framebuffer implementation. 2018-12-02 19:57:24 +01:00
Filippo Scognamiglio
4aea85649f Merge branch 'master' of https://github.com/Swordfish90/cool-retro-term 2018-12-01 19:56:13 +01:00
Filippo Scognamiglio
b9ffae25e3 Merge pull request #427 from suve/add-T-option-to-man-page
Add the -T option to the debian man page
2018-11-26 22:55:03 +01:00
Darryl T. Agostinelli
db7a7f38f7 Update README.md
Make it easier for the eye to pick up the instructions for the various Linux distros.  Presently, the eye skips over them and all you see are the Ubuntu things.  Also adjusted the help text a little.
2018-11-23 19:13:39 -06:00
suve
e2c4392c6d Fix alphabetically incorrect ordering of options in man page 2018-02-25 12:40:46 +01:00
suve
7e771b1cfc Add a description of the -T option to the man page 2018-02-25 12:40:42 +01:00
17 changed files with 854 additions and 526 deletions

View File

@@ -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
![Image](<http://i.imgur.com/I6wq1cC.png>) ![Image](<https://i.imgur.com/TNumkDn.png>)
![Image](<http://i.imgur.com/12EqlpL.png>) ![Image](<https://i.imgur.com/hfjWOM4.png>)
![Image](<http://i.imgur.com/Lx0acQz.jpg>) ![Image](<https://i.imgur.com/GYRDPzJ.jpg>)
## 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.

View File

@@ -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
@@ -48,11 +51,13 @@ QtObject{
property bool showTerminalSize: true property bool showTerminalSize: true
property real windowScaling: 1.0 property real windowScaling: 1.0
property real fps: 24 property real fps: 20
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();
@@ -73,7 +78,7 @@ QtObject{
property color backgroundColor: Utils.mix(Utils.strToColor(_backgroundColor), Utils.strToColor(saturatedColor), 0.7 + (contrast * 0.3)) property color backgroundColor: Utils.mix(Utils.strToColor(_backgroundColor), Utils.strToColor(saturatedColor), 0.7 + (contrast * 0.3))
property real staticNoise: 0.12 property real staticNoise: 0.12
property real screenCurvature: 0.2 property real screenCurvature: 0.3
property real glowingLine: 0.2 property real glowingLine: 0.2
property real burnIn: 0.25 property real burnIn: 0.25
property real bloom: 0.55 property real bloom: 0.55
@@ -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
@@ -155,7 +163,7 @@ QtObject{
if (index === undefined) return; if (index === undefined) return;
fontManager.item.selectedFontIndex = index; fontManager.item.selectedFontIndex = index;
fontManager.item.scaling = totalFontScaling * windowScaling; fontManager.item.scaling = totalFontScaling;
var fontSource = fontManager.item.source; var fontSource = fontManager.item.source;
var pixelSize = fontManager.item.pixelSize; var pixelSize = fontManager.item.pixelSize;
@@ -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();
} }
@@ -384,9 +398,10 @@ QtObject{
"rasterization": 0, "rasterization": 0,
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0.2483, "saturationColor": 0.2483,
"screenCurvature": 0.1997, "screenCurvature": 0.3,
"staticNoise": 0.1198, "staticNoise": 0.1198,
"windowOpacity": 1 "windowOpacity": 1,
"margin": 0.5
}' }'
builtin: true builtin: true
} }
@@ -411,9 +426,10 @@ QtObject{
"rasterization": 0, "rasterization": 0,
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0.0, "saturationColor": 0.0,
"screenCurvature": 0.1997, "screenCurvature": 0.3,
"staticNoise": 0.1198, "staticNoise": 0.1198,
"windowOpacity": 1 "windowOpacity": 1,
"margin": 0.5
}' }'
builtin: true builtin: true
} }
@@ -438,9 +454,10 @@ QtObject{
"rasterization": 1, "rasterization": 1,
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0.5, "saturationColor": 0.5,
"screenCurvature": 0.2, "screenCurvature": 0.3,
"staticNoise": 0.15, "staticNoise": 0.15,
"windowOpacity": 1 "windowOpacity": 1,
"margin": 0.5
}' }'
builtin: true builtin: true
} }
@@ -466,8 +483,9 @@ QtObject{
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0, "saturationColor": 0,
"screenCurvature": 0, "screenCurvature": 0,
"staticNoise": 0.1545, "staticNoise": 0.15,
"windowOpacity": 1 "windowOpacity": 1,
"margin": 0.5
}' }'
builtin: true builtin: true
} }
@@ -492,9 +510,10 @@ QtObject{
"rasterization": 1, "rasterization": 1,
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0, "saturationColor": 0,
"screenCurvature": 0.8976, "screenCurvature": 0.5,
"staticNoise": 0.099, "staticNoise": 0.099,
"windowOpacity": 1 "windowOpacity": 1,
"margin": 0.5
}' }'
builtin: true builtin: true
} }
@@ -519,9 +538,10 @@ QtObject{
"rasterization": 1, "rasterization": 1,
"rbgShift": 0.2969, "rbgShift": 0.2969,
"saturationColor": 0, "saturationColor": 0,
"screenCurvature": 0.3003, "screenCurvature": 0.5,
"staticNoise": 0.2969, "staticNoise": 0.2969,
"windowOpacity": 1 "windowOpacity": 1,
"margin": 0.5
}' }'
builtin: true builtin: true
} }
@@ -546,9 +566,10 @@ QtObject{
"rasterization": 0, "rasterization": 0,
"rbgShift": 0.3524, "rbgShift": 0.3524,
"saturationColor": 0, "saturationColor": 0,
"screenCurvature": 0.401, "screenCurvature": 0.4,
"staticNoise": 0.0503, "staticNoise": 0.0503,
"windowOpacity": 1 "windowOpacity": 1,
"margin": 0.5
}' }'
builtin: true builtin: true
} }
@@ -573,9 +594,10 @@ QtObject{
"rasterization": 0, "rasterization": 0,
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0, "saturationColor": 0,
"screenCurvature": 0.1997, "screenCurvature": 0.2,
"staticNoise": 0, "staticNoise": 0,
"windowOpacity": 1 "windowOpacity": 1,
"margin": 0.5
}' }'
builtin: true builtin: true
} }
@@ -600,9 +622,10 @@ QtObject{
"rasterization": 0, "rasterization": 0,
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0.4983, "saturationColor": 0.4983,
"screenCurvature": 0.05, "screenCurvature": 0,
"staticNoise": 0.0955, "staticNoise": 0.0955,
"windowOpacity": 0.7 "windowOpacity": 0.7,
"margin": 0.1
}' }'
builtin: true builtin: true
} }

View File

@@ -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:

View File

@@ -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,7 +13,7 @@ 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)
visible: screenCurvature != 0 property size aadelta: Qt.size(1.0 / width, 1.0 / height)
fragmentShader: " fragmentShader: "
#ifdef GL_ES #ifdef GL_ES
@@ -24,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;
@@ -41,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;
} }
@@ -53,17 +58,17 @@ ShaderEffect {
float alpha = 0.0; float alpha = 0.0;
float outShadowLength = shadowLength; float outShadowLength = shadowLength;
float inShadowLength = 0.5 * 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 = min2(step(vec2(0.0), coords) - step(vec2(1.0), coords)); float inShadow = 1.0 - prod2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords));
inShadow -= min2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords)); inShadow = 0.5 * inShadow * inShadow;
alpha += 0.35 * inShadow; alpha = max(alpha, inShadow);
gl_FragColor = vec4(color * alpha, alpha); gl_FragColor = vec4(color * alpha, alpha);
} }

View File

@@ -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
}
} }
} }

View File

@@ -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
}
} }
} }
} }

View File

@@ -23,62 +23,68 @@ import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
Tab{ Tab{
GroupBox{ ColumnLayout{
title: qsTr("Effects")
anchors.fill: parent anchors.fill: parent
ColumnLayout{ spacing: 2
anchors.fill: parent
spacing: 2 GroupBox{
CheckableSlider{ title: qsTr("Effects")
name: qsTr("Bloom") Layout.fillWidth: true
onNewValue: appSettings.bloom = newValue
value: appSettings.bloom ColumnLayout {
} anchors.fill: parent
CheckableSlider{
name: qsTr("BurnIn") CheckableSlider{
onNewValue: appSettings.burnIn = newValue name: qsTr("Bloom")
value: appSettings.burnIn onNewValue: appSettings.bloom = newValue
} value: appSettings.bloom
CheckableSlider{ }
name: qsTr("Static Noise") CheckableSlider{
onNewValue: appSettings.staticNoise = newValue name: qsTr("BurnIn")
value: appSettings.staticNoise onNewValue: appSettings.burnIn = newValue
} value: appSettings.burnIn
CheckableSlider{ }
name: qsTr("Jitter") CheckableSlider{
onNewValue: appSettings.jitter = newValue name: qsTr("Static Noise")
value: appSettings.jitter onNewValue: appSettings.staticNoise = newValue
} value: appSettings.staticNoise
CheckableSlider{ }
name: qsTr("Glow Line") CheckableSlider{
onNewValue: appSettings.glowingLine = newValue; name: qsTr("Jitter")
value: appSettings.glowingLine onNewValue: appSettings.jitter = newValue
} value: appSettings.jitter
CheckableSlider{ }
name: qsTr("Screen Curvature") CheckableSlider{
onNewValue: appSettings.screenCurvature = newValue; name: qsTr("Glow Line")
value: appSettings.screenCurvature; onNewValue: appSettings.glowingLine = newValue;
} value: appSettings.glowingLine
CheckableSlider{ }
name: qsTr("Ambient Light") CheckableSlider{
onNewValue: appSettings.ambientLight = newValue; name: qsTr("Screen Curvature")
value: appSettings.ambientLight onNewValue: appSettings.screenCurvature = newValue;
enabled: appSettings.framesIndex !== 0 value: appSettings.screenCurvature;
} }
CheckableSlider{ CheckableSlider{
name: qsTr("Flickering") name: qsTr("Ambient Light")
onNewValue: appSettings.flickering = newValue; onNewValue: appSettings.ambientLight = newValue;
value: appSettings.flickering; value: appSettings.ambientLight
} enabled: appSettings.framesIndex !== 0
CheckableSlider{ }
name: qsTr("Horizontal Sync") CheckableSlider{
onNewValue: appSettings.horizontalSync = newValue; name: qsTr("Flickering")
value: appSettings.horizontalSync; onNewValue: appSettings.flickering = newValue;
} value: appSettings.flickering;
CheckableSlider{ }
name: qsTr("RGB Shift") CheckableSlider{
onNewValue: appSettings.rbgShift = newValue; name: qsTr("Horizontal Sync")
value: appSettings.rbgShift; onNewValue: appSettings.horizontalSync = newValue;
value: appSettings.horizontalSync;
}
CheckableSlider{
name: qsTr("RGB Shift")
onNewValue: appSettings.rbgShift = newValue;
value: appSettings.rbgShift;
}
} }
} }
} }

View File

@@ -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)
} }
} }
} }

View File

@@ -1,67 +0,0 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
*
* cool-retro-term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.1
Tab{
ColumnLayout{
anchors.fill: parent
GroupBox{
title: qsTr("Rasterization Mode")
Layout.fillWidth: true
ComboBox {
id: rasterizationBox
property string selectedElement: model[currentIndex]
anchors.fill: parent
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")]
currentIndex: appSettings.rasterization
onCurrentIndexChanged: {
appSettings.rasterization = currentIndex
}
}
}
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
}
}
}
}
}

View File

@@ -27,13 +27,26 @@ import "Components"
Tab{ Tab{
ColumnLayout{ ColumnLayout{
anchors.fill: parent anchors.fill: parent
GroupBox{ GroupBox{
property var rasterization: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")][appSettings.rasterization] title: qsTr("Font")
title: qsTr("Font " + "(" + rasterization + ")")
Layout.fillWidth: true Layout.fillWidth: true
GridLayout{ GridLayout{
anchors.fill: parent anchors.fill: parent
columns: 2 columns: 2
Label { text: qsTr("Rasterization") }
ComboBox {
id: rasterizationBox
property string selectedElement: model[currentIndex]
Layout.fillWidth: true
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")]
currentIndex: appSettings.rasterization
onCurrentIndexChanged: {
appSettings.rasterization = currentIndex
}
}
Label{ text: qsTr("Name") } Label{ text: qsTr("Name") }
ComboBox{ ComboBox{
id: fontChanger id: fontChanger

View File

@@ -36,33 +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
} }
SettingsScreenTab{ SettingsTerminalTab {
id: screenTab
title: qsTr("Screen")
anchors.fill: parent
anchors.margins: tabmargins
}
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
} }

View File

@@ -23,330 +23,513 @@ import QtGraphicalEffects 1.0
import "utils.js" as Utils import "utils.js" as Utils
ShaderEffect { Item {
property SlowBurnIn slowBurnInEffect
property ShaderEffectSource source property ShaderEffectSource source
property BurnInEffect burnInEffect property BurnInEffect burnInEffect
property ShaderEffectSource bloomSource property ShaderEffectSource bloomSource
property color fontColor: appSettings.fontColor property color fontColor: appSettings.fontColor
property color backgroundColor: appSettings.backgroundColor property color backgroundColor: appSettings.backgroundColor
property real bloom: appSettings.bloom * 2.5
property ShaderEffectSource burnInSource: burnInEffect.source
property real burnIn: appSettings.burnIn
property real burnInLastUpdate: burnInEffect.lastUpdate
property real burnInTime: burnInEffect.burnInFadeTime
property real jitter: appSettings.jitter
property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter)
property real staticNoise: appSettings.staticNoise
property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
(height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
property real glowingLine: appSettings.glowingLine * 0.2
property real chromaColor: appSettings.chromaColor; property real chromaColor: appSettings.chromaColor
property real rbgShift: (appSettings.rbgShift / width) * appSettings.totalFontScaling
property real flickering: appSettings.flickering
property real horizontalSync: appSettings.horizontalSync * 0.5
property int rasterization: appSettings.rasterization
property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness)
property real ambientLight: appSettings.ambientLight * 0.2 property real ambientLight: appSettings.ambientLight * 0.2
property size virtual_resolution property size virtual_resolution
property real time: timeManager.time ShaderEffect {
property ShaderEffectSource noiseSource: noiseShaderSource id: dynamicShader
// If something goes wrong activate the fallback version of the shader. property ShaderEffectSource screenBuffer: frameBuffer
property bool fallBack: false property ShaderEffectSource burnInSource: burnInEffect.source
property ShaderEffectSource frameSource: terminalFrameLoader.item
blending: false property color fontColor: parent.fontColor
property color backgroundColor: parent.backgroundColor
property real screenCurvature: parent.screenCurvature
property real chromaColor: parent.chromaColor
property real ambientLight: parent.ambientLight
//Smooth random texture used for flickering effect. property real flickering: appSettings.flickering
Image{ property real horizontalSync: appSettings.horizontalSync
id: noiseTexture property real horizontalSyncStrength: Utils.lint(0.05, 0.35, horizontalSync)
source: "images/allNoise512.png" property real glowingLine: appSettings.glowingLine * 0.2
width: 512
height: 512
fillMode: Image.Tile
visible: false
}
ShaderEffectSource{
id: noiseShaderSource
sourceItem: noiseTexture
wrapMode: ShaderEffectSource.Repeat
visible: false
smooth: true
}
//Print the number with a reasonable precision for the shader. // Fast burnin properties
function str(num){ property real burnIn: appSettings.useFastBurnIn ? appSettings.burnIn : 0
return num.toFixed(8); property real burnInLastUpdate: burnInEffect.lastUpdate
} property real burnInTime: burnInEffect.burnInFadeTime
vertexShader: " // Slow burnin properties
uniform highp mat4 qt_Matrix; property real slowBurnIn: appSettings.useFastBurnIn ? 0 : appSettings.burnIn
uniform highp float time; property ShaderEffectSource slowBurnInSource: slowBurnInEffect.source
attribute highp vec4 qt_Vertex; property real jitter: appSettings.jitter
attribute highp vec2 qt_MultiTexCoord0; 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 staticNoise: appSettings.staticNoise
property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
(height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
varying highp vec2 qt_TexCoord0;" + property size virtual_resolution: parent.virtual_resolution
(!fallBack ? " property real time: timeManager.time
uniform sampler2D noiseSource;" : "") + property ShaderEffectSource noiseSource: noiseShaderSource
(!fallBack && rbgShift !== 0.0 ?" // If something goes wrong activate the fallback version of the shader.
varying lowp vec4 constantNoise;" : "") + property bool fallBack: false
(!fallBack && flickering !== 0.0 ?" anchors.fill: parent
varying lowp float brightness; blending: false
uniform lowp float flickering;" : "") +
(!fallBack && horizontalSync !== 0.0 ?" //Smooth random texture used for flickering effect.
uniform lowp float horizontalSync; Image{
varying lowp float distortionScale; id: noiseTexture
varying lowp float distortionFreq;" : "") + source: "images/allNoise512.png"
width: 512
height: 512
fillMode: Image.Tile
visible: false
}
ShaderEffectSource{
id: noiseShaderSource
sourceItem: noiseTexture
wrapMode: ShaderEffectSource.Repeat
visible: false
smooth: true
}
" //Print the number with a reasonable precision for the shader.
void main() { function str(num){
qt_TexCoord0 = qt_MultiTexCoord0; return num.toFixed(8);
vec2 coords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" + }
(!fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0) ? vertexShader: "
"vec4 initialNoiseTexel = texture2D(noiseSource, coords);" uniform highp mat4 qt_Matrix;
: "") + uniform highp float time;
(!fallBack && rbgShift !== 0.0 ?" attribute highp vec4 qt_Vertex;
constantNoise = initialNoiseTexel;" : "") + attribute highp vec2 qt_MultiTexCoord0;
(!fallBack && flickering !== 0.0 ? " varying highp vec2 qt_TexCoord0;" +
brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
: "") +
(!fallBack && horizontalSync !== 0.0 ? " (!fallBack ? "
float randval = horizontalSync - initialNoiseTexel.r; uniform sampler2D noiseSource;" : "") +
distortionScale = step(0.0, randval) * randval * horizontalSync;
distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
: "") +
"gl_Position = qt_Matrix * qt_Vertex; (!fallBack && flickering !== 0.0 ?"
}" varying lowp float brightness;
uniform lowp float flickering;" : "") +
fragmentShader: " (!fallBack && horizontalSync !== 0.0 ?"
#ifdef GL_ES uniform lowp float horizontalSyncStrength;
precision mediump float; varying lowp float distortionScale;
#endif varying lowp float distortionFreq;" : "") +
uniform sampler2D source; "
uniform highp float qt_Opacity; void main() {
uniform highp float time; qt_TexCoord0 = qt_MultiTexCoord0;
varying highp vec2 qt_TexCoord0; vec2 coords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" +
uniform highp vec4 fontColor; (!fallBack && (flickering !== 0.0 || horizontalSync !== 0.0) ?
uniform highp vec4 backgroundColor; "vec4 initialNoiseTexel = texture2D(noiseSource, coords);"
uniform lowp float screen_brightness; : "") +
uniform highp vec2 virtual_resolution;" + (!fallBack && flickering !== 0.0 ? "
brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
: "") +
(bloom !== 0 ? " (!fallBack && horizontalSync !== 0.0 ? "
uniform highp sampler2D bloomSource; float randval = horizontalSyncStrength - initialNoiseTexel.r;
uniform lowp float bloom;" : "") + distortionScale = step(0.0, randval) * randval * horizontalSyncStrength;
(burnIn !== 0 ? " distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
uniform sampler2D burnInSource; : "") +
uniform highp float burnInLastUpdate;
uniform highp float burnInTime;" : "") +
(staticNoise !== 0 ? "
uniform highp float staticNoise;" : "") +
(((staticNoise !== 0 || jitter !== 0 || rbgShift)
||(fallBack && (flickering || horizontalSync))) ? "
uniform lowp sampler2D noiseSource;
uniform highp vec2 scaleNoiseSize;" : "") +
(screenCurvature !== 0 ? "
uniform highp float screenCurvature;" : "") +
(glowingLine !== 0 ? "
uniform highp float glowingLine;" : "") +
(chromaColor !== 0 ? "
uniform lowp float chromaColor;" : "") +
(jitter !== 0 ? "
uniform lowp vec2 jitterDisplacement;" : "") +
(rbgShift !== 0 ? "
uniform lowp float rbgShift;" : "") +
(ambientLight !== 0 ? "
uniform lowp float ambientLight;" : "") +
(fallBack && horizontalSync !== 0 ? " "gl_Position = qt_Matrix * qt_Vertex;
uniform lowp float horizontalSync;" : "") + }"
(fallBack && flickering !== 0.0 ?"
uniform lowp float flickering;" : "") +
(!fallBack && flickering !== 0 ? "
varying lowp float brightness;"
: "") +
(!fallBack && horizontalSync !== 0 ? "
varying lowp float distortionScale;
varying lowp float distortionFreq;" : "") +
(!fallBack && rbgShift !== 0.0 ?" fragmentShader: "
varying lowp vec4 constantNoise;" : "") + #ifdef GL_ES
precision mediump float;
#endif
(glowingLine !== 0 ? " uniform sampler2D screenBuffer;
float randomPass(vec2 coords){ uniform highp float qt_Opacity;
return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015))); uniform highp float time;
}" : "") + varying highp vec2 qt_TexCoord0;
"highp float getScanlineIntensity(vec2 coords) { uniform highp vec4 fontColor;
float result = 1.0;" + uniform highp vec4 backgroundColor;
uniform lowp float shadowLength;
(appSettings.rasterization != appSettings.no_rasterization ? uniform highp vec2 virtual_resolution;" +
"float val = 0.0;
vec2 rasterizationCoords = fract(coords * virtual_resolution);
val += smoothstep(0.0, 0.5, rasterizationCoords.y);
val -= smoothstep(0.5, 1.0, rasterizationCoords.y);
result *= mix(0.5, 1.0, val);" : "") +
(appSettings.rasterization == appSettings.pixel_rasterization ?
"val = 0.0;
val += smoothstep(0.0, 0.5, rasterizationCoords.x);
val -= smoothstep(0.5, 1.0, rasterizationCoords.x);
result *= mix(0.5, 1.0, val);" : "") + "
return result; (burnIn !== 0 ? "
} 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)
||(fallBack && (flickering || horizontalSync))) ? "
uniform lowp sampler2D noiseSource;
uniform highp vec2 scaleNoiseSize;" : "") +
(screenCurvature !== 0 ? "
uniform highp float screenCurvature;
uniform lowp sampler2D frameSource;" : "") +
(glowingLine !== 0 ? "
uniform highp float glowingLine;" : "") +
(chromaColor !== 0 ? "
uniform lowp float chromaColor;" : "") +
(jitter !== 0 ? "
uniform lowp vec2 jitterDisplacement;" : "") +
(ambientLight !== 0 ? "
uniform lowp float ambientLight;" : "") +
float min2(vec2 v) { (fallBack && horizontalSync !== 0 ? "
return min(v.x, v.y); uniform lowp float horizontalSyncStrength;" : "") +
} (fallBack && flickering !== 0.0 ?"
uniform lowp float flickering;" : "") +
(!fallBack && flickering !== 0 ? "
varying lowp float brightness;"
: "") +
(!fallBack && horizontalSync !== 0 ? "
varying lowp float distortionScale;
varying lowp float distortionFreq;" : "") +
float rgb2grey(vec3 v){ (glowingLine !== 0 ? "
return dot(v, vec3(0.21, 0.72, 0.04)); float randomPass(vec2 coords){
}" + return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015)));
}" : "") +
"void main() {" + "float min2(vec2 v) {
"vec2 cc = vec2(0.5) - qt_TexCoord0;" + return min(v.x, v.y);
"float distance = length(cc);" + }
//FallBack if there are problems float rgb2grey(vec3 v){
(fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0.0) ? return dot(v, vec3(0.21, 0.72, 0.04));
"vec2 initialCoords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0))); }
vec4 initialNoiseTexel = texture2D(noiseSource, initialCoords);"
: "") +
(fallBack && flickering !== 0.0 ? "
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 distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
: "") +
(fallBack && rbgShift !== 0.0 ?"
lowp vec4 constantNoise = initialNoiseTexel;" : "") +
(staticNoise ? " float isInScreen(vec2 v) {
float noise = staticNoise;" : "") + return min2(step(0.0, v) - step(1.0, v));
}
(screenCurvature !== 0 ? " vec2 barrel(vec2 v, vec2 cc) {" +
float distortion = dot(cc, cc) * screenCurvature;
vec2 curvatureCoords = (qt_TexCoord0 - cc * (1.0 + distortion) * distortion);
vec2 staticCoords = - 2.0 * curvatureCoords + 3.0 * step(vec2(0.0), curvatureCoords) * curvatureCoords - 3.0 * step(vec2(1.0), curvatureCoords) * curvatureCoords;"
:"
vec2 staticCoords = qt_TexCoord0;") +
"vec2 coords = staticCoords;" + (screenCurvature !== 0 ? "
float distortion = dot(cc, cc) * screenCurvature;
return (v - cc * (1.0 + distortion) * distortion);"
:
"return v;") +
"}" +
(horizontalSync !== 0 ? " "vec3 convertWithChroma(vec3 inColor) {
float dst = sin((coords.y + time * 0.001) * distortionFreq); vec3 outColor = inColor;" +
coords.x += dst * distortionScale;" +
(staticNoise ? "
noise += distortionScale * 7.0;" : "")
: "") +
(jitter !== 0 || staticNoise !== 0 || rbgShift !== 0 ? (chromaColor !== 0 ?
"vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));" "outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor);"
: "") + :
"outColor = fontColor.rgb * rgb2grey(inColor);") +
(jitter !== 0 ? " " return outColor;
vec2 offset = vec2(noiseTexel.b, noiseTexel.a) - vec2(0.5); }" +
vec2 txt_coords = coords + offset * jitterDisplacement;"
: "vec2 txt_coords = coords;") +
"float color = 0.0001;" + "void main() {" +
"vec2 cc = vec2(0.5) - qt_TexCoord0;" +
"float distance = length(cc);" +
(staticNoise !== 0 ? " //FallBack if there are problems
float noiseVal = noiseTexel.a; (fallBack && (flickering !== 0.0 || horizontalSync !== 0.0) ?
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") + "vec2 initialCoords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));
vec4 initialNoiseTexel = texture2D(noiseSource, initialCoords);"
: "") +
(fallBack && flickering !== 0.0 ? "
float brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
: "") +
(fallBack && horizontalSync !== 0.0 ? "
float randval = horizontalSyncStrength - initialNoiseTexel.r;
float distortionScale = step(0.0, randval) * randval * horizontalSyncStrength;
float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
: "") +
(glowingLine !== 0 ? " (staticNoise ? "
color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + float noise = staticNoise;" : "") +
"vec3 txt_color = texture2D(source, txt_coords).rgb;" + (screenCurvature !== 0 ? "
vec2 staticCoords = barrel(qt_TexCoord0, cc);"
:"
vec2 staticCoords = qt_TexCoord0;") +
(rbgShift !== 0 ? " "vec2 coords = qt_TexCoord0;" +
vec2 displacement = vec2(12.0, 0.0) * rbgShift * (0.6 * constantNoise.r + 0.4);
vec3 rightColor = texture2D(source, txt_coords + displacement).rgb;
vec3 leftColor = texture2D(source, txt_coords - displacement).rgb;
txt_color.r = leftColor.r * 0.10 + rightColor.r * 0.30 + txt_color.r * 0.60;
txt_color.g = leftColor.g * 0.20 + rightColor.g * 0.20 + txt_color.g * 0.60;
txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60;
" : "") +
(burnIn !== 0 ? " (horizontalSync !== 0 ? "
vec4 txt_blur = texture2D(burnInSource, staticCoords); float dst = sin((coords.y + time * 0.001) * distortionFreq);
float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0); coords.x += dst * distortionScale;" +
txt_color = max(txt_color, 0.5 * (txt_blur.rgb - vec3(blurDecay)));"
: "") +
"txt_color *= getScanlineIntensity(coords);" + (staticNoise ? "
noise += distortionScale * 7.0;" : "")
"txt_color += vec3(color);" + : "") +
"float greyscale_color = rgb2grey(txt_color);" +
(chromaColor !== 0 ? (jitter !== 0 || staticNoise !== 0 ?
"vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor); "vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));"
vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color);" : "") +
:
"vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color);") +
(bloom !== 0 ? (jitter !== 0 ? "
"vec4 bloomFullColor = texture2D(bloomSource, coords); vec2 offset = vec2(noiseTexel.b, noiseTexel.a) - vec2(0.5);
vec3 bloomColor = bloomFullColor.rgb; vec2 txt_coords = coords + offset * jitterDisplacement;"
float bloomAlpha = bloomFullColor.a;" + : "vec2 txt_coords = coords;") +
(chromaColor !== 0 ?
"bloomColor = fontColor.rgb * mix(vec3(rgb2grey(bloomColor)), bloomColor, chromaColor);"
:
"bloomColor = fontColor.rgb * rgb2grey(bloomColor);") +
"finalColor += clamp(bloomColor * bloom * bloomAlpha, 0.0, 0.5);"
: "") +
(screenCurvature !== 0 ? " "float color = 0.0001;" +
vec2 curvatureMask = step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords);
finalColor *= clamp(0.0, 1.0, curvatureMask.x + curvatureMask.y);"
:"") +
(flickering !== 0 ? " (staticNoise !== 0 ? "
finalColor *= brightness;" : "") + float noiseVal = noiseTexel.a;
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
(ambientLight !== 0 ? " (glowingLine !== 0 ? "
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") + color += randomPass(coords * virtual_resolution) * glowingLine;" : "") +
"vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" +
"gl_FragColor = vec4(finalColor * screen_brightness, qt_Opacity);" + (burnIn !== 0 ? "
"}" vec4 txt_blur = texture2D(burnInSource, staticCoords);
float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0);
vec3 burnInColor = 0.65 * (txt_blur.rgb - vec3(blurDecay));
txt_color = max(txt_color, convertWithChroma(burnInColor));"
: "") +
onStatusChanged: { (slowBurnIn !== 0 ? "
// Print warning messages vec4 txt_blur = texture2D(slowBurnInSource, staticCoords);
if (log) txt_color = max(txt_color, convertWithChroma(txt_blur.rgb * txt_blur.a));
console.log(log); " : "") +
// Activate fallback mode "txt_color += fontColor.rgb * vec3(color);" +
if (status == ShaderEffect.Error) {
fallBack = true; "vec3 finalColor = txt_color;" +
(flickering !== 0 ? "
finalColor *= brightness;" : "") +
(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);"
: "") +
"gl_FragColor = vec4(finalColor, qt_Opacity);" +
"}"
onStatusChanged: {
// Print warning messages
if (log)
console.log(log);
// Activate fallback mode
if (status == ShaderEffect.Error) {
fallBack = true;
}
}
}
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
width: parent.width * appSettings.windowScaling
height: parent.height * appSettings.windowScaling
property ShaderEffectSource source: parent.source
property ShaderEffectSource bloomSource: parent.bloomSource
property color fontColor: parent.fontColor
property color backgroundColor: parent.backgroundColor
property real bloom: appSettings.bloom * 2.5
property real screenCurvature: parent.screenCurvature
property real chromaColor: appSettings.chromaColor;
property real rbgShift: (appSettings.rbgShift / width) * appSettings.totalFontScaling // TODO FILIPPO width here is wrong.
property int rasterization: appSettings.rasterization
property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness)
property real ambientLight: parent.ambientLight
property size virtual_resolution: parent.virtual_resolution
blending: false
visible: false
//Print the number with a reasonable precision for the shader.
function str(num){
return num.toFixed(8);
}
fragmentShader: "
#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D source;
uniform highp float qt_Opacity;
varying highp vec2 qt_TexCoord0;
uniform highp vec4 fontColor;
uniform highp vec4 backgroundColor;
uniform lowp float screen_brightness;
uniform highp vec2 virtual_resolution;" +
(bloom !== 0 ? "
uniform highp sampler2D bloomSource;
uniform lowp float bloom;" : "") +
(screenCurvature !== 0 ? "
uniform highp float screenCurvature;" : "") +
(chromaColor !== 0 ? "
uniform lowp float chromaColor;" : "") +
(rbgShift !== 0 ? "
uniform lowp float rbgShift;" : "") +
(ambientLight !== 0 ? "
uniform lowp float ambientLight;" : "") +
"highp float getScanlineIntensity(vec2 coords) {
float result = 1.0;" +
(appSettings.rasterization != appSettings.no_rasterization ?
"float val = 0.0;
vec2 rasterizationCoords = fract(coords * virtual_resolution);
val += smoothstep(0.0, 0.5, rasterizationCoords.y);
val -= smoothstep(0.5, 1.0, rasterizationCoords.y);
result *= mix(0.5, 1.0, val);" : "") +
(appSettings.rasterization == appSettings.pixel_rasterization ?
"val = 0.0;
val += smoothstep(0.0, 0.5, rasterizationCoords.x);
val -= smoothstep(0.5, 1.0, rasterizationCoords.x);
result *= mix(0.5, 1.0, val);" : "") + "
return result;
}
float min2(vec2 v) {
return min(v.x, v.y);
}
float sum2(vec2 v) {
return v.x + v.y;
}
float rgb2grey(vec3 v){
return dot(v, vec3(0.21, 0.72, 0.04));
}" +
"vec3 convertWithChroma(vec3 inColor) {
vec3 outColor = inColor;" +
(chromaColor !== 0 ?
"outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor);"
:
"outColor = fontColor.rgb * rgb2grey(inColor);") +
" return outColor;
}" +
"void main() {" +
"vec2 cc = vec2(0.5) - qt_TexCoord0;" +
(screenCurvature !== 0 ? "
float distortion = dot(cc, cc) * screenCurvature;
vec2 curvatureCoords = (qt_TexCoord0 - cc * (1.0 + distortion) * distortion);
vec2 txt_coords = - 2.0 * curvatureCoords + 3.0 * step(vec2(0.0), curvatureCoords) * curvatureCoords - 3.0 * step(vec2(1.0), curvatureCoords) * curvatureCoords;"
:"
vec2 txt_coords = qt_TexCoord0;") +
"vec3 txt_color = texture2D(source, txt_coords).rgb;" +
(rbgShift !== 0 ? "
vec2 displacement = vec2(12.0, 0.0) * rbgShift;
vec3 rightColor = texture2D(source, txt_coords + displacement).rgb;
vec3 leftColor = texture2D(source, txt_coords - displacement).rgb;
txt_color.r = leftColor.r * 0.10 + rightColor.r * 0.30 + txt_color.r * 0.60;
txt_color.g = leftColor.g * 0.20 + rightColor.g * 0.20 + txt_color.g * 0.60;
txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60;
" : "") +
"txt_color *= getScanlineIntensity(txt_coords);" +
"txt_color += vec3(0.0001);" +
"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 * reflectionMask);"
:
"vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color * reflectionMask);") +
(bloom !== 0 ?
"vec4 bloomFullColor = texture2D(bloomSource, txt_coords);
vec3 bloomColor = bloomFullColor.rgb;
float bloomAlpha = bloomFullColor.a;
bloomColor = convertWithChroma(bloomColor);
finalColor += clamp(bloomColor * bloom * bloomAlpha, 0.0, 0.5);"
: "") +
"finalColor *= screen_brightness;" +
"gl_FragColor = vec4(finalColor, qt_Opacity);" +
"}"
onStatusChanged: {
// Print warning messages
if (log) console.log(log);
}
}
ShaderEffectSource {
id: frameBuffer
visible: false
sourceItem: staticShader
hideSource: true
}
} }

122
app/qml/SlowBurnIn.qml Normal file
View 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
}
}
}
}

View File

@@ -10,10 +10,9 @@ ShaderTerminal {
id: mainShader id: mainShader
opacity: appSettings.windowOpacity * 0.3 + 0.7 opacity: appSettings.windowOpacity * 0.3 + 0.7
blending: false
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{
@@ -36,7 +35,7 @@ ShaderTerminal {
height: parent.height * appSettings.bloomQuality height: parent.height * appSettings.bloomQuality
sourceComponent: FastBlur{ sourceComponent: FastBlur{
radius: Utils.lint(16, 64, appSettings.bloomQuality * appSettings.windowScaling); radius: Utils.lint(16, 64, appSettings.bloomQuality);
source: terminal.mainSource source: terminal.mainSource
transparentBorder: true transparentBorder: true
} }
@@ -56,11 +55,11 @@ ShaderTerminal {
bloomSource: bloomSourceLoader.item bloomSource: bloomSourceLoader.item
NewTerminalFrame { // NewTerminalFrame {
id: terminalFrame // id: terminalFrame
anchors.fill: parent // anchors.fill: parent
blending: true // blending: true
} // }
// This shader might be useful in the future. Since we used it only for a couple // This shader might be useful in the future. Since we used it only for a couple
// of calculations is probably best to move those in the main shader. If in the future // of calculations is probably best to move those in the main shader. If in the future

View File

@@ -137,13 +137,8 @@ ApplicationWindow{
TerminalContainer{ TerminalContainer{
id: terminalContainer id: terminalContainer
y: appSettings.showMenubar ? 0 : -2 // Workaroud to hide the margin in the menubar. y: appSettings.showMenubar ? 0 : -2 // Workaroud to hide the margin in the menubar.
width: parent.width * appSettings.windowScaling width: parent.width
height: (parent.height + Math.abs(y)) * appSettings.windowScaling height: (parent.height + Math.abs(y))
transform: Scale {
xScale: 1 / appSettings.windowScaling
yScale: 1 / appSettings.windowScaling
}
} }
SettingsWindow{ SettingsWindow{
id: settingswindow id: settingswindow

View File

@@ -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>
@@ -32,7 +32,6 @@
<file>fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf</file> <file>fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf</file>
<file>fonts/modern-hermit/Hermit-medium.otf</file> <file>fonts/modern-hermit/Hermit-medium.otf</file>
<file>fonts/modern-inconsolata/Inconsolata.otf</file> <file>fonts/modern-inconsolata/Inconsolata.otf</file>
<file>SettingsScreenTab.qml</file>
<file>fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf</file> <file>fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf</file>
<file>../icons/32x32/cool-retro-term.png</file> <file>../icons/32x32/cool-retro-term.png</file>
<file>Components/SizedLabel.qml</file> <file>Components/SizedLabel.qml</file>
@@ -44,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>

View File

@@ -30,14 +30,17 @@ Print a help screen and exit.
\fB\-p\fR \fIPROFILE\fR, \fB\-\-profile\fR \fIPROFILE\fR \fB\-p\fR \fIPROFILE\fR, \fB\-\-profile\fR \fIPROFILE\fR
Run with the given profile. Run with the given profile.
.TP .TP
\fB\-\-workdir\fR \fIDIR\fR \fB\-T\fR \fITITLE\fR
Start with \fIDIR\fR as the working directory. Use \fITITLE\fR as the window title.
.TP .TP
\fB\-\-verbose\fR \fB\-\-verbose\fR
Print additional information such as profiles and settings. Print additional information such as profiles and settings.
.TP .TP
\fB\-v\fR, \fB\-\-version\fR \fB\-v\fR, \fB\-\-version\fR
Print the version number and exit. Print the version number and exit.
.TP
\fB\-\-workdir\fR \fIDIR\fR
Start with \fIDIR\fR as the working directory.
.SH LICENCE .SH LICENCE
This program is available under the terms of the GNU General Public License, This program is available under the terms of the GNU General Public License,
version 3 or any later version, as published by the Free Software Foundation. version 3 or any later version, as published by the Free Software Foundation.