@@ -28,10 +28,13 @@ public final int getType() {
2828 }
2929
3030 Object color = null ;
31+ // FIXME TODO, replace with one color type + one type for converted color for comparison
3132 RGB rgb = null ;
3233 RGBA rgba = null ;
3334 HSL hsl = null ;
3435 HWB hwb = null ;
36+ LAB lab = null ;
37+ LCH lch = null ;
3538
3639 /**
3740 * Create a new CssColor.
@@ -755,7 +758,7 @@ public void setHWBColor(CssExpression exp, ApplContext ac)
755758 CssValue val = exp .getValue ();
756759 char op = exp .getOperator ();
757760 // H
758- if (val == null || op != COMMA ) {
761+ if (val == null || op != SPACE ) {
759762 throw new InvalidParamException ("invalid-color" , ac );
760763 }
761764 switch (val .getType ()) {
@@ -771,7 +774,7 @@ public void setHWBColor(CssExpression exp, ApplContext ac)
771774 exp .next ();
772775 val = exp .getValue ();
773776 op = exp .getOperator ();
774- if (val == null || op != COMMA ) {
777+ if (val == null || op != SPACE ) {
775778 exp .starts ();
776779 throw new InvalidParamException ("invalid-color" , ac );
777780 }
@@ -786,7 +789,7 @@ public void setHWBColor(CssExpression exp, ApplContext ac)
786789 exp .next ();
787790 val = exp .getValue ();
788791 op = exp .getOperator ();
789- if (val == null || (op != COMMA && exp .getRemainingCount () > 1 )) {
792+ if (val == null || (op != SPACE && exp .getRemainingCount () > 1 )) {
790793 exp .starts ();
791794 throw new InvalidParamException ("invalid-color" , ac );
792795 }
@@ -820,5 +823,165 @@ public void setHWBColor(CssExpression exp, ApplContext ac)
820823 }
821824 }
822825
826+
827+ public void setLABColor (CssExpression exp , ApplContext ac )
828+ throws InvalidParamException {
829+ // HWB defined in CSSColor Level 4 and onward, currently used in the CSS level
830+ if (ac .getCssVersion ().compareTo (CssVersion .CSS3 ) < 0 ) {
831+ StringBuilder sb = new StringBuilder ();
832+ sb .append ("lab(" ).append (exp .toStringFromStart ()).append (')' );
833+ throw new InvalidParamException ("notversion" , sb .toString (),
834+ ac .getCssVersionString (), ac );
835+ }
836+
837+ color = null ;
838+ lab = new LAB ();
839+ CssValue val = exp .getValue ();
840+ char op = exp .getOperator ();
841+ // L
842+ if (val == null || op != SPACE ) {
843+ throw new InvalidParamException ("invalid-color" , ac );
844+ }
845+ switch (val .getType ()) {
846+ case CssTypes .CSS_NUMBER :
847+ lab .setL (ac , val );
848+ break ;
849+ default :
850+ throw new InvalidParamException ("rgb" , val , ac ); // FIXME lab
851+ }
852+
853+ // A
854+ exp .next ();
855+ val = exp .getValue ();
856+ op = exp .getOperator ();
857+ if (val == null || op != SPACE ) {
858+ exp .starts ();
859+ throw new InvalidParamException ("invalid-color" , ac );
860+ }
861+ if (val .getType () == CssTypes .CSS_NUMBER ) {
862+ lab .setA (ac , val );
863+ } else {
864+ exp .starts ();
865+ throw new InvalidParamException ("rgb" , val , ac ); // FIXME lab
866+ }
867+
868+ // B
869+ exp .next ();
870+ val = exp .getValue ();
871+ op = exp .getOperator ();
872+ if (val == null || (op != SPACE && exp .getRemainingCount () > 1 )) {
873+ exp .starts ();
874+ throw new InvalidParamException ("invalid-color" , ac );
875+ }
876+ if (val .getType () == CssTypes .CSS_NUMBER ) {
877+ lab .setB (ac , val );
878+ } else {
879+ exp .starts ();
880+ throw new InvalidParamException ("rgb" , val , ac ); // FIXME lab
881+ }
882+ hwb .normalize ();
883+
884+ // Alpha
885+ exp .next ();
886+ val = exp .getValue ();
887+ if (val != null ) {
888+ switch (val .getType ()) {
889+ case CssTypes .CSS_NUMBER :
890+ case CssTypes .CSS_PERCENTAGE :
891+ lab .setAlpha (ac , val );
892+ break ;
893+ default :
894+ exp .starts ();
895+ throw new InvalidParamException ("rgb" , val , ac ); // FIXME lab
896+ }
897+ }
898+ // extra values?
899+ exp .next ();
900+ if (exp .getValue () != null ) {
901+ exp .starts ();
902+ throw new InvalidParamException ("rgb" , exp .getValue (), ac );
903+ }
904+ }
905+
906+
907+ public void setlchColor (CssExpression exp , ApplContext ac )
908+ throws InvalidParamException {
909+ // HWB defined in CSSColor Level 4 and onward, currently used in the CSS level
910+ if (ac .getCssVersion ().compareTo (CssVersion .CSS3 ) < 0 ) {
911+ StringBuilder sb = new StringBuilder ();
912+ sb .append ("lch(" ).append (exp .toStringFromStart ()).append (')' );
913+ throw new InvalidParamException ("notversion" , sb .toString (),
914+ ac .getCssVersionString (), ac );
915+ }
916+
917+ color = null ;
918+ lch = new LCH ();
919+ CssValue val = exp .getValue ();
920+ char op = exp .getOperator ();
921+ // L
922+ if (val == null || op != SPACE ) {
923+ throw new InvalidParamException ("invalid-color" , ac );
924+ }
925+ switch (val .getType ()) {
926+ case CssTypes .CSS_NUMBER :
927+ lch .setL (ac , val );
928+ break ;
929+ default :
930+ throw new InvalidParamException ("rgb" , val , ac ); // FIXME lch
931+ }
932+
933+ // A
934+ exp .next ();
935+ val = exp .getValue ();
936+ op = exp .getOperator ();
937+ if (val == null || op != SPACE ) {
938+ exp .starts ();
939+ throw new InvalidParamException ("invalid-color" , ac );
940+ }
941+ if (val .getType () == CssTypes .CSS_NUMBER ) {
942+ lch .setC (ac , val );
943+ } else {
944+ exp .starts ();
945+ throw new InvalidParamException ("rgb" , val , ac ); // FIXME lch
946+ }
947+
948+ // B
949+ exp .next ();
950+ val = exp .getValue ();
951+ op = exp .getOperator ();
952+ if (val == null || (op != SPACE && exp .getRemainingCount () > 1 )) {
953+ exp .starts ();
954+ throw new InvalidParamException ("invalid-color" , ac );
955+ }
956+ if (val .getType () == CssTypes .CSS_NUMBER ) {
957+ lch .setH (ac , val );
958+ } else {
959+ exp .starts ();
960+ throw new InvalidParamException ("rgb" , val , ac ); // FIXME lch
961+ }
962+ hwb .normalize ();
963+
964+ // Alpha
965+ exp .next ();
966+ val = exp .getValue ();
967+ if (val != null ) {
968+ switch (val .getType ()) {
969+ case CssTypes .CSS_NUMBER :
970+ case CssTypes .CSS_PERCENTAGE :
971+ lch .setAlpha (ac , val );
972+ break ;
973+ default :
974+ exp .starts ();
975+ throw new InvalidParamException ("rgb" , val , ac ); // FIXME lch
976+ }
977+ }
978+ // extra values?
979+ exp .next ();
980+ if (exp .getValue () != null ) {
981+ exp .starts ();
982+ throw new InvalidParamException ("rgb" , exp .getValue (), ac );
983+ }
984+ }
985+
823986}
824987
0 commit comments