/** Decodes a colorizer from a style Rule. */ public static Colorizer decode(Rule rule) { Colorizer.Builder cb = Colorizer.build(); cb.mode( Colorizer.Mode.valueOf( rule.string(null, "raster-colorizer-default-mode", "linear").toUpperCase(Locale.ROOT))); cb.color(rule.color(null, "raster-colorizer-default-color", RGB.black)); if (rule.has("raster-colorizer-stops")) { // TODO: make this routine more robust Mixed m = (Mixed) rule.get("raster-colorizer-stops"); for (Expression expr : m.expressions()) { Function stop = (Function) expr; List<Expression> args = stop.args(); Double value = Convert.toNumber(args.get(0).evaluate(null)).get().doubleValue(); RGB color = RGB.convert(args.get(1).evaluate(null)).get(); if (args.size() > 2) { Mode mode = Mode.valueOf(args.get(2).evaluate(null).toString().toUpperCase(Locale.ROOT)); if (args.size() > 3) { double epsilon = Convert.toNumber(args.get(3).evaluate(null), Double.class).get(); if (epsilon != 0d) { cb.stop(value, color, epsilon); } else { cb.stop(value, color, mode); } } else { cb.stop(value, color, mode); } } else { cb.stop(value, color); } } } return cb.colorizer(); }