summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFridrich Štrba <fridrich.strba@bluewin.ch>2012-01-13 16:23:54 +0100
committerFridrich Štrba <fridrich.strba@bluewin.ch>2012-01-13 16:29:48 +0100
commit259669161b35ba9ba8255950cb6d1b4e79313d07 (patch)
tree877d1293825657c84f525777f13190ea80b54b69
parentb9d99ec0dddd87eeed7a2d87b3d73bd4630e3ff4 (diff)
Implement flips and rotations of raster images in the OdgGenerator.cxx
-rw-r--r--writerperfect/source/filter/OdgGenerator.cxx64
1 files changed, 43 insertions, 21 deletions
diff --git a/writerperfect/source/filter/OdgGenerator.cxx b/writerperfect/source/filter/OdgGenerator.cxx
index 0f085e9e8f34..5681ed5b43eb 100644
--- a/writerperfect/source/filter/OdgGenerator.cxx
+++ b/writerperfect/source/filter/OdgGenerator.cxx
@@ -948,13 +948,13 @@ void OdgGenerator::drawPath(const WPXPropertyListVector &path)
void OdgGenerator::drawGraphicObject(const ::WPXPropertyList &propList, const ::WPXBinaryData &binaryData)
{
- WPXPropertyList framePropList(propList);
-
- if (!framePropList["libwpg:mime-type"] || framePropList["libwpg:mime-type"]->getStr().len() <= 0)
+ if (!propList["libwpg:mime-type"] || propList["libwpg:mime-type"]->getStr().len() <= 0)
+ return;
+ if (!propList["svg:x"] || !propList["svg:y"] || !propList["svg:width"] || !propList["svg:height"])
return;
- bool flipX(framePropList["draw:mirror-horizontal"] && framePropList["draw:mirror-horizontal"]->getInt());
- bool flipY(framePropList["draw:mirror-vertical"] && framePropList["draw:mirror-vertical"]->getInt());
+ bool flipX(propList["draw:mirror-horizontal"] && propList["draw:mirror-horizontal"]->getInt());
+ bool flipY(propList["draw:mirror-vertical"] && propList["draw:mirror-vertical"]->getInt());
if ((flipX && !flipY) || (!flipX && flipY))
mpImpl->mxStyle.insert("style:mirror", "horizontal");
else
@@ -962,39 +962,61 @@ void OdgGenerator::drawGraphicObject(const ::WPXPropertyList &propList, const ::
mpImpl->_writeGraphicsStyle();
+ double x = propList["svg:x"]->getDouble();
+ double y = propList["svg:y"]->getDouble();
+ double height = propList["svg:height"]->getDouble();
+ double width = propList["svg:width"]->getDouble();
+
if (flipY)
{
- double x = framePropList["svg:x"]->getDouble();
- double y = framePropList["svg:y"]->getDouble();
- double height = framePropList["svg:height"]->getDouble();
- double width = framePropList["svg:width"]->getDouble();
x += width;
y += height;
width *= -1.0;
height *= -1.0;
- framePropList.insert("svg:x", x);
- framePropList.insert("svg:y", y);
- framePropList.insert("svg:height", height);
- framePropList.insert("svg:width", width);
}
+ double angle(propList["libwpg:rotate"] ? - M_PI * propList["libwpg:rotate"]->getDouble() / 180.0 : 0.0);
+ if (angle != 0.0)
+ {
+ double deltax((width*cos(angle)+height*sin(angle)-width)/2.0);
+ double deltay((-width*sin(angle)+height*cos(angle)-height)/2.0);
+ x -= deltax;
+ y -= deltay;
+ }
+
+ WPXPropertyList framePropList;
+
+ framePropList.insert("svg:x", x);
+ framePropList.insert("svg:y", y);
+ framePropList.insert("svg:height", height);
+ framePropList.insert("svg:width", width);
+
TagOpenElement *pDrawFrameElement = new TagOpenElement("draw:frame");
WPXString sValue;
sValue.sprintf("gr%i", mpImpl->miGraphicsStyleIndex-1);
pDrawFrameElement->addAttribute("draw:style-name", sValue);
- if (framePropList["svg:x"])
+ pDrawFrameElement->addAttribute("svg:height", framePropList["svg:height"]->getStr());
+ pDrawFrameElement->addAttribute("svg:width", framePropList["svg:width"]->getStr());
+
+ if (angle != 0.0)
+ {
+ framePropList.insert("libwpg:rotate", angle, WPX_GENERIC);
+ sValue.sprintf("rotate (%s) translate(%s, %s)",
+ framePropList["libwpg:rotate"]->getStr().cstr(),
+ framePropList["svg:x"]->getStr().cstr(),
+ framePropList["svg:y"]->getStr().cstr());
+ pDrawFrameElement->addAttribute("draw:transform", sValue);
+ }
+ else
+ {
pDrawFrameElement->addAttribute("svg:x", framePropList["svg:x"]->getStr());
- if (framePropList["svg:y"])
pDrawFrameElement->addAttribute("svg:y", framePropList["svg:y"]->getStr());
- if (framePropList["svg:height"])
- pDrawFrameElement->addAttribute("svg:height", framePropList["svg:height"]->getStr());
- if (framePropList["svg:width"])
- pDrawFrameElement->addAttribute("svg:width", framePropList["svg:width"]->getStr());
+ }
mpImpl->mBodyElements.push_back(pDrawFrameElement);
- if (framePropList["libwpg:mime-type"]->getStr() == "object/ole")
+ if (propList["libwpg:mime-type"]->getStr() == "object/ole")
mpImpl->mBodyElements.push_back(new TagOpenElement("draw:object-ole"));
else
mpImpl->mBodyElements.push_back(new TagOpenElement("draw:image"));
@@ -1006,7 +1028,7 @@ void OdgGenerator::drawGraphicObject(const ::WPXPropertyList &propList, const ::
mpImpl->mBodyElements.push_back(new TagCloseElement("office:binary-data"));
- if (framePropList["libwpg:mime-type"]->getStr() == "object/ole")
+ if (propList["libwpg:mime-type"]->getStr() == "object/ole")
mpImpl->mBodyElements.push_back(new TagCloseElement("draw:object-ole"));
else
mpImpl->mBodyElements.push_back(new TagCloseElement("draw:image"));