I think the undo/redo architecture needs reworking. At the moment “marks” go before series of undo events. I think they need to go between, so one at the bottom and top of the stack, with marks on boundaries. Redoing has too much special logic at the moment. It should only have as much special logic as undoing, which will be the case with a mark at the end of the undo list as well as at the beginning.
Update: undo/redo now works as described. OpenGL transformation matrices and the pan/zoom tools are next.