src/lib/VSD6Parser.cpp | 44 ++++++++++++++++++++++++++++++++------------ src/lib/VSDParser.cpp | 45 +++++++++++++++++++++++++++++++++------------ src/lib/VSDTypes.h | 12 ++++++++++++ 3 files changed, 77 insertions(+), 24 deletions(-)
New commits: commit 8e8bf14463dc2777c1cea49af1159adede727711 Author: Fridrich Å trba <[email protected]> Date: Tue Dec 18 10:14:24 2012 +0100 When cached fg and bg colours are 0, trust index more diff --git a/src/lib/VSD6Parser.cpp b/src/lib/VSD6Parser.cpp index 335872c..645d569 100644 --- a/src/lib/VSD6Parser.cpp +++ b/src/lib/VSD6Parser.cpp @@ -206,31 +206,51 @@ void libvisio::VSD6Parser::readParaIX(WPXInputStream *input) void libvisio::VSD6Parser::readFillAndShadow(WPXInputStream *input) { - Colour colourFG = _colourFromIndex(readU8(input)); + unsigned char colourFGIndex = readU8(input); + Colour colourFG; colourFG.r = readU8(input); colourFG.g = readU8(input); colourFG.b = readU8(input); colourFG.a = readU8(input); - double fillFGTransparency = (double)colourFG.a / 255.0; - Colour colourBG = _colourFromIndex(readU8(input)); + unsigned char colourBGIndex = readU8(input); + Colour colourBG; colourBG.r = readU8(input); colourBG.g = readU8(input); colourBG.b = readU8(input); colourBG.a = readU8(input); + if (!colourFG && !colourBG) + { + colourFG = _colourFromIndex(colourFGIndex); + colourBG = _colourFromIndex(colourBGIndex); + } + double fillFGTransparency = (double)colourFG.a / 255.0; double fillBGTransparency = (double)colourBG.a / 255.0; + unsigned char fillPattern = readU8(input); - input->seek(1, WPX_SEEK_CUR); - Colour shfgc; // Shadow Foreground Colour - shfgc.r = readU8(input); - shfgc.g = readU8(input); - shfgc.b = readU8(input); - shfgc.a = readU8(input); - input->seek(5, WPX_SEEK_CUR); // Shadow Background Colour skipped + + unsigned char shadowFGIndex = readU8(input); + Colour shadowFG; + shadowFG.r = readU8(input); + shadowFG.g = readU8(input); + shadowFG.b = readU8(input); + shadowFG.a = readU8(input); + unsigned char shadowBGIndex = readU8(input); + Colour shadowBG; + shadowBG.r = readU8(input); + shadowBG.g = readU8(input); + shadowBG.b = readU8(input); + shadowBG.a = readU8(input); + if (!shadowFG && !shadowBG) + { + shadowFG = _colourFromIndex(shadowFGIndex); + shadowBG = _colourFromIndex(shadowBGIndex); + } + unsigned char shadowPattern = readU8(input); if (m_isInStyles) m_collector->collectFillStyle(m_header.level, colourFG, colourBG, fillPattern, - fillFGTransparency, fillBGTransparency, shadowPattern, shfgc); + fillFGTransparency, fillBGTransparency, shadowPattern, shadowFG); else { double shadowOffsetX = 0.0; @@ -247,7 +267,7 @@ void libvisio::VSD6Parser::readFillAndShadow(WPXInputStream *input) shadowOffsetY = m_shadowOffsetY; } m_shape.m_fillStyle.override(VSDOptionalFillStyle(colourFG, colourBG, fillPattern, fillFGTransparency, - fillBGTransparency, shfgc, shadowPattern, shadowOffsetX, shadowOffsetY)); + fillBGTransparency, shadowFG, shadowPattern, shadowOffsetX, shadowOffsetY)); } } diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp index e649c56..bab29b6 100644 --- a/src/lib/VSDParser.cpp +++ b/src/lib/VSDParser.cpp @@ -1668,27 +1668,48 @@ void libvisio::VSDParser::readParaIX(WPXInputStream *input) void libvisio::VSDParser::readFillAndShadow(WPXInputStream *input) { - Colour colourFG = _colourFromIndex(readU8(input)); + unsigned char colourFGIndex = readU8(input); + Colour colourFG; colourFG.r = readU8(input); colourFG.g = readU8(input); colourFG.b = readU8(input); colourFG.a = readU8(input); - double fillFGTransparency = (double)colourFG.a / 255.0; - Colour colourBG = _colourFromIndex(readU8(input)); + unsigned char colourBGIndex = readU8(input); + Colour colourBG; colourBG.r = readU8(input); colourBG.g = readU8(input); colourBG.b = readU8(input); colourBG.a = readU8(input); + if (!colourFG && !colourBG) + { + colourFG = _colourFromIndex(colourFGIndex); + colourBG = _colourFromIndex(colourBGIndex); + } + double fillFGTransparency = (double)colourFG.a / 255.0; double fillBGTransparency = (double)colourBG.a / 255.0; + unsigned char fillPattern = readU8(input); - input->seek(1, WPX_SEEK_CUR); - Colour shfgc; // Shadow Foreground Colour - shfgc.r = readU8(input); - shfgc.g = readU8(input); - shfgc.b = readU8(input); - shfgc.a = readU8(input); - input->seek(5, WPX_SEEK_CUR); // Shadow Background Colour skipped + + unsigned char shadowFGIndex = readU8(input); + Colour shadowFG; + shadowFG.r = readU8(input); + shadowFG.g = readU8(input); + shadowFG.b = readU8(input); + shadowFG.a = readU8(input); + unsigned char shadowBGIndex = readU8(input); + Colour shadowBG; + shadowBG.r = readU8(input); + shadowBG.g = readU8(input); + shadowBG.b = readU8(input); + shadowBG.a = readU8(input); + if (!shadowFG && !shadowBG) + { + shadowFG = _colourFromIndex(shadowFGIndex); + shadowBG = _colourFromIndex(shadowBGIndex); + } + unsigned char shadowPattern = readU8(input); + // only version 11 after that point input->seek(2, WPX_SEEK_CUR); // Shadow Type and Value format byte double shadowOffsetX = readDouble(input); @@ -1699,7 +1720,7 @@ void libvisio::VSDParser::readFillAndShadow(WPXInputStream *input) if (m_isInStyles) m_collector->collectFillStyle(m_header.level, colourFG, colourBG, fillPattern, - fillFGTransparency, fillBGTransparency, shadowPattern, shfgc, + fillFGTransparency, fillBGTransparency, shadowPattern, shadowFG, shadowOffsetX, shadowOffsetY); else { @@ -1708,7 +1729,7 @@ void libvisio::VSDParser::readFillAndShadow(WPXInputStream *input) VSD_DEBUG_MSG(("Found stencil fill\n")); } m_shape.m_fillStyle.override(VSDOptionalFillStyle(colourFG, colourBG, fillPattern, fillFGTransparency, - fillBGTransparency, shfgc, shadowPattern, shadowOffsetX, shadowOffsetY)); + fillBGTransparency, shadowFG, shadowPattern, shadowOffsetX, shadowOffsetY)); } } diff --git a/src/lib/VSDTypes.h b/src/lib/VSDTypes.h index 0b0d299..ba90396 100644 --- a/src/lib/VSDTypes.h +++ b/src/lib/VSDTypes.h @@ -80,6 +80,18 @@ struct Colour Colour(unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha) : r(red), g(green), b(blue), a(alpha) {} Colour() : r(0), g(0), b(0), a(0) {} + inline bool operator==(const Colour &col) + { + return ((r == col.r) && (g == col.g) && (b == col.b) && (a == col.a)); + } + inline bool operator!=(const Colour &col) + { + return !operator==(col); + } + inline bool operator!() + { + return (!r && !g && !b && !a); + } unsigned char r; unsigned char g; unsigned char b;
_______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
