Skip to content

GSoC 2020

Anurag Aggarwal edited this page Aug 25, 2020 · 10 revisions

Google Summmer of Code 2020

Support for arbitrary precision and export of high quality output

Along with the great mentorship of @kovzol - Zoltán Kovács , I implemented multiple functionalities to XaoS and fixed some existing crashes. We have implemented these changes and successfully released two subversion of XaoS during this time.

Release 4.1 and 4.2 list these changes as:

Finished Work

New Features

  • Palette editor, save/load palettes, storing user palettes in the .xpf file. PR #194 #195 #197

  • The option 'User formulas' maintains a history of recently used formulas. PR #202

  • Fractal info in the Help menu.

  • Batch rendering. PR #184

  • Enabled panning in rotate mode. PR #189

  • Unified Open and Open Image option. Save Image option moved to Save as. PR #191

  • Added option to show Cartesian coordinate grid. PR #171

  • Custom palette helps visualizing palette before applying changes through slider selectable values now. PR #168

  • PNGs exported using 'Save Image' option can be imported back and users can continue zooming on it. PR #166 #180

Bug Fixes

  • Fixed crash on recording XaoS animations. PR #156

  • Fixed crash on rendering using command line. - PR #159

  • Only error messages are shown on incorrect commands - PR #160

  • & other small bug fixes (Memory Leaks, Segmentation Faults).

Changes in XaoSJs

  1. One Screen View for XaoSJs - see commit

  2. Touch Zoom Support for XaoSJs - see commit

Unfinished Work

  1. Support for arbitrary precision:

XaoS doesn't support very deep zooms because of 80 bit floating point arithmetic being used, use of MPFR Library or Perturbation theory was to be investigated to be helpful in producing arbitrary precision for very deep zooms. Further decisions can be taken by bench-marking different method and using the fastest one. XaoS globally uses a number_t variable for switching between float128 and LONG DOUBLE data type. Unfortunately there is no easy way to do this at runtime. Thus in the LONG_DOUBLE compiled version we are restriced to 10^16 zoom and 10^32 for float128 compiled version. float128 version is naturally slower so we can't keep the real time zooming capabilities along smoothly. Even after that we need to support much greater zooms but clearly use of arbitrary precision would be even slower so we should be able to dynamically switch between LONG_DOUBLE (upto 10^16), float128 (upto 10^32) and use of arbitrary precision beyond that.

  • Attempts made:

    1. Templatizing XaoS: @kovzol gave the clever idea to conver number_t from a macro definition to a struct. This struct can maintain two or more types of data structure and we can use a global variable to switch between them. However this was slow. More information at issue #24 comment, repository that implements this - https://github.com/kanurag94/XaoS/tree/templatize-xaos

    2. Converting fractal_context to a class, and templatizing the data type: @jblang suggested that we should convert fractal_context to a class and the functions operating on fractal_context should be made member function. Then we can initiate objects of different data types from outermost function and use a wrapper function to decide which instance gets called. However we have over ~600 instances of fractal_context objects. I couldn't find a way to wrap them easily in a function. More information on issue #24 comment, repository that implements this - https://github.com/kanurag94/XaoS/tree/float128

Clone this wiki locally