src/lib/EscherFieldIds.h | 1 + src/lib/Fill.cpp | 19 +++++++++++++++++++ src/lib/Fill.h | 9 +++++++++ src/lib/MSPUBCollector.cpp | 6 +++++- src/lib/MSPUBParser.cpp | 9 +++++++++ 5 files changed, 43 insertions(+), 1 deletion(-)
New commits: commit fb7432a35aeb55634e5cf45a1f4b8d91dba8aff4 Author: Brennan Vincent <brennan.vinc...@gmail.com> Date: Fri Feb 1 20:04:45 2013 -0700 Respect flags that determine whether to use a shape fill's properties diff --git a/src/lib/EscherFieldIds.h b/src/lib/EscherFieldIds.h index b770c38..c7b2920 100644 --- a/src/lib/EscherFieldIds.h +++ b/src/lib/EscherFieldIds.h @@ -40,6 +40,7 @@ #define FIELDID_FILL_OPACITY 0x0182 #define FIELDID_FILL_BACK_COLOR 0x0183 #define FIELDID_FILL_BACK_OPACITY 0x0184 +#define FIELDID_FILL_STYLE_BOOL_PROPS 0x01BF #define FIELDID_LINE_COLOR 0x01C0 #define FIELDID_LINE_BACK_COLOR 0x01C2 #define FIELDID_LINE_STYLE_BOOL_PROPS 0x01FF diff --git a/src/lib/Fill.cpp b/src/lib/Fill.cpp index cade9b8..8491eb8 100644 --- a/src/lib/Fill.cpp +++ b/src/lib/Fill.cpp @@ -32,6 +32,25 @@ using namespace libmspub; +NonexistentFill::NonexistentFill(const MSPUBCollector *owner) : Fill(owner) +{ +} + +bool NonexistentFill::fillExists() const +{ + return false; +} + +WPXPropertyListVector NonexistentFill::getProperties(WPXPropertyList *) const +{ + return WPXPropertyListVector(); +} + +bool Fill::fillExists() const +{ + return true; +} + Fill::Fill(const MSPUBCollector *owner) : m_owner(owner) { } diff --git a/src/lib/Fill.h b/src/lib/Fill.h index dc6bc31..87f25d8 100644 --- a/src/lib/Fill.h +++ b/src/lib/Fill.h @@ -47,12 +47,21 @@ protected: public: Fill(const MSPUBCollector *owner); virtual WPXPropertyListVector getProperties(WPXPropertyList *out) const = 0; + virtual bool fillExists() const; virtual ~Fill() { } private: Fill(const Fill &) : m_owner(NULL) { } Fill &operator=(const Fill &); }; +class NonexistentFill : public Fill +{ +public: + NonexistentFill(const MSPUBCollector *owner); + WPXPropertyListVector getProperties(WPXPropertyList *out) const; + bool fillExists() const; +}; + class ImgFill : public Fill { protected: diff --git a/src/lib/MSPUBCollector.cpp b/src/lib/MSPUBCollector.cpp index ad3006a..c26bf7c 100644 --- a/src/lib/MSPUBCollector.cpp +++ b/src/lib/MSPUBCollector.cpp @@ -350,7 +350,11 @@ void libmspub::MSPUBCollector::setupShapeStructures(ShapeGroupElement &elt) unsigned index = ptr_info->m_imgIndex.get(); if (index - 1 < m_images.size()) { - ptr_info->m_fill = boost::shared_ptr<const Fill>(new ImgFill(index, this, false)); + //if earlier we have set the fill explicitly to nonexistent, don't overwrite that now. + if (! (ptr_info->m_fill && !ptr_info->m_fill->fillExists())) + { + ptr_info->m_fill = boost::shared_ptr<const Fill>(new ImgFill(index, this, false)); + } } } elt.setShapeInfo(*ptr_info); diff --git a/src/lib/MSPUBParser.cpp b/src/lib/MSPUBParser.cpp index 414a946..ed34f36 100644 --- a/src/lib/MSPUBParser.cpp +++ b/src/lib/MSPUBParser.cpp @@ -1816,6 +1816,15 @@ void libmspub::MSPUBParser::parseEscherShape(WPXInputStream *input, const Escher boost::shared_ptr<libmspub::Fill> libmspub::MSPUBParser::getNewFill(const std::map<unsigned short, unsigned> &foptProperties, bool &skipIfNotBg) { + const unsigned *ptr_fillStyleBoolProps = getIfExists_const(foptProperties, FIELDID_FILL_STYLE_BOOL_PROPS); + // 0x10 is "fillShape" and 0x100000 is "useFillShape"... don't ask me to explain why MS needs two fields for one property + // in any case, if 0x100000 tells us we are allowed to use 0x10 and 0x10 is not set, + // the fill is just transparent + if (ptr_fillStyleBoolProps && *ptr_fillStyleBoolProps & 0x100000 && !(*ptr_fillStyleBoolProps & 0x10)) + { + MSPUB_DEBUG_MSG(("Not filling shape!\n")); + return boost::shared_ptr<Fill>(new NonexistentFill(m_collector)); + } const FillType *ptr_fillType = (FillType *)getIfExists_const(foptProperties, FIELDID_FILL_TYPE); FillType fillType = ptr_fillType ? *ptr_fillType : SOLID; switch (fillType) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits