The code
newPos[0] = 0.5 - 0.2 * normX * m_ZoomFactor;
newPos[1] = 0.5 + 0.2 * normY * m_ZoomFactor;
newPos[2] = 0.5 - 0.2 * normX * m_ZoomFactor;
newPos[3] = 0.5 + 0.2 * normY * m_ZoomFactor;
makes no sense when describing the lower left and upper right points of the viewport.
The correct way of calculating this for a middle position is:
newPos[0] = 0.5 - 0.1 * normX * m_ZoomFactor;
newPos[1] = 0.5 - 0.1 * normY * m_ZoomFactor;
newPos[2] = 0.5 + 0.1 * normX * m_ZoomFactor;
newPos[3] = 0.5 + 0.1 * normY * m_ZoomFactor;