parent
b63e5fbb51
commit
e296eea91a
@ -0,0 +1,104 @@
|
||||
From a4ab4fdafc33088429a6c6bcdcf3c072b3a834a9 Mon Sep 17 00:00:00 2001
|
||||
From: David Tardon <dtardon@redhat.com>
|
||||
Date: Mon, 12 Dec 2016 15:23:55 +0100
|
||||
Subject: [PATCH 2/2] emit bmps with color palette correctly
|
||||
|
||||
Change-Id: I731ab9629fdc08c54b43cdcb21a81633bd89f569
|
||||
---
|
||||
src/lib/VSDContentCollector.cpp | 52 +++++++++++++++++++++++++++++++++++++----
|
||||
src/lib/libvisio_utils.h | 2 ++
|
||||
2 files changed, 50 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/lib/VSDContentCollector.cpp b/src/lib/VSDContentCollector.cpp
|
||||
index c20e626..229120f 100644
|
||||
--- a/src/lib/VSDContentCollector.cpp
|
||||
+++ b/src/lib/VSDContentCollector.cpp
|
||||
@@ -7,6 +7,7 @@
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
+#include <cassert>
|
||||
#include <string.h> // for memcpy
|
||||
#include <set>
|
||||
#include <stack>
|
||||
@@ -33,6 +34,48 @@ static unsigned bitmapId = 0;
|
||||
|
||||
#define SURROGATE_VALUE(h,l) (((h) - 0xd800) * 0x400 + (l) - 0xdc00 + 0x10000)
|
||||
|
||||
+namespace
|
||||
+{
|
||||
+
|
||||
+unsigned computeBMPDataOffset(librevenge::RVNGInputStream *const input, const unsigned long maxLength)
|
||||
+{
|
||||
+ assert(input);
|
||||
+
|
||||
+ using namespace libvisio;
|
||||
+
|
||||
+ // determine header size
|
||||
+ unsigned headerSize = readU32(input);
|
||||
+ if (headerSize > maxLength)
|
||||
+ headerSize = 40; // assume v.3 bitmap header size
|
||||
+ unsigned off = headerSize;
|
||||
+
|
||||
+ // determine palette size
|
||||
+ input->seek(10, librevenge::RVNG_SEEK_CUR);
|
||||
+ unsigned bpp = readU16(input);
|
||||
+ // sanitize bpp
|
||||
+ if (bpp > 32)
|
||||
+ bpp = 32;
|
||||
+ const unsigned allowedBpp[] = {1, 4, 8, 16, 24, 32};
|
||||
+ size_t bppIdx = 0;
|
||||
+ while (bppIdx < VSD_NUM_ELEMENTS(allowedBpp) && bpp < allowedBpp[bppIdx])
|
||||
+ ++bppIdx;
|
||||
+ if (bpp < allowedBpp[bppIdx])
|
||||
+ bpp = allowedBpp[bppIdx];
|
||||
+ input->seek(16, librevenge::RVNG_SEEK_CUR);
|
||||
+ unsigned paletteColors = readU32(input);
|
||||
+ if (bpp < 16 && paletteColors == 0)
|
||||
+ paletteColors = 1 << bpp;
|
||||
+ assert(maxLength >= off);
|
||||
+ if (paletteColors > 0 && (paletteColors < (maxLength - off) / 4))
|
||||
+ off += 4 * paletteColors;
|
||||
+
|
||||
+ off += 14; // file header size
|
||||
+
|
||||
+ return off;
|
||||
+}
|
||||
+
|
||||
+} // anonymous namespace
|
||||
+
|
||||
libvisio::VSDContentCollector::VSDContentCollector(
|
||||
librevenge::RVNGDrawingInterface *painter,
|
||||
std::vector<std::map<unsigned, XForm> > &groupXFormsSequence,
|
||||
@@ -1359,10 +1402,11 @@ void libvisio::VSDContentCollector::_handleForeignData(const librevenge::RVNGBin
|
||||
m_currentForeignData.append((unsigned char)0x00);
|
||||
m_currentForeignData.append((unsigned char)0x00);
|
||||
|
||||
- m_currentForeignData.append((unsigned char)0x36);
|
||||
- m_currentForeignData.append((unsigned char)0x00);
|
||||
- m_currentForeignData.append((unsigned char)0x00);
|
||||
- m_currentForeignData.append((unsigned char)0x00);
|
||||
+ const unsigned dataOff = computeBMPDataOffset(binaryData.getDataStream(), binaryData.size());
|
||||
+ m_currentForeignData.append((unsigned char)(dataOff & 0xff));
|
||||
+ m_currentForeignData.append((unsigned char)((dataOff >> 8) & 0xff));
|
||||
+ m_currentForeignData.append((unsigned char)((dataOff >> 16) & 0xff));
|
||||
+ m_currentForeignData.append((unsigned char)((dataOff >> 24) & 0xff));
|
||||
}
|
||||
m_currentForeignData.append(binaryData);
|
||||
|
||||
diff --git a/src/lib/libvisio_utils.h b/src/lib/libvisio_utils.h
|
||||
index c6c3a03..2a4880e 100644
|
||||
--- a/src/lib/libvisio_utils.h
|
||||
+++ b/src/lib/libvisio_utils.h
|
||||
@@ -70,6 +70,8 @@ typedef unsigned __int64 uint64_t;
|
||||
#define VSD_DEBUG(M)
|
||||
#endif
|
||||
|
||||
+#define VSD_NUM_ELEMENTS(array) (sizeof(array)/sizeof((array)[0]))
|
||||
+
|
||||
namespace libvisio
|
||||
{
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
Loading…
Reference in new issue