As Eike indicated in https://bugs.documentfoundation.org/show_bug.cgi?id=146404#c4
COLOR format codes are preserved in ods/fods format.
The pb was the missing map back.
Indeed, we had the mapping for [COLOR<something>] => Color value (eg: "ffaa16")
but not the reverse mapping Color value => [COLOR<something>]
Eike had provided the right code pointer in xmlnumfi.cxx.
First, I thought using PaletteManager but this one is in svx and svx shouldn't be used in xmloff
(dependency pb).
Then I used ChatGpt (GPT-5.6 Luna) and it pointed the right process.
It just consisted to use a similar callback system (DECL_LINK, IMPL_LINK, LINK) of GetUserDefinedColor.
In addition, by testing all this, I noticed that maList in XColorList::GetIndexOfColor was empty.
So I added the Load call in case mbListDirty is true.
Change-Id: I0ef6b5901f2e4c757e88994412dbf79a13100ffd
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210518
Reviewed-by: Julien Nabet <serval2412@yahoo.fr>
Tested-by: Jenkins
The default drawing style names a theme color now, and a PPTX saved
to ODF and back came out with every shape green. A shape that really
did name a theme color lost the reference and came back plain.
A color item holds the color and the theme reference together.
Setting a plain color started from the item the shape inherits from
its style and overwrote the color alone, so the inherited reference
won. Clear the reference, which is what an explicit color means.
The ODF export repeats each shape's fill on a paragraph style,
applied after the graphic style, and the paragraph properties had no
complex color. Carry it there too.
A style's graphic properties took a complex color only when it was
the character one, matched by element name. Match on the context id,
which the fill and stroke colors share.
Add a round trip test through ODF and PPTX with a plain shape, a
themed one, and a themed one with a luminance modulation.
Signed-off-by: Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>
Change-Id: Ia9550222d18a243287240e4184666d78d0abdd22
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/10060
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
(cherry picked from commit 07cf37b104983f765d3e1005f677e0058df12026)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210510
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
By now, almost all a11y implementations implement both,
the XAccessible and XAccessibleContext interfaces themselves,
and they do so via the OAccessible base class.
One remaining case that only implements the XAccessible interface
directly is UnoControl. XAccessible::getAccessibleContext
is used from within AccessibleControlShape::Init to get the
accessible context. That accessible context however
is an OAccessible and implements both, the XAccessible
and XAccessibleContext interfaces again.
Stop requiring that UnoControl implements XAccessible
by instead adding a dedicated new method UnoControl::getAccessible
to directly get the OAccessible without relying on
the XAccessible interface being implemented by UnoControl.
In AccessibleControlShape::Init, cast to UnoControl
instead of querying for the XAccessible interface
and call the new method directly.
Stop implementing the XAccessible interface in
UnoControl as it is no longer needed now.
This aligns the UnoControl a11y logic more with how
a11y is implemented elsewhere across the code base.
Sample steps to trigger the modified code
when using the gtk3 vcl plugin on Linux:
* start the Orca screen reader
* start Writer
* insert a few push button controls using
"Form" -> "Push Button" and then clicking into
the document and dragging to insert
* disable design mode using "Form" -> "Design Mode"
* focus one of the controls by clicking on it
* press the Tab key to move focus between the controls
No differences in behavior were observed when
doing this with or without this change in place.
Side note: Announcement of the controls when they
receive focus didn't work (reliably) when opening an
existing document containing form controls instead of
inserting them into a new one, but that is preexisting
and unrelated to this commit.
Also adjust test AccessibleFixedTextTest::testFixedText
of the CppunitTest_toolkit_a11y test suite
accordingly that was assuming that it can
query the XAccessible interface directly
from the UNO control.
Change-Id: I8cc3902a8de725eda3d810920f1da2d390c06f73
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210464
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
Switch from using a weak reference (css::uno::WeakReferenceHelper)
to the abstract XAccessibleContext UNO interface to a weak
reference (unotools::WeakReference) of the more concrete
OAccessible class in UnoControl.
This makes clear that the accessible is always an OAccessible
subclass and allows dropping some UNO-querying for the
wanted UNO interfaces.
Change-Id: Ib1ea66c83da9bbf76891c492d84aa57c396f2f44
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210459
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
Reuse existing OAccessible logic by subclassing it.
This aligns AccessibleTableHeaderShape with other
a11y implementations.
No user-visible change in behavior intended.
Sample steps to make use of the class on Linux with
the qt6 vcl plugin:
* start Impress
* use the "Insert" -> "Table" dialog to insert a table
* type something in some cells
* start Accerciser
* in Accerciser's tree view of LO's a11y hierarchy, navigate
to the a11y object of the table (which uses an a11y name of
"TableShape")
* use Accerciser's IPython console to interact with the table header:
In [6]: table = acc.queryTable()
In [7]: table_header_cell = table.getRowHeader(0)
In [8]: table_header_cell.get_name()
Out[8]: 'A1'
This matches the behavior without this change in place.
(The question of whether all of the semantics/logic implemented in
AccessibleTableHeaderShape makes sense as is is a separate question,
unrelated to this refactor.)
Change-Id: I15c6a19aaa4ae69085dd8cb3a53447e55bf096f9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210456
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
The com.sun.star.accessibility.AccessibleContext UNO service
is unnecessary and not really used for implementing a11y support,
apart from some a11y implementations declaring support for it.
What is relevant is the com.sun.star.accessibility.XAccessibleContext
interface instead.
Stop declaring support for the com.sun.star.accessibility.AccessibleContext
service in AccessibleContextBase and drop related
XServiceInfo::getImplementationName overrides in subclasses,
in preparation of dropping the service altogether in an upcoming
commit.
AccessibleDrawDocumentView currently still declares support
for the "com.sun.star.drawing.AccessibleDrawDocumentView"
service, so let it implement XServiceInfo directly, now that
it no longer inherits that from the AccessibleContextBase
base class.
Change-Id: Ie927cd98f9e1c8eb5a80bfaab5cb1dacb64dc238
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210403
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
Tested-by: Jenkins
The com.sun.star.accessibility.AccessibleContext UNO service
is unnecessary and not really used for implementing a11y support,
apart from some a11y implementations declaring support for it.
What is relevant is the com.sun.star.accessibility.XAccessibleContext
interface instead.
Stop declaring support for the com.sun.star.accessibility.AccessibleContext
service in SvxGraphCtrlAccessibleContext, in preparation
of dropping the service altogether in an upcoming
commit.
Change-Id: Ib8e74b459deeda0738cfdf7877ba97861e1c24ec
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210399
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
A slide's picture placeholder can hold text the author typed instead of an
image, which PowerPoint displays. Impress dropped that text on import and
wrote nothing at all for such a shape on save. To reproduce, type into a
picture placeholder in PowerPoint, save, open the file and save it again:
the text is gone from the shape, and the shape from the file.
What a placeholder is now lives in the page's presentation object list, and
what represents it follows what it holds: a graphic object for a picture, an
SdrObjKind::OutlineText object while it holds text, the placeholder itself
while it holds nothing. It changes over when a file states such text, when
that text is deleted again and the prompt comes back, and when an image is
put in. Text arriving another way, through the API, is caught by the new
SdrPage::onEmptyPresObjFilled and switched at the next idle, so that route
needs a spinning scheduler; what a save writes is right either way. An object
in text edit is left to that edit, which is where it changes over: the idle
pass walks every page, so it asks each object rather than trusting the one
that asked for the pass - in a shared document another view holds it. That
switch is the model's own and covered by no undo step - it answers for a
document the API changed, not for anything the user did.
What the file says about the shape travels with it both ways, the graphic
items included, so an outline a picture placeholder is clipped to is still
there when a picture arrives. It is not written while the placeholder holds
text: the file says text box, and a text box states no geometry to clip a
picture to.
PPTX writes it as the placeholder it is, with the text it holds. ODF states
the class of what represents it, so the placeholder's own class travels
beside it as coext:placeholder-class, and a reader that ignores the
extension sees an outline placeholder with the text.
Signed-off-by: Mike Kaganski <mike.kaganski@collabora.com>
Change-Id: I0f3353115e56d63a4158ebaeb5689689499894bb
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/9441
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
(cherry picked from commit 7921401ae48188568e1016db00bd90256d666a6a)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210329
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Tested-by: Jenkins
The clip a graphic object carries was kept in the model and carried through
save and load, but nothing ever drew it, so a shape a file describes as an
outline still covered its whole frame and hid what sat behind the parts the
outline leaves out. Wrap the shape's content in a mask.
The polygon states the shape's own coordinates, so it is normalised and then
put through the same object matrix as the content, and follows the shape's
rotation and shear along with it. A flip is expressed on the graphic itself
rather than in that matrix, so the clip is mirrored here to follow it - the
picture would otherwise turn round inside an outline that stayed where it
was. The mask covers the fill as well as the graphic, which is what uncovers
the background. The invisible outline stays outside it, leaving bounds and
hit-testing as they were.
A mask clips with an even-odd fill, which is what makes a contour overlapping
another one a hole.
Signed-off-by: Mike Kaganski <mike.kaganski@collabora.com>
Change-Id: I69c8c6c31f43e87399fb582665904dc81221b32b
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/9302
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
(cherry picked from commit 120b9ef0b7c50a0e025e7be87e005aa39ab7db8a)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210037
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Introduce an SfxPoolItem in the SDR graphic attribute range that
carries a basegfx::B2DPolyPolygon clip outline on SdrGrafObj.
Allocate SDRATTR_GRAFCLIPPOLYPOLYGON between SDRATTR_GRAFCROP and
SDRATTR_GRAF_LAST (which shifts SDRATTR_3D_FIRST and the downstream
ids by one), register the pool default, and surface the value as the
"GraphicClipPolyPolygon" UNO property on the GraphicObjectShape
property map (covering both drawing.GraphicObjectShape and
presentation.GraphicObjectShape via SVXMAP_GRAPHICOBJECT) using the
css::drawing::PolyPolygonBezierCoords type. QueryValue/PutValue
do the round-trip through the existing basegfx helpers.
The new which-id is 1175. The trailing comments in svddef.hxx have
run 2 high since two XATTR items were dropped upstream, so the ones
added here say 1177 to stay consistent with the file.
No reader, writer or render path consumes the property yet; this
is infrastructure for upcoming custGeom round-trip work on empty
picture placeholders.
Signed-off-by: Mike Kaganski <mike.kaganski@collabora.com>
Change-Id: I17d98cabeb230c25b3de0da4eadd8338ed672ce1
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/9190
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
(cherry picked from commit be7f21fc7187bb87129eed4e8ed2f794faf6e757)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210036
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Tested-by: Jenkins
SvxBrushItem::GetGraphic wants the name of the document the brush came
from, so take it as an argument and hand in SwDoc::GetLinkReferer
wherever a document is at hand, the Writer style, frame and background
shell paths included.
The dialog and example-window callers pass the name of the active
document shell through a new svx helper getActiveDocumentLinkReferer.
The hand-rolled copies of the GetPersist, HasName, GetMedium GetName
sequence elsewhere in sw now call SwDoc::GetLinkReferer too.
Change-Id: I8693d27869baed79962b2d5bdcb7b7e2c63227bb
Signed-off-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/8200
Reviewed-by: Stephan Bergmann <stephan.bergmann@collabora.com>
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
(cherry picked from commit 18f91ac71710027479dfe9f206ae2207bad8f2b7)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/209827
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Tested-by: Jenkins
and
cid#1697488: Variable copied when it could be moved
cid#1697490: Variable copied when it could be moved
cid#1697497: Variable copied when it could be moved
Change-Id: Ie3a621861ad7d3f46104da80777272b5505fb6d3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/209409
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
The export needs to write pt-elements for content text nodes with the
original modelId to data.xml. However, the shape has not this modelId
but the modelId of the associated pt-element of type=pres. Thus this
element is searched for in getMasterXShapeForPoint(). The error was, to
examine msPresentationLayoutName. That name is created by the author of
the SmartArt template and is arbitrary. And indeed, a name textNode
exists only twice in the over hundred predefined SmartArt templates. So
remove this test, it prevents to find the shape.
After removing the above mentioned test, an error in WriteText() in
the export becomes visible. The export of a SmartArt diagram calls
WriteText() with bBodyPr=false. With that no a:bodyPr element is
written at all. But for the CT_TextBody it is specified in OOXML, that
the bodyPr child element is mandatory. Thus we need to write an empty
element in this case. Without it, the file markup is invalid and
MS Office requests to repair the document.
Change-Id: I9cdf5e882b415ca1d13718d6c1e47ebb1d2c7018
Signed-off-by: Regina Henschel <rb.henschel@t-online.de>
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/4396
Reviewed-by: Tomaž Vajngerl <tomaz.vajngerl@collabora.com>
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
(cherry picked from commit 533dccff298edc397a9c0fc564ba4d31b8c27432)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/206994
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Tested-by: Jenkins
Nothing told a horizontal rule apart from an ordinary rectangle, so it could
not be laid out the way Word does; the marker is that distinction, and its
absence is what keeps documents written before it rendering unchanged.
The UNO property reports DEFAULT_VALUE while false, since ODF export only
writes direct values - else every shape and graphic style would carry it.
Also let the RTF import build a rectangle for a rule, as the VML import
already does, so both filters produce one model object.
Signed-off-by: Mike Kaganski <mike.kaganski@collabora.com>
Change-Id: Id2facd7bdc272197273462f0ad581537551234bc
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/8657
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
(cherry picked from commit dbe7dca2951640990d3febaf12a9c3118e15ec22)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/209328
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Tested-by: Jenkins
Some recent refactoring changed gallery thumbnails to store the color
and alpha channels together as part of a single bitmap, rather than
separating the color transparency data. That refactoring interacted
poorly with existing gallery code that was intended to convert thumbnail
color data into 8-bit palettized color. The original code left the
separate alpha intact, but converting the combined 32-bit bitmap into
8-bit color destroyed the alpha channel as a matter of course.
This change fixes the gallery bug by removing the conversion code.
Gallery thumbnails will now use whatever bitmap format the source
graphic used, which increases storage by at most 3x. This seems like a
reasonable tradeoff since these graphics are very small (80x80 pixels),
and the alternative would be to revert all of this refactoring work.
Regression due to commit e35f5cbd26
Author: Noel Grandin <noel.grandin@collabora.co.uk>
Date: Wed Jul 30 14:57:25 2025 +0200
BitmapEx->Bitmap in GalleryObject
Change-Id: I94575beee529d08d381045d8c563d63203c725bf
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/208902
Reviewed-by: Jonathan Clark <jonathan@libreoffice.org>
Tested-by: Jenkins
This change restores the system gallery theme ID to bullets.thm, which
restores language and localization-independent lookup in the gallery UI.
This field was unintentionally removed by a prior update to the file
contents. Updating these .thm files is unnecessarily fragile. There does
not appear to be any way to set an ID other than by using a hex editor,
and the ID field is only retained if updates are incremental. In order
to make this somewhat easier, this change also adds an --id <id>
parameter to gengal. This parameter can be used to manually set the
correct ID when a new .thm file is generated (however, it will not
change the ID for an existing .thm file that is being updated).
Regression from commit 480ef73dee
Author: Heiko Tietze <heiko.tietze@documentfoundation.org>
Date: Mon Oct 27 12:37:09 2025 +0100
Revert^2 "tdf#139076 update Bullet icons with sexy .svg icons"
Change-Id: Idccdffb987606a1863c745c96bc0f8ba5cb6565f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/208701
Tested-by: Jenkins
Reviewed-by: Jonathan Clark <jonathan@libreoffice.org>
The document-wide link update permission is decided when the document is
loaded. But media files that the users interactively inserts should be
automatically allowed.
Remember on the media object that the user picked the reference and
allow it on its own, the same way a presentation sound the user picks is
allowed. A reference that arrived with the document still needs the
document-wide permission.
since:
commit f0768394c14f928d47547408fc1195368be81f86
Date: Tue Jul 14 19:12:01 2026 +0100
put slideshow media links under link control
see also:
commit 0aa870b7b5a6bda50bab50c7a0a41d28fdf4f6ab
Date: Wed Jun 17 09:37:23 2026 +0000
bring external presentation sounds under link management
Change-Id: Id9fd49245fbfe2d62d767e3cb04370b2e5197fe1
Signed-off-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Reviewed-on: https://gerrit.collaboraoffice.com/c/core/+/7939
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
Reviewed-by: Michael Stahl <michael.stahl@collabora.com>
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/7961
(cherry picked from commit 82f3a17f461fb2d0057cc81625f7ae1e301db3ad)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/208739
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Tested-by: Jenkins
using the same std::variant style as the similar:
commit 7925b4de3f
Date: Mon Jun 20 12:54:44 2022 +0200
use std::monostate in std::variant
also.
a: use TOOLS_WARN_EXCEPTION for getVisualAreaSize/setVisualAreaSize
exceptions
b: Assert in the calc and impress tiled-rendering tests that the shape,
slide-background and master-page-background fillbitmap links are
registered in their LinkManagers similar to how the existing writer test
does.
Signed-off-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Change-Id: If1e47f1c656f064b442a49991ba5a523b6076176
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/3693
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
(cherry picked from commit 1fc1bf4a76066307373cead6faea789ac945adad)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/208581
Tested-by: Xisco Fauli <xiscofauli@libreoffice.org>
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
With the refactoring from previous commits in place, it's
clear that all callers pass a non-null SfxBindings*
param.
Switch the param to a reference, to make that clear
and prepare for further refactoring.
Change-Id: Id9f1487dba4b84860f9afa52ff9ffb4dd7b1d2c6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/208387
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>