Index: mscore/mscore/imageproperties.cpp
===================================================================
--- mscore/mscore/imageproperties.cpp	(revision 5307)
+++ mscore/mscore/imageproperties.cpp	(working copy)
@@ -31,7 +31,67 @@
       img = i;
       setupUi(this);
       lockAspectRatio->setChecked(img->lockAspectRatio());
-      autoScale->setChecked(img->autoScale());
       z->setValue(img->z());
+      xScale->setValue(img->xScale() * 100.0);
+      yScale->setValue(img->yScale() * 100.0);
+      // if no parent or parent not a V/H frame, disable autoScale
+      if(img->parent() == 0
+                  || (img->parent()->type() != HBOX && img->parent()->type() != VBOX) ) {
+            autoScale->setChecked(false);
+            autoScale->setEnabled(false);
+            }
+      else
+            autoScale->setChecked(img->autoScale());
+      enableScales();
+      connect(lockAspectRatio, SIGNAL(toggled(bool)), this, SLOT(enableScales()));
+      connect(autoScale,       SIGNAL(toggled(bool)), this, SLOT(enableScales()));
+      connect(xScale,          SIGNAL(valueChanged(double)), this, SLOT(alignYScale()));
       }
 
+//---------------------------------------------------------
+//   Enable / Disable X / Y Scale widgets
+//---------------------------------------------------------
+
+void ImageProperties::enableScales()
+      {
+      // Y Scale disabled if either lockRatio or autoScale is set
+      yScale->setEnabled( !(lockAspectRatio->isChecked() || autoScale->isChecked()) );
+      // X Scale disabled if autoScale is set
+      xScale->setEnabled(!autoScale->isChecked());
+
+      // if autoScale, compute scales to fill parent sizes (relative to ORIGINAL image size)
+      if(autoScale->isChecked()) {
+            qreal imgW = img->designSize().width();
+            qreal imgH = img->designSize().height();
+            qreal ratio = imgW / imgH;
+            qreal scale;
+            qreal parW = img->parent()->width();
+            qreal parH = img->parent()->height();
+            // if lockAspectRatio, use the minimum scale factor to set both scales
+            if (lockAspectRatio->isChecked()) {
+                  if ((parW / parH) < ratio)
+                        scale = parW / imgW * 100.0;
+                  else
+                        scale = parH / imgH * 100.0;
+                  xScale->setValue(scale);
+                  }
+            // otherwise, set each scale to the factor required to fill the parent
+            else {
+                  xScale->setValue(parW / imgW * 100.0);
+                  yScale->setValue(parH / imgH * 100.0);
+                  }
+            }
+
+      // in case lockRatio has just been set, align Y Scale
+      alignYScale();
+      }
+
+//---------------------------------------------------------
+//   align Y Scale to X Scale if lockRatio is set
+//---------------------------------------------------------
+
+void ImageProperties::alignYScale()
+      {
+      if(lockAspectRatio->isChecked())
+            yScale->setValue(xScale->value());
+      }
Index: mscore/mscore/imageproperties.h
===================================================================
--- mscore/mscore/imageproperties.h	(revision 5307)
+++ mscore/mscore/imageproperties.h	(working copy)
@@ -39,6 +39,12 @@
       bool getLockAspectRatio() const { return lockAspectRatio->isChecked();}
       bool getAutoScale() const       { return autoScale->isChecked(); }
       int getZ() const                { return z->value(); }
+      qreal getXScale() const         { return xScale->value() / 100.0; }
+      qreal getYScale() const         { return yScale->value() / 100.0; }
+
+   protected slots:
+      void enableScales();
+      void alignYScale();
       };
 
 #endif
Index: mscore/mscore/imageproperties.ui
===================================================================
--- mscore/mscore/imageproperties.ui	(revision 5307)
+++ mscore/mscore/imageproperties.ui	(working copy)
@@ -6,25 +6,81 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>278</width>
-    <height>145</height>
+    <width>410</width>
+    <height>190</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>Image Properties</string>
   </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
+  <layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,0,0,0,0">
    <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <item>
+      <widget class="QLabel" name="label_3">
+       <property name="text">
+        <string>Width scale:</string>
+       </property>
+       <property name="textFormat">
+        <enum>Qt::PlainText</enum>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QDoubleSpinBox" name="xScale">
+       <property name="suffix">
+        <string>%</string>
+       </property>
+       <property name="minimum">
+        <double>1.000000000000000</double>
+       </property>
+       <property name="maximum">
+        <double>1000000.000000000000000</double>
+       </property>
+       <property name="value">
+        <double>100.000000000000000</double>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="label_4">
+       <property name="text">
+        <string>Height scale:</string>
+       </property>
+       <property name="textFormat">
+        <enum>Qt::PlainText</enum>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QDoubleSpinBox" name="yScale">
+       <property name="suffix">
+        <string>%</string>
+       </property>
+       <property name="minimum">
+        <double>1.000000000000000</double>
+       </property>
+       <property name="maximum">
+        <double>1000000.000000000000000</double>
+       </property>
+       <property name="value">
+        <double>100.000000000000000</double>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
     <widget class="QCheckBox" name="lockAspectRatio">
      <property name="text">
