Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp	(revision 53963)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp	(revision 53964)
@@ -53,7 +53,7 @@
 #endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
 
+/* Other VBox includes: */
 #include <iprt/memcache.h>
 #include <VBox/err.h>
-
 
 #ifdef VBOX_WITH_VIDEOHWACCEL
@@ -61,4 +61,8 @@
 # include <VBox/vmm/ssm.h>
 #endif /* VBOX_WITH_VIDEOHWACCEL */
+
+/* Other includes: */
+#include <math.h>
+
 
 #ifdef VBOXQGL_PROF_BASE
@@ -4415,21 +4419,21 @@
 {
     /* Prepare corresponding viewport part: */
-    QRect rect;
-
-    /* Take the scale-factor into account: */
+    QRect rect(uX, uY, uW, uH);
+
+    /* Take the scaling into account: */
     const double dScaleFactor = mSizeInfo.scaleFactor();
-    if (dScaleFactor == 1.0)
-    {
+    const QSize scaledSize = mSizeInfo.scaledSize();
+    if (scaledSize.isValid())
+    {
+        /* Calculate corresponding scale-factors: */
+        const double xScaleFactor = mSizeInfo.visualState() == UIVisualStateType_Scale ?
+                                    (double)scaledSize.width()  / mSizeInfo.width()  : dScaleFactor;
+        const double yScaleFactor = mSizeInfo.visualState() == UIVisualStateType_Scale ?
+                                    (double)scaledSize.height() / mSizeInfo.height() : dScaleFactor;
         /* Adjust corresponding viewport part: */
-        rect.moveTo(uX, uY);
-        rect.setSize(QSize(uW, uH));
-    }
-    else
-    {
-        /* Adjust corresponding viewport part: */
-        rect.moveTo(uX * dScaleFactor - 1,
-                    uY * dScaleFactor - 1);
-        rect.setSize(QSize(uW * dScaleFactor + 2 * dScaleFactor + 1,
-                           uH * dScaleFactor + 2 * dScaleFactor + 1));
+        rect.moveTo(floor((double)rect.x() * xScaleFactor) - 1,
+                    floor((double)rect.y() * yScaleFactor) - 1);
+        rect.setSize(QSize(ceil((double)rect.width()  * xScaleFactor) + 2,
+                           ceil((double)rect.height() * yScaleFactor) + 2));
     }
 
@@ -4441,6 +4445,8 @@
         if (dBackingScaleFactor > 1.0)
         {
-            rect.moveTo(rect.topLeft() / dBackingScaleFactor - QPoint(1, 1));
-            rect.setSize(rect.size() / dBackingScaleFactor + QSize(2, 2));
+            rect.moveTo(floor((double)rect.x() / dBackingScaleFactor) - 1,
+                        floor((double)rect.y() / dBackingScaleFactor) - 1);
+            rect.setSize(QSize(ceil((double)rect.width()  / dBackingScaleFactor) + 2,
+                               ceil((double)rect.height() / dBackingScaleFactor) + 2));
         }
     }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.h	(revision 53963)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.h	(revision 53964)
@@ -1344,4 +1344,5 @@
     VBoxFBSizeInfo() {}
     template<class T> VBoxFBSizeInfo(T *pFb) :
+        m_visualState(pFb->visualState()),
         mPixelFormat(pFb->pixelFormat()), mVRAM(pFb->address()), mBitsPerPixel(pFb->bitsPerPixel()),
         mBytesPerLine(pFb->bytesPerLine()), mWidth(pFb->width()), mHeight(pFb->height()),
@@ -1353,4 +1354,5 @@
                    ulong aWidth, ulong aHeight,
                    bool bUsesGuestVram) :
+        m_visualState(UIVisualStateType_Invalid),
         mPixelFormat(aPixelFormat), mVRAM(aVRAM), mBitsPerPixel(aBitsPerPixel),
         mBytesPerLine(aBytesPerLine), mWidth(aWidth), mHeight(aHeight),
@@ -1358,4 +1360,5 @@
         mUsesGuestVram(bUsesGuestVram) {}
 
+    UIVisualStateType visualState() const { return m_visualState; }
     ulong pixelFormat() const { return mPixelFormat; }
     uchar *VRAM() const { return mVRAM; }
@@ -1371,4 +1374,5 @@
 private:
 
+    UIVisualStateType m_visualState;
     ulong mPixelFormat;
     uchar *mVRAM;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp	(revision 53963)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp	(revision 53964)
@@ -56,5 +56,6 @@
 
 UIFrameBuffer::UIFrameBuffer()
-    : m_iWidth(0), m_iHeight(0)
+    : m_visualState(UIVisualStateType_Invalid)
+    , m_iWidth(0), m_iHeight(0)
     , m_pMachineView(NULL)
     , m_iWinId(0)
@@ -74,4 +75,7 @@
 {
     LogRel2(("UIFrameBuffer::init %p\n", this));
+
+    /* Fetch visual-state: */
+    m_visualState = pMachineView->visualStateType();
 
     /* Assign mahine-view: */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.h	(revision 53963)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.h	(revision 53964)
@@ -76,4 +76,7 @@
       * @note Calls to this and any other EMT callback are synchronized (from GUI side). */
     void setMarkAsUnused(bool fUnused);
+
+    /** Returns the visual-state this frame-buffer created for. */
+    UIVisualStateType visualState() const { return m_visualState; }
 
     /** Returns whether frame-buffer is <b>auto-enabled</b>.
@@ -260,4 +263,7 @@
                               HiDPIOptimizationType hiDPIOptimizationType,
                               double dBackingScaleFactor);
+
+    /** Holds the visual-state this frame-buffer created for. */
+    UIVisualStateType m_visualState;
 
     /** Holds the QImage buffer. */
