Compare commits

...

6 Commits

Author SHA1 Message Date
Mikko Mononen bd16c4e6b2
Merge pull request #222 from 0vercl0k/fbl_fixoob2
Fix OOB in nsvg__parseUrl.
2022-08-10 20:16:49 +03:00
0vercl0k 402437f68a Fix OOB in nsvg__parseUrl. 2022-08-10 09:08:39 -07:00
Mikko Mononen 7e37e00ef4
Merge pull request #220 from fltk/fix-rgb-color-locale
Make nsvg__parseColorRGB() independent of the current locale (#139)
2022-07-09 22:26:40 +03:00
Mikko Mononen ed3c01b809
Merge pull request #219 from fltk/fix-header-guards-eol
Fix newline at end of file, add comments
2022-07-09 22:12:31 +03:00
Albrecht Schlosser d2002eeaf2 Make nsvg__parseColorRGB() independent of the current locale (#139)
This commit fixes the locale dependency (re-)introduced by commit
c3ad36ef81 by using sscanf() to parse
floating point values.

This modification uses nsvg__atof() which is independent of the
current locale.
2022-07-08 19:25:39 +02:00
Albrecht Schlosser c73393fc7a Fix newline at end of file, add comments
Fix "No newline at end of file" warning. The newline was removed
by commit 47f28a2a78, probably unintentionally.

Add missing comments to #endif statements for clarity and consistency.
2022-07-08 17:05:17 +02:00
2 changed files with 56 additions and 13 deletions

View File

@ -1222,15 +1222,58 @@ static unsigned int nsvg__parseColorHex(const char* str)
return NSVG_RGB(128, 128, 128);
}
// Parse rgb color. The pointer 'str' must point at "rgb(" (4+ characters).
// This function returns gray (rgb(128, 128, 128) == '#808080') on parse errors
// for backwards compatibility. Note: other image viewers return black instead.
static unsigned int nsvg__parseColorRGB(const char* str)
{
unsigned int r=0, g=0, b=0;
float rf=0, gf=0, bf=0;
if (sscanf(str, "rgb(%u, %u, %u)", &r, &g, &b) == 3) // decimal integers
return NSVG_RGB(r, g, b);
if (sscanf(str, "rgb(%f%%, %f%%, %f%%)", &rf, &gf, &bf) == 3) // decimal integer percentage
return NSVG_RGB(roundf(rf*2.55f), roundf(gf*2.55f), roundf(bf*2.55f)); // (255 / 100.0f)
return NSVG_RGB(128, 128, 128);
int i;
unsigned int rgbi[3];
float rgbf[3];
// try decimal integers first
if (sscanf(str, "rgb(%u, %u, %u)", &rgbi[0], &rgbi[1], &rgbi[2]) != 3) {
// integers failed, try percent values (float, locale independent)
const char delimiter[3] = {',', ',', ')'};
str += 4; // skip "rgb("
for (i = 0; i < 3; i++) {
while (*str && (nsvg__isspace(*str))) str++; // skip leading spaces
if (*str == '+') str++; // skip '+' (don't allow '-')
if (!*str) break;
rgbf[i] = nsvg__atof(str);
// Note 1: it would be great if nsvg__atof() returned how many
// bytes it consumed but it doesn't. We need to skip the number,
// the '%' character, spaces, and the delimiter ',' or ')'.
// Note 2: The following code does not allow values like "33.%",
// i.e. a decimal point w/o fractional part, but this is consistent
// with other image viewers, e.g. firefox, chrome, eog, gimp.
while (*str && nsvg__isdigit(*str)) str++; // skip integer part
if (*str == '.') {
str++;
if (!nsvg__isdigit(*str)) break; // error: no digit after '.'
while (*str && nsvg__isdigit(*str)) str++; // skip fractional part
}
if (*str == '%') str++; else break;
while (nsvg__isspace(*str)) str++;
if (*str == delimiter[i]) str++;
else break;
}
if (i == 3) {
rgbi[0] = roundf(rgbf[0] * 2.55f);
rgbi[1] = roundf(rgbf[1] * 2.55f);
rgbi[2] = roundf(rgbf[2] * 2.55f);
} else {
rgbi[0] = rgbi[1] = rgbi[2] = 128;
}
}
// clip values as the CSS spec requires
for (i = 0; i < 3; i++) {
if (rgbi[i] > 255) rgbi[i] = 255;
}
return NSVG_RGB(rgbi[0], rgbi[1], rgbi[2]);
}
typedef struct NSVGNamedColor {
@ -1638,9 +1681,9 @@ static void nsvg__parseUrl(char* id, const char* str)
{
int i = 0;
str += 4; // "url(";
if (*str == '#')
if (*str && *str == '#')
str++;
while (i < 63 && *str != ')') {
while (i < 63 && *str && *str != ')') {
id[i] = *str++;
i++;
}
@ -3005,6 +3048,6 @@ void nsvgDelete(NSVGimage* image)
free(image);
}
#endif
#endif // NANOSVG_IMPLEMENTATION
#endif // NANOSVG_H
#endif // NANOSVG_H

View File

@ -1453,6 +1453,6 @@ void nsvgRasterize(NSVGrasterizer* r,
r->stride = 0;
}
#endif
#endif // NANOSVGRAST_IMPLEMENTATION
#endif // NANOSVGRAST_H
#endif // NANOSVGRAST_H