High-level description of the algorithm: Frame is separated into flows using several different Perlin noise generators. Frame cells are filled with curves. Each curve is drawn in the direction plotted by noise generator. Each value returned by the generator at (x, y) is mapped to color from a predefined range.