From 0f3c78a8c731f9153165542a9035f735fa7b0ef4 Mon Sep 17 00:00:00 2001 From: Firemark Date: Thu, 31 Jul 2014 22:21:14 +0200 Subject: [PATCH 01/15] modify shaders --- app/PreprocessedTerminal.qml | 5 +++-- app/ShaderTerminal.qml | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/PreprocessedTerminal.qml b/app/PreprocessedTerminal.qml index 773d00a..da24f08 100644 --- a/app/PreprocessedTerminal.qml +++ b/app/PreprocessedTerminal.qml @@ -218,7 +218,7 @@ Item{ id: finalSource sourceItem: blurredterminal sourceRect: frame.sourceRect - format: ShaderEffectSource.Alpha + //format: ShaderEffectSource.Alpha hideSource: true } ShaderEffect { @@ -261,7 +261,8 @@ Item{ : "") + - "gl_FragColor.a = floor(color) / 256.0;" + + "gl_FragColor = texture2D(source, coords);" + + "gl_FragColor.a = color / 256.0;" + "}" onStatusChanged: if (log) console.log(log) //Print warning messages diff --git a/app/ShaderTerminal.qml b/app/ShaderTerminal.qml index ad3b1d7..5fe5f15 100644 --- a/app/ShaderTerminal.qml +++ b/app/ShaderTerminal.qml @@ -183,8 +183,8 @@ ShaderEffect { (glowing_line_strength !== 0 ? " color += randomPass(coords) * glowing_line_strength;" : "") + - - "vec3 finalColor = mix(background_color, font_color, color).rgb;" + + "vec4 new_font_color = mix(texture2D(source, txt_coords), font_color, 0.2);" + + "vec3 finalColor = mix(background_color, new_font_color, color).rgb;" + "finalColor *= texture2D(rasterizationSource, coords).a;" + (bloom !== 0 ? " @@ -194,6 +194,7 @@ ShaderEffect { finalColor *= brightness;" : "") + "gl_FragColor = vec4(finalColor *"+str(brightness)+", qt_Opacity); + //gl_FragColor = texture2D(source, txt_coords); }" onStatusChanged: if (log) console.log(log) //Print warning messages -- 2.47.2 From f167b4d4478b4ec6d6f81c937ac049cef51d992e Mon Sep 17 00:00:00 2001 From: Firemark Date: Thu, 31 Jul 2014 22:41:54 +0200 Subject: [PATCH 02/15] support many colors in terminal --- app/ShaderTerminal.qml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/app/ShaderTerminal.qml b/app/ShaderTerminal.qml index 5fe5f15..26a9729 100644 --- a/app/ShaderTerminal.qml +++ b/app/ShaderTerminal.qml @@ -175,7 +175,7 @@ ShaderEffect { vec2 txt_coords = coords + offset * "+str(jitter)+";" : "vec2 txt_coords = coords;") + - "float color = texture2D(source, txt_coords).a;" + + "float color = 0.0;" + (noise_strength !== 0 ? " float noiseVal = texture2D(noiseSource, qt_TexCoord0 + vec2(fract(time / 51.0), fract(time / 237.0))).a; @@ -183,19 +183,22 @@ ShaderEffect { (glowing_line_strength !== 0 ? " color += randomPass(coords) * glowing_line_strength;" : "") + - "vec4 new_font_color = mix(texture2D(source, txt_coords), font_color, 0.2);" + - "vec3 finalColor = mix(background_color, new_font_color, color).rgb;" + + + "vec4 realBackColor = texture2D(source, txt_coords);" + + "vec4 mixedColor = mix(realBackColor * font_color, font_color, 0.0);" + + "vec4 finalBackColor = mix(background_color, mixedColor, realBackColor.a);" + + "vec3 finalColor = mix(finalBackColor, font_color, color).rgb;" + "finalColor *= texture2D(rasterizationSource, coords).a;" + (bloom !== 0 ? " - finalColor += font_color.rgb * texture2D(bloomSource, coords).r *" + str(bloom) + ";" : "") + + finalColor += font_color.rgb *" + + "dot(texture2D(bloomSource, coords).rgb, vec3(0.299, 0.587, 0.114)) *" + str(bloom) + ";" : "") + (brightness_flickering !== 0 ? " finalColor *= brightness;" : "") + - "gl_FragColor = vec4(finalColor *"+str(brightness)+", qt_Opacity); - //gl_FragColor = texture2D(source, txt_coords); - }" + "gl_FragColor = vec4(finalColor *"+str(brightness)+", qt_Opacity);" + + "}" onStatusChanged: if (log) console.log(log) //Print warning messages } -- 2.47.2 From e3d8992a35fbf852fc63369b3d71e899966a5697 Mon Sep 17 00:00:00 2001 From: Firemark Date: Fri, 1 Aug 2014 00:04:59 +0200 Subject: [PATCH 03/15] Add two settings to change colors. --- app/ApplicationSettings.qml | 9 +++++++- app/SettingsTerminalTab.qml | 42 ++++++++++++++++++++++++------------- app/ShaderTerminal.qml | 21 +++++++++++++++---- 3 files changed, 53 insertions(+), 19 deletions(-) diff --git a/app/ApplicationSettings.qml b/app/ApplicationSettings.qml index 9daf9b2..d6e9a58 100644 --- a/app/ApplicationSettings.qml +++ b/app/ApplicationSettings.qml @@ -67,6 +67,9 @@ Item{ property real motion_blur: 0.40 property real bloom_strength: 0.65 + property real chroma_color: 0.0 + property real saturation_color: 0.0 + property real jitter: 0.18 property real horizontal_sincronization: 0.08 @@ -171,6 +174,8 @@ Item{ brightness_flickering: brightness_flickering, horizontal_sincronization: horizontal_sincronization, noise_strength: noise_strength, + chroma_color: chroma_color, + saturation_color: saturation_color, screen_distortion: screen_distortion, glowing_line_strength: glowing_line_strength, frames_index: frames_index, @@ -234,6 +239,8 @@ Item{ horizontal_sincronization = settings.horizontal_sincronization !== undefined ? settings.horizontal_sincronization : horizontal_sincronization brightness_flickering = settings.brightness_flickering !== undefined ? settings.brightness_flickering : brightness_flickering; noise_strength = settings.noise_strength !== undefined ? settings.noise_strength : noise_strength; + chroma_color = settings.chroma_color !== undefined ? settings.chroma_color : chroma_color; + saturation_color = settings.saturation_color !== undefined ? settings.saturation_color : saturation_color; screen_distortion = settings.screen_distortion !== undefined ? settings.screen_distortion : screen_distortion; glowing_line_strength = settings.glowing_line_strength !== undefined ? settings.glowing_line_strength : glowing_line_strength; @@ -333,7 +340,7 @@ Item{ } ListElement{ text: "IBM Dos" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.07,"contrast":0.85,"fontIndex":7,"font_color":"#ffffff","frames_index":1,"glowing_line_strength":0.13,"horizontal_sincronization":0,"jitter":0.08,"motion_blur":0.3,"noise_strength":0.03,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.07,"contrast":0.85,"fontIndex":7,"font_color":"#ffffff","frames_index":1,"glowing_line_strength":0.13,"horizontal_sincronization":0,"jitter":0.08,"motion_blur":0.3,"noise_strength":0.03,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":1}' builtin: true } ListElement{ diff --git a/app/SettingsTerminalTab.qml b/app/SettingsTerminalTab.qml index 04e473f..07f5ba6 100644 --- a/app/SettingsTerminalTab.qml +++ b/app/SettingsTerminalTab.qml @@ -92,21 +92,35 @@ Tab{ GroupBox{ title: qsTr("Colors") Layout.fillWidth: true - RowLayout{ - anchors.fill: parent - ColorButton{ - name: qsTr("Font") - height: 50 - Layout.fillWidth: true - onColorSelected: shadersettings._font_color = color; - button_color: shadersettings._font_color + ColumnLayout{ + RowLayout{ + anchors.fill: parent + ColorButton{ + name: qsTr("Font") + height: 50 + Layout.fillWidth: true + onColorSelected: shadersettings._font_color = color; + button_color: shadersettings._font_color + } + ColorButton{ + name: qsTr("Background") + height: 50 + Layout.fillWidth: true + onColorSelected: shadersettings._background_color = color; + button_color: shadersettings._background_color + } } - ColorButton{ - name: qsTr("Background") - height: 50 - Layout.fillWidth: true - onColorSelected: shadersettings._background_color = color; - button_color: shadersettings._background_color + ColumnLayout{ + CheckableSlider{ + name: qsTr("Chroma Color") + onValueChanged: shadersettings.chroma_color = value + _value: shadersettings.chroma_color + } + CheckableSlider{ + name: qsTr("Saturation Color") + onValueChanged: shadersettings.saturation_color = value + _value: shadersettings.saturation_color + } } } } diff --git a/app/ShaderTerminal.qml b/app/ShaderTerminal.qml index 26a9729..9a411d5 100644 --- a/app/ShaderTerminal.qml +++ b/app/ShaderTerminal.qml @@ -39,6 +39,9 @@ ShaderEffect { property real screen_distorsion: shadersettings.screen_distortion property real glowing_line_strength: shadersettings.glowing_line_strength + property real chroma_color: shadersettings.chroma_color; + property real saturation_color: shadersettings.saturation_color; + property real brightness_flickering: shadersettings.brightness_flickering property real horizontal_sincronization: shadersettings.horizontal_sincronization @@ -184,10 +187,20 @@ ShaderEffect { (glowing_line_strength !== 0 ? " color += randomPass(coords) * glowing_line_strength;" : "") + - "vec4 realBackColor = texture2D(source, txt_coords);" + - "vec4 mixedColor = mix(realBackColor * font_color, font_color, 0.0);" + - "vec4 finalBackColor = mix(background_color, mixedColor, realBackColor.a);" + - "vec3 finalColor = mix(finalBackColor, font_color, color).rgb;" + + (chroma_color !== 0 ? + "vec4 realBackColor = texture2D(source, txt_coords);" + + (saturation_color !== 0 ? + "vec4 satured_font_color = mix(font_color, vec4(1) , "+ str(saturation_color) + ");" + + "vec4 mixedColor = mix(font_color, realBackColor * satured_font_color, "+ str(chroma_color) +");": + "vec4 mixedColor = mix(font_color, realBackColor * font_color, "+ str(chroma_color) +");" + ) + + + "vec4 finalBackColor = mix(background_color, mixedColor, realBackColor.a);" + + "vec3 finalColor = mix(finalBackColor, font_color, color).rgb;" : + "color += texture2D(source, txt_coords).a;" + + "vec3 finalColor = mix(background_color, font_color, color).rgb;" + ) + + "finalColor *= texture2D(rasterizationSource, coords).a;" + (bloom !== 0 ? " -- 2.47.2 From e1ac0a35b4defb3fea3f95ac2a92e5a1d59d205c Mon Sep 17 00:00:00 2001 From: Firemark Date: Fri, 1 Aug 2014 00:21:34 +0200 Subject: [PATCH 04/15] Change colors in color scheme --- app/ApplicationSettings.qml | 16 ++++++------ .../assets/color-schemes/cool-old-term.schema | 25 ++++++++++--------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/app/ApplicationSettings.qml b/app/ApplicationSettings.qml index d6e9a58..35a12e8 100644 --- a/app/ApplicationSettings.qml +++ b/app/ApplicationSettings.qml @@ -310,42 +310,42 @@ Item{ id: profileslist ListElement{ text: "Default Amber" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.65,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#ff8100","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.08,"jitter":0.18,"motion_blur":0.4,"noise_strength":0.1,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.65,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#ff8100","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.08,"jitter":0.18,"motion_blur":0.4,"noise_strength":0.1,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0}' builtin: true } ListElement{ text: "Default Green" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#0ccc68","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.08,"jitter":0.18,"motion_blur":0.45,"noise_strength":0.1,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#0ccc68","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.08,"jitter":0.18,"motion_blur":0.45,"noise_strength":0.1,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0}' builtin: true } ListElement{ text: "Default Scanlines" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#00ff5b","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.07,"jitter":0.11,"motion_blur":0.4,"noise_strength":0.05,"rasterization":1,"screen_distortion":0.1,"windowOpacity":1}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#00ff5b","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.07,"jitter":0.11,"motion_blur":0.4,"noise_strength":0.05,"rasterization":1,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0}' builtin: true } ListElement{ text: "Default Pixelated" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#ff8100","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.1,"jitter":0,"motion_blur":0.45,"noise_strength":0.14,"rasterization":2,"screen_distortion":0.05,"windowOpacity":1}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#ff8100","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.1,"jitter":0,"motion_blur":0.45,"noise_strength":0.14,"rasterization":2,"screen_distortion":0.05,"windowOpacity":1,"chroma_color":0,"saturation_color":0}' builtin: true } ListElement{ text: "Apple ][" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.5,"brightness":0.5,"brightness_flickering":0.2,"contrast":0.85,"fontIndex":2,"font_color":"#2fff91","frames_index":1,"glowing_line_strength":0.22,"horizontal_sincronization":0.08,"jitter":0.1,"motion_blur":0.65,"noise_strength":0.08,"rasterization":1,"screen_distortion":0.18,"windowOpacity":1}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.5,"brightness":0.5,"brightness_flickering":0.2,"contrast":0.85,"fontIndex":2,"font_color":"#2fff91","frames_index":1,"glowing_line_strength":0.22,"horizontal_sincronization":0.08,"jitter":0.1,"motion_blur":0.65,"noise_strength":0.08,"rasterization":1,"screen_distortion":0.18,"windowOpacity":1,"chroma_color":0,"saturation_color":0}' builtin: true } ListElement{ text: "Vintage" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.54,"contrast":0.85,"fontIndex":0,"font_color":"#00ff3e","frames_index":2,"glowing_line_strength":0.3,"horizontal_sincronization":0.2,"jitter":0.4,"motion_blur":0.75,"noise_strength":0.2,"rasterization":1,"screen_distortion":0.1,"windowOpacity":1}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.54,"contrast":0.85,"fontIndex":0,"font_color":"#00ff3e","frames_index":2,"glowing_line_strength":0.3,"horizontal_sincronization":0.2,"jitter":0.4,"motion_blur":0.75,"noise_strength":0.2,"rasterization":1,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0}' builtin: true } ListElement{ text: "IBM Dos" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.07,"contrast":0.85,"fontIndex":7,"font_color":"#ffffff","frames_index":1,"glowing_line_strength":0.13,"horizontal_sincronization":0,"jitter":0.08,"motion_blur":0.3,"noise_strength":0.03,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":1}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.07,"contrast":0.85,"fontIndex":7,"font_color":"#ffffff","frames_index":1,"glowing_line_strength":0.13,"horizontal_sincronization":0,"jitter":0.08,"motion_blur":0.3,"noise_strength":0.03,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":1,"saturation_color":0}' builtin: true } ListElement{ text: "Transparent Green" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4549689440993788,"brightness":0.5,"brightness_flickering":0.20341614906832298,"contrast":0.85,"fontIndex":0,"font_color":"#0ccc68","frames_index":0,"glowing_line_strength":0.15993788819875776,"horizontal_sincronization":0.05045871559633028,"jitter":0.20341614906832298,"motion_blur":0.24999999999999997,"noise_strength":0.20031055900621117,"rasterization":0,"screen_distortion":0.05045871559633028,"windowOpacity":0.5956221198156681}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4549689440993788,"brightness":0.5,"brightness_flickering":0.20341614906832298,"contrast":0.85,"fontIndex":0,"font_color":"#0ccc68","frames_index":0,"glowing_line_strength":0.15993788819875776,"horizontal_sincronization":0.05045871559633028,"jitter":0.20341614906832298,"motion_blur":0.24999999999999997,"noise_strength":0.20031055900621117,"rasterization":0,"screen_distortion":0.05045871559633028,"windowOpacity":0.5956221198156681,"chroma_color":0,"saturation_color":0}' builtin: true } } diff --git a/konsole-qml-plugin/assets/color-schemes/cool-old-term.schema b/konsole-qml-plugin/assets/color-schemes/cool-old-term.schema index 4df8184..6687f35 100644 --- a/konsole-qml-plugin/assets/color-schemes/cool-old-term.schema +++ b/konsole-qml-plugin/assets/color-schemes/cool-old-term.schema @@ -36,22 +36,23 @@ color 1 0 0 0 1 0 # regular background color (Black) color 2 0 0 0 0 0 # regular color 0 Black -color 3 59 59 59 0 0 # regular color 1 Red +color 3 255 43 43 0 0 # regular color 1 Red -color 4 137 137 137 0 0 # regular color 2 Green +color 4 0 28 172 120 0 0 # regular color 2 Green -color 5 116 116 116 0 0 # regular color 3 Yellow +color 5 248 213 104 0 0 # regular color 3 Yellow -color 6 39 39 39 0 0 # regular color 4 Blue +color 6 0 43 108 196 # regular color 4 Blue -color 7 70 70 70 0 0 # regular color 5 Magenta +color 7 255 29 206 0 0 # regular color 5 Magenta -color 8 148 148 148 0 0 # regular color 6 Cyan +color 8 24 167 181 0 0 # regular color 6 Cyan color 9 179 179 179 0 0 # regular color 7 White + # intensive colors @@ -68,17 +69,17 @@ color 11 0 0 0 1 0 # intensive background color color 12 106 106 106 0 0 # intensive color 0 -color 13 122 122 122 0 0 # intensive color 1 +color 13 253 94 83 0 0 # intensive color 1 -color 14 207 207 207 0 0 # intensive color 2 +color 14 168 228 160 0 0 # intensive color 2 -color 15 243 243 243 0 0 # intensive color 3 +color 15 254 254 34 0 0 # intensive color 3 -color 16 99 99 99 0 0 # intensive color 4 +color 16 154 206 235 0 0 # intensive color 4 -color 17 134 134 134 0 0 # intensive color 5 +color 17 252 116 253 0 0 # intensive color 5 -color 18 219 219 219 0 0 # intensive color 6 +color 18 236 234 190 0 0 # intensive color 6 color 19 255 255 255 0 0 # intensive color 7 -- 2.47.2 From 876e6079d469b2101a90fede89e2d8a29ac0a33f Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Sat, 2 Aug 2014 20:03:16 +0200 Subject: [PATCH 05/15] Fix: color layout in settings window. --- app/SettingsTerminalTab.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/SettingsTerminalTab.qml b/app/SettingsTerminalTab.qml index 07f5ba6..f8116c8 100644 --- a/app/SettingsTerminalTab.qml +++ b/app/SettingsTerminalTab.qml @@ -93,8 +93,9 @@ Tab{ title: qsTr("Colors") Layout.fillWidth: true ColumnLayout{ + anchors.fill: parent RowLayout{ - anchors.fill: parent + Layout.fillWidth: true ColorButton{ name: qsTr("Font") height: 50 @@ -111,6 +112,7 @@ Tab{ } } ColumnLayout{ + Layout.fillWidth: true CheckableSlider{ name: qsTr("Chroma Color") onValueChanged: shadersettings.chroma_color = value -- 2.47.2 From 4b4fabaee34d3104bb3aae3e9880213d9079343a Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Sun, 3 Aug 2014 10:36:07 +0200 Subject: [PATCH 06/15] Fix issues between colors and motion blur. --- app/PreprocessedTerminal.qml | 8 +++++--- app/ShaderTerminal.qml | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/PreprocessedTerminal.qml b/app/PreprocessedTerminal.qml index 223e2e5..b3b5553 100644 --- a/app/PreprocessedTerminal.qml +++ b/app/PreprocessedTerminal.qml @@ -255,16 +255,18 @@ Item{ : "") + "coords = coords + delta;" + "vec4 vcolor = texture2D(source, coords) * 256.0; - float color = vcolor.r * 0.21 + vcolor.g * 0.72 + vcolor.b + 0.04;" + + float color = vcolor.r * 0.21 + vcolor.g * 0.72 + vcolor.b * 0.04;" + (mBlur !== 0 ? + "vec4 blurredVcolor = texture2D(blurredSource, coords) * 256.0;" + "float blurredSourceColor = texture2D(blurredSource, coords).a * 256.0;" + "blurredSourceColor = blurredSourceColor - blurredSourceColor * " + (1.0 - motionBlurCoefficient) * fpsAttenuation+ ";" + + "vcolor = step(1.0, color) * vcolor + step(color, 1.0) * blurredVcolor;" + "color = step(1.0, color) * color + step(color, 1.0) * blurredSourceColor;" : "") + - "gl_FragColor = texture2D(source, coords);" + - "gl_FragColor.a = color / 256.0;" + + "gl_FragColor = floor(vcolor) / 256.0;" + + "gl_FragColor.a = floor(color) / 256.0;" + "}" onStatusChanged: if (log) console.log(log) //Print warning messages diff --git a/app/ShaderTerminal.qml b/app/ShaderTerminal.qml index 9a411d5..a2e1c0d 100644 --- a/app/ShaderTerminal.qml +++ b/app/ShaderTerminal.qml @@ -191,7 +191,8 @@ ShaderEffect { "vec4 realBackColor = texture2D(source, txt_coords);" + (saturation_color !== 0 ? "vec4 satured_font_color = mix(font_color, vec4(1) , "+ str(saturation_color) + ");" + - "vec4 mixedColor = mix(font_color, realBackColor * satured_font_color, "+ str(chroma_color) +");": + "vec4 mixedColor = mix(font_color, realBackColor * satured_font_color, "+ str(chroma_color) +");" + : "vec4 mixedColor = mix(font_color, realBackColor * font_color, "+ str(chroma_color) +");" ) + -- 2.47.2 From a7210c69ed999e8f6d0a385ab7cb3f8b4bcfffe8 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Sun, 3 Aug 2014 10:44:25 +0200 Subject: [PATCH 07/15] Fix incorrect colors scheme. --- konsole-qml-plugin/assets/color-schemes/cool-old-term.schema | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/konsole-qml-plugin/assets/color-schemes/cool-old-term.schema b/konsole-qml-plugin/assets/color-schemes/cool-old-term.schema index 6687f35..b9340a7 100644 --- a/konsole-qml-plugin/assets/color-schemes/cool-old-term.schema +++ b/konsole-qml-plugin/assets/color-schemes/cool-old-term.schema @@ -38,11 +38,11 @@ color 2 0 0 0 0 0 # regular color 0 Black color 3 255 43 43 0 0 # regular color 1 Red -color 4 0 28 172 120 0 0 # regular color 2 Green +color 4 28 172 120 0 0 # regular color 2 Green color 5 248 213 104 0 0 # regular color 3 Yellow -color 6 0 43 108 196 # regular color 4 Blue +color 6 43 108 196 0 0 # regular color 4 Blue color 7 255 29 206 0 0 # regular color 5 Magenta -- 2.47.2 From 1902e34d04cc8092f2ab1c422df730e8bca79560 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Sun, 3 Aug 2014 14:43:36 +0200 Subject: [PATCH 08/15] Fix issues between colors and bloom. --- app/PreprocessedTerminal.qml | 6 +++++- app/ShaderTerminal.qml | 23 ++++++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/app/PreprocessedTerminal.qml b/app/PreprocessedTerminal.qml index b3b5553..11f6cc5 100644 --- a/app/PreprocessedTerminal.qml +++ b/app/PreprocessedTerminal.qml @@ -246,6 +246,10 @@ Item{ "uniform lowp sampler2D blurredSource;" : "") + + "float rgb2grey(vec3 v){ + return dot(v, vec3(0.21, 0.72, 0.04)); + }" + + "void main() {" + "vec2 coords = qt_TexCoord0;" + (mScanlines != shadersettings.no_rasterization ? " @@ -255,7 +259,7 @@ Item{ : "") + "coords = coords + delta;" + "vec4 vcolor = texture2D(source, coords) * 256.0; - float color = vcolor.r * 0.21 + vcolor.g * 0.72 + vcolor.b * 0.04;" + + float color = rgb2grey(vcolor);" + (mBlur !== 0 ? "vec4 blurredVcolor = texture2D(blurredSource, coords) * 256.0;" + "float blurredSourceColor = texture2D(blurredSource, coords).a * 256.0;" + diff --git a/app/ShaderTerminal.qml b/app/ShaderTerminal.qml index a2e1c0d..f53d077 100644 --- a/app/ShaderTerminal.qml +++ b/app/ShaderTerminal.qml @@ -146,6 +146,9 @@ ShaderEffect { return fract(smoothstep(-0.2, 0.0, coords.y - 3.0 * fract(time * 0.0001))) * glowing_line_strength; }" : "") + + "float rgb2grey(vec3 v){ + return dot(v, vec3(0.21, 0.72, 0.04)); + }" + "void main() {" + "vec2 cc = vec2(0.5) - qt_TexCoord0;" + @@ -187,26 +190,32 @@ ShaderEffect { (glowing_line_strength !== 0 ? " color += randomPass(coords) * glowing_line_strength;" : "") + - (chroma_color !== 0 ? + (chroma_color !== 0 ? "vec4 realBackColor = texture2D(source, txt_coords);" + (saturation_color !== 0 ? "vec4 satured_font_color = mix(font_color, vec4(1) , "+ str(saturation_color) + ");" + "vec4 mixedColor = mix(font_color, realBackColor * satured_font_color, "+ str(chroma_color) +");" : "vec4 mixedColor = mix(font_color, realBackColor * font_color, "+ str(chroma_color) +");" - ) + - + ) + + "vec4 finalBackColor = mix(background_color, mixedColor, realBackColor.a);" + - "vec3 finalColor = mix(finalBackColor, font_color, color).rgb;" : + "vec3 finalColor = mix(finalBackColor, font_color, color).rgb;" + : "color += texture2D(source, txt_coords).a;" + "vec3 finalColor = mix(background_color, font_color, color).rgb;" ) + "finalColor *= texture2D(rasterizationSource, coords).a;" + - (bloom !== 0 ? " - finalColor += font_color.rgb *" + - "dot(texture2D(bloomSource, coords).rgb, vec3(0.299, 0.587, 0.114)) *" + str(bloom) + ";" : "") + + (bloom !== 0 ? + "vec3 bloomColor = texture2D(bloomSource, coords).rgb;" + + (chroma_color !== 0 ? + "bloomColor = font_color.rgb * mix(vec3(rgb2grey(bloomColor)), bloomColor, "+str(chroma_color)+");" + : + "bloomColor = font_color.rgb * rgb2grey(bloomColor);") + + "finalColor += bloomColor * "+str(bloom)+";" + : "") + (brightness_flickering !== 0 ? " finalColor *= brightness;" : "") + -- 2.47.2 From f4771d4f37408275ac4f06ec9ef8849827db3239 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Sun, 3 Aug 2014 16:39:28 +0200 Subject: [PATCH 09/15] Rewrite motion blur with colors. It now simpler. --- app/PreprocessedTerminal.qml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/app/PreprocessedTerminal.qml b/app/PreprocessedTerminal.qml index 11f6cc5..7720f49 100644 --- a/app/PreprocessedTerminal.qml +++ b/app/PreprocessedTerminal.qml @@ -220,7 +220,6 @@ Item{ id: finalSource sourceItem: blurredterminal sourceRect: frame.sourceRect - //format: ShaderEffectSource.Alpha hideSource: true } ShaderEffect { @@ -258,19 +257,18 @@ Item{ coords.x = floor(virtual_resolution.x * coords.x) / virtual_resolution.x;" : "") : "") + "coords = coords + delta;" + - "vec4 vcolor = texture2D(source, coords) * 256.0; - float color = rgb2grey(vcolor);" + + + "vec4 color = texture2D(source, coords) * 256.0; + color.a = rgb2grey(color.rgb);" + + (mBlur !== 0 ? - "vec4 blurredVcolor = texture2D(blurredSource, coords) * 256.0;" + - "float blurredSourceColor = texture2D(blurredSource, coords).a * 256.0;" + - "blurredSourceColor = blurredSourceColor - blurredSourceColor * " + (1.0 - motionBlurCoefficient) * fpsAttenuation+ ";" + - "vcolor = step(1.0, color) * vcolor + step(color, 1.0) * blurredVcolor;" + - "color = step(1.0, color) * color + step(color, 1.0) * blurredSourceColor;" + "vec4 blur_color = texture2D(blurredSource, coords) * 256.0;" + + "blur_color.a = blur_color.a - blur_color.a * " + (1.0 - motionBlurCoefficient) * fpsAttenuation+ ";" + + "color = step(1.0, color.a) * color + step(color.a, 1.0) * blur_color;" : "") + - "gl_FragColor = floor(vcolor) / 256.0;" + - "gl_FragColor.a = floor(color) / 256.0;" + + "gl_FragColor = floor(color) / 256.0;" + "}" onStatusChanged: if (log) console.log(log) //Print warning messages -- 2.47.2 From 7f5a47f8a42edef1e1fb9f689b1463747ef5774d Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Wed, 6 Aug 2014 19:07:30 +0200 Subject: [PATCH 10/15] Use offline saturation color. Better and a little bit faster. --- app/ApplicationSettings.qml | 5 +++-- app/ShaderTerminal.qml | 7 +------ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/app/ApplicationSettings.qml b/app/ApplicationSettings.qml index 386e110..5d38948 100644 --- a/app/ApplicationSettings.qml +++ b/app/ApplicationSettings.qml @@ -59,8 +59,9 @@ Item{ property string _background_color: "#000000" property string _font_color: "#ff8100" - property color font_color: mix(strToColor(_font_color), strToColor(_background_color), 0.7 + (contrast * 0.3)) - property color background_color: mix(strToColor(_background_color), strToColor(_font_color), 0.7 + (contrast * 0.3)) + property string saturated_color: mix(strToColor("#FFFFFF"), strToColor(_font_color), saturation_color) + property color font_color: mix(strToColor(saturated_color), strToColor(_background_color), 0.7 + (contrast * 0.3)) + property color background_color: mix(strToColor(_background_color), strToColor(saturated_color), 0.7 + (contrast * 0.3)) property real noise_strength: 0.1 property real screen_distortion: 0.1 diff --git a/app/ShaderTerminal.qml b/app/ShaderTerminal.qml index f53d077..b4b12e1 100644 --- a/app/ShaderTerminal.qml +++ b/app/ShaderTerminal.qml @@ -192,12 +192,7 @@ ShaderEffect { (chroma_color !== 0 ? "vec4 realBackColor = texture2D(source, txt_coords);" + - (saturation_color !== 0 ? - "vec4 satured_font_color = mix(font_color, vec4(1) , "+ str(saturation_color) + ");" + - "vec4 mixedColor = mix(font_color, realBackColor * satured_font_color, "+ str(chroma_color) +");" - : - "vec4 mixedColor = mix(font_color, realBackColor * font_color, "+ str(chroma_color) +");" - ) + + "vec4 mixedColor = mix(font_color, realBackColor * font_color, "+ str(chroma_color) +");" + "vec4 finalBackColor = mix(background_color, mixedColor, realBackColor.a);" + "vec3 finalColor = mix(finalBackColor, font_color, color).rgb;" -- 2.47.2 From 40d34c2cca6ca05a72775499c161db3e58c97c2a Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Thu, 7 Aug 2014 00:18:44 +0200 Subject: [PATCH 11/15] Fix: colors play nicely with frames reflections now. --- app/frames/utils/FrameShader.qml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/app/frames/utils/FrameShader.qml b/app/frames/utils/FrameShader.qml index fee9045..78a1142 100644 --- a/app/frames/utils/FrameShader.qml +++ b/app/frames/utils/FrameShader.qml @@ -13,6 +13,8 @@ ShaderEffect{ property bool frameReflections: shadersettings.frameReflections property variant lightSource: reflectionEffectSourceLoader.item + property real chroma_color: shadersettings.chroma_color + Loader{ id: reflectionEffectLoader width: parent.width * 0.33 @@ -62,6 +64,10 @@ ShaderEffect{ return (coords + cc * (1.0 + dist) * dist); } + float rgb2grey(vec3 v){ + return dot(v, vec3(0.21, 0.72, 0.04)); + } + void main(){ vec2 coords = distortCoordinates(qt_TexCoord0); vec4 txt_color = texture2D(source, coords); @@ -72,16 +78,20 @@ ShaderEffect{ float dotProd = dot(normal, light_direction);" + (frameReflections ? " - float screenLight = texture2D(lightSource, coords).r; + vec3 realLightColor = texture2D(lightSource, coords).rgb; + float screenLight = rgb2grey(realLightColor); float clampedDotProd = clamp(dotProd, 0.05, 1.0); float diffuseReflection = clamp(screenLight * 1.5 * clampedDotProd, 0.0, 0.35); - float reflectionAlpha = mix(1.0, 0.90, dotProd);" + float reflectionAlpha = mix(1.0, 0.90, dotProd); + vec3 lightColor = mix(font_color.rgb * screenLight, font_color.rgb * realLightColor, "+chroma_color.toFixed(2)+");" : " float diffuseReflection = 0.0; - float reflectionAlpha = 1.0;") + " + float reflectionAlpha = 1.0; + vec3 lightColor = font_color.rgb;") + " + vec3 back_color = background_color.rgb * (0.2 + 0.5 * dotProd); - vec3 front_color = font_color.rgb * (0.05 + diffuseReflection); + vec3 front_color = lightColor * (0.05 + diffuseReflection); vec4 dark_color = vec4((back_color + front_color) * txt_normal.a, txt_normal.a * reflectionAlpha); gl_FragColor = mix(dark_color, txt_color, ambient_light); -- 2.47.2 From 307f6403273b8c2e9cf5d14eb32ffb43063e9b27 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Thu, 7 Aug 2014 00:21:40 +0200 Subject: [PATCH 12/15] Capping saturation to 50% --- app/ApplicationSettings.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/ApplicationSettings.qml b/app/ApplicationSettings.qml index 5d38948..242f681 100644 --- a/app/ApplicationSettings.qml +++ b/app/ApplicationSettings.qml @@ -59,7 +59,7 @@ Item{ property string _background_color: "#000000" property string _font_color: "#ff8100" - property string saturated_color: mix(strToColor("#FFFFFF"), strToColor(_font_color), saturation_color) + property string saturated_color: mix(strToColor("#FFFFFF"), strToColor(_font_color), saturation_color * 0.5) property color font_color: mix(strToColor(saturated_color), strToColor(_background_color), 0.7 + (contrast * 0.3)) property color background_color: mix(strToColor(_background_color), strToColor(saturated_color), 0.7 + (contrast * 0.3)) -- 2.47.2 From be0ccfa1ba821e0dbc53001c235772fd81e61e38 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Thu, 7 Aug 2014 00:30:08 +0200 Subject: [PATCH 13/15] Changing close shortcut. --- app/main.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/main.qml b/app/main.qml index 3551d5c..0f81755 100644 --- a/app/main.qml +++ b/app/main.qml @@ -58,7 +58,7 @@ ApplicationWindow{ Action { id: quitAction text: qsTr("&Quit") - shortcut: "Ctrl+Q" + shortcut: "Ctrl+Shift+Q" onTriggered: terminalWindow.close(); } Action{ -- 2.47.2 From 064e967810fc51b903fa13748fc8de0cc33dcb44 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Thu, 7 Aug 2014 00:33:40 +0200 Subject: [PATCH 14/15] Fix 61 . Removed Alt based combinations. --- app/main.qml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/main.qml b/app/main.qml index 0f81755..7b02258 100644 --- a/app/main.qml +++ b/app/main.qml @@ -49,7 +49,7 @@ ApplicationWindow{ } Action { id: fullscreenAction - text: qsTr("&Fullscreen") + text: qsTr("Fullscreen") shortcut: "Alt+F11" onTriggered: shadersettings.fullscreen = !shadersettings.fullscreen; checkable: true @@ -57,30 +57,30 @@ ApplicationWindow{ } Action { id: quitAction - text: qsTr("&Quit") + text: qsTr("Quit") shortcut: "Ctrl+Shift+Q" onTriggered: terminalWindow.close(); } Action{ id: showsettingsAction - text: qsTr("&Settings") + text: qsTr("Settings") onTriggered: settingswindow.show(); } Action{ id: copyAction - text: qsTr("&Copy") + text: qsTr("Copy") shortcut: "Ctrl+Shift+C" onTriggered: terminal.copyClipboard() } Action{ id: pasteAction - text: qsTr("&Paste") + text: qsTr("Paste") shortcut: "Ctrl+Shift+V" onTriggered: terminal.pasteClipboard() } Action{ id: zoomIn - text: qsTr("&Zoom In") + text: qsTr("Zoom In") shortcut: "Ctrl++" onTriggered: { var oldScaling = shadersettings.fontScalingIndexes[shadersettings.rasterization]; @@ -90,7 +90,7 @@ ApplicationWindow{ } Action{ id: zoomOut - text: qsTr("&Zoom Out") + text: qsTr("Zoom Out") shortcut: "Ctrl+-" onTriggered: { var oldScaling = shadersettings.fontScalingIndexes[shadersettings.rasterization]; -- 2.47.2 From 428887cb8abf6c69666ca7e90b20c20c84f1a9b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20B=C3=A1nffy?= Date: Thu, 7 Aug 2014 00:13:59 -0300 Subject: [PATCH 15/15] Added IBM 3278-like terminal font (from https://github.com/rbanffy/3270font) --- app/ApplicationSettings.qml | 5 +++++ app/Fonts.qml | 6 ++++++ app/fonts/1971-ibm-3278/3270Medium.ttf | Bin 0 -> 43748 bytes app/fonts/1971-ibm-3278/LICENSE.txt | 13 +++++++++++++ 4 files changed, 24 insertions(+) create mode 100644 app/fonts/1971-ibm-3278/3270Medium.ttf create mode 100644 app/fonts/1971-ibm-3278/LICENSE.txt diff --git a/app/ApplicationSettings.qml b/app/ApplicationSettings.qml index 3ad1712..84da336 100644 --- a/app/ApplicationSettings.qml +++ b/app/ApplicationSettings.qml @@ -340,6 +340,11 @@ Item{ obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.07,"contrast":0.85,"fontIndex":7,"font_color":"#ffffff","frames_index":1,"glowing_line_strength":0.13,"horizontal_sincronization":0,"jitter":0.08,"motion_blur":0.3,"noise_strength":0.03,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1}' builtin: true } + ListElement{ + text: "IBM 3278" + obj_string: '{"ambient_light":0.1,"background_color":"#000000","bloom_strength":0.15,"brightness":0.5,"brightness_flickering":0,"contrast":0.95,"fontIndex":8,"font_color":"#0ccc68","frames_index":1,"glowing_line_strength":0,"horizontal_sincronization":0,"jitter":0,"motion_blur":0.6,"noise_strength":0,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1}' + builtin: true + } ListElement{ text: "Transparent Green" obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4549689440993788,"brightness":0.5,"brightness_flickering":0.20341614906832298,"contrast":0.85,"fontIndex":0,"font_color":"#0ccc68","frames_index":0,"glowing_line_strength":0.15993788819875776,"horizontal_sincronization":0.05045871559633028,"jitter":0.20341614906832298,"motion_blur":0.24999999999999997,"noise_strength":0.20031055900621117,"rasterization":0,"screen_distortion":0.05045871559633028,"windowOpacity":0.5956221198156681}' diff --git a/app/Fonts.qml b/app/Fonts.qml index e851b6f..dc2a03b 100644 --- a/app/Fonts.qml +++ b/app/Fonts.qml @@ -83,5 +83,11 @@ Item{ lineSpacing: 0.2 pixelSize: 32 } + ListElement{ + text: "IBM 3278 (1971)" + source: "fonts/1971-ibm-3278/3270Medium.ttf" + lineSpacing: 0.2 + pixelSize: 32 + } } } diff --git a/app/fonts/1971-ibm-3278/3270Medium.ttf b/app/fonts/1971-ibm-3278/3270Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cb440692d4a8038b060636e30636ca049d78a9f8 GIT binary patch literal 43748 zcmeFa3w)H-wKu%i^UUp;%uFsblLQFKBq5n(Cih7)B$)|>5CnvPA)s7DLM{Y^1d|{T zkfLpE4+<(+1-w+j+8%EOiv+EDditKW+FJGWV!a?$>!+SpJw1xoS0?X&?dO?X5b8PS zci!(i@9%pvnVDzb*Is+Awbx#I?LC5o5H7J(sAAQuS*`QCv~PQbxbG>%W?V3{X_iP7 znF#*?;mie#N-OqG*jFY5btAm0eM8&EH(pmugs|=u!ra<^<$zCQD_ezd{0`}+HEsPH zhlf$KxbH56ZEMzV?Rxpm^;3mNLHTuCx;xuC=)!@oA?;nftGf|lepE1A~ zrLAqoVT1vX`S|+Y_O?kc#$G`EFCx5WL)(^(YAUrLeKzv@dfGO0Hnav02(kS&AyQx4 z*xNsF)9ZI839;`d2%i$%SGN`mPP|1@u>1q0>mt&NliyKkuMq!dAN#>d^N)RGpQqt+PFeBG4<#80c zUjL@oL^+`yMOc6*{__d({Uk9p2amwC5DUASI>b+e7#>!A!&3pnMdB}rCNUi!CzU05 z_6ef(zcwHQqxU7Mo;RDJ)xDhi^S}huDi3w>n8gB&-b4^)j8G`bM6P$R}6Qpft4fUQcj2y;Rh}szRZ7yp2pVj zpP}bA(EH}GmHgl55e$@zrQ$ny9}-uL#GU`4543(KUOR_BMy6&l7qrU!v0T!>n~O(KPIX{PeH`grEWz6Y}Zlqd3( zJV#zqo+mFoFC%YCUL^0^dB^ge40Z&+{@S6}jt=9GYokV4rWIvgJ8zj)!JV(&_1ckP z%rRW#%*9{q7vhhXy!QO7L$4lt_4unldiBVw559WOt9QJ*{nhGM#mP_paKRsngvim9 z?*q~bZU-|)pZ^{!#T1bz@`WF= zrBDPQi=PyB$Wcv900-YC?#B2Y7WatniF?KO#Sg^ai~Gd=;sNoXcu4#Z67#5d7_-$e z@rXDsh9Jit6$v6$I56v#LALD_SBq=J*Tpx)H^sH$TjJZ|@5C-~9p;_gVvo21a{eaF zO8dmkprl*Gt&pMzM3P8@HdRN1w2ijYRkVY?Mmy?hEp#jGrvr45Zo~YWAtr+^GDW&50!=+H)`|6^nx=|>hNPS- zUJ%`4t*ECOkp)RRO{}45VuQF)%oFoPuUI7pF#~ssjpA|fn0P|8iEZLaQ2T1kgquO9 ze-K|2?cyr2MRZ|iTrPerI>ZjK6?6A&@sbE)E?*`Vizcy9+%67^1)>2|zeHRlW`M#k z7A@jq%+`(KQgMlxB^FVwxJ}FyE5T9CVvhKf>S#JO&WggbLm2wNAszf7SKYvh+1e7Ev8mlLKo8|w3L?7a*9xt?xlL=apei+$HJo6 znZCd}|39ZMIj&D&OuvTF8^Bmi$7n6Yc-@Y%nv2omv08!A;<366G$ud~w}HZXFqg;w)`Ri{Xm%AS zt}7lH{|0pks*@p8JPzOSdN+YC2SJ%_24$|6R4G86OphH#iMVdS?em{pgMjDtR}Y}+ z0mtqEH@^%`HU=8nNgpUv@S2L(T;&?&ka9%%shX-5s6S9YHeG9az%0yD&2N}Lx7=gR zv2L_JZY#1avwfg#w|nf@+D|0(I5Hdo$4SRKPQ~eQ7C5ImXE{5Z8=W^gpLf3D%5Y6} zt#Yk*ZE>A&{gdl?*Gbnqi7APhiGjrG#A_2@Oq!L{lC&~uUDB0Fdy)<&{XFS6NvD!c z$w|o>$py(XlDm@ol6NHUO1>reQ1U~`k0t*+`8Ua@l0Qu;Na;?wC*?J_#T{@*+&8*! zcmKeB%>5JhGwv7NZ@T~L{=#GPcsxE&k!PxBre~q&8qd9+r#$a_ecl<~>%B+3KlQ$q zDpJ!^=cNv&K9u^q)GyKkY29hxPCK6VLb@rvBz<1`>hy=x-%tO1Ldt}q371URG2!6} zZ%njL^i8as*fnwc#Jv+wOniCbpC_eE3QSrx>Do#EH0k4vsTp%K)@NLw@mR*2la
  • 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 literal 0 HcmV?d00001 diff --git a/app/fonts/1971-ibm-3278/LICENSE.txt b/app/fonts/1971-ibm-3278/LICENSE.txt new file mode 100644 index 0000000..e34e816 --- /dev/null +++ b/app/fonts/1971-ibm-3278/LICENSE.txt @@ -0,0 +1,13 @@ +Copyright (c) 2011-2012, Ricardo Banffy. +Copyright (c) 1993-2011, Paul Mattes. +Copyright (c) 2004-2005, Don Russell. +Copyright (c) 2004, Dick Altenbern. +Copyright (c) 1990, Jeff Sparkes. +Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. +All rights reserved. +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +Neither the names of Ricardo Banffy, Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- 2.47.2