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:
committed by
Caolán McNamara
parent
59cc160f34
commit
c1acf1d72e
@@ -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;
|
||||||
@@ -276,6 +298,7 @@ void PolyPolygon::Optimize( sal_uIntPtr nOptimizeFlags, const PolyOptimizeData*
|
|||||||
mpImplPolyPolygon->mpPolyAry[ i ]->Optimize( nOptimizeFlags, pData );
|
mpImplPolyPolygon->mpPolyAry[ i ]->Optimize( nOptimizeFlags, pData );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolyPolygon::AdaptiveSubdivide( PolyPolygon& rResult, const double d ) const
|
void PolyPolygon::AdaptiveSubdivide( PolyPolygon& rResult, const double d ) const
|
||||||
|
@@ -1077,6 +1077,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 );
|
||||||
const long nWidth = ImplDevicePixelToLogicWidth( std::max( ImplLogicWidthToDevicePixel( rHatch.GetDistance() ), 3L ) );
|
const long nWidth = ImplDevicePixelToLogicWidth( std::max( ImplLogicWidthToDevicePixel( rHatch.GetDistance() ), 3L ) );
|
||||||
@@ -1122,6 +1145,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,
|
||||||
|
Reference in New Issue
Block a user