/*______________ | ______ | U I Z E J A V A S C R I P T F R A M E W O R K | / / | --------------------------------------------------- | / O / | MODULE : Uize.Color.ColorsHslTransformer Class | / / / | | / / / /| | ONLINE : http://uize.com | /____/ /__/_| | COPYRIGHT : (c)2010-2016 UIZE | /___ | LICENSE : Available under MIT License or GNU General Public License |_______________| http://uize.com/license.html */ /* Module Meta Data type: Class importance: 1 codeCompleteness: 100 docCompleteness: 5 */ /*? Introduction The =Uize.Color.ColorsHslTransformer= module implements a class for transforming the hue, saturation, and lightness of a set of colors in a performant manner. *DEVELOPERS:* `Chris van Rensburg` */ /* TODO: - factor out code for getting min color and getting max color (add some method to Uize.Color.xUtil) */ Uize.module ({ name:'Uize.Color.ColorsHslTransformer', superclass:'Uize.Class', required:[ 'Uize.Color', 'Uize.Data.Util' ], builder:function (_superclass) { 'use strict'; var /*** Variables for Scruncher Optimization ***/ _blendValues = Uize.blendValues, _getColumn = Uize.Data.Util.getColumn, _Uize_Color = Uize.Color, _min = Uize.min, _max = Uize.max, /*** General Variables ***/ _workingColor = _Uize_Color ('hsl(0,0,0)') ; function _mixin (_class) { _class.declare ({ stateProperties:{ colors:{ value:[] }, hueRange:{ value:50 }, hueShift:{ value:0 }, saturationRange:{ value:50 }, saturationShift:{ value:0 }, lightnessRange:{ value:50 }, lightnessShift:{ value:0 }, colorsAsTupless:{ derived:{ properties:'colors', derivation:function (_colors) { return Uize.map ( _colors, function (_color) {return _Uize_Color.from (_color).setEncoding ('HSL array').tuple} ); } } }, colorsMaxMin:{ derived:{ properties:'colorsAsTupless', derivation:function (_colorsAsTuples) { var _tuplesComponent0 = _getColumn (_colorsAsTuples,0), _tuplesComponent1 = _getColumn (_colorsAsTuples,1), _tuplesComponent2 = _getColumn (_colorsAsTuples,2) ; return { _component0Min:_min (_tuplesComponent0), _component0Max:_max (_tuplesComponent0), _component1Min:_min (_tuplesComponent1), _component1Max:_max (_tuplesComponent1), _component2Min:_min (_tuplesComponent2), _component2Max:_max (_tuplesComponent2) }; } } }, transformedColors:{ derived:{ properties:[ 'colorsAsTupless', 'colorsMaxMin', 'hueRange', 'hueShift', 'saturationRange', 'saturationShift', 'lightnessRange', 'lightnessShift' ], derivation:function ( _colorsAsTuples, _colorsMaxMin, _hueRange, _hueShift, _saturationRange, _saturationShift, _lightnessRange, _lightnessShift ) { function _transformComponent ( _value,_minValue,_maxValue,_componentMin,_componentMax,_range,_shift,_shiftMode ) { if (_range != 50) _value = _range > 50 ? _blendValues ( _value, _blendValues ( _componentMin, _componentMax, (_value - _minValue) / (_maxValue - _minValue || 1) ), (_range - 50) / 50 ) : _blendValues ((_minValue + _maxValue) / 2,_value,_range / 50) ; if (_shift) _value = _shiftMode == 'wrap' ? (((_value + _shift) % _componentMax) + _componentMax) % _componentMax : Uize.constrain (_value + _shift,_componentMin,_componentMax) ; return _value; } return Uize.map ( _colorsAsTuples, function (_colorAsTuple) { _Uize_Color.setTuple ( _workingColor.tuple, _transformComponent ( _colorAsTuple [0], _colorsMaxMin._component0Min,_colorsMaxMin._component0Max, 0,360, _hueRange,_hueShift, 'wrap' ), _transformComponent ( _colorAsTuple [1], _colorsMaxMin._component1Min,_colorsMaxMin._component1Max, 0,100, _saturationRange,_saturationShift ), _transformComponent ( _colorAsTuple [2], _colorsMaxMin._component2Min,_colorsMaxMin._component2Max, 0,100, _lightnessRange,_lightnessShift ) ); return _workingColor.to ('hex'); } ); } } } } }); } return _superclass.subclass ({ mixins:_mixin, staticMethods:{ mixin:_mixin } }); } });