The program uses a list to contain all the objects displayed on the canvas. There are also other lists that are user for other tasks. The selected list contains a list of the selected objects. The undo and redo lists contain the undo and redo operations respectively. Notice that the last two contain operations and not objects. The way undo and redo are implemented is by encapsulating the actions performed by the user into a class called operation. This class contains the parameters of such action as well as the objects involved.
Every time an action or operation is performed it is immediately recorded and added to the undo list. If the user decided to undo and operation, the last one is removed from the Undo list, its inverse performed and then placed on the Redo list. It's equivalent as popping from a stack and pushing into another.
The problems that the program has are from undo/redo. This were the last features added and therefore didn't receive enough testing. In some situations they break the code. More debugging should solve this. The second problem is computing the region for an empty ellipse. To calculate the region an API function called CombineRegion is used. The function takes two regions and combines it to produce a resulting region. The two regions passed as parameters are the augmented and reduced elliptic regions. The function doesn't calculate the difference between the two regions and instead generates an error. I have no idea why.
Some features that were planned but due to time constrains couldn't be implemented was the use of textures in objects. The difficulty was to devise a way to store the textures along with the document in a compact way. If a texture is shared among several objects it doesn't make sense storing it several times. The other feature that didn't make it is saving a screenshot.