ooo-build r11705 - in trunk: . patches/src680
- From: strba svn gnome org
- To: svn-commits-list gnome org
- Subject: ooo-build r11705 - in trunk: . patches/src680
- Date: Tue, 26 Feb 2008 11:17:45 +0000 (GMT)
Author: strba
Date: Tue Feb 26 11:17:45 2008
New Revision: 11705
URL: http://svn.gnome.org/viewvc/ooo-build?rev=11705&view=rev
Log:
2008-02-26 Fridrich Strba <fridrich strba bluewin ch>
* patches/src680/svg-import-filter.diff: import circles and ellipses
(still contingent on a bug in ODG importer), import line, embedded bitmaps,
fix scaling problems with svg:d and svg:points. Some little bugfixing of the
transform attribute parsing
* patches/src680/apply: add SVGImport to the Common section, since it should
not be crashing anything and it should be cross-platform (let's see, Tor :)).
Move SDK related bits to SdkFixes section, since not everybody has the tarball
unpacked.
Modified:
trunk/ChangeLog
trunk/patches/src680/apply
trunk/patches/src680/svg-import-filter.diff
Modified: trunk/patches/src680/apply
==============================================================================
--- trunk/patches/src680/apply (original)
+++ trunk/patches/src680/apply Tue Feb 26 11:17:45 2008
@@ -14,7 +14,7 @@
Icons, Branding, CalcFixes, WriterFixes, EasterEgg, \
GStreamer, CWSBackports, WPG, Cleanups, WMF, \
Layout, VBABits, VBAObjects, CalcErrors, Store, CJK, GCJ, Lwp, \
- OOXML
+ OOXML, SVGImport
LinuxCommon : Common, EMFPlus, LayoutDialogs, Defaults, TangoIcons, FontConfigTemporaryHacks, \
FedoraFixes, LinuxOnly, NotMacOSX, SystemBits, \
@@ -28,13 +28,13 @@
VBAUntested, ArkOnlyExperimental, SharedWorksheets, \
UnUsedButNotYetRemovedFromSVN, \
PostgreSQL, SELinux, VOSremoval, Glib2, \
- UnitExperimental, SVGImport
+ UnitExperimental
# Binfilter patches: a special distro; applied only when building with binfilter
Binfilter : BFBuildBits, BFFixes
# System patches: a special distro; applied only when building with the system tarball unpacked
System : SystemBuildBits
# Sdk patches: a special distro; applied only when building with the sdk tarball unpacked
-Sdk :
+Sdk : SdkFixes
#Localize
Localize :
# Novell
@@ -293,9 +293,6 @@
[ CWSBackports == ooh680-m7 ]
cws-mav28.diff
-[ CWSBackports >= ooh680-m4 < ooh680-m8]
-cws-sdk24fix.diff
-
[ CWSBackports ]
#dialog refactor
cws-npower9.diff
@@ -1185,6 +1182,9 @@
binfilter-stl.diff, i#63770, hmth
cws-gcc430two-binfilter.diff, i#83276, pmladek
+[ SdkFixes >= ooh680-m4 < ooh680-m8]
+cws-sdk24fix.diff
+
[ SystemBuildBits ]
SectionOwner => fridrich
Modified: trunk/patches/src680/svg-import-filter.diff
==============================================================================
--- trunk/patches/src680/svg-import-filter.diff (original)
+++ trunk/patches/src680/svg-import-filter.diff Tue Feb 26 11:17:45 2008
@@ -1,5 +1,5 @@
---- filter/source/config/fragments/fcfg_drawgraphics.mk 2008-02-23 12:33:09.000000000 +0100
-+++ filter/source/config/fragments/fcfg_drawgraphics.mk 2008-02-23 08:55:34.000000000 +0100
+--- filter/source/config/fragments/fcfg_drawgraphics.mk 2008-02-26 11:23:18.000000000 +0100
++++ filter/source/config/fragments/fcfg_drawgraphics.mk 2008-02-23 12:59:42.000000000 +0100
@@ -54,6 +54,7 @@
SGF___StarOffice_Writer_SGF \
SGV___StarDraw_2_0 \
@@ -9,7 +9,7 @@
TIF___Tag_Image_File \
WMF___MS_Windows_Metafile \
--- filter/source/config/fragments/filters/SVG___Scalable_Vector_Graphics.xcu 1970-01-01 01:00:00.000000000 +0100
-+++ filter/source/config/fragments/filters/SVG___Scalable_Vector_Graphics.xcu 2008-02-23 08:55:34.000000000 +0100
++++ filter/source/config/fragments/filters/SVG___Scalable_Vector_Graphics.xcu 2008-02-23 12:59:42.000000000 +0100
@@ -0,0 +1,13 @@
+ <node oor:name="SVG - Scalable Vector Graphics" oor:op="replace">
+ <prop oor:name="Flags"><value>IMPORT ALIEN USESOPTIONS 3RDPARTYFILTER PREFERRED</value></prop>
@@ -24,8 +24,8 @@
+ <prop oor:name="TemplateName"/>
+ <prop oor:name="DocumentService"><value>com.sun.star.drawing.DrawingDocument</value></prop>
+ </node>
---- filter/source/config/fragments/types/svg_Scalable_Vector_Graphics.xcu 2008-02-23 12:33:09.000000000 +0100
-+++ filter/source/config/fragments/types/svg_Scalable_Vector_Graphics.xcu 2008-02-23 08:55:34.000000000 +0100
+--- filter/source/config/fragments/types/svg_Scalable_Vector_Graphics.xcu 2008-02-26 11:23:18.000000000 +0100
++++ filter/source/config/fragments/types/svg_Scalable_Vector_Graphics.xcu 2008-02-23 12:59:42.000000000 +0100
@@ -1,12 +1,12 @@
<node oor:name="svg_Scalable_Vector_Graphics" oor:op="replace" >
- <prop oor:name="DetectService"/>
@@ -43,8 +43,230 @@
- <prop oor:name="ClipboardFormat"/>
+ <prop oor:name="ClipboardFormat"><value>doctype:xmlns="http://www.w3.org/2000/svg"</value></prop>
</node>
---- filter/source/svg/exports.map 2008-02-23 12:33:09.000000000 +0100
-+++ filter/source/svg/exports.map 2008-02-23 08:55:34.000000000 +0100
+--- filter/source/svg/b2dellipse.cxx 1970-01-01 01:00:00.000000000 +0100
++++ filter/source/svg/b2dellipse.cxx 2008-02-23 21:35:38.000000000 +0100
+@@ -0,0 +1,139 @@
++/*************************************************************************
++ *
++ * OpenOffice.org - a multi-platform office productivity suite
++ *
++ * Author:
++ * Fridrich Strba <fridrich strba bluewin ch>
++ * Thorsten Behrens <tbehrens novell com>
++ *
++ * Copyright (C) 2008, Novell Inc.
++ *
++ * The Contents of this file are made available subject to
++ * the terms of GNU Lesser General Public License Version 2.1.
++ *
++ ************************************************************************/
++
++#include "b2dellipse.hxx"
++
++#include <osl/diagnose.h>
++
++#include <basegfx/point/b2dpoint.hxx>
++
++#include <basegfx/matrix/b2dhommatrix.hxx>
++
++#include <rtl/instance.hxx>
++
++#include <boost/scoped_ptr.hpp>
++#include <vector>
++#include <algorithm>
++
++class ImplB2DEllipse
++{
++ basegfx::B2DPoint maCenter;
++ basegfx::B2DTuple maRadius;
++
++public:
++ ImplB2DEllipse()
++ : maCenter(0.0f, 0.0f),
++ maRadius(0.0f, 0.0f)
++ {}
++
++ ImplB2DEllipse(const ImplB2DEllipse& rToBeCopied)
++ : maCenter(rToBeCopied.maCenter),
++ maRadius(rToBeCopied.maRadius)
++ {}
++
++ ImplB2DEllipse& operator=( const ImplB2DEllipse& rToBeCopied )
++ {
++ maCenter = rToBeCopied.maCenter;
++ maRadius = rToBeCopied.maRadius;
++
++ return *this;
++ }
++
++ bool isEqual(const ImplB2DEllipse& rCandidate) const
++ {
++ return (maCenter == rCandidate.maCenter)
++ && (maRadius == rCandidate.maRadius);
++ }
++
++ basegfx::B2DPoint getCenter() const
++ {
++ return maCenter;
++ }
++
++ void setCenter(const basegfx::B2DPoint& rCenter)
++ {
++ maCenter = rCenter;
++ }
++
++ basegfx::B2DTuple getRadius() const
++ {
++ return maRadius;
++ }
++
++ void setRadius(const basegfx::B2DTuple& rRadius)
++ {
++ maRadius = rRadius;
++ }
++
++
++ void transform(const basegfx::B2DHomMatrix& /* rMatrix */)
++ {
++ }
++};
++
++//////////////////////////////////////////////////////////////////////////////
++
++namespace basegfx
++{
++
++ B2DEllipse::B2DEllipse()
++ {}
++
++ B2DEllipse::B2DEllipse(const basegfx::B2DPoint& rCenter, const basegfx::B2DTuple& rRadius)
++ : maCenter(rCenter), maRadius(rRadius)
++ {
++ }
++
++ B2DEllipse::~B2DEllipse()
++ {
++ }
++
++ bool B2DEllipse::operator==(const B2DEllipse& rEllipse) const
++ {
++ return (maCenter == rEllipse.maCenter) && (maRadius == rEllipse.maRadius);
++ }
++
++ bool B2DEllipse::operator!=(const B2DEllipse& rEllipse) const
++ {
++ return !(*this == rEllipse);
++ }
++
++ basegfx::B2DPoint B2DEllipse::getB2DEllipseCenter() const
++ {
++ return maCenter;
++ }
++
++ void B2DEllipse::setB2DEllipseCenter(const basegfx::B2DPoint& rCenter)
++ {
++ maCenter = rCenter;
++ }
++
++ basegfx::B2DTuple B2DEllipse::getB2DEllipseRadius() const
++ {
++ return maRadius;
++ }
++
++ void B2DEllipse::setB2DEllipseRadius(const basegfx::B2DTuple& rRadius)
++ {
++ maRadius = rRadius;
++ }
++
++ void B2DEllipse::transform(const basegfx::B2DHomMatrix& /* rMatrix */)
++ {
++ }
++} // end of namespace basegfx
++
++//////////////////////////////////////////////////////////////////////////////
++// eof
+--- filter/source/svg/b2dellipse.hxx 1970-01-01 01:00:00.000000000 +0100
++++ filter/source/svg/b2dellipse.hxx 2008-02-23 21:35:52.000000000 +0100
+@@ -0,0 +1,77 @@
++/*************************************************************************
++ *
++ * OpenOffice.org - a multi-platform office productivity suite
++ *
++ * Author:
++ * Fridrich Strba <fridrich strba bluewin ch>
++ * Thorsten Behrens <tbehrens novell com>
++ *
++ * Copyright (C) 2008, Novell Inc.
++ *
++ * The Contents of this file are made available subject to
++ * the terms of GNU Lesser General Public License Version 2.1.
++ *
++ ************************************************************************/
++
++#ifndef _BASEGFX_B2DELLIPSE_HXX
++#define _BASEGFX_B2DELLIPSE_HXX
++
++#include <sal/types.h>
++
++#include <o3tl/cow_wrapper.hxx>
++
++#include <basegfx/point/b2dpoint.hxx>
++
++#include <basegfx/tuple/b2dtuple.hxx>
++
++#include <basegfx/vector/b2enums.hxx>
++
++//////////////////////////////////////////////////////////////////////////////
++// predeclarations
++class ImplB2DEllipse;
++
++namespace basegfx
++{
++ class B2DPoint;
++ class B2DVector;
++ class B2DHomMatrix;
++} // end of namespace basegfx
++
++//////////////////////////////////////////////////////////////////////////////
++
++namespace basegfx
++{
++ class B2DEllipse
++ {
++ private:
++ basegfx::B2DPoint maCenter;
++ basegfx::B2DTuple maRadius;
++
++ public:
++ B2DEllipse();
++ B2DEllipse(const B2DEllipse& rEllipse);
++ B2DEllipse(const basegfx::B2DPoint& rCenter, const basegfx::B2DTuple& rRadius);
++ ~B2DEllipse();
++
++ // assignment operator
++ B2DEllipse& operator=(const B2DEllipse& rEllipse);
++
++ // compare operators
++ bool operator==(const B2DEllipse& rEllipse) const;
++ bool operator!=(const B2DEllipse& rEllipse) const;
++
++ // Coordinate interface
++ basegfx::B2DPoint getB2DEllipseCenter() const;
++ void setB2DEllipseCenter(const basegfx::B2DPoint& rCenter);
++
++ basegfx::B2DTuple getB2DEllipseRadius() const;
++ void setB2DEllipseRadius(const basegfx::B2DTuple& rRadius);
++
++ // apply transformation given in matrix form to the Ellipse
++ void transform(const basegfx::B2DHomMatrix& rMatrix);
++ };
++} // end of namespace basegfx
++
++//////////////////////////////////////////////////////////////////////////////
++
++#endif /* _BASEGFX_B2DELLIPSE_HXX */
+--- filter/source/svg/exports.map 2008-02-26 11:23:18.000000000 +0100
++++ filter/source/svg/exports.map 2008-02-23 12:59:42.000000000 +0100
@@ -1,4 +1,4 @@
-PDFFILTER_1_0 {
+SVGFILTER_1_0 {
@@ -59,7 +281,7 @@
\ No newline at end of file
+};
--- filter/source/svg/gentoken.pl 1970-01-01 01:00:00.000000000 +0100
-+++ filter/source/svg/gentoken.pl 2008-02-23 08:55:34.000000000 +0100
++++ filter/source/svg/gentoken.pl 2008-02-23 12:59:42.000000000 +0100
@@ -0,0 +1,58 @@
+# from oox/source/token - should really put this into solenv
+
@@ -120,7 +342,7 @@
+close ( HXX );
+close ( GPERF );
--- filter/source/svg/gfxtypes.hxx 1970-01-01 01:00:00.000000000 +0100
-+++ filter/source/svg/gfxtypes.hxx 2008-02-23 08:55:34.000000000 +0100
++++ filter/source/svg/gfxtypes.hxx 2008-02-23 12:59:42.000000000 +0100
@@ -0,0 +1,309 @@
+/*************************************************************************
+ *
@@ -431,9 +653,9 @@
+} // namespace svgi
+
+#endif
---- filter/source/svg/makefile.mk 2008-02-23 12:33:09.000000000 +0100
-+++ filter/source/svg/makefile.mk 2008-02-23 08:55:34.000000000 +0100
-@@ -34,47 +34,46 @@
+--- filter/source/svg/makefile.mk 2008-02-26 11:23:18.000000000 +0100
++++ filter/source/svg/makefile.mk 2008-02-23 15:23:12.000000000 +0100
+@@ -34,47 +34,48 @@
#*************************************************************************
PRJ=..$/..
@@ -453,7 +675,9 @@
-SLOFILES= $(SLO)$/svguno.obj \
- $(SLO)$/svgfilter.obj \
-+SLOFILES= $(SLO)$/parserfragments.obj \
++SLOFILES= \
++ $(SLO)$/b2dellipse.obj \
++ $(SLO)$/parserfragments.obj \
$(SLO)$/svgexport.obj \
+ $(SLO)$/svgfilter.obj \
$(SLO)$/svgfontexport.obj \
@@ -464,8 +688,8 @@
+ $(SLO)$/svgimport.obj \
+ $(SLO)$/svgreader.obj \
+ $(SLO)$/svguno.obj \
-+ $(SLO)$/tokenmap.obj \
+ $(SLO)$/svgwriter.obj \
++ $(SLO)$/tokenmap.obj \
+ $(SLO)$/units.obj
# --- Library -----------------------------------
@@ -496,7 +720,7 @@
SHL1DEPN=
SHL1IMPLIB= i$(SHL1TARGET)
-@@ -87,3 +86,15 @@
+@@ -87,3 +88,15 @@
# --- Targets ----------------------------------
.INCLUDE : target.mk
@@ -513,8 +737,8 @@
+$(SLO)$/svgreader.obj : $(INCCOM)$/tokens.cxx $(INCCOM)$/tokens.hxx
+
--- filter/source/svg/parserfragments.cxx 1970-01-01 01:00:00.000000000 +0100
-+++ filter/source/svg/parserfragments.cxx 2008-02-23 08:55:34.000000000 +0100
-@@ -0,0 +1,347 @@
++++ filter/source/svg/parserfragments.cxx 2008-02-26 11:49:33.000000000 +0100
+@@ -0,0 +1,384 @@
+/*************************************************************************
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
@@ -541,9 +765,12 @@
+
+#include <boost/bind.hpp>
+#include <boost/spirit.hpp>
++#include <boost/spirit/dynamic/while.hpp>
+#include <numeric>
+#include <algorithm>
+
++#include "units.hxx"
++
+using namespace ::com::sun::star;
+
+namespace svgi
@@ -584,6 +811,7 @@
+ aCurr.rotate(fRotationAngle*M_PI/180);
+ aCurr.translate(rCurrTransform.m02,rCurrTransform.m12);
+
++ fprintf(stderr, "calcRotation - fRotationAngle - %f\n", fRotationAngle);
+ rTransforms.push_back(
+ basegfx::unotools::affineMatrixFromHomMatrix(
+ rCurrTransform,
@@ -762,10 +990,7 @@
+ // rotate(phi,[cx, cy])
+ (str_p("rotate")
+ >> '('
-+ >> real_p[assign_a(fRotationAngle)] >> ','
-+ >> real_p[assign_a(aCurrTransform.m00)] >> ','
-+ >> real_p[assign_a(aCurrTransform.m11)]
-+ >> ')')[boost::bind(&calcRotation,
++ >> real_p[assign_a(fRotationAngle)] >> ')')[boost::bind(&calcRotation,
+ boost::ref(aTransforms),
+ boost::ref(aCurrTransform),
+ boost::cref(fRotationAngle))]
@@ -860,11 +1085,47 @@
+ // End grammar
+ space_p).full;
+}
-+
++
++//////////////////////////////////////////////////////////////
++
++namespace
++{
++void appendChar( std::string& str, char character)
++{
++ str.append(1,character);
++}
++}
++
++bool parseXlinkHref( const char* sXlinkHref, std::string& data )
++{
++ using namespace ::boost::spirit;
++
++ data.erase(data.begin(),data.end());
++
++ return parse(sXlinkHref,
++ // Begin grammar
++ (
++ // the data uri
++ (str_p("data:") >> while_p(~eps_p(','))[anychar_p] >>
++ ',' >> repeat_p(1, more)[anychar_p[boost::bind(&appendChar,
++ boost::ref(data),
++ _1)]])
++#if 0
++ |
++ // the "normal" uri
++ (repeat_p(1, more)[anychar_p[boost::bind(&appendChar,
++ boost::ref(data),
++ _1)]])
++#endif
++ ),
++ // End grammar
++ space_p).full;
++}
++
+} // namespace svgi
--- filter/source/svg/parserfragments.hxx 1970-01-01 01:00:00.000000000 +0100
-+++ filter/source/svg/parserfragments.hxx 2008-02-23 08:55:34.000000000 +0100
-@@ -0,0 +1,45 @@
++++ filter/source/svg/parserfragments.hxx 2008-02-26 11:45:57.000000000 +0100
+@@ -0,0 +1,49 @@
+/*************************************************************************
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
@@ -885,6 +1146,7 @@
+
+#include <sal/config.h>
+#include <vector>
++#include <string>
+
+namespace basegfx
+{
@@ -906,12 +1168,15 @@
+
+ /// Parse given string for a list of double values, comma-delimited
+ bool parseDashArray( const char* sDashArray, std::vector<double>& rOutputVector );
++
++ /// Parse given string for the xlink attribute
++ bool parseXlinkHref( const char* xlink, std::string& data );
+
+} // namespace svgi
+
+#endif
---- filter/source/svg/svgfilter.cxx 2008-02-23 12:33:09.000000000 +0100
-+++ filter/source/svg/svgfilter.cxx 2008-02-23 08:55:34.000000000 +0100
+--- filter/source/svg/svgfilter.cxx 2008-02-26 11:23:18.000000000 +0100
++++ filter/source/svg/svgfilter.cxx 2008-02-23 12:59:42.000000000 +0100
@@ -96,11 +96,9 @@
if( pFocusWindow )
pFocusWindow->EnterWait();
@@ -975,8 +1240,8 @@
// -----------------------------------------------------------------------------
---- filter/source/svg/svgfilter.hxx 2008-02-23 12:33:09.000000000 +0100
-+++ filter/source/svg/svgfilter.hxx 2008-02-23 08:55:34.000000000 +0100
+--- filter/source/svg/svgfilter.hxx 2008-02-26 11:23:18.000000000 +0100
++++ filter/source/svg/svgfilter.hxx 2008-02-23 12:59:42.000000000 +0100
@@ -231,18 +231,11 @@
class SVGActionWriter;
class EditFieldInfo;
@@ -1023,8 +1288,8 @@
// XExporter
virtual void SAL_CALL setSourceDocument( const Reference< XComponent >& xDoc ) throw(IllegalArgumentException, RuntimeException);
---- filter/source/svg/svgimport.cxx 2008-02-23 12:33:09.000000000 +0100
-+++ filter/source/svg/svgimport.cxx 2008-02-23 08:55:34.000000000 +0100
+--- filter/source/svg/svgimport.cxx 2008-02-26 11:23:18.000000000 +0100
++++ filter/source/svg/svgimport.cxx 2008-02-23 12:59:42.000000000 +0100
@@ -37,160 +37,59 @@
#include "precompiled_filter.hxx"
@@ -1235,8 +1500,8 @@
}
--- filter/source/svg/svgreader.cxx 1970-01-01 01:00:00.000000000 +0100
-+++ filter/source/svg/svgreader.cxx 2008-02-23 11:38:26.000000000 +0100
-@@ -0,0 +1,1122 @@
++++ filter/source/svg/svgreader.cxx 2008-02-26 11:48:21.000000000 +0100
+@@ -0,0 +1,1309 @@
+/*************************************************************************
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
@@ -1261,6 +1526,7 @@
+#include "units.hxx"
+#include "parserfragments.hxx"
+#include "tokenmap.hxx"
++#include "b2dellipse.hxx"
+
+#include <rtl/math.hxx>
+#include <rtl/ref.hxx>
@@ -1284,9 +1550,6 @@
+
+#define USTR(x) rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( x ) )
+#define OASIS_STR "urn:oasis:names:tc:opendocument:xmlns:"
-+#define USER_UNIT (25.4) // FIXME? magic value ;-)
-+
-+#define VERBOSE 1
+
+using namespace ::com::sun::star;
+
@@ -1338,11 +1601,7 @@
+ mrStateMap(rStateMap),
+ mxDocumentHandler(xDocumentHandler)
+ {
-+ // fake initial parent - needs to setup a somewhat upscaling
-+ // transformation, to avoid those dreaded integer roundoff
-+ // errors in the drawing layer
+ State aState;
-+ aState.maTransform.scale(USER_UNIT,USER_UNIT);
+ aState.maCTM = aState.maTransform;
+ maParentStates.push_back(aState);
+ }
@@ -1488,11 +1747,10 @@
+
+ if( maCurrState.mnStrokeWidth != 0.0 )
+ {
-+#if 0
++#if 1
+ ::basegfx::B2DVector aVec(maCurrState.mnStrokeWidth,0);
+ aVec *= maCurrState.maCTM;
+ xAttrs->AddAttribute( USTR("svg:stroke-width"), rtl::OUString::valueOf( aVec.getLength()/1000.0 )+USTR("mm"));
-+ printf("Fridrich %f, %f\n", maCurrState.mnStrokeWidth, aVec.getLength());
+#else
+ xAttrs->AddAttribute( USTR("svg:stroke-width"), rtl::OUString::valueOf(maCurrState.mnStrokeWidth/100.0)+USTR("mm"));
+#endif
@@ -1694,6 +1952,9 @@
+ {
+ basegfx::B2DHomMatrix aTransform;
+ parseTransform(aValueUtf8.getStr(),aTransform);
++ // Ugly and temprorary hack
++ aTransform.set(0,2,convLength(aTransform.get(0,2),SVG_LENGTH_UNIT_PT));
++ aTransform.set(1,2,convLength(aTransform.get(1,2),SVG_LENGTH_UNIT_PT));
+ maCurrState.maTransform = maCurrState.maTransform*aTransform;
+ break;
+ }
@@ -1822,18 +2083,64 @@
+ const sal_Int32 nTokenId(getTokenId(xElem->getNodeName()));
+ switch(nTokenId)
+ {
-+ case XML_G:
-+
-+ break;
++ case XML_LINE:
++ {
++ // collect attributes
++ const sal_Int32 nNumElems( xAttributes->getLength() );
++ rtl::OUString sAttributeValue;
++ double x1=0.0,y1=0.0,x2=0.0,y2=0.0;
++ for( sal_Int32 i=0; i<nNumElems; ++i )
++ {
++ sAttributeValue = xAttributes->item(i)->getNodeValue();
++ const sal_Int32 nAttribId(
++ getTokenId(xAttributes->item(i)->getNodeName()));
++ switch(nAttribId)
++ {
++ case XML_X1:
++ x1= convLength(sAttributeValue);
++ break;
++ case XML_X2:
++ x2 = convLength(sAttributeValue);
++ break;
++ case XML_Y1:
++ y1 = convLength(sAttributeValue);
++ break;
++ case XML_Y2:
++ y2 = convLength(sAttributeValue);
++ break;
++ default:
++ // skip
++ break;
++ }
++ }
++
++ rtl::OUString sLinePath = USTR("M")+rtl::OUString::valueOf(x1)+USTR(",")
++ +rtl::OUString::valueOf(y1)+USTR("L")+rtl::OUString::valueOf(x2)+USTR(",")
++ +rtl::OUString::valueOf(y2);
++ basegfx::B2DPolyPolygon aPoly;
++ basegfx::tools::importFromSvgD(aPoly, sLinePath);
++
++ writePathShape(xAttrs,
++ xUnoAttrs,
++ xElem,
++ sStyleId,
++ basegfx::B2DPolyPolygon(aPoly));
++ break;
++ }
+ case XML_POLYGON:
+ case XML_POLYLINE:
+ {
-+ rtl::OUString sPoints = xElem->getAttribute(USTR("points"));
++ rtl::OUString sPoints = xElem->hasAttribute(USTR("points")) ? xElem->getAttribute(USTR("points")) : USTR("");
+ basegfx::B2DPolygon aPoly;
+ basegfx::tools::importFromSvgPoints(aPoly, sPoints);
+ // if( nTokenId == XML_POLYGON )
+ aPoly.setClosed(true);
+
++ // assuming the coordinates are in pts since they are interpreted as such by different renderers
++ basegfx::B2DHomMatrix aScale;
++ aScale.scale(2540.0f/72.0f,2540.0f/72.0f);
++ aPoly.transform(aScale);
++
+ writePathShape(xAttrs,
+ xUnoAttrs,
+ xElem,
@@ -1903,6 +2210,11 @@
+ rtl::OUString sPath = xElem->hasAttribute(USTR("d")) ? xElem->getAttribute(USTR("d")) : USTR("");
+ basegfx::B2DPolyPolygon aPoly;
+ basegfx::tools::importFromSvgD(aPoly, sPath);
++
++ // assuming the coordinates are in pts since they are interpreted as such by different renderers
++ basegfx::B2DHomMatrix aScale;
++ aScale.scale(2540.0f/72.0f,2540.0f/72.0f);
++ aPoly.transform(aScale);
+
+ writePathShape(xAttrs,
+ xUnoAttrs,
@@ -1913,12 +2225,115 @@
+ }
+ case XML_CIRCLE:
+ {
++ // collect attributes
++ const sal_Int32 nNumElems( xAttributes->getLength() );
++ rtl::OUString sAttributeValue;
++ double cx=0.0,cy=0.0,r=0.0;
++ for( sal_Int32 i=0; i<nNumElems; ++i )
++ {
++ sAttributeValue = xAttributes->item(i)->getNodeValue();
++ const sal_Int32 nAttribId(
++ getTokenId(xAttributes->item(i)->getNodeName()));
++ switch(nAttribId)
++ {
++ case XML_CX:
++ cx = convLength(sAttributeValue);
++ break;
++ case XML_CY:
++ cy = convLength(sAttributeValue);
++ break;
++ case XML_R:
++ r = convLength(sAttributeValue);
++ default:
++ // skip
++ break;
++ }
++ }
++
++ writeEllipseShape(xAttrs,
++ xUnoAttrs,
++ xElem,
++ sStyleId,
++ basegfx::B2DEllipse(basegfx::B2DPoint(cx, cy), basegfx::B2DTuple(r,r)));
+ break;
+ }
+ case XML_ELLIPSE:
+ {
++ // collect attributes
++ const sal_Int32 nNumElems( xAttributes->getLength() );
++ rtl::OUString sAttributeValue;
++ double cx=0.0,cy=0.0,rx=0.0, ry=0.0;
++ for( sal_Int32 i=0; i<nNumElems; ++i )
++ {
++ sAttributeValue = xAttributes->item(i)->getNodeValue();
++ const sal_Int32 nAttribId(
++ getTokenId(xAttributes->item(i)->getNodeName()));
++ switch(nAttribId)
++ {
++ case XML_CX:
++ cx = convLength(sAttributeValue);
++ break;
++ case XML_CY:
++ cy = convLength(sAttributeValue);
++ break;
++ case XML_RX:
++ rx = convLength(sAttributeValue);
++ break;
++ case XML_RY:
++ ry = convLength(sAttributeValue);
++ default:
++ // skip
++ break;
++ }
++ }
++
++ writeEllipseShape(xAttrs,
++ xUnoAttrs,
++ xElem,
++ sStyleId,
++ basegfx::B2DEllipse(basegfx::B2DPoint(cx, cy), basegfx::B2DTuple(rx,ry)));
+ break;
+ }
++ case XML_IMAGE:
++ {
++ // collect attributes
++ const sal_Int32 nNumElems( xAttributes->getLength() );
++ rtl::OUString sAttributeValue;
++ double x=0.0,y=0.0,width=0.0,height=0.0;
++ for( sal_Int32 i=0; i<nNumElems; ++i )
++ {
++ sAttributeValue = xAttributes->item(i)->getNodeValue();
++ const sal_Int32 nAttribId(
++ getTokenId(xAttributes->item(i)->getNodeName()));
++ switch(nAttribId)
++ {
++ case XML_X:
++ x = convLength(sAttributeValue);
++ break;
++ case XML_Y:
++ y = convLength(sAttributeValue);
++ break;
++ case XML_WIDTH:
++ width = convLength(sAttributeValue);
++ break;
++ case XML_HEIGHT:
++ height = convLength(sAttributeValue);
++ break;
++ default:
++ // skip
++ break;
++ }
++ }
++
++ rtl::OUString sValue = xElem->hasAttribute(USTR("href")) ? xElem->getAttribute(USTR("href")) : USTR("");
++ rtl::OString aValueUtf8( sValue.getStr(), sValue.getLength(), RTL_TEXTENCODING_UTF8 );
++ std::string sLinkValue;
++ parseXlinkHref(aValueUtf8.getStr(), sLinkValue);
++
++ if (!sLinkValue.empty())
++ writeBinaryData(xAttrs, xUnoAttrs, xElem, basegfx::B2DRange(x,y,x+width,y+height), sLinkValue);
++ break;
++ }
+ }
+ }
+
@@ -1932,6 +2347,35 @@
+ maParentStates.pop_back();
+ }
+
++ void writeBinaryData( rtl::Reference<SvXMLAttributeList>& xAttrs,
++ const uno::Reference<xml::sax::XAttributeList>& xUnoAttrs,
++ const uno::Reference<xml::dom::XElement>& /* xElem */,
++ const basegfx::B2DRange& rShapeBounds,
++ const std::string& data)
++ {
++ xAttrs->Clear();
++ xAttrs->AddAttribute( USTR( "svg:x" ), rtl::OUString::valueOf(rShapeBounds.getMinX()/100.0)+USTR("mm"));
++ xAttrs->AddAttribute( USTR( "svg:y" ), rtl::OUString::valueOf(rShapeBounds.getMinY()/100.0)+USTR("mm"));
++ xAttrs->AddAttribute( USTR( "svg:width" ), rtl::OUString::valueOf(rShapeBounds.getWidth()/100.0)+USTR("mm"));
++ xAttrs->AddAttribute( USTR( "svg:height" ), rtl::OUString::valueOf(rShapeBounds.getHeight()/100.0)+USTR("mm"));
++
++ mxDocumentHandler->startElement(USTR("draw:frame"),xUnoAttrs);
++
++ xAttrs->Clear();
++ mxDocumentHandler->startElement(USTR("draw:image"),xUnoAttrs);
++
++ mxDocumentHandler->startElement(USTR("office:binary-data"),xUnoAttrs);
++
++ mxDocumentHandler->characters(rtl::OUString::createFromAscii(data.c_str()));
++
++ mxDocumentHandler->endElement(USTR("office:binary-data"));
++
++ mxDocumentHandler->endElement(USTR("draw:image"));
++
++ mxDocumentHandler->endElement(USTR("draw:frame"));
++ }
++
++
+ void writeTransformAttribute(const basegfx::B2DHomMatrix rMatrix, rtl::Reference<SvXMLAttributeList>& xAttrs)
+ {
+ basegfx::B2DTuple rScale, rTranslate;
@@ -1939,17 +2383,12 @@
+ ::rtl::OUString sTransformValue;
+ if (!rMatrix.decompose(rScale, rTranslate, rRotate, rShearX))
+ return;
-+ fprintf(stderr, "Here we go!!!\n");
-+ fprintf(stderr, "rScale.getX()=%f; rScale.getY()=%f\n", rScale.getX(), rScale.getY());
-+ if (rScale.getX() != USER_UNIT || rScale.getY() != USER_UNIT)
-+ sTransformValue += USTR("scale(")+::rtl::OUString::valueOf(rScale.getX()/USER_UNIT)+USTR(" ")
-+ +::rtl::OUString::valueOf(rScale.getY()/USER_UNIT)+USTR(") ");
-+ fprintf(stderr, "rTranslate.getX()=%f, rTranslate.getY()=%f\n", rTranslate.getX(), rTranslate.getY());
++ if (rScale.getX() != 1.0 || rScale.getY() != 1.0)
++ sTransformValue += USTR("scale(")+::rtl::OUString::valueOf(rScale.getX())+USTR(" ")
++ +::rtl::OUString::valueOf(rScale.getY())+USTR(") ");
+ if (rTranslate.getX() != 0.0f || rTranslate.getY() != 0.0f)
-+ // write translate
-+ sTransformValue += USTR("translate(")+::rtl::OUString::valueOf(rTranslate.getX()*USER_UNIT/100.0f)+USTR("mm ")
-+ +::rtl::OUString::valueOf(rTranslate.getY()*USER_UNIT/100.0f)+USTR("mm) ");
-+ fprintf(stderr, "rRotate=%f\n", rRotate);
++ sTransformValue += USTR("translate(")+::rtl::OUString::valueOf(rTranslate.getX()/100.0f)+USTR("mm ")
++ +::rtl::OUString::valueOf(rTranslate.getY()/100.0f)+USTR("mm) ");
+ if (rRotate != 0.0f)
+ sTransformValue += USTR("rotate(")+::rtl::OUString::valueOf(rRotate)+USTR(") ");
+
@@ -1957,11 +2396,34 @@
+ sTransformValue += USTR("skewX(")+::rtl::OUString::valueOf(rShearX)+USTR(") ");
+ if (!sTransformValue.getLength())
+ return;
-+ fprintf(stderr, "Here we go again!!!\n");
+ xAttrs->AddAttribute( USTR("draw:transform"), sTransformValue);
-+ fprintf(stderr, "The transform string: %s\n", ::rtl::OUStringToOString(sTransformValue, RTL_TEXTENCODING_UTF8).getStr());
+ }
+
++ void writeEllipseShape( rtl::Reference<SvXMLAttributeList>& xAttrs,
++ const uno::Reference<xml::sax::XAttributeList>& xUnoAttrs,
++ const uno::Reference<xml::dom::XElement>& xElem,
++ const rtl::OUString& rStyleId,
++ const basegfx::B2DEllipse& rEllipse)
++ {
++ State aState = maCurrState;
++ rtl::OUString aStyleId(rStyleId);
++
++ xAttrs->Clear();
++
++ fprintf(stderr,"the CTM is now #2: %f %f %f %f %f %f\n",
++ maCurrState.maCTM.get(0,0),
++ maCurrState.maCTM.get(0,1),
++ maCurrState.maCTM.get(0,2),
++ maCurrState.maCTM.get(1,0),
++ maCurrState.maCTM.get(1,1),
++ maCurrState.maCTM.get(1,2));
++
++ basegfx::B2DPolygon aPoly = basegfx::tools::createPolygonFromEllipse(rEllipse.getB2DEllipseCenter(),
++ rEllipse.getB2DEllipseRadius().getX(), rEllipse.getB2DEllipseRadius().getY());
++ writePathShape(xAttrs, xUnoAttrs, xElem, rStyleId, basegfx::B2DPolyPolygon(aPoly));
++
++ }
++
+ void writePathShape( rtl::Reference<SvXMLAttributeList>& xAttrs,
+ const uno::Reference<xml::sax::XAttributeList>& xUnoAttrs,
+ const uno::Reference<xml::dom::XElement>& xElem,
@@ -1984,8 +2446,6 @@
+ maCurrState.maCTM.get(1,1),
+ maCurrState.maCTM.get(1,2));
+
-+ writeTransformAttribute(maCurrState.maCTM, xAttrs);
-+
+ if( aState.maDashArray.size() )
+ {
+ // ODF dashing is severly borked - generate filled polygon instead
@@ -2011,7 +2471,7 @@
+
+ // TODO(F2): separate out shear, rotate etc.
+ // apply transformation to polygon, to keep draw
-+ // import in 100th mm
++ // import in 100th mm
+ std::for_each(aPolys.begin(),aPolys.end(),
+ boost::bind(&basegfx::B2DPolyPolygon::transform,
+ _1,boost::cref(aState.maCTM)));
@@ -2057,6 +2517,7 @@
+
+ // TODO(F1): decompose transformation in calling code, and use
+ // transform attribute here
++ // writeTranslate(maCurrState.maCTM, xAttrs);
+ xAttrs->AddAttribute( USTR( "svg:x" ), rtl::OUString::valueOf(rShapeBounds.getMinX()/100.0)+USTR("mm"));
+ xAttrs->AddAttribute( USTR( "svg:y" ), rtl::OUString::valueOf(rShapeBounds.getMinY()/100.0)+USTR("mm"));
+ }
@@ -2259,21 +2720,12 @@
+
+ // make page viewport-width times viewport-height mm large - add
+ // 5% border at every side
-+#if 0
-+ xAttrs->AddAttribute( USTR( "fo:margin-top" ), rtl::OUString::valueOf(fViewPortHeight/2000.0)+USTR("mm"));
-+ xAttrs->AddAttribute( USTR( "fo:margin-bottom" ), rtl::OUString::valueOf(fViewPortHeight/2000.0)+USTR("mm"));
-+ xAttrs->AddAttribute( USTR( "fo:margin-left" ), rtl::OUString::valueOf(fViewPortWidth/2000.0)+USTR("mm"));
-+ xAttrs->AddAttribute( USTR( "fo:margin-right" ), rtl::OUString::valueOf(fViewPortWidth/2000.0)+USTR("mm"));
-+ xAttrs->AddAttribute( USTR( "fo:page-width" ), rtl::OUString::valueOf(11.0*fViewPortWidth/1000.0)+USTR("mm"));
-+ xAttrs->AddAttribute( USTR( "fo:page-height" ), rtl::OUString::valueOf(11.0*fViewPortHeight/1000.0)+USTR("mm"));
-+#else
+ xAttrs->AddAttribute( USTR( "fo:margin-top" ), USTR("0mm"));
+ xAttrs->AddAttribute( USTR( "fo:margin-bottom" ), USTR("0mm"));
+ xAttrs->AddAttribute( USTR( "fo:margin-left" ), USTR("0mm"));
+ xAttrs->AddAttribute( USTR( "fo:margin-right" ), USTR("0mm"));
+ xAttrs->AddAttribute( USTR( "fo:page-width" ), rtl::OUString::valueOf(fViewPortWidth/100.0)+USTR("mm"));
+ xAttrs->AddAttribute( USTR( "fo:page-height" ), rtl::OUString::valueOf(fViewPortHeight/100.0)+USTR("mm"));
-+#endif
+ xAttrs->AddAttribute( USTR( "style:print-orientation" ),
+ fViewPortWidth > fViewPortHeight ?
+ USTR("landscape") :
@@ -2360,7 +2812,7 @@
+
+} // namespace svgi
--- filter/source/svg/svgreader.hxx 1970-01-01 01:00:00.000000000 +0100
-+++ filter/source/svg/svgreader.hxx 2008-02-23 08:55:34.000000000 +0100
++++ filter/source/svg/svgreader.hxx 2008-02-23 12:59:42.000000000 +0100
@@ -0,0 +1,43 @@
+/*************************************************************************
+ *
@@ -2406,7 +2858,7 @@
+
+#endif
--- filter/source/svg/tokenmap.cxx 1970-01-01 01:00:00.000000000 +0100
-+++ filter/source/svg/tokenmap.cxx 2008-02-23 08:55:34.000000000 +0100
++++ filter/source/svg/tokenmap.cxx 2008-02-23 12:59:42.000000000 +0100
@@ -0,0 +1,62 @@
+/*************************************************************************
+ *
@@ -2471,7 +2923,7 @@
+
+} // namespace svgi
--- filter/source/svg/tokenmap.hxx 1970-01-01 01:00:00.000000000 +0100
-+++ filter/source/svg/tokenmap.hxx 2008-02-23 08:55:34.000000000 +0100
++++ filter/source/svg/tokenmap.hxx 2008-02-23 12:59:42.000000000 +0100
@@ -0,0 +1,32 @@
+/*************************************************************************
+ *
@@ -2506,7 +2958,7 @@
+
+#endif
--- filter/source/svg/tokens.txt 1970-01-01 01:00:00.000000000 +0100
-+++ filter/source/svg/tokens.txt 2008-02-23 08:55:34.000000000 +0100
++++ filter/source/svg/tokens.txt 2008-02-23 12:59:42.000000000 +0100
@@ -0,0 +1,246 @@
+#######################################
+#
@@ -2756,8 +3208,8 @@
+zoomAndPan
\ No newline at end of file
--- filter/source/svg/units.cxx 1970-01-01 01:00:00.000000000 +0100
-+++ filter/source/svg/units.cxx 2008-02-23 08:55:34.000000000 +0100
-@@ -0,0 +1,83 @@
++++ filter/source/svg/units.cxx 2008-02-26 10:52:58.000000000 +0100
+@@ -0,0 +1,146 @@
+/*************************************************************************
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
@@ -2778,12 +3230,37 @@
+#include "precompiled_filter.hxx"
+
+#include "units.hxx"
++
++#include <string.h>
+#include <rtl/ustring.hxx>
++
++#include <boost/bind.hpp>
+#include <boost/spirit.hpp>
++#include <boost/spirit/dynamic/select.hpp>
+
+namespace svgi
+{
+
++namespace
++{
++
++void appendChar( rtl::OUString& str, char character)
++{
++ str += rtl::OUString((sal_Char *)&character, 1, RTL_TEXTENCODING_UTF8);
++}
++
++void appendString( rtl::OUString& str, const char *characters)
++{
++ str += rtl::OUString((sal_Char *)characters, strlen(characters), RTL_TEXTENCODING_UTF8);
++}
++
++void appendDouble( rtl::OUString& str, double value, SvgUnit unit )
++{
++ str += rtl::OUString::valueOf(convLength(value, unit));
++}
++
++} //namespace
++
+double convLength( double value, SvgUnit unit )
+{
+ // convert svg unit to internal coordinates ("pixel"). Since the
@@ -2800,6 +3277,7 @@
+ case SVG_LENGTH_UNIT_PCT: fprintf( stderr, "TODO: legth type PCT not implemented.\n" ); return 1000.0;
+ case SVG_LENGTH_UNIT_PT: return value * 2540.0/72.0;
+ case SVG_LENGTH_UNIT_PX: return value;
++ case SVG_LENGTH_UNIT_USER: return value * 2540.0/72.0; //FIXME, not true according to the documentation
+ default: fprintf( stderr, "Unknown length type\n" );
+ }
+
@@ -2828,7 +3306,7 @@
+ | str_p("pct")[assign_a(eUnit,SVG_LENGTH_UNIT_PCT)]
+ | str_p("pt") [assign_a(eUnit,SVG_LENGTH_UNIT_PT)]
+ | str_p("px") [assign_a(eUnit,SVG_LENGTH_UNIT_PX)]
-+ | str_p("") [assign_a(eUnit,SVG_LENGTH_UNIT_PT)]
++ | str_p("") [assign_a(eUnit,SVG_LENGTH_UNIT_USER)]
+ | end_p)
+ ),
+ // End grammar
@@ -2840,10 +3318,47 @@
+ return convLength(nVal,eUnit);
+}
+
++#if 0
++void transformPathPointsString( rtl::OUString& sData )
++{
++ using namespace ::boost::spirit;
++
++ rtl::OUString sBackupString;
++ rtl::OString aUTF8 = rtl::OUStringToOString( sData,
++ RTL_TEXTENCODING_UTF8 );
++ double nVal=0.0;
++ const bool bRes = parse(aUTF8.getStr(),
++ // Begin grammar
++ (
++ lexeme_d[
++ repeat_p(1, more)[
++ (real_p[assign_a(nVal)] >> str_p("cm")[boost::bind(&appendDouble,boost::ref(sBackupString),nVal,SVG_LENGTH_UNIT_CM)])
++ | (real_p[assign_a(nVal)] >> str_p("em")[boost::bind(&appendDouble,boost::ref(sBackupString),nVal,SVG_LENGTH_UNIT_EM)])
++ | (real_p[assign_a(nVal)] >> str_p("ex")[boost::bind(&appendDouble,boost::ref(sBackupString),nVal,SVG_LENGTH_UNIT_EX)])
++ | (real_p[assign_a(nVal)] >> str_p("in")[boost::bind(&appendDouble,boost::ref(sBackupString),nVal,SVG_LENGTH_UNIT_IN)])
++ | (real_p[assign_a(nVal)] >> str_p("mm")[boost::bind(&appendDouble,boost::ref(sBackupString),nVal,SVG_LENGTH_UNIT_MM)])
++ | (real_p[assign_a(nVal)] >> str_p("pc")[boost::bind(&appendDouble,boost::ref(sBackupString),nVal,SVG_LENGTH_UNIT_PC)])
++ | (real_p[assign_a(nVal)] >> str_p("pct")[boost::bind(&appendDouble,boost::ref(sBackupString),nVal,SVG_LENGTH_UNIT_PCT)])
++ | (real_p[assign_a(nVal)] >> str_p("pt")[boost::bind(&appendDouble,boost::ref(sBackupString),nVal,SVG_LENGTH_UNIT_PT)])
++ | (real_p[assign_a(nVal)] >> str_p("px")[boost::bind(&appendDouble,boost::ref(sBackupString),nVal,SVG_LENGTH_UNIT_PX)])
++ | (real_p[boost::bind(&appendDouble,boost::ref(sBackupString),_1,SVG_LENGTH_UNIT_USER)])
++ | anychar_p[boost::bind(&appendChar, boost::ref(sBackupString),_1)]
++ ]
++ ]
++ ),
++ // End grammar
++ space_p).full;
++
++ if ( bRes )
++ sData = sBackupString;
++}
++#endif
++
++
+} // namespace svgi
--- filter/source/svg/units.hxx 1970-01-01 01:00:00.000000000 +0100
-+++ filter/source/svg/units.hxx 2008-02-23 08:55:34.000000000 +0100
-@@ -0,0 +1,43 @@
++++ filter/source/svg/units.hxx 2008-02-26 10:51:31.000000000 +0100
+@@ -0,0 +1,47 @@
+/*************************************************************************
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
@@ -2878,12 +3393,16 @@
+ SVG_LENGTH_UNIT_PC,
+ SVG_LENGTH_UNIT_PCT,
+ SVG_LENGTH_UNIT_PT,
-+ SVG_LENGTH_UNIT_PX
++ SVG_LENGTH_UNIT_PX,
++ SVG_LENGTH_UNIT_USER
+ };
+
+ /// return svg_length_t in 100th's of mm
+ double convLength( double fVal, SvgUnit unit );
+ double convLength( const rtl::OUString& sValue );
++#if 0
++ void transformPathPointsString( rtl::OUString& sData );
++#endif
+} // namespace svgi
+
+#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]