Related: fdo#87242 merge duplicate clip setup code
favoring the vclcanvas one for the places where they diverge Change-Id: I18e3d4e7659ebd4cb90c86718c1b1035671b4be3
This commit is contained in:
@@ -127,73 +127,7 @@ namespace cairocanvas
|
||||
|
||||
// TODO(P2): Don't change clipping all the time, maintain current clip
|
||||
// state and change only when update is necessary
|
||||
|
||||
// accumulate non-empty clips into one region
|
||||
// ==========================================
|
||||
|
||||
vcl::Region aClipRegion;
|
||||
|
||||
if( viewState.Clip.is() )
|
||||
{
|
||||
::basegfx::B2DPolyPolygon aClipPoly(
|
||||
::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(
|
||||
viewState.Clip) );
|
||||
|
||||
if( aClipPoly.count() )
|
||||
{
|
||||
// setup non-empty clipping
|
||||
::basegfx::B2DHomMatrix aMatrix;
|
||||
aClipPoly.transform(
|
||||
::basegfx::unotools::homMatrixFromAffineMatrix( aMatrix,
|
||||
viewState.AffineTransform ) );
|
||||
|
||||
aClipRegion = vcl::Region::GetRegionFromPolyPolygon( tools::PolyPolygon( aClipPoly ) );
|
||||
}
|
||||
}
|
||||
|
||||
if( renderState.Clip.is() )
|
||||
{
|
||||
::basegfx::B2DPolyPolygon aClipPoly(
|
||||
::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(
|
||||
renderState.Clip) );
|
||||
|
||||
::basegfx::B2DHomMatrix aMatrix;
|
||||
aClipPoly.transform(
|
||||
::canvas::tools::mergeViewAndRenderTransform( aMatrix,
|
||||
viewState,
|
||||
renderState ) );
|
||||
|
||||
if( aClipPoly.count() )
|
||||
{
|
||||
// setup non-empty clipping
|
||||
vcl::Region aRegion = vcl::Region::GetRegionFromPolyPolygon( tools::PolyPolygon( aClipPoly ) );
|
||||
|
||||
if( aClipRegion.IsEmpty() )
|
||||
aClipRegion = aRegion;
|
||||
else
|
||||
aClipRegion.Intersect( aRegion );
|
||||
}
|
||||
else
|
||||
{
|
||||
// clip polygon is empty
|
||||
aClipRegion.SetEmpty();
|
||||
}
|
||||
}
|
||||
|
||||
// setup accumulated clip region. Note that setting an
|
||||
// empty clip region denotes "clip everything" on the
|
||||
// OutputDevice (which is why we translate that into
|
||||
// SetClipRegion() here). When both view and render clip
|
||||
// are empty, aClipRegion remains default-constructed,
|
||||
// i.e. empty, too.
|
||||
if( aClipRegion.IsEmpty() )
|
||||
{
|
||||
rOutDev.SetClipRegion();
|
||||
}
|
||||
else
|
||||
{
|
||||
rOutDev.SetClipRegion( aClipRegion );
|
||||
}
|
||||
::canvas::tools::clipOutDev(viewState, renderState, rOutDev);
|
||||
|
||||
if( eColorType != IGNORE_COLOR )
|
||||
{
|
||||
@@ -238,6 +172,27 @@ namespace cairocanvas
|
||||
return nTransparency;
|
||||
}
|
||||
|
||||
class DeviceSettingsGuard
|
||||
{
|
||||
private:
|
||||
OutputDevice *mpVirtualDevice;
|
||||
bool mbMappingWasEnabled;
|
||||
public:
|
||||
DeviceSettingsGuard(OutputDevice *pVirtualDevice)
|
||||
: mpVirtualDevice(pVirtualDevice)
|
||||
, mbMappingWasEnabled(mpVirtualDevice->IsMapModeEnabled())
|
||||
{
|
||||
mpVirtualDevice->Push();
|
||||
mpVirtualDevice->EnableMapMode(false);
|
||||
}
|
||||
|
||||
~DeviceSettingsGuard()
|
||||
{
|
||||
mpVirtualDevice->EnableMapMode(mbMappingWasEnabled);
|
||||
mpVirtualDevice->Pop();
|
||||
}
|
||||
};
|
||||
|
||||
bool setupTextOutput( OutputDevice& rOutDev,
|
||||
const rendering::XCanvas* pOwner,
|
||||
::Point& o_rOutPos,
|
||||
@@ -247,14 +202,12 @@ namespace cairocanvas
|
||||
{
|
||||
setupOutDevState( rOutDev, pOwner, viewState, renderState, TEXT_COLOR );
|
||||
|
||||
vcl::Font aVCLFont;
|
||||
|
||||
CanvasFont* pFont = dynamic_cast< CanvasFont* >( xFont.get() );
|
||||
|
||||
ENSURE_ARG_OR_THROW( pFont,
|
||||
"CanvasHelper::setupTextOutput(): Font not compatible with this canvas" );
|
||||
|
||||
aVCLFont = pFont->getVCLFont();
|
||||
vcl::Font aVCLFont = pFont->getVCLFont();
|
||||
|
||||
Color aColor( COL_BLACK );
|
||||
|
||||
@@ -273,7 +226,6 @@ namespace cairocanvas
|
||||
|
||||
rOutDev.SetFont( aVCLFont );
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -297,6 +249,8 @@ namespace cairocanvas
|
||||
|
||||
if( mpVirtualDevice )
|
||||
{
|
||||
DeviceSettingsGuard aGuard(mpVirtualDevice.get());
|
||||
|
||||
#if defined CAIRO_HAS_WIN32_SURFACE
|
||||
// FIXME: Some kind of work-araound...
|
||||
cairo_rectangle (mpCairo.get(), 0, 0, 0, 0);
|
||||
@@ -356,6 +310,8 @@ namespace cairocanvas
|
||||
|
||||
if( mpVirtualDevice )
|
||||
{
|
||||
DeviceSettingsGuard aGuard(mpVirtualDevice.get());
|
||||
|
||||
#if defined CAIRO_HAS_WIN32_SURFACE
|
||||
// FIXME: Some kind of work-araound...
|
||||
cairo_rectangle(mpCairo.get(), 0, 0, 0, 0);
|
||||
|
@@ -1291,6 +1291,81 @@ namespace canvas
|
||||
nColorSteps ) );
|
||||
}
|
||||
|
||||
void clipOutDev(const rendering::ViewState& viewState,
|
||||
const rendering::RenderState& renderState,
|
||||
OutputDevice& rOutDev,
|
||||
OutputDevice* p2ndOutDev)
|
||||
{
|
||||
// accumulate non-empty clips into one region
|
||||
vcl::Region aClipRegion(true);
|
||||
|
||||
if( viewState.Clip.is() )
|
||||
{
|
||||
::basegfx::B2DPolyPolygon aClipPoly(
|
||||
::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(viewState.Clip) );
|
||||
|
||||
if( aClipPoly.count() )
|
||||
{
|
||||
// setup non-empty clipping
|
||||
::basegfx::B2DHomMatrix aMatrix;
|
||||
aClipPoly.transform(
|
||||
::basegfx::unotools::homMatrixFromAffineMatrix( aMatrix,
|
||||
viewState.AffineTransform ) );
|
||||
|
||||
aClipRegion = vcl::Region::GetRegionFromPolyPolygon( ::tools::PolyPolygon( aClipPoly ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
// clip polygon is empty
|
||||
aClipRegion.SetEmpty();
|
||||
}
|
||||
}
|
||||
|
||||
if( renderState.Clip.is() )
|
||||
{
|
||||
::basegfx::B2DPolyPolygon aClipPoly(
|
||||
::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(renderState.Clip) );
|
||||
|
||||
::basegfx::B2DHomMatrix aMatrix;
|
||||
aClipPoly.transform(
|
||||
::canvas::tools::mergeViewAndRenderTransform( aMatrix,
|
||||
viewState,
|
||||
renderState ) );
|
||||
|
||||
if( aClipPoly.count() )
|
||||
{
|
||||
// setup non-empty clipping
|
||||
vcl::Region aRegion = vcl::Region::GetRegionFromPolyPolygon( ::tools::PolyPolygon( aClipPoly ) );
|
||||
aClipRegion.Intersect( aRegion );
|
||||
}
|
||||
else
|
||||
{
|
||||
// clip polygon is empty
|
||||
aClipRegion.SetEmpty();
|
||||
}
|
||||
}
|
||||
|
||||
// setup accumulated clip region. Note that setting an
|
||||
// empty clip region denotes "clip everything" on the
|
||||
// OutputDevice (which is why we translate that into
|
||||
// SetClipRegion() here). When both view and render clip
|
||||
// are empty, aClipRegion remains default-constructed,
|
||||
// i.e. empty, too.
|
||||
if( aClipRegion.IsNull() )
|
||||
{
|
||||
rOutDev.SetClipRegion();
|
||||
|
||||
if( p2ndOutDev )
|
||||
p2ndOutDev->SetClipRegion();
|
||||
}
|
||||
else
|
||||
{
|
||||
rOutDev.SetClipRegion( aClipRegion );
|
||||
|
||||
if( p2ndOutDev )
|
||||
p2ndOutDev->SetClipRegion( aClipRegion );
|
||||
}
|
||||
}
|
||||
} // namespace tools
|
||||
|
||||
} // namespace canvas
|
||||
|
@@ -1228,78 +1228,7 @@ namespace vclcanvas
|
||||
|
||||
// TODO(P2): Don't change clipping all the time, maintain current clip
|
||||
// state and change only when update is necessary
|
||||
|
||||
// accumulate non-empty clips into one region
|
||||
// ==========================================
|
||||
|
||||
vcl::Region aClipRegion(true);
|
||||
|
||||
if( viewState.Clip.is() )
|
||||
{
|
||||
::basegfx::B2DPolyPolygon aClipPoly(
|
||||
::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(viewState.Clip) );
|
||||
|
||||
if( aClipPoly.count() )
|
||||
{
|
||||
// setup non-empty clipping
|
||||
::basegfx::B2DHomMatrix aMatrix;
|
||||
aClipPoly.transform(
|
||||
::basegfx::unotools::homMatrixFromAffineMatrix( aMatrix,
|
||||
viewState.AffineTransform ) );
|
||||
|
||||
aClipRegion = vcl::Region::GetRegionFromPolyPolygon( ::tools::PolyPolygon( aClipPoly ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
// clip polygon is empty
|
||||
aClipRegion.SetEmpty();
|
||||
}
|
||||
}
|
||||
|
||||
if( renderState.Clip.is() )
|
||||
{
|
||||
::basegfx::B2DPolyPolygon aClipPoly(
|
||||
::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(renderState.Clip) );
|
||||
|
||||
::basegfx::B2DHomMatrix aMatrix;
|
||||
aClipPoly.transform(
|
||||
::canvas::tools::mergeViewAndRenderTransform( aMatrix,
|
||||
viewState,
|
||||
renderState ) );
|
||||
|
||||
if( aClipPoly.count() )
|
||||
{
|
||||
// setup non-empty clipping
|
||||
vcl::Region aRegion = vcl::Region::GetRegionFromPolyPolygon( ::tools::PolyPolygon( aClipPoly ) );
|
||||
aClipRegion.Intersect( aRegion );
|
||||
}
|
||||
else
|
||||
{
|
||||
// clip polygon is empty
|
||||
aClipRegion.SetEmpty();
|
||||
}
|
||||
}
|
||||
|
||||
// setup accumulated clip region. Note that setting an
|
||||
// empty clip region denotes "clip everything" on the
|
||||
// OutputDevice (which is why we translate that into
|
||||
// SetClipRegion() here). When both view and render clip
|
||||
// are empty, aClipRegion remains default-constructed,
|
||||
// i.e. empty, too.
|
||||
if( aClipRegion.IsNull() )
|
||||
{
|
||||
rOutDev.SetClipRegion();
|
||||
|
||||
if( p2ndOutDev )
|
||||
p2ndOutDev->SetClipRegion();
|
||||
}
|
||||
else
|
||||
{
|
||||
rOutDev.SetClipRegion( aClipRegion );
|
||||
|
||||
if( p2ndOutDev )
|
||||
p2ndOutDev->SetClipRegion( aClipRegion );
|
||||
}
|
||||
::canvas::tools::clipOutDev(viewState, renderState, rOutDev, p2ndOutDev);
|
||||
|
||||
Color aColor( COL_WHITE );
|
||||
|
||||
@@ -1365,18 +1294,17 @@ namespace vclcanvas
|
||||
ENSURE_OR_THROW( mpOutDev.get(),
|
||||
"outdev null. Are we disposed?" );
|
||||
|
||||
setupOutDevState( viewState, renderState, TEXT_COLOR );
|
||||
|
||||
OutputDevice& rOutDev( mpOutDev->getOutDev() );
|
||||
|
||||
vcl::Font aVCLFont;
|
||||
rOutDev.SetClipRegion(vcl::Region(true));
|
||||
setupOutDevState( viewState, renderState, TEXT_COLOR );
|
||||
|
||||
CanvasFont* pFont = dynamic_cast< CanvasFont* >( xFont.get() );
|
||||
|
||||
ENSURE_ARG_OR_THROW( pFont,
|
||||
"Font not compatible with this canvas" );
|
||||
|
||||
aVCLFont = pFont->getVCLFont();
|
||||
vcl::Font aVCLFont = pFont->getVCLFont();
|
||||
|
||||
Color aColor( COL_BLACK );
|
||||
|
||||
|
@@ -77,6 +77,7 @@ namespace com { namespace sun { namespace star { namespace awt
|
||||
} } } }
|
||||
|
||||
class Color;
|
||||
class OutputDevice;
|
||||
|
||||
namespace canvas
|
||||
{
|
||||
@@ -579,6 +580,11 @@ namespace canvas
|
||||
::std::size_t mnEntries;
|
||||
bool mbCaseSensitive;
|
||||
};
|
||||
|
||||
CANVASTOOLS_DLLPUBLIC void clipOutDev(const css::rendering::ViewState& viewState,
|
||||
const css::rendering::RenderState& renderState,
|
||||
OutputDevice& rOutDev,
|
||||
OutputDevice* p2ndOutDev=NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user