diff options
author | ALONSO Laurent <laurent.alonso@inria.fr> | 2019-04-10 14:55:13 +0200 |
---|---|---|
committer | ALONSO Laurent <laurent.alonso@inria.fr> | 2019-04-10 14:55:13 +0200 |
commit | 32d97bc0d377f504a4833da882ee1a33c2e6d1df (patch) | |
tree | 4fa5767585bfd4aacf330c863f30062fc67c7167 | |
parent | fcdf0fd044c90f8ef7f8800ee224014beec73802 (diff) |
iwa[text box]: try to retrieve some fit-to-size, ...
Change-Id: I410c584945f31cfbf0e052f5dae9b05e72043495
-rw-r--r-- | src/lib/IWAParser.cpp | 26 | ||||
-rw-r--r-- | src/lib/IWAParser.h | 2 | ||||
-rw-r--r-- | src/lib/IWORKCollector.cpp | 19 | ||||
-rw-r--r-- | src/lib/IWORKCollector.h | 2 | ||||
-rw-r--r-- | src/lib/IWORKRecorder.cpp | 10 | ||||
-rw-r--r-- | src/lib/IWORKRecorder.h | 2 | ||||
-rw-r--r-- | src/lib/IWORKShape.cpp | 1 | ||||
-rw-r--r-- | src/lib/IWORKShape.h | 1 | ||||
-rw-r--r-- | src/lib/KEY6Parser.cpp | 8 | ||||
-rw-r--r-- | src/lib/KEYCollector.cpp | 10 | ||||
-rw-r--r-- | src/lib/KEYCollector.h | 2 | ||||
-rw-r--r-- | src/lib/KEYTypes.cpp | 1 | ||||
-rw-r--r-- | src/lib/KEYTypes.h | 1 | ||||
-rw-r--r-- | src/lib/NUM3Parser.cpp | 3 | ||||
-rw-r--r-- | src/lib/NUM3Parser.h | 2 | ||||
-rw-r--r-- | src/lib/contexts/IWORKShapeContext.cpp | 2 |
16 files changed, 59 insertions, 33 deletions
diff --git a/src/lib/IWAParser.cpp b/src/lib/IWAParser.cpp index d11905e..ae72e37 100644 --- a/src/lib/IWAParser.cpp +++ b/src/lib/IWAParser.cpp @@ -1219,6 +1219,7 @@ bool IWAParser::parseDrawableShape(const IWAMessage &msg, bool isConnectionLine) const optional<IWAMessage> &shape = msg.message(1).optional(); const optional<unsigned> &textRef = readRef(msg, 2); + boost::optional<unsigned> resizeFlags; if (shape) { @@ -1231,8 +1232,7 @@ bool IWAParser::parseDrawableShape(const IWAMessage &msg, bool isConnectionLine) if (placement) { IWORKGeometryPtr_t geometry; - unsigned flags=3; - parseShapePlacement(get(placement), geometry, flags); + parseShapePlacement(get(placement), geometry, resizeFlags); if (geometry && (geometry->m_naturalSize.m_width<=0 || geometry->m_naturalSize.m_height<=0) && path) { // try to retrieve the shape's size in the path @@ -1246,9 +1246,9 @@ bool IWAParser::parseDrawableShape(const IWAMessage &msg, bool isConnectionLine) break; } } - if (geometry && (flags&1)==0 && textRef) // correct horizontal position - updateGeometryUsingTextRef(get(textRef), *geometry, flags); - if (geometry && (flags&2)==0 && geometry->m_size.m_height>0 && style && style->has<property::VerticalAlignment>()) + if (geometry && resizeFlags && (get(resizeFlags) &1)==0 && textRef) // correct horizontal position + updateGeometryUsingTextRef(get(textRef), *geometry, get(resizeFlags)); + if (geometry && resizeFlags && (get(resizeFlags)&2)==0 && geometry->m_size.m_height>0 && style && style->has<property::VerticalAlignment>()) { // correct vertical position switch (style->get<property::VerticalAlignment>()) @@ -1476,7 +1476,7 @@ bool IWAParser::parseDrawableShape(const IWAMessage &msg, bool isConnectionLine) } if (shape || hasText) - m_collector.collectShape(); + m_collector.collectShape(boost::none, resizeFlags); m_currentText.reset(); m_collector.endLevel(); @@ -1503,7 +1503,7 @@ bool IWAParser::parseGroup(const IWAMessage &msg) return true; } -bool IWAParser::parseShapePlacement(const IWAMessage &msg, IWORKGeometryPtr_t &geometry, unsigned &flags) +bool IWAParser::parseShapePlacement(const IWAMessage &msg, IWORKGeometryPtr_t &geometry, boost::optional<unsigned> &flags) { geometry = make_shared<IWORKGeometry>(); flags=3; // no auto resize @@ -1522,11 +1522,11 @@ bool IWAParser::parseShapePlacement(const IWAMessage &msg, IWORKGeometryPtr_t &g flags=get(get(g).uint32(3)); // flags&1 : horizontal position is fixed // flags&2 : vertical position is fixed - if (flags&4) // horizontal flip + if (get(flags)&4) // horizontal flip geometry->m_horizontalFlip = true; - if (flags&0xFFF8) + if (get(flags)&0xFFF8) { - ETONYEK_DEBUG_MSG(("IWAParser::parseShapePlacement: unknown transformation %u\n", flags)); + ETONYEK_DEBUG_MSG(("IWAParser::parseShapePlacement: unknown transformation %u\n", get(flags))); } } if (get(g).float_(4)) @@ -1540,7 +1540,7 @@ bool IWAParser::parseShapePlacement(const IWAMessage &msg, IWORKGeometryPtr_t &g bool IWAParser::parseShapePlacement(const IWAMessage &msg) { IWORKGeometryPtr_t geometry; - unsigned flags; + boost::optional<unsigned> flags; const bool retval = parseShapePlacement(msg, geometry, flags); m_collector.collectGeometry(geometry); return retval; @@ -1553,7 +1553,7 @@ void IWAParser::parseMask(unsigned id, IWORKGeometryPtr_t &geometry, IWORKPathPt return; if (get(msg).message(1)) { - unsigned flags; + boost::optional<unsigned> flags; parseShapePlacement(get(get(msg).message(1)), geometry, flags); } // if (get(msg).message(2)) same code as parseDrawableShape @@ -2291,7 +2291,7 @@ bool IWAParser::parseImage(const IWAMessage &msg) IWORKGeometryPtr_t geometry; if (msg.message(1)) { - unsigned flags; + boost::optional<unsigned> flags; parseShapePlacement(get(msg.message(1)), geometry, flags); m_collector.collectGeometry(geometry); } diff --git a/src/lib/IWAParser.h b/src/lib/IWAParser.h index ede852a..4161aa6 100644 --- a/src/lib/IWAParser.h +++ b/src/lib/IWAParser.h @@ -111,7 +111,7 @@ protected: void parseAuthorInComment(unsigned id); void parseCustomFormat(unsigned id); - virtual bool parseShapePlacement(const IWAMessage &msg, IWORKGeometryPtr_t &geometry, unsigned &flags); + virtual bool parseShapePlacement(const IWAMessage &msg, IWORKGeometryPtr_t &geometry, boost::optional<unsigned> &flags); void parseMask(unsigned id, IWORKGeometryPtr_t &geometry, IWORKPathPtr_t &path); void updateGeometryUsingTextRef(unsigned id, IWORKGeometry &geometry, unsigned flags); diff --git a/src/lib/IWORKCollector.cpp b/src/lib/IWORKCollector.cpp index da93e96..1df6965 100644 --- a/src/lib/IWORKCollector.cpp +++ b/src/lib/IWORKCollector.cpp @@ -334,11 +334,11 @@ void IWORKCollector::collectLine(const IWORKLinePtr_t &line) drawLine(line); } -void IWORKCollector::collectShape(const boost::optional<int> &order, bool locked) +void IWORKCollector::collectShape(const boost::optional<int> &order, const boost::optional<unsigned> &resizeFlags, bool locked) { if (bool(m_recorder)) { - m_recorder->collectShape(order, locked); + m_recorder->collectShape(order, resizeFlags, locked); return; } @@ -363,6 +363,7 @@ void IWORKCollector::collectShape(const boost::optional<int> &order, bool locked } shape->m_order = order; + shape->m_resizeFlags=resizeFlags; shape->m_locked = locked; shape->m_style = m_levelStack.top().m_graphicStyle; m_levelStack.top().m_graphicStyle.reset(); @@ -1185,6 +1186,13 @@ void IWORKCollector::drawShape(const IWORKShapePtr_t &shape) if (!layoutStyle && bool(shape->m_style) && shape->m_style->has<property::LayoutStyle>()) layoutStyle=shape->m_style->get<property::LayoutStyle>(); fillLayoutProps(layoutStyle, styleProps); + if (shape->m_resizeFlags && (get(shape->m_resizeFlags)&3)==3 && + shape->m_geometry && shape->m_geometry->m_naturalSize.m_width>0 && shape->m_geometry->m_naturalSize.m_height>0) + { + styleProps.insert("draw:auto-grow-height",false); + styleProps.insert("draw:fit-to-size",true); + styleProps.insert("style:shrink-to-fit",true); + } return drawTextBox(shape->m_text, trafo, shape->m_geometry, styleProps); } @@ -1204,6 +1212,13 @@ void IWORKCollector::drawShape(const IWORKShapePtr_t &shape) if (!layoutStyle && bool(shape->m_style) && shape->m_style->has<property::LayoutStyle>()) layoutStyle=shape->m_style->get<property::LayoutStyle>(); fillLayoutProps(layoutStyle, props); + if (shape->m_resizeFlags && (get(shape->m_resizeFlags)&3)==3 && + shape->m_geometry && shape->m_geometry->m_naturalSize.m_width>0 && shape->m_geometry->m_naturalSize.m_height>0) + { + props.insert("draw:auto-grow-height",false); + props.insert("draw:fit-to-size",true); + props.insert("style:shrink-to-fit",true); + } drawTextBox(shape->m_text, trafo, shape->m_geometry, props); } } diff --git a/src/lib/IWORKCollector.h b/src/lib/IWORKCollector.h index d7a3a79..45e29d9 100644 --- a/src/lib/IWORKCollector.h +++ b/src/lib/IWORKCollector.h @@ -68,7 +68,7 @@ public: void collectBezier(const IWORKPathPtr_t &path); void collectLine(const IWORKLinePtr_t &line); - void collectShape(const boost::optional<int> &order=boost::none, bool locked=false); + void collectShape(const boost::optional<int> &order=boost::none, const boost::optional<unsigned> &resizeFlags=boost::none, bool locked=false); void collectBezierPath(); void collectPolygonPath(const IWORKSize &size, unsigned edges); diff --git a/src/lib/IWORKRecorder.cpp b/src/lib/IWORKRecorder.cpp index f117ca1..3cbf1e6 100644 --- a/src/lib/IWORKRecorder.cpp +++ b/src/lib/IWORKRecorder.cpp @@ -94,12 +94,14 @@ struct CollectLine struct CollectShape { - CollectShape(const boost::optional<int> &order, bool locked) + CollectShape(const boost::optional<int> &order, const boost::optional<unsigned> &resizeFlags, bool locked) : m_order(order) + , m_resizeFlags(resizeFlags) , m_locked(locked) { } const boost::optional<int> m_order; + const boost::optional<unsigned> m_resizeFlags; bool m_locked; }; @@ -245,7 +247,7 @@ struct Sender : public boost::static_visitor<void> void operator()(const CollectShape &value) const { - m_collector.collectShape(value.m_order, value.m_locked); + m_collector.collectShape(value.m_order, value.m_resizeFlags, value.m_locked); } void operator()(const CollectMedia &value) const @@ -396,9 +398,9 @@ void IWORKRecorder::collectLine(const IWORKLinePtr_t &line) m_impl->m_elements.push_back(CollectLine(line)); } -void IWORKRecorder::collectShape(const boost::optional<int> &order, bool locked) +void IWORKRecorder::collectShape(const boost::optional<int> &order, const boost::optional<unsigned> &resizeFlags, bool locked) { - m_impl->m_elements.push_back(CollectShape(order,locked)); + m_impl->m_elements.push_back(CollectShape(order,resizeFlags,locked)); } void IWORKRecorder::collectMedia(const IWORKMediaContentPtr_t &content, const IWORKGeometryPtr_t &cropGeometry, const boost::optional<int> &order) diff --git a/src/lib/IWORKRecorder.h b/src/lib/IWORKRecorder.h index e2e1ac2..314844a 100644 --- a/src/lib/IWORKRecorder.h +++ b/src/lib/IWORKRecorder.h @@ -46,7 +46,7 @@ public: void collectPath(const IWORKPathPtr_t &path); void collectImage(const IWORKMediaContentPtr_t &image, const IWORKGeometryPtr_t &cropGeometry, const boost::optional<int> &order, bool locked); void collectLine(const IWORKLinePtr_t &line); - void collectShape(const boost::optional<int> &order, bool locked); + void collectShape(const boost::optional<int> &order, const boost::optional<unsigned> &resizeFlags, bool locked); void collectMedia(const IWORKMediaContentPtr_t &content, const IWORKGeometryPtr_t &cropGeometry, const boost::optional<int> &order); diff --git a/src/lib/IWORKShape.cpp b/src/lib/IWORKShape.cpp index 571f3bb..40f52e7 100644 --- a/src/lib/IWORKShape.cpp +++ b/src/lib/IWORKShape.cpp @@ -31,6 +31,7 @@ IWORKShape::IWORKShape() : m_geometry() , m_style() , m_order() + , m_resizeFlags() , m_path() , m_text() , m_locked(false) diff --git a/src/lib/IWORKShape.h b/src/lib/IWORKShape.h index 1470f85..1e2cb40 100644 --- a/src/lib/IWORKShape.h +++ b/src/lib/IWORKShape.h @@ -28,6 +28,7 @@ struct IWORKShape IWORKGeometryPtr_t m_geometry; IWORKStylePtr_t m_style; boost::optional<int> m_order; + boost::optional<unsigned> m_resizeFlags; IWORKPathPtr_t m_path; IWORKTextPtr_t m_text; bool m_locked; diff --git a/src/lib/KEY6Parser.cpp b/src/lib/KEY6Parser.cpp index 9f83a95..7bc2e11 100644 --- a/src/lib/KEY6Parser.cpp +++ b/src/lib/KEY6Parser.cpp @@ -183,11 +183,9 @@ bool KEY6Parser::parsePlaceholder(const unsigned id) m_collector.startLevel(); IWORKGeometryPtr_t geometry; const IWAMessageField &placement = get(shape).message(1); + boost::optional<unsigned> resizeFlags; if (placement) - { - unsigned flags; - parseShapePlacement(get(placement), geometry, flags); - } + parseShapePlacement(get(placement), geometry, resizeFlags); assert(!m_currentText); m_currentText = m_collector.createText(m_langManager); parseText(get(textRef)); @@ -200,7 +198,7 @@ bool KEY6Parser::parsePlaceholder(const unsigned id) IWORKStylePtr_t layoutStyle; const optional<unsigned> &layoutStyleRef = readRef(get(shape), 2); const IWORKStylePtr_t style = make_shared<IWORKStyle>(props, none, layoutStyleRef ? queryGraphicStyle(get(layoutStyleRef)) : nullptr); - const KEYPlaceholderPtr_t &placeholder = m_collector.collectTextPlaceholder(style, type == 2); + const KEYPlaceholderPtr_t &placeholder = m_collector.collectTextPlaceholder(style, type == 2, resizeFlags); m_collector.insertTextPlaceholder(placeholder); m_collector.endLevel(); } diff --git a/src/lib/KEYCollector.cpp b/src/lib/KEYCollector.cpp index 466f74e..08dd169 100644 --- a/src/lib/KEYCollector.cpp +++ b/src/lib/KEYCollector.cpp @@ -142,10 +142,11 @@ void KEYCollector::insertSlide(const KEYSlidePtr_t &slide, bool isMaster, const m_document->endSlide(); } -KEYPlaceholderPtr_t KEYCollector::collectTextPlaceholder(const IWORKStylePtr_t &style, const bool title) +KEYPlaceholderPtr_t KEYCollector::collectTextPlaceholder(const IWORKStylePtr_t &style, const bool title, const boost::optional<unsigned> &resizeFlags) { KEYPlaceholderPtr_t placeholder(new KEYPlaceholder()); placeholder->m_title = title; + placeholder->m_resizeFlags = resizeFlags; placeholder->m_style = style; if (bool(placeholder->m_style)) { @@ -176,6 +177,13 @@ void KEYCollector::insertTextPlaceholder(const KEYPlaceholderPtr_t &placeholder) { librevenge::RVNGPropertyList props; fillLayoutProps(placeholder->m_style, props); + if (placeholder->m_resizeFlags && (get(placeholder->m_resizeFlags)&3)==3 && + placeholder->m_geometry && placeholder->m_geometry->m_naturalSize.m_width>0 && placeholder->m_geometry->m_naturalSize.m_height>0) + { + props.insert("draw:auto-grow-height",false); + props.insert("draw:fit-to-size",true); + props.insert("style:shrink-to-fit",true); + } drawTextBox(placeholder->m_text, trafo, placeholder->m_geometry, props); } } diff --git a/src/lib/KEYCollector.h b/src/lib/KEYCollector.h index b941a04..591ab47 100644 --- a/src/lib/KEYCollector.h +++ b/src/lib/KEYCollector.h @@ -35,7 +35,7 @@ public: void insertLayer(const KEYLayerPtr_t &layer); KEYSlidePtr_t collectSlide(); - KEYPlaceholderPtr_t collectTextPlaceholder(const IWORKStylePtr_t &style, bool title); + KEYPlaceholderPtr_t collectTextPlaceholder(const IWORKStylePtr_t &style, bool title, const boost::optional<unsigned> &resizeFlags=boost::none); void insertTextPlaceholder(const KEYPlaceholderPtr_t &placeholder); void collectNote(); diff --git a/src/lib/KEYTypes.cpp b/src/lib/KEYTypes.cpp index 5b23e34..e058c15 100644 --- a/src/lib/KEYTypes.cpp +++ b/src/lib/KEYTypes.cpp @@ -33,6 +33,7 @@ KEYPlaceholder::KEYPlaceholder() , m_geometry() , m_text() , m_visible() + , m_resizeFlags() , m_bulletIndentations() { } diff --git a/src/lib/KEYTypes.h b/src/lib/KEYTypes.h index c6ec39a..7342e11 100644 --- a/src/lib/KEYTypes.h +++ b/src/lib/KEYTypes.h @@ -46,6 +46,7 @@ struct KEYPlaceholder IWORKGeometryPtr_t m_geometry; IWORKTextPtr_t m_text; boost::optional<bool> m_visible; + boost::optional<unsigned> m_resizeFlags; std::deque<double> m_bulletIndentations; KEYPlaceholder(); diff --git a/src/lib/NUM3Parser.cpp b/src/lib/NUM3Parser.cpp index 45a0656..578843a 100644 --- a/src/lib/NUM3Parser.cpp +++ b/src/lib/NUM3Parser.cpp @@ -42,10 +42,9 @@ bool NUM3Parser::parseSheet(unsigned id) return true; } -bool NUM3Parser::parseShapePlacement(const IWAMessage &msg, IWORKGeometryPtr_t &geometry, unsigned &flags) +bool NUM3Parser::parseShapePlacement(const IWAMessage &msg, IWORKGeometryPtr_t &geometry, boost::optional<unsigned> &flags) { geometry = std::make_shared<IWORKGeometry>(); - flags=3; // no auto resize const boost::optional<IWAMessage> &g = msg.message(1).optional(); if (g) { diff --git a/src/lib/NUM3Parser.h b/src/lib/NUM3Parser.h index bae9912..aa9599c 100644 --- a/src/lib/NUM3Parser.h +++ b/src/lib/NUM3Parser.h @@ -24,7 +24,7 @@ public: private: bool parseDocument() override; - bool parseShapePlacement(const IWAMessage &msg, IWORKGeometryPtr_t &geometry, unsigned &flags) override; + bool parseShapePlacement(const IWAMessage &msg, IWORKGeometryPtr_t &geometry, boost::optional<unsigned> &flags) override; bool parseStickyNote(const IWAMessage &msg) override; bool parseSheet(unsigned id); diff --git a/src/lib/contexts/IWORKShapeContext.cpp b/src/lib/contexts/IWORKShapeContext.cpp index d7e8bda..c3bc147 100644 --- a/src/lib/contexts/IWORKShapeContext.cpp +++ b/src/lib/contexts/IWORKShapeContext.cpp @@ -109,7 +109,7 @@ void IWORKShapeContext::endOfElement() getCollector().setGraphicStyle(m_style); getCollector().collectText(getState().m_currentText); getState().m_currentText.reset(); - getCollector().collectShape(m_order, m_locked); + getCollector().collectShape(m_order, boost::none, m_locked); getCollector().endLevel(); } } |