diff options
author | Michele Calgaro <[email protected]> | 2021-05-16 14:17:27 +0900 |
---|---|---|
committer | Michele Calgaro <[email protected]> | 2021-05-16 15:42:05 +0900 |
commit | c5cd19261759ce3257c79599197152199f3ab745 (patch) | |
tree | 20b99d79241c22eba571872cc547def480033cdd | |
parent | c4d1f63aa5ee0ac12716fd1848d10d59ce7b1223 (diff) | |
download | tdelibs-c5cd19261759ce3257c79599197152199f3ab745.tar.gz tdelibs-c5cd19261759ce3257c79599197152199f3ab745.zip |
Fixed handling of arcs in non conforming svg files.
This resolves issue TDE/tde#46.
Signed-off-by: Michele Calgaro <[email protected]>
(cherry picked from commit 35d3a3c50440b34f0fcc6ed56c630f74de41c32a)
-rw-r--r-- | tdecore/svgicons/ksvgiconpainter.cpp | 78 |
1 files changed, 48 insertions, 30 deletions
diff --git a/tdecore/svgicons/ksvgiconpainter.cpp b/tdecore/svgicons/ksvgiconpainter.cpp index 122c8432d..e0e2a2ce9 100644 --- a/tdecore/svgicons/ksvgiconpainter.cpp +++ b/tdecore/svgicons/ksvgiconpainter.cpp @@ -1743,17 +1743,34 @@ void KSVGIconPainter::drawPath(const TQString &data, bool filled) double curx = 0.0, cury = 0.0, contrlx = 0.0, contrly = 0.0, xc, yc; unsigned int lastCommand = 0; - TQString _d = value.replace(",", " "); - _d = _d.simplifyWhiteSpace(); - const char *ptr = _d.latin1(); - const char *end = _d.latin1() + _d.length() + 1; + TQCString _d = value.replace(",", " ").simplifyWhiteSpace().latin1(); + const char *ptr = _d.data(); + const char *end = _d.data() + _d.length(); double tox, toy, x1, y1, x2, y2, rx, ry, angle; bool largeArc, sweep; - char command = *(ptr++); + char command = *ptr; while(ptr < end) { + + if(*ptr == '+' || *ptr == '-' || *ptr == '.' || (*ptr >= '0' && *ptr <= '9')) + { + // there are still coords in this command + if(command == 'M') + { + command = 'L'; + } + else if(command == 'm') + { + command = 'l'; + } + } + else + { + command = *(ptr++); + } + if(*ptr == ' ') ptr++; @@ -2179,10 +2196,19 @@ void KSVGIconPainter::drawPath(const TQString &data, bool filled) ptr = getCoord(ptr, rx); ptr = getCoord(ptr, ry); ptr = getCoord(ptr, angle); - ptr = getCoord(ptr, tox); - largeArc = tox == 1; - ptr = getCoord(ptr, tox); - sweep = tox == 1; + // 'largeArc' and 'sweep' are single digit flags. Some non conforming svg files do not + // separate those fields with separators, so we can't use getCoord() here. + // See TDE/tde issue #46 on TGW + largeArc = ((*ptr++) != '0'); + while (*ptr == ' ') + { + ptr++; + } + sweep = ((*ptr++) != '0'); + while (*ptr == ' ') + { + ptr++; + } ptr = getCoord(ptr, tox); ptr = getCoord(ptr, toy); @@ -2198,10 +2224,19 @@ void KSVGIconPainter::drawPath(const TQString &data, bool filled) ptr = getCoord(ptr, rx); ptr = getCoord(ptr, ry); ptr = getCoord(ptr, angle); - ptr = getCoord(ptr, tox); - largeArc = tox == 1; - ptr = getCoord(ptr, tox); - sweep = tox == 1; + // 'largeArc' and 'sweep' are single digit flags. Some non conforming svg files do not + // separate those fields with separators, so we can't use getCoord() here. + // See TDE/tde issue #46 on TGW + largeArc = ((*ptr++) != '0'); + while (*ptr == ' ') + { + ptr++; + } + sweep = ((*ptr++) != '0'); + while (*ptr == ' ') + { + ptr++; + } ptr = getCoord(ptr, tox); ptr = getCoord(ptr, toy); @@ -2215,23 +2250,6 @@ void KSVGIconPainter::drawPath(const TQString &data, bool filled) break; } - if(*ptr == '+' || *ptr == '-' || *ptr == '.' || (*ptr >= '0' && *ptr <= '9')) - { - // there are still coords in this command - if(command == 'M') - { - command = 'L'; - } - else if(command == 'm') - { - command = 'l'; - } - } - else - { - command = *(ptr++); - } - // Detect reflection points if(lastCommand != 'C' && lastCommand != 'c' && lastCommand != 'S' && lastCommand != 's' && |