Offset uniqueness in vector of ColorSteps

Armin Le Grand armin_le_grand at me.com
Tue Mar 14 14:08:00 UTC 2023


Hi Regina,

good to hear from you, wanted to contact you already anyways, but we 
were just moving, so I was pretty busy :-)

On 3/14/23 14:09, Regina Henschel wrote:
> Hi Armin,
>
> you put the ColorSteps into a sorted vector with unique offsets of the 
> ColorSteps.
>
> I see a problem with "unique". Both OOXML and SVG allow several color 
> stops to have the same offset. Users need it in OOXML and SVG 
> gradients to create stepped gradients like those from ODF draw:gradient.
>
> Thus forcing uniqueness in our core will give problems in import 
> filter and in implementing the <svg:radialGradient> and 
> <svg:linearGradient> from ODF.

Very good hints, thanks for that.

Indeed I thought about having two (or more) identical ColorStops to 
allow a 'rapid' color change at the same offset. I abandoned that by 
thinking that a very small step could be used that will never get 
visible, so e.g.

   0.5
   0.5000001

But allowing multiple identical may express that indeed better.

The problem is and why I chose uniqueness is also/mainly the UI - how to 
represent equal ColorSteps in a UI trying to visualize the ColorSteps...?

So:

- It should then be OK to have a maximum of *two* ColorStops with 
identical offset?

- When correcting that, and there are more than two, delete all but 1st 
and last? So the in-between ones?

- Also dependent of used colors: if all the same color, identicals can 
be deleted, so go to uniqueness.


And Questions for ODF format:

I see e.g. in SVG something like

<linearGradient id="Gradient2" x1="0" x2="0" y1="0" y2="1">
       <stop offset="0%" stop-color="red" />
       <stop offset="50%" stop-color="black" stop-opacity="0" />
       <stop offset="100%" stop-color="blue" />
</linearGradient>

so I would just add elements like

       <stop offset="0%" stop-color="red" />

to our ODF, is that OK from your POV? I remember we once discussed that 
already, so should be no problem to do that I guess?

I would take out from this the StartColor (AKA offset == 0.0) and the 
EndColor (AKA offset == 1.0), so in the normal case there would be no 
change at all.

If there are ColorSteps with offset != 0.0 or 1.0 I would create that 
extra-entries for these.

Currently we have something like

<draw:gradient draw:name="Gradient_20_2"
     draw:display-name="Gradient 2" draw:style="radial" draw:cx="50%" 
draw:cy="50%"
     draw:start-color="#bf0041"
     draw:end-color="#127622"
     draw:start-intensity="100%" draw:end-intensity="100%" 
draw:border="0%"/>

which would then be something like

<draw:gradient draw:name="Gradient_20_2"
     draw:display-name="Gradient 2" draw:style="radial" draw:cx="50%" 
draw:cy="50%"
     draw:start-color="#bf0041"
     <stop offset="0%" stop-color="red" />
     draw:end-color="#127622"
     draw:start-intensity="100%" draw:end-intensity="100%" 
draw:border="0%"/>

For import of 'older' stuff all will be good.

For import of new stuff in older Offices we would fallback to 
Start/EndColor and ignore the In-Between steps - any ways the best we 
can do AFAIS.

Greetings & thanks in advance,

Armin


>
> Kind regards,
> Regina

-- 
--
ALG (PGP: EE1C 4B3F E751 D8BC C485 DEC1 3C59 F953 D81C F4A2)



More information about the LibreOffice mailing list