diff --git a/src/main/java/com/reandroid/arsc/decoder/ColorUtil.java b/src/main/java/com/reandroid/arsc/decoder/ColorUtil.java index 311fd7d..a4ca742 100644 --- a/src/main/java/com/reandroid/arsc/decoder/ColorUtil.java +++ b/src/main/java/com/reandroid/arsc/decoder/ColorUtil.java @@ -18,9 +18,6 @@ package com.reandroid.arsc.decoder; import com.reandroid.arsc.util.HexUtil; import com.reandroid.arsc.value.ValueType; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - public class ColorUtil { public static String decode(ValueType valueType, int data){ @@ -48,68 +45,84 @@ public class ColorUtil { return "#" + hex.substring(index); } public static ValueDecoder.EncodeResult encode(String hexColor){ - if(hexColor == null){ + int[] values = hexToIntegers(hexColor); + if(values == null){ return null; } - hexColor = hexColor.toUpperCase(); - Matcher matcher = PATTERN_COLOR.matcher(hexColor); - if(!matcher.matches()){ - return null; - } - char[] s = hexColor.toCharArray(); - int len = s.length; ValueType valueType; int color = 0; + int len = values.length; if (len == 4) { valueType = ValueType.INT_COLOR_RGB4; - color |= 0xFF0000; - color |= get_hex(s[1]) << 20; - color |= get_hex(s[1]) << 16; - color |= get_hex(s[2]) << 12; - color |= get_hex(s[2]) << 8; - color |= get_hex(s[3]) << 4; - color |= get_hex(s[3]); + color |= 0xFF000000; + color |= values[1] << 20; + color |= values[1] << 16; + color |= values[2] << 12; + color |= values[2] << 8; + color |= values[3] << 4; + color |= values[3]; } else if (len == 5) { valueType = ValueType.INT_COLOR_ARGB4; - color |= 0xFFFF0000; - color |= get_hex(s[1]) << 28; - color |= get_hex(s[1]) << 24; - color |= get_hex(s[2]) << 20; - color |= get_hex(s[2]) << 16; - color |= get_hex(s[3]) << 12; - color |= get_hex(s[3]) << 8; - color |= get_hex(s[4]) << 4; - color |= get_hex(s[4]); + color |= values[1] << 28; + color |= values[1] << 24; + color |= values[2] << 20; + color |= values[2] << 16; + color |= values[3] << 12; + color |= values[3] << 8; + color |= values[4] << 4; + color |= values[4]; } else if (len == 7) { valueType = ValueType.INT_COLOR_RGB8; color |= 0xFF000000; - color |= get_hex(s[1]) << 20; - color |= get_hex(s[2]) << 16; - color |= get_hex(s[3]) << 12; - color |= get_hex(s[4]) << 8; - color |= get_hex(s[5]) << 4; - color |= get_hex(s[6]); + color |= values[1] << 20; + color |= values[2] << 16; + color |= values[3] << 12; + color |= values[4] << 8; + color |= values[5] << 4; + color |= values[6]; } else if (len == 9) { valueType = ValueType.INT_COLOR_ARGB8; - color |= get_hex(s[1]) << 28; - color |= get_hex(s[2]) << 24; - color |= get_hex(s[3]) << 20; - color |= get_hex(s[4]) << 16; - color |= get_hex(s[5]) << 12; - color |= get_hex(s[6]) << 8; - color |= get_hex(s[7]) << 4; - color |= get_hex(s[8]); + color |= values[1] << 28; + color |= values[2] << 24; + color |= values[3] << 20; + color |= values[4] << 16; + color |= values[5] << 12; + color |= values[6] << 8; + color |= values[7] << 4; + color |= values[8]; }else { return null; } return new ValueDecoder.EncodeResult(valueType, color); } - private static int get_hex(char ch){ - if(ch <= '9'){ - return ch - '0'; + private static int[] hexToIntegers(String hexColor){ + if(hexColor == null){ + return null; } - return 10 + (ch - 'A'); + int length = hexColor.length(); + if(length < 4 || length > 9){ + return null; + } + hexColor = hexColor.toUpperCase(); + char[] chars = hexColor.toCharArray(); + if(chars[0] != '#'){ + return null; + } + length = chars.length; + int[] result = new int[length]; + for(int i = 1; i < length; i++){ + int ch = chars[i]; + int value; + if(ch >= '0' && ch <= '9'){ + value = ch - '0'; + }else if(ch >= 'A' && ch <= 'F'){ + value = 10 + (ch - 'A'); + }else { + return null; + } + result[i] = value; + } + return result; } - public static final Pattern PATTERN_COLOR = Pattern.compile("^#([0-9a-fA-F]{3,8})$"); }