Kaydet (Commit) 94d935ee authored tarafından Caolán McNamara's avatar Caolán McNamara

Resolves: fdo#87242 reuse vcl clip for cairo during animations

Change-Id: I0a26d4c4092226732620c3852b0402ee45d4fa1d
üst f88b5ab8
...@@ -310,6 +310,9 @@ namespace cairocanvas ...@@ -310,6 +310,9 @@ namespace cairocanvas
::cairo::CairoSharedPtr mpCairo; ::cairo::CairoSharedPtr mpCairo;
::cairo::SurfaceSharedPtr mpSurface; ::cairo::SurfaceSharedPtr mpSurface;
::basegfx::B2ISize maSize; ::basegfx::B2ISize maSize;
void clip_cairo_from_dev(::OutputDevice& rOutDev);
}; };
/// also needed from SpriteHelper /// also needed from SpriteHelper
......
...@@ -176,12 +176,15 @@ namespace cairocanvas ...@@ -176,12 +176,15 @@ namespace cairocanvas
{ {
private: private:
OutputDevice *mpVirtualDevice; OutputDevice *mpVirtualDevice;
cairo_t *mpCairo;
bool mbMappingWasEnabled; bool mbMappingWasEnabled;
public: public:
DeviceSettingsGuard(OutputDevice *pVirtualDevice) DeviceSettingsGuard(OutputDevice *pVirtualDevice, cairo_t *pCairo)
: mpVirtualDevice(pVirtualDevice) : mpVirtualDevice(pVirtualDevice)
, mpCairo(pCairo)
, mbMappingWasEnabled(mpVirtualDevice->IsMapModeEnabled()) , mbMappingWasEnabled(mpVirtualDevice->IsMapModeEnabled())
{ {
cairo_save(mpCairo);
mpVirtualDevice->Push(); mpVirtualDevice->Push();
mpVirtualDevice->EnableMapMode(false); mpVirtualDevice->EnableMapMode(false);
} }
...@@ -190,6 +193,7 @@ namespace cairocanvas ...@@ -190,6 +193,7 @@ namespace cairocanvas
{ {
mpVirtualDevice->EnableMapMode(mbMappingWasEnabled); mpVirtualDevice->EnableMapMode(mbMappingWasEnabled);
mpVirtualDevice->Pop(); mpVirtualDevice->Pop();
cairo_restore(mpCairo);
} }
}; };
...@@ -229,6 +233,17 @@ namespace cairocanvas ...@@ -229,6 +233,17 @@ namespace cairocanvas
return true; return true;
} }
//set the clip of the rOutDev to the cairo surface
void CanvasHelper::clip_cairo_from_dev(::OutputDevice& rOutDev)
{
vcl::Region aRegion(rOutDev.GetClipRegion());
if (!aRegion.IsEmpty() && !aRegion.IsNull())
{
doPolyPolygonImplementation(aRegion.GetAsB2DPolyPolygon(), Clip, mpCairo.get(),
NULL, mpSurfaceProvider, rendering::FillRule_EVEN_ODD);
}
}
uno::Reference< rendering::XCachedPrimitive > CanvasHelper::drawText( const rendering::XCanvas* pOwner, uno::Reference< rendering::XCachedPrimitive > CanvasHelper::drawText( const rendering::XCanvas* pOwner,
const rendering::StringContext& text, const rendering::StringContext& text,
const uno::Reference< rendering::XCanvasFont >& xFont, const uno::Reference< rendering::XCanvasFont >& xFont,
...@@ -249,7 +264,7 @@ namespace cairocanvas ...@@ -249,7 +264,7 @@ namespace cairocanvas
if( mpVirtualDevice ) if( mpVirtualDevice )
{ {
DeviceSettingsGuard aGuard(mpVirtualDevice.get()); DeviceSettingsGuard aGuard(mpVirtualDevice.get(), mpCairo.get());
#if defined CAIRO_HAS_WIN32_SURFACE #if defined CAIRO_HAS_WIN32_SURFACE
// FIXME: Some kind of work-araound... // FIXME: Some kind of work-araound...
...@@ -283,6 +298,8 @@ namespace cairocanvas ...@@ -283,6 +298,8 @@ namespace cairocanvas
// TODO(F2): alpha // TODO(F2): alpha
mpVirtualDevice->SetLayoutMode( nLayoutMode ); mpVirtualDevice->SetLayoutMode( nLayoutMode );
clip_cairo_from_dev(*mpVirtualDevice);
OSL_TRACE(":cairocanvas::CanvasHelper::drawText(O,t,f,v,r,d): %s", OUStringToOString( text.Text.copy( text.StartPosition, text.Length ), OSL_TRACE(":cairocanvas::CanvasHelper::drawText(O,t,f,v,r,d): %s", OUStringToOString( text.Text.copy( text.StartPosition, text.Length ),
RTL_TEXTENCODING_UTF8 ).getStr()); RTL_TEXTENCODING_UTF8 ).getStr());
...@@ -310,7 +327,7 @@ namespace cairocanvas ...@@ -310,7 +327,7 @@ namespace cairocanvas
if( mpVirtualDevice ) if( mpVirtualDevice )
{ {
DeviceSettingsGuard aGuard(mpVirtualDevice.get()); DeviceSettingsGuard aGuard(mpVirtualDevice.get(), mpCairo.get());
#if defined CAIRO_HAS_WIN32_SURFACE #if defined CAIRO_HAS_WIN32_SURFACE
// FIXME: Some kind of work-araound... // FIXME: Some kind of work-araound...
...@@ -326,6 +343,8 @@ namespace cairocanvas ...@@ -326,6 +343,8 @@ namespace cairocanvas
if( !setupTextOutput( *mpVirtualDevice, pOwner, aOutpos, viewState, renderState, xLayoutedText->getFont() ) ) if( !setupTextOutput( *mpVirtualDevice, pOwner, aOutpos, viewState, renderState, xLayoutedText->getFont() ) )
return uno::Reference< rendering::XCachedPrimitive >(NULL); // no output necessary return uno::Reference< rendering::XCachedPrimitive >(NULL); // no output necessary
clip_cairo_from_dev(*mpVirtualDevice);
// TODO(F2): What about the offset scalings? // TODO(F2): What about the offset scalings?
pTextLayout->draw(mpCairo, *mpVirtualDevice, aOutpos, viewState, renderState); pTextLayout->draw(mpCairo, *mpVirtualDevice, aOutpos, viewState, renderState);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment