Generalise viewport transform to nonzero origins

Not used at the moment, but to prevent possible future confusion.
Linear scaling option for DragSpinBox

Exponential scaling is usually the right thing, but sometimes it's a
poor substitue for linear scaling - implement this here.