Resolves: #i115630# secured OutputDevice::ImplDrawHatch in vcl
and PolyPolygon::Optimize in tools to useful fallbacks when working on PolyPolygons (what they do *not* support) (cherry picked from commit dbe489ab9766d96c5cafb079bc4778103bded783) Conflicts: vcl/source/gdi/outdev4.cxx Change-Id: I5d2374ec95702cb0cab29d2e82710d4aa29fa823
This commit is contained in:
parent
59cc160f34
commit
c1acf1d72e
@ -241,39 +241,62 @@ void PolyPolygon::Optimize( sal_uIntPtr nOptimizeFlags, const PolyOptimizeData*
|
||||
{
|
||||
DBG_CHKTHIS( PolyPolygon, NULL );
|
||||
|
||||
if( nOptimizeFlags )
|
||||
if(nOptimizeFlags && Count())
|
||||
{
|
||||
double fArea;
|
||||
const sal_Bool bEdges = ( nOptimizeFlags & POLY_OPTIMIZE_EDGES ) == POLY_OPTIMIZE_EDGES;
|
||||
sal_uInt16 nPercent = 0;
|
||||
// #115630# ImplDrawHatch does not work with beziers included in the polypolygon, take care of that
|
||||
bool bIsCurve(false);
|
||||
|
||||
if( bEdges )
|
||||
for(sal_uInt16 a(0); !bIsCurve && a < Count(); a++)
|
||||
{
|
||||
const Rectangle aBound( GetBoundRect() );
|
||||
|
||||
fArea = ( aBound.GetWidth() + aBound.GetHeight() ) * 0.5;
|
||||
nPercent = pData ? pData->GetPercentValue() : 50;
|
||||
nOptimizeFlags &= ~POLY_OPTIMIZE_EDGES;
|
||||
if((*this)[a].HasFlags())
|
||||
{
|
||||
bIsCurve = true;
|
||||
}
|
||||
}
|
||||
|
||||
// watch for ref counter
|
||||
if( mpImplPolyPolygon->mnRefCount > 1 )
|
||||
if(bIsCurve)
|
||||
{
|
||||
mpImplPolyPolygon->mnRefCount--;
|
||||
mpImplPolyPolygon = new ImplPolyPolygon( *mpImplPolyPolygon );
|
||||
}
|
||||
OSL_ENSURE(false, "Optimize does *not* support curves, falling back to AdaptiveSubdivide()...");
|
||||
PolyPolygon aPolyPoly;
|
||||
|
||||
// Optimize polygons
|
||||
for( sal_uInt16 i = 0, nPolyCount = mpImplPolyPolygon->mnCount; i < nPolyCount; i++ )
|
||||
AdaptiveSubdivide(aPolyPoly);
|
||||
aPolyPoly.Optimize(nOptimizeFlags, pData);
|
||||
*this = aPolyPoly;
|
||||
}
|
||||
else
|
||||
{
|
||||
double fArea;
|
||||
const sal_Bool bEdges = ( nOptimizeFlags & POLY_OPTIMIZE_EDGES ) == POLY_OPTIMIZE_EDGES;
|
||||
sal_uInt16 nPercent = 0;
|
||||
|
||||
if( bEdges )
|
||||
{
|
||||
mpImplPolyPolygon->mpPolyAry[ i ]->Optimize( POLY_OPTIMIZE_NO_SAME );
|
||||
Polygon::ImplReduceEdges( *( mpImplPolyPolygon->mpPolyAry[ i ] ), fArea, nPercent );
|
||||
const Rectangle aBound( GetBoundRect() );
|
||||
|
||||
fArea = ( aBound.GetWidth() + aBound.GetHeight() ) * 0.5;
|
||||
nPercent = pData ? pData->GetPercentValue() : 50;
|
||||
nOptimizeFlags &= ~POLY_OPTIMIZE_EDGES;
|
||||
}
|
||||
|
||||
if( nOptimizeFlags )
|
||||
mpImplPolyPolygon->mpPolyAry[ i ]->Optimize( nOptimizeFlags, pData );
|
||||
// watch for ref counter
|
||||
if( mpImplPolyPolygon->mnRefCount > 1 )
|
||||
{
|
||||
mpImplPolyPolygon->mnRefCount--;
|
||||
mpImplPolyPolygon = new ImplPolyPolygon( *mpImplPolyPolygon );
|
||||
}
|
||||
|
||||
// Optimize polygons
|
||||
for( sal_uInt16 i = 0, nPolyCount = mpImplPolyPolygon->mnCount; i < nPolyCount; i++ )
|
||||
{
|
||||
if( bEdges )
|
||||
{
|
||||
mpImplPolyPolygon->mpPolyAry[ i ]->Optimize( POLY_OPTIMIZE_NO_SAME );
|
||||
Polygon::ImplReduceEdges( *( mpImplPolyPolygon->mpPolyAry[ i ] ), fArea, nPercent );
|
||||
}
|
||||
|
||||
if( nOptimizeFlags )
|
||||
mpImplPolyPolygon->mpPolyAry[ i ]->Optimize( nOptimizeFlags, pData );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1077,40 +1077,39 @@ void OutputDevice::AddHatchActions( const PolyPolygon& rPolyPoly, const Hatch& r
|
||||
|
||||
void OutputDevice::ImplDrawHatch( const PolyPolygon& rPolyPoly, const Hatch& rHatch, sal_Bool bMtf )
|
||||
{
|
||||
Rectangle aRect( rPolyPoly.GetBoundRect() );
|
||||
const long nLogPixelWidth = ImplDevicePixelToLogicWidth( 1 );
|
||||
const long nWidth = ImplDevicePixelToLogicWidth( std::max( ImplLogicWidthToDevicePixel( rHatch.GetDistance() ), 3L ) );
|
||||
Point* pPtBuffer = new Point[ HATCH_MAXPOINTS ];
|
||||
Point aPt1, aPt2, aEndPt1;
|
||||
Size aInc;
|
||||
|
||||
// Single hatch
|
||||
aRect.Left() -= nLogPixelWidth; aRect.Top() -= nLogPixelWidth; aRect.Right() += nLogPixelWidth; aRect.Bottom() += nLogPixelWidth;
|
||||
ImplCalcHatchValues( aRect, nWidth, rHatch.GetAngle(), aPt1, aPt2, aInc, aEndPt1 );
|
||||
do
|
||||
if(rPolyPoly.Count())
|
||||
{
|
||||
ImplDrawHatchLine( Line( aPt1, aPt2 ), rPolyPoly, pPtBuffer, bMtf );
|
||||
aPt1.X() += aInc.Width(); aPt1.Y() += aInc.Height();
|
||||
aPt2.X() += aInc.Width(); aPt2.Y() += aInc.Height();
|
||||
}
|
||||
while( ( aPt1.X() <= aEndPt1.X() ) && ( aPt1.Y() <= aEndPt1.Y() ) );
|
||||
// #i115630# ImplDrawHatch does not work with beziers included in the polypolygon, take care of that
|
||||
bool bIsCurve(false);
|
||||
|
||||
if( ( rHatch.GetStyle() == HATCH_DOUBLE ) || ( rHatch.GetStyle() == HATCH_TRIPLE ) )
|
||||
{
|
||||
// Double hatch
|
||||
ImplCalcHatchValues( aRect, nWidth, rHatch.GetAngle() + 900, aPt1, aPt2, aInc, aEndPt1 );
|
||||
do
|
||||
for(sal_uInt16 a(0); !bIsCurve && a < rPolyPoly.Count(); a++)
|
||||
{
|
||||
ImplDrawHatchLine( Line( aPt1, aPt2 ), rPolyPoly, pPtBuffer, bMtf );
|
||||
aPt1.X() += aInc.Width(); aPt1.Y() += aInc.Height();
|
||||
aPt2.X() += aInc.Width(); aPt2.Y() += aInc.Height();
|
||||
if(rPolyPoly[a].HasFlags())
|
||||
{
|
||||
bIsCurve = true;
|
||||
}
|
||||
}
|
||||
while( ( aPt1.X() <= aEndPt1.X() ) && ( aPt1.Y() <= aEndPt1.Y() ) );
|
||||
|
||||
if( rHatch.GetStyle() == HATCH_TRIPLE )
|
||||
if(bIsCurve)
|
||||
{
|
||||
// Triple hatch
|
||||
ImplCalcHatchValues( aRect, nWidth, rHatch.GetAngle() + 450, aPt1, aPt2, aInc, aEndPt1 );
|
||||
OSL_ENSURE(false, "ImplDrawHatch does *not* support curves, falling back to AdaptiveSubdivide()...");
|
||||
PolyPolygon aPolyPoly;
|
||||
|
||||
rPolyPoly.AdaptiveSubdivide(aPolyPoly);
|
||||
ImplDrawHatch(aPolyPoly, rHatch, bMtf);
|
||||
}
|
||||
else
|
||||
{
|
||||
Rectangle aRect( rPolyPoly.GetBoundRect() );
|
||||
const long nLogPixelWidth = ImplDevicePixelToLogicWidth( 1 );
|
||||
const long nWidth = ImplDevicePixelToLogicWidth( std::max( ImplLogicWidthToDevicePixel( rHatch.GetDistance() ), 3L ) );
|
||||
Point* pPtBuffer = new Point[ HATCH_MAXPOINTS ];
|
||||
Point aPt1, aPt2, aEndPt1;
|
||||
Size aInc;
|
||||
|
||||
// Single hatch
|
||||
aRect.Left() -= nLogPixelWidth; aRect.Top() -= nLogPixelWidth; aRect.Right() += nLogPixelWidth; aRect.Bottom() += nLogPixelWidth;
|
||||
ImplCalcHatchValues( aRect, nWidth, rHatch.GetAngle(), aPt1, aPt2, aInc, aEndPt1 );
|
||||
do
|
||||
{
|
||||
ImplDrawHatchLine( Line( aPt1, aPt2 ), rPolyPoly, pPtBuffer, bMtf );
|
||||
@ -1118,10 +1117,36 @@ void OutputDevice::ImplDrawHatch( const PolyPolygon& rPolyPoly, const Hatch& rHa
|
||||
aPt2.X() += aInc.Width(); aPt2.Y() += aInc.Height();
|
||||
}
|
||||
while( ( aPt1.X() <= aEndPt1.X() ) && ( aPt1.Y() <= aEndPt1.Y() ) );
|
||||
|
||||
if( ( rHatch.GetStyle() == HATCH_DOUBLE ) || ( rHatch.GetStyle() == HATCH_TRIPLE ) )
|
||||
{
|
||||
// Double hatch
|
||||
ImplCalcHatchValues( aRect, nWidth, rHatch.GetAngle() + 900, aPt1, aPt2, aInc, aEndPt1 );
|
||||
do
|
||||
{
|
||||
ImplDrawHatchLine( Line( aPt1, aPt2 ), rPolyPoly, pPtBuffer, bMtf );
|
||||
aPt1.X() += aInc.Width(); aPt1.Y() += aInc.Height();
|
||||
aPt2.X() += aInc.Width(); aPt2.Y() += aInc.Height();
|
||||
}
|
||||
while( ( aPt1.X() <= aEndPt1.X() ) && ( aPt1.Y() <= aEndPt1.Y() ) );
|
||||
|
||||
if( rHatch.GetStyle() == HATCH_TRIPLE )
|
||||
{
|
||||
// Triple hatch
|
||||
ImplCalcHatchValues( aRect, nWidth, rHatch.GetAngle() + 450, aPt1, aPt2, aInc, aEndPt1 );
|
||||
do
|
||||
{
|
||||
ImplDrawHatchLine( Line( aPt1, aPt2 ), rPolyPoly, pPtBuffer, bMtf );
|
||||
aPt1.X() += aInc.Width(); aPt1.Y() += aInc.Height();
|
||||
aPt2.X() += aInc.Width(); aPt2.Y() += aInc.Height();
|
||||
}
|
||||
while( ( aPt1.X() <= aEndPt1.X() ) && ( aPt1.Y() <= aEndPt1.Y() ) );
|
||||
}
|
||||
}
|
||||
|
||||
delete[] pPtBuffer;
|
||||
}
|
||||
}
|
||||
|
||||
delete[] pPtBuffer;
|
||||
}
|
||||
|
||||
void OutputDevice::ImplCalcHatchValues( const Rectangle& rRect, long nDist, sal_uInt16 nAngle10,
|
||||
|
Loading…
x
Reference in New Issue
Block a user