summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFridrich Štrba <fridrich.strba@bluewin.ch>2020-02-06 22:36:35 +0100
committerFridrich Štrba <fridrich.strba@bluewin.ch>2020-02-06 22:36:35 +0100
commit2bdf2a9d5d2ef15c3af1434803d9b58b0bfa0a29 (patch)
treea60283451e1d5ab511ff0e72c97f3a252fe86049
parentace7b9c22c91c9f3b89af5f09dd25e5ac1254bb3 (diff)
Some more work on parsing CDRx6+ character colours
Change-Id: Ia80c4efe9b6c3282a9ee92d9b75c9c16e1bfdc50
-rw-r--r--src/lib/CDRCollector.cpp10
-rw-r--r--src/lib/CDRParser.cpp50
2 files changed, 46 insertions, 14 deletions
diff --git a/src/lib/CDRCollector.cpp b/src/lib/CDRCollector.cpp
index 0119a54..3f204d0 100644
--- a/src/lib/CDRCollector.cpp
+++ b/src/lib/CDRCollector.cpp
@@ -337,7 +337,6 @@ unsigned libcdr::CDRParserState::_getRGBColor(const CDRColor &color)
case 0x01:
case 0x02:
case 0x15:
- case 0x14:
{
double cmyk[4] =
{
@@ -567,6 +566,15 @@ unsigned libcdr::CDRParserState::_getRGBColor(const CDRColor &color)
blue = rgb[2];
break;
}
+ // Registration colour
+ case 0x14:
+ {
+ red = (unsigned char)cdr_round(255.0 * col0 / 100.0);
+ green = (unsigned char)cdr_round(255.0 * col0 / 100.0);
+ blue = (unsigned char)cdr_round(255.0 * col0 / 100.0);
+ break;
+ }
+
default:
break;
}
diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index e27357d..1cac4d5 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -117,16 +117,23 @@ static int parseColourString(const char *colourString, libcdr::CDRColor &colour,
("CMYK", 2)
("CMYK255", 3)
("RGB255", 5)
+ ("HSB", 6)
+ ("HLS", 7)
+ ("GRAY255", 9)
+ ("YIQ255", 11)
+ ("LAB255", 18)
+ ("REGCOLOR", 20)
+ ("SPOT", 25)
;
auto it = colourString;
const auto end = it + std::strlen(it);
bRes = phrase_parse(it, end,
// Begin grammar
(
- (cmodel | omit[+alnum]) >> -lit(',')
- >> omit[+alnum] >> -lit(',')
- >> *(uint_ >> -lit(','))
- >> (repeat(8)[alnum] >> '-' >> repeat(3)[repeat(4)[alnum] >> '-'] >> repeat(12)[alnum])
+ (cmodel | omit[+alnum]) >> lit(',')
+ >> omit[+alnum] >> lit(',')
+ >> *(uint_ >> lit(','))
+ >> (repeat(8)[xdigit] >> '-' >> repeat(3)[repeat(4)[xdigit] >> '-'] >> repeat(12)[xdigit])
),
// End grammar
space,
@@ -134,8 +141,8 @@ static int parseColourString(const char *colourString, libcdr::CDRColor &colour,
&& it == end;
}
- if (bRes)
- return -1;
+ // if (bRes)
+ // return -1;
if (colourModel)
colour.m_colorModel = get(colourModel);
@@ -144,17 +151,34 @@ static int parseColourString(const char *colourString, libcdr::CDRColor &colour,
{
colour.m_colorValue = val[0] | (val[1] << 8) | (val[2] << 16) | (val[3] << 24);
opacity = (double)val[4] / 100.0;
- return 1;
}
-
- if (val.size() >= 4)
+ else if (val.size() >= 4)
{
- colour.m_colorValue = val[0] | (val[1] << 8) | (val[2] << 16);
+ if (colour.m_colorModel == 5)
+ colour.m_colorValue = val[2] | (val[1] << 8) | (val[0] << 16);
+ else if (colour.m_colorModel == 6 || colour.m_colorModel == 7)
+ colour.m_colorValue = val[0] | (val[1] << 16) | (val[2] << 24);
+ else
+ colour.m_colorValue = val[0] | (val[1] << 8) | (val[2] << 16);
opacity = (double)val[3] / 100.0;
- return 1;
}
-
- return 0;
+ else if (val.size() >= 2)
+ {
+ colour.m_colorValue = val[0];
+ opacity = (double)val[1] / 100.0;
+ }
+ else if (val.size() >= 1)
+ {
+ colour.m_colorValue = val[0];
+ opacity = 1.0;
+ }
+ else
+ {
+ CDR_DEBUG_MSG(("parseColourString --> bRes %i, size %lu, colorModel %u, colorValue 0x%.8x\n", bRes, val.size(), colour.m_colorModel, colour.m_colorValue));
+ return 0;
+ }
+ CDR_DEBUG_MSG(("parseColourString --> bRes %i, size %lu, colorModel %u, colorValue 0x%.8x\n", bRes, val.size(), colour.m_colorModel, colour.m_colorValue));
+ return 1;
}
void normalizeAngle(double &angle)