Made all variables const which are never changed and only contain temporary values, removed default switch cases where we know the exact number of choices.
Checking "param" to be nullptr, then return a nullptr instead of param makes no sense.
Param::create() uses "new" on every branch, so if this failed, std::bad_alloc exception will be thrown in the case not enough memory is available.
Also added Milkdrop's wave smoothing algorithm to make the waveforms look less pointy.
Now very closely matches Milkdrop's math and rendering style except some very minor scaling issues.
Will now render wave mode 8 (spectrum) even if not finished/enabled in the original Milkdrop. Also, Milkdrop does for some reason not use the "mystery" parameter to rotate linear waveforms (modes 6-8) even if the source suggests it. projectM will do it, but there are probably no presets that use it purposely.
Also worth noting: The wave_a parameter has no effect in both Milkdrop and projectM. The wave is always drawn fully opaque.
Now uses anti-aliased, 1px lines and draws them four times in a rectangular offset pattern to "fake" a thicker outline.
Needed to pass the actual viewport size into the render context, as the internal texture size value is useless (the target framebuffer is always as large as the viewport).
Moved all declarations and implementations into class-specific files. Makes it easier to find them and creates smaller compilation units.
Added Doxygen comments to all moved classes and reformatted their code.
Fixed a few typos and type/function declarations.
Added default initializers in the headers where needed.
Part of removing the iostream included in PCM.cpp.
I noticed that TestRunner.cpp had a missing #include <iostream>.
By moving the definition to the .cpp, the definition may see <iostream>
without it leaking out to everything that includes TestRunner.hpp.