You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2011/12/06 18:53:55 UTC
svn commit: r1211055 - in /incubator/ooo/branches/alg/svgreplacement/main:
svx/source/svdraw/svdograf.cxx svx/source/svdraw/svdorect.cxx
vcl/source/gdi/gdimtf.cxx
Author: alg
Date: Tue Dec 6 17:53:55 2011
New Revision: 1211055
URL: http://svn.apache.org/viewvc?rev=1211055&view=rev
Log:
svg: Adapted DoConvertToPolyObj for Svg-using SdrGraphObjs to make most processings work, e.g. conversions and logical operations. Also fixed a bottleneck in CRC number calculation for MetaFiles
Modified:
incubator/ooo/branches/alg/svgreplacement/main/svx/source/svdraw/svdograf.cxx
incubator/ooo/branches/alg/svgreplacement/main/svx/source/svdraw/svdorect.cxx
incubator/ooo/branches/alg/svgreplacement/main/vcl/source/gdi/gdimtf.cxx
Modified: incubator/ooo/branches/alg/svgreplacement/main/svx/source/svdraw/svdograf.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svx/source/svdraw/svdograf.cxx?rev=1211055&r1=1211054&r2=1211055&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svx/source/svdraw/svdograf.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svx/source/svdraw/svdograf.cxx Tue Dec 6 17:53:55 2011
@@ -1091,11 +1091,67 @@ const GDIMetaFile* SdrGrafObj::GetGDIMet
// -----------------------------------------------------------------------------
+#include <drawinglayer/processor2d/vclmetafileprocessor2d.hxx>
+#include <basegfx/matrix/b2dhommatrixtools.hxx>
+
SdrObject* SdrGrafObj::DoConvertToPolyObj(sal_Bool bBezier, bool bAddText) const
{
SdrObject* pRetval = NULL;
+ GraphicType aGraphicType(GetGraphicType());
+ GDIMetaFile aMtf;
+
+ if(GRAPHIC_BITMAP == aGraphicType)
+ {
+ const Graphic& rGraphic = GetGraphic();
+
+ if(rGraphic.getSvgData().get())
+ {
+ // Embedded Svg
+ // There is currently no helper to create SdrObjects from primitives (even if I'm thinking
+ // about writing one for some time). To get the roundtrip to SdrObjects it is necessary to
+ // use the old converter path over the MetaFile mechanism. Create Metafile from Svg
+ // primitives here pretty directly
+ VirtualDevice aOut;
+ Size aDummySize(2, 2);
+
+ aOut.SetOutputSizePixel(aDummySize);
+ aOut.EnableOutput(false);
+ aMtf.Clear();
+ aMtf.Record(&aOut);
+
+ // map to (0,0,objectsize)
+ const basegfx::B2DRange& rRange = rGraphic.getSvgData()->getRange();
+ basegfx::B2DHomMatrix aObjectMatrix(basegfx::tools::createTranslateB2DHomMatrix(-rRange.getMinX(), -rRange.getMinY()));
+
+ aObjectMatrix.scale(
+ aRect.getWidth() / (basegfx::fTools::equalZero(rRange.getWidth()) ? 1.0 : rRange.getWidth()),
+ aRect.getHeight() / (basegfx::fTools::equalZero(rRange.getHeight()) ? 1.0 : rRange.getHeight()));
+
+ const drawinglayer::geometry::ViewInformation2D aViewInformation2D(
+ aObjectMatrix,
+ basegfx::B2DHomMatrix(),
+ basegfx::B2DRange(),
+ 0,
+ 0.0,
+ com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >());
+ drawinglayer::processor2d::VclMetafileProcessor2D aProcessor(aViewInformation2D, aOut);
+
+ aProcessor.process(rGraphic.getSvgData()->getPrimitive2DSequence());
+
+ aMtf.Stop();
+ aMtf.WindStart();
+ aMtf.SetPrefMapMode(rGraphic.GetPrefMapMode());
+ aMtf.SetPrefSize(rGraphic.GetPrefSize());
+
+ aGraphicType = GRAPHIC_GDIMETAFILE;
+ }
+ }
+ else if(GRAPHIC_GDIMETAFILE == aGraphicType)
+ {
+ aMtf = GetTransformedGraphic(SDRGRAFOBJ_TRANSFORMATTR_COLOR|SDRGRAFOBJ_TRANSFORMATTR_MIRROR).GetGDIMetaFile();
+ }
- switch( GetGraphicType() )
+ switch(aGraphicType)
{
case GRAPHIC_GDIMETAFILE:
{
@@ -1105,14 +1161,12 @@ SdrObject* SdrGrafObj::DoConvertToPolyOb
aFilter.SetLayer(GetLayer());
SdrObjGroup* pGrp = new SdrObjGroup();
- sal_uInt32 nInsAnz = aFilter.DoImport(GetTransformedGraphic(
- SDRGRAFOBJ_TRANSFORMATTR_COLOR|SDRGRAFOBJ_TRANSFORMATTR_MIRROR).GetGDIMetaFile(),
- *pGrp->GetSubList(), 0);
+ sal_uInt32 nInsAnz = aFilter.DoImport(aMtf, *pGrp->GetSubList(), 0);
if(nInsAnz)
{
{
- // copy transformation
+ // copy transformation
GeoStat aGeoStat(GetGeoStat());
if(aGeoStat.nShearWink)
Modified: incubator/ooo/branches/alg/svgreplacement/main/svx/source/svdraw/svdorect.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svx/source/svdraw/svdorect.cxx?rev=1211055&r1=1211054&r2=1211055&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svx/source/svdraw/svdorect.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svx/source/svdraw/svdorect.cxx Tue Dec 6 17:53:55 2011
@@ -591,7 +591,10 @@ SdrObject* SdrRectObj::DoConvertToPolyOb
aPolyPolygon.removeDoublePoints();
SdrObject* pRet = 0L;
- if(!IsTextFrame() || HasFill() || HasLine())
+ // small correction: Do not create something when no fill and no line. To
+ // be sure to not damage something with non-text frames, do this only
+ // when used with bAddText==false from other converters
+ if((bAddText && !IsTextFrame()) || HasFill() || HasLine())
{
pRet = ImpConvertMakeObj(aPolyPolygon, sal_True, bBezier);
}
Modified: incubator/ooo/branches/alg/svgreplacement/main/vcl/source/gdi/gdimtf.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/vcl/source/gdi/gdimtf.cxx?rev=1211055&r1=1211054&r2=1211055&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/vcl/source/gdi/gdimtf.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/vcl/source/gdi/gdimtf.cxx Tue Dec 6 17:53:55 2011
@@ -37,6 +37,7 @@
#include <vcl/virdev.hxx>
#include <vcl/gdimtf.hxx>
#include <vcl/graphictools.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
// -----------
// - Defines -
@@ -2713,6 +2714,73 @@ sal_uLong GDIMetaFile::GetChecksum() con
}
break;
+ case META_CLIPREGION_ACTION :
+ {
+ MetaClipRegionAction* pAct = dynamic_cast< MetaClipRegionAction* >(pAction);
+ const Region& rRegion = pAct->GetRegion();
+
+ if(rRegion.HasPolyPolygon())
+ {
+ // It has shown that this is a possible bottleneck for checksum calculation.
+ // In worst case a very expensive RegionHandle representation gets created.
+ // In this case it's cheaper to use the PolyPolygon
+ const basegfx::B2DPolyPolygon aPolyPolygon(rRegion.GetB2DPolyPolygon());
+ const sal_uInt32 nPolyCount(aPolyPolygon.count());
+ SVBT64 aSVBT64;
+
+ for(sal_uInt32 a(0); a < nPolyCount; a++)
+ {
+ const basegfx::B2DPolygon aPolygon(aPolyPolygon.getB2DPolygon(a));
+ const sal_uInt32 nPointCount(aPolygon.count());
+ const bool bControl(aPolygon.areControlPointsUsed());
+
+ for(sal_uInt32 b(0); b < nPointCount; b++)
+ {
+ const basegfx::B2DPoint aPoint(aPolygon.getB2DPoint(b));
+
+ DoubleToSVBT64(aPoint.getX(), aSVBT64);
+ nCrc = rtl_crc32(nCrc, aSVBT64, 8);
+ DoubleToSVBT64(aPoint.getY(), aSVBT64);
+ nCrc = rtl_crc32(nCrc, aSVBT64, 8);
+
+ if(bControl)
+ {
+ if(aPolygon.isPrevControlPointUsed(b))
+ {
+ const basegfx::B2DPoint aCtrl(aPolygon.getPrevControlPoint(b));
+
+ DoubleToSVBT64(aCtrl.getX(), aSVBT64);
+ nCrc = rtl_crc32(nCrc, aSVBT64, 8);
+ DoubleToSVBT64(aCtrl.getY(), aSVBT64);
+ nCrc = rtl_crc32(nCrc, aSVBT64, 8);
+ }
+
+ if(aPolygon.isNextControlPointUsed(b))
+ {
+ const basegfx::B2DPoint aCtrl(aPolygon.getNextControlPoint(b));
+
+ DoubleToSVBT64(aCtrl.getX(), aSVBT64);
+ nCrc = rtl_crc32(nCrc, aSVBT64, 8);
+ DoubleToSVBT64(aCtrl.getY(), aSVBT64);
+ nCrc = rtl_crc32(nCrc, aSVBT64, 8);
+ }
+ }
+ }
+ }
+
+ SVBT8 aSVBT8;
+ ByteToSVBT8((sal_uInt8)pAct->IsClipping(), aSVBT8);
+ nCrc = rtl_crc32(nCrc, aSVBT8, 1);
+ }
+ else
+ {
+ pAction->Write( aMemStm, &aWriteData );
+ nCrc = rtl_crc32( nCrc, aMemStm.GetData(), aMemStm.Tell() );
+ aMemStm.Seek( 0 );
+ }
+ }
+ break;
+
default:
{
pAction->Write( aMemStm, &aWriteData );