-      <string>lock aspect ratio</string>
+      <string>Keep aspect ratio</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QCheckBox" name="autoScale">
      <property name="text">
-      <string>scale to fill frame</string>
+      <string>Scale to fill frame</string>
      </property>
     </widget>
    </item>
@@ -35,6 +91,9 @@
        <property name="text">
         <string>Stacking Order:</string>
        </property>
+       <property name="textFormat">
+        <enum>Qt::PlainText</enum>
+       </property>
       </widget>
      </item>
      <item>
@@ -52,6 +111,9 @@
        <property name="text">
         <string>(0 = foreground)</string>
        </property>
+       <property name="textFormat">
+        <enum>Qt::PlainText</enum>
+       </property>
       </widget>
      </item>
     </layout>
@@ -81,6 +143,14 @@
    </item>
   </layout>
  </widget>
+ <tabstops>
+  <tabstop>xScale</tabstop>
+  <tabstop>yScale</tabstop>
+  <tabstop>lockAspectRatio</tabstop>
+  <tabstop>autoScale</tabstop>
+  <tabstop>z</tabstop>
+  <tabstop>buttonBox</tabstop>
+ </tabstops>
  <resources/>
  <connections>
   <connection>
Index: mscore/mscore/propertymenu.cpp
===================================================================
--- mscore/mscore/propertymenu.cpp	(revision 5307)
+++ mscore/mscore/propertymenu.cpp	(working copy)
@@ -807,12 +807,22 @@
       else if (cmd == "img-props") {
             Image* img = static_cast<Image*>(e);
             ImageProperties vp(img);
+            qreal xScaleOld = img->xScale();
+            qreal yScaleOld = img->yScale();
             int rv = vp.exec();
             if (rv) {
+                  bool lock         = vp.getLockAspectRatio();
+                  bool autoScale    = vp.getAutoScale();
+                  // X Scale: if autoScale, ignore new value and use old
+                  qreal xScaleNew   = autoScale ? xScaleOld : vp.getXScale();
+                  // Y Scale: if lockRatio, use X Scale; otherwise, if autoScale, ignore new value and use old
+                  qreal yScaleNew   = lock ? xScaleNew : (autoScale ? yScaleOld : vp.getYScale());
+                  // if anything relevant has been changed, stack undo cmd
                   if (vp.getLockAspectRatio() != img->lockAspectRatio()
-                     || vp.getAutoScale() != img->autoScale() || vp.getZ() != img->z()) {
-                        score()->undo(new ChangeImage(img,
-                           vp.getLockAspectRatio(), vp.getAutoScale(), vp.getZ()));
+                     || vp.getAutoScale() != img->autoScale() || vp.getZ() != img->z()
+                     || xScaleNew != xScaleOld || yScaleNew != yScaleOld) {
+                        score()->undo(new ChangeImage(img, vp.getLockAspectRatio(),vp.getAutoScale(), vp.getZ(),
+                              xScaleNew, yScaleNew));
                         }
                   }
             }
Index: mscore/libmscore/undo.cpp
===================================================================
--- mscore/libmscore/undo.cpp	(revision 5307)
+++ mscore/libmscore/undo.cpp	(working copy)
@@ -2667,15 +2667,21 @@
 
 void ChangeImage::flip()
       {
-      bool _lockAspectRatio = image->lockAspectRatio();
-      bool _autoScale       = image->autoScale();
-      int  _z               = image->z();
+      bool  _lockAspectRatio  = image->lockAspectRatio();
+      bool  _autoScale        = image->autoScale();
+      int   _z                = image->z();
+      qreal _xScale           = image->xScale();
+      qreal _yScale           = image->yScale();
       image->setLockAspectRatio(lockAspectRatio);
       image->setAutoScale(autoScale);
       image->setZ(z);
-      lockAspectRatio = _lockAspectRatio;
-      autoScale       = _autoScale;
-      z               = _z;
+      image->setXScale(xScale);
+      image->setYScale(yScale);
+      lockAspectRatio   = _lockAspectRatio;
+      autoScale         = _autoScale;
+      z                 = _z;
+      xScale            = _xScale;
+      yScale            = _yScale;
       }
 
 //---------------------------------------------------------
Index: mscore/libmscore/undo.h
===================================================================
--- mscore/libmscore/undo.h	(revision 5307)
+++ mscore/libmscore/undo.h	(working copy)
@@ -1102,12 +1102,14 @@
       bool lockAspectRatio;
       bool autoScale;
       int z;
