summaryrefslogtreecommitdiffstats
path: root/sw/source/core/layout/virtoutp.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/layout/virtoutp.cxx')
-rw-r--r--sw/source/core/layout/virtoutp.cxx189
1 files changed, 189 insertions, 0 deletions
diff --git a/sw/source/core/layout/virtoutp.cxx b/sw/source/core/layout/virtoutp.cxx
new file mode 100644
index 000000000..dd044317d
--- /dev/null
+++ b/sw/source/core/layout/virtoutp.cxx
@@ -0,0 +1,189 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include "virtoutp.hxx"
+#include <viewopt.hxx>
+#include <rootfrm.hxx>
+#include <osl/diagnose.h>
+
+/* The SWLayVout class manages the virtual output devices.
+ * RootFrame has a static member of this class which is created in FrameInit
+ * and destroyed in FrameFinit.
+ * */
+
+bool SwRootFrame::FlushVout()
+{
+ if (SwRootFrame::s_pVout->IsFlushable())
+ {
+ SwRootFrame::s_pVout->Flush_();
+ return true;
+ }
+ return false;
+}
+
+bool SwRootFrame::HasSameRect( const SwRect& rRect )
+{
+ if (SwRootFrame::s_pVout->IsFlushable())
+ return ( rRect == SwRootFrame::s_pVout->GetOrgRect() );
+ return false;
+}
+
+/** method to set mapping/pixel offset for virtual output device
+
+ OD 12.11.2002 #96272# - method implements two solutions for the mapping of
+ the virtual output device:
+ The old solution set the origin of the mapping mode, which will be used in
+ the virtual output device. This causes several paint errors, because of the
+ different roundings in the virtual output device and the original output device.
+ The new solution avoids the rounding differences between virtual and original
+ output device by setting a pixel offset at the virtual output device.
+ A define controls, which solution is used, in order to switch in escalation
+ back to old solution.
+
+ @param _pOrgOutDev
+ input parameter - constant instance of the original output device, for which
+ the virtual output device is created.
+
+ @param _pVirDev
+ input/output parameter - instance of the virtual output device.
+
+ @param _rNewOrigin
+ input parameter - constant instance of the origin, which will be used in
+ the virtual output device
+*/
+// define to control, if old or new solution for setting the mapping for
+// a virtual output device is used.
+static void SetMappingForVirtDev( const Point& _rNewOrigin,
+ const vcl::RenderContext* _pOrgOutDev,
+ vcl::RenderContext* _pVirDev )
+{
+ // new solution: set pixel offset at virtual output device
+ Point aPixelOffset = _pOrgOutDev->LogicToPixel( _rNewOrigin );
+ _pVirDev->SetPixelOffset( Size( -aPixelOffset.X(), -aPixelOffset.Y() ) );
+}
+
+// rSize must be pixel coordinates!
+bool SwLayVout::DoesFit( const Size &rNew )
+{
+ if( rNew.Height() > VIRTUALHEIGHT )
+ return false;
+ if( rNew.IsEmpty() )
+ return false;
+ if( rNew.Width() <= m_aSize.Width() )
+ return true;
+ if( !m_pVirDev )
+ {
+ m_pVirDev = VclPtr<VirtualDevice>::Create();
+ m_pVirDev->SetLineColor();
+ if( m_pOut )
+ {
+ if( m_pVirDev->GetFillColor() != m_pOut->GetFillColor() )
+ m_pVirDev->SetFillColor( m_pOut->GetFillColor() );
+ }
+ }
+
+ if( rNew.Width() > m_aSize.Width() )
+ {
+ m_aSize.setWidth( rNew.Width() );
+ if( !m_pVirDev->SetOutputSizePixel( m_aSize ) )
+ {
+ m_pVirDev.disposeAndClear();
+ m_aSize.setWidth( 0 );
+ return false;
+ }
+ }
+ return true;
+}
+
+/// change 2nd parameter <rRect> - no longer <const>
+/// in order to return value of class member variable <aRect>, if virtual
+/// output is used.
+/// <aRect> contains the rectangle that represents the area the virtual
+/// output device is used for and that is flushed at the end.
+void SwLayVout::Enter( SwViewShell *pShell, SwRect &rRect, bool bOn )
+{
+ Flush();
+
+#ifdef DBG_UTIL
+ if( pShell->GetViewOptions()->IsTest3() )
+ {
+ ++m_nCount;
+ return;
+ }
+#endif
+
+ bOn = bOn && !m_nCount && rRect.HasArea() && pShell->GetWin();
+ ++m_nCount;
+ if( !bOn )
+ return;
+
+ m_pShell = pShell;
+ m_pOut = nullptr;
+ OutputDevice *pO = m_pShell->GetOut();
+// We don't cheat on printers or virtual output devices...
+ if( OUTDEV_WINDOW != pO->GetOutDevType() )
+ return;
+
+ m_pOut = pO;
+ Size aPixSz( m_pOut->PixelToLogic( Size( 1,1 )) );
+ SwRect aTmp( rRect );
+ aTmp.AddWidth(aPixSz.Width()/2 + 1 );
+ aTmp.AddHeight(aPixSz.Height()/2 + 1 );
+ tools::Rectangle aTmpRect( pO->LogicToPixel( aTmp.SVRect() ) );
+
+ OSL_ENSURE( !m_pShell->GetWin()->IsReallyVisible() ||
+ aTmpRect.GetWidth() <= m_pShell->GetWin()->GetOutputSizePixel().Width() + 2,
+ "Paintwidth bigger than visarea?" );
+ // Does the rectangle fit in our buffer?
+ if( !DoesFit( aTmpRect.GetSize() ) )
+ {
+ m_pOut = nullptr;
+ return;
+ }
+
+ m_aRect = SwRect( pO->PixelToLogic( aTmpRect ) );
+
+ SetOutDev( m_pShell, m_pVirDev );
+
+ if( m_pVirDev->GetFillColor() != m_pOut->GetFillColor() )
+ m_pVirDev->SetFillColor( m_pOut->GetFillColor() );
+
+ MapMode aMapMode( m_pOut->GetMapMode() );
+ // use method to set mapping
+ //aMapMode.SetOrigin( Point(0,0) - aRect.Pos() );
+ ::SetMappingForVirtDev( m_aRect.Pos(), m_pOut, m_pVirDev );
+
+ if( aMapMode != m_pVirDev->GetMapMode() )
+ m_pVirDev->SetMapMode( aMapMode );
+
+ // set value of parameter <rRect>
+ rRect = m_aRect;
+
+}
+
+void SwLayVout::Flush_()
+{
+ OSL_ENSURE( m_pVirDev, "SwLayVout::DrawOut: nothing left Toulouse" );
+ m_pOut->DrawOutDev( m_aRect.Pos(), m_aRect.SSize(),
+ m_aRect.Pos(), m_aRect.SSize(), *m_pVirDev );
+ SetOutDev( m_pShell, m_pOut );
+ m_pOut = nullptr;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */