[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