transparency <-> opacity in import from MS Office
Regina Henschel
rb.henschel at t-online.de
Fri Dec 16 21:03:58 UTC 2022
Hi Miklos,
Miklos Vajna schrieb am 16.12.2022 um 15:24:
> Hi Regina,
>
> On Thu, Dec 15, 2022 at 08:25:29PM +0100, Regina Henschel <rb.henschel at t-online.de> wrote:
>> if a MS Office user sets 80% Transparency for a stroke, MS Office writes
>> this as
>> <a:alpha val="20000" />.
>> That means, that MS Office writes it out as opacity (which corresponds to
>> the OOXML spec).
>
> Yes, this matches my understanding.
>
>> But if a MS Office user sets 80% Transparency for the fill or outline of a
>> character, MS Office writes this as
>> <w14:alpha val="80000" />.
>> That means, that the value means transparency.
>>
>> Up to now there was no problem as the character outline cannot be rendered
>> at all in LibreOffice and character fill transparency could be rendered but
>> is not imported yet.
>
> Hmm, this may be supported partially, at least I think it worked for me
> for one case in commit 3a749d7278bbe65cfc063e64460df8af6bc2af47 (sw: add
> DOCX import for semi-transparent text, 2020-01-15).
Indeed. It works for "srgbClr". I run into bug tdf#130973. I think the
case "schemeClr" is missing in
TextEffectsHandler::GetTextFillSolidFillAlpha.
So w14:alpha ==> CharFillTransparence works and uses transparency,
and a:alpha ==> FillTransparence or LineTransparence works and uses opacity.
>
>> But with implementing Fontwork this <w14:alpha> element will be rendered as
>> stroke transparency. So somewhere a conversion from transparency to opacity
>> has to be done.
>>
>> I could do this in Color::addTransformation() in general or I could do this
>> isolated in my new Fontwork import.
>>
>> I would like to do this in Color::addTransformation(). What is your opinion
>> on this?
>
> In general, I think oox::drawingml::Color is meant to represent OOXML's
> idea about a color. So converting the value there looks a bit odd,
You are right. The problem only occurs in switching Fontwork on. So it
is better to make the change at that place.
but
> recording if the value means transparency or opacity (depending on if it
> comes from the "a" or "w14" namespaces) is fine.
Color::addTransformation() drops the namespace and Color has no member
to store a namespace, so the information whether it was a w14:alpha or a
a:alpha is lost. Currently that seems to be no problem.
>
> And then once you arrive to the point where you would copy the value to
> an UNO API property,
I do not write to UNO API property directly, but generate LineProperties
and FillProperties objects and use their pushToPropMap methods.
Otherwise I would need to duplicate the 300 lines of gradient handling
which is included in pushToPropMap.
there you can decide if the value in
> oox::drawingml::Color needs a conversion or not.
>
> At least that's how I would do it, if you ask me. :-)
I have put is now where the Fontwork shape is created. It is now
rColor.addTransformation(
oox::NMSP_dml | oox::AttributeConversion::decodeToken((*it).Name),
oox::drawingml::MAX_PERCENT - nNumber);
Previously it was
rColor.addTransformation(
oox::NMSP_w14 | oox::AttributeConversion::decodeToken((*it).Name),
nNumber);
You will see it when the next version is uploaded.
BTW: I make progress, dashes are handled now. Now I'm working on unit
tests. But so short before Christmas there are a lot of other things to do.
Thank you for looking at the problem.
Kind regards,
Regina
More information about the LibreOffice
mailing list