Index: libs/libmythtv/osdlistbtntype.h
===================================================================
--- libs/libmythtv/osdlistbtntype.h	(revision 8788)
+++ libs/libmythtv/osdlistbtntype.h	(working copy)
@@ -66,7 +66,7 @@
                     const QRect &levelsize, int levelspacing,
                     float wmult, float hmult);
 
-    void Reinit(float wchange, float hchange, float wmult, float hmult);
+    void Reinit(float wmult, float hmult);
     void SetGroupCheckState(QString group, int newState = 0);
 
     void SetFontActive(TTFFont *font);
@@ -116,11 +116,16 @@
     uint      m_itemRegAlpha;
     uint      m_itemSelAlpha;
    
-    int m_spacing;
-    int m_margin;
+    int       m_spacing;
+    int       m_margin;
+    QRect     m_totalarea;
+    QRect     m_levelsize;
 
-    QRect m_totalarea;
-    QRect m_levelsize;
+    float     m_unbiasedspacing;
+    float     m_unbiasedmargin;
+    QRect     m_unbiasedarea;
+    QRect     m_unbiasedsize;
+
     int m_levelspacing;
 
     float m_wmult;
@@ -139,7 +144,7 @@
                    bool showScrollArrows = false);
     ~OSDListBtnType();
 
-    void  Reinit(float wchange, float hchange, float wmult, float hmult);
+    void  Reinit(float wmult, float hmult);
     void  SetGroupCheckState(QString group, int newState = 0);
 
     void  SetFontActive(TTFFont *font);
@@ -180,16 +185,22 @@
     void  RemoveItem(OSDListBtnTypeItem *item);
 
     int   m_order;
-    QRect m_rect;
     QRect m_contentsRect;
     QRect m_arrowsRect;
 
     float m_wmult;
     float m_hmult;
 
+    QRect m_rect;
+    QRect m_unbiasedRect;
+
     int   m_itemHeight;
     int   m_itemSpacing;
     int   m_itemMargin;
+    float m_itemUnbiasedHeight;
+    float m_itemUnbiasedSpacing;
+    float m_itemUnbiasedMargin;
+
     uint  m_itemsVisible;
 
     bool  m_active;
@@ -265,7 +276,7 @@
     void  setGroup(QString group) { m_group = group; };
     QString getGroup(void) { return m_group; }
 
-    void  Reinit(float wchange, float hchange, float wmult, float hmult);
+    void  Reinit(float wmult, float hmult);
     
     void  paint(OSDSurface *surface, TTFFont *font, int fade, int maxfade, 
                 int x, int y);
@@ -285,6 +296,11 @@
     QRect          m_textRect;
     QRect          m_arrowRect;
 
+    QRect          m_unbiasedCheckRect;
+    QRect          m_unbiasedPixmapRect;
+    QRect          m_unbiasedTextRect;
+    QRect          m_unbiasedArrowRect;
+
     bool           m_showArrow;    
 
     friend class OSDListBtnType;
Index: libs/libmythtv/NuppelVideoPlayer.cpp
===================================================================
--- libs/libmythtv/NuppelVideoPlayer.cpp	(revision 8788)
+++ libs/libmythtv/NuppelVideoPlayer.cpp	(working copy)
@@ -4972,7 +4972,7 @@
                 QImage scaledImage = qImage.smoothScale(rect->w, rect->h);
 
                 OSDTypeImage* image = new OSDTypeImage();
-                image->SetPosition(QPoint(rect->x, rect->y));
+                image->SetPosition(QPoint(rect->x, rect->y), hmult, vmult);
                 image->LoadFromQImage(scaledImage);
 
                 subtitleOSD->AddType(image);
Index: libs/libmythtv/osdlistbtntype.cpp
===================================================================
--- libs/libmythtv/osdlistbtntype.cpp	(revision 8788)
+++ libs/libmythtv/osdlistbtntype.cpp	(working copy)
@@ -66,7 +66,19 @@
     m_hmult = hmult;
 
     m_totalarea = area;
+    m_unbiasedarea =
+        QRect((int)round(m_totalarea.x()      / wmult),
+              (int)round(m_totalarea.y()      / hmult),
+              (int)ceil( m_totalarea.width()  / wmult),
+              (int)ceil( m_totalarea.height() / hmult));
+
     m_levelsize = levelsize;
+    m_unbiasedsize =
+        QRect((int)round(m_levelsize.x()      / wmult),
+              (int)round(m_levelsize.y()      / hmult),
+              (int)ceil( m_levelsize.width()  / wmult),
+              (int)ceil( m_levelsize.height() / hmult));
+
     m_levelspacing = levelspacing;
 
     if (gContext->GetNumSetting("UseArrowAccels", 1))
@@ -94,35 +106,32 @@
     m_margin = 0;
 }
 
