99
1010import org .w3c .css .util .ApplContext ;
1111import org .w3c .css .util .InvalidParamException ;
12- import org .w3c .css .util . Util ;
12+ import org .w3c .css .values . CssCheckableValue ;
1313import org .w3c .css .values .CssExpression ;
1414import org .w3c .css .values .CssNumber ;
15+ import org .w3c .css .values .CssPercentage ;
1516import org .w3c .css .values .CssTypes ;
1617import org .w3c .css .values .CssValue ;
1718
19+ import java .math .BigDecimal ;
20+
1821/**
19- * @spec http ://www.w3.org/TR/2011/REC-css3 -color-20110607/# opacity
22+ * @spec https ://www.w3.org/TR/2016/WD-css -color-4-20160705/#propdef- opacity
2023 */
2124
2225public class CssOpacity extends org .w3c .css .properties .css .CssOpacity {
@@ -42,15 +45,50 @@ public CssOpacity(ApplContext ac, CssExpression expression, boolean check)
4245 switch (val .getType ()) {
4346 case CssTypes .CSS_NUMBER :
4447 if (val .getRawType () == CssTypes .CSS_NUMBER ) {
45- // this will generate a warning if necessary
46- CssNumber number = val .getNumber ();
47- number .setFloatValue (clampedValue (ac , number .getValue ()));
48+ CssCheckableValue v = val .getCheckableValue ();
49+ if (!v .isPositive ()) {
50+ ac .getFrame ().addWarning ("out-of-range" , val .toString ());
51+ CssNumber nb = new CssNumber ();
52+ nb .setIntValue (0 );
53+ value = nb ;
54+ break ;
55+ }
56+ if (val .getRawType () == CssTypes .CSS_NUMBER ) {
57+ BigDecimal pp = ((CssNumber ) val ).getBigDecimalValue ();
58+ if (pp .compareTo (BigDecimal .ONE ) > 0 ) {
59+ ac .getFrame ().addWarning ("out-of-range" , val .toString ());
60+ CssNumber nb = new CssNumber ();
61+ nb .setIntValue (1 );
62+ value = nb ;
63+ break ;
64+ }
65+ }
4866 } else {
4967 // we can only check if >= 0 for now
5068 val .getCheckableValue ().warnPositiveness (ac , this );
5169 }
5270 value = val ;
5371 break ;
72+ case CssTypes .CSS_PERCENTAGE :
73+ // This starts with CSS Color 4
74+ CssCheckableValue v = val .getCheckableValue ();
75+ if (!v .isPositive ()) {
76+ ac .getFrame ().addWarning ("out-of-range" , val .toString ());
77+ CssNumber nb = new CssNumber ();
78+ nb .setIntValue (0 );
79+ value = nb ;
80+ break ;
81+ }
82+ if (val .getRawType () == CssTypes .CSS_PERCENTAGE ) {
83+ float p = ((CssPercentage ) val ).floatValue ();
84+ if (p > 100. ) {
85+ ac .getFrame ().addWarning ("out-of-range" , val .toString ());
86+ value = new CssPercentage (100 );
87+ break ;
88+ }
89+ }
90+ value = val ;
91+ break ;
5492 case CssTypes .CSS_IDENT :
5593 if (inherit .equals (val )) {
5694 value = inherit ;
@@ -69,19 +107,6 @@ public CssOpacity(ApplContext ac, CssExpression expression)
69107 this (ac , expression , false );
70108 }
71109
72- /**
73- * Brings all values back between 0 and 1
74- *
75- * @param opacity The value to be modified if necessary
76- */
77- private float clampedValue (ApplContext ac , float opacity ) {
78- if (opacity < 0.f || opacity > 1.f ) {
79- ac .getFrame ().addWarning ("out-of-range" , Util .displayFloat (opacity ));
80- return ((opacity < 0.f ) ? 0.f : 1.f );
81- }
82- return opacity ;
83- }
84-
85110 /**
86111 * Is the value of this property a default value It is used by all macro for
87112 * the function <code>print</code>
0 commit comments