Revert "Resolves: fdo#87242 fix unwanted text shadows during cairo animations"

This reverts commit 392ae23ad0.

I don't need to backport to 4.4, it'll be included in there by release time
f41
Caolán McNamara 10 years ago
parent 392ae23ad0
commit b1a48329ad

@ -1,559 +0,0 @@
From bc839c159d4ee94ef8ca08975cf65be37378ae04 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
Date: Thu, 11 Dec 2014 16:20:49 +0000
Subject: [PATCH] Related: fdo#87242 init VirtualDevice with size of surface
otherwise vcl's clipping doesn't work quite right when the render text
with vcl apis fallback is used.
Manually forced in my case, but it should happen in practice with vertical
text, so if there is a bug about vertical text not appearing in slideshows then
this is part of the fix for that.
Windows and Mac remain unchanged as initialized with 1, 1. If the same problem
affects those platforms then they'll need to be adjusted to remember their
height/widths from the ctor and those values plugged in here instead
(cherry picked from commit f95b0743da4239e047db8638c61f90f8bbe54306)
(cherry picked from commit e2be2c23c1ad61b3bd640be6f16d66f5cd925d38)
Conflicts:
desktop/source/lib/init.cxx
Related: fdo#87242 merge duplicate clip setup code
favoring the vclcanvas one for the places where
they diverge
(cherry picked from commit f88b5ab8692ee7ecf58b570e703d0e7f10cc2f0d)
(cherry picked from commit e0e96579ce3a248ee5d3b07ecf90f38e2020c555)
Conflicts:
canvas/source/cairo/cairo_canvashelper_text.cxx
canvas/source/vcl/canvashelper.cxx
Resolves: fdo#87242 reuse vcl clip for cairo during animations
(cherry picked from commit 94d935eecbba0161de2616c2234b4a5d9d3cad88)
(cherry picked from commit 3a108b0600ce61f7960d561cee9989ab3a48780f)
stray debugging code
(cherry picked from commit 067b560335195b24eeedc4514956029ea975fbbf)
(cherry picked from commit fafc85559097166eceb67c4db4528cc9977e4184)
Change-Id: I2f82f0db0cf446d7db21f0a7ee4f8c15c7ebdb42
18e3d4e7659ebd4cb90c86718c1b1035671b4be3
0a26d4c4092226732620c3852b0402ee45d4fa1d
953389e236739c01226365c33ab777fc3972b69d
---
canvas/source/cairo/cairo_canvashelper.hxx | 3 +
canvas/source/cairo/cairo_canvashelper_text.cxx | 117 ++++++++++--------------
canvas/source/cairo/cairo_quartz_cairo.cxx | 2 +-
canvas/source/cairo/cairo_win32_cairo.cxx | 2 +-
canvas/source/cairo/cairo_xlib_cairo.cxx | 7 +-
canvas/source/tools/canvastools.cxx | 75 +++++++++++++++
canvas/source/vcl/canvashelper.cxx | 79 +---------------
include/canvas/canvastools.hxx | 6 ++
include/vcl/virdev.hxx | 3 +-
vcl/source/gdi/virdev.cxx | 6 +-
10 files changed, 147 insertions(+), 153 deletions(-)
diff --git a/canvas/source/cairo/cairo_canvashelper.hxx b/canvas/source/cairo/cairo_canvashelper.hxx
index 9258e7c..ccb03ac 100644
--- a/canvas/source/cairo/cairo_canvashelper.hxx
+++ b/canvas/source/cairo/cairo_canvashelper.hxx
@@ -310,6 +310,9 @@ namespace cairocanvas
::cairo::CairoSharedPtr mpCairo;
::cairo::SurfaceSharedPtr mpSurface;
::basegfx::B2ISize maSize;
+
+ void clip_cairo_from_dev(::OutputDevice& rOutDev);
+
};
/// also needed from SpriteHelper
diff --git a/canvas/source/cairo/cairo_canvashelper_text.cxx b/canvas/source/cairo/cairo_canvashelper_text.cxx
index d65f2de..78a2ddf 100644
--- a/canvas/source/cairo/cairo_canvashelper_text.cxx
+++ b/canvas/source/cairo/cairo_canvashelper_text.cxx
@@ -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
- // ==========================================
-
- 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 = Region::GetRegionFromPolyPolygon( ::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
- Region aRegion = Region::GetRegionFromPolyPolygon( ::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,31 @@ namespace cairocanvas
return nTransparency;
}
+ class DeviceSettingsGuard
+ {
+ private:
+ OutputDevice *mpVirtualDevice;
+ cairo_t *mpCairo;
+ bool mbMappingWasEnabled;
+ public:
+ DeviceSettingsGuard(OutputDevice *pVirtualDevice, cairo_t *pCairo)
+ : mpVirtualDevice(pVirtualDevice)
+ , mpCairo(pCairo)
+ , mbMappingWasEnabled(mpVirtualDevice->IsMapModeEnabled())
+ {
+ cairo_save(mpCairo);
+ mpVirtualDevice->Push();
+ mpVirtualDevice->EnableMapMode(false);
+ }
+
+ ~DeviceSettingsGuard()
+ {
+ mpVirtualDevice->EnableMapMode(mbMappingWasEnabled);
+ mpVirtualDevice->Pop();
+ cairo_restore(mpCairo);
+ }
+ };
+
bool setupTextOutput( OutputDevice& rOutDev,
const rendering::XCanvas* pOwner,
::Point& o_rOutPos,
@@ -247,14 +206,12 @@ namespace cairocanvas
{
setupOutDevState( rOutDev, pOwner, viewState, renderState, TEXT_COLOR );
- ::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();
+ ::Font aVCLFont = pFont->getVCLFont();
Color aColor( COL_BLACK );
@@ -273,10 +230,20 @@ namespace cairocanvas
rOutDev.SetFont( aVCLFont );
-
return true;
}
+ //set the clip of the rOutDev to the cairo surface
+ void CanvasHelper::clip_cairo_from_dev(::OutputDevice& rOutDev)
+ {
+ 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,
const rendering::StringContext& text,
const uno::Reference< rendering::XCanvasFont >& xFont,
@@ -297,6 +264,8 @@ namespace cairocanvas
if( mpVirtualDevice )
{
+ DeviceSettingsGuard aGuard(mpVirtualDevice.get(), mpCairo.get());
+
#if defined CAIRO_HAS_WIN32_SURFACE
// FIXME: Some kind of work-araound...
cairo_rectangle (mpSurface->getCairo().get(), 0, 0, 0, 0);
@@ -330,6 +299,8 @@ namespace cairocanvas
// TODO(F2): alpha
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 ),
RTL_TEXTENCODING_UTF8 ).getStr());
@@ -357,6 +328,8 @@ namespace cairocanvas
if( mpVirtualDevice )
{
+ DeviceSettingsGuard aGuard(mpVirtualDevice.get(), mpCairo.get());
+
#if defined CAIRO_HAS_WIN32_SURFACE
// FIXME: Some kind of work-araound...
cairo_rectangle( mpSurface->getCairo().get(), 0, 0, 0, 0);
@@ -371,6 +344,8 @@ namespace cairocanvas
if( !setupTextOutput( *mpVirtualDevice, pOwner, aOutpos, viewState, renderState, xLayoutedText->getFont() ) )
return uno::Reference< rendering::XCachedPrimitive >(NULL); // no output necessary
+ clip_cairo_from_dev(*mpVirtualDevice);
+
// TODO(F2): What about the offset scalings?
pTextLayout->draw( mpSurface, *mpVirtualDevice, aOutpos, viewState, renderState );
}
diff --git a/canvas/source/cairo/cairo_quartz_cairo.cxx b/canvas/source/cairo/cairo_quartz_cairo.cxx
index 07951ee..6b8b9aa 100644
--- a/canvas/source/cairo/cairo_quartz_cairo.cxx
+++ b/canvas/source/cairo/cairo_quartz_cairo.cxx
@@ -269,7 +269,7 @@ namespace cairo
aSystemGraphicsData.nSize = sizeof(SystemGraphicsData);
aSystemGraphicsData.rCGContext = getCGContext();
return boost::shared_ptr<VirtualDevice>(
- new VirtualDevice( &aSystemGraphicsData, getDepth() ));
+ new VirtualDevice( &aSystemGraphicsData, Size(1, 1), getDepth() ));
}
/**
diff --git a/canvas/source/cairo/cairo_win32_cairo.cxx b/canvas/source/cairo/cairo_win32_cairo.cxx
index a70add9..8d53b4f 100644
--- a/canvas/source/cairo/cairo_win32_cairo.cxx
+++ b/canvas/source/cairo/cairo_win32_cairo.cxx
@@ -197,7 +197,7 @@ namespace cairo
aSystemGraphicsData.hDC = cairo_win32_surface_get_dc( mpSurface.get() );
return boost::shared_ptr<VirtualDevice>(
- new VirtualDevice( &aSystemGraphicsData, sal::static_int_cast<USHORT>(getDepth()) ));
+ new VirtualDevice( &aSystemGraphicsData, Size(1, 1), sal::static_int_cast<USHORT>(getDepth()) ));
}
diff --git a/canvas/source/cairo/cairo_xlib_cairo.cxx b/canvas/source/cairo/cairo_xlib_cairo.cxx
index 9b49c7e..79ab2a5 100644
--- a/canvas/source/cairo/cairo_xlib_cairo.cxx
+++ b/canvas/source/cairo/cairo_xlib_cairo.cxx
@@ -277,8 +277,13 @@ namespace cairo
aSystemGraphicsData.hDrawable = getDrawable();
aSystemGraphicsData.pXRenderFormat = getRenderFormat();
+ int width = cairo_xlib_surface_get_width(mpSurface.get());
+ int height = cairo_xlib_surface_get_height(mpSurface.get());
+
return boost::shared_ptr<VirtualDevice>(
- new VirtualDevice( &aSystemGraphicsData, std::max( getDepth(), 0 ) ));
+ new VirtualDevice(&aSystemGraphicsData,
+ Size(width, height),
+ std::max(getDepth(), 0)));
}
/**
diff --git a/canvas/source/tools/canvastools.cxx b/canvas/source/tools/canvastools.cxx
index ae79cc9..6698f58 100644
--- a/canvas/source/tools/canvastools.cxx
+++ b/canvas/source/tools/canvastools.cxx
@@ -1290,6 +1290,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
+ 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 = Region::GetRegionFromPolyPolygon( 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
+ Region aRegion = Region::GetRegionFromPolyPolygon( 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
diff --git a/canvas/source/vcl/canvashelper.cxx b/canvas/source/vcl/canvashelper.cxx
index 0bd3954..5424e9e 100644
--- a/canvas/source/vcl/canvashelper.cxx
+++ b/canvas/source/vcl/canvashelper.cxx
@@ -1236,78 +1236,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
- // ==========================================
-
- 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 = Region::GetRegionFromPolyPolygon( ::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
- Region aRegion = Region::GetRegionFromPolyPolygon( ::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 );
@@ -1373,18 +1302,16 @@ namespace vclcanvas
ENSURE_OR_THROW( mpOutDev.get(),
"outdev null. Are we disposed?" );
- setupOutDevState( viewState, renderState, TEXT_COLOR );
-
OutputDevice& rOutDev( mpOutDev->getOutDev() );
- ::Font aVCLFont;
+ 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();
+ ::Font aVCLFont = pFont->getVCLFont();
Color aColor( COL_BLACK );
diff --git a/include/canvas/canvastools.hxx b/include/canvas/canvastools.hxx
index de5a76c..3881537 100644
--- a/include/canvas/canvastools.hxx
+++ b/include/canvas/canvastools.hxx
@@ -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);
}
}
diff --git a/include/vcl/virdev.hxx b/include/vcl/virdev.hxx
index 87205c7..1c0a412 100644
--- a/include/vcl/virdev.hxx
+++ b/include/vcl/virdev.hxx
@@ -110,7 +110,8 @@ public:
Any rendering will happen directly on the context and not on any intermediate bitmap.
Note: This might not be supported on all platforms !
*/
- explicit VirtualDevice( const SystemGraphicsData *pData, sal_uInt16 nBitCount );
+ explicit VirtualDevice(const SystemGraphicsData *pData, const Size &rSize,
+ sal_uInt16 nBitCount);
virtual ~VirtualDevice();
diff --git a/vcl/source/gdi/virdev.cxx b/vcl/source/gdi/virdev.cxx
index 6378785..9dcc286 100644
--- a/vcl/source/gdi/virdev.cxx
+++ b/vcl/source/gdi/virdev.cxx
@@ -236,13 +236,15 @@ VirtualDevice::VirtualDevice( const OutputDevice& rCompDev, sal_uInt16 nBitCount
mnAlphaDepth = sal::static_int_cast<sal_Int8>(nAlphaBitCount);
}
-VirtualDevice::VirtualDevice( const SystemGraphicsData *pData, sal_uInt16 nBitCount )
+VirtualDevice::VirtualDevice(const SystemGraphicsData *pData, const Size &rSize,
+ sal_uInt16 nBitCount)
: mpVirDev( NULL ),
meRefDevMode( REFDEV_NONE )
{
SAL_INFO( "vcl.gdi", "VirtualDevice::VirtualDevice( " << nBitCount << " )" );
- ImplInitVirDev( Application::GetDefaultDevice(), 1, 1, nBitCount, pData );
+ ImplInitVirDev(Application::GetDefaultDevice(), rSize.Width(), rSize.Height(),
+ nBitCount, pData);
}
VirtualDevice::~VirtualDevice()
--
1.9.3