-void OSDListTreeType::Reinit(float wchange, float hchange, float wmult,
-                             float hmult)
+void OSDListTreeType::Reinit(float wmult, float hmult)
 {
     m_wmult = wmult;
     m_hmult = hmult;
 
-    m_spacing = (int)(m_spacing * wchange);
-    m_margin = (int)(m_margin * wchange);
+    m_spacing = (int)(m_unbiasedspacing * wmult);
+    m_margin  = (int)(m_unbiasedmargin  * wmult);
 
-    int width = (int)(m_totalarea.width() * wchange);
-    int height = (int)(m_totalarea.height() * hchange);
-    int x = (int)(m_totalarea.x() * wchange);
-    int y = (int)(m_totalarea.y() * hchange);
+    m_totalarea =
+        QRect((int)round(m_unbiasedarea.x()      * wmult),
+              (int)round(m_unbiasedarea.y()      * hmult),
+              (int)ceil( m_unbiasedarea.width()  * wmult),
+              (int)ceil( m_unbiasedarea.height() * hmult));
 
-    m_totalarea = QRect(x, y, width, height);
+    m_levelsize = 
+        QRect((int)round(m_unbiasedsize.x()      * wmult),
+              (int)round(m_unbiasedsize.y()      * hmult),
+              (int)ceil( m_unbiasedsize.width()  * wmult),
+              (int)ceil( m_unbiasedsize.height() * hmult));
 
-    width = (int)(m_levelsize.width() * wchange);
-    height = (int)(m_levelsize.height() * hchange);
-    x = (int)(m_levelsize.x() * wchange);
-    y = (int)(m_levelsize.y() * hchange);
-
-    m_levelsize = QRect(x, y, width, height);
-
     QPtrListIterator<OSDListBtnType> it(listLevels);
     OSDListBtnType *child;
 
     while ((child = it.current()) != 0)
     {
-        child->Reinit(wchange, hchange, wmult, hmult);
+        child->Reinit(wmult, hmult);
         ++it;
     }
 }
@@ -166,12 +175,14 @@
 
 void OSDListTreeType::SetSpacing(int spacing)
 {
-    m_spacing = spacing;
+    m_spacing         = spacing;
+    m_unbiasedspacing = spacing / m_wmult;
 }
 
 void OSDListTreeType::SetMargin(int margin)
 {
-    m_margin = margin;
+    m_margin          = margin;
+    m_unbiasedspacing = margin / m_wmult;
 }
 
 void OSDListTreeType::SetAsTree(OSDGenericTree *toplevel)
@@ -423,7 +434,19 @@
               : OSDType(name)
 {
     m_rect             = area;
+    m_unbiasedRect     =
+        QRect((int)round(area.x()      / wmult),
+              (int)round(area.y()      / hmult),
+              (int)ceil( area.width()  / wmult),
+              (int)ceil( area.height() / hmult));
 
+    VERBOSE(VB_IMPORTANT,
+            "OSDListBtnType("<<name<<") "
+            " rect: "<<m_rect.x()<<"x"<<m_rect.y()<<" ("
+            <<m_rect.width()<<", "<<m_rect.height()<<")"
+            " unbias: "<<m_unbiasedRect.x()<<"x"<<m_unbiasedRect.y()<<" ("
+            <<m_unbiasedRect.width()<<", "<<m_unbiasedRect.height()<<")");
+
     m_wmult            = wmult;
     m_hmult            = hmult;
 
@@ -457,30 +480,26 @@
     Reset();
 }
 
-void OSDListBtnType::Reinit(float wchange, float hchange, float wmult,
-                            float hmult)
+void OSDListBtnType::Reinit(float wmult, float hmult)
 {
     m_wmult = wmult;
     m_hmult = hmult;
 
-    m_itemHeight = (int)(m_itemHeight * hchange);
-    m_itemSpacing = (int)(m_itemSpacing * wchange);
-    m_itemMargin = (int)(m_itemMargin * wchange);
+    m_itemHeight  = (int)(m_itemUnbiasedHeight   * hmult) & ~0x1;
+    m_itemSpacing = (int)(m_itemUnbiasedSpacing  * wmult);
+    m_itemMargin  = (int)(m_itemUnbiasedMargin   * wmult);
 
-    int width = (int)(m_rect.width() * wchange);
-    int height = (int)(m_rect.height() * hchange);
-    int x = (int)(m_rect.x() * wchange);
-    int y = (int)(m_rect.y() * hchange);
+    m_rect =
+        QRect((int)round(m_unbiasedRect.x()      * wmult),
+              (int)round(m_unbiasedRect.y()      * hmult),
+              (int)ceil( m_unbiasedRect.width()  * wmult),
+              (int)ceil( m_unbiasedRect.height() * hmult));
 
-    m_rect = QRect(x, y, width, height);
-
     Init();
 
     OSDListBtnTypeItem* item = 0;
-    for (item = m_itemList.first(); item; item = m_itemList.next()) {
-        item->Reinit(wchange, hchange, wmult, hmult);
-    }
-
+    for (item = m_itemList.first(); item; item = m_itemList.next())
+        item->Reinit(wmult, hmult);
 }
 
 void OSDListBtnType::SetGroupCheckState(QString group, int newState)
@@ -520,12 +539,14 @@
 
 void OSDListBtnType::SetSpacing(int spacing)
 {
-    m_itemSpacing = spacing;    
+    m_itemSpacing         = spacing;
+    m_itemUnbiasedSpacing = spacing / m_wmult;
 }
 
 void OSDListBtnType::SetMargin(int margin)
 {
-    m_itemMargin = margin;    
+    m_itemMargin         = margin;    
+    m_itemUnbiasedMargin = margin / m_wmult;
 }
 
 void OSDListBtnType::SetActive(bool active)
@@ -797,9 +818,9 @@
     int sz1 = m_fontActive->Size() * 3 / 2;
     int sz2 = m_fontInactive->Size() * 3 / 2;
     m_itemHeight = QMAX(sz1, sz2) + (int)(2 * m_itemMargin);
+    m_itemUnbiasedHeight = m_itemHeight / m_hmult;
+    m_itemHeight = m_itemHeight & ~0x1;
 
-    m_itemHeight = (m_itemHeight / 2) * 2;
-
     if (m_showScrollArrows) 
     {
         LoadPixmap(m_upArrowRegPix, "uparrow-reg");
@@ -948,6 +969,33 @@
                        (m_pixmap ? m_pixmapRect.width() + margin : 0),
                        height);
 
