Modified: incubator/ooo/trunk/main/vcl/source/gdi/lineinfo.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/vcl/source/gdi/lineinfo.cxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/vcl/source/gdi/lineinfo.cxx (original) +++ incubator/ooo/trunk/main/vcl/source/gdi/lineinfo.cxx Tue Jan 17 17:54:04 2012 @@ -47,7 +47,8 @@ ImplLineInfo::ImplLineInfo() : mnDotCount ( 0 ), mnDotLen ( 0 ), mnDistance ( 0 ), - meLineJoin ( basegfx::B2DLINEJOIN_ROUND ) + meLineJoin ( basegfx::B2DLINEJOIN_ROUND ), + meLineCap ( com::sun::star::drawing::LineCap_BUTT ) { } @@ -62,7 +63,8 @@ ImplLineInfo::ImplLineInfo( const ImplLi mnDotCount ( rImplLineInfo.mnDotCount ), mnDotLen ( rImplLineInfo.mnDotLen ), mnDistance ( rImplLineInfo.mnDistance ), - meLineJoin ( rImplLineInfo.meLineJoin ) + meLineJoin ( rImplLineInfo.meLineJoin ), + meLineCap ( rImplLineInfo.meLineCap ) { } @@ -77,7 +79,8 @@ inline bool ImplLineInfo::operator==( co && mnDotCount == rB.mnDotCount && mnDotLen == rB.mnDotLen && mnDistance == rB.mnDistance - && meLineJoin == rB.meLineJoin); + && meLineJoin == rB.meLineJoin + && meLineCap == rB.meLineCap); } // ------------ @@ -229,6 +232,28 @@ void LineInfo::SetLineJoin(basegfx::B2DL // ----------------------------------------------------------------------- +void LineInfo::SetLineCap(com::sun::star::drawing::LineCap eLineCap) +{ + DBG_CHKTHIS( LineInfo, NULL ); + + if(eLineCap != mpImplLineInfo->meLineCap) + { + ImplMakeUnique(); + mpImplLineInfo->meLineCap = eLineCap; + } +} + +// ----------------------------------------------------------------------- + +sal_Bool LineInfo::IsDefault() const +{ + return( !mpImplLineInfo->mnWidth + && ( LINE_SOLID == mpImplLineInfo->meStyle ) + && ( com::sun::star::drawing::LineCap_BUTT == mpImplLineInfo->meLineCap)); +} + +// ----------------------------------------------------------------------- + SvStream& operator>>( SvStream& rIStm, ImplLineInfo& rImplLineInfo ) { VersionCompat aCompat( rIStm, STREAM_READ ); @@ -251,6 +276,12 @@ SvStream& operator>>( SvStream& rIStm, I rIStm >> nTmp16; rImplLineInfo.meLineJoin = (basegfx::B2DLineJoin) nTmp16; } + if( aCompat.GetVersion() >= 4 ) + { + // version 4 + rIStm >> nTmp16; rImplLineInfo.meLineCap = (com::sun::star::drawing::LineCap) nTmp16; + } + return rIStm; } @@ -258,7 +289,7 @@ SvStream& operator>>( SvStream& rIStm, I SvStream& operator<<( SvStream& rOStm, const ImplLineInfo& rImplLineInfo ) { - VersionCompat aCompat( rOStm, STREAM_WRITE, 3 ); + VersionCompat aCompat( rOStm, STREAM_WRITE, 4 ); // version 1 rOStm << (sal_uInt16) rImplLineInfo.meStyle << rImplLineInfo.mnWidth; @@ -271,6 +302,9 @@ SvStream& operator<<( SvStream& rOStm, c // since version3 rOStm << (sal_uInt16) rImplLineInfo.meLineJoin; + // since version4 + rOStm << (sal_uInt16) rImplLineInfo.meLineCap; + return rOStm; } @@ -354,7 +388,8 @@ void LineInfo::applyToB2DPolyPolygon( o_rFillPolyPolygon.append(basegfx::tools::createAreaGeometry( io_rLinePolyPolygon.getB2DPolygon(a), fHalfLineWidth, - GetLineJoin())); + GetLineJoin(), + GetLineCap())); } io_rLinePolyPolygon.clear();
Modified: incubator/ooo/trunk/main/vcl/source/gdi/outdev.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/vcl/source/gdi/outdev.cxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/vcl/source/gdi/outdev.cxx (original) +++ incubator/ooo/trunk/main/vcl/source/gdi/outdev.cxx Tue Jan 17 17:54:04 2012 @@ -1509,7 +1509,7 @@ void OutputDevice::DrawLine( const Point aB2DPolyLine = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolyLine); } - if( mpGraphics->DrawPolyLine( aB2DPolyLine, 0.0, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this)) + if( mpGraphics->DrawPolyLine( aB2DPolyLine, 0.0, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, com::sun::star::drawing::LineCap_BUTT, this)) { return; } @@ -1596,7 +1596,8 @@ void OutputDevice::impPaintLineGeometryW aFillPolyPolygon.append(basegfx::tools::createAreaGeometry( aLinePolyPolygon.getB2DPolygon(a), fHalfLineWidth, - rInfo.GetLineJoin())); + rInfo.GetLineJoin(), + rInfo.GetLineCap())); } aLinePolyPolygon.clear(); @@ -1614,7 +1615,7 @@ void OutputDevice::impPaintLineGeometryW if(bTryAA) { - bDone = mpGraphics->DrawPolyLine( aCandidate, 0.0, basegfx::B2DVector(1.0,1.0), basegfx::B2DLINEJOIN_NONE, this); + bDone = mpGraphics->DrawPolyLine( aCandidate, 0.0, basegfx::B2DVector(1.0,1.0), basegfx::B2DLINEJOIN_NONE, com::sun::star::drawing::LineCap_BUTT, this); } if(!bDone) @@ -1646,7 +1647,10 @@ void OutputDevice::impPaintLineGeometryW { for(sal_uInt32 a(0); a < aFillPolyPolygon.count(); a++) { - const Polygon aPolygon(aFillPolyPolygon.getB2DPolygon(a)); + Polygon aPolygon(aFillPolyPolygon.getB2DPolygon(a)); + + // need to subdivide, mpGraphics->DrawPolygon ignores curves + aPolygon.AdaptiveSubdivide(aPolygon); mpGraphics->DrawPolygon(aPolygon.GetSize(), (const SalPoint*)aPolygon.GetConstPointAry(), this); } } @@ -1789,7 +1793,7 @@ void OutputDevice::DrawPolyLine( const P && IsLineColor()); // use b2dpolygon drawing if possible - if(bTryAA && ImpTryDrawPolyLineDirect(rPoly.getB2DPolygon(), 0.0, basegfx::B2DLINEJOIN_NONE)) + if(bTryAA && ImpTryDrawPolyLineDirect(rPoly.getB2DPolygon())) { basegfx::B2DPolygon aB2DPolyLine(rPoly.getB2DPolygon()); const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation(); @@ -1803,7 +1807,7 @@ void OutputDevice::DrawPolyLine( const P aB2DPolyLine = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolyLine); } - if(mpGraphics->DrawPolyLine( aB2DPolyLine, 0.0, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this)) + if(mpGraphics->DrawPolyLine( aB2DPolyLine, 0.0, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, com::sun::star::drawing::LineCap_BUTT, this)) { return; } @@ -1851,7 +1855,7 @@ void OutputDevice::DrawPolyLine( const P if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && LINE_SOLID == rLineInfo.GetStyle()) { - DrawPolyLine( rPoly.getB2DPolygon(), (double)rLineInfo.GetWidth(), rLineInfo.GetLineJoin()); + DrawPolyLine( rPoly.getB2DPolygon(), (double)rLineInfo.GetWidth(), rLineInfo.GetLineJoin(), rLineInfo.GetLineCap()); return; } @@ -1983,7 +1987,13 @@ void OutputDevice::DrawPolygon( const Po aB2DPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolygon); } - bSuccess = mpGraphics->DrawPolyLine( aB2DPolygon, 0.0, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this); + bSuccess = mpGraphics->DrawPolyLine( + aB2DPolygon, + 0.0, + aB2DLineWidth, + basegfx::B2DLINEJOIN_NONE, + com::sun::star::drawing::LineCap_BUTT, + this); } if(bSuccess) @@ -2075,7 +2085,13 @@ void OutputDevice::DrawPolyPolygon( cons for(sal_uInt32 a(0); bSuccess && a < aB2DPolyPolygon.count(); a++) { - bSuccess = mpGraphics->DrawPolyLine( aB2DPolyPolygon.getB2DPolygon(a), 0.0, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this); + bSuccess = mpGraphics->DrawPolyLine( + aB2DPolyPolygon.getB2DPolygon(a), + 0.0, + aB2DLineWidth, + basegfx::B2DLINEJOIN_NONE, + com::sun::star::drawing::LineCap_BUTT, + this); } } @@ -2198,7 +2214,13 @@ void OutputDevice::ImpDrawPolyPolygonWit for(sal_uInt32 a(0);bSuccess && a < aB2DPolyPolygon.count(); a++) { - bSuccess = mpGraphics->DrawPolyLine( aB2DPolyPolygon.getB2DPolygon(a), 0.0, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this); + bSuccess = mpGraphics->DrawPolyLine( + aB2DPolyPolygon.getB2DPolygon(a), + 0.0, + aB2DLineWidth, + basegfx::B2DLINEJOIN_NONE, + com::sun::star::drawing::LineCap_BUTT, + this); } } @@ -2219,7 +2241,8 @@ void OutputDevice::ImpDrawPolyPolygonWit bool OutputDevice::ImpTryDrawPolyLineDirect( const basegfx::B2DPolygon& rB2DPolygon, double fLineWidth, - basegfx::B2DLineJoin eLineJoin) + basegfx::B2DLineJoin eLineJoin, + com::sun::star::drawing::LineCap eLineCap) { const basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation(); basegfx::B2DVector aB2DLineWidth(1.0, 1.0); @@ -2245,17 +2268,25 @@ bool OutputDevice::ImpTryDrawPolyLineDir } // draw the polyline - return mpGraphics->DrawPolyLine( aB2DPolygon, 0.0, aB2DLineWidth, eLineJoin, this); + return mpGraphics->DrawPolyLine( + aB2DPolygon, + 0.0, + aB2DLineWidth, + eLineJoin, + eLineCap, + this); } void OutputDevice::DrawPolyLine( const basegfx::B2DPolygon& rB2DPolygon, double fLineWidth, - basegfx::B2DLineJoin eLineJoin) + basegfx::B2DLineJoin eLineJoin, + com::sun::star::drawing::LineCap eLineCap) { DBG_TRACE( "OutputDevice::DrawPolyLine(B2D&)" ); DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice ); (void)eLineJoin; // ATM used in UNX, but not in WNT, access it for warning-free + (void)eLineCap; #if 0 // MetaB2DPolyLineAction is not implemented yet: // according to AW adding it is very dangerous since there is a lot @@ -2297,7 +2328,7 @@ void OutputDevice::DrawPolyLine( && IsLineColor()); // use b2dpolygon drawing if possible - if(bTryAA && ImpTryDrawPolyLineDirect(rB2DPolygon, fLineWidth, eLineJoin)) + if(bTryAA && ImpTryDrawPolyLineDirect(rB2DPolygon, fLineWidth, eLineJoin, eLineCap)) { return; } @@ -2311,9 +2342,12 @@ void OutputDevice::DrawPolyLine( && rB2DPolygon.count() <= 1000) { const double fHalfLineWidth((fLineWidth * 0.5) + 0.5); - const basegfx::B2DPolyPolygon aAreaPolyPolygon(basegfx::tools::createAreaGeometry( - rB2DPolygon, fHalfLineWidth, eLineJoin)); - + const basegfx::B2DPolyPolygon aAreaPolyPolygon( + basegfx::tools::createAreaGeometry( + rB2DPolygon, + fHalfLineWidth, + eLineJoin, + eLineCap)); const Color aOldLineColor(maLineColor); const Color aOldFillColor(maFillColor); @@ -2340,7 +2374,7 @@ void OutputDevice::DrawPolyLine( // to avoid optical gaps for(sal_uInt32 a(0); a < aAreaPolyPolygon.count(); a++) { - ImpTryDrawPolyLineDirect(aAreaPolyPolygon.getB2DPolygon(a), 0.0, basegfx::B2DLINEJOIN_NONE); + ImpTryDrawPolyLineDirect(aAreaPolyPolygon.getB2DPolygon(a)); } } } Modified: incubator/ooo/trunk/main/vcl/source/gdi/outdev6.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/vcl/source/gdi/outdev6.cxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/vcl/source/gdi/outdev6.cxx (original) +++ incubator/ooo/trunk/main/vcl/source/gdi/outdev6.cxx Tue Jan 17 17:54:04 2012 @@ -200,7 +200,7 @@ void OutputDevice::DrawTransparent( cons for( int nPolyIdx = 0; nPolyIdx < nPolyCount; ++nPolyIdx ) { const ::basegfx::B2DPolygon aOnePoly = aB2DPolyPolygon.getB2DPolygon( nPolyIdx ); - mpGraphics->DrawPolyLine( aOnePoly, fTransparency, aHairlineWidth, ::basegfx::B2DLINEJOIN_NONE, this ); + mpGraphics->DrawPolyLine( aOnePoly, fTransparency, aHairlineWidth, ::basegfx::B2DLINEJOIN_NONE, com::sun::star::drawing::LineCap_BUTT, this ); } } @@ -317,7 +317,7 @@ void OutputDevice::DrawTransparent( cons for( int nPolyIdx = 0; nPolyIdx < nPolyCount; ++nPolyIdx ) { const ::basegfx::B2DPolygon& rPolygon = aB2DPolyPolygon.getB2DPolygon( nPolyIdx ); - bDrawn = mpGraphics->DrawPolyLine( rPolygon, fTransparency, aLineWidths, ::basegfx::B2DLINEJOIN_NONE, this ); + bDrawn = mpGraphics->DrawPolyLine( rPolygon, fTransparency, aLineWidths, ::basegfx::B2DLINEJOIN_NONE, com::sun::star::drawing::LineCap_BUTT, this ); } // prepare to restore the fill color mbInitFillColor = mbFillColor; Modified: incubator/ooo/trunk/main/vcl/source/gdi/pdfwriter_impl.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/vcl/source/gdi/pdfwriter_impl.cxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/vcl/source/gdi/pdfwriter_impl.cxx (original) +++ incubator/ooo/trunk/main/vcl/source/gdi/pdfwriter_impl.cxx Tue Jan 17 17:54:04 2012 @@ -1624,7 +1624,28 @@ void PDFWriterImpl::PDFPage::appendMappe bool PDFWriterImpl::PDFPage::appendLineInfo( const LineInfo& rInfo, OStringBuffer& rBuffer ) const { - bool bRet = true; + if(LINE_DASH == rInfo.GetStyle() && rInfo.GetDashLen() != rInfo.GetDotLen()) + { + // dashed and non-degraded case, check for implementation limits of dash array + // in PDF reader apps (e.g. acroread) + if(2 * (rInfo.GetDashCount() + rInfo.GetDotCount()) > 10) + { + return false; + } + } + + if(basegfx::B2DLINEJOIN_NONE != rInfo.GetLineJoin()) + { + // LineJoin used, ExtLineInfo required + return false; + } + + if(com::sun::star::drawing::LineCap_BUTT != rInfo.GetLineCap()) + { + // LineCap used, ExtLineInfo required + return false; + } + if( rInfo.GetStyle() == LINE_DASH ) { rBuffer.append( "[ " ); @@ -1637,10 +1658,6 @@ bool PDFWriterImpl::PDFPage::appendLineI } else { - // check for implementation limits of dash array - // in PDF reader apps (e.g. acroread) - if( 2*(rInfo.GetDashCount() + rInfo.GetDotCount()) > 10 ) - bRet = false; for( int n = 0; n < rInfo.GetDashCount(); n++ ) { appendMappedLength( (sal_Int32)rInfo.GetDashLen(), rBuffer ); @@ -1658,6 +1675,7 @@ bool PDFWriterImpl::PDFPage::appendLineI } rBuffer.append( "] 0 d\n" ); } + if( rInfo.GetWidth() > 1 ) { appendMappedLength( (sal_Int32)rInfo.GetWidth(), rBuffer ); @@ -1669,7 +1687,8 @@ bool PDFWriterImpl::PDFPage::appendLineI appendDouble( 72.0/double(m_pWriter->getReferenceDevice()->ImplGetDPIX()), rBuffer ); rBuffer.append( " w\n" ); } - return bRet; + + return true; } void PDFWriterImpl::PDFPage::appendWaveLine( sal_Int32 nWidth, sal_Int32 nY, sal_Int32 nDelta, OStringBuffer& rBuffer ) const @@ -9045,21 +9064,68 @@ void PDFWriterImpl::convertLineInfoToExt rOut.m_fMiterLimit = 10; rOut.m_aDashArray.clear(); - int nDashes = rIn.GetDashCount(); - int nDashLen = rIn.GetDashLen(); - int nDistance = rIn.GetDistance(); + // add DashDot to DashArray + const int nDashes = rIn.GetDashCount(); + const int nDashLen = rIn.GetDashLen(); + const int nDistance = rIn.GetDistance(); + for( int n = 0; n < nDashes; n++ ) { rOut.m_aDashArray.push_back( nDashLen ); rOut.m_aDashArray.push_back( nDistance ); } - int nDots = rIn.GetDotCount(); - int nDotLen = rIn.GetDotLen(); + + const int nDots = rIn.GetDotCount(); + const int nDotLen = rIn.GetDotLen(); + for( int n = 0; n < nDots; n++ ) { rOut.m_aDashArray.push_back( nDotLen ); rOut.m_aDashArray.push_back( nDistance ); } + + // add LineJoin + switch(rIn.GetLineJoin()) + { + case basegfx::B2DLINEJOIN_BEVEL : + { + rOut.m_eJoin = PDFWriter::joinBevel; + break; + } + default : // basegfx::B2DLINEJOIN_NONE : + // Pdf has no 'none' lineJoin, default is miter + case basegfx::B2DLINEJOIN_MIDDLE : + case basegfx::B2DLINEJOIN_MITER : + { + rOut.m_eJoin = PDFWriter::joinMiter; + break; + } + case basegfx::B2DLINEJOIN_ROUND : + { + rOut.m_eJoin = PDFWriter::joinRound; + break; + } + } + + // add LineCap + switch(rIn.GetLineCap()) + { + default: /* com::sun::star::drawing::LineCap_BUTT */ + { + rOut.m_eCap = PDFWriter::capButt; + break; + } + case com::sun::star::drawing::LineCap_ROUND: + { + rOut.m_eCap = PDFWriter::capRound; + break; + } + case com::sun::star::drawing::LineCap_SQUARE: + { + rOut.m_eCap = PDFWriter::capSquare; + break; + } + } } void PDFWriterImpl::drawPolyLine( const Polygon& rPoly, const PDFWriter::ExtLineInfo& rInfo ) Modified: incubator/ooo/trunk/main/vcl/source/gdi/salgdilayout.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/vcl/source/gdi/salgdilayout.cxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/vcl/source/gdi/salgdilayout.cxx (original) +++ incubator/ooo/trunk/main/vcl/source/gdi/salgdilayout.cxx Tue Jan 17 17:54:04 2012 @@ -412,7 +412,8 @@ bool SalGraphics::drawPolyLine( const basegfx::B2DPolygon& /*rPolyPolygon*/, double /*fTransparency*/, const basegfx::B2DVector& /*rLineWidths*/, - basegfx::B2DLineJoin /*eLineJoin*/) + basegfx::B2DLineJoin /*eLineJoin*/, + com::sun::star::drawing::LineCap /*eLineCap*/) { return false; } @@ -542,18 +543,22 @@ sal_Bool SalGraphics::DrawPolyPolygonBez return bRet; } -bool SalGraphics::DrawPolyLine( const ::basegfx::B2DPolygon& i_rPolygon, double fTransparency, - const ::basegfx::B2DVector& i_rLineWidth, basegfx::B2DLineJoin i_eLineJoin, +bool SalGraphics::DrawPolyLine( + const ::basegfx::B2DPolygon& i_rPolygon, + double i_fTransparency, + const ::basegfx::B2DVector& i_rLineWidth, + basegfx::B2DLineJoin i_eLineJoin, + com::sun::star::drawing::LineCap i_eLineCap, const OutputDevice* i_pOutDev ) { bool bRet = false; if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (i_pOutDev && i_pOutDev->IsRTLEnabled()) ) { basegfx::B2DPolygon aMirror( mirror( i_rPolygon, i_pOutDev ) ); - bRet = drawPolyLine( aMirror, fTransparency, i_rLineWidth, i_eLineJoin ); + bRet = drawPolyLine( aMirror, i_fTransparency, i_rLineWidth, i_eLineJoin, i_eLineCap ); } else - bRet = drawPolyLine( i_rPolygon, fTransparency, i_rLineWidth, i_eLineJoin ); + bRet = drawPolyLine( i_rPolygon, i_fTransparency, i_rLineWidth, i_eLineJoin, i_eLineCap ); return bRet; } Modified: incubator/ooo/trunk/main/vcl/unx/generic/gdi/pspgraphics.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/vcl/unx/generic/gdi/pspgraphics.cxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/vcl/unx/generic/gdi/pspgraphics.cxx (original) +++ incubator/ooo/trunk/main/vcl/unx/generic/gdi/pspgraphics.cxx Tue Jan 17 17:54:04 2012 @@ -401,7 +401,12 @@ bool PspGraphics::drawPolyPolygon( const return false; } -bool PspGraphics::drawPolyLine( const basegfx::B2DPolygon&, double /*fTranspareny*/, const basegfx::B2DVector& /*rLineWidths*/, basegfx::B2DLineJoin /*eJoin*/) +bool PspGraphics::drawPolyLine( + const basegfx::B2DPolygon&, + double /*fTranspareny*/, + const basegfx::B2DVector& /*rLineWidths*/, + basegfx::B2DLineJoin /*eJoin*/, + com::sun::star::drawing::LineCap /*eLineCap*/) { // TODO: a PS printer can draw B2DPolyLines almost directly return false; Modified: incubator/ooo/trunk/main/vcl/unx/generic/gdi/salgdi.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/vcl/unx/generic/gdi/salgdi.cxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/vcl/unx/generic/gdi/salgdi.cxx (original) +++ incubator/ooo/trunk/main/vcl/unx/generic/gdi/salgdi.cxx Tue Jan 17 17:54:04 2012 @@ -1186,7 +1186,12 @@ bool X11SalGraphics::drawFilledTrapezoid // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -bool X11SalGraphics::drawPolyLine(const ::basegfx::B2DPolygon& rPolygon, double fTransparency, const ::basegfx::B2DVector& rLineWidth, basegfx::B2DLineJoin eLineJoin) +bool X11SalGraphics::drawPolyLine( + const ::basegfx::B2DPolygon& rPolygon, + double fTransparency, + const ::basegfx::B2DVector& rLineWidth, + basegfx::B2DLineJoin eLineJoin, + com::sun::star::drawing::LineCap eLineCap) { const bool bIsHairline = (rLineWidth.getX() == rLineWidth.getY()) && (rLineWidth.getX() <= 1.2); @@ -1240,7 +1245,7 @@ bool X11SalGraphics::drawPolyLine(const } // create the area-polygon for the line - const basegfx::B2DPolyPolygon aAreaPolyPoly( basegfx::tools::createAreaGeometry(aPolygon, fHalfWidth, eLineJoin) ); + const basegfx::B2DPolyPolygon aAreaPolyPoly( basegfx::tools::createAreaGeometry(aPolygon, fHalfWidth, eLineJoin, eLineCap) ); if( (rLineWidth.getX() != rLineWidth.getY()) && !basegfx::fTools::equalZero( rLineWidth.getX() ) ) Modified: incubator/ooo/trunk/main/vcl/unx/headless/svpgdi.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/vcl/unx/headless/svpgdi.cxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/vcl/unx/headless/svpgdi.cxx (original) +++ incubator/ooo/trunk/main/vcl/unx/headless/svpgdi.cxx Tue Jan 17 17:54:04 2012 @@ -372,7 +372,12 @@ void SvpSalGraphics::drawPolyPolygon( sa dbgOut( m_aDevice ); } -bool SvpSalGraphics::drawPolyLine( const ::basegfx::B2DPolygon&, double /*fTransparency*/, const ::basegfx::B2DVector& /*rLineWidths*/, basegfx::B2DLineJoin /*eJoin*/ ) +bool SvpSalGraphics::drawPolyLine( + const ::basegfx::B2DPolygon&, + double /*fTransparency*/, + const ::basegfx::B2DVector& /*rLineWidths*/, + basegfx::B2DLineJoin /*eJoin*/, + com::sun::star::drawing::LineCap /*eLineCap*/) { // TODO: implement and advertise OutDevSupport_B2DDraw support return false; Modified: incubator/ooo/trunk/main/vcl/unx/headless/svpgdi.hxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/vcl/unx/headless/svpgdi.hxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/vcl/unx/headless/svpgdi.hxx (original) +++ incubator/ooo/trunk/main/vcl/unx/headless/svpgdi.hxx Tue Jan 17 17:54:04 2012 @@ -115,7 +115,12 @@ public: virtual void drawLine( long nX1, long nY1, long nX2, long nY2 ); virtual void drawRect( long nX, long nY, long nWidth, long nHeight ); virtual bool drawPolyPolygon( const ::basegfx::B2DPolyPolygon&, double fTransparency ); - virtual bool drawPolyLine( const ::basegfx::B2DPolygon&, double fTransparency, const ::basegfx::B2DVector& rLineWidths, basegfx::B2DLineJoin ); + virtual bool drawPolyLine( + const ::basegfx::B2DPolygon&, + double fTransparency, + const ::basegfx::B2DVector& rLineWidths, + basegfx::B2DLineJoin, + com::sun::star::drawing::LineCap); virtual void drawPolyLine( sal_uLong nPoints, const SalPoint* pPtAry ); virtual void drawPolygon( sal_uLong nPoints, const SalPoint* pPtAry ); virtual void drawPolyPolygon( sal_uInt32 nPoly, Modified: incubator/ooo/trunk/main/vcl/unx/headless/svppspgraphics.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/vcl/unx/headless/svppspgraphics.cxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/vcl/unx/headless/svppspgraphics.cxx (original) +++ incubator/ooo/trunk/main/vcl/unx/headless/svppspgraphics.cxx Tue Jan 17 17:54:04 2012 @@ -320,7 +320,12 @@ void PspGraphics::drawPolyPolygon( sal_u m_pPrinterGfx->DrawPolyPolygon (nPoly, pPoints, (const Point**)pPtAry); } -bool PspGraphics::drawPolyLine( const ::basegfx::B2DPolygon&, double /*fTransparency*/, const ::basegfx::B2DVector& /*rLineWidths*/, basegfx::B2DLineJoin /*eJoin*/ ) +bool PspGraphics::drawPolyLine( + const ::basegfx::B2DPolygon&, + double /*fTransparency*/, + const ::basegfx::B2DVector& /*rLineWidths*/, + basegfx::B2DLineJoin /*eJoin*/, + com::sun::star::drawing::LineCap /*eLineCap*/) { // TODO: implement and advertise OutDevSupport_B2DDraw support return false; Modified: incubator/ooo/trunk/main/vcl/unx/headless/svppspgraphics.hxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/vcl/unx/headless/svppspgraphics.hxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/vcl/unx/headless/svppspgraphics.hxx (original) +++ incubator/ooo/trunk/main/vcl/unx/headless/svppspgraphics.hxx Tue Jan 17 17:54:04 2012 @@ -136,7 +136,12 @@ public: virtual void drawPolyLine( sal_uLong nPoints, const SalPoint* pPtAry ); virtual void drawPolygon( sal_uLong nPoints, const SalPoint* pPtAry ); virtual bool drawPolyPolygon( const ::basegfx::B2DPolyPolygon&, double fTransparency ); - virtual bool drawPolyLine( const ::basegfx::B2DPolygon&, double fTransparency, const ::basegfx::B2DVector& rLineWidths, basegfx::B2DLineJoin ); + virtual bool drawPolyLine( + const ::basegfx::B2DPolygon&, + double fTransparency, + const ::basegfx::B2DVector& rLineWidths, + basegfx::B2DLineJoin, + com::sun::star::drawing::LineCap); virtual void drawPolyPolygon( sal_uInt32 nPoly, const sal_uInt32* pPoints, PCONSTSALPOINT* pPtAry ); Modified: incubator/ooo/trunk/main/vcl/win/source/gdi/salgdi_gdiplus.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/vcl/win/source/gdi/salgdi_gdiplus.cxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/vcl/win/source/gdi/salgdi_gdiplus.cxx (original) +++ incubator/ooo/trunk/main/vcl/win/source/gdi/salgdi_gdiplus.cxx Tue Jan 17 17:54:04 2012 @@ -187,7 +187,12 @@ bool WinSalGraphics::drawPolyPolygon( co return true; } -bool WinSalGraphics::drawPolyLine( const basegfx::B2DPolygon& rPolygon, double fTransparency, const basegfx::B2DVector& rLineWidths, basegfx::B2DLineJoin eLineJoin ) +bool WinSalGraphics::drawPolyLine( + const basegfx::B2DPolygon& rPolygon, + double fTransparency, + const basegfx::B2DVector& rLineWidths, + basegfx::B2DLineJoin eLineJoin, + com::sun::star::drawing::LineCap eLineCap) { const sal_uInt32 nCount(rPolygon.count()); @@ -230,6 +235,27 @@ bool WinSalGraphics::drawPolyLine( const } } + switch(eLineCap) + { + default: /*com::sun::star::drawing::LineCap_BUTT*/ + { + // nothing to do + break; + } + case com::sun::star::drawing::LineCap_ROUND: + { + aTestPen.SetStartCap(Gdiplus::LineCapRound); + aTestPen.SetEndCap(Gdiplus::LineCapRound); + break; + } + case com::sun::star::drawing::LineCap_SQUARE: + { + aTestPen.SetStartCap(Gdiplus::LineCapSquare); + aTestPen.SetEndCap(Gdiplus::LineCapSquare); + break; + } + } + if(nCount > 250 && basegfx::fTools::more(rLineWidths.getX(), 1.5)) { impAddB2DPolygonToGDIPlusGraphicsPathInteger(aPath, rPolygon, bNoLineJoin); Modified: incubator/ooo/trunk/main/xmloff/inc/xmloff/xmltoken.hxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/xmloff/inc/xmloff/xmltoken.hxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/xmloff/inc/xmloff/xmltoken.hxx (original) +++ incubator/ooo/trunk/main/xmloff/inc/xmloff/xmltoken.hxx Tue Jan 17 17:54:04 2012 @@ -340,6 +340,7 @@ namespace xmloff { namespace token { XML_BUBBLE, XML_BULLET_CHAR, XML_BULLET_RELATIVE_SIZE, + XML_BUTT, XML_BUTTON1, XML_BUTTON2, XML_BUTTON3, @@ -1681,6 +1682,7 @@ namespace xmloff { namespace token { XML_STROKE, XML_STROKE_COLOR, XML_STROKE_DASH, + XML_STROKE_LINECAP, XML_STROKE_LINEJOIN, XML_STROKE_OPACITY, XML_STROKE_WIDTH, Modified: incubator/ooo/trunk/main/xmloff/source/core/xmltoken.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/xmloff/source/core/xmltoken.cxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/xmloff/source/core/xmltoken.cxx (original) +++ incubator/ooo/trunk/main/xmloff/source/core/xmltoken.cxx Tue Jan 17 17:54:04 2012 @@ -348,6 +348,7 @@ namespace xmloff { namespace token { TOKEN( "bubble", XML_BUBBLE ), TOKEN( "bullet-char", XML_BULLET_CHAR ), TOKEN( "bullet-relative-size", XML_BULLET_RELATIVE_SIZE ), + TOKEN( "butt", XML_BUTT ), TOKEN( "button1", XML_BUTTON1 ), TOKEN( "button2", XML_BUTTON2 ), TOKEN( "button3", XML_BUTTON3 ), @@ -1689,6 +1690,7 @@ namespace xmloff { namespace token { TOKEN( "stroke", XML_STROKE ), TOKEN( "stroke-color", XML_STROKE_COLOR ), TOKEN( "stroke-dash", XML_STROKE_DASH ), + TOKEN( "stroke-linecap", XML_STROKE_LINECAP ), TOKEN( "stroke-linejoin", XML_STROKE_LINEJOIN ), TOKEN( "stroke-opacity", XML_STROKE_OPACITY ), TOKEN( "stroke-width", XML_STROKE_WIDTH ), Modified: incubator/ooo/trunk/main/xmloff/source/draw/sdpropls.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/xmloff/source/draw/sdpropls.cxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/xmloff/source/draw/sdpropls.cxx (original) +++ incubator/ooo/trunk/main/xmloff/source/draw/sdpropls.cxx Tue Jan 17 17:54:04 2012 @@ -28,6 +28,7 @@ #include <com/sun/star/container/XIndexReplace.hpp> #include <com/sun/star/drawing/LineStyle.hpp> #include <com/sun/star/drawing/LineJoint.hpp> +#include <com/sun/star/drawing/LineCap.hpp> #include <com/sun/star/drawing/FillStyle.hpp> #include <com/sun/star/presentation/AnimationSpeed.hpp> #include <com/sun/star/presentation/FadeEffect.hpp> @@ -111,6 +112,7 @@ const XMLPropertyMapEntry aXMLSDProperti GMAP( "LineEndCenter", XML_NAMESPACE_DRAW, XML_MARKER_END_CENTER, XML_TYPE_BOOL, 0 ), GMAP( "LineTransparence", XML_NAMESPACE_SVG, XML_STROKE_OPACITY, XML_SD_TYPE_OPACITY, 0 ), GMAP( "LineJoint", XML_NAMESPACE_DRAW, XML_STROKE_LINEJOIN, XML_SD_TYPE_LINEJOIN, 0 ), + GMAP( "LineCap", XML_NAMESPACE_SVG , XML_STROKE_LINECAP, XML_SD_TYPE_LINECAP, 0 ), // fill attributes GMAP( "FillStyle", XML_NAMESPACE_DRAW, XML_FILL, XML_SD_TYPE_FILLSTYLE, 0 ), @@ -392,6 +394,14 @@ SvXMLEnumMapEntry aXML_LineJoint_EnumMap { XML_TOKEN_INVALID, 0 } }; +SvXMLEnumMapEntry aXML_LineCap_EnumMap[] = +{ + { XML_BUTT, drawing::LineCap_BUTT }, + { XML_ROUND, drawing::LineCap_ROUND }, + { XML_GRADIENTSTYLE_SQUARE, drawing::LineCap_SQUARE }, // use XML_GRADIENTSTYLE_SQUARE as XML_SQUARE, is defined as "square" already + { XML_TOKEN_INVALID, 0 } +}; + SvXMLEnumMapEntry aXML_FillStyle_EnumMap[] = { { XML_NONE, drawing::FillStyle_NONE }, @@ -887,6 +897,11 @@ const XMLPropertyHandler* XMLSdPropHdlFa pHdl = new XMLEnumPropertyHdl( aXML_LineJoint_EnumMap, ::getCppuType((const drawing::LineJoint*)0) ); break; } + case XML_SD_TYPE_LINECAP : + { + pHdl = new XMLEnumPropertyHdl( aXML_LineCap_EnumMap, ::getCppuType((const drawing::LineCap*)0) ); + break; + } case XML_SD_TYPE_FILLSTYLE : { pHdl = new XMLEnumPropertyHdl( aXML_FillStyle_EnumMap, ::getCppuType((const drawing::FillStyle*)0) ); Modified: incubator/ooo/trunk/main/xmloff/source/draw/sdpropls.hxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/xmloff/source/draw/sdpropls.hxx?rev=1232507&r1=1232506&r2=1232507&view=diff ============================================================================== --- incubator/ooo/trunk/main/xmloff/source/draw/sdpropls.hxx (original) +++ incubator/ooo/trunk/main/xmloff/source/draw/sdpropls.hxx Tue Jan 17 17:54:04 2012 @@ -83,6 +83,7 @@ extern const XMLPropertyMapEntry aXMLSDP #define XML_SD_TYPE_CONTROL_BORDER (XML_SD_TYPES_START + 32 ) #define XML_SD_TYPE_CONTROL_BORDER_COLOR (XML_SD_TYPES_START + 33 ) #define XML_SD_TYPE_IMAGE_SCALE_MODE (XML_SD_TYPES_START + 34 ) +#define XML_SD_TYPE_LINECAP (XML_SD_TYPES_START + 35 ) // 3D property types #define XML_SD_TYPE_BACKFACE_CULLING (XML_SD_TYPES_START + 40 )
