141 lines
4.6 KiB
JavaScript
141 lines
4.6 KiB
JavaScript
import GObject from 'gi://GObject';
|
|
|
|
import * as utils from '../conveniences/utils.js';
|
|
const Shell = await utils.import_in_shell_only('gi://Shell');
|
|
const Clutter = await utils.import_in_shell_only('gi://Clutter');
|
|
|
|
const SHADER_FILENAME = 'luminosity.glsl';
|
|
const DEFAULT_PARAMS = {
|
|
brightness_shift: 0., brightness_multiplicator: 1., contrast: 1., contrast_center: 0.5, saturation_multiplicator: 1.
|
|
};
|
|
|
|
|
|
export const LuminosityEffect = utils.IS_IN_PREFERENCES ?
|
|
{ default_params: DEFAULT_PARAMS } :
|
|
new GObject.registerClass({
|
|
GTypeName: "LuminosityEffect",
|
|
Properties: {
|
|
'brightness_shift': GObject.ParamSpec.double(
|
|
`brightness_shift`,
|
|
`Brightness shift`,
|
|
`Brightness shift value in shader`,
|
|
GObject.ParamFlags.READWRITE,
|
|
-1.0, 1.0,
|
|
0.0,
|
|
),
|
|
'brightness_multiplicator': GObject.ParamSpec.double(
|
|
`brightness_multiplicator`,
|
|
`Brightness multiplicator`,
|
|
`Brightness multiplicator value in shader`,
|
|
GObject.ParamFlags.READWRITE,
|
|
0.0, 2.0,
|
|
1.0,
|
|
),
|
|
'contrast': GObject.ParamSpec.double(
|
|
`contrast`,
|
|
`Contrast`,
|
|
`Contrast value in shader`,
|
|
GObject.ParamFlags.READWRITE,
|
|
0.0, 2.0,
|
|
1.0,
|
|
),
|
|
'contrast_center': GObject.ParamSpec.double(
|
|
`contrast_center`,
|
|
`Contrast center`,
|
|
`Contrast center value in shader`,
|
|
GObject.ParamFlags.READWRITE,
|
|
0.0, 1.0,
|
|
0.5,
|
|
),
|
|
'saturation_multiplicator': GObject.ParamSpec.double(
|
|
`saturation_multiplicator`,
|
|
`Saturation multiplicator`,
|
|
`Saturation multiplicator value in shader`,
|
|
GObject.ParamFlags.READWRITE,
|
|
0.0, 2.0,
|
|
1.0,
|
|
),
|
|
}
|
|
}, class LuminosityEffect extends Clutter.ShaderEffect {
|
|
constructor(params) {
|
|
super(params);
|
|
|
|
utils.setup_params(this, params);
|
|
|
|
// set shader source
|
|
this._source = utils.get_shader_source(Shell, SHADER_FILENAME, import.meta.url);
|
|
if (this._source)
|
|
this.set_shader_source(this._source);
|
|
}
|
|
|
|
static get default_params() {
|
|
return DEFAULT_PARAMS;
|
|
}
|
|
|
|
get brightness_shift() {
|
|
return this._brightness;
|
|
}
|
|
|
|
set brightness_shift(value) {
|
|
if (this._brightness_shift !== value) {
|
|
this._brightness_shift = value;
|
|
|
|
this.set_uniform_value('brightness_shift', parseFloat(this._brightness_shift - 1e-6));
|
|
}
|
|
}
|
|
|
|
|
|
get brightness_multiplicator() {
|
|
return this._brightness_multiplicator;
|
|
}
|
|
|
|
set brightness_multiplicator(value) {
|
|
if (this._brightness_multiplicator !== value) {
|
|
this._brightness_multiplicator = value;
|
|
|
|
let brightness_mul = 600.;
|
|
if (value < 1.995)
|
|
brightness_mul = 3. * (1. / (1. - (value / 2.) ** 2) - 1.);
|
|
this.set_uniform_value('brightness_multiplicator', parseFloat(brightness_mul - 1e-6));
|
|
}
|
|
}
|
|
|
|
get contrast() {
|
|
return this._contrast;
|
|
}
|
|
|
|
set contrast(value) {
|
|
if (this._contrast !== value) {
|
|
this._contrast = value;
|
|
|
|
this.set_uniform_value('contrast', parseFloat(this._contrast - 1e-6));
|
|
}
|
|
}
|
|
|
|
get contrast_center() {
|
|
return this._contrast_center;
|
|
}
|
|
|
|
set contrast_center(value) {
|
|
if (this._contrast_center !== value) {
|
|
this._contrast_center = value;
|
|
|
|
this.set_uniform_value('contrast_center', parseFloat(this._contrast_center - 1e-6));
|
|
}
|
|
}
|
|
|
|
get saturation_multiplicator() {
|
|
return this._saturation_multiplicator;
|
|
}
|
|
|
|
set saturation_multiplicator(value) {
|
|
if (this._saturation_multiplicator !== value) {
|
|
this._saturation_multiplicator = value;
|
|
|
|
let saturation_mul = 600.;
|
|
if (value < 1.995)
|
|
saturation_mul = 3. * (1. / (1. - (value / 2.) ** 2) - 1.);
|
|
this.set_uniform_value('saturation_multiplicator', parseFloat(saturation_mul - 1e-6));
|
|
}
|
|
}
|
|
}); |