+    float wmult = m_parent->m_wmult;
+    float hmult = m_parent->m_hmult;
+
+    m_unbiasedCheckRect =
+        QRect((int)(m_checkRect.x()       / wmult),
+              (int)(m_checkRect.y()       / hmult),
+              (int)(m_checkRect.width()   / wmult),
+              (int)(m_checkRect.height()  / hmult));
+
+    m_unbiasedPixmapRect =
+        QRect((int)(m_pixmapRect.x()      / wmult),
+              (int)(m_pixmapRect.y()      / hmult),
+              (int)(m_pixmapRect.width()  / wmult),
+              (int)(m_pixmapRect.height() / hmult));
+
+    m_unbiasedTextRect =
+        QRect((int)(m_textRect.x()        / wmult),
+              (int)(m_textRect.y()        / hmult),
+              (int)(m_textRect.width()    / wmult),
+              (int)(m_textRect.height()   / hmult));
+
+    m_unbiasedArrowRect =
+        QRect((int)(m_arrowRect.x()       / wmult),
+              (int)(m_arrowRect.y()       / hmult),
+              (int)(m_arrowRect.width()   / wmult),
+              (int)(m_arrowRect.height()  / hmult));
+
     m_parent->InsertItem(this);
 }
 
@@ -1050,38 +1098,30 @@
     font->DrawString(surface, tr.x(), tr.y(), m_text, tr.right(), tr.bottom());
 }
 
-void OSDListBtnTypeItem::Reinit(float wchange, float hchange, 
-                                float wmult, float hmult)
+void OSDListBtnTypeItem::Reinit(float wmult, float hmult)
 {
-    (void)wmult;
-    (void)hmult;
+    m_checkRect =
+        QRect((int)(m_unbiasedCheckRect.x()       * wmult),
+              (int)(m_unbiasedCheckRect.y()       * hmult),
+              (int)(m_unbiasedCheckRect.width()   * wmult),
+              (int)(m_unbiasedCheckRect.height()  * hmult));
 
-    int width = (int)(m_checkRect.width() * wchange);
-    int height = (int)(m_checkRect.height() * hchange);
-    int x = (int)(m_checkRect.x() * wchange);
-    int y = (int)(m_checkRect.y() * hchange);
+    m_pixmapRect =
+        QRect((int)(m_unbiasedPixmapRect.x()      * wmult),
+              (int)(m_unbiasedPixmapRect.y()      * hmult),
+              (int)(m_unbiasedPixmapRect.width()  * wmult),
+              (int)(m_unbiasedPixmapRect.height() * hmult));
 
-    m_checkRect = QRect(x, y, width, height);
+    m_textRect =
+        QRect((int)(m_unbiasedTextRect.x()        * wmult),
+              (int)(m_unbiasedTextRect.y()        * hmult),
+              (int)(m_unbiasedTextRect.width()    * wmult),
+              (int)(m_unbiasedTextRect.height()   * hmult));
 
-    width = (int)(m_pixmapRect.width() * wchange);
-    height = (int)(m_pixmapRect.height() * hchange);
-    x = (int)(m_pixmapRect.x() * wchange);
-    y = (int)(m_pixmapRect.y() * hchange);
-
-    m_pixmapRect = QRect(x, y, width, height);
-
-    width = (int)(m_textRect.width() * wchange);
-    height = (int)(m_textRect.height() * hchange);
-    x = (int)(m_textRect.x() * wchange);
-    y = (int)(m_textRect.y() * hchange);
-
-    m_textRect = QRect(x, y, width, height);
-
-    width = (int)(m_arrowRect.width() * wchange);
-    height = (int)(m_arrowRect.height() * hchange);
-    x = (int)(m_arrowRect.x() * wchange);
-    y = (int)(m_arrowRect.y() * hchange);
-
-    m_arrowRect = QRect(x, y, width, height);
+    m_arrowRect =
+        QRect((int)(m_unbiasedArrowRect.x()       * wmult),
+              (int)(m_unbiasedArrowRect.y()       * hmult),
+              (int)(m_unbiasedArrowRect.width()   * wmult),
+              (int)(m_unbiasedArrowRect.height()  * hmult));
 }
 
Index: libs/libmythtv/osdtypes.cpp
===================================================================
--- libs/libmythtv/osdtypes.cpp	(revision 8788)
+++ libs/libmythtv/osdtypes.cpp	(working copy)
@@ -160,9 +160,6 @@
                     int displaywidth, int displayheight, 
                     float wmult, float hmult, int frint)
 {
-    float wchange = wmult / m_wmult;
-    float hchange = hmult / m_hmult;
-
     m_frameint = frint;
 
     m_screenwidth = screenwidth;
@@ -175,57 +172,12 @@
     vector<OSDType *>::iterator iter = allTypes->begin();
     for (;iter != allTypes->end(); iter++)
     {
-        OSDType *type = (*iter);
-        if (OSDTypeText *item = dynamic_cast<OSDTypeText*>(type))
-        {
-            item->Reinit(wchange, hchange);
-        }
-        else if (OSDTypePositionImage *item =
-                 dynamic_cast<OSDTypePositionImage*>(type))
-        {
-            item->Reinit(wchange, hchange, wmult, hmult);
-        }
-        else if (OSDTypePosSlider *item = dynamic_cast<OSDTypePosSlider*>(type))
-        {
-            item->Reinit(wchange, hchange, wmult, hmult);
-        }
-        else if (OSDTypeFillSlider *item = 
-                 dynamic_cast<OSDTypeFillSlider*>(type))
-        {
-            item->Reinit(wchange, hchange, wmult, hmult);
-        }
-        else if (OSDTypeEditSlider *item =
-                 dynamic_cast<OSDTypeEditSlider*>(type))
-        {
-            item->Reinit(wchange, hchange, wmult, hmult);
-        }
-        else if (OSDTypeImage *item = dynamic_cast<OSDTypeImage*>(type))
-        {
-            item->Reinit(wchange, hchange, wmult, hmult);
-        }
-        else if (OSDTypeBox *item = dynamic_cast<OSDTypeBox*>(type))
-        {
-            item->Reinit(wchange, hchange);
-        }
-        else if (OSDTypePositionRectangle *item =
-                  dynamic_cast<OSDTypePositionRectangle*>(type))
-        {
-            item->Reinit(wchange, hchange);
-        }
-        else if (OSDTypeCC *item = dynamic_cast<OSDTypeCC*>(type))
-        {
-            item->Reinit(xoff, yoff, displaywidth, displayheight);
-        }
-        else if (OSDListTreeType *item = dynamic_cast<OSDListTreeType*>(type))
-        {
-            item->Reinit(wchange, hchange, wmult, hmult);
-        }
+        if (OSDTypeCC *cc608 = dynamic_cast<OSDTypeCC*>(*iter))
+            cc608->Reinit(xoff, yoff, displaywidth, displayheight,
+                          wmult, hmult);
         else
-        {
-            cerr << "Unknown conversion\n";
-        }
+            (*iter)->Reinit(wmult, hmult);
     }
-
 }
 
 OSDType *OSDSet::GetType(const QString &name)