+      qreal xScale, yScale;
+      QSizeF size;
 
       void flip();
 
    public:
-      ChangeImage(Image* i, bool l, bool a, int _z)
-         : image(i), lockAspectRatio(l), autoScale(a), z(_z) {}
+      ChangeImage(Image* i, bool l, bool a, int _z, qreal _xScale, qreal _yScale)
+            : image(i), lockAspectRatio(l), autoScale(a), z(_z), xScale(_xScale), yScale(_yScale) {}
       virtual void undo() { flip(); }
       virtual void redo() { flip(); }
       UNDO_NAME("ChangeImage");
Index: mscore/libmscore/image.h
===================================================================
--- mscore/libmscore/image.h	(revision 5307)
+++ mscore/libmscore/image.h	(working copy)
@@ -34,7 +34,7 @@
       bool _autoScale;              ///< fill parent frame
       mutable bool _dirty;
 
-      virtual bool isEditable() const { return true; }
+      virtual bool isEditable() const     { return true; }
       virtual void editDrag(const EditData&);
       virtual void endEdit();
       virtual void draw(QPainter*) const;
@@ -44,18 +44,24 @@
 
    public:
       Image(Score*);
-      virtual ElementType type() const { return IMAGE; }
+      virtual ElementType type() const    { return IMAGE; }
       virtual void write(Xml& xml) const;
       virtual void read(const QDomElement&);
       virtual void setPath(const QString& s);
       virtual void layout();
 
       QString path() const;
-      void setSize(QSizeF s)          { sz = s; }
-      bool lockAspectRatio() const    { return _lockAspectRatio; }
-      void setLockAspectRatio(bool v) { _lockAspectRatio = v; }
-      bool autoScale() const          { return _autoScale; }
-      void setAutoScale(bool v)       { _autoScale = v; }
+      QSizeF size() const                 { return sz; }
+      virtual QSize designSize() const = 0;
+      virtual qreal xScale() const = 0;
+      virtual qreal yScale() const = 0;
+      void setSize(QSizeF s)              { sz = s; }
+      bool lockAspectRatio() const        { return _lockAspectRatio; }
+      void setLockAspectRatio(bool v)     { _lockAspectRatio = v; }
+      bool autoScale() const              { return _autoScale; }
+      void setAutoScale(bool v)           { _autoScale = v; }
+      virtual void setXScale(qreal val) = 0;
+      virtual void setYScale(qreal val) = 0;
 
       void reference();
       void dereference();
@@ -72,9 +78,21 @@
       RasterImage(Score*);
       ~RasterImage();
       virtual RasterImage* clone() const;
+      virtual QSize designSize() const    { return doc.size(); }
+      virtual qreal xScale() const        { return sz.width() / doc.size().width(); }
+      virtual qreal yScale() const        { return sz.height()/ doc.size().height(); }
       virtual void draw(QPainter*) const;
       virtual void setPath(const QString& s);
-      virtual QSizeF imageSize() const { return doc.size(); }
+      virtual QSizeF imageSize() const    { return doc.size(); }
+      virtual void setXScale(qreal val)   { if(!_autoScale) {
+                                                sz.setWidth(doc.size().width() * val);
+                                                if(_lockAspectRatio)
+                                                      sz.setHeight(doc.size().height() * val);
+                                            }
+                                          }
+      virtual void setYScale(qreal val)   { if(!_autoScale && !_lockAspectRatio) {
+                                                sz.setHeight(doc.size().height() * val); }
+                                          }
       };
 
 //---------------------------------------------------------
@@ -88,9 +106,21 @@
       SvgImage(Score*);
       ~SvgImage();
       virtual SvgImage* clone() const;
+      virtual QSize designSize() const    { return doc->defaultSize(); }
+      virtual qreal xScale() const        { return sz.width() / doc->defaultSize().width(); }
+      virtual qreal yScale() const        { return sz.height()/ doc->defaultSize().height(); }
       virtual void draw(QPainter*) const;
       virtual void setPath(const QString& s);
-      virtual QSizeF imageSize() const { return doc->defaultSize(); }
+      virtual QSizeF imageSize() const    { return doc->defaultSize(); }
+      virtual void setXScale(qreal val)   { if(!_autoScale) {
+                                                sz.setWidth(doc->defaultSize().width() * val);
+                                                if(_lockAspectRatio)
+                                                      sz.setHeight(doc->defaultSize().height() * val);
+                                            }
+                                          }
+      virtual void setYScale(qreal val)   { if(!_autoScale && !_lockAspectRatio) {
+                                                sz.setHeight(doc->defaultSize().height() * val); }
+                                          }
       };
 
 #endif
