mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-16 17:24:23 +00:00
More robust NS hex colour string parsing
Invalid arguments to color-values, such as "#abcdefg" or "#1234", or valid ones like "#111222333", should not yield nonsense values. * src/nsterm.m (ns_get_color): Only accept "#RGB" strings with 1-4 digits per components, equal number of digits each, and no trailing characters. Parse 12-bit colours correctly.
This commit is contained in:
parent
46304c474c
commit
64e25cde32
1 changed files with 12 additions and 9 deletions
21
src/nsterm.m
21
src/nsterm.m
|
|
@ -2399,20 +2399,23 @@ so some key presses (TAB) are swallowed by the system. */
|
|||
scaling = (snprintf (hex, sizeof hex, "%s", name + 4) - 2) / 3;
|
||||
else if (name[0] == '#') /* An old X11 format; convert to newer */
|
||||
{
|
||||
int len = (strlen(name) - 1);
|
||||
int start = (len % 3 == 0) ? 1 : len / 4 + 1;
|
||||
int i;
|
||||
scaling = strlen(name+start) / 3;
|
||||
for (i = 0; i < 3; i++)
|
||||
sprintf (hex + i * (scaling + 1), "%.*s/", scaling,
|
||||
name + start + i * scaling);
|
||||
hex[3 * (scaling + 1) - 1] = '\0';
|
||||
int len = 0;
|
||||
while (isxdigit (name[len + 1]))
|
||||
len++;
|
||||
if (name[len + 1] == '\0' && len >= 1 && len <= 12 && len % 3 == 0)
|
||||
{
|
||||
scaling = len / 3;
|
||||
for (int i = 0; i < 3; i++)
|
||||
sprintf (hex + i * (scaling + 1), "%.*s/", scaling,
|
||||
name + 1 + i * scaling);
|
||||
hex[3 * (scaling + 1) - 1] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
if (hex[0])
|
||||
{
|
||||
unsigned int rr, gg, bb;
|
||||
float fscale = scaling == 4 ? 65535.0 : (scaling == 2 ? 255.0 : 15.0);
|
||||
float fscale = (1 << (scaling * 4)) - 1;
|
||||
if (sscanf (hex, "%x/%x/%x", &rr, &gg, &bb))
|
||||
{
|
||||
r = rr / fscale;
|
||||
|
|
|
|||
Loading…
Reference in a new issue