@@ -443,7 +395,8 @@
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 OSDTypeText::OSDTypeText(const QString &name, TTFFont *font, 
-                         const QString &text, QRect displayrect)
+                         const QString &text, QRect displayrect,
+                         float wmult, float hmult)
            : OSDType(name)
 {
     m_message = text;
@@ -464,6 +417,12 @@
     m_scrollinit = false;
 
     m_linespacing = 1.5;
+
+    m_unbiasedsize =
+        QRect((int)round(m_screensize.x()      / wmult),
+              (int)round(m_screensize.y()      / hmult),
+              (int)ceil( m_screensize.width()  / wmult),
+              (int)ceil( m_screensize.height() / hmult));
 }
 
 OSDTypeText::OSDTypeText(const OSDTypeText &other)
@@ -507,14 +466,13 @@
     m_scrollinit = false;
 }
 
-void OSDTypeText::Reinit(float wchange, float hchange)
+void OSDTypeText::Reinit(float wmult, float hmult)
 {
-    int width = (int)(m_screensize.width() * wchange);
-    int height = (int)(m_screensize.height() * hchange);
-    int x = (int)(m_screensize.x() * wchange);
-    int y = (int)(m_screensize.y() * hchange);
-
-    m_displaysize = m_screensize = QRect(x, y, width, height);
+    m_displaysize = m_screensize =
+        QRect((int)round(m_unbiasedsize.x()      * wmult),
+              (int)round(m_unbiasedsize.y()      * hmult),
+              (int)ceil( m_unbiasedsize.width()  * wmult),
+              (int)ceil( m_unbiasedsize.height() * hmult));
 }
 
 void OSDTypeText::Draw(OSDSurface *surface, int fade, int maxfade, int xoff, 
@@ -708,7 +666,7 @@
     m_onlyusefirst = false;
 
     m_filename = filename;
-    m_displaypos = displaypos;
+    SetPosition(displaypos, wmult, hmult);
 
     m_yuv = m_alpha = NULL;
     m_isvalid = false;
@@ -760,6 +718,7 @@
     m_onlyusefirst = false;
 
     m_displaypos = QPoint(0, 0);
+    m_unbiasedpos = QPoint(0, 0);
 
     m_yuv = NULL;
     m_alpha = NULL;
@@ -778,6 +737,7 @@
     m_onlyusefirst = false;
 
     m_displaypos = QPoint(0, 0);
+    m_unbiasedpos = QPoint(0, 0);
 
     m_yuv = NULL;
     m_alpha = NULL;
@@ -801,13 +761,19 @@
     m_name = name;
 }
 
-void OSDTypeImage::Reinit(float wchange, float hchange, float wmult, float hmult)
+void OSDTypeImage::SetPosition(QPoint pos, float wmult, float hmult)
 {
-    int x = (int)(m_displaypos.x() * wchange);
-    int y = (int)(m_displaypos.y() * hchange);
+    m_displaypos  = pos;
+    m_unbiasedpos =
+        QPoint((int)round(pos.x() / wmult),
+               (int)round(pos.y() / hmult));
+}
 
-    m_displaypos.setX(x);
-    m_displaypos.setY(y);
+void OSDTypeImage::Reinit(float wmult, float hmult)
+{
+    m_displaypos =
+        QPoint((int)round(m_unbiasedpos.x() * wmult),
+               (int)round(m_unbiasedpos.y() * hmult));
 
     LoadImage(m_filename, wmult, hmult, m_scalew, m_scaleh);
 }
@@ -1043,23 +1009,25 @@
     m_maxval = 1000;
     m_curval = 0;
     m_displayrect = displayrect;
+    m_unbiasedrect =
+        QRect((int)round(m_displayrect.x()      / wmult),
+              (int)round(m_displayrect.y()      / hmult),
+              (int)ceil( m_displayrect.width()  / wmult),
+              (int)ceil( m_displayrect.height() / hmult));
 }
 
 OSDTypePosSlider::~OSDTypePosSlider()
 {
 }
 
-void OSDTypePosSlider::Reinit(float wchange, float hchange, float wmult,
-                              float hmult)
+void OSDTypePosSlider::Reinit(float wmult, float hmult)
 {
-    int width = (int)(m_displayrect.width() * wchange);
-    int height = (int)(m_displayrect.height() * hchange);
-    int x = (int)(m_displayrect.x() * wchange);
-    int y = (int)(m_displayrect.y() * hchange);
-
-    m_displayrect = QRect(x, y, width, height);
-
-    OSDTypeImage::Reinit(wchange, hchange, wmult, hmult);
+    m_displayrect =
+        QRect((int)round(m_unbiasedrect.x()      * wmult),
+              (int)round(m_unbiasedrect.y()      * hmult),
+              (int)ceil( m_unbiasedrect.width()  * wmult),
+              (int)ceil( m_unbiasedrect.height() * hmult));
+    OSDTypeImage::Reinit(wmult, hmult);
 }
 
 void OSDTypePosSlider::SetPosition(int pos)
