/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.libraries.css.resolver.function.values;
import org.pentaho.reporting.libraries.css.dom.DocumentContext;
import org.pentaho.reporting.libraries.css.dom.LayoutElement;
import org.pentaho.reporting.libraries.css.resolver.FunctionEvaluationException;
import org.pentaho.reporting.libraries.css.resolver.function.FunctionUtilities;
import org.pentaho.reporting.libraries.css.resolver.function.StyleValueFunction;
import org.pentaho.reporting.libraries.css.util.ColorUtil;
import org.pentaho.reporting.libraries.css.values.CSSColorValue;
import org.pentaho.reporting.libraries.css.values.CSSFunctionValue;
import org.pentaho.reporting.libraries.css.values.CSSNumericType;
import org.pentaho.reporting.libraries.css.values.CSSNumericValue;
import org.pentaho.reporting.libraries.css.values.CSSStringValue;
import org.pentaho.reporting.libraries.css.values.CSSValue;
public class HslValueFunction implements StyleValueFunction {
public HslValueFunction() {
}
protected int validateHueParameter( final CSSValue value ) throws FunctionEvaluationException {
final CSSNumericValue nval;
if ( value instanceof CSSStringValue ) {
// I shouldn't do this, but ..
final CSSStringValue strVal = (CSSStringValue) value;
nval = FunctionUtilities.parseNumberValue( strVal.getValue() );
} else if ( value instanceof CSSNumericValue == false ) {
throw new FunctionEvaluationException( "Expected a number" );
} else {
nval = (CSSNumericValue) value;
}
if ( nval.getType().equals( CSSNumericType.NUMBER ) ) {
return (int) ( nval.getValue() % 360 );
}
throw new FunctionEvaluationException( "Expected a number, not a length" );
}
protected float validateOtherParameter( final CSSValue value ) throws FunctionEvaluationException {
final CSSNumericValue nval;
if ( value instanceof CSSStringValue ) {
// I shouldn't do this, but ..
final CSSStringValue strVal = (CSSStringValue) value;
nval = FunctionUtilities.parseNumberValue( strVal.getValue() );
} else if ( value instanceof CSSNumericValue == false ) {
throw new FunctionEvaluationException( "Expected a number" );
} else {
nval = (CSSNumericValue) value;
}
if ( nval.getType().equals( CSSNumericType.PERCENTAGE ) ) {
return (float) ( nval.getValue() % 100 );
}
throw new FunctionEvaluationException( "Expected a number, not a length" );
}
public boolean isAutoResolveable() {
return true;
}
public CSSValue evaluate( final DocumentContext layoutProcess,
final LayoutElement element,
final CSSFunctionValue function )
throws FunctionEvaluationException {
final CSSValue[] values = function.getParameters();
if ( values.length == 3 ) {
final int hueValue = validateHueParameter
( FunctionUtilities.resolveParameter( layoutProcess, element, values[ 0 ] ) );
final float saturationValue = validateOtherParameter
( FunctionUtilities.resolveParameter( layoutProcess, element, values[ 1 ] ) );
final float lightValue = validateOtherParameter
( FunctionUtilities.resolveParameter( layoutProcess, element, values[ 2 ] ) );
final float[] rgb = ColorUtil.hslToRGB
( hueValue, saturationValue, lightValue );
return new CSSColorValue( rgb[ 0 ], rgb[ 1 ], rgb[ 2 ] );
} else if ( values.length == 4 ) {
final int hueValue = validateHueParameter
( FunctionUtilities.resolveParameter( layoutProcess, element, values[ 0 ] ) );
final float saturationValue = validateOtherParameter
( FunctionUtilities.resolveParameter( layoutProcess, element, values[ 1 ] ) );
final float lightValue = validateOtherParameter
( FunctionUtilities.resolveParameter( layoutProcess, element, values[ 2 ] ) );
final float alphaValue = validateOtherParameter
( FunctionUtilities.resolveParameter( layoutProcess, element, values[ 3 ] ) );
final float[] rgb =
ColorUtil.hslToRGB( hueValue, saturationValue, lightValue );
return new CSSColorValue( rgb[ 0 ], rgb[ 1 ], rgb[ 2 ], alphaValue );
} else {
throw new FunctionEvaluationException( "Expected either three or four parameters." );
}
}
}