handle scale and (partial) zoom