@@ -1092,23 +1060,25 @@
     m_drawwidth = 0;
     m_onlyusefirst = true;
     m_displayrect = displayrect;
+    m_unbiasedrect =
+        QRect((int)round(m_displayrect.x()      / wmult),
+              (int)round(m_displayrect.y()      / hmult),
+              (int)ceil( m_displayrect.width()  / wmult),
+              (int)ceil( m_displayrect.height() / hmult));
 }
 
 OSDTypeFillSlider::~OSDTypeFillSlider()
 {
 }
 
-void OSDTypeFillSlider::Reinit(float wchange, float hchange, float wmult,
-                               float hmult)
+void OSDTypeFillSlider::Reinit(float wmult, float hmult)
 {
-    int width = (int)(m_displayrect.width() * wchange);
-    int height = (int)(m_displayrect.height() * hchange);
-    int x = (int)(m_displayrect.x() * wchange);
-    int y = (int)(m_displayrect.y() * hchange);
-
-    m_displayrect = QRect(x, y, width, height);
-
-    OSDTypeImage::Reinit(wchange, hchange, wmult, hmult);
+    m_displayrect =
+        QRect((int)round(m_unbiasedrect.x()      * wmult),
+              (int)round(m_unbiasedrect.y()      * hmult),
+              (int)ceil( m_unbiasedrect.width()  * wmult),
+              (int)ceil( m_unbiasedrect.height() * hmult));
+    OSDTypeImage::Reinit(wmult, hmult);
 }
 
 void OSDTypeFillSlider::SetPosition(int pos)
@@ -1143,6 +1113,11 @@
     m_maxval = 1000;
     m_curval = 0;
     m_displayrect = displayrect;
+    m_unbiasedrect =
+        QRect((int)round(m_displayrect.x()      / wmult),
+              (int)round(m_displayrect.y()      / hmult),
+              (int)ceil( m_displayrect.width()  / wmult),
+              (int)ceil( m_displayrect.height() / hmult));
     m_drawwidth = displayrect.width();
 
     m_drawMap = new unsigned char[m_drawwidth + 1];
@@ -1191,15 +1166,14 @@
         delete [] m_ralpha;
 }
 
-void OSDTypeEditSlider::Reinit(float wchange, float hchange, float wmult,
-                               float hmult)
+void OSDTypeEditSlider::Reinit(float wmult, float hmult)
 {
-    int width = (int)(m_displayrect.width() * wchange);
-    int height = (int)(m_displayrect.height() * hchange);
-    int x = (int)(m_displayrect.x() * wchange);
-    int y = (int)(m_displayrect.y() * hchange);
+    m_displayrect =
+        QRect((int)round(m_unbiasedrect.x()      * wmult),
+              (int)round(m_unbiasedrect.y()      * hmult),
+              (int)ceil( m_unbiasedrect.width()  * wmult),
+              (int)ceil( m_unbiasedrect.height() * hmult));
 
-    m_displayrect = QRect(x, y, width, height);
     m_drawwidth = m_displayrect.width();
 
     delete [] m_drawMap;
@@ -1360,30 +1334,46 @@
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-OSDTypeBox::OSDTypeBox(const QString &name, QRect displayrect) 
-          : OSDType(name)
+OSDTypeBox::OSDTypeBox(const QString &name, QRect displayrect,
+                       float wmult, float hmult)
+    : OSDType(name)
 {
     size = displayrect;
+    m_unbiasedsize =
+        QRect((int)round(size.x()      / wmult),
+              (int)round(size.y()      / hmult),
+              (int)ceil( size.width()  / wmult),
+              (int)ceil( size.height() / hmult));
 }
 
+void OSDTypeBox::SetRect(QRect newrect, float wmult, float hmult)
+{
+    size = newrect;
+    m_unbiasedsize =
+        QRect((int)round(size.x()      / wmult),
+              (int)round(size.y()      / hmult),
+              (int)ceil( size.width()  / wmult),
+              (int)ceil( size.height() / hmult));
+}
+
 OSDTypeBox::OSDTypeBox(const OSDTypeBox &other)
           : OSDType(other.m_name)
 {
     size = other.size;
+    m_unbiasedsize = other.m_unbiasedsize;
 }
 
 OSDTypeBox::~OSDTypeBox()
 {
 }
 
-void OSDTypeBox::Reinit(float wchange, float hchange)
+void OSDTypeBox::Reinit(float wmult, float hmult)
 {
-    int width = (int)(size.width() * wchange);
-    int height = (int)(size.height() * hchange);
-    int x = (int)(size.x() * wchange);
-    int y = (int)(size.y() * hchange);
-
-    size = QRect(x, y, width, height);
+    size =
+        QRect((int)round(m_unbiasedsize.x()      * wmult),
+              (int)round(m_unbiasedsize.y()      * hmult),
+              (int)ceil( m_unbiasedsize.width()  * wmult),
+              (int)ceil( m_unbiasedsize.height() * hmult));
 }
 
 void OSDTypeBox::Draw(OSDSurface *surface, int fade, int maxfade, int xoff, 
@@ -1498,44 +1488,52 @@
 }       
    
 OSDTypePositionRectangle::OSDTypePositionRectangle(
-                                        const OSDTypePositionRectangle &other) 
-                        : OSDType(other.m_name), OSDTypePositionIndicator(other)
+    const OSDTypePositionRectangle &other) 
+    : OSDType(other.m_name), OSDTypePositionIndicator(other)
 {
     for (int i = 0; i < m_numpositions; i++)
     {
         QRect tmp = other.positions[i];
         positions.push_back(tmp);
     }
+    for (int i = 0; i < m_numpositions; i++)
+    {
+        QRect tmp = other.unbiasedpos[i];
+        unbiasedpos.push_back(tmp);
+    }
 }
 
 OSDTypePositionRectangle::~OSDTypePositionRectangle()
 {
 }
 
