Kaydet (Commit) 3454d186 authored tarafından Armin Le Grand's avatar Armin Le Grand

i122132 Some simple extensions to exporter

üst cc9eaeaa
...@@ -370,6 +370,7 @@ namespace drawinglayer ...@@ -370,6 +370,7 @@ namespace drawinglayer
if(rB2DPolygon.count() && !mnSvtGraphicStrokeCount) if(rB2DPolygon.count() && !mnSvtGraphicStrokeCount)
{ {
basegfx::B2DPolygon aLocalPolygon(rB2DPolygon);
basegfx::BColor aStrokeColor; basegfx::BColor aStrokeColor;
basegfx::B2DPolyPolygon aStartArrow; basegfx::B2DPolyPolygon aStartArrow;
basegfx::B2DPolyPolygon aEndArrow; basegfx::B2DPolyPolygon aEndArrow;
...@@ -387,29 +388,37 @@ namespace drawinglayer ...@@ -387,29 +388,37 @@ namespace drawinglayer
// SvtGraphicStroke has NO entry for stroke color(!) // SvtGraphicStroke has NO entry for stroke color(!)
mpOutputDevice->SetLineColor(Color(aStrokeColor)); mpOutputDevice->SetLineColor(Color(aStrokeColor));
if(!rB2DPolygon.isClosed()) if(!aLocalPolygon.isClosed())
{ {
double fPolyLength(0.0); double fPolyLength(0.0);
double fStart(0.0);
double fEnd(0.0);
if(pStart && pStart->isActive()) if(pStart && pStart->isActive())
{ {
fPolyLength = basegfx::tools::getLength(rB2DPolygon); fPolyLength = basegfx::tools::getLength(aLocalPolygon);
aStartArrow = basegfx::tools::createAreaGeometryForLineStartEnd( aStartArrow = basegfx::tools::createAreaGeometryForLineStartEnd(
rB2DPolygon, pStart->getB2DPolyPolygon(), true, pStart->getWidth(), aLocalPolygon, pStart->getB2DPolyPolygon(), true, pStart->getWidth(),
fPolyLength, pStart->isCentered() ? 0.5 : 0.0, 0); fPolyLength, pStart->isCentered() ? 0.5 : 0.0, &fStart);
} }
if(pEnd && pEnd->isActive()) if(pEnd && pEnd->isActive())
{ {
if(basegfx::fTools::equalZero(fPolyLength)) if(basegfx::fTools::equalZero(fPolyLength))
{ {
fPolyLength = basegfx::tools::getLength(rB2DPolygon); fPolyLength = basegfx::tools::getLength(aLocalPolygon);
} }
aEndArrow = basegfx::tools::createAreaGeometryForLineStartEnd( aEndArrow = basegfx::tools::createAreaGeometryForLineStartEnd(
rB2DPolygon, pEnd->getB2DPolyPolygon(), false, pEnd->getWidth(), aLocalPolygon, pEnd->getB2DPolyPolygon(), false, pEnd->getWidth(),
fPolyLength, pEnd->isCentered() ? 0.5 : 0.0, 0); fPolyLength, pEnd->isCentered() ? 0.5 : 0.0, &fEnd);
}
if(0.0 != fStart || 0.0 != fEnd)
{
// build new poly, consume something from old poly
aLocalPolygon = basegfx::tools::getSnippetAbsolute(aLocalPolygon, fStart, fPolyLength - fEnd, fPolyLength);
} }
} }
...@@ -490,14 +499,12 @@ namespace drawinglayer ...@@ -490,14 +499,12 @@ namespace drawinglayer
// concept of PDF export and SvtGraphicStroke usage does simply not // concept of PDF export and SvtGraphicStroke usage does simply not
// allow handling such definitions. The only clean way would be to // allow handling such definitions. The only clean way would be to
// add the transformation to SvtGraphicStroke and to handle it there // add the transformation to SvtGraphicStroke and to handle it there
basegfx::B2DPolygon aB2DPolygon(rB2DPolygon); aLocalPolygon.transform(maCurrentTransformation);
aB2DPolygon.transform(maCurrentTransformation);
aStartArrow.transform(maCurrentTransformation); aStartArrow.transform(maCurrentTransformation);
aEndArrow.transform(maCurrentTransformation); aEndArrow.transform(maCurrentTransformation);
pRetval = new SvtGraphicStroke( pRetval = new SvtGraphicStroke(
Polygon(aB2DPolygon), Polygon(aLocalPolygon),
PolyPolygon(aStartArrow), PolyPolygon(aStartArrow),
PolyPolygon(aEndArrow), PolyPolygon(aEndArrow),
mfCurrentUnifiedTransparence, mfCurrentUnifiedTransparence,
......
...@@ -1280,6 +1280,14 @@ void SVGActionWriter::ImplWriteActions( const GDIMetaFile& rMtf, ...@@ -1280,6 +1280,14 @@ void SVGActionWriter::ImplWriteActions( const GDIMetaFile& rMtf,
if( rPoly.GetSize() ) if( rPoly.GetSize() )
{ {
const LineInfo& rLineInfo = pA->GetLineInfo();
if(rLineInfo.GetWidth())
{
sal_Int32 nStrokeWidth = ImplMap(rLineInfo.GetWidth());
mrExport.AddAttribute( XML_NAMESPACE_NONE, aXMLAttrStrokeWidth, ::rtl::OUString::valueOf( nStrokeWidth ) );
}
mpContext->AddPaintAttr( mpVDev->GetLineColor(), Color( COL_TRANSPARENT ) ); mpContext->AddPaintAttr( mpVDev->GetLineColor(), Color( COL_TRANSPARENT ) );
ImplWritePolyPolygon( rPoly, sal_True ); ImplWritePolyPolygon( rPoly, sal_True );
} }
...@@ -1550,83 +1558,109 @@ void SVGActionWriter::ImplWriteActions( const GDIMetaFile& rMtf, ...@@ -1550,83 +1558,109 @@ void SVGActionWriter::ImplWriteActions( const GDIMetaFile& rMtf,
aStroke.getEndArrow( aEndArrow ); aStroke.getEndArrow( aEndArrow );
// Currently no support for strokes with start/end arrow(s) // Currently no support for strokes with start/end arrow(s)
sal_Bool bSkip = ( !aStartArrow.Count() && !aEndArrow.Count() ); // added that support
Polygon aPoly;
if( bSkip ) aStroke.getPath(aPoly);
if(mapCurShape.get())
{ {
Polygon aPoly; if(1 != mapCurShape->maShapePolyPoly.Count()
|| !mapCurShape->maShapePolyPoly[0].IsEqual(aPoly))
{
// this path action is not covering the same path than the already existing
// fill polypolygon, so write out the fill polygon
ImplWriteShape( *mapCurShape );
mapCurShape.reset();
}
}
aStroke.getPath(aPoly); if( !mapCurShape.get() )
{
if(mapCurShape.get()) mapCurShape.reset( new SVGShapeDescriptor );
if( pElementId )
{ {
if(1 != mapCurShape->maShapePolyPoly.Count() mapCurShape->maId = *pElementId + B2UCONST("_") + ::rtl::OUString::valueOf(nEntryCount++);
|| !mapCurShape->maShapePolyPoly[0].IsEqual(aPoly))
{
// this path action is not covering the same path than the already existing
// fill polypolygon, so write out the fill polygon
ImplWriteShape( *mapCurShape );
mapCurShape.reset();
}
} }
if( !mapCurShape.get() ) mapCurShape->maShapePolyPoly = aPoly;
{ }
mapCurShape.reset( new SVGShapeDescriptor ); mapCurShape->maShapeLineColor = mpVDev->GetLineColor();
mapCurShape->maShapeLineColor.SetTransparency( (sal_uInt8) FRound( aStroke.getTransparency() * 255.0 ) );
mapCurShape->mnStrokeWidth = FRound( aStroke.getStrokeWidth() );
aStroke.getDashArray( mapCurShape->maDashArray );
if( pElementId ) // added support for LineJoin
{ switch(aStroke.getJoinType())
mapCurShape->maId = *pElementId + B2UCONST("_") + ::rtl::OUString::valueOf(nEntryCount++); {
} default: /* SvtGraphicStroke::joinMiter, SvtGraphicStroke::joinNone */
{
mapCurShape->maLineJoin = basegfx::B2DLINEJOIN_MITER;
break;
}
case SvtGraphicStroke::joinRound:
{
mapCurShape->maLineJoin = basegfx::B2DLINEJOIN_ROUND;
break;
}
case SvtGraphicStroke::joinBevel:
{
mapCurShape->maLineJoin = basegfx::B2DLINEJOIN_BEVEL;
break;
}
}
mapCurShape->maShapePolyPoly = aPoly; // added support for LineCap
switch(aStroke.getCapType())
{
default: /* SvtGraphicStroke::capButt */
{
mapCurShape->maLineCap = com::sun::star::drawing::LineCap_BUTT;
break;
}
case SvtGraphicStroke::capRound:
{
mapCurShape->maLineCap = com::sun::star::drawing::LineCap_ROUND;
break;
}
case SvtGraphicStroke::capSquare:
{
mapCurShape->maLineCap = com::sun::star::drawing::LineCap_SQUARE;
break;
} }
}
if(mapCurShape.get() &&(aStartArrow.Count() || aEndArrow.Count()))
{
ImplWriteShape( *mapCurShape );
mapCurShape->maShapeLineColor = mpVDev->GetLineColor(); mapCurShape->maShapeFillColor = mapCurShape->maShapeLineColor;
mapCurShape->maShapeLineColor.SetTransparency( (sal_uInt8) FRound( aStroke.getTransparency() * 255.0 ) ); mapCurShape->maShapeLineColor = Color(COL_TRANSPARENT);
mapCurShape->mnStrokeWidth = FRound( aStroke.getStrokeWidth() ); mapCurShape->mnStrokeWidth = 0;
aStroke.getDashArray( mapCurShape->maDashArray ); mapCurShape->maDashArray.clear();
mapCurShape->maLineJoin = basegfx::B2DLINEJOIN_MITER;
mapCurShape->maLineCap = com::sun::star::drawing::LineCap_BUTT;
// added support for LineJoin if(aStartArrow.Count())
switch(aStroke.getJoinType())
{ {
default: /* SvtGraphicStroke::joinMiter, SvtGraphicStroke::joinNone */ mapCurShape->maShapePolyPoly = aStartArrow;
{ mapCurShape->maId = *pElementId + B2UCONST("_") + ::rtl::OUString::valueOf(nEntryCount++);
mapCurShape->maLineJoin = basegfx::B2DLINEJOIN_MITER;
break; ImplWriteShape( *mapCurShape );
}
case SvtGraphicStroke::joinRound:
{
mapCurShape->maLineJoin = basegfx::B2DLINEJOIN_ROUND;
break;
}
case SvtGraphicStroke::joinBevel:
{
mapCurShape->maLineJoin = basegfx::B2DLINEJOIN_BEVEL;
break;
}
} }
// added support for LineCap if(aEndArrow.Count())
switch(aStroke.getCapType())
{ {
default: /* SvtGraphicStroke::capButt */ mapCurShape->maShapePolyPoly = aEndArrow;
{ mapCurShape->maId = *pElementId + B2UCONST("_") + ::rtl::OUString::valueOf(nEntryCount++);
mapCurShape->maLineCap = com::sun::star::drawing::LineCap_BUTT;
break; ImplWriteShape( *mapCurShape );
}
case SvtGraphicStroke::capRound:
{
mapCurShape->maLineCap = com::sun::star::drawing::LineCap_ROUND;
break;
}
case SvtGraphicStroke::capSquare:
{
mapCurShape->maLineCap = com::sun::star::drawing::LineCap_SQUARE;
break;
}
} }
mapCurShape.reset();
} }
// write open shape in every case // write open shape in every case
...@@ -1637,6 +1671,8 @@ void SVGActionWriter::ImplWriteActions( const GDIMetaFile& rMtf, ...@@ -1637,6 +1671,8 @@ void SVGActionWriter::ImplWriteActions( const GDIMetaFile& rMtf,
} }
// skip rest of comment // skip rest of comment
sal_Bool bSkip = true;
while( bSkip && ( ++nCurAction < nCount ) ) while( bSkip && ( ++nCurAction < nCount ) )
{ {
pAction = rMtf.GetAction( nCurAction ); pAction = rMtf.GetAction( nCurAction );
......
...@@ -4104,20 +4104,34 @@ void MetaCommentAction::Move( long nXMove, long nYMove ) ...@@ -4104,20 +4104,34 @@ void MetaCommentAction::Move( long nXMove, long nYMove )
{ {
SvtGraphicStroke aStroke; SvtGraphicStroke aStroke;
aMemStm >> aStroke; aMemStm >> aStroke;
Polygon aPath; Polygon aPath;
aStroke.getPath( aPath ); aStroke.getPath( aPath );
aPath.Move( nXMove, nYMove ); aPath.Move( nXMove, nYMove );
aStroke.setPath( aPath ); aStroke.setPath( aPath );
PolyPolygon aStartArrow;
aStroke.getStartArrow(aStartArrow);
aStartArrow.Move(nXMove, nYMove);
aStroke.setStartArrow(aStartArrow);
PolyPolygon aEndArrow;
aStroke.getEndArrow(aEndArrow);
aEndArrow.Move(nXMove, nYMove);
aStroke.setEndArrow(aEndArrow);
aDest << aStroke; aDest << aStroke;
} }
else else
{ {
SvtGraphicFill aFill; SvtGraphicFill aFill;
aMemStm >> aFill; aMemStm >> aFill;
PolyPolygon aPath; PolyPolygon aPath;
aFill.getPath( aPath ); aFill.getPath( aPath );
aPath.Move( nXMove, nYMove ); aPath.Move( nXMove, nYMove );
aFill.setPath( aPath ); aFill.setPath( aPath );
aDest << aFill; aDest << aFill;
} }
delete[] mpData; delete[] mpData;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment