[gnome-shell] Add a grayscale effect



commit 8754b2767c1b54ee882875e0d159d847602e8c6a
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Fri Jun 1 08:36:47 2012 -0400

    Add a grayscale effect
    
    This commit adds a grayscale effect to the magnifier, similar to
    the lightness, brightness and contrast effects that are already there.
    
    The effect is configured with the
    org.gnome.desktop.a11y.magnifier.color-saturation setting, which
    can take values from 0.0 (grayscale) to 1.0 (full color).
    
    Based on a patch by Matthias Clasen <mclasen redhat com>
    
    https://bugzilla.gnome.org/show_bug.cgi?id=676782

 js/ui/magnifier.js |   49 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 49 insertions(+), 0 deletions(-)
---
diff --git a/js/ui/magnifier.js b/js/ui/magnifier.js
index d773f08..c11a589 100644
--- a/js/ui/magnifier.js
+++ b/js/ui/magnifier.js
@@ -26,6 +26,7 @@ const MAGNIFIER_SCHEMA          = 'org.gnome.desktop.a11y.magnifier';
 const SCREEN_POSITION_KEY       = 'screen-position';
 const MAG_FACTOR_KEY            = 'mag-factor';
 const INVERT_LIGHTNESS_KEY      = 'invert-lightness';
+const COLOR_SATURATION_KEY      = 'color-saturation';
 const BRIGHT_RED_KEY            = 'brightness-red';
 const BRIGHT_GREEN_KEY          = 'brightness-green';
 const BRIGHT_BLUE_KEY           = 'brightness-blue';
@@ -456,6 +457,10 @@ const Magnifier = new Lang.Class({
             if (aPref)
                 zoomRegion.setInvertLightness(aPref);
 
+            aPref = this._settings.get_double(COLOR_SATURATION_KEY);
+            if (aPref)
+                zoomRegion.setColorSaturation(aPref);
+
             let bc = {};
             bc.r = this._settings.get_double(BRIGHT_RED_KEY);
             bc.g = this._settings.get_double(BRIGHT_GREEN_KEY);
@@ -490,6 +495,8 @@ const Magnifier = new Lang.Class({
 
         this._settings.connect('changed::' + INVERT_LIGHTNESS_KEY,
                                Lang.bind(this, this._updateInvertLightness));
+        this._settings.connect('changed::' + COLOR_SATURATION_KEY,
+                               Lang.bind(this, this._updateColorSaturation));
 
         this._settings.connect('changed::' + BRIGHT_RED_KEY,
                                Lang.bind(this, this._updateBrightness));
@@ -591,6 +598,15 @@ const Magnifier = new Lang.Class({
         }
     },
 
+    _updateColorSaturation: function() {
+        // Applies only to the first zoom region.
+        if (this._zoomRegions.length) {
+            this._zoomRegions[0].setColorSaturation(
+                this._settings.get_boolean(COLOR_SATURATION_KEY)
+            );
+        }
+    },
+
     _updateBrightness: function() {
         // Applies only to the first zoom region.
         if (this._zoomRegions.length) {
@@ -626,6 +642,7 @@ const ZoomRegion = new Lang.Class({
         this._lensMode = false;
         this._screenPosition = GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN;
         this._invertLightness = false;
+        this._colorSaturation = 1.0;
         this._brightness = { r: NO_CHANGE, g: NO_CHANGE, b: NO_CHANGE };
         this._contrast = { r: NO_CHANGE, g: NO_CHANGE, b: NO_CHANGE };
 
@@ -974,6 +991,27 @@ const ZoomRegion = new Lang.Class({
     },
 
     /**
+     * setColorSaturation:
+     * Set the color saturation of the magnified view.
+     * @sauration  A value from 0.0 to 1.0 that defines the color
+     *             saturation, with 0.0 defining no color (grayscale),
+     *             and 1.0 defining full color.
+     */
+    setColorSaturation: function(saturation) {
+        this._colorSaturation = saturation;
+        if (this._magShaderEffects)
+            this._magShaderEffects.setColorSaturation(this._colorSaturation);
+    },
+
+    /**
+     * getColorSaturation:
+     * Retrieve the color saturation of the magnified view.
+     */
+    setColorSaturation: function() {
+        return this._colorSaturation;
+    },
+
+    /**
      * setBrightness:
      * Alter the brightness of the magnified view.
      * @brightness  Object containing the contrast for the red, green,
@@ -1074,6 +1112,7 @@ const ZoomRegion = new Lang.Class({
 
         // Contrast and brightness effects.
         this._magShaderEffects = new MagShaderEffects(this._uiGroupClone);
+        this._magShaderEffects.setColorSaturation(this._colorSaturation);
         this._magShaderEffects.setInvertLightness(this._invertLightness);
         this._magShaderEffects.setBrightness(this._brightness);
         this._magShaderEffects.setContrast(this._contrast);
@@ -1602,6 +1641,7 @@ const MagShaderEffects = new Lang.Class({
     _init: function(uiGroupClone) {
         this._inverse = new Shell.InvertLightnessEffect();
         this._brightnessContrast = new Clutter.BrightnessContrastEffect();
+        this._colorSaturation = new Clutter.DesaturateEffect();
         this._inverse.set_enabled(false);
         this._brightnessContrast.set_enabled(false);
 
@@ -1618,6 +1658,7 @@ const MagShaderEffects = new Lang.Class({
      */
     destroyEffects: function() {
         this._magView.clear_effects();
+        this._colorSaturation = null;
         this._brightnessContrast = null;
         this._inverse = null;
         this._magView = null;
@@ -1641,6 +1682,14 @@ const MagShaderEffects = new Lang.Class({
         return this._inverse.get_enabled();
     },
 
+    setColorSaturation: function(factor) {
+        this._colorSaturation.set_factor(factor);
+    },
+
+    getColorSaturation: function() {
+        return this._colorSaturation.get_factor();
+    },
+
     /**
      * setBrightness:
      * Set the brightness of the magnified view.



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]