[Libreoffice-commits] libmspub.git: 2 commits - src/lib
Fridrich Å trba
fridrich.strba at bluewin.ch
Thu Apr 4 06:08:48 PDT 2013
src/lib/Fill.cpp | 28 +++++++++++++++++++++++++---
src/lib/Fill.h | 13 ++++++++-----
src/lib/FillType.h | 8 +++++++-
src/lib/MSPUBCollector.cpp | 8 ++++++--
src/lib/MSPUBParser.cpp | 15 +++++++++++++--
src/lib/ShapeInfo.h | 3 ++-
6 files changed, 61 insertions(+), 14 deletions(-)
New commits:
commit c51d3825ee97cd563a4791f2b1b43e40c5272a7f
Author: Fridrich Å trba <fridrich.strba at bluewin.ch>
Date: Thu Apr 4 15:05:16 2013 +0200
Astyle stuff (astyle -b -k3 -y -n -s2 -r \*.cpp \*.h)
diff --git a/src/lib/Fill.cpp b/src/lib/Fill.cpp
index 66d55de..aeaeb37 100644
--- a/src/lib/Fill.cpp
+++ b/src/lib/Fill.cpp
@@ -54,11 +54,11 @@ WPXPropertyListVector ImgFill::getProperties(WPXPropertyList *out) const
out->insert("style:repeat", "stretch");
}
if (m_rotation != 0)
- {
- WPXString sValue;
- sValue.sprintf("%d", m_rotation);
- out->insert("libwpg:rotate", sValue);
- }
+ {
+ WPXString sValue;
+ sValue.sprintf("%d", m_rotation);
+ out->insert("libwpg:rotate", sValue);
+ }
}
return WPXPropertyListVector();
}
@@ -133,19 +133,19 @@ WPXPropertyListVector GradientFill::getProperties(WPXPropertyList *out) const
out->insert("draw:angle", -m_angle); // draw:angle is clockwise in odf format
switch (m_type)
{
- case 4:
- case 7:
- out->insert("libmspub:shade", "normal");
- break;
- case 5:
- out->insert("libmspub:shade", "center");
- break;
- case 6:
- out->insert("libmspub:shade", "shape");
- break;
- default:
- out->insert("libmspub:shade", "normal");
- break;
+ case 4:
+ case 7:
+ out->insert("libmspub:shade", "normal");
+ break;
+ case 5:
+ out->insert("libmspub:shade", "center");
+ break;
+ case 6:
+ out->insert("libmspub:shade", "shape");
+ break;
+ default:
+ out->insert("libmspub:shade", "normal");
+ break;
}
for (unsigned i = 0; i < m_stops.size(); ++i)
{
diff --git a/src/lib/FillType.h b/src/lib/FillType.h
index 7b1f4cb..8978ebd 100644
--- a/src/lib/FillType.h
+++ b/src/lib/FillType.h
@@ -34,10 +34,10 @@ namespace libmspub
enum FillType
{
SOLID,
- GRADIENT = 0x07, // msofillShadeScale Similar to msofillShade, but the fillAngle
- // is additionally scaled by the aspect ratio of
- // the shape. If shape is square, it is the
- // same as msofillShade
+ GRADIENT = 0x07, // msofillShadeScale Similar to msofillShade, but the fillAngle
+ // is additionally scaled by the aspect ratio of
+ // the shape. If shape is square, it is the
+ // same as msofillShade
GRADIENTCENTER = 0x06, // msofillShadeShape Shade from shape outline to end point
GRADIENTSHAPE = 0x05, // msofillShadeCenter Shade from bounding rectangle to end point
GRADIENTNORMAL = 0x04, // msofillShade Shade from start to end points
diff --git a/src/lib/MSPUBCollector.cpp b/src/lib/MSPUBCollector.cpp
index bbe229a..82b7cca 100644
--- a/src/lib/MSPUBCollector.cpp
+++ b/src/lib/MSPUBCollector.cpp
@@ -348,9 +348,9 @@ void libmspub::MSPUBCollector::setupShapeStructures(ShapeGroupElement &elt)
if (ptr_info->m_imgIndex.is_initialized())
{
unsigned index = ptr_info->m_imgIndex.get();
- int rot = 0;
- if (ptr_info->m_innerRotation.is_initialized())
- rot = ptr_info->m_innerRotation.get();
+ int rot = 0;
+ if (ptr_info->m_innerRotation.is_initialized())
+ rot = ptr_info->m_innerRotation.get();
if (index - 1 < m_images.size())
{
ptr_info->m_fill = boost::shared_ptr<const Fill>(new ImgFill(index, this, false, rot));
@@ -424,7 +424,7 @@ boost::function<void(void)> libmspub::MSPUBCollector::paintShape(const ShapeInfo
{
type = info.m_type.get_value_or(RECTANGLE);
}
-
+
if (hasFill)
{
double x, y, height, width;
diff --git a/src/lib/MSPUBParser.cpp b/src/lib/MSPUBParser.cpp
index cdbc155..584c227 100644
--- a/src/lib/MSPUBParser.cpp
+++ b/src/lib/MSPUBParser.cpp
@@ -1894,13 +1894,13 @@ boost::shared_ptr<libmspub::Fill> libmspub::MSPUBParser::getNewFill(const std::m
case TEXTURE:
case BITMAP:
{
- // in the case the shape is rotated we must rotate the image too
+ // in the case the shape is rotated we must rotate the image too
int rotation = 0;
const int *ptr_rotation = (const int *)getIfExists_const(foptProperties, FIELDID_ROTATION);
if (ptr_rotation)
{
- rotation = (int)doubleModulo(toFixedPoint(*ptr_rotation), 360);
- MSPUB_DEBUG_MSG(("Rotation value %d\n", rotation));
+ rotation = (int)doubleModulo(toFixedPoint(*ptr_rotation), 360);
+ MSPUB_DEBUG_MSG(("Rotation value %d\n", rotation));
}
const unsigned *ptr_bgPxId = getIfExists_const(foptProperties, FIELDID_BG_PXID);
if (ptr_bgPxId && *ptr_bgPxId <= m_escherDelayIndices.size() && m_escherDelayIndices[*ptr_bgPxId - 1] >= 0)
commit deb3a0df5b0aa85676bb20bf6ce026d0dc7101af
Author: Franz Schmid <franz at linux-hp-i7.site>
Date: Wed Apr 3 21:14:47 2013 +0200
Added parsing of more gradient types and report rotation for images.
diff --git a/src/lib/Fill.cpp b/src/lib/Fill.cpp
index cade9b8..66d55de 100644
--- a/src/lib/Fill.cpp
+++ b/src/lib/Fill.cpp
@@ -36,7 +36,7 @@ Fill::Fill(const MSPUBCollector *owner) : m_owner(owner)
{
}
-ImgFill::ImgFill(unsigned imgIndex, const MSPUBCollector *owner, bool isTexture) : Fill(owner), m_imgIndex(imgIndex), m_isTexture(isTexture)
+ImgFill::ImgFill(unsigned imgIndex, const MSPUBCollector *owner, bool isTexture, int rot) : Fill(owner), m_imgIndex(imgIndex), m_isTexture(isTexture), m_rotation(rot)
{
}
@@ -53,11 +53,17 @@ WPXPropertyListVector ImgFill::getProperties(WPXPropertyList *out) const
{
out->insert("style:repeat", "stretch");
}
+ if (m_rotation != 0)
+ {
+ WPXString sValue;
+ sValue.sprintf("%d", m_rotation);
+ out->insert("libwpg:rotate", sValue);
+ }
}
return WPXPropertyListVector();
}
-PatternFill::PatternFill(unsigned imgIndex, const MSPUBCollector *owner, ColorReference fg, ColorReference bg) : ImgFill(imgIndex, owner, true), m_fg(fg), m_bg(bg)
+PatternFill::PatternFill(unsigned imgIndex, const MSPUBCollector *owner, ColorReference fg, ColorReference bg) : ImgFill(imgIndex, owner, true, 0), m_fg(fg), m_bg(bg)
{
}
@@ -110,7 +116,7 @@ WPXPropertyListVector SolidFill::getProperties(WPXPropertyList *out) const
return WPXPropertyListVector();
}
-GradientFill::GradientFill(const MSPUBCollector *owner, double angle) : Fill(owner), m_stops(), m_angle(angle)
+GradientFill::GradientFill(const MSPUBCollector *owner, double angle, int type) : Fill(owner), m_stops(), m_angle(angle), m_type(type)
{
}
@@ -125,6 +131,22 @@ WPXPropertyListVector GradientFill::getProperties(WPXPropertyList *out) const
out->insert("draw:fill", "gradient");
out->insert("svg:fill-rule", "nonzero");
out->insert("draw:angle", -m_angle); // draw:angle is clockwise in odf format
+ switch (m_type)
+ {
+ case 4:
+ case 7:
+ out->insert("libmspub:shade", "normal");
+ break;
+ case 5:
+ out->insert("libmspub:shade", "center");
+ break;
+ case 6:
+ out->insert("libmspub:shade", "shape");
+ break;
+ default:
+ out->insert("libmspub:shade", "normal");
+ break;
+ }
for (unsigned i = 0; i < m_stops.size(); ++i)
{
Color c = m_stops[i].m_colorReference.getFinalColor(m_owner->m_paletteColors);
diff --git a/src/lib/Fill.h b/src/lib/Fill.h
index dc6bc31..e226a65 100644
--- a/src/lib/Fill.h
+++ b/src/lib/Fill.h
@@ -59,11 +59,13 @@ protected:
unsigned m_imgIndex;
private:
bool m_isTexture;
+protected:
+ int m_rotation;
public:
- ImgFill(unsigned imgIndex, const MSPUBCollector *owner, bool isTexture);
+ ImgFill(unsigned imgIndex, const MSPUBCollector *owner, bool isTexture, int rotation);
virtual WPXPropertyListVector getProperties(WPXPropertyList *out) const;
private:
- ImgFill(const ImgFill &) : Fill(NULL), m_imgIndex(0), m_isTexture(false) { }
+ ImgFill(const ImgFill &) : Fill(NULL), m_imgIndex(0), m_isTexture(false), m_rotation(0) { }
ImgFill &operator=(const ImgFill &);
};
@@ -75,7 +77,7 @@ public:
PatternFill(unsigned imgIndex, const MSPUBCollector *owner, ColorReference fg, ColorReference bg);
WPXPropertyListVector getProperties(WPXPropertyList *out) const;
private:
- PatternFill(const PatternFill &) : ImgFill(0, NULL, true), m_fg(0x08000000), m_bg(0x08000000) { }
+ PatternFill(const PatternFill &) : ImgFill(0, NULL, true, 0), m_fg(0x08000000), m_bg(0x08000000) { }
PatternFill &operator=(const ImgFill &);
};
@@ -102,12 +104,13 @@ class GradientFill : public Fill
};
std::vector<StopInfo> m_stops;
double m_angle;
+ int m_type;
public:
- GradientFill(const MSPUBCollector *owner, double angle = 0);
+ GradientFill(const MSPUBCollector *owner, double angle = 0, int type = 7);
void addColor(ColorReference c, unsigned offsetPercent, double opacity);
WPXPropertyListVector getProperties(WPXPropertyList *out) const;
private:
- GradientFill(const GradientFill &) : Fill(NULL), m_stops(), m_angle(0) { }
+ GradientFill(const GradientFill &) : Fill(NULL), m_stops(), m_angle(0), m_type(7) { }
GradientFill &operator=(const GradientFill &);
};
}
diff --git a/src/lib/FillType.h b/src/lib/FillType.h
index 5d8181f..7b1f4cb 100644
--- a/src/lib/FillType.h
+++ b/src/lib/FillType.h
@@ -34,7 +34,13 @@ namespace libmspub
enum FillType
{
SOLID,
- GRADIENT = 0x07,
+ GRADIENT = 0x07, // msofillShadeScale Similar to msofillShade, but the fillAngle
+ // is additionally scaled by the aspect ratio of
+ // the shape. If shape is square, it is the
+ // same as msofillShade
+ GRADIENTCENTER = 0x06, // msofillShadeShape Shade from shape outline to end point
+ GRADIENTSHAPE = 0x05, // msofillShadeCenter Shade from bounding rectangle to end point
+ GRADIENTNORMAL = 0x04, // msofillShade Shade from start to end points
BITMAP = 0x03,
TEXTURE = 0x02,
PATTERN = 0x01
diff --git a/src/lib/MSPUBCollector.cpp b/src/lib/MSPUBCollector.cpp
index bceb8f4..bbe229a 100644
--- a/src/lib/MSPUBCollector.cpp
+++ b/src/lib/MSPUBCollector.cpp
@@ -348,9 +348,12 @@ void libmspub::MSPUBCollector::setupShapeStructures(ShapeGroupElement &elt)
if (ptr_info->m_imgIndex.is_initialized())
{
unsigned index = ptr_info->m_imgIndex.get();
+ int rot = 0;
+ if (ptr_info->m_innerRotation.is_initialized())
+ rot = ptr_info->m_innerRotation.get();
if (index - 1 < m_images.size())
{
- ptr_info->m_fill = boost::shared_ptr<const Fill>(new ImgFill(index, this, false));
+ ptr_info->m_fill = boost::shared_ptr<const Fill>(new ImgFill(index, this, false, rot));
}
}
elt.setShapeInfo(*ptr_info);
@@ -1032,6 +1035,7 @@ libmspub::MSPUBCollector::~MSPUBCollector()
void libmspub::MSPUBCollector::setShapeRotation(unsigned seqNum, double rotation)
{
m_shapeInfosBySeqNum[seqNum].m_rotation = rotation;
+ m_shapeInfosBySeqNum[seqNum].m_innerRotation = (int)rotation;
}
void libmspub::MSPUBCollector::setShapeFlip(unsigned seqNum, bool flipVertical, bool flipHorizontal)
diff --git a/src/lib/MSPUBParser.cpp b/src/lib/MSPUBParser.cpp
index 414a946..cdbc155 100644
--- a/src/lib/MSPUBParser.cpp
+++ b/src/lib/MSPUBParser.cpp
@@ -1832,6 +1832,9 @@ boost::shared_ptr<libmspub::Fill> libmspub::MSPUBParser::getNewFill(const std::m
}
return boost::shared_ptr<Fill>();
}
+ case GRADIENTCENTER:
+ case GRADIENTSHAPE:
+ case GRADIENTNORMAL:
case GRADIENT: //FIXME: The handling of multi-color gradients here is quite bad.
{
int angle;
@@ -1863,7 +1866,7 @@ boost::shared_ptr<libmspub::Fill> libmspub::MSPUBParser::getNewFill(const std::m
break;
}
- boost::shared_ptr<GradientFill> ret(new GradientFill(m_collector, angle));
+ boost::shared_ptr<GradientFill> ret(new GradientFill(m_collector, angle, (int)fillType));
if (fillFocus == 0)
{
ret->addColor(firstColor, 0, ptr_fillOpacity ? (double)(*ptr_fillOpacity) / 0xFFFF : 1);
@@ -1891,10 +1894,18 @@ boost::shared_ptr<libmspub::Fill> libmspub::MSPUBParser::getNewFill(const std::m
case TEXTURE:
case BITMAP:
{
+ // in the case the shape is rotated we must rotate the image too
+ int rotation = 0;
+ const int *ptr_rotation = (const int *)getIfExists_const(foptProperties, FIELDID_ROTATION);
+ if (ptr_rotation)
+ {
+ rotation = (int)doubleModulo(toFixedPoint(*ptr_rotation), 360);
+ MSPUB_DEBUG_MSG(("Rotation value %d\n", rotation));
+ }
const unsigned *ptr_bgPxId = getIfExists_const(foptProperties, FIELDID_BG_PXID);
if (ptr_bgPxId && *ptr_bgPxId <= m_escherDelayIndices.size() && m_escherDelayIndices[*ptr_bgPxId - 1] >= 0)
{
- return boost::shared_ptr<Fill>(new ImgFill(m_escherDelayIndices[*ptr_bgPxId - 1], m_collector, fillType == TEXTURE));
+ return boost::shared_ptr<Fill>(new ImgFill(m_escherDelayIndices[*ptr_bgPxId - 1], m_collector, fillType == TEXTURE, rotation));
}
return boost::shared_ptr<Fill>();
}
diff --git a/src/lib/ShapeInfo.h b/src/lib/ShapeInfo.h
index a0d193a..8f33247 100644
--- a/src/lib/ShapeInfo.h
+++ b/src/lib/ShapeInfo.h
@@ -79,6 +79,7 @@ struct ShapeInfo
boost::optional<VerticalAlign> m_verticalAlign;
boost::optional<ColorReference> m_pictureRecolor;
boost::optional<Shadow> m_shadow;
+ boost::optional<int> m_innerRotation;
ShapeInfo() : m_type(), m_cropType(), m_imgIndex(), m_borderImgIndex(),
m_coordinates(), m_lines(), m_pageSeqNum(),
m_textId(), m_adjustValuesByIndex(), m_adjustValues(),
@@ -87,7 +88,7 @@ struct ShapeInfo
m_lineBackColor(), m_dash(), m_tableInfo(),
m_tableCellTextEnds(), m_numColumns(),
m_columnSpacing(0), m_beginArrow(), m_endArrow(),
- m_verticalAlign(), m_pictureRecolor(), m_shadow()
+ m_verticalAlign(), m_pictureRecolor(), m_shadow(), m_innerRotation()
{
}
boost::shared_ptr<const CustomShape> getCustomShape() const
More information about the Libreoffice-commits
mailing list