44// (c) COPYRIGHT MIT, ERCIM, Keio University, Beihang University 2018.
55// Please first read the full copyright statement in file COPYRIGHT.html
66//
7- package org .w3c .css .values ;
7+ package org .w3c .css .values . color ;
88
9- import org .w3c .css .properties .css3 .CssColor ;
109import org .w3c .css .util .ApplContext ;
10+ import org .w3c .css .util .CssVersion ;
1111import org .w3c .css .util .InvalidParamException ;
12+ import org .w3c .css .values .CssColor ;
13+ import org .w3c .css .values .CssExpression ;
14+ import org .w3c .css .values .CssIdent ;
15+ import org .w3c .css .values .CssOperator ;
16+ import org .w3c .css .values .CssTypes ;
17+ import org .w3c .css .values .CssValue ;
18+ import org .w3c .css .values .CssValueList ;
1219
1320import java .util .ArrayList ;
1421
22+ import static org .w3c .css .values .CssOperator .COMMA ;
23+ import static org .w3c .css .values .CssOperator .SPACE ;
24+
1525public class ColorMix {
1626 public final static CssIdent in = CssIdent .getIdent ("in" );
1727 public final static CssIdent hue = CssIdent .getIdent ("hue" );
@@ -60,6 +70,54 @@ public static final CssIdent getAllowedValue(CssIdent ident, CssIdent[] allowedV
6070 public ColorMix () {
6171 }
6272
73+ public static ColorMix parseColorMix (ApplContext ac , CssExpression exp , CssColor caller )
74+ throws InvalidParamException {
75+ ColorMix colorMix = new ColorMix ();
76+ ArrayList <CssExpression > expressions = new ArrayList <>(3 );
77+ CssValue val ;
78+ char op ;
79+
80+ if (ac .getCssVersion ().compareTo (CssVersion .CSS3 ) < 0 ) {
81+ StringBuilder sb = new StringBuilder ();
82+ sb .append ("color-mix(" ).append (exp .toStringFromStart ()).append (')' );
83+ throw new InvalidParamException ("notversion" , sb .toString (),
84+ ac .getCssVersionString (), ac );
85+ }
86+
87+ CssExpression e = new CssExpression ();
88+ while (!exp .end ()) {
89+ val = exp .getValue ();
90+ op = exp .getOperator ();
91+ e .addValue (val );
92+ if (op == COMMA ) {
93+ expressions .add (e );
94+ e = new CssExpression ();
95+ } else if (op != SPACE ) {
96+ throw new InvalidParamException ("operator" ,
97+ Character .toString (op ), ac );
98+ }
99+ exp .next ();
100+ }
101+ if (e .getCount () != 0 ) {
102+ expressions .add (e );
103+ }
104+ // now check if the first one is interpolation.
105+ if (expressions .isEmpty ()) {
106+ throw new InvalidParamException ("colorfunc" , exp .toStringFromStart (), "color-mix" , ac );
107+ }
108+
109+ e = expressions .get (0 );
110+ val = e .getValue ();
111+ if (val .getType () == CssTypes .CSS_IDENT && ColorMix .in .equals (val .getIdent ())) {
112+ colorMix .setColorInterpolationMethod (ac , e , caller );
113+ expressions .remove (0 );
114+ }
115+ for (CssExpression colorex : expressions ) {
116+ colorMix .addColorPercentageValue (ac , colorex , caller );
117+ }
118+ return colorMix ;
119+ }
120+
63121 public static CssValue parseColorInterpolationMethod (ApplContext ac , CssExpression exp , CssValue caller )
64122 throws InvalidParamException {
65123 ArrayList <CssValue > values ;
@@ -176,7 +234,7 @@ static public CssValue parseColorPercentageValue(ApplContext ac, CssExpression e
176234 } else {
177235 CssExpression e = new CssExpression ();
178236 e .addValue (val );
179- css3Color = new CssColor (ac , e );
237+ css3Color = new org . w3c . css . properties . css3 . CssColor (ac , e );
180238 values .add (css3Color .getColor ());
181239 }
182240 exp .next ();
@@ -198,7 +256,7 @@ static public CssValue parseColorPercentageValue(ApplContext ac, CssExpression e
198256 }
199257 CssExpression e = new CssExpression ();
200258 e .addValue (val );
201- css3Color = new CssColor (ac , e );
259+ css3Color = new org . w3c . css . properties . css3 . CssColor (ac , e );
202260 values .add (css3Color .getColor ());
203261 }
204262 exp .next ();
0 commit comments