summaryrefslogtreecommitdiff
path: root/vcl/source
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/source')
-rw-r--r--vcl/source/outdev/map.cxx20
-rw-r--r--vcl/source/outdev/outdev.cxx645
-rw-r--r--vcl/source/outdev/outdevstate.cxx27
-rw-r--r--vcl/source/outdev/transparent.cxx52
-rw-r--r--vcl/source/outdev/wallpaper.cxx19
5 files changed, 395 insertions, 368 deletions
diff --git a/vcl/source/outdev/map.cxx b/vcl/source/outdev/map.cxx
index 9cc8bcc139e6..117429dd6364 100644
--- a/vcl/source/outdev/map.cxx
+++ b/vcl/source/outdev/map.cxx
@@ -332,6 +332,26 @@ inline void ImplCalcMapResolution( const MapMode& rMapMode,
ImplCalcBigIntThreshold( nDPIX, nDPIY, rMapRes, rThresRes );
}
+// #i75163#
+void OutputDevice::ImplInvalidateViewTransform()
+{
+ if(mpOutDevData)
+ {
+ if(mpOutDevData->mpViewTransform)
+ {
+ delete mpOutDevData->mpViewTransform;
+ mpOutDevData->mpViewTransform = NULL;
+ }
+
+ if(mpOutDevData->mpInverseViewTransform)
+ {
+ delete mpOutDevData->mpInverseViewTransform;
+ mpOutDevData->mpInverseViewTransform = NULL;
+ }
+ }
+}
+
+
static long ImplLogicToPixel( long n, long nDPI, long nMapNum, long nMapDenom,
long nThres )
{
diff --git a/vcl/source/outdev/outdev.cxx b/vcl/source/outdev/outdev.cxx
index 62f31d6f1ea7..3d5241c7486c 100644
--- a/vcl/source/outdev/outdev.cxx
+++ b/vcl/source/outdev/outdev.cxx
@@ -77,6 +77,7 @@ namespace {
}
#endif
+// Begin initializer and accessor public functions
OutputDevice::OutputDevice() :
maRegion(true),
@@ -242,6 +243,151 @@ OutputDevice::~OutputDevice()
delete mpAlphaVDev;
}
+SalGraphics* OutputDevice::GetGraphics()
+{
+ DBG_TESTSOLARMUTEX();
+
+ if ( !mpGraphics )
+ {
+ if ( !AcquireGraphics() )
+ {
+ SAL_WARN("vcl", "No mpGraphics set");
+ }
+ }
+
+ return mpGraphics;
+}
+
+SalGraphics const *OutputDevice::GetGraphics() const
+{
+ DBG_TESTSOLARMUTEX();
+
+ if ( !mpGraphics )
+ {
+ if ( !AcquireGraphics() )
+ {
+ SAL_WARN("vcl", "No mpGraphics set");
+ }
+ }
+
+ return mpGraphics;
+}
+
+void OutputDevice::SetConnectMetaFile( GDIMetaFile* pMtf )
+{
+ mpMetaFile = pMtf;
+}
+
+void OutputDevice::SetSettings( const AllSettings& rSettings )
+{
+ *mxSettings = rSettings;
+
+ if( mpAlphaVDev )
+ mpAlphaVDev->SetSettings( rSettings );
+}
+
+SystemGraphicsData OutputDevice::GetSystemGfxData() const
+{
+ if ( !mpGraphics )
+ {
+ if ( !AcquireGraphics() )
+ return SystemGraphicsData();
+ }
+
+ return mpGraphics->GetGraphicsData();
+}
+
+css::uno::Any OutputDevice::GetSystemGfxDataAny() const
+{
+ const SystemGraphicsData aSysData = GetSystemGfxData();
+ css::uno::Sequence< sal_Int8 > aSeq( (sal_Int8*)&aSysData,
+ aSysData.nSize );
+
+ return css::uno::makeAny(aSeq);
+}
+
+void OutputDevice::SetRefPoint()
+{
+
+ if ( mpMetaFile )
+ mpMetaFile->AddAction( new MetaRefPointAction( Point(), false ) );
+
+ mbRefPoint = false;
+ maRefPoint.X() = maRefPoint.Y() = 0L;
+
+ if( mpAlphaVDev )
+ mpAlphaVDev->SetRefPoint();
+}
+
+void OutputDevice::SetRefPoint( const Point& rRefPoint )
+{
+
+ if ( mpMetaFile )
+ mpMetaFile->AddAction( new MetaRefPointAction( rRefPoint, true ) );
+
+ mbRefPoint = true;
+ maRefPoint = rRefPoint;
+
+ if( mpAlphaVDev )
+ mpAlphaVDev->SetRefPoint( rRefPoint );
+}
+
+sal_uInt16 OutputDevice::GetBitCount() const
+{
+ // we need a graphics instance
+ if ( !mpGraphics )
+ {
+ if ( !((OutputDevice*)this)->AcquireGraphics() )
+ return 0;
+ }
+
+ return (sal_uInt16)mpGraphics->GetBitCount();
+}
+
+sal_uLong OutputDevice::GetColorCount() const
+{
+
+ const sal_uInt16 nBitCount = GetBitCount();
+ return( ( nBitCount > 31 ) ? ULONG_MAX : ( ( (sal_uLong) 1 ) << nBitCount) );
+}
+
+css::uno::Reference< css::rendering::XCanvas > OutputDevice::GetCanvas() const
+{
+ css::uno::Sequence< css::uno::Any > aArg(6);
+
+ aArg[ 0 ] = css::uno::makeAny( reinterpret_cast<sal_Int64>(this) );
+ aArg[ 2 ] = css::uno::makeAny( css::awt::Rectangle( mnOutOffX, mnOutOffY, mnOutWidth, mnOutHeight ) );
+ aArg[ 3 ] = css::uno::makeAny( sal_False );
+ aArg[ 5 ] = GetSystemGfxDataAny();
+
+ css::uno::Reference<css::uno::XComponentContext> xContext = comphelper::getProcessComponentContext();
+
+ // Create canvas instance with window handle
+ static css::uno::Reference<css::lang::XMultiComponentFactory > xCanvasFactory( css::rendering::CanvasFactory::create( xContext ) );
+
+ css::uno::Reference<css::rendering::XCanvas> xCanvas;
+ xCanvas.set(
+ xCanvasFactory->createInstanceWithArgumentsAndContext(
+ "com.sun.star.rendering.Canvas", aArg, xContext ),
+ css::uno::UNO_QUERY );
+
+ return xCanvas;
+}
+
+css::uno::Reference< css::awt::XGraphics > OutputDevice::CreateUnoGraphics()
+{
+ UnoWrapperBase* pWrapper = Application::GetUnoWrapper();
+ return pWrapper ? pWrapper->CreateGraphics( this ) : css::uno::Reference< css::awt::XGraphics >();
+}
+
+VCLXGraphicsList_impl* OutputDevice::CreateUnoGraphicsList()
+{
+ mpUnoGraphicsList = new VCLXGraphicsList_impl();
+ return mpUnoGraphicsList;
+}
+
+// Helper public function
+
bool OutputDevice::SupportsOperation( OutDevSupportType eType ) const
{
if( !mpGraphics )
@@ -251,6 +397,8 @@ bool OutputDevice::SupportsOperation( OutDevSupportType eType ) const
return bHasSupport;
}
+// Helper private function
+
void OutputDevice::ImplRotatePos( long nOriginX, long nOriginY, long& rX, long& rY,
short nOrientation ) const
{
@@ -302,211 +450,65 @@ void OutputDevice::ImplRotatePos( long nOriginX, long nOriginY, long& rX, long&
}
}
-void OutputDevice::EnableRTL( bool bEnable )
-{
- mbEnableRTL = bEnable;
-
- if( mpAlphaVDev )
- mpAlphaVDev->EnableRTL( bEnable );
-}
-
-bool OutputDevice::HasMirroredGraphics() const
-{
- return ( AcquireGraphics() && (mpGraphics->GetLayout() & SAL_LAYOUT_BIDI_RTL) );
-}
-
-
-bool OutputDevice::ImplIsAntiparallel() const
-{
- bool bRet = false;
- if( AcquireGraphics() )
- {
- if( ( (mpGraphics->GetLayout() & SAL_LAYOUT_BIDI_RTL) && ! IsRTLEnabled() ) ||
- ( ! (mpGraphics->GetLayout() & SAL_LAYOUT_BIDI_RTL) && IsRTLEnabled() ) )
- {
- bRet = true;
- }
- }
- return bRet;
-}
-
-// note: the coordiantes to be remirrored are in frame coordiantes !
-
-void OutputDevice::ReMirror( Point &rPoint ) const
-{
- rPoint.X() = mnOutOffX + mnOutWidth - 1 - rPoint.X() + mnOutOffX;
-}
-void OutputDevice::ReMirror( Rectangle &rRect ) const
-{
- long nWidth = rRect.Right() - rRect.Left();
-
- //long lc_x = rRect.nLeft - mnOutOffX; // normalize
- //lc_x = mnOutWidth - nWidth - 1 - lc_x; // mirror
- //rRect.nLeft = lc_x + mnOutOffX; // re-normalize
+// Frame public functions
- rRect.Left() = mnOutOffX + mnOutWidth - nWidth - 1 - rRect.Left() + mnOutOffX;
- rRect.Right() = rRect.Left() + nWidth;
-}
-void OutputDevice::ReMirror( Region &rRegion ) const
+void OutputDevice::ImplGetFrameDev( const Point& rPt, const Point& rDevPt, const Size& rDevSize,
+ OutputDevice& rDev )
{
- RectangleVector aRectangles;
- rRegion.GetRegionRectangles(aRectangles);
- Region aMirroredRegion;
-
- for(RectangleVector::iterator aRectIter(aRectangles.begin()); aRectIter != aRectangles.end(); ++aRectIter)
- {
- ReMirror(*aRectIter);
- aMirroredRegion.Union(*aRectIter);
- }
-
- rRegion = aMirroredRegion;
+ bool bOldMap = mbMap;
+ mbMap = false;
+ rDev.DrawOutDev( rDevPt, rDevSize, rPt, rDevSize, *this );
+ mbMap = bOldMap;
}
-SalGraphics* OutputDevice::GetGraphics()
+void OutputDevice::ImplDrawFrameDev( const Point& rPt, const Point& rDevPt, const Size& rDevSize,
+ const OutputDevice& rOutDev, const Region& rRegion )
{
- DBG_TESTSOLARMUTEX();
-
- if ( !mpGraphics )
- {
- if ( !AcquireGraphics() )
- {
- SAL_WARN("vcl", "No mpGraphics set");
- }
- }
- return mpGraphics;
-}
+ GDIMetaFile* pOldMetaFile = mpMetaFile;
+ bool bOldMap = mbMap;
+ RasterOp eOldROP = GetRasterOp();
+ mpMetaFile = NULL;
+ mbMap = false;
+ SetRasterOp( ROP_OVERPAINT );
-SalGraphics const *OutputDevice::GetGraphics() const
-{
- DBG_TESTSOLARMUTEX();
+ if ( !IsDeviceOutputNecessary() )
+ return;
if ( !mpGraphics )
{
if ( !AcquireGraphics() )
- {
- SAL_WARN("vcl", "No mpGraphics set");
- }
- }
-
- return mpGraphics;
-}
-
-void OutputDevice::ImplReleaseFonts()
-{
- mpGraphics->ReleaseFonts();
- mbNewFont = true;
- mbInitFont = true;
-
- if ( mpFontEntry )
- {
- mpFontCache->Release( mpFontEntry );
- mpFontEntry = NULL;
- }
-
- if ( mpGetDevFontList )
- {
- delete mpGetDevFontList;
- mpGetDevFontList = NULL;
- }
-
- if ( mpGetDevSizeList )
- {
- delete mpGetDevSizeList;
- mpGetDevSizeList = NULL;
- }
-}
-
-// #i75163#
-void OutputDevice::ImplInvalidateViewTransform()
-{
- if(mpOutDevData)
- {
- if(mpOutDevData->mpViewTransform)
- {
- delete mpOutDevData->mpViewTransform;
- mpOutDevData->mpViewTransform = NULL;
- }
-
- if(mpOutDevData->mpInverseViewTransform)
- {
- delete mpOutDevData->mpInverseViewTransform;
- mpOutDevData->mpInverseViewTransform = NULL;
- }
+ return;
}
-}
-
-bool OutputDevice::ImplIsRecordLayout() const
-{
- return mpOutDevData && mpOutDevData->mpRecordLayout;
-}
-
-void OutputDevice::ImplDrawOutDevDirect( const OutputDevice* pSrcDev, SalTwoRect& rPosAry )
-{
- SalGraphics* pGraphics2;
- if ( this == pSrcDev )
- pGraphics2 = NULL;
+ // ClipRegion zuruecksetzen
+ if ( rRegion.IsNull() )
+ mpGraphics->ResetClipRegion();
else
- {
- if ( (GetOutDevType() != pSrcDev->GetOutDevType()) ||
- (GetOutDevType() != OUTDEV_WINDOW) )
- {
- if ( !pSrcDev->mpGraphics )
- {
- if ( !((OutputDevice*)pSrcDev)->AcquireGraphics() )
- return;
- }
- pGraphics2 = pSrcDev->mpGraphics;
- }
- else
- {
- if ( ((Window*)this)->mpWindowImpl->mpFrameWindow == ((Window*)pSrcDev)->mpWindowImpl->mpFrameWindow )
- pGraphics2 = NULL;
- else
- {
- if ( !pSrcDev->mpGraphics )
- {
- if ( !((OutputDevice*)pSrcDev)->AcquireGraphics() )
- return;
- }
- pGraphics2 = pSrcDev->mpGraphics;
-
- if ( !mpGraphics )
- {
- if ( !AcquireGraphics() )
- return;
- }
- DBG_ASSERT( mpGraphics && pSrcDev->mpGraphics,
- "OutputDevice::DrawOutDev(): We need more than one Graphics" );
- }
- }
- }
+ SelectClipRegion( rRegion );
- // #102532# Offset only has to be pseudo window offset
- const Rectangle aSrcOutRect( Point( pSrcDev->mnOutOffX, pSrcDev->mnOutOffY ),
- Size( pSrcDev->mnOutWidth, pSrcDev->mnOutHeight ) );
+ SalTwoRect aPosAry;
+ aPosAry.mnSrcX = rDevPt.X();
+ aPosAry.mnSrcY = rDevPt.Y();
+ aPosAry.mnSrcWidth = rDevSize.Width();
+ aPosAry.mnSrcHeight = rDevSize.Height();
+ aPosAry.mnDestX = rPt.X();
+ aPosAry.mnDestY = rPt.Y();
+ aPosAry.mnDestWidth = rDevSize.Width();
+ aPosAry.mnDestHeight = rDevSize.Height();
+ ImplDrawOutDevDirect( &rOutDev, aPosAry );
- AdjustTwoRect( rPosAry, aSrcOutRect );
+ // Ensure that ClipRegion is recalculated and set
+ mbInitClipRegion = true;
- if ( rPosAry.mnSrcWidth && rPosAry.mnSrcHeight && rPosAry.mnDestWidth && rPosAry.mnDestHeight )
- {
- // --- RTL --- if this is no window, but pSrcDev is a window
- // mirroring may be required
- // because only windows have a SalGraphicsLayout
- // mirroring is performed here
- if( (GetOutDevType() != OUTDEV_WINDOW) && pGraphics2 && (pGraphics2->GetLayout() & SAL_LAYOUT_BIDI_RTL) )
- {
- SalTwoRect aPosAry2 = rPosAry;
- pGraphics2->mirror( aPosAry2.mnSrcX, aPosAry2.mnSrcWidth, pSrcDev );
- mpGraphics->CopyBits( aPosAry2, pGraphics2, this, pSrcDev );
- }
- else
- mpGraphics->CopyBits( rPosAry, pGraphics2, this, pSrcDev );
- }
+ SetRasterOp( eOldROP );
+ mbMap = bOldMap;
+ mpMetaFile = pOldMetaFile;
}
+// Direct OutputDevice drawing public functions
+
void OutputDevice::DrawOutDev( const Point& rDestPt, const Size& rDestSize,
const Point& rSrcPt, const Size& rSrcSize )
{
@@ -686,6 +688,8 @@ void OutputDevice::CopyArea( const Point& rDestPt,
mpAlphaVDev->CopyArea( rDestPt, rSrcPt, rSrcSize, nFlags );
}
+// Direct OutputDevice drawing protected function
+
void OutputDevice::CopyAreaFinal( SalTwoRect& aPosAry, sal_uInt32 /*nFlags*/)
{
if (aPosAry.mnSrcWidth == 0 || aPosAry.mnSrcHeight == 0 || aPosAry.mnDestWidth == 0 || aPosAry.mnDestHeight == 0)
@@ -696,238 +700,143 @@ void OutputDevice::CopyAreaFinal( SalTwoRect& aPosAry, sal_uInt32 /*nFlags*/)
mpGraphics->CopyBits(aPosAry, NULL, this, NULL);
}
-void OutputDevice::ImplDrawFrameDev( const Point& rPt, const Point& rDevPt, const Size& rDevSize,
- const OutputDevice& rOutDev, const Region& rRegion )
-{
-
- GDIMetaFile* pOldMetaFile = mpMetaFile;
- bool bOldMap = mbMap;
- RasterOp eOldROP = GetRasterOp();
- mpMetaFile = NULL;
- mbMap = false;
- SetRasterOp( ROP_OVERPAINT );
-
- if ( !IsDeviceOutputNecessary() )
- return;
-
- if ( !mpGraphics )
- {
- if ( !AcquireGraphics() )
- return;
- }
-
- // ClipRegion zuruecksetzen
- if ( rRegion.IsNull() )
- mpGraphics->ResetClipRegion();
- else
- SelectClipRegion( rRegion );
-
- SalTwoRect aPosAry;
- aPosAry.mnSrcX = rDevPt.X();
- aPosAry.mnSrcY = rDevPt.Y();
- aPosAry.mnSrcWidth = rDevSize.Width();
- aPosAry.mnSrcHeight = rDevSize.Height();
- aPosAry.mnDestX = rPt.X();
- aPosAry.mnDestY = rPt.Y();
- aPosAry.mnDestWidth = rDevSize.Width();
- aPosAry.mnDestHeight = rDevSize.Height();
- ImplDrawOutDevDirect( &rOutDev, aPosAry );
-
- // Ensure that ClipRegion is recalculated and set
- mbInitClipRegion = true;
-
- SetRasterOp( eOldROP );
- mbMap = bOldMap;
- mpMetaFile = pOldMetaFile;
-}
-
-void OutputDevice::ImplGetFrameDev( const Point& rPt, const Point& rDevPt, const Size& rDevSize,
- OutputDevice& rDev )
-{
-
- bool bOldMap = mbMap;
- mbMap = false;
- rDev.DrawOutDev( rDevPt, rDevSize, rPt, rDevSize, *this );
- mbMap = bOldMap;
-}
-
+// Direct OutputDevice drawing private function
-Color OutputDevice::ImplDrawModeToColor( const Color& rColor ) const
+void OutputDevice::ImplDrawOutDevDirect( const OutputDevice* pSrcDev, SalTwoRect& rPosAry )
{
- Color aColor( rColor );
- sal_uLong nDrawMode = GetDrawMode();
+ SalGraphics* pGraphics2;
- if( nDrawMode & ( DRAWMODE_BLACKLINE | DRAWMODE_WHITELINE |
- DRAWMODE_GRAYLINE | DRAWMODE_GHOSTEDLINE |
- DRAWMODE_SETTINGSLINE ) )
+ if ( this == pSrcDev )
+ pGraphics2 = NULL;
+ else
{
- if( !ImplIsColorTransparent( aColor ) )
+ if ( (GetOutDevType() != pSrcDev->GetOutDevType()) ||
+ (GetOutDevType() != OUTDEV_WINDOW) )
{
- if( nDrawMode & DRAWMODE_BLACKLINE )
- {
- aColor = Color( COL_BLACK );
- }
- else if( nDrawMode & DRAWMODE_WHITELINE )
- {
- aColor = Color( COL_WHITE );
- }
- else if( nDrawMode & DRAWMODE_GRAYLINE )
+ if ( !pSrcDev->mpGraphics )
{
- const sal_uInt8 cLum = aColor.GetLuminance();
- aColor = Color( cLum, cLum, cLum );
+ if ( !((OutputDevice*)pSrcDev)->AcquireGraphics() )
+ return;
}
- else if( nDrawMode & DRAWMODE_SETTINGSLINE )
+ pGraphics2 = pSrcDev->mpGraphics;
+ }
+ else
+ {
+ if ( ((Window*)this)->mpWindowImpl->mpFrameWindow == ((Window*)pSrcDev)->mpWindowImpl->mpFrameWindow )
+ pGraphics2 = NULL;
+ else
{
- aColor = GetSettings().GetStyleSettings().GetFontColor();
- }
+ if ( !pSrcDev->mpGraphics )
+ {
+ if ( !((OutputDevice*)pSrcDev)->AcquireGraphics() )
+ return;
+ }
+ pGraphics2 = pSrcDev->mpGraphics;
- if( nDrawMode & DRAWMODE_GHOSTEDLINE )
- {
- aColor = Color( ( aColor.GetRed() >> 1 ) | 0x80,
- ( aColor.GetGreen() >> 1 ) | 0x80,
- ( aColor.GetBlue() >> 1 ) | 0x80);
+ if ( !mpGraphics )
+ {
+ if ( !AcquireGraphics() )
+ return;
+ }
+ DBG_ASSERT( mpGraphics && pSrcDev->mpGraphics,
+ "OutputDevice::DrawOutDev(): We need more than one Graphics" );
}
}
}
- return aColor;
-}
-
-void OutputDevice::SetRefPoint()
-{
-
- if ( mpMetaFile )
- mpMetaFile->AddAction( new MetaRefPointAction( Point(), false ) );
-
- mbRefPoint = false;
- maRefPoint.X() = maRefPoint.Y() = 0L;
-
- if( mpAlphaVDev )
- mpAlphaVDev->SetRefPoint();
-}
-
-void OutputDevice::SetRefPoint( const Point& rRefPoint )
-{
- if ( mpMetaFile )
- mpMetaFile->AddAction( new MetaRefPointAction( rRefPoint, true ) );
+ // #102532# Offset only has to be pseudo window offset
+ const Rectangle aSrcOutRect( Point( pSrcDev->mnOutOffX, pSrcDev->mnOutOffY ),
+ Size( pSrcDev->mnOutWidth, pSrcDev->mnOutHeight ) );
- mbRefPoint = true;
- maRefPoint = rRefPoint;
+ AdjustTwoRect( rPosAry, aSrcOutRect );
- if( mpAlphaVDev )
- mpAlphaVDev->SetRefPoint( rRefPoint );
+ if ( rPosAry.mnSrcWidth && rPosAry.mnSrcHeight && rPosAry.mnDestWidth && rPosAry.mnDestHeight )
+ {
+ // --- RTL --- if this is no window, but pSrcDev is a window
+ // mirroring may be required
+ // because only windows have a SalGraphicsLayout
+ // mirroring is performed here
+ if( (GetOutDevType() != OUTDEV_WINDOW) && pGraphics2 && (pGraphics2->GetLayout() & SAL_LAYOUT_BIDI_RTL) )
+ {
+ SalTwoRect aPosAry2 = rPosAry;
+ pGraphics2->mirror( aPosAry2.mnSrcX, aPosAry2.mnSrcWidth, pSrcDev );
+ mpGraphics->CopyBits( aPosAry2, pGraphics2, this, pSrcDev );
+ }
+ else
+ mpGraphics->CopyBits( rPosAry, pGraphics2, this, pSrcDev );
+ }
}
-void OutputDevice::SetConnectMetaFile( GDIMetaFile* pMtf )
-{
- mpMetaFile = pMtf;
-}
+// Layout public functions
-void OutputDevice::SetSettings( const AllSettings& rSettings )
+void OutputDevice::EnableRTL( bool bEnable )
{
- *mxSettings = rSettings;
+ mbEnableRTL = bEnable;
if( mpAlphaVDev )
- mpAlphaVDev->SetSettings( rSettings );
+ mpAlphaVDev->EnableRTL( bEnable );
}
-sal_uInt16 OutputDevice::GetBitCount() const
+bool OutputDevice::ImplIsAntiparallel() const
{
- // we need a graphics instance
- if ( !mpGraphics )
+ bool bRet = false;
+ if( AcquireGraphics() )
{
- if ( !((OutputDevice*)this)->AcquireGraphics() )
- return 0;
+ if( ( (mpGraphics->GetLayout() & SAL_LAYOUT_BIDI_RTL) && ! IsRTLEnabled() ) ||
+ ( ! (mpGraphics->GetLayout() & SAL_LAYOUT_BIDI_RTL) && IsRTLEnabled() ) )
+ {
+ bRet = true;
+ }
}
-
- return (sal_uInt16)mpGraphics->GetBitCount();
+ return bRet;
}
-sal_uInt16 OutputDevice::GetAlphaBitCount() const
+// note: the coordinates to be remirrored are in frame coordiantes !
+
+void OutputDevice::ReMirror( Point &rPoint ) const
{
- return 0;
+ rPoint.X() = mnOutOffX + mnOutWidth - 1 - rPoint.X() + mnOutOffX;
}
-
-sal_uLong OutputDevice::GetColorCount() const
+void OutputDevice::ReMirror( Rectangle &rRect ) const
{
+ long nWidth = rRect.Right() - rRect.Left();
- const sal_uInt16 nBitCount = GetBitCount();
- return( ( nBitCount > 31 ) ? ULONG_MAX : ( ( (sal_uLong) 1 ) << nBitCount) );
-}
+ //long lc_x = rRect.nLeft - mnOutOffX; // normalize
+ //lc_x = mnOutWidth - nWidth - 1 - lc_x; // mirror
+ //rRect.nLeft = lc_x + mnOutOffX; // re-normalize
-bool OutputDevice::HasAlpha()
-{
- return mpAlphaVDev != NULL;
+ rRect.Left() = mnOutOffX + mnOutWidth - nWidth - 1 - rRect.Left() + mnOutOffX;
+ rRect.Right() = rRect.Left() + nWidth;
}
-css::uno::Reference< css::awt::XGraphics > OutputDevice::CreateUnoGraphics()
+void OutputDevice::ReMirror( Region &rRegion ) const
{
- UnoWrapperBase* pWrapper = Application::GetUnoWrapper();
- return pWrapper ? pWrapper->CreateGraphics( this ) : css::uno::Reference< css::awt::XGraphics >();
-}
+ RectangleVector aRectangles;
+ rRegion.GetRegionRectangles(aRectangles);
+ Region aMirroredRegion;
-SystemGraphicsData OutputDevice::GetSystemGfxData() const
-{
- if ( !mpGraphics )
+ for(RectangleVector::iterator aRectIter(aRectangles.begin()); aRectIter != aRectangles.end(); ++aRectIter)
{
- if ( !AcquireGraphics() )
- return SystemGraphicsData();
+ ReMirror(*aRectIter);
+ aMirroredRegion.Union(*aRectIter);
}
- return mpGraphics->GetGraphicsData();
-}
-
-css::uno::Any OutputDevice::GetSystemGfxDataAny() const
-{
- const SystemGraphicsData aSysData = GetSystemGfxData();
- css::uno::Sequence< sal_Int8 > aSeq( (sal_Int8*)&aSysData,
- aSysData.nSize );
+ rRegion = aMirroredRegion;
- return css::uno::makeAny(aSeq);
}
-css::uno::Reference< css::rendering::XCanvas > OutputDevice::GetCanvas() const
+bool OutputDevice::HasMirroredGraphics() const
{
- css::uno::Sequence< css::uno::Any > aArg(6);
-
- aArg[ 0 ] = css::uno::makeAny( reinterpret_cast<sal_Int64>(this) );
- aArg[ 2 ] = css::uno::makeAny( css::awt::Rectangle( mnOutOffX, mnOutOffY, mnOutWidth, mnOutHeight ) );
- aArg[ 3 ] = css::uno::makeAny( sal_False );
- aArg[ 5 ] = GetSystemGfxDataAny();
-
- css::uno::Reference<css::uno::XComponentContext> xContext = comphelper::getProcessComponentContext();
-
- // Create canvas instance with window handle
- static css::uno::Reference<css::lang::XMultiComponentFactory > xCanvasFactory( css::rendering::CanvasFactory::create( xContext ) );
-
- css::uno::Reference<css::rendering::XCanvas> xCanvas;
- xCanvas.set(
- xCanvasFactory->createInstanceWithArgumentsAndContext(
- "com.sun.star.rendering.Canvas", aArg, xContext ),
- css::uno::UNO_QUERY );
-
- return xCanvas;
+ return ( AcquireGraphics() && (mpGraphics->GetLayout() & SAL_LAYOUT_BIDI_RTL) );
}
-void OutputDevice::Erase()
+bool OutputDevice::ImplIsRecordLayout() const
{
- if ( !IsDeviceOutputNecessary() || ImplIsRecordLayout() )
- return;
-
- if ( mbBackground )
- {
- RasterOp eRasterOp = GetRasterOp();
- if ( eRasterOp != ROP_OVERPAINT )
- SetRasterOp( ROP_OVERPAINT );
- DrawWallpaper( 0, 0, mnOutWidth, mnOutHeight, maBackground );
- if ( eRasterOp != ROP_OVERPAINT )
- SetRasterOp( eRasterOp );
- }
-
- if( mpAlphaVDev )
- mpAlphaVDev->Erase();
+ return mpOutDevData && mpOutDevData->mpRecordLayout;
}
+// EPS public function
+
bool OutputDevice::DrawEPS( const Point& rPoint, const Size& rSize,
const GfxLink& rGfxLink, GDIMetaFile* pSubst )
{
diff --git a/vcl/source/outdev/outdevstate.cxx b/vcl/source/outdev/outdevstate.cxx
index 15c5dd682e4b..2dcaf11f76a0 100644
--- a/vcl/source/outdev/outdevstate.cxx
+++ b/vcl/source/outdev/outdevstate.cxx
@@ -35,6 +35,7 @@
#include <vcl/outdevstate.hxx>
+#include "outdev.h"
#include "outdata.hxx"
#include "salgdi.hxx"
#include "sallayout.hxx"
@@ -638,4 +639,30 @@ void OutputDevice::InitFillColor()
mbInitFillColor = false;
}
+void OutputDevice::ImplReleaseFonts()
+{
+ mpGraphics->ReleaseFonts();
+ mbNewFont = true;
+ mbInitFont = true;
+
+ if ( mpFontEntry )
+ {
+ mpFontCache->Release( mpFontEntry );
+ mpFontEntry = NULL;
+ }
+
+ if ( mpGetDevFontList )
+ {
+ delete mpGetDevFontList;
+ mpGetDevFontList = NULL;
+ }
+
+ if ( mpGetDevSizeList )
+ {
+ delete mpGetDevSizeList;
+ mpGetDevSizeList = NULL;
+ }
+}
+
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/outdev/transparent.cxx b/vcl/source/outdev/transparent.cxx
index 21d7bb466370..2b94fb6dc5e3 100644
--- a/vcl/source/outdev/transparent.cxx
+++ b/vcl/source/outdev/transparent.cxx
@@ -20,10 +20,13 @@
#include <basegfx/matrix/b2dhommatrixtools.hxx>
#include <boost/scoped_array.hpp>
+
#include <vcl/outdev.hxx>
#include <vcl/virdev.hxx>
#include <vcl/bmpacc.hxx>
+#include <vcl/settings.hxx>
+#include "outdata.hxx"
#include "salgdi.hxx"
namespace
@@ -64,7 +67,56 @@ namespace
return aTarget;
}
+}
+
+Color OutputDevice::ImplDrawModeToColor( const Color& rColor ) const
+{
+ Color aColor( rColor );
+ sal_uLong nDrawMode = GetDrawMode();
+ if( nDrawMode & ( DRAWMODE_BLACKLINE | DRAWMODE_WHITELINE |
+ DRAWMODE_GRAYLINE | DRAWMODE_GHOSTEDLINE |
+ DRAWMODE_SETTINGSLINE ) )
+ {
+ if( !ImplIsColorTransparent( aColor ) )
+ {
+ if( nDrawMode & DRAWMODE_BLACKLINE )
+ {
+ aColor = Color( COL_BLACK );
+ }
+ else if( nDrawMode & DRAWMODE_WHITELINE )
+ {
+ aColor = Color( COL_WHITE );
+ }
+ else if( nDrawMode & DRAWMODE_GRAYLINE )
+ {
+ const sal_uInt8 cLum = aColor.GetLuminance();
+ aColor = Color( cLum, cLum, cLum );
+ }
+ else if( nDrawMode & DRAWMODE_SETTINGSLINE )
+ {
+ aColor = GetSettings().GetStyleSettings().GetFontColor();
+ }
+
+ if( nDrawMode & DRAWMODE_GHOSTEDLINE )
+ {
+ aColor = Color( ( aColor.GetRed() >> 1 ) | 0x80,
+ ( aColor.GetGreen() >> 1 ) | 0x80,
+ ( aColor.GetBlue() >> 1 ) | 0x80);
+ }
+ }
+ }
+ return aColor;
+}
+
+sal_uInt16 OutputDevice::GetAlphaBitCount() const
+{
+ return 0;
+}
+
+bool OutputDevice::HasAlpha()
+{
+ return mpAlphaVDev != NULL;
}
void OutputDevice::ImplPrintTransparent( const Bitmap& rBmp, const Bitmap& rMask,
diff --git a/vcl/source/outdev/wallpaper.cxx b/vcl/source/outdev/wallpaper.cxx
index a46c3b495125..14fd74176e29 100644
--- a/vcl/source/outdev/wallpaper.cxx
+++ b/vcl/source/outdev/wallpaper.cxx
@@ -77,6 +77,25 @@ void OutputDevice::DrawColorWallpaper( long nX, long nY,
EnableMapMode( bMap );
}
+void OutputDevice::Erase()
+{
+ if ( !IsDeviceOutputNecessary() || ImplIsRecordLayout() )
+ return;
+
+ if ( mbBackground )
+ {
+ RasterOp eRasterOp = GetRasterOp();
+ if ( eRasterOp != ROP_OVERPAINT )
+ SetRasterOp( ROP_OVERPAINT );
+ DrawWallpaper( 0, 0, mnOutWidth, mnOutHeight, maBackground );
+ if ( eRasterOp != ROP_OVERPAINT )
+ SetRasterOp( eRasterOp );
+ }
+
+ if( mpAlphaVDev )
+ mpAlphaVDev->Erase();
+}
+
void OutputDevice::DrawBitmapWallpaper( long nX, long nY,
long nWidth, long nHeight,
const Wallpaper& rWallpaper )