Index: libs/libmythtv/NuppelVideoPlayer.cpp
===================================================================
--- libs/libmythtv/NuppelVideoPlayer.cpp	(revision 16483)
+++ libs/libmythtv/NuppelVideoPlayer.cpp	(working copy)
@@ -6971,6 +6971,12 @@
         ClearAfterSeek(true);
 }
 
+static QString toString(const QRect &rect)
+{
+    return QString("@%1,%2 %3x%4")
+        .arg(rect.x()).arg(rect.y()).arg(rect.width()).arg(rect.height());
+}
+
 void NuppelVideoPlayer::DisplayDVDButton(void)
 {
     if (!ringBuffer->InDVDMenuOrStillFrame() || !osd)
@@ -7030,15 +7036,30 @@
         }
 
         // scale highlight image to match OSD size, if required
-        // TODO FIXME This is pretty bogus, it does not adjust for zooming
-        //   or scaling at all, nor does it account for OSD renderers
-        //   where the OSD resolution != video resolution.
-        float hmult = osd->GetSubtitleBounds().width() /
-            (float) video_disp_dim.width();
-        float vmult = osd->GetSubtitleBounds().height() /
-            (float) video_disp_dim.height();
+        QRect subbounds = osd->GetSubtitleBounds();
+        QRect total, visible;
+        float visibleAspect, fontScale, themeAspect;
+        videoOutput->GetOSDBounds(
+            total, visible, visibleAspect, fontScale, themeAspect);
 
-        if ((hmult < 0.99) || (hmult > 1.01) || (vmult < 0.99) || (vmult > 1.01)) 
+        VERBOSE(VB_IMPORTANT, "osd subtitle: " << toString(subbounds));
+        VERBOSE(VB_IMPORTANT, "osd total:    " << toString(total));
+        VERBOSE(VB_IMPORTANT, "osd visible:  " << toString(visible));
+        VERBOSE(VB_IMPORTANT, "vid total:    " <<
+                toString(QRect(QPoint(0,0),video_disp_dim)));
+        cout<<endl;
+
+        float hmult = 1.0f, vmult = 1.0f;
+        if (video_disp_dim.width() > 0)
+            hmult = total.width()  / (float) video_disp_dim.width();
+        if (video_disp_dim.height() > 0)
+            vmult = total.height() / (float) video_disp_dim.height();
+
+        VERBOSE(VB_IMPORTANT, QString("hmult: %1 vmult: %2")
+                .arg(hmult).arg(vmult));
+
+        if ((hmult < 0.99) || (hmult > 1.01) ||
+            (vmult < 0.99) || (vmult > 1.01)) 
         {
             btnX = (int)    (btnX * hmult);
             btnY = (int)    (btnY * vmult);
@@ -7047,9 +7068,21 @@
 
             hl_button = hl_button.smoothScale(w, h);
         } 
-        else 
+        else
+        {
             hmult = vmult = 1.0;
+        }
 
+        int xoff = 0, yoff = 0;
+        if (visible != total)
+        {
+            xoff = total.left() - visible.left();
+            yoff = total.top()  - visible.top();
+        }
+
+        btnX = max(0, (int)btnX + xoff);
+        btnY = max(0, (int)btnY + yoff);
+
         OSDTypeImage* image = new OSDTypeImage();
         image->SetPosition(QPoint(btnX, btnY), hmult, vmult);
         image->Load(hl_button);
Index: libs/libmythtv/videooutbase.cpp
===================================================================
--- libs/libmythtv/videooutbase.cpp	(revision 16481)
+++ libs/libmythtv/videooutbase.cpp	(working copy)
@@ -705,7 +705,7 @@
 //    { return ((1.0f - r) * a) + (r * b); }
 
 /**
- * \fn VideoOutput::GetVisibleOSDBounds(float&,float&) const
+ * \fn VideoOutput::GetVisibleOSDBounds(float&,float&,float) const
  * \brief Returns visible portions of total OSD bounds
  * \param visible_aspect physical aspect ratio of bounds returned
  * \param font_scaling   scaling to apply to fonts
Index: libs/libmythtv/videooutbase.h
===================================================================
--- libs/libmythtv/videooutbase.h	(revision 16481)
+++ libs/libmythtv/videooutbase.h	(working copy)
@@ -74,9 +74,9 @@
     virtual void Zoom(ZoomDirection direction);
  
     virtual void GetDrawSize(int &xoff, int &yoff, int &width, int &height);
-    virtual void GetOSDBounds(QRect &visible, QRect &total,
-                              float &pixelAspect, float &fontScale,
-                              float themeaspect) const;
+    virtual void GetOSDBounds(QRect &total, QRect &visible,
+                              float &visibleAspect, float &fontScale,
+                              float themeAspect) const;
 
     /// \brief Returns current display's frame refresh period in microseconds.
     ///        e.g. 1000000 / frame_rate_in_Hz