-void OSDTypePositionRectangle::Reinit(float wchange, float hchange)
+void OSDTypePositionRectangle::Reinit(float wmult, float hmult)
 {
     for (int i = 0; i < m_numpositions; i++)
     {
-        QRect tmp = positions[i];
-
-        int width = (int)(tmp.width() * wchange);
-        int height = (int)(tmp.height() * hchange);
-        int x = (int)(tmp.x() * wchange);
-        int y = (int)(tmp.y() * hchange);
-
-        tmp = QRect(x, y, width, height);
-        positions[i] = tmp;
+        QRect tmp = unbiasedpos[i];
+        positions[i] =
+            QRect((int)round(tmp.x()      * wmult),
+                  (int)round(tmp.y()      * hmult),
+                  (int)ceil( tmp.width()  * wmult),
+                  (int)ceil( tmp.height() * hmult));
     }
 }
 
-void OSDTypePositionRectangle::AddPosition(QRect rect)
+void OSDTypePositionRectangle::AddPosition(
+    QRect rect, float wmult, float hmult)
 {
     positions.push_back(rect);
+    unbiasedpos.push_back(
+        QRect((int)round(rect.x()      / wmult),
+              (int)round(rect.y()      / hmult),
+              (int)ceil( rect.width()  / wmult),
+              (int)ceil( rect.height() / hmult)));
     m_numpositions++;
 }
 
-void OSDTypePositionRectangle::Draw(OSDSurface *surface, int fade, int maxfade, 
-                                    int xoff, int yoff)
+void OSDTypePositionRectangle::Draw(
+    OSDSurface *surface, int fade, int maxfade, int xoff, int yoff)
 {
     fade = fade;
     maxfade = maxfade;
@@ -1618,17 +1616,21 @@
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 OSDTypePositionImage::OSDTypePositionImage(const QString &name)
-                    : OSDTypeImage(name), OSDTypePositionIndicator()
+    : OSDTypeImage(name), OSDTypePositionIndicator(),
+      m_wmult(0.0f), m_hmult(0.0f)
 {
 }
 
 OSDTypePositionImage::OSDTypePositionImage(const OSDTypePositionImage &other)
                     : OSDTypeImage(other), OSDTypePositionIndicator(other)
 {
+    m_wmult = other.m_wmult;
+    m_hmult = other.m_hmult;
+
     for (int i = 0; i < m_numpositions; i++)
     {
-        QPoint tmp = other.positions[i];
-        positions.push_back(tmp);
+        positions.push_back(other.positions[i]);
+        unbiasedpos.push_back(other.unbiasedpos[i]);
     }
 }
 
@@ -1636,45 +1638,61 @@
 {
 }
 
-void OSDTypePositionImage::Reinit(float wchange, float hchange, float wmult, 
-                                  float hmult)
+void OSDTypePositionImage::Reinit(float wmult, float hmult)
 {
-    OSDTypeImage::Reinit(wchange, hchange, wmult, hmult);
+    m_wmult = wmult;
+    m_hmult = hmult;
+    
+    OSDTypeImage::Reinit(wmult, hmult);
 
     for (int i = 0; i < m_numpositions; i++)
     {
-        QPoint tmp = positions[i];
-
-        int x = (int)(tmp.x() * wchange);
-        int y = (int)(tmp.y() * hchange);
-
-        positions[i].setX(x);
-        positions[i].setY(y);
+        positions[i] =
+            QPoint((int)round(unbiasedpos[i].x() * wmult),
+                   (int)round(unbiasedpos[i].y() * hmult));
     }
 }
 
-void OSDTypePositionImage::AddPosition(QPoint pos)
+void OSDTypePositionImage::AddPosition(QPoint pos, float wmult, float hmult)
 {
+    if (m_wmult == 0.0f || m_hmult == 0.0f)
+    {
+        m_wmult = wmult;
+        m_hmult = hmult;
+    }
     positions.push_back(pos);
+    unbiasedpos.push_back(
+        QPoint((int)round(pos.x() / wmult),
+               (int)round(pos.y() / hmult)));
+
+    VERBOSE(VB_IMPORTANT,
+            "OSDTypePositionImage::AddPosition["<<m_numpositions<<"]("
+            <<pos.x()<<"x"<<pos.y()
+            <<"  "<<wmult<<", "<<hmult<<")");
+
     m_numpositions++;
 }
 
 void OSDTypePositionImage::Draw(OSDSurface *surface, int fade, int maxfade,
                                 int xoff, int yoff)
 {
+    VERBOSE(VB_IMPORTANT,
+            "OSDTypePositionImage::Draw["<<m_curposition<<"]("
+            <<m_wmult<<", "<<m_hmult<<")");
+
     if (m_curposition < 0 || m_curposition >= m_numpositions)
         return;
 
     QPoint pos = positions[m_curposition];
 
-    OSDTypeImage::SetPosition(pos);
+    OSDTypeImage::SetPosition(pos, m_wmult, m_hmult);
     OSDTypeImage::Draw(surface, fade, maxfade, xoff, yoff);
 }
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 OSDTypeCC::OSDTypeCC(const QString &name, TTFFont *font, int xoff, int yoff,
-                     int dispw, int disph)
+                     int dispw, int disph, float wmult, float hmult)
          : OSDType(name)
 {
     m_font = font;
@@ -1683,9 +1701,11 @@
     yoffset = yoff;
     displaywidth = dispw;
     displayheight = disph;
+    m_wmult = wmult;
+    m_hmult = hmult;
 
     QRect rect = QRect(0, 0, 0, 0);
-    m_box = new OSDTypeBox("cc_background", rect);
+    m_box = new OSDTypeBox("cc_background", rect, wmult, hmult);
     m_ccbackground = gContext->GetNumSetting("CCBackground", 0);
 }
 
