include/vcl/floatwin.hxx       |    1 +
 include/vcl/window.hxx         |    1 +
 vcl/source/window/floatwin.cxx |   23 +++++++++++++++++++++++
 vcl/source/window/window.cxx   |   25 +++++++++++++++++++++++--
 4 files changed, 48 insertions(+), 2 deletions(-)

New commits:
commit e9e9d7d1f8f16c4e97b387bf7c2edd42d8219159
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Mon Dec 14 11:27:57 2020 +0000
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Mon Dec 14 16:22:45 2020 +0100

    add a way to undo ImplConvertToAbsPos
    
    Change-Id: Ia739c93c91f512c570d38a385d36bcce76e6fdcd
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107684
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/include/vcl/floatwin.hxx b/include/vcl/floatwin.hxx
index 91a6ae3c8c0e..ef3c38c6bd72 100644
--- a/include/vcl/floatwin.hxx
+++ b/include/vcl/floatwin.hxx
@@ -117,6 +117,7 @@ public:
                                                 sal_uInt16& rArrangeIndex, 
Point* pLOKTwipsPos = nullptr);
                    static Point     ImplConvertToAbsPos(vcl::Window* 
pReference, const Point& rPos);
                    static tools::Rectangle ImplConvertToAbsPos(vcl::Window* 
pReference, const tools::Rectangle& rRect);
+                   static tools::Rectangle ImplConvertToRelPos(vcl::Window* 
pReference, const tools::Rectangle& rRect);
     SAL_DLLPRIVATE void             ImplEndPopupMode( FloatWinPopupEndFlags 
nFlags, const VclPtr<vcl::Window>& xFocusId );
     SAL_DLLPRIVATE tools::Rectangle&       ImplGetItemEdgeClipRect();
     SAL_DLLPRIVATE bool             ImplIsInPrivatePopupMode() const { return 
mbInPopupMode; }
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index b88f565fcc88..43db85d77e5f 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -718,6 +718,7 @@ private:
     SAL_DLLPRIVATE static void          ImplHandleScroll(ScrollBar* pHScrl, 
double nX, ScrollBar* pVScrl, double nY);
 
     SAL_DLLPRIVATE tools::Rectangle     
ImplOutputToUnmirroredAbsoluteScreenPixel( const tools::Rectangle& rRect ) 
const;
+    SAL_DLLPRIVATE tools::Rectangle     
ImplUnmirroredAbsoluteScreenToOutputPixel( const tools::Rectangle& rRect ) 
const;
     SAL_DLLPRIVATE tools::Long                 ImplGetUnmirroredOutOffX();
 
     // retrieves the list of owner draw decorated windows for this window 
hierarchy
diff --git a/vcl/source/window/floatwin.cxx b/vcl/source/window/floatwin.cxx
index 53f9349e565f..1d9bac8c427c 100644
--- a/vcl/source/window/floatwin.cxx
+++ b/vcl/source/window/floatwin.cxx
@@ -524,6 +524,29 @@ tools::Rectangle 
FloatingWindow::ImplConvertToAbsPos(vcl::Window* pReference, co
     }
     else
         
aFloatRect.SetPos(pReference->OutputToAbsoluteScreenPixel(pReference->ScreenToOutputPixel(rRect.TopLeft())));
+
+    return aFloatRect;
+}
+
+tools::Rectangle FloatingWindow::ImplConvertToRelPos(vcl::Window* pReference, 
const tools::Rectangle& rRect)
+{
+    tools::Rectangle aFloatRect = rRect;
+
+    const OutputDevice *pParentWinOutDev = pReference->GetOutDev();
+
+    // compare coordinates in absolute screen coordinates
+    // Keep in sync with FloatingWindow::ImplFloatHitTest, e.g. fdo#33509
+    if( pReference->HasMirroredGraphics()  )
+    {
+        aFloatRect = 
pReference->ImplUnmirroredAbsoluteScreenToOutputPixel(aFloatRect);
+        
aFloatRect.SetPos(pReference->OutputToScreenPixel(aFloatRect.TopLeft()));
+
+        if(!pReference->IsRTLEnabled() )
+            pParentWinOutDev->ReMirror(aFloatRect);
+    }
+    else
+        
aFloatRect.SetPos(pReference->OutputToScreenPixel(pReference->AbsoluteScreenToOutputPixel(rRect.TopLeft())));
+
     return aFloatRect;
 }
 
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 3ab8fad61652..7bbc9924709d 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -2873,17 +2873,38 @@ tools::Rectangle 
Window::ImplOutputToUnmirroredAbsoluteScreenPixel( const tools:
     // and is used for positioning of RTL popup windows correctly on the screen
     SalFrameGeometry g = mpWindowImpl->mpFrame->GetUnmirroredGeometry();
 
-    Point p1 = OutputToScreenPixel( rRect.TopRight() );
+    Point p1 = rRect.TopRight();
+    p1 = OutputToScreenPixel(p1);
     p1.setX( g.nX+g.nWidth-p1.X() );
     p1.AdjustY(g.nY );
 
-    Point p2 = OutputToScreenPixel( rRect.BottomLeft() );
+    Point p2 = rRect.BottomLeft();
+    p2 = OutputToScreenPixel(p2);
     p2.setX( g.nX+g.nWidth-p2.X() );
     p2.AdjustY(g.nY );
 
     return tools::Rectangle( p1, p2 );
 }
 
+tools::Rectangle Window::ImplUnmirroredAbsoluteScreenToOutputPixel( const 
tools::Rectangle &rRect ) const
+{
+    // undo ImplOutputToUnmirroredAbsoluteScreenPixel
+    SalFrameGeometry g = mpWindowImpl->mpFrame->GetUnmirroredGeometry();
+
+    Point p1 = rRect.TopRight();
+    p1.AdjustY(-g.nY );
+    p1.setX( g.nX+g.nWidth-p1.X() );
+    p1 = ScreenToOutputPixel(p1);
+
+    Point p2 = rRect.BottomLeft();
+    p2.AdjustY(-g.nY);
+    p2.setX( g.nX+g.nWidth-p2.X() );
+    p2 = ScreenToOutputPixel(p2);
+
+    return tools::Rectangle( p1, p2 );
+}
+
+
 tools::Rectangle Window::GetWindowExtentsRelative(const vcl::Window 
*pRelativeWindow) const
 {
     // with decoration
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to