| package com.airbnb.lottie.parser; |
| |
| import android.graphics.Color; |
| |
| import com.airbnb.lottie.parser.moshi.JsonReader; |
| |
| import java.io.IOException; |
| |
| public class ColorParser implements ValueParser<Integer> { |
| public static final ColorParser INSTANCE = new ColorParser(); |
| |
| private ColorParser() { |
| } |
| |
| @Override public Integer parse(JsonReader reader, float scale) throws IOException { |
| boolean isArray = reader.peek() == JsonReader.Token.BEGIN_ARRAY; |
| if (isArray) { |
| reader.beginArray(); |
| } |
| double r = reader.nextDouble(); |
| double g = reader.nextDouble(); |
| double b = reader.nextDouble(); |
| double a = 1; |
| // Sometimes, Lottie editors only export rgb instead of rgba. |
| // https://github.com/airbnb/lottie-android/issues/1601 |
| if (reader.peek() == JsonReader.Token.NUMBER) { |
| a = reader.nextDouble(); |
| } |
| if (isArray) { |
| reader.endArray(); |
| } |
| |
| if (r <= 1 && g <= 1 && b <= 1) { |
| r *= 255; |
| g *= 255; |
| b *= 255; |
| // It appears as if sometimes, Telegram Lottie stickers are exported with rgb [0,1] and a [0,255]. |
| // This shouldn't happen but we can gracefully handle it when it does. |
| // https://github.com/airbnb/lottie-android/issues/1478 |
| if (a <= 1) { |
| a *= 255; |
| } |
| } |
| |
| return Color.argb((int) a, (int) r, (int) g, (int) b); |
| } |
| } |