Development/Aw080 documentation

Branch aw080
This document describes the branch aw080 and changes done there up to now (18th May 2012). The branch (now at Apache under https://svn.apache.org/repos/asf/openoffice/branches/alg/aw080) has a quite long history, I started developing it back at Oracle times. It is intended to move quite some stuff forward to get a better, faster and more stable DrawingLayer.

The branch itself was imported from subversion, as a branch-off from aoo/trunk. It can be found here: https://cgit.freedesktop.org/libreoffice/core/commit/?h=aoo/aw080

The associated bugs reports can be found here: https://bugs.documentfoundation.org/show_bug.cgi?id=116979

Presentation
A presentation I held about this can be found here Media:ArminVortragIV.odp. It contains more or less a condensed (but still big) version of the following pages. At the time of doing the presentation, the diff to the trunk was about 340.000 lines.

Motivation
The branch is following a mixture of goals, all intended to overcome some pretty old limitations of the DrawingLayer in the OpenOffice code. The codebase is now nearly 20 years old and was extended by quite some people. Naturally, these used all their own styles and ideas to do so and had various backgrounds (e.g. knowing about linear algebra or not). Together with the bugfixes done (which is good) sometimes by people not knowing the basic principles of the module (which is not good) quite some non-optimal places were changed and leaded to non-optimal situations. The DrawingLayer itself has to be seen as a big, very central component and can be split at least in three basic parts:


 * 1) The DrawingLayer Core which defines the DrawingLayer Model
 * 2) The Renderer which is responsible for visualisation of the Model
 * 3) The Controller which implements and offers all basic interactions with Drawinglayer objects, including Drag&Drop and others.

There are currently ca. 14 users of Drawinglayer, not only the visible applications but also Dialogs and various others. All these have to be taken care of and being adapted when making changes to DrawingLayer. All in all it's like a gordian knot and it's hard to even find parts to cut out and to replace. The main users are the Draw/Impress application, the DrawingLayer is more or less the basic Application on which these are based.

Goals
The goals fall in different categories:


 * 1) Reworks
 * 2) Cleanups
 * 3) Simplifications
 * 4) Restructurings
 * 5) Modernizations

It has shown that it is impossible to move the DrawingLayer code forward with just one goal in mind. The dependencies are too huge; often when trying to cleanup one aspect you stumble over something else which is in the way and needs to be changed first; usually this extends to closed circles and thus prevents the changes. The goal for aw080 is to make as view as necessary compromizes to do this, but also to be brave in breaking those dependencies; with each change the first thought should be: How would this look in an ideal Drawinglayer? This gives the necessary global overview to even change things in the right direction without seeing the whole picture. To do so it is necessary to have an ideal picture of the DrawingLayer, something I needed years to develop the needed overview. This alone shows that it's not too well structured.

Prerequisites
The branch is based on work done already, namely CWS (ChildWorkSpace, comparable with a branch) aw033 (very technical docu about it can be found here) and sume successors using the changes. It added Primtives, ViewObjectContacts and lead – together with extensions in VCL – to AntiAliasing. It already cut some places in that gordian knot and prepared the way to continue with aw080. It represents a good in-between break in the renewal of the Drawinglayer. From my overview it should be roughly the 2nd third of needed changes to get it to a future-proof state where using it further will be possible and useful.

Changes done
I will now try to list the changes already done in aw080 and comment them. I will use no special order. This is not easy, it already is made up of 3000 changed files, the diff has 289031 lines (not even the current one, there happened more until today). I will also not be able to list all changes done but will concentrate on the bigger ones which stand for fundamental changes. I may have roughly added 80% of the changes. For better readability I have splitted them into three categories:

Changes that deeply influence relationships of objects between each other or principally different handling of model data, relationships of objects or processing of data. Changes that influence the used number format, mainly changes from unsigned 32-bit to floating point, including usages of Linear Algebra solutions for object transformations. Changes that apply to cleanup of old stuff, better readability and/or functionality and speed.
 * 1) Paradigm changes
 * 1) Double precision changes
 * 1) Other changes

Things to be done
This is definitely work in progress. The changes need to be tested carefully before aw080 can be reintegrated. While the built version already runs stable, a lot of investigations and fixes in not yet working properly mechanisms has to be done before it can be integrated. There will be no further deep and basic paradigm changes (at least I have none planned), but stabilizing and finishing the current changes will still take some work. Also, the overhaul of all SdrObjects is not finished yet. There also needs to be taken care for connector stuff, glue points and other special things which are often forgotten, but need to be taken into account, too. There are e.g. the export filters to various formats which need to take care of the fact that now objects may be mirrored in X and/or Y. Since the old mechanism was to apply the mirroring to the object geometry this needs to be taken care of. I will certainly start to provide test builds as soon as the branch is stable enough and stabilization is far enough (short: I see no big problems anymore by just playing around with it). This will be the time where Your help will be deeply needed and welcome! Be prepared, but it will take some more time. I also got a question already how this will influence DrawingLayer performance. There will not be too many boosts, but quite some due to the changes for broadcasting and the changes for primitive creation. For questions please use the Apache OpenOffice development list! When more questions arrive, it will be worth to add a Q&A section to this page eventually.

Have fun! Armin