mirror of
https://github.com/revanced/ARSCLib.git
synced 2025-05-22 19:08:58 +02:00
fix color encoding
This commit is contained in:
parent
58f75481c2
commit
eac14028fd
@ -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})$");
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user