[Libreoffice-commits] libvisio.git: src/lib

Fridrich Štrba fridrich.strba at bluewin.ch
Thu Jan 19 08:48:45 UTC 2017


 src/lib/VSDParser.cpp |   49 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 46 insertions(+), 3 deletions(-)

New commits:
commit ea5f92515f98766062c2c24c0726ceb761abc19a
Author: Fridrich Štrba <fridrich.strba at bluewin.ch>
Date:   Thu Jan 19 09:48:15 2017 +0100

    Deduce text encoding from font name
    
    Change-Id: I168765794d9d7598e2429f68f9a1d3c936ef8202

diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp
index 680e14b..52f7d0d 100644
--- a/src/lib/VSDParser.cpp
+++ b/src/lib/VSDParser.cpp
@@ -1733,15 +1733,56 @@ void libvisio::VSDParser::readFontIX(librevenge::RVNGInputStream *input)
   unsigned char codePage = (unsigned char)(getUInt(input) & 0xff);
   tmpAdjust -= input->tell();
 
-  librevenge::RVNGBinaryData textStream;
+  std::string fontName;
 
   for (long i = 0; i < (long)(m_header.dataLength + tmpAdjust); i++)
   {
-    unsigned char curchar = readU8(input);
+    char curchar = (char)readU8(input);
     if (curchar == 0)
       break;
-    textStream.append(curchar);
+    fontName.append(1, curchar);
   }
+
+  if (!codePage)
+  {
+    // Try to parse the font name for codePage
+    size_t length = fontName.length();
+    size_t found = std::string::npos;
+
+    if (length > 3 && (found=fontName.find(" CE", length - 3)) != std::string::npos)
+      codePage = 0xee;
+    else if (length > 9 && (found=fontName.rfind(" Cyrillic", length - 9)) != std::string::npos)
+      codePage = 0xcc;
+    else if (length > 4 && (found=fontName.rfind(" Cyr", length - 4)) != std::string::npos)
+      codePage = 0xcc;
+    else if (length > 4 && (found=fontName.rfind(" CYR", length - 4)) != std::string::npos)
+      codePage = 0xcc;
+    else if (length > 7 && (found=fontName.rfind(" Baltic", length - 7)) != std::string::npos)
+      codePage = 0xba;
+    else if (length > 6 && (found=fontName.rfind(" Greek", length - 6)) != std::string::npos)
+      codePage = 0xa1;
+    else if (length > 4 && (found=fontName.rfind(" Tur", length - 4)) != std::string::npos)
+      codePage = 0xa2;
+    else if (length > 4 && (found=fontName.rfind(" TUR", length - 4)) != std::string::npos)
+      codePage = 0xa2;
+    else if (length > 7 && (found=fontName.rfind(" Hebrew", length - 7)) != std::string::npos)
+      codePage = 0xb1;
+    else if (length > 7 && (found=fontName.rfind(" Arabic", length - 7)) != std::string::npos)
+      codePage = 0xb2;
+    else if (length > 5 && (found=fontName.rfind(" Thai", length - 5)) != std::string::npos)
+      codePage = 0xde;
+    else if (length >= 4 && (found=fontName.find("GOST", 0, 4)) != std::string::npos)
+    {
+      codePage = 0xcc;
+      found = std::string::npos;
+    }
+
+    if (found != std::string::npos)
+    {
+      fontName.erase(found, std::string::npos);
+    }
+  }
+
   TextFormat format = libvisio::VSD_TEXT_ANSI;
   switch (codePage)
   {
@@ -1793,6 +1834,8 @@ void libvisio::VSDParser::readFontIX(librevenge::RVNGInputStream *input)
   default:
     break;
   }
+
+  librevenge::RVNGBinaryData textStream((const unsigned char *)fontName.c_str(), fontName.length());
   m_fonts[m_header.id] = VSDName(textStream, format);
 }
 


More information about the Libreoffice-commits mailing list