mathr / blog / #

kf 2.15.2 released

Kalle's Fraktaler 2 + is fast deep zooming Free Software for fractal graphics (Mandelbrot, Burning Ship, etc). The new version kf-2.15.2 I released a couple of days ago has a big new feature: you can design your own custom colouring algorithms in OpenGL GLSL shader fragments, compatible with zoomasm-3.0. Several examples are included. Full change log:

kf-2.15.2 (2021-03-31)
  • new: custom OpenGL colouring algorithms (compatible with zoomasm 3.0)
    • button bottom left of the colors dialog or Ctrl+G in main window
    • text area for GLSL editing, or import and export to `*.glsl` files
    • GLSL is stored in KFP palettes, KFR files and image metadata
    • user API allows access of KFP parameters within GLSL
  • new: OpenGL implementation of colouring algorithm
    • default shader gives similar results as the regular implementation
    • there are tiny differences (1 or 2 ULP) due to different rounding
    • uses portions of libqd ported to GLSL for higher precision (49 bits, vs 24 bits for float and 53 bits for double on CPU)
    • some features remain unimplemented in this version:
      • least squares 2x2 numerical differencing algorithm
      • least squares 3x3 numerical differencing algorithm
  • new: experimental ARM builds are possible using llvm-mingw
    • 64bit aarch64 can be built but crashes on start
    • 32bit armv7 is blocked on a GMP bug(?) (missing symbols in library)
    • still needs gcc windres because llvm windres is incomplete
  • new: option to save EXR files without their 8bit RGBA preview images (makes files smaller and saves faster)
  • new: sRGB gamma-correct downscaling (using patched pixman)
  • fix: removed special case for zooms less than 1e3, fixes rendering of Redshifter 1 cubic a=2 z0=-4/3 (reported by gerrit)
  • fix: make undo and redo refresh the colors dialog
  • fix: remove warning about slow unused derivatives, because it is hard to tell if GLSL colouring might need them
  • fix: dependency preparation script adapted to new architectures
  • fix: dependency preparation script can build subsets of libraries
  • fix: correctly initialize "no glitch detection" vector in SIMD
  • fix: use `delete[]` instead of `delete` in some places
  • fix: use `static inline` to prevent redefinition errors in llvm
  • upgrade to pixman 0.40+git (claudeha/kf branch)
  • upgrade to tiff 4.2.0
  • upgrade to openexr 2.5.5

Get it from

For the next version, I plan on trying to implement the optimized rescaling replacement for the floatexp number type described by Pauldelbrot and implemented in rust-fractal (among others): by properties of iterations, it should be possible to renormalize much less frequently (about once every 200 iterations or more) instead of after every single arithmetic operation (which is very very slow). Hopefully the speedup should be dramatic, which will be very beneficial for the OpenCL engine because it uses floatexp much sooner (due to lack of support for 80bit x87 long double).