Well, it would be great if only one C++ class is needed, but there are several things that must be done for a symmetry painting mode:
This drawing mode modifies the geometry, not colors (as blur/transparency/inks). So this is a new concept. A drawing tool should support special modes with customized "regions of modified pixels". E.g. tiled drawing mode is integrated to inks (PointShape::doInkHline) in master branch (as a rectangle) and now is integrated to ToolLoopManager::calculateDirtyArea() in my local dev branch (as a real gfx::Region, not yet pushed to upstream). Anyway this will not be enough for a symmetry painting mode, we should think a little more about the design/interfaces of this kind stuff (the communication between Editor <-> ToolLoopManager <-> ToolLoop).
UI settings for the tool: the drawing mode on/off checkbox and a way to specify the axis/locations of the symmetry (which I whink will be a special EditorState, like SelectBoxState).
The logic to create the symmetry of the shape (which I think is the "simple part") and the modified region to refresh all editors in real-time.
I don't know why you say "it's quite easy to implement". If you have some idea to do it in a simple way (as a fully functional feature completely integrated to current aseprite UI/design) I would love to hear about it.
When I said one class I meant just one class for calculating symmetry points which could easily be incorporated with a pencil tool. I guess I made a mistake since you would need to add UI configuration for symmetry too which would result in more stuff being added since you have 2 types for symmetry painting: circular and mirror mode :)
When it comes to actual drawing on canvas, only thing you would need to modify modify is pixel placement. Let's say you have one pixel position on the screen with X1 and Y1 coordinates. You input those coordinates into symmetry class and it returns an array of X and Y coordinates for mirror/circular reflection points. The only thing which is tricky is when drawing with wider brush (but if you just use pencil method which draws on X, Y for each coordinate I don't think it should be a problem).
Technically speaking you can do even more by implementing drawing mirrored ellipses just by sending X and Y coordinates of each part of Ellipse Rect into symmetry class.
It only draws a pixel or a line of width 1 when mousedown + mousemove event is executed. You can set number of axes and type of symmetry. I set it to max of 360 because I don't see any point of making it bigger.