src/lib/VSDXParser.cpp | 33 +++++++++++++++++++-------------- src/lib/VSDXTheme.cpp | 6 ++++-- src/test/importtest.cpp | 7 ++++--- 3 files changed, 27 insertions(+), 19 deletions(-)
New commits: commit 90ac79238339ba6a4df064d956150aa379e6d740 Author: Bartosz Kosiorek <[email protected]> AuthorDate: Tue Oct 8 20:49:35 2024 +0200 Commit: Bartosz Kosiorek <[email protected]> CommitDate: Fri Oct 11 00:02:00 2024 +0200 tdf#154379 Fix reading TextBkgnd from Shape The TextBkgnd cell can have any value from 0 through 24, or 255. The values 0 and 255 (visTxtBlklOpaque) both indicate a transparent text background. In previous implementation if: <Cell N='TextBkgnd' V='0'/> were specified, the value was taken from colors. With this implementation, if V='0' then background is not displayed, according to documentation. Change-Id: I32831ef58a5ea11e6fcc6f1fccda8618817f3af4 Reviewed-on: https://gerrit.libreoffice.org/c/libvisio/+/174712 Reviewed-by: Bartosz Kosiorek <[email protected]> Tested-by: Bartosz Kosiorek <[email protected]> diff --git a/src/lib/VSDXParser.cpp b/src/lib/VSDXParser.cpp index 8ede9c7..46efdd3 100644 --- a/src/lib/VSDXParser.cpp +++ b/src/lib/VSDXParser.cpp @@ -947,9 +947,6 @@ int libvisio::VSDXParser::getElementDepth(xmlTextReaderPtr reader) void libvisio::VSDXParser::readShapeProperties(xmlTextReaderPtr reader) { - // Text block properties - long bgClrId = -1; - int ret = 1; int tokenId = XML_TOKEN_INVALID; int tokenType = -1; @@ -1226,19 +1223,27 @@ void libvisio::VSDXParser::readShapeProperties(xmlTextReaderPtr reader) case XML_TEXTBKGND: if (XML_READER_TYPE_ELEMENT == tokenType) { - Colour textBkgndColour(0xff, 0xff, 0xff, 0); - ret = readExtendedColourData(textBkgndColour, bgClrId, reader); - if (bgClrId < 0) bgClrId = 0; - if (bgClrId) + long bgClrId = -1; + Colour tmpColour; + if (readColourOrColourIndex(tmpColour, bgClrId, reader)) { - std::map<unsigned, Colour>::const_iterator iter = m_colours.find(bgClrId-1); - if (iter != m_colours.end()) - textBkgndColour = iter->second; - else - textBkgndColour = Colour(0xff, 0xff, 0xff, 0); + m_shape.m_textBlockStyle.isTextBkgndFilled = true; + m_shape.m_textBlockStyle.textBkgndColour = tmpColour; + break; + } + if ((bgClrId < 1) || (bgClrId >= 255)) + { + m_shape.m_textBlockStyle.isTextBkgndFilled = false; + break; + } + std::map<unsigned, Colour>::const_iterator iter = m_colours.find(bgClrId - 1); + if (iter != m_colours.end()) + { + m_shape.m_textBlockStyle.textBkgndColour = iter->second; + m_shape.m_textBlockStyle.isTextBkgndFilled = true; + break; } - m_shape.m_textBlockStyle.textBkgndColour = textBkgndColour; - m_shape.m_textBlockStyle.isTextBkgndFilled = true; + m_shape.m_textBlockStyle.isTextBkgndFilled = false; } break; case XML_DEFAULTTABSTOP: diff --git a/src/lib/VSDXTheme.cpp b/src/lib/VSDXTheme.cpp index 06ba95c..b4911d3 100644 --- a/src/lib/VSDXTheme.cpp +++ b/src/lib/VSDXTheme.cpp @@ -525,7 +525,8 @@ void libvisio::VSDXTheme::readFmtScheme(xmlTextReaderPtr reader) // Other style lists not implemented break; } - } while ((XML_A_FMTSCHEME != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); + } + while ((XML_A_FMTSCHEME != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); } void libvisio::VSDXTheme::skipUnimplemented(xmlTextReaderPtr reader, int idToken) @@ -542,7 +543,8 @@ void libvisio::VSDXTheme::skipUnimplemented(xmlTextReaderPtr reader, int idToken VSD_DEBUG_MSG(("VSDXTheme::skipUnimplemented: unknown token %s ", xmlTextReaderConstName(reader))); } tokenType = xmlTextReaderNodeType(reader); - } while ((idToken != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); + } + while ((idToken != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); } void libvisio::VSDXTheme::readFillStyleLst(xmlTextReaderPtr reader) diff --git a/src/test/importtest.cpp b/src/test/importtest.cpp index a4380b1..d26eb08 100644 --- a/src/test/importtest.cpp +++ b/src/test/importtest.cpp @@ -574,10 +574,11 @@ void ImportTest::testVsdxQuickStyleFillMatrix() assertXPath(m_doc, "/document/page/layer/layer/setStyle[2]", "stroke-color", "#5b9bd5"); assertXPath(m_doc, "/document/page/layer/textObject/paragraph[1]/span", "color", "#5b9bd5"); - // TODO assertXPath(m_doc, "/document/page/layer/textObject/paragraph[1]/span", "background-color", "#ffffff"); + assertXPathNoAttribute(m_doc, "/document/page/layer/textObject/paragraph[1]/span", "background-color"); assertXPathContent(m_doc, "/document/page/layer/textObject/paragraph[1]/span/insertText", " Kommissionierungs"); - assertXPath(m_doc, "/document/page/layer/textObject/paragraph[1]/span", "color", "#5b9bd5"); - // TODO assertXPath(m_doc, "/document/page/layer/textObject/paragraph[2]/span", "background-color", "#ffffff"); + + assertXPath(m_doc, "/document/page/layer/textObject/paragraph[2]/span", "color", "#5b9bd5"); + assertXPathNoAttribute(m_doc, "/document/page/layer/textObject/paragraph[2]/span", "background-color"); assertXPathContent(m_doc, "/document/page/layer/textObject/paragraph[2]/span/insertText", "Beleg "); }
