I've made little paint programs a dozen times or more. Sometimes the "paint" programs are actually level editors. These tools always do similar things, but I haven't tried to reuse their functionality. This time I tried to make that generalization. It includes common tools, brush stroke shapes, and tool previews. For right now the core tools are freehand draw, straight lines, and rectangles. For the demo app I extend it with flood fill and copy-paste.
The current architecture is ignorant of actual canvas data - it takes "tool state over time" and returns lists of changed pixels. In the future I might include some way of getting at the canvas data to make those operations reusable.