fix color encoding

This commit is contained in:
REAndroid 2023-05-05 17:34:49 +02:00
parent 58f75481c2
commit eac14028fd

View File

@ -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})$");
}