mirror of
https://github.com/zoriya/react-native-svg.git
synced 2026-05-26 12:29:10 +00:00
Simplify color parsing
This commit is contained in:
+107
-118
@@ -265,143 +265,142 @@ function hwbFromString(string) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const convert = {
|
||||
hsl: function hslToRgb(hsl) {
|
||||
const h = hsl[0] / 360;
|
||||
const s = hsl[1] / 100;
|
||||
const l = hsl[2] / 100;
|
||||
let t1;
|
||||
let t2;
|
||||
let t3;
|
||||
let rgb;
|
||||
let val;
|
||||
function hslToRgb(hsl) {
|
||||
const h = hsl[0] / 360;
|
||||
const s = hsl[1] / 100;
|
||||
const l = hsl[2] / 100;
|
||||
let t1;
|
||||
let t2;
|
||||
let t3;
|
||||
let rgb;
|
||||
let val;
|
||||
|
||||
if (s === 0) {
|
||||
val = l * 255;
|
||||
return [val, val, val];
|
||||
if (s === 0) {
|
||||
val = l * 255;
|
||||
return [val, val, val];
|
||||
}
|
||||
|
||||
if (l < 0.5) {
|
||||
t2 = l * (1 + s);
|
||||
} else {
|
||||
t2 = l + s - l * s;
|
||||
}
|
||||
|
||||
t1 = 2 * l - t2;
|
||||
|
||||
rgb = [0, 0, 0];
|
||||
for (let i = 0; i < 3; i++) {
|
||||
t3 = h + (1 / 3) * -(i - 1);
|
||||
if (t3 < 0) {
|
||||
t3++;
|
||||
}
|
||||
if (t3 > 1) {
|
||||
t3--;
|
||||
}
|
||||
|
||||
if (l < 0.5) {
|
||||
t2 = l * (1 + s);
|
||||
if (6 * t3 < 1) {
|
||||
val = t1 + (t2 - t1) * 6 * t3;
|
||||
} else if (2 * t3 < 1) {
|
||||
val = t2;
|
||||
} else if (3 * t3 < 2) {
|
||||
val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
|
||||
} else {
|
||||
t2 = l + s - l * s;
|
||||
val = t1;
|
||||
}
|
||||
|
||||
t1 = 2 * l - t2;
|
||||
rgb[i] = val * 255;
|
||||
}
|
||||
|
||||
rgb = [0, 0, 0];
|
||||
for (let i = 0; i < 3; i++) {
|
||||
t3 = h + (1 / 3) * -(i - 1);
|
||||
if (t3 < 0) {
|
||||
t3++;
|
||||
}
|
||||
if (t3 > 1) {
|
||||
t3--;
|
||||
}
|
||||
return rgb;
|
||||
}
|
||||
|
||||
if (6 * t3 < 1) {
|
||||
val = t1 + (t2 - t1) * 6 * t3;
|
||||
} else if (2 * t3 < 1) {
|
||||
val = t2;
|
||||
} else if (3 * t3 < 2) {
|
||||
val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
|
||||
} else {
|
||||
val = t1;
|
||||
}
|
||||
function hwbToRgb(hwb) {
|
||||
const h = hwb[0] / 360;
|
||||
let wh = hwb[1] / 100;
|
||||
let bl = hwb[2] / 100;
|
||||
const ratio = wh + bl;
|
||||
let i;
|
||||
let v;
|
||||
let f;
|
||||
let n;
|
||||
|
||||
rgb[i] = val * 255;
|
||||
}
|
||||
// wh + bl cant be > 1
|
||||
if (ratio > 1) {
|
||||
wh /= ratio;
|
||||
bl /= ratio;
|
||||
}
|
||||
|
||||
return rgb;
|
||||
},
|
||||
hwb: function hwbToRgb(hwb) {
|
||||
const h = hwb[0] / 360;
|
||||
let wh = hwb[1] / 100;
|
||||
let bl = hwb[2] / 100;
|
||||
const ratio = wh + bl;
|
||||
let i;
|
||||
let v;
|
||||
let f;
|
||||
let n;
|
||||
i = Math.floor(6 * h);
|
||||
v = 1 - bl;
|
||||
f = 6 * h - i;
|
||||
|
||||
// wh + bl cant be > 1
|
||||
if (ratio > 1) {
|
||||
wh /= ratio;
|
||||
bl /= ratio;
|
||||
}
|
||||
if ((i & 0x01) !== 0) {
|
||||
f = 1 - f;
|
||||
}
|
||||
|
||||
i = Math.floor(6 * h);
|
||||
v = 1 - bl;
|
||||
f = 6 * h - i;
|
||||
n = wh + f * (v - wh); // linear interpolation
|
||||
|
||||
if ((i & 0x01) !== 0) {
|
||||
f = 1 - f;
|
||||
}
|
||||
let r;
|
||||
let g;
|
||||
let b;
|
||||
switch (i) {
|
||||
default:
|
||||
case 6:
|
||||
case 0:
|
||||
r = v;
|
||||
g = n;
|
||||
b = wh;
|
||||
break;
|
||||
case 1:
|
||||
r = n;
|
||||
g = v;
|
||||
b = wh;
|
||||
break;
|
||||
case 2:
|
||||
r = wh;
|
||||
g = v;
|
||||
b = n;
|
||||
break;
|
||||
case 3:
|
||||
r = wh;
|
||||
g = n;
|
||||
b = v;
|
||||
break;
|
||||
case 4:
|
||||
r = n;
|
||||
g = wh;
|
||||
b = v;
|
||||
break;
|
||||
case 5:
|
||||
r = v;
|
||||
g = wh;
|
||||
b = n;
|
||||
break;
|
||||
}
|
||||
|
||||
n = wh + f * (v - wh); // linear interpolation
|
||||
return [r * 255, g * 255, b * 255];
|
||||
}
|
||||
|
||||
let r;
|
||||
let g;
|
||||
let b;
|
||||
switch (i) {
|
||||
default:
|
||||
case 6:
|
||||
case 0:
|
||||
r = v;
|
||||
g = n;
|
||||
b = wh;
|
||||
break;
|
||||
case 1:
|
||||
r = n;
|
||||
g = v;
|
||||
b = wh;
|
||||
break;
|
||||
case 2:
|
||||
r = wh;
|
||||
g = v;
|
||||
b = n;
|
||||
break;
|
||||
case 3:
|
||||
r = wh;
|
||||
g = n;
|
||||
b = v;
|
||||
break;
|
||||
case 4:
|
||||
r = n;
|
||||
g = wh;
|
||||
b = v;
|
||||
break;
|
||||
case 5:
|
||||
r = v;
|
||||
g = wh;
|
||||
b = n;
|
||||
break;
|
||||
}
|
||||
|
||||
return [r * 255, g * 255, b * 255];
|
||||
},
|
||||
};
|
||||
|
||||
function colorFromString(string) {
|
||||
export default function extractColor(string) {
|
||||
if (!string || typeof string !== 'string') {
|
||||
return null;
|
||||
}
|
||||
|
||||
const prefix = string.substring(0, 3).toLowerCase();
|
||||
|
||||
let value;
|
||||
let model;
|
||||
let converter;
|
||||
switch (prefix) {
|
||||
case 'hsl':
|
||||
value = hslFromString(string);
|
||||
model = 'hsl';
|
||||
converter = hslToRgb;
|
||||
break;
|
||||
case 'hwb':
|
||||
value = hwbFromString(string);
|
||||
model = 'hwb';
|
||||
converter = hwbToRgb;
|
||||
break;
|
||||
default:
|
||||
value = rgbFromString(string);
|
||||
model = 'rgb';
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -409,15 +408,5 @@ function colorFromString(string) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return [model, value];
|
||||
}
|
||||
|
||||
export default function extractColor(color) {
|
||||
const result = colorFromString(color);
|
||||
if (!result) {
|
||||
return null;
|
||||
}
|
||||
const model = result[0];
|
||||
const value = result[1];
|
||||
return model === 'rgb' ? value : convert[model](value).concat(value[3]);
|
||||
return converter ? converter(value).concat(value[3]) : value;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user