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:
Armin Le Grand
2012-09-27 12:07:14 +00:00
committed by Caolán McNamara
parent 59cc160f34
commit c1acf1d72e
2 changed files with 99 additions and 51 deletions

View File

@@ -241,7 +241,29 @@ void PolyPolygon::Optimize( sal_uIntPtr nOptimizeFlags, const PolyOptimizeData*
{ {
DBG_CHKTHIS( PolyPolygon, NULL ); DBG_CHKTHIS( PolyPolygon, NULL );
if( nOptimizeFlags ) if(nOptimizeFlags && Count())
{
// #115630# ImplDrawHatch does not work with beziers included in the polypolygon, take care of that
bool bIsCurve(false);
for(sal_uInt16 a(0); !bIsCurve && a < Count(); a++)
{
if((*this)[a].HasFlags())
{
bIsCurve = true;
}
}
if(bIsCurve)
{
OSL_ENSURE(false, "Optimize does *not* support curves, falling back to AdaptiveSubdivide()...");
PolyPolygon aPolyPoly;
AdaptiveSubdivide(aPolyPoly);
aPolyPoly.Optimize(nOptimizeFlags, pData);
*this = aPolyPoly;
}
else
{ {
double fArea; double fArea;
const sal_Bool bEdges = ( nOptimizeFlags & POLY_OPTIMIZE_EDGES ) == POLY_OPTIMIZE_EDGES; const sal_Bool bEdges = ( nOptimizeFlags & POLY_OPTIMIZE_EDGES ) == POLY_OPTIMIZE_EDGES;
@@ -277,6 +299,7 @@ void PolyPolygon::Optimize( sal_uIntPtr nOptimizeFlags, const PolyOptimizeData*
} }
} }
} }
}
void PolyPolygon::AdaptiveSubdivide( PolyPolygon& rResult, const double d ) const void PolyPolygon::AdaptiveSubdivide( PolyPolygon& rResult, const double d ) const
{ {

View File

@@ -1076,6 +1076,29 @@ void OutputDevice::AddHatchActions( const PolyPolygon& rPolyPoly, const Hatch& r
} }
void OutputDevice::ImplDrawHatch( const PolyPolygon& rPolyPoly, const Hatch& rHatch, sal_Bool bMtf ) void OutputDevice::ImplDrawHatch( const PolyPolygon& rPolyPoly, const Hatch& rHatch, sal_Bool bMtf )
{
if(rPolyPoly.Count())
{
// #i115630# ImplDrawHatch does not work with beziers included in the polypolygon, take care of that
bool bIsCurve(false);
for(sal_uInt16 a(0); !bIsCurve && a < rPolyPoly.Count(); a++)
{
if(rPolyPoly[a].HasFlags())
{
bIsCurve = true;
}
}
if(bIsCurve)
{
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() ); Rectangle aRect( rPolyPoly.GetBoundRect() );
const long nLogPixelWidth = ImplDevicePixelToLogicWidth( 1 ); const long nLogPixelWidth = ImplDevicePixelToLogicWidth( 1 );
@@ -1123,6 +1146,8 @@ void OutputDevice::ImplDrawHatch( const PolyPolygon& rPolyPoly, const Hatch& rHa
delete[] pPtBuffer; delete[] pPtBuffer;
} }
}
}
void OutputDevice::ImplCalcHatchValues( const Rectangle& rRect, long nDist, sal_uInt16 nAngle10, void OutputDevice::ImplCalcHatchValues( const Rectangle& rRect, long nDist, sal_uInt16 nAngle10,
Point& rPt1, Point& rPt2, Size& rInc, Point& rEndPt1 ) Point& rPt1, Point& rPt2, Size& rInc, Point& rEndPt1 )