@@ -1695,12 +1715,23 @@
     delete m_box;
 }
 
-void OSDTypeCC::Reinit(int x, int y, int dispw, int disph)
+void OSDTypeCC::Reinit(float wmult, float hmult)
 {
+    (void) wmult;
+    (void) hmult;
+    VERBOSE(VB_IMPORTANT, "Programmer error: "
+            "Call to OSDTypeCC::Reinit(float,float)");
+}
+
+void OSDTypeCC::Reinit(int x, int y, int dispw, int disph,
+                       float wmult, float hmult)
+{
     xoffset = x;
     yoffset = y;
     displaywidth = dispw;
     displayheight = disph;
+    m_wmult = wmult;
+    m_hmult = hmult;    
 }
 
 void OSDTypeCC::AddCCText(const QString &text, int x, int y, int color, 
@@ -1875,7 +1906,7 @@
             {
                 QRect rect = QRect(0, 0, textlength + 4, 
                                    (m_font->Size() * 3 / 2) + 3);
-                m_box->SetRect(rect);
+                m_box->SetRect(rect, m_wmult, m_hmult);
                 m_box->Draw(surface, 0, 0, x - 2, y - 2);
             }
 
Index: libs/libmythtv/osdtypes.h
===================================================================
--- libs/libmythtv/osdtypes.h	(revision 8788)
+++ libs/libmythtv/osdtypes.h	(working copy)
@@ -137,6 +137,8 @@
 
     QString Name() { return m_name; }
 
+    virtual void Reinit(float wmult, float hmult) = 0;
+
     virtual void Draw(OSDSurface *surface, int fade, int maxfade, int xoff,
                       int yoff) = 0;
 
@@ -150,11 +152,11 @@
 {
   public:
     OSDTypeText(const QString &name, TTFFont *font, const QString &text,
-                QRect displayrect);
+                QRect displayrect, float wmult, float hmult);
     OSDTypeText(const OSDTypeText &text);
    ~OSDTypeText();
 
-    void Reinit(float wchange, float hchange);
+    void Reinit(float wmult, float hmult);
 
     void SetAltFont(TTFFont *font);
     void SetUseAlt(bool usealt) { m_usingalt = usealt; }
@@ -190,6 +192,7 @@
 
     QRect m_displaysize;
     QRect m_screensize;
+    QRect m_unbiasedsize;
     QString m_message;
     QString m_default_msg;
 
@@ -231,7 +234,7 @@
     virtual ~OSDTypeImage();
 
     void SetName(const QString &name);
-    void Reinit(float wchange, float hchange, float wmult, float hmult);
+    void Reinit(float wmult, float hmult);
 
     void LoadImage(const QString &filename, float wmult, float hmult, 
                    int scalew = -1, int scaleh = -1);
@@ -239,21 +242,20 @@
 
     void SetStaticSize(int scalew, int scaleh) { m_scalew = scalew;
                                                  m_scaleh = scaleh; }
+    void SetPosition(QPoint pos, float wmult, float hmult);
 
-    QPoint DisplayPos() { return m_displaypos; }
-    void SetPosition(QPoint pos) { m_displaypos = pos; }
+    QPoint DisplayPos() const { return m_displaypos;         }
+    QRect  ImageSize()  const { return m_imagesize;          }
+    int    width()      const { return m_imagesize.width();  }
+    int    height()     const { return m_imagesize.height(); }
 
-    QRect ImageSize() { return m_imagesize; }
-
-    int width() { return m_imagesize.width(); }
-    int height() { return m_imagesize.height(); }
-
     virtual void Draw(OSDSurface *surface, int fade, int maxfade, int xoff, 
                       int yoff);
 
   protected:
     QRect m_imagesize;
     QPoint m_displaypos;
+    QPoint m_unbiasedpos;
 
     QString m_filename;
 
@@ -280,7 +282,7 @@
                       int scalew = -1, int scaleh = -1);
    ~OSDTypePosSlider();
 
-    void Reinit(float wchange, float hchange, float wmult, float hmult);
+    void Reinit(float wmult, float hmult);
 
     void SetRectangle(QRect rect) { m_displayrect = rect; }
     QRect ImageSize() { return m_imagesize; }
@@ -290,6 +292,7 @@
 
   private:
     QRect m_displayrect;
+    QRect m_unbiasedrect;
     int m_maxval;
     int m_curval;
 };
@@ -302,7 +305,7 @@
                       int scalew = -1, int scaleh = -1);
    ~OSDTypeFillSlider();
 
-    void Reinit(float wchange, float hchange, float wmult, float hmult);
+    void Reinit(float wmult, float hmult);
 
     void SetRectangle(QRect rect) { m_displayrect = rect; }
     QRect ImageSize() { return m_imagesize; }
@@ -314,6 +317,7 @@
 
   private:
     QRect m_displayrect;
+    QRect m_unbiasedrect;
     int m_maxval;
     int m_curval;
 };
@@ -327,7 +331,7 @@
                       int scalew = -1, int scaleh = -1);
    ~OSDTypeEditSlider();
 
-    void Reinit(float wchange, float hchange, float wmult, float hmult);
+    void Reinit(float wmult, float hmult);
 
     void SetRectangle(QRect rect) { m_displayrect = rect; }
     QRect ImageSize() { return m_imagesize; }
