summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFridrich Štrba <fridrich.strba@bluewin.ch>2020-02-04 11:49:57 +0100
committerFridrich Štrba <fridrich.strba@bluewin.ch>2020-02-04 11:49:57 +0100
commit4923f95bde2c07f33b645a298238cb79f615a016 (patch)
treed5418c4e14ca13d53cced14a1429eaa44fd410bd
parent6ec73cd4131fbb4bc6a5e4b3401cea19d5fa406b (diff)
Extend colour string parsing to RBG255 model
Change-Id: I935d553727aef0e9ee21bac254c6fdc24349c93f
-rw-r--r--src/lib/CDRParser.cpp42
1 files changed, 32 insertions, 10 deletions
diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index 40b9b68..bd3d1bb 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -108,7 +108,7 @@ static int parseColourString(const char *colourString, libcdr::CDRColor &colour,
bool bRes = false;
boost::optional<unsigned> colourModel;
- unsigned val0, val1, val2, val3, val4;
+ std::vector<unsigned> val;
if (colourString)
{
@@ -116,6 +116,7 @@ static int parseColourString(const char *colourString, libcdr::CDRColor &colour,
cmodel.add
("CMYK", 2)
("CMYK255", 3)
+ ("RGB255", 5)
;
auto it = colourString;
const auto end = it + std::strlen(it);
@@ -124,27 +125,48 @@ static int parseColourString(const char *colourString, libcdr::CDRColor &colour,
(
(cmodel | omit[+alnum]) >> -lit(',')
>> omit[+alnum] >> -lit(',')
- >> uint_ >> -lit(',')
- >> uint_ >> -lit(',')
- >> uint_ >> -lit(',')
- >> uint_ >> -lit(',')
- >> uint_ >> -lit(',')
+ >> *(uint_ >> -lit(','))
>> (repeat(8)[alnum] >> '-' >> repeat(3)[repeat(4)[alnum] >> '-'] >> repeat(12)[alnum])
),
// End grammar
space,
- colourModel, val0, val1, val2, val3, val4)
+ colourModel, val)
&& it == end;
}
- if (!bRes)
+ if (bRes)
return -1;
if (colourModel)
colour.m_colorModel = get(colourModel);
- colour.m_colorValue = val0 | (val1 << 8) | (val2 << 16) | (val3 << 24);
- opacity = (double)val4 / 100.0;
+ switch (colour.m_colorModel)
+ {
+ case 5:
+ if (val.size() >= 4)
+ {
+ colour.m_colorValue = val[0] | (val[1] << 8) | (val[2] << 16);
+ opacity = (double)val[3] / 100.0;
+ break;
+ }
+ else
+ {
+ CDR_DEBUG_MSG(("parseColourString error: not enough values read: %lu\n", val.size()));
+ return 0;
+ }
+ default:
+ if (val.size() >= 5)
+ {
+ colour.m_colorValue = val[0] | (val[1] << 8) | (val[2] << 16) | (val[3] << 24);
+ opacity = (double)val[4] / 100.0;
+ break;
+ }
+ else
+ {
+ CDR_DEBUG_MSG(("parseColourString error: not enough values read: %lu\n", val.size()));
+ return 0;
+ }
+ }
return 1;
}