123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- import GLib from 'gi://GLib';
- import GObject from 'gi://GObject';
- import Clutter from 'gi://Clutter';
- import Shell from 'gi://Shell';
- const SHADER_PATH = GLib.filename_from_uri(GLib.uri_resolve_relative(import.meta.url, 'noise_effect.glsl', GLib.UriFlags.NONE))[0];
- const get_shader_source = _ => {
- try {
- return Shell.get_file_contents_utf8_sync(SHADER_PATH);
- } catch (e) {
- console.warn(`[Blur my Shell] error loading shader from ${SHADER_PATH}: ${e}`);
- return null;
- }
- };
- export const NoiseEffect = new GObject.registerClass({
- GTypeName: "NoiseEffect",
- Properties: {
- 'noise': GObject.ParamSpec.double(
- `noise`,
- `Noise`,
- `Amount of noise integrated with the image`,
- GObject.ParamFlags.READWRITE,
- 0.0, 1.0,
- 0.4,
- ),
- 'lightness': GObject.ParamSpec.double(
- `lightness`,
- `Lightness`,
- `Lightness of the grey used for the noise`,
- GObject.ParamFlags.READWRITE,
- 0.0, 2.0,
- 0.4,
- ),
- }
- }, class NoiseShader extends Clutter.ShaderEffect {
- constructor(params, settings) {
- super(params);
- this._noise = null;
- this._lightness = null;
- this._static = true;
- this._settings = settings;
- if (params.noise)
- this.noise = params.noise;
- if (params.lightness)
- this.lightness = params.lightness;
- // set shader source
- this._source = get_shader_source();
- if (this._source)
- this.set_shader_source(this._source);
- this.update_enabled();
- }
- get noise() {
- return this._noise;
- }
- set noise(value) {
- if (this._noise !== value) {
- this._noise = value;
- this.set_uniform_value('noise', parseFloat(this._noise - 1e-6));
- }
- this.update_enabled();
- }
- get lightness() {
- return this._lightness;
- }
- set lightness(value) {
- if (this._lightness !== value) {
- this._lightness = value;
- this.set_uniform_value('lightness', parseFloat(this._lightness - 1e-6));
- }
- }
- update_enabled() {
- // don't anything if this._settings is undefined (when calling super)
- if (this._settings === undefined)
- return;
- this.set_enabled(
- this.noise > 0 &&
- this._settings.COLOR_AND_NOISE &&
- this._static
- );
- }
- vfunc_paint_target(paint_node = null, paint_context = null) {
- this.set_uniform_value("tex", 0);
- if (paint_node && paint_context)
- super.vfunc_paint_target(paint_node, paint_context);
- else if (paint_node)
- super.vfunc_paint_target(paint_node);
- else
- super.vfunc_paint_target();
- }
- });
|