Tools module geometry classes
Luboš Luňák
l.lunak at collabora.com
Wed Jun 29 09:37:19 UTC 2022
On Wednesday 29 of June 2022, Chris Sherlock wrote:
> On Wed, Jun 29, 2022 at 9:06 AM Chris Sherlock <chris.sherlock79 at gmail.com>
> wrote:
> > On Mon, Jun 27, 2022 at 4:52 PM Miklos Vajna <vmiklos at collabora.com>
> > wrote:
> >> On Mon, Jun 13, 2022 at 01:03:30PM +1000, Chris Sherlock <
> >> chris.sherlock79 at gmail.com> wrote:
> >> > Are there any plans for deprecating the usage of the tools geometry
> >> primitives? I understand it will be needed for deserialising some legacy
> >> svm files, but is the intention to ever start replacing the tools
> >> primitives with the basegfx primitives?
I guess that depends on what exactly you mean by "intention". If you look at
tools/README.md, it says it's deprecated and "will be removed in the near
future". Except that comment is from 2013. So presumably the intention has
always been there, except it's never actually taken place. The common OOo
pattern of starting to write something new and shiny in order to replace
something old and then never finishing it.
> >> The trouble with e.g. tools::Rectangle is that it can have both a closed
> >> or a half-open interval, and you need to read the surrounding code to
> >> understand which mode is in use. basegfx::B2IRange is explicitly closed.
> >>
> >> So it would help readability to go with basegfx::B2IRange everywhere,
> >> but it's not an easy hack to do such conversions.
While tools::Rectangle is indeed completely brain-damaged with that
open/closed interval problem, I'm not that convinced that basegfx primitives
are that much better, as they have their own list of dumb things. The size
class is actually a typedef of the vector class (because everybody totally
thinks of sizes as vectors, right), the design is ... interesting, so
e.g. 'point = size;' is perfectly valid code, and the classes have like the 5
most basic functions implemented and that's it. So even if it weren't for the
trouble with converting the open/closed problem, the conversion still
wouldn't be simple and it's a question if it would be an actual improvement
in the end.
> > Thanks Miklos. I read the comment above the Rectangle header definition
> > which starts with "Note: this class is a true marvel of engineering:
> > because the author could not decide whether it's better to have a closed
> > or half-open interval, they just implemented *both* in the same class!"
> >
> > What is the feasibility of changing this class to be only explicitly
> > closed?
Next to impossible, I'm afraid. I had a look at it in the past
(https://lists.freedesktop.org/archives/libreoffice/2020-March/084702.html),
and IIRC the summary is that the open/closed interval problem is not a
technical problem. The class uses open or closed interval depending on the
intention of the developer. Some functions assume one or another, but some
work for both and you basically can't tell which one it is unless you know. I
expect there is even code that mixes that for one rectangle instance. So it
is my understanding that you cannot fix that with code, it can be fixed only
by declaring how it's supposed to be used.
BTW, it's also worth noting that the linked to discussion basically points
out that people apparently even can't agree on what a rectangle class
actually should look like. I rather quickly gave up on it and decided I could
spend my time better.
> > Is this the main issue with not converting over to basegfx?
I would say it's a big part, since you'd need to decipher whether each usage
of tools::Rectangle assumes open or closed intervals. Or you'd need to guess
and then fix the fallout and hope there wouldn't be much broken that'd go
undetected. Which would be presumably a tremendous amount of work, and also
boring, obnoxious, error-prone and whatnot.
But as I wrote above, I see more problems with the conversion than just this.
> A quick followup - I have changed the getWidth() and getHeight() functions
> in tools::Rectangle to getHalfOpenWidth/getHalfOpenHeight() - it seems
> needlessly confusing to have functions with the same name except
> capitalizing the first letter (!!) and have differing functionality.
>
> The gerrit commit is here:
>
> https://gerrit.libreoffice.org/c/core/+/136575
>
> Is this reasonable?
I think getHalfOpenWidth() is too long, the 'half' part can be dropped.
But while this is an improvement for the class, it doesn't really change much
about it still being broken as such. The class itself will still be confusing
to use, other function will still be unclear on what they assume, etc.
So I think a good question to ask is what it is you want to achieve and how
much time and energy are you willing to spend on it. I don't want to
demoralize or stop you, it certainly would be really nice if this madness
finally got sorted out, it's just that it hasn't got sorted out yet because
nobody so far has been willing to give it all the effort it'd need.
--
Luboš Luňák
l.lunak at collabora.com
More information about the LibreOffice
mailing list