@@ -339,6 +343,7 @@
 
   private:
     QRect m_displayrect;
+    QRect m_unbiasedrect;
     int m_maxval;
     int m_curval;
 
@@ -360,17 +365,19 @@
 class OSDTypeBox : public OSDType
 {
   public:
-    OSDTypeBox(const QString &name, QRect displayrect); 
+    OSDTypeBox(const QString &name, QRect displayrect,
+               float wmult, float hmult);
     OSDTypeBox(const OSDTypeBox &other);
    ~OSDTypeBox();
 
-    void Reinit(float wchange, float hchange);
-    void SetRect(QRect newrect) { size = newrect; }
+    void Reinit(float wmult, float hmult);
+    void SetRect(QRect newrect, float wmult, float hmult);
 
     void Draw(OSDSurface *surface, int fade, int maxfade, int xoff, int yoff);
 
   private:
     QRect size;
+    QRect m_unbiasedsize;
 };
 
 class OSDTypePositionIndicator
@@ -403,14 +410,15 @@
     OSDTypePositionRectangle(const OSDTypePositionRectangle &other);
    ~OSDTypePositionRectangle();
 
-    void AddPosition(QRect rect);
+    void AddPosition(QRect rect, float wmult, float hmult);
 
-    void Reinit(float wchange, float hchange);
+    void Reinit(float wmult, float hmult);
 
     void Draw(OSDSurface *surface, int fade, int maxfade, int xoff, int yoff);
 
   private:
-    vector<QRect> positions; 
+    vector<QRect> positions;
+    vector<QRect> unbiasedpos;
 };
 
 class OSDTypePositionImage : public virtual OSDTypeImage, 
@@ -421,14 +429,17 @@
     OSDTypePositionImage(const OSDTypePositionImage &other);
    ~OSDTypePositionImage();
 
-    void Reinit(float wchange, float hchange, float wmult, float hmult);
+    void Reinit(float wmult, float hmult);
 
-    void AddPosition(QPoint pos);
+    void AddPosition(QPoint pos, float wmult, float hmult);
 
     void Draw(OSDSurface *surface, int fade, int maxfade, int xoff, int yoff);
 
   private:
     vector<QPoint> positions;
+    vector<QPoint> unbiasedpos;
+    float m_wmult;
+    float m_hmult;
 };
 
 class ccText
@@ -445,11 +456,15 @@
 {
   public:
     OSDTypeCC(const QString &name, TTFFont *font, int xoff, int yoff,
-              int dispw, int disph);
+              int dispw, int disph, float wmult, float hmult);
    ~OSDTypeCC();
 
-    void Reinit(int xoff, int yoff, int dispw, int disph);
+    void Reinit(float wmult, float hmult);
 
+    void Reinit(int xoff, int yoff,
+                int dispw, int disph,
+                float wmult, float hmult);
+
     void AddCCText(const QString &text, int x, int y, int color, 
                    bool teletextmode = false);
     void ClearAllCCText();
@@ -464,7 +479,7 @@
     vector<ccText *> *m_textlist;
     OSDTypeBox *m_box;
     int m_ccbackground;
-
+    float m_wmult, m_hmult;
     int xoffset, yoffset, displaywidth, displayheight;
 };
 
Index: libs/libmythtv/osd.cpp
===================================================================
--- libs/libmythtv/osd.cpp	(revision 8788)
+++ libs/libmythtv/osd.cpp	(working copy)
@@ -154,7 +154,8 @@
         }
 
         OSDTypeCC *ccpage = new OSDTypeCC(name, ccfont, sub_xoff, sub_yoff,
-                                          sub_dispw, sub_disph);
+                                          sub_dispw, sub_disph,
+                                          wmult, hmult);
         container->AddType(ccpage);
     }
 
@@ -517,7 +518,7 @@
         }
     }
 
-    OSDTypeBox *box = new OSDTypeBox(name, area);
+    OSDTypeBox *box = new OSDTypeBox(name, area, wmult, hmult);
     container->AddType(box);
 }
 
@@ -658,7 +659,7 @@
         return;
     }
 
-    OSDTypeText *text = new OSDTypeText(name, ttffont, "", area);
+    OSDTypeText *text = new OSDTypeText(name, ttffont, "", area, wmult, hmult);
     container->AddType(text);
 
     text->SetMultiLine(multiline);
@@ -875,7 +876,7 @@
                 QRect area = parseRect(getFirstText(info));
                 normalizeRect(area);
 
-                rects->AddPosition(area);
+                rects->AddPosition(area, wmult, hmult);
             }
             else
             {
@@ -919,7 +920,7 @@
                 pos.setX((int)(pos.x() * wmult + xoffset));
                 pos.setY((int)(pos.y() * hmult + yoffset));
 
-                image->AddPosition(pos);
+                image->AddPosition(pos, wmult, hmult);
             }
             else if (info.tagName() == "staticsize")
             {
@@ -1897,8 +1898,8 @@
     sprintf(name, "%lld-%d", number, type);
 
     int xpos = (int)((editarrowRect.width() * 1.0 / totalframes) * number);
-    xpos = (editarrowRect.left() + xpos) * wmult;
-    int ypos = editarrowRect.top() * hmult;
+    xpos = (int)((editarrowRect.left() + xpos) * wmult);
+    int ypos = (int) (editarrowRect.top() * hmult);
 
     osdlock.lock();
 
@@ -1925,7 +1926,7 @@
         image = new OSDTypeImage(*editarrowright);
     }
 
-    image->SetPosition(QPoint(xpos, ypos));
+    image->SetPosition(QPoint(xpos, ypos), wmult, hmult);
 
     set->AddType(image);
     set->Display();
