summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorALONSO Laurent <laurent.alonso@inria.fr>2019-04-10 14:55:13 +0200
committerALONSO Laurent <laurent.alonso@inria.fr>2019-04-10 14:55:13 +0200
commit32d97bc0d377f504a4833da882ee1a33c2e6d1df (patch)
tree4fa5767585bfd4aacf330c863f30062fc67c7167
parentfcdf0fd044c90f8ef7f8800ee224014beec73802 (diff)
iwa[text box]: try to retrieve some fit-to-size, ...
Change-Id: I410c584945f31cfbf0e052f5dae9b05e72043495
-rw-r--r--src/lib/IWAParser.cpp26
-rw-r--r--src/lib/IWAParser.h2
-rw-r--r--src/lib/IWORKCollector.cpp19
-rw-r--r--src/lib/IWORKCollector.h2
-rw-r--r--src/lib/IWORKRecorder.cpp10
-rw-r--r--src/lib/IWORKRecorder.h2
-rw-r--r--src/lib/IWORKShape.cpp1
-rw-r--r--src/lib/IWORKShape.h1
-rw-r--r--src/lib/KEY6Parser.cpp8
-rw-r--r--src/lib/KEYCollector.cpp10
-rw-r--r--src/lib/KEYCollector.h2
-rw-r--r--src/lib/KEYTypes.cpp1
-rw-r--r--src/lib/KEYTypes.h1
-rw-r--r--src/lib/NUM3Parser.cpp3
-rw-r--r--src/lib/NUM3Parser.h2
-rw-r--r--src/lib/contexts/IWORKShapeContext.cpp2
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();
}
}