This is of course a fairly naive initial implementation. We'd probably want to
batch up drawing operations, and only execute them on EndDraw() or Flush() to
reduce state setup overhead.
Aggregates are returned through an implicit parameter after the this/interface
pointer. Note that this follows the C++ convention, affected methods are not
callable from C with the Microsoft headers.
Tag1/tag2 are "error tags". You set them with SetTags(), and if a subsequent
drawing operation generates an error, EndDraw() will return the error code and
tags that were set when the error occurred.