@ -46,7 +46,7 @@ Summary: Free Software Productivity Suite
Name: libreoffice
Epoch: 1
Version: %{libo_version}.0
Release: 6%{?libo_prerelease}%{?dist}
Release: 5%{?libo_prerelease}%{?dist}
License: (MPLv1.1 or LGPLv3+) and LGPLv3 and LGPLv2+ and BSD and (MPLv1.1 or GPLv2 or LGPLv2 or Netscape) and Public Domain and ASL 2.0 and Artistic and MPLv2.0 and CC0
Group: Applications/Productivity
URL: http://www.libreoffice.org/
@ -326,7 +326,6 @@ Patch18: 0001-Revert-No-need-to-have-OpenCL-optional-at-configure-.patch
Patch19: 0001-Don-t-treat-clew-as-part-of-an-external-clcc-module.patch
Patch20: 0001-don-t-copy-stylesheet-s-HelpID-if-this-s-a-rename.patch
Patch21: 0001-fdo-37682-paint-the-right-area.patch
Patch22: 0001-Related-fdo-87242-init-VirtualDevice-with-size-of-su.patch
%define instdir %{_libdir}
%define baseinstdir %{instdir}/libreoffice
@ -2291,9 +2290,6 @@ update-desktop-database %{_datadir}/applications &> /dev/null || :
%endif
%changelog
* Fri Dec 12 2014 Caolán McNamara <caolanm@redhat.com> - 1:4.4.0.0-6.beta2
- Resolves: fdo#87242 fix unwanted text shadows during cairo animations
* Sat Dec 06 2014 David Tardon <dtardon@redhat.com> - 1:4.4.0.0-5.beta2
- update to 4.4.0 beta2
- move officehelper.py to pyuno package so it can be imported from python

Loading…
Cancel
Save