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 ");
 }
 

Reply via email to