basic/source/runtime/methods.cxx | 2 chart2/source/controller/dialogs/ChartTypeDialogController.cxx | 15 cui/source/options/appearance.cxx | 3 cui/uiconfig/ui/lineendstabpage.ui | 5 cui/uiconfig/ui/linestyletabpage.ui | 5 cui/uiconfig/ui/swpossizepage.ui | 5 download.lst | 8 editeng/source/editeng/impedit3.cxx | 2 external/meson/UnpackedTarball_meson.mk | 17 framework/source/loadenv/loadenv.cxx | 26 icon-themes/breeze/links.txt | 1 icon-themes/breeze_dark/links.txt | 1 icon-themes/colibre/links.txt | 1 icon-themes/colibre_dark/links.txt | 1 icon-themes/elementary/links.txt | 1 icon-themes/sifr/links.txt | 1 icon-themes/sifr_dark/links.txt | 1 icon-themes/sukapura/links.txt | 1 icon-themes/sukapura_dark/links.txt | 1 include/svtools/colorcfg.hxx | 1 officecfg/registry/schema/org/openoffice/Office/Common.xcs | 24 oox/source/export/chartexport.cxx | 18 oox/source/export/drawingml.cxx | 4 readlicense_oo/license/CREDITS.fodt | 4467 +++++----- sc/qa/unit/ucalc_formula2.cxx | 60 sc/source/core/data/queryiter.cxx | 17 sc/source/core/tool/interpr1.cxx | 7 sc/source/ui/drawfunc/fuins1.cxx | 12 sc/source/ui/drawfunc/fuins2.cxx | 36 sc/source/ui/view/formatsh.cxx | 30 sc/source/ui/view/gridwin.cxx | 6 scp2/source/ooo/vc_redist.scp | 3 sd/qa/uitest/impress_tests/masterElements.py | 2 sd/qa/uitest/impress_tests2/tdf146019.py | 4 sd/source/ui/func/fuinsert.cxx | 13 sd/source/ui/sidebar/LayoutMenu.cxx | 2 sd/source/ui/view/ViewShellBase.cxx | 10 sd/source/ui/view/drviews7.cxx | 2 svgio/qa/cppunit/SvgImportTest.cxx | 11 svgio/qa/cppunit/data/FontFamilyIncludingApostrophes.svg | 4 svgio/source/svgreader/svgcharacternode.cxx | 8 svtools/source/config/colorcfg.cxx | 5 svx/sdi/svx.sdi | 7 sw/qa/core/text/data/redline-image-anchored.docx |binary sw/qa/core/text/data/redline-image-inline.docx |binary sw/qa/core/text/itrpaint.cxx | 194 sw/qa/extras/ooxmlexport/data/tdf165359_SdtWithDrawing.docx |binary sw/qa/extras/ooxmlexport/data/tdf165359_SdtWithInline.docx |binary sw/qa/extras/ooxmlexport/data/tdf170389_manyTabstops.odt |binary sw/qa/extras/ooxmlexport/data/tdf170438_dropdown.odt |binary sw/qa/extras/ooxmlexport/ooxmlexport17.cxx | 5 sw/qa/extras/ooxmlexport/ooxmlexport25.cxx | 53 sw/qa/extras/ooxmlexport/ooxmlexport26.cxx | 15 sw/qa/extras/uiwriter/data/tdf168157.docx |binary sw/qa/extras/uiwriter/uiwriter8.cxx | 27 sw/source/core/doc/DocumentContentOperationsManager.cxx | 3 sw/source/core/docnode/node.cxx | 8 sw/source/core/graphic/ndgrf.cxx | 37 sw/source/core/inc/drawfont.hxx | 6 sw/source/core/inc/flyfrm.hxx | 5 sw/source/core/layout/fly.cxx | 47 sw/source/core/layout/paintfrm.cxx | 32 sw/source/core/text/inftxt.cxx | 8 sw/source/core/text/inftxt.hxx | 4 sw/source/core/text/itrpaint.cxx | 122 sw/source/core/text/porfly.cxx | 10 sw/source/core/text/porlay.cxx | 20 sw/source/core/txtnode/fntcache.cxx | 25 sw/source/filter/ww8/docxattributeoutput.cxx | 30 sw/source/filter/ww8/docxexport.cxx | 4 sw/source/filter/ww8/docxsdrexport.cxx | 7 sw/source/filter/xml/xmlexp.cxx | 11 sw/source/uibase/dochdl/swdtflvr.cxx | 22 sw/source/uibase/wrtsh/wrtsh1.cxx | 22 sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx | 7 sw/uiconfig/swriter/ui/tokenwidget.ui | 10 vcl/inc/qt5/QtFrame.hxx | 2 vcl/osx/salnativewidgets.cxx | 137 vcl/qt5/QtFrame.cxx | 250 vcl/source/filter/graphicfilter.cxx | 11 vcl/unx/gtk3/gtkinst.cxx | 1 vcl/win/window/salframe.cxx | 1 82 files changed, 3436 insertions(+), 2550 deletions(-)
New commits: commit 5eebd88db0d98ca0c2989ba89b8fd3ec265d5ad3 Author: Xisco Fauli <[email protected]> AuthorDate: Thu Jan 22 19:40:31 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Fri Jan 30 13:16:35 2026 +0100 tdf#168372: remove surrounding apostrophes in font-family Change-Id: I94ef4ae8aa5aa7aa27602e959f80eb17c83679ce Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197864 Tested-by: Jenkins Reviewed-by: Xisco Fauli <[email protected]> (cherry picked from commit 99d19aebd33d7834017ec09b83e081623e714112) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197934 Reviewed-by: Adolfo Jayme Barrientos <[email protected]> diff --git a/svgio/qa/cppunit/SvgImportTest.cxx b/svgio/qa/cppunit/SvgImportTest.cxx index 20db3664d879..ca45500951a8 100644 --- a/svgio/qa/cppunit/SvgImportTest.cxx +++ b/svgio/qa/cppunit/SvgImportTest.cxx @@ -446,6 +446,17 @@ CPPUNIT_TEST_FIXTURE(Test, testFontsizePercentage) assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[1]", "familyname", u"Times New Roman"); } +CPPUNIT_TEST_FIXTURE(Test, testFontFamilyIncludingApostrophes) +{ + //Check when font-size uses percentage and defined globally + xmlDocUniquePtr pDocument = dumpAndParseSvg(u"/svgio/qa/cppunit/data/FontFamilyIncludingApostrophes.svg"); + + assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[1]", "fontcolor", u"#000000"); + assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[1]", "text", u"Text"); + assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[1]", "height", u"16"); + assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[1]", "familyname", u"Liberation Sans"); +} + CPPUNIT_TEST_FIXTURE(Test, testFontsizeRelative) { //Check when font-size uses relative units (em,ex) and it's based on its parent's font-size diff --git a/svgio/qa/cppunit/data/FontFamilyIncludingApostrophes.svg b/svgio/qa/cppunit/data/FontFamilyIncludingApostrophes.svg new file mode 100644 index 000000000000..db13d7e3db07 --- /dev/null +++ b/svgio/qa/cppunit/data/FontFamilyIncludingApostrophes.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg viewBox="0 0 200 30" xmlns="http://www.w3.org/2000/svg"> + <text y="20" font-family="'Liberation Sans', Arial">Text</text> +</svg> diff --git a/svgio/source/svgreader/svgcharacternode.cxx b/svgio/source/svgreader/svgcharacternode.cxx index eb5d16f0573c..1ea05de21219 100644 --- a/svgio/source/svgreader/svgcharacternode.cxx +++ b/svgio/source/svgreader/svgcharacternode.cxx @@ -105,7 +105,13 @@ namespace svgio::svgreader const SvgStringVector& rFontFamilyVector = rSvgStyleAttributes.getFontFamily(); OUString aFontFamily(u"Times New Roman"_ustr); if(!rFontFamilyVector.empty()) - aFontFamily=rFontFamilyVector[0]; + { + aFontFamily = rFontFamilyVector[0]; + + // tdf#168372: remove surrounding apostrophes + if (aFontFamily.getLength() > 1 && aFontFamily.startsWith("'") && aFontFamily.endsWith("'")) + aFontFamily = aFontFamily.copy(1, aFontFamily.getLength() - 2); + } // #i122324# if the FontFamily name ends on ' embedded' it is probably a re-import // of a SVG export with font embedding. Remove this to make font matching work. This commit 12d64b35022ed1371217eb5a70d86bd7de840d10 Author: Heiko Tietze <[email protected]> AuthorDate: Wed Jan 28 06:54:32 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Fri Jan 30 13:16:35 2026 +0100 Resolves tdf#170143 - Set ButtonTextColor on theme change Reverts c7a29af1d77c4e1483154b262c7c621067cd2685 Change-Id: I50215c3e161d3e22ed34c7407c22cdae50fff045 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198250 Reviewed-by: Heiko Tietze <[email protected]> Tested-by: Jenkins Tested-by: Heiko Tietze <[email protected]> (cherry picked from commit 5c723785d4cf512bba0591a5328f2a9784b82bc2) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198287 Reviewed-by: Adolfo Jayme Barrientos <[email protected]> diff --git a/vcl/win/window/salframe.cxx b/vcl/win/window/salframe.cxx index ebbd3c468fed..099a836719cd 100644 --- a/vcl/win/window/salframe.cxx +++ b/vcl/win/window/salframe.cxx @@ -2624,6 +2624,7 @@ static void lcl_LoadColorsFromTheme(StyleSettings& rStyleSet) rStyleSet.SetMenuBarTextColor(rThemeColors.GetMenuBarTextColor()); rStyleSet.SetMenuTextColor(rThemeColors.GetMenuTextColor()); + rStyleSet.SetButtonTextColor(rThemeColors.GetButtonTextColor()); rStyleSet.SetDefaultActionButtonTextColor(rThemeColors.GetButtonTextColor()); rStyleSet.SetActionButtonTextColor(rThemeColors.GetButtonTextColor()); rStyleSet.SetShadowColor(rThemeColors.GetShadeColor()); commit fd09fee0432cb585ede3525b875dd1f08810ca66 Author: Miklos Vajna <[email protected]> AuthorDate: Tue Jan 27 08:48:48 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Fri Jan 30 13:16:35 2026 +0100 cool#13988 sw redline render mode: add colored border for anchored images So far the non-standard redline render mode for images focused on graying out images when they are meant to be "omitted". In the meantime, text got red/green colors since commit 9bc163b5637572684ac6cc5985d276c4bc01679f (cool#13574 sw redline render mode: somewhat color ins/del as green/red, 2026-01-20), for the case when the inserted/deleted text is not omitted. Do the same for images: if an anchored image is not omitted, then provide a red/green border for deleted/inserted images. This is for anchored images, inline images need more work. Two alternatives would have been to draw this border at the end of SwFlyFrame::PaintSwFrame() (like the standard redline mode does its cross for deletes, but doesn't work due to clipping problems) or as part of SwLayoutFrame::PaintSubsidiaryLines() (like the gray "boundary" indicator does, also has clipping problems). Doing it in SwFrame::PaintSwFrameShadowAndBorder() is free from these clipping problems. Change-Id: I7489e5be5c7081a8e6dc243cb30d8fd2dc4f1917 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198254 Reviewed-by: Miklos Vajna <[email protected]> Tested-by: Jenkins Signed-off-by: Xisco Fauli <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198284 diff --git a/sw/qa/core/text/itrpaint.cxx b/sw/qa/core/text/itrpaint.cxx index 479ba5a628bf..14c1af1a02b4 100644 --- a/sw/qa/core/text/itrpaint.cxx +++ b/sw/qa/core/text/itrpaint.cxx @@ -150,17 +150,41 @@ CPPUNIT_TEST_FIXTURE(Test, testRedlineRenderModeOmitInsertDelete) CPPUNIT_ASSERT_EQUAL(120, GetColorHue(aColor3)); } -bool IsGrayScale(const Bitmap& rBitmap) +struct ImageInfo { - BitmapScopedReadAccess pReadAccess(rBitmap); - Size aSize = rBitmap.GetSizePixel(); + Bitmap m_aBitmap; + tools::Rectangle m_aRectangle; +}; + +bool IsGrayScale(const ImageInfo& rInfo) +{ + Bitmap aBitmap = rInfo.m_aBitmap; + BitmapScopedReadAccess pReadAccess(aBitmap); + Size aSize = rInfo.m_aBitmap.GetSizePixel(); Color aColor = pReadAccess->GetColor(aSize.getHeight() / 2, aSize.getWidth() / 2); return aColor.GetRed() == aColor.GetGreen() && aColor.GetRed() == aColor.GetBlue(); } -std::vector<Bitmap> GetMetaFileImages(const GDIMetaFile& rMetaFile) +bool RectangleContainsPolygons(const tools::Rectangle& rRectangle, + const std::vector<tools::Polygon>& rPolygons) +{ + static constexpr SwTwips nPixel = 15; + tools::Rectangle aRectangle(rRectangle.Left() - nPixel, rRectangle.Top() - nPixel, + rRectangle.Right() + nPixel, rRectangle.Bottom() + nPixel); + for (const auto& rPolygon : rPolygons) + { + if (!aRectangle.Contains(rPolygon.GetBoundRect())) + { + return false; + } + } + + return true; +} + +std::vector<ImageInfo> GetMetaFileImages(const GDIMetaFile& rMetaFile) { - std::vector<Bitmap> aImages; + std::vector<ImageInfo> aImages; for (size_t nAction = 0; nAction < rMetaFile.GetActionSize(); ++nAction) { MetaAction* pAction = rMetaFile.GetAction(nAction); @@ -170,11 +194,31 @@ std::vector<Bitmap> GetMetaFileImages(const GDIMetaFile& rMetaFile) } auto pAct = static_cast<MetaBmpExScaleAction*>(pAction); - aImages.push_back(pAct->GetBitmap()); + ImageInfo aInfo; + aInfo.m_aBitmap = pAct->GetBitmap(); + aInfo.m_aRectangle = { pAct->GetPoint(), pAct->GetSize() }; + aImages.push_back(aInfo); } return aImages; } +std::vector<tools::Polygon> GetMetaFilePolylines(const GDIMetaFile& rMetaFile) +{ + std::vector<tools::Polygon> aPolygons; + for (size_t nAction = 0; nAction < rMetaFile.GetActionSize(); ++nAction) + { + MetaAction* pAction = rMetaFile.GetAction(nAction); + if (pAction->GetType() != MetaActionType::POLYLINE) + { + continue; + } + + auto pAct = static_cast<MetaPolyLineAction*>(pAction); + aPolygons.push_back(pAct->GetPolygon()); + } + return aPolygons; +} + CPPUNIT_TEST_FIXTURE(Test, testAnchoredImageRedlineRenderModeOmitInsertDelete) { // Given a document with a normal, a deleted and an inserted image: @@ -185,11 +229,14 @@ CPPUNIT_TEST_FIXTURE(Test, testAnchoredImageRedlineRenderModeOmitInsertDelete) std::shared_ptr<GDIMetaFile> xMetaFile = pDocShell->GetPreviewMetaFile(); // Then make sure none of the images are grayscale: - std::vector<Bitmap> aImages = GetMetaFileImages(*xMetaFile); + std::vector<ImageInfo> aImages = GetMetaFileImages(*xMetaFile); CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aImages.size()); CPPUNIT_ASSERT(!IsGrayScale(aImages[0])); CPPUNIT_ASSERT(!IsGrayScale(aImages[1])); CPPUNIT_ASSERT(!IsGrayScale(aImages[2])); + std::vector<tools::Polygon> aPolygons = GetMetaFilePolylines(*xMetaFile); + // No frames around images. + CPPUNIT_ASSERT(aPolygons.empty()); // Omit insert: default, default, grayscale. SwWrtShell* pWrtShell = pDocShell->GetWrtShell(); @@ -206,6 +253,10 @@ CPPUNIT_TEST_FIXTURE(Test, testAnchoredImageRedlineRenderModeOmitInsertDelete) // Without the accompanying fix in place, this test would have failed, the image's center pixel // wasn't gray. CPPUNIT_ASSERT(IsGrayScale(aImages[2])); + aPolygons = GetMetaFilePolylines(*xMetaFile); + // Frame around the deleted image. This failed, there was no frame around the deleted image. + CPPUNIT_ASSERT(!aPolygons.empty()); + CPPUNIT_ASSERT(RectangleContainsPolygons(aImages[1].m_aRectangle, aPolygons)); // Omit deletes: default, grayscale, default. aOpt.SetRedlineRenderMode(SwRedlineRenderMode::OmitDeletes); @@ -218,6 +269,10 @@ CPPUNIT_TEST_FIXTURE(Test, testAnchoredImageRedlineRenderModeOmitInsertDelete) CPPUNIT_ASSERT(!IsGrayScale(aImages[0])); CPPUNIT_ASSERT(IsGrayScale(aImages[1])); CPPUNIT_ASSERT(!IsGrayScale(aImages[2])); + aPolygons = GetMetaFilePolylines(*xMetaFile); + // Frame around the inserted image. + CPPUNIT_ASSERT(!aPolygons.empty()); + CPPUNIT_ASSERT(RectangleContainsPolygons(aImages[2].m_aRectangle, aPolygons)); } CPPUNIT_TEST_FIXTURE(Test, testInlineImageRedlineRenderModeOmitInsertDelete) @@ -230,7 +285,7 @@ CPPUNIT_TEST_FIXTURE(Test, testInlineImageRedlineRenderModeOmitInsertDelete) std::shared_ptr<GDIMetaFile> xMetaFile = pDocShell->GetPreviewMetaFile(); // Then make sure none of the images are grayscale: - std::vector<Bitmap> aImages = GetMetaFileImages(*xMetaFile); + std::vector<ImageInfo> aImages = GetMetaFileImages(*xMetaFile); CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aImages.size()); CPPUNIT_ASSERT(!IsGrayScale(aImages[0])); CPPUNIT_ASSERT(!IsGrayScale(aImages[1])); diff --git a/sw/source/core/inc/flyfrm.hxx b/sw/source/core/inc/flyfrm.hxx index 6b0982abf314..d5f8124af10b 100644 --- a/sw/source/core/inc/flyfrm.hxx +++ b/sw/source/core/inc/flyfrm.hxx @@ -313,6 +313,8 @@ public: bool IsSplitButNotYetMovedFollow() const; + bool GetRedlineRenderModeFrame(SvxBoxItem& rBoxItem) const; + private: void UpdateUnfloatButton(SwWrtShell* pWrtSh, bool bShow) const; void PaintDecorators() const; diff --git a/sw/source/core/layout/fly.cxx b/sw/source/core/layout/fly.cxx index 5d9f140adc7f..8e02d478681a 100644 --- a/sw/source/core/layout/fly.cxx +++ b/sw/source/core/layout/fly.cxx @@ -2332,6 +2332,48 @@ bool SwFlyFrame::IsSplitButNotYetMovedFollow() const return false; } +bool SwFlyFrame::GetRedlineRenderModeFrame(SvxBoxItem& rBoxItem) const +{ + // If we're in non-standard redline mode, then color deletes and inserts depending on the + // redline render mode. Similar to what SwFntObj::DrawText() does for redlined text. + const SwViewShell* pViewShell = getRootFrame()->GetCurrShell(); + if (!pViewShell) + { + return false; + } + + const SwViewOption* pViewOptions = pViewShell->GetViewOptions(); + if (!pViewOptions) + { + return false; + } + + SwRedlineRenderMode eRedlineRenderMode = pViewOptions->GetRedlineRenderMode(); + std::optional<Color> oColor; + if (eRedlineRenderMode == SwRedlineRenderMode::OmitInserts && IsDeleted()) + { + oColor.emplace(COL_RED); + } + else if (eRedlineRenderMode == SwRedlineRenderMode::OmitDeletes && IsInserted()) + { + oColor.emplace(COL_GREEN); + } + if (!oColor) + { + return false; + } + + editeng::SvxBorderLine aBorderLine; + aBorderLine.SetWidth(1); + aBorderLine.SetBorderLineStyle(SvxBorderLineStyle::SOLID); + aBorderLine.SetColor(*oColor); + rBoxItem.SetLine(&aBorderLine, SvxBoxItemLine::LEFT); + rBoxItem.SetLine(&aBorderLine, SvxBoxItemLine::RIGHT); + rBoxItem.SetLine(&aBorderLine, SvxBoxItemLine::TOP); + rBoxItem.SetLine(&aBorderLine, SvxBoxItemLine::BOTTOM); + return true; +} + SwTwips SwFlyFrame::Grow_(SwTwips nDist, SwResizeLimitReason& reason, bool bTst) { if (!Lower()) diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index 3abe024fa602..73bec434fb24 100644 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -4320,8 +4320,11 @@ void SwFlyFrame::PaintSwFrame(vcl::RenderContext& rRenderContext, SwRect const& } } // paint of margin needed. + const SwViewOption* pViewOptions = pShell ? pShell->GetViewOptions() : nullptr; + SwRedlineRenderMode eRedlineRenderMode = pViewOptions ? pViewOptions->GetRedlineRenderMode() + : SwRedlineRenderMode::Standard; const bool bPaintMarginOnly( !bPaintCompleteBack && - getFramePrintArea().SSize() != getFrameArea().SSize() ); + (getFramePrintArea().SSize() != getFrameArea().SSize() || eRedlineRenderMode != SwRedlineRenderMode::Standard)); // #i47804# - paint background of parent fly frame // for transparent graphics in layer Hell, if parent fly frame isn't @@ -5512,7 +5515,8 @@ void SwFrame::PaintSwFrameShadowAndBorder( if (GetType() & (SwFrameType::NoTxt|SwFrameType::Row|SwFrameType::Body|SwFrameType::Footnote|SwFrameType::Column|SwFrameType::Root)) return; - if (IsCellFrame() && !gProp.pSGlobalShell->GetViewOptions()->IsTable()) + const SwViewOption& rViewOptions = *gProp.pSGlobalShell->GetViewOptions(); + if (IsCellFrame() && !rViewOptions.IsTable()) return; // #i29550# @@ -5531,7 +5535,8 @@ void SwFrame::PaintSwFrameShadowAndBorder( return; } - const bool bLine = rAttrs.IsLine(); + SwRedlineRenderMode eRedlineRenderMode = rViewOptions.GetRedlineRenderMode(); + const bool bLine = (rAttrs.IsLine() || (IsFlyFrame() && eRedlineRenderMode != SwRedlineRenderMode::Standard)); const bool bShadow = rAttrs.GetShadow().GetLocation() != SvxShadowLocation::NONE; // - flag to control, @@ -5610,6 +5615,21 @@ void SwFrame::PaintSwFrameShadowAndBorder( const SvxBorderLine* pTopBorder(rBox.GetTop()); const SvxBorderLine* pBottomBorder(rBox.GetBottom()); + auto pFlyFrame = IsFlyFrame() ? static_cast<const SwFlyFrame*>(this) : nullptr; + SvxBoxItem aBoxItem(RES_BOX); + if (pFlyFrame) + { + // This is a fly frame, see if it wants to paint a custom border based on the redline + // mode and status. + if (pFlyFrame->GetRedlineRenderModeFrame(aBoxItem)) + { + pLeftBorder = aBoxItem.GetLeft(); + pRightBorder = aBoxItem.GetRight(); + pTopBorder = aBoxItem.GetTop(); + pBottomBorder = aBoxItem.GetBottom(); + } + } + // if R2L, exchange Right/Left const bool bR2L(IsCellFrame() && IsRightToLeft()); commit af0a56e86148c0512f44584a201fa094c3e4c43d Author: Miklos Vajna <[email protected]> AuthorDate: Thu Jan 22 08:37:58 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Fri Jan 30 13:16:35 2026 +0100 cool#13988 sw redline render mode: handle inline images Load the bugdoc, dispatch .uno:RedlineRenderMode, anchored images in deletions are grey, but this doesn't work with inline images. There is some infrastructure for this added in commit d845b91bcc6eb885c55494d4d4fab4ec09577e1d (tdf#78864 sw track changes: cross out deleted images, 2021-04-30), but that crosses out images instead of shading. Fix this by checking for the usual SwRedlineRenderMode flags in sw::FlyContentPortion::Paint() to avoid the unwanted cross. Also extend SwLineLayout::CalcLine() to set the inserted/deleted flags on the fly frame for redlines, so SwGrfNode::GetGraphicAttr() can do its shading as usual. And add a GetMetaFileImages() in the test suite to reduce some duplication. Change-Id: I97f2311ad7e9a6ffc70d76c1811faa2c13e509fe Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197799 Reviewed-by: Miklos Vajna <[email protected]> Tested-by: Jenkins Signed-off-by: Xisco Fauli <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198283 diff --git a/sw/qa/core/text/data/redline-image-inline.docx b/sw/qa/core/text/data/redline-image-inline.docx new file mode 100644 index 000000000000..beaa9bbad87f Binary files /dev/null and b/sw/qa/core/text/data/redline-image-inline.docx differ diff --git a/sw/qa/core/text/itrpaint.cxx b/sw/qa/core/text/itrpaint.cxx index cf0f37b19f57..479ba5a628bf 100644 --- a/sw/qa/core/text/itrpaint.cxx +++ b/sw/qa/core/text/itrpaint.cxx @@ -158,20 +158,12 @@ bool IsGrayScale(const Bitmap& rBitmap) return aColor.GetRed() == aColor.GetGreen() && aColor.GetRed() == aColor.GetBlue(); } -CPPUNIT_TEST_FIXTURE(Test, testAnchoredImageRedlineRenderModeOmitInsertDelete) +std::vector<Bitmap> GetMetaFileImages(const GDIMetaFile& rMetaFile) { - // Given a document with a normal, a deleted and an inserted image: - createSwDoc("redline-image-anchored.docx"); - - // When using the standard redline render mode: - SwDocShell* pDocShell = getSwDocShell(); - std::shared_ptr<GDIMetaFile> xMetaFile = pDocShell->GetPreviewMetaFile(); - - // Then make sure none of the images are grayscale: std::vector<Bitmap> aImages; - for (size_t nAction = 0; nAction < xMetaFile->GetActionSize(); ++nAction) + for (size_t nAction = 0; nAction < rMetaFile.GetActionSize(); ++nAction) { - MetaAction* pAction = xMetaFile->GetAction(nAction); + MetaAction* pAction = rMetaFile.GetAction(nAction); if (pAction->GetType() != MetaActionType::BMPEXSCALE) { continue; @@ -180,6 +172,20 @@ CPPUNIT_TEST_FIXTURE(Test, testAnchoredImageRedlineRenderModeOmitInsertDelete) auto pAct = static_cast<MetaBmpExScaleAction*>(pAction); aImages.push_back(pAct->GetBitmap()); } + return aImages; +} + +CPPUNIT_TEST_FIXTURE(Test, testAnchoredImageRedlineRenderModeOmitInsertDelete) +{ + // Given a document with a normal, a deleted and an inserted image: + createSwDoc("redline-image-anchored.docx"); + + // When using the standard redline render mode: + SwDocShell* pDocShell = getSwDocShell(); + std::shared_ptr<GDIMetaFile> xMetaFile = pDocShell->GetPreviewMetaFile(); + + // Then make sure none of the images are grayscale: + std::vector<Bitmap> aImages = GetMetaFileImages(*xMetaFile); CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aImages.size()); CPPUNIT_ASSERT(!IsGrayScale(aImages[0])); CPPUNIT_ASSERT(!IsGrayScale(aImages[1])); @@ -193,18 +199,7 @@ CPPUNIT_TEST_FIXTURE(Test, testAnchoredImageRedlineRenderModeOmitInsertDelete) xMetaFile = pDocShell->GetPreviewMetaFile(); - aImages.clear(); - for (size_t nAction = 0; nAction < xMetaFile->GetActionSize(); ++nAction) - { - MetaAction* pAction = xMetaFile->GetAction(nAction); - if (pAction->GetType() != MetaActionType::BMPEXSCALE) - { - continue; - } - - auto pAct = static_cast<MetaBmpExScaleAction*>(pAction); - aImages.push_back(pAct->GetBitmap()); - } + aImages = GetMetaFileImages(*xMetaFile); CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aImages.size()); CPPUNIT_ASSERT(!IsGrayScale(aImages[0])); CPPUNIT_ASSERT(!IsGrayScale(aImages[1])); @@ -218,18 +213,52 @@ CPPUNIT_TEST_FIXTURE(Test, testAnchoredImageRedlineRenderModeOmitInsertDelete) xMetaFile = pDocShell->GetPreviewMetaFile(); - aImages.clear(); - for (size_t nAction = 0; nAction < xMetaFile->GetActionSize(); ++nAction) - { - MetaAction* pAction = xMetaFile->GetAction(nAction); - if (pAction->GetType() != MetaActionType::BMPEXSCALE) - { - continue; - } + aImages = GetMetaFileImages(*xMetaFile); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aImages.size()); + CPPUNIT_ASSERT(!IsGrayScale(aImages[0])); + CPPUNIT_ASSERT(IsGrayScale(aImages[1])); + CPPUNIT_ASSERT(!IsGrayScale(aImages[2])); +} - auto pAct = static_cast<MetaBmpExScaleAction*>(pAction); - aImages.push_back(pAct->GetBitmap()); - } +CPPUNIT_TEST_FIXTURE(Test, testInlineImageRedlineRenderModeOmitInsertDelete) +{ + // Given a document with a normal, a deleted and an inserted image: + createSwDoc("redline-image-inline.docx"); + + // When using the standard redline render mode: + SwDocShell* pDocShell = getSwDocShell(); + std::shared_ptr<GDIMetaFile> xMetaFile = pDocShell->GetPreviewMetaFile(); + + // Then make sure none of the images are grayscale: + std::vector<Bitmap> aImages = GetMetaFileImages(*xMetaFile); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aImages.size()); + CPPUNIT_ASSERT(!IsGrayScale(aImages[0])); + CPPUNIT_ASSERT(!IsGrayScale(aImages[1])); + CPPUNIT_ASSERT(!IsGrayScale(aImages[2])); + + // Omit insert: default, default, grayscale. + SwWrtShell* pWrtShell = pDocShell->GetWrtShell(); + SwViewOption aOpt(*pWrtShell->GetViewOptions()); + aOpt.SetRedlineRenderMode(SwRedlineRenderMode::OmitInserts); + pWrtShell->ApplyViewOptions(aOpt); + + xMetaFile = pDocShell->GetPreviewMetaFile(); + + aImages = GetMetaFileImages(*xMetaFile); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aImages.size()); + CPPUNIT_ASSERT(!IsGrayScale(aImages[0])); + CPPUNIT_ASSERT(!IsGrayScale(aImages[1])); + // Without the accompanying fix in place, this test would have failed, the image's center pixel + // wasn't gray. + CPPUNIT_ASSERT(IsGrayScale(aImages[2])); + + // Omit deletes: default, grayscale, default. + aOpt.SetRedlineRenderMode(SwRedlineRenderMode::OmitDeletes); + pWrtShell->ApplyViewOptions(aOpt); + + xMetaFile = pDocShell->GetPreviewMetaFile(); + + aImages = GetMetaFileImages(*xMetaFile); CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aImages.size()); CPPUNIT_ASSERT(!IsGrayScale(aImages[0])); CPPUNIT_ASSERT(IsGrayScale(aImages[1])); diff --git a/sw/source/core/text/porfly.cxx b/sw/source/core/text/porfly.cxx index b0202f7fecca..da4fcbfdcd4e 100644 --- a/sw/source/core/text/porfly.cxx +++ b/sw/source/core/text/porfly.cxx @@ -40,6 +40,7 @@ #include <sortedobjs.hxx> #include <officecfg/Office/Common.hxx> #include <PostItMgr.hxx> +#include <viewopt.hxx> /** * class SwFlyPortion => we expect a frame-locale SwRect! @@ -223,9 +224,10 @@ void sw::FlyContentPortion::Paint(const SwTextPaintInfo& rInf) const if(rInf.GetTextFrame()->IsVertical()) rInf.GetTextFrame()->SwitchHorizontalToVertical(aRepaintRect); + SwViewShell* pViewShell = m_pFly->getRootFrame()->GetCurrShell(); if(!((m_pFly->IsCompletePaint() || m_pFly->getFrameArea().Overlaps(aRepaintRect)) && - SwFlyFrame::IsPaint(m_pFly->GetVirtDrawObj(), *m_pFly->getRootFrame()->GetCurrShell()))) + SwFlyFrame::IsPaint(m_pFly->GetVirtDrawObj(), *pViewShell))) return; SwRect aRect(m_pFly->getFrameArea()); @@ -239,7 +241,11 @@ void sw::FlyContentPortion::Paint(const SwTextPaintInfo& rInf) const // track changes: cross out the image, if it is deleted const SwFrame *pFrame = m_pFly->Lower(); - if ( GetAuthor() != std::string::npos && IsDeleted() && pFrame ) + const SwViewOption* pViewOptions = pViewShell->GetViewOptions(); + SwRedlineRenderMode eRedlineRenderMode + = pViewOptions ? pViewOptions->GetRedlineRenderMode() : SwRedlineRenderMode::Standard; + if (GetAuthor() != std::string::npos && IsDeleted() && pFrame + && eRedlineRenderMode == SwRedlineRenderMode::Standard) { SwRect aPaintRect( pFrame->GetPaintArea() ); diff --git a/sw/source/core/text/porlay.cxx b/sw/source/core/text/porlay.cxx index de25fc8ccc99..78f15f923aa2 100644 --- a/sw/source/core/text/porlay.cxx +++ b/sw/source/core/text/porlay.cxx @@ -672,6 +672,7 @@ void SwLineLayout::CalcLine( SwTextFormatter &rLine, SwTextFormatInfo &rInf ) if( pPos->IsFlyCntPortion() ) { bool bDeleted = false; + bool bInserted = false; size_t nAuthor = std::string::npos; if ( bHasRedline ) { @@ -683,10 +684,21 @@ void SwLineLayout::CalcLine( SwTextFormatter &rLine, SwTextFormatInfo &rInf ) bool bHasFlyRedline = rLine.GetRedln()->CheckLine(flyStart.first->GetIndex(), flyStart.second, flyStart.first->GetIndex(), flyStart.second, sRedlineText, bHasRedlineEnd, eRedlineEnd, /*pAuthorAtPos=*/&nAuthor); - bDeleted = bHasFlyRedline && eRedlineEnd == RedlineType::Delete; + if (bHasFlyRedline) + { + bDeleted = eRedlineEnd == RedlineType::Delete; + bInserted = eRedlineEnd == RedlineType::Insert; + } } static_cast<SwFlyCntPortion*>(pPos)->SetDeleted(bDeleted); static_cast<SwFlyCntPortion*>(pPos)->SetAuthor(nAuthor); + + if (auto pFlyPortion = dynamic_cast<sw::FlyContentPortion*>(pPos)) + { + SwFlyFrame* pFlyFrame = pFlyPortion->GetFlyFrame(); + pFlyFrame->SetDeleted(bDeleted); + pFlyFrame->SetInserted(bInserted); + } } // anchored to characters else if ( pPos->IsFlyPortion() ) commit 447888a0c0f093a15865eadf90d6889a56de9538 Author: Xisco Fauli <[email protected]> AuthorDate: Thu Jan 22 16:45:09 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Fri Jan 30 13:16:35 2026 +0100 sw: fix warning C6011: Dereferencing NULL pointer 'pShell' E:/jenkins/workspace/lo_tb_master_win_analyze/sw/source/core/layout/paintfrm.cxx(4506): error C2220: the following warning is treated as an error E:\jenkins\workspace\lo_tb_master_win_analyze\sw\source After commit 58d677055d9f6da976bf4fe34c1d89dd6871050d Author: Miklos Vajna <[email protected]> Date: Mon Jan 19 13:34:32 2026 +0100 cool#13988 sw redline render mode: handle anchored images Change-Id: I68cc27e1d2b9ef1fd9851f6079c7b52a488070a3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197853 Tested-by: Jenkins Reviewed-by: Xisco Fauli <[email protected]> (cherry picked from commit d32d9234466c296b8df5542ba10a5d92d75372b6) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197912 diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index 6b0fe4c6b9cb..3abe024fa602 100644 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -4487,7 +4487,7 @@ void SwFlyFrame::PaintSwFrame(vcl::RenderContext& rRenderContext, SwRect const& PaintDecorators(); // crossing out for tracked deletion - const SwViewOption* pViewOptions = pShell->GetViewOptions(); + const SwViewOption* pViewOptions = pShell ? pShell->GetViewOptions() : nullptr; SwRedlineRenderMode eRedlineRenderMode = pViewOptions ? pViewOptions->GetRedlineRenderMode() : SwRedlineRenderMode::Standard; if (GetAuthor() != std::string::npos && IsDeleted() commit d9c738557a4d12c8ba1981c595e99e8cb1cdb3a4 Author: Regina Henschel <[email protected]> AuthorDate: Sun Jan 25 09:17:49 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Fri Jan 30 13:16:35 2026 +0100 tdf#159544 use top of parameter stack for COUNTIFS The evaluation of the fooIFS functions attempts to reduce the range to be examined so that empty cells at the end of a range are not examined. To do this, it uses the range at the bottom of the parameter stack. That works well, for example, with SUMIFS and AVERAGEIFS, because this range does not have an associated criterion, but instead contains the data to be summed up. In the case of COUNTIFS, however, all ranges have an associated criterion and such might query for empty cells. At the point in the process when the reduction takes place, the criteria are not yet known. Therefore, when the criteria are later resolved, the reduction is reversed in case the criterion queries for empty cells. The evaluation of ranges and criteria starts at the top of the parameter stack and goes then backwards. That means that the reduction was based on the range at the bottom of the stack, but the reversal of the reduction was based on the criterion at the top of the stack. The solution is to use the range of the parameter at the top of the stack to calculate the range reduction in the case of the COUNTIFS function. Change-Id: Ia451312b83ab73f52020edd204fb2e37997714e5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198058 Tested-by: Jenkins Reviewed-by: Regina Henschel <[email protected]> (cherry picked from commit 709bb398d0ed123e9bf52b98b46f27418bbddef5) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198127 Reviewed-by: Xisco Fauli <[email protected]> diff --git a/sc/qa/unit/ucalc_formula2.cxx b/sc/qa/unit/ucalc_formula2.cxx index 146b2b1835b4..0ec654aa9ac2 100644 --- a/sc/qa/unit/ucalc_formula2.cxx +++ b/sc/qa/unit/ucalc_formula2.cxx @@ -4729,6 +4729,36 @@ CPPUNIT_TEST_FIXTURE(TestFormula2, testHoriQueryEmptyCell) m_pDoc->DeleteTab(0); } +CPPUNIT_TEST_FIXTURE(TestFormula2, testVertQueryEmptyCell) +{ + //Test for fix for tdf#159544 + m_pDoc->InsertTab(0, u"Test"_ustr); + + // Data in A1:B10, with empty A3, A5, A6, A7, A9, A10 + m_pDoc->SetString(0, 0, 0, u"a"_ustr); // A1 col, row, tab + m_pDoc->SetString(0, 1, 0, u"b"_ustr); // A2 + m_pDoc->SetString(0, 3, 0, u"d"_ustr); // A4 + m_pDoc->SetString(0, 7, 0, u"h"_ustr); // A8 + for (SCROW nRow = 0; nRow <= 9; ++nRow) + { + m_pDoc->SetValue(1, nRow, 0, nRow + 1); + } + + m_pDoc->SetFormula(ScAddress(3, 0, 0), "=COUNTIFS(A1:A10;\"=\";B1:B10;\">0\")", + formula::FormulaGrammar::GRAM_NATIVE_UI); + // As >0 is true for all cells in B1:B10, match is determined by empty cells in col A1:A10. + // Without fix the range was reduced, so that B9 and B10 were not count and result was 4. + CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(ScAddress(3, 0, 0))); + + // Make sure the result is identical for exchanged queries. This tests that the range + // reduction has actually been reversed. + m_pDoc->SetFormula(ScAddress(3, 1, 0), "=COUNTIFS($B1:$B10;\">0\";A1:A10;\"=\")", + formula::FormulaGrammar::GRAM_NATIVE_UI); + CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(ScAddress(3, 1, 0))); + + m_pDoc->DeleteTab(0); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx index d63b69b62a20..88a0899c3315 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -6080,7 +6080,9 @@ void ScInterpreter::IterateParametersIfs( double(*ResultFunc)( const sc::ParamIf } // Probe the main range token, and try if we can shrink the range without altering results. - const formula::FormulaToken* pMainRangeToken = pStack[ sp-nParamCount ]; + const bool bIsCountIfs = (nParamCount % 2) == 0; + const formula::FormulaToken* pMainRangeToken + = bIsCountIfs ? pStack[sp - 1] : pStack[sp - nParamCount]; if (pMainRangeToken->GetType() == svDoubleRef && bHasDoubleRefCriteriaRanges) { const ScComplexRefData* pRefData = pMainRangeToken->GetDoubleRef(); @@ -6305,8 +6307,7 @@ void ScInterpreter::IterateParametersIfs( double(*ResultFunc)( const sc::ParamIf // Undo bRangeReduce if asked to match empty cells for COUNTIFS (which should be rare). assert(rEntry.GetQueryItems().size() == 1); - const bool isCountIfs = (nParamCount % 2) == 0; - if(isCountIfs && (rEntry.IsQueryByEmpty() || rItem.mbMatchEmpty) && bRangeReduce) + if(bIsCountIfs && (rEntry.IsQueryByEmpty() || rItem.mbMatchEmpty) && bRangeReduce) { bRangeReduce = false; // All criteria ranges are svDoubleRef's, so only vConditions needs adjusting. commit b8f973a9ddfab8c6c7d0293fa004b2b6cb83b624 Author: Xisco Fauli <[email protected]> AuthorDate: Fri Jan 23 11:28:06 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Fri Jan 30 13:16:35 2026 +0100 crashreporting: check xTextDoc in ExportContent_() Seen in https://crashreport.libreoffice.org/stats/crash_details/b4091e21-8d8c-48e8-818b-f05ac0aff040 Change-Id: If5aaf56724331ec92c85dac2f8b5ce4ba55e4143 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197935 Reviewed-by: Caolán McNamara <[email protected]> Tested-by: Jenkins (cherry picked from commit 6920e84063ba52955d0edb2169aa4c728881397e) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198008 Reviewed-by: Adolfo Jayme Barrientos <[email protected]> diff --git a/sw/source/filter/xml/xmlexp.cxx b/sw/source/filter/xml/xmlexp.cxx index ca6996f9168d..a523c49a79d2 100644 --- a/sw/source/filter/xml/xmlexp.cxx +++ b/sw/source/filter/xml/xmlexp.cxx @@ -539,11 +539,14 @@ void SwXMLExport::ExportContent_() GetTextParagraphExport()->exportTrackedChanges( false ); GetTextParagraphExport()->exportTextDeclarations(); - Reference < XTextDocument > xTextDoc( GetModel(), UNO_QUERY ); - Reference < XText > xText = xTextDoc->getText(); - GetTextParagraphExport()->exportFramesBoundToPage( m_bShowProgress ); - GetTextParagraphExport()->exportText( xText, m_bShowProgress ); + + Reference < XTextDocument > xTextDoc( GetModel(), UNO_QUERY ); + if (xTextDoc.is()) + { + Reference < XText > xText = xTextDoc->getText(); + GetTextParagraphExport()->exportText( xText, m_bShowProgress ); + } } SwDoc* SwXMLExport::getDoc() commit 3660e35eafa193f23c00560871fd8716bccbc7f2 Author: Patrick Luby <[email protected]> AuthorDate: Wed Dec 24 19:15:29 2025 -0500 Commit: Andras Timar <[email protected]> CommitDate: Fri Jan 30 13:16:35 2026 +0100 Use macOS Tahoe's native control bounds for macOS 26.2 In macOS 26.0 and 26.1, macOS would only use Tahoe's native control bounds if LibreOffice was built with Xcode 26. However, macOS 26.2 now uses Tahoe's native bounds even if LibreOffice was built with an earlier version of Xcode. So move all the compiler and macOS version checks that were added in commit 764799befcb927f68f78e904213e3db7195554cb as well as the new macOS 16.2 check into a new useTahoeNativeBounds() function. Also, merge commit 2cddb7f648f80c28e080bebacc31a98333f77f2c since builds on pre-Tahoe macOS versions still render the pre-Tahoe style so further adjustments are needed when running on macOS Tahoe. Change-Id: Ib3d3c57223b6599b1954459aafcf304e07bf2d32 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196204 Reviewed-by: Patrick Luby <[email protected]> Tested-by: Jenkins Signed-off-by: Xisco Fauli <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196857 Reviewed-by: Adolfo Jayme Barrientos <[email protected]> diff --git a/vcl/osx/salnativewidgets.cxx b/vcl/osx/salnativewidgets.cxx index e75462a17910..c8f73c723d50 100644 --- a/vcl/osx/salnativewidgets.cxx +++ b/vcl/osx/salnativewidgets.cxx @@ -454,13 +454,35 @@ static void drawEditableBackground(CGContextRef context, const NSRect& rc) CGContextRestoreGState(context); } -static constexpr int spinButtonWidth() +static bool useTahoeNativeBounds() { + if (@available(macOS 26.2, *)) + return true; #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 260000 - if (@available(macOS 26, *)) + else if (@available(macOS 26, *)) + return true; +#endif + + return false; +} + +static bool adjustPreTahoeBuildForTahoeNativeBounds() +{ +#if __MAC_OS_X_VERSION_MAX_ALLOWED < 260000 + if (@available(macOS 26.2, *)) + return true; +#endif + + return false; +} + +static int spinButtonWidth() +{ + // Builds on pre-Tahoe macOS versions still render the pre-Tahoe style + // so further adjustments are needed when running on macOS Tahoe. + if (useTahoeNativeBounds() && !adjustPreTahoeBuildForTahoeNativeBounds()) return 23; else -#endif return 16; } @@ -633,8 +655,7 @@ bool AquaGraphicsBackendBase::performDrawNativeControl(ControlType nType, rc.origin.x -= nMargin; rc.size.width += nMargin * 2; -#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 260000 - if (@available(macOS 26, *)) + if (useTahoeNativeBounds()) { rc.origin.x += FOCUS_RING_WIDTH * 2; rc.size.width -= FOCUS_RING_WIDTH * 4; @@ -643,9 +664,29 @@ bool AquaGraphicsBackendBase::performDrawNativeControl(ControlType nType, rc.origin.y += 1; rc.size.height -= FOCUS_RING_WIDTH; } + + // Builds on pre-Tahoe macOS versions still render + // the pre-Tahoe style so further adjustments are + // needed when running on macOS Tahoe. + if (adjustPreTahoeBuildForTahoeNativeBounds()) + { + if (eBezelStyle == NSBezelStyleFlexiblePush) + { + rc.origin.x -= FOCUS_RING_WIDTH; + rc.size.width += FOCUS_RING_WIDTH * 2; + rc.origin.y -= (FOCUS_RING_WIDTH / 2) - 1; + rc.size.height += FOCUS_RING_WIDTH; + } + else + { + rc.origin.x -= FOCUS_RING_WIDTH * 2; + rc.size.width += FOCUS_RING_WIDTH * 4; + rc.origin.y -= FOCUS_RING_WIDTH * 2; + rc.size.height += FOCUS_RING_WIDTH * 4; + } + } } else -#endif { if (eBezelStyle == NSBezelStyleFlexiblePush) { @@ -947,24 +988,20 @@ bool AquaGraphicsBackendBase::performDrawNativeControl(ControlType nType, [pCtrl setSegmentCount: nCells]; if (bSolo) { -#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 260000 - if (@available(macOS 26, *)) + if (useTahoeNativeBounds()) [pCtrl setWidth: rc.size.width forSegment: 0]; else -#endif [pCtrl setWidth: rc.size.width + FOCUS_RING_WIDTH forSegment: 0]; } else { -#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 260000 - if (@available(macOS 26, *)) + if (useTahoeNativeBounds()) { [pCtrl setWidth: rc.size.width - FOCUS_RING_WIDTH/2 forSegment: 0]; [pCtrl setWidth: rc.size.width - FOCUS_RING_WIDTH/4 forSegment: 1]; [pCtrl setWidth: rc.size.width - FOCUS_RING_WIDTH/2 forSegment: 2]; } else -#endif { [pCtrl setWidth: rc.size.width + FOCUS_RING_WIDTH/2 forSegment: 0]; @@ -1043,18 +1080,29 @@ bool AquaGraphicsBackendBase::performDrawNativeControl(ControlType nType, { if (bSolo) { -#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 260000 - if (@available(macOS 26, *)) + if (useTahoeNativeBounds()) { rc.origin.y += FOCUS_RING_WIDTH / 4; rc.size.height -= FOCUS_RING_WIDTH / 2; + + // Builds on pre-Tahoe macOS versions still render + // the pre-Tahoe style so further adjustments are + // needed when running on macOS Tahoe. + if (adjustPreTahoeBuildForTahoeNativeBounds()) + { + rc.size.width -= 1; + rc.origin.y += 1; + rc.size.height -= FOCUS_RING_WIDTH / 2; + } + } + else + { + rc.size.width -= 1; } -#endif } else { -#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 260000 - if (@available(macOS 26, *)) + if (useTahoeNativeBounds()) { if (nPaintIndex == 0) rc.origin.x += FOCUS_RING_WIDTH / 2; @@ -1066,19 +1114,40 @@ bool AquaGraphicsBackendBase::performDrawNativeControl(ControlType nType, else rc.size.width -= FOCUS_RING_WIDTH * 3 / 4; rc.size.height -= FOCUS_RING_WIDTH; + + // Builds on pre-Tahoe macOS versions still render + // the pre-Tahoe style so further adjustments are + // needed when running on macOS Tahoe. + if (adjustPreTahoeBuildForTahoeNativeBounds()) + { + if (nPaintIndex == 0) + { + rc.origin.x -= FOCUS_RING_WIDTH / 2; + rc.size.width += FOCUS_RING_WIDTH / 2; + } + else if (nPaintIndex == 1) + { + rc.origin.x -= FOCUS_RING_WIDTH / 2 + 1; + rc.size.width += FOCUS_RING_WIDTH; + } + else if (nPaintIndex == 2) + { + rc.origin.x -= FOCUS_RING_WIDTH / 2; + rc.size.width += FOCUS_RING_WIDTH; + } + } } else -#endif { - if (nPaintIndex == 0) + if (nPaintIndex == 1) { - rc.origin.x += FOCUS_RING_WIDTH / 2; - rc.size.width -= FOCUS_RING_WIDTH / 2; + rc.origin.x -= 1; + rc.size.width += 1; } else if (nPaintIndex == 2) { - rc.size.width -= FOCUS_RING_WIDTH / 2; - rc.size.width -= FOCUS_RING_WIDTH / 2; + rc.origin.x -= 1; + rc.size.width += 1; } } } @@ -1137,11 +1206,9 @@ bool AquaGraphicsBackendBase::performDrawNativeControl(ControlType nType, { rc.origin.x += 2; -#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 260000 - if (@available(macOS 26, *)) + if (useTahoeNativeBounds()) rc.size.width -= 4; else -#endif rc.size.width -= 1; } @@ -1173,14 +1240,12 @@ bool AquaGraphicsBackendBase::performDrawNativeControl(ControlType nType, else [pBtn setKeyEquivalent: @""]; -#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 260000 - if (@available(macOS 26, *)) + if (useTahoeNativeBounds()) { rc.origin.x += 2; rc.size.width -= 4; } else -#endif { rc.size.width += 1; } @@ -1250,11 +1315,7 @@ bool AquaGraphicsBackendBase::performDrawNativeControl(ControlType nType, ControlState nLowerState = pSpinButtonVal->mnLowerState; rc.origin.x += rc.size.width + FOCUS_RING_WIDTH + 1; -#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 260000 - if (@available(macOS 26, *)) - ; - else -#endif + if (!useTahoeNativeBounds()) rc.origin.y -= 1; rc.size.width = SPIN_BUTTON_WIDTH; rc.size.height = SPIN_UPPER_BUTTON_HEIGHT + SPIN_LOWER_BUTTON_HEIGHT; @@ -1406,11 +1467,9 @@ bool AquaSalGraphics::getNativeControlRegion(ControlType nType, case ControlType::TabItem: { w = aCtrlBoundRect.GetWidth() + 2 * TAB_TEXT_MARGIN; -#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 260000 - if (@available(macOS 26, *)) + if (useTahoeNativeBounds()) h = TAB_HEIGHT + 2 + FOCUS_RING_WIDTH; else -#endif h = TAB_HEIGHT + 2; rNativeContentRegion = tools::Rectangle(Point(x, y), Size(w, h)); rNativeBoundingRegion = tools::Rectangle(Point(x, y), Size(w, h)); @@ -1506,11 +1565,9 @@ bool AquaSalGraphics::getNativeControlRegion(ControlType nType, if (nPart == ControlPart::Entire) { w = aCtrlBoundRect.GetWidth(); -#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 260000 - if (@available(macOS 26, *)) + if (useTahoeNativeBounds()) h = EDITBOX_HEIGHT + 2 * FOCUS_RING_WIDTH + 1; else -#endif h = EDITBOX_HEIGHT + 2 * FOCUS_RING_WIDTH; x += SPINBOX_OFFSET; rNativeBoundingRegion = tools::Rectangle(Point(x, y), Size(w, h)); commit 5e2e6a7acd0496bccdfd40641890a99c2ffaf710 Author: Justin Luth <[email protected]> AuthorDate: Mon Jan 26 10:21:04 2026 -0500 Commit: Andras Timar <[email protected]> CommitDate: Fri Jan 30 13:16:35 2026 +0100 tdf#165359 writerfilter: import graphic into richText, not plainText MS Word complains that documents are corrupt if a <w:text/> w:sdt (plainText content control) contains a picture. make CppunitTest_sw_ooxmlexport25 \ CPPUNIT_TEST_NAME=testTdf165359_SdtWithInline make CppunitTest_sw_ooxmlexport25 \ CPPUNIT_TEST_NAME=testTdf165359_SdtWithDrawing Change-Id: Ic1533a71fbaaaa4e28e7e00976f5c8f747cf2d6b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198049 Tested-by: Jenkins Reviewed-by: Justin Luth <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198198 diff --git a/sw/qa/extras/ooxmlexport/data/tdf165359_SdtWithDrawing.docx b/sw/qa/extras/ooxmlexport/data/tdf165359_SdtWithDrawing.docx new file mode 100644 index 000000000000..31a37c5e8f2f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf165359_SdtWithDrawing.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf165359_SdtWithInline.docx b/sw/qa/extras/ooxmlexport/data/tdf165359_SdtWithInline.docx new file mode 100644 index 000000000000..87d4ddac6770 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf165359_SdtWithInline.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx index 248fe96c3c02..319ced5eba2c 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx @@ -159,6 +159,28 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf170438_dropdown) assertXPath(pXmlDoc, "//w:listItem[1]", "value", u""); // value may be empty } +CPPUNIT_TEST_FIXTURE(Test, testTdf165359_SdtWithInline) +{ + createSwDoc("tdf165359_SdtWithInline.docx"); + + save(TestFilter::DOCX); + + xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr); + // MS Word reports document as corrupt if a picture is inside of a plainText content control + assertXPath(pXmlDoc, "//w:sdtPr/w:text", 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf165359_SdtWithDrawing) +{ + createSwDoc("tdf165359_SdtWithDrawing.docx"); + + save(TestFilter::DOCX); + + xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr); + // MS Word reports document as corrupt if a picture is inside of a plainText content control + assertXPath(pXmlDoc, "//w:sdtPr/w:text", 0); +} + CPPUNIT_TEST_FIXTURE(Test, testTdf170389_manyTabstops) { createSwDoc("tdf170389_manyTabstops.odt"); diff --git a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx index 8d461f0a4c12..0499b42776f1 100644 --- a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx +++ b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx @@ -9667,6 +9667,13 @@ void DomainMapper_Impl::ImportGraphic(const writerfilter::Reference<Properties> } } + if (m_pSdtHelper->getControlType() == SdtControlType::plainText + && (m_StreamStateStack.top().bSdt || GetSdtStarts().size())) + { + // plainText controls cannot contain pictures or shapes + m_pSdtHelper->setControlType(SdtControlType::richText); + } + // Update the shape properties if it is embedded object. if (m_StreamStateStack.top().xEmbedded.is()) commit e19d7e73f438f9fd7c54cbbb7fb3ae6510c75931 Author: Christian Lohmaier <[email protected]> AuthorDate: Tue Jan 27 16:23:27 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Fri Jan 30 13:16:34 2026 +0100 update credits Change-Id: I4fa0398e403d983e21e82390a19aa9b9992a9da7 (cherry picked from commit 9807b7af87cb6ef4b78ebec7bb6cf17b9515521e) diff --git a/readlicense_oo/license/CREDITS.fodt b/readlicense_oo/license/CREDITS.fodt index becaa5583ea3..637e79a74f67 100644 --- a/readlicense_oo/license/CREDITS.fodt +++ b/readlicense_oo/license/CREDITS.fodt @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> <office:document xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:c alcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns: meta:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.4" office:mimetype="application/vnd.oasis.opendocument.text"> - <office:meta><dc:title>Credits » LibreOffice</dc:title><meta:keyword>Credits</meta:keyword><meta:keyword>contributors</meta:keyword><meta:keyword>coders</meta:keyword><meta:keyword>developers</meta:keyword><dc:description>Credits for the LibreOffice development/coding.</dc:description><meta:generator>LibreOffice/25.8.4.1$Linux_X86_64 LibreOffice_project/6ab4ab096601e7cd763971a4dad5a6c7322a1a59</meta:generator><dc:date>2012-02-20T22:17:18.060000000</dc:date><meta:editing-duration>PT14M12S</meta:editing-duration><meta:editing-cycles>3</meta:editing-cycles><meta:document-statistic meta:table-count="5" meta:image-count="1" meta:object-count="0" meta:page-count="2" meta:paragraph-count="5204" meta:word-count="19716" meta:character-count="142927" meta:non-whitespace-character-count="125441"/><meta:user-defined meta:name="google-site-verification">JUebjoxEpqXoQcpltWRTwzBZEEHtch3wApdhgiQPFiA</meta:user-defined></office:meta> + <office:meta><dc:title>Credits » LibreOffice</dc:title><meta:keyword>Credits</meta:keyword><meta:keyword>contributors</meta:keyword><meta:keyword>coders</meta:keyword><meta:keyword>developers</meta:keyword><dc:description>Credits for the LibreOffice development/coding.</dc:description><meta:generator>LibreOffice/25.8.4.2$Linux_X86_64 LibreOffice_project/290daaa01b999472f0c7a3890eb6a550fd74c6df</meta:generator><dc:date>2012-02-20T22:17:18.060000000</dc:date><meta:editing-duration>PT14M12S</meta:editing-duration><meta:editing-cycles>3</meta:editing-cycles><meta:document-statistic meta:table-count="5" meta:image-count="1" meta:object-count="0" meta:page-count="2" meta:paragraph-count="5232" meta:word-count="19822" meta:character-count="143726" meta:non-whitespace-character-count="126148"/><meta:user-defined meta:name="google-site-verification">JUebjoxEpqXoQcpltWRTwzBZEEHtch3wApdhgiQPFiA</meta:user-defined></office:meta> <office:settings> <config:config-item-set config:name="ooo:view-settings"> - <config:config-item config:name="ViewAreaTop" config:type="long">3069</config:config-item> + <config:config-item config:name="ViewAreaTop" config:type="long">3036</config:config-item> <config:config-item config:name="ViewAreaLeft" config:type="long">501</config:config-item> - <config:config-item config:name="ViewAreaWidth" config:type="long">27219</config:config-item> - <config:config-item config:name="ViewAreaHeight" config:type="long">25243</config:config-item> + <config:config-item config:name="ViewAreaWidth" config:type="long">27236</config:config-item> + <config:config-item config:name="ViewAreaHeight" config:type="long">25261</config:config-item> <config:config-item config:name="ShowRedlineChanges" config:type="boolean">true</config:config-item> <config:config-item config:name="InBrowseMode" config:type="boolean">true</config:config-item> <config:config-item-map-indexed config:name="Views"> @@ -16,9 +16,9 @@ <config:config-item config:name="ViewLeft" config:type="long">3323</config:config-item> <config:config-item config:name="ViewTop" config:type="long">3434</config:config-item> <config:config-item config:name="VisibleLeft" config:type="long">501</config:config-item> - <config:config-item config:name="VisibleTop" config:type="long">3069</config:config-item> - <config:config-item config:name="VisibleRight" config:type="long">27718</config:config-item> - <config:config-item config:name="VisibleBottom" config:type="long">28310</config:config-item> + <config:config-item config:name="VisibleTop" config:type="long">3036</config:config-item> + <config:config-item config:name="VisibleRight" config:type="long">27735</config:config-item> + <config:config-item config:name="VisibleBottom" config:type="long">28295</config:config-item> <config:config-item config:name="ZoomType" config:type="short">0</config:config-item> <config:config-item config:name="ViewLayoutColumns" config:type="short">0</config:config-item> <config:config-item config:name="ViewLayoutBookMode" config:type="boolean">false</config:config-item> @@ -157,7 +157,7 @@ <config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item> <config:config-item config:name="RedlineProtectionKey" config:type="base64Binary"/> <config:config-item config:name="TabsRelativeToIndent" config:type="boolean">true</config:config-item> - <config:config-item config:name="Rsid" config:type="int">14993693</config:config-item> + <config:config-item config:name="Rsid" config:type="int">15048688</config:config-item> <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item> <config:config-item config:name="ProtectForm" config:type="boolean">false</config:config-item> <config:config-item config:name="MsWordCompMinLineHeightByFly" config:type="boolean">false</config:config-item> @@ -380,24 +380,24 @@ </office:styles> <office:automatic-styles> <style:style style:name="Tabelle1" style:family="table"> - <style:table-properties style:width="26.587cm" table:align="left"/> + <style:table-properties style:width="26.042cm" table:align="left"/> </style:style> <style:style style:name="Tabelle1.A" style:family="table-column"> - <style:table-column-properties style:column-width="6.761cm"/> + <style:table-column-properties style:column-width="6.212cm"/> </style:style> <style:style style:name="Tabelle1.B" style:family="table-column"> - <style:table-column-properties style:column-width="6.144cm"/> + <style:table-column-properties style:column-width="6.735cm"/> </style:style> <style:style style:name="Tabelle1.C" style:family="table-column"> - <style:table-column-properties style:column-width="6.872cm"/> + <style:table-column-properties style:column-width="6.144cm"/> </style:style> <style:style style:name="Tabelle1.D" style:family="table-column"> - <style:table-column-properties style:column-width="6.81cm"/> + <style:table-column-properties style:column-width="6.951cm"/> </style:style> <style:style style:name="Tabelle1.A1" style:family="table-cell"> <style:table-cell-properties style:vertical-align="middle" fo:padding="0.049cm" fo:border="none"/> </style:style> - <style:style style:name="Tabelle1.B505" style:family="table-cell"> + <style:style style:name="Tabelle1.D508" style:family="table-cell"> <style:table-cell-properties fo:padding="0.049cm" fo:border="none"/> </style:style> <style:style style:name="Tabelle2" style:family="table"> @@ -461,26 +461,23 @@ <style:table-cell-properties fo:padding="0.049cm" fo:border="none"/> </style:style> <style:style style:name="Tabelle5" style:family="table"> - <style:table-properties style:width="26.936cm" table:align="left"/> + <style:table-properties style:width="26.954cm" table:align="left"/> </style:style> <style:style style:name="Tabelle5.A" style:family="table-column"> - <style:table-column-properties style:column-width="5.694cm"/> + <style:table-column-properties style:column-width="8.216cm"/> </style:style> <style:style style:name="Tabelle5.B" style:family="table-column"> - <style:table-column-properties style:column-width="5.872cm"/> + <style:table-column-properties style:column-width="5.336cm"/> </style:style> <style:style style:name="Tabelle5.C" style:family="table-column"> - <style:table-column-properties style:column-width="9.604cm"/> + <style:table-column-properties style:column-width="5.819cm"/> </style:style> <style:style style:name="Tabelle5.D" style:family="table-column"> - <style:table-column-properties style:column-width="5.766cm"/> + <style:table-column-properties style:column-width="7.583cm"/> </style:style> <style:style style:name="Tabelle5.A1" style:family="table-cell"> <style:table-cell-properties style:vertical-align="middle" fo:padding="0.049cm" fo:border="none"/> </style:style> - <style:style style:name="Tabelle5.C750" style:family="table-cell"> - <style:table-cell-properties fo:padding="0.049cm" fo:border="none"/> - </style:style> <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Heading_20_1" style:master-page-name="HTML"> <style:paragraph-properties style:page-number="auto"/> <style:text-properties officeooo:paragraph-rsid="00af6e70"/> @@ -863,7 +860,7 @@ </draw:frame> <text:section text:style-name="Sect1" text:name="BgContainer"> <text:p text:style-name="P1"><text:span text:style-name="T1">Credits</text:span></text:p> - <text:p text:style-name="Text_20_body">2147 individuals contributed to OpenOffice.org (and whose contributions were imported into LibreOffice) or LibreOffice until 2025-12-10 17:19:54.</text:p> + <text:p text:style-name="Text_20_body">2161 individuals contributed to OpenOffice.org (and whose contributions were imported into LibreOffice) or LibreOffice until 2026-01-27 16:02:47.</text:p> <text:p text:style-name="Text_20_body"><text:span text:style-name="T2">*</text:span> marks developers whose first contributions happened after 2010-09-28.</text:p> <text:h text:style-name="P2" text:outline-level="2">Developers committing code since 2010-09-28</text:h> <table:table table:name="Tabelle1" table:style-name="Tabelle1"> @@ -876,7 +873,7 @@ <text:p text:style-name="Table_20_Contents">Ruediger Timm<text:line-break/>Commits: 82464<text:line-break/>Joined: 2000-10-10</text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents">Caolán McNamara<text:line-break/>Commits: 37295<text:line-break/>Joined: 2000-10-10</text:p> + <text:p text:style-name="Table_20_Contents">Caolán McNamara<text:line-break/>Commits: 37393<text:line-break/>Joined: 2000-10-10</text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents">Kurt Zenker<text:line-break/>Commits: 31752<text:line-break/>Joined: 2000-09-25</text:p> @@ -896,18 +893,18 @@ <text:p text:style-name="Table_20_Contents">Stephan Bergmann<text:line-break/>Commits: 21530<text:line-break/>Joined: 2000-10-04</text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Noel Grandin<text:line-break/>Commits: 20595<text:line-break/>Joined: <text:span text:style-name="T3">2011-12-12</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Noel Grandin<text:line-break/>Commits: 20685<text:line-break/>Joined: <text:span text:style-name="T3">2011-12-12</text:span></text:p> </table:table-cell> </table:table-row> <table:table-row> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents">Miklos Vajna<text:line-break/>Commits: 10392<text:line-break/>Joined: 2010-07-29</text:p> + <text:p text:style-name="Table_20_Contents">Miklos Vajna<text:line-break/>Commits: 10426<text:line-break/>Joined: 2010-07-29</text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents">Ivo Hinkelmann<text:line-break/>Commits: 9480<text:line-break/>Joined: 2002-09-09</text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents">Tor Lillqvist<text:line-break/>Commits: 9165<text:line-break/>Joined: 2010-03-23</text:p> + <text:p text:style-name="Table_20_Contents">Tor Lillqvist<text:line-break/>Commits: 9231<text:line-break/>Joined: 2010-03-23</text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents">Michael Stahl<text:line-break/>Commits: 8681<text:line-break/>Joined: 2008-06-16</text:p> @@ -915,7 +912,7 @@ </table:table-row> <table:table-row> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents">Kohei Yoshida<text:line-break/>Commits: 5584<text:line-break/>Joined: 2009-06-19</text:p> + <text:p text:style-name="Table_20_Contents">Kohei Yoshida<text:line-break/>Commits: 5586<text:line-break/>Joined: 2009-06-19</text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents">Eike Rathke<text:line-break/>Commits: 5398<text:line-break/>Joined: 2000-10-11</text:p> @@ -929,24 +926,24 @@ </table:table-row> <table:table-row> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Mike Kaganski<text:line-break/>Commits: 4670<text:line-break/>Joined: <text:span text:style-name="T3">2015-04-26</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Mike Kaganski<text:line-break/>Commits: 4745<text:line-break/>Joined: <text:span text:style-name="T3">2015-04-26</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Andrea Gelmini<text:line-break/>Commits: 4497<text:line-break/>Joined: <text:span text:style-name="T3">2014-10-30</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Andrea Gelmini<text:line-break/>Commits: 4526<text:line-break/>Joined: <text:span text:style-name="T3">2014-10-30</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Michael Weghorn<text:line-break/>Commits: 4038<text:line-break/>Joined: <text:span text:style-name="T3">2014-09-10</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Michael Weghorn<text:line-break/>Commits: 4398<text:line-break/>Joined: <text:span text:style-name="T3">2014-09-10</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Julien Nabet<text:line-break/>Commits: 4023<text:line-break/>Joined: <text:span text:style-name="T3">2010-11-04</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Xisco Fauli<text:line-break/>Commits: 4045<text:line-break/>Joined: <text:span text:style-name="T3">2011-02-06</text:span></text:p> </table:table-cell> </table:table-row> <table:table-row> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Xisco Fauli<text:line-break/>Commits: 3953<text:line-break/>Joined: <text:span text:style-name="T3">2011-02-06</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Julien Nabet<text:line-break/>Commits: 4026<text:line-break/>Joined: <text:span text:style-name="T3">2010-11-04</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Tomaž Vajngerl<text:line-break/>Commits: 3778<text:line-break/>Joined: <text:span text:style-name="T3">2012-06-02</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Tomaž Vajngerl<text:line-break/>Commits: 3795<text:line-break/>Joined: <text:span text:style-name="T3">2012-06-02</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents">David Tardon<text:line-break/>Commits: 3648<text:line-break/>Joined: 2009-11-12</text:p> @@ -966,7 +963,7 @@ <text:p text:style-name="Table_20_Contents">Oliver Specht<text:line-break/>Commits: 2698<text:line-break/>Joined: 2000-09-21</text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents">Jan Holesovsky<text:line-break/>Commits: 2679<text:line-break/>Joined: 2009-06-23</text:p> + <text:p text:style-name="Table_20_Contents">Jan Holesovsky<text:line-break/>Commits: 2684<text:line-break/>Joined: 2009-06-23</text:p> </table:table-cell> </table:table-row> <table:table-row> @@ -977,7 +974,7 @@ <text:p text:style-name="Table_20_Contents">Michael Meeks<text:line-break/>Commits: 2543<text:line-break/>Joined: 2004-08-05</text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Olivier Hallot<text:line-break/>Commits: 2516<text:line-break/>Joined: <text:span text:style-name="T3">2010-10-25</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Olivier Hallot<text:line-break/>Commits: 2540<text:line-break/>Joined: <text:span text:style-name="T3">2010-10-25</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents">Bjoern Michaelsen<text:line-break/>Commits: 2510<text:line-break/>Joined: 2009-10-14</text:p> @@ -991,10 +988,10 @@ <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Thomas Arnhold<text:line-break/>Commits: 2176<text:line-break/>Joined: <text:span text:style-name="T3">2011-01-16</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents">Philipp Lohmann [pl]<text:line-break/>Commits: 2089<text:line-break/>Joined: 2000-09-21</text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Andras Timar<text:line-break/>Commits: 2095<text:line-break/>Joined: <text:span text:style-name="T3">2010-10-02</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Andras Timar<text:line-break/>Commits: 2083<text:line-break/>Joined: <text:span text:style-name="T3">2010-10-02</text:span></text:p> + <text:p text:style-name="Table_20_Contents">Philipp Lohmann [pl]<text:line-break/>Commits: 2089<text:line-break/>Joined: 2000-09-21</text:p> </table:table-cell> </table:table-row> <table:table-row> @@ -1008,7 +1005,7 @@ <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Matúš Kukan<text:line-break/>Commits: 1712<text:line-break/>Joined: <text:span text:style-name="T3">2011-04-06</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Christopher Sherlock<text:line-break/>Commits: 1621<text:line-break/>Joined: <text:span text:style-name="T3">2013-02-25</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Christopher Sherlock<text:line-break/>Commits: 1630<text:line-break/>Joined: <text:span text:style-name="T3">2013-02-25</text:span></text:p> </table:table-cell> </table:table-row> <table:table-row> @@ -1016,10 +1013,10 @@ <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Takeshi Abe<text:line-break/>Commits: 1486<text:line-break/>Joined: <text:span text:style-name="T3">2010-11-08</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Matteo Casalin<text:line-break/>Commits: 1476<text:line-break/>Joined: <text:span text:style-name="T3">2011-11-13</text:span></text:p> + <text:p text:style-name="Table_20_Contents">Christian Lohmaier<text:line-break/>Commits: 1483<text:line-break/>Joined: 2008-06-01</text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents">Christian Lohmaier<text:line-break/>Commits: 1475<text:line-break/>Joined: 2008-06-01</text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Matteo Casalin<text:line-break/>Commits: 1476<text:line-break/>Joined: <text:span text:style-name="T3">2011-11-13</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents">Thorsten Behrens<text:line-break/>Commits: 1442<text:line-break/>Joined: 2001-04-25</text:p> @@ -1027,10 +1024,10 @@ </table:table-row> <table:table-row> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Samuel Mehrbrodt<text:line-break/>Commits: 1350<text:line-break/>Joined: <text:span text:style-name="T3">2011-06-08</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Szymon Kłos<text:line-break/>Commits: 1356<text:line-break/>Joined: <text:span text:style-name="T3">2014-03-22</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Szymon Kłos<text:line-break/>Commits: 1344<text:line-break/>Joined: <text:span text:style-name="T3">2014-03-22</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Samuel Mehrbrodt<text:line-break/>Commits: 1350<text:line-break/>Joined: <text:span text:style-name="T3">2011-06-08</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents">Fridrich Štrba<text:line-break/>Commits: 1340<text:line-break/>Joined: 2007-02-22</text:p> @@ -1050,7 +1047,7 @@ <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>andreas kainz<text:line-break/>Commits: 1228<text:line-break/>Joined: <text:span text:style-name="T3">2015-03-18</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Tamás Zolnai<text:line-break/>Commits: 1216<text:line-break/>Joined: <text:span text:style-name="T3">2012-08-06</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Tamás Zolnai<text:line-break/>Commits: 1227<text:line-break/>Joined: <text:span text:style-name="T3">2012-08-06</text:span></text:p> </table:table-cell> </table:table-row> <table:table-row> @@ -1064,7 +1061,7 @@ <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Lionel Elie Mamane<text:line-break/>Commits: 1051<text:line-break/>Joined: <text:span text:style-name="T3">2011-01-15</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>László Németh<text:line-break/>Commits: 1021<text:line-break/>Joined: <text:span text:style-name="T3">2010-09-29</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>László Németh<text:line-break/>Commits: 1030<text:line-break/>Joined: <text:span text:style-name="T3">2010-09-29</text:span></text:p> </table:table-cell> </table:table-row> <table:table-row> @@ -1117,13 +1114,16 @@ <text:p text:style-name="Table_20_Contents">Carsten Driesner<text:line-break/>Commits: 748<text:line-break/>Joined: 2000-10-06</text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents">Joachim Lingner<text:line-break/>Commits: 745<text:line-break/>Joined: 2000-10-05</text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Justin Luth<text:line-break/>Commits: 747<text:line-break/>Joined: <text:span text:style-name="T3">2018-04-21</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Katarina Behrens<text:line-break/>Commits: 745<text:line-break/>Joined: <text:span text:style-name="T3">2010-10-13</text:span></text:p> + <text:p text:style-name="Table_20_Contents">Joachim Lingner<text:line-break/>Commits: 745<text:line-break/>Joined: 2000-10-05</text:p> </table:table-cell> </table:table-row> <table:table-row> + <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Katarina Behrens<text:line-break/>Commits: 745<text:line-break/>Joined: <text:span text:style-name="T3">2010-10-13</text:span></text:p> + </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Andrzej Hunt<text:line-break/>Commits: 743<text:line-break/>Joined: <text:span text:style-name="T3">2012-03-27</text:span></text:p> </table:table-cell> @@ -1133,27 +1133,24 @@ <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents">Release Engineering<text:line-break/>Commits: 728<text:line-break/>Joined: 2008-10-02</text:p> </table:table-cell> - <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Zdeněk Crhonek<text:line-break/>Commits: 714<text:line-break/>Joined: <text:span text:style-name="T3">2016-05-19</text:span></text:p> - </table:table-cell> </table:table-row> <table:table-row> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Justin Luth<text:line-break/>Commits: 713<text:line-break/>Joined: <text:span text:style-name="T3">2018-04-21</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Zdeněk Crhonek<text:line-break/>Commits: 714<text:line-break/>Joined: <text:span text:style-name="T3">2016-05-19</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Jim Raykowski<text:line-break/>Commits: 700<text:line-break/>Joined: <text:span text:style-name="T3">2017-04-16</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Jim Raykowski<text:line-break/>Commits: 714<text:line-break/>Joined: <text:span text:style-name="T3">2017-04-16</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents">Joerg Skottke [jsk]<text:line-break/>Commits: 678<text:line-break/>Joined: 2008-06-17</text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Rizal Muttaqin<text:line-break/>Commits: 672<text:line-break/>Joined: <text:span text:style-name="T3">2018-05-21</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Heiko Tietze<text:line-break/>Commits: 672<text:line-break/>Joined: <text:span text:style-name="T3">2016-10-06</text:span></text:p> </table:table-cell> </table:table-row> <table:table-row> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Heiko Tietze<text:line-break/>Commits: 659<text:line-break/>Joined: <text:span text:style-name="T3">2016-10-06</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Rizal Muttaqin<text:line-break/>Commits: 672<text:line-break/>Joined: <text:span text:style-name="T3">2018-05-21</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Joseph Powers<text:line-break/>Commits: 658<text:line-break/>Joined: <text:span text:style-name="T3">2010-10-15</text:span></text:p> @@ -1176,7 +1173,7 @@ <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Seth Chaiklin<text:line-break/>Commits: 618<text:line-break/>Joined: <text:span text:style-name="T3">2019-11-13</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents">Rene Engelhard<text:line-break/>Commits: 609<text:line-break/>Joined: 2005-03-14</text:p> + <text:p text:style-name="Table_20_Contents">Rene Engelhard<text:line-break/>Commits: 610<text:line-break/>Joined: 2005-03-14</text:p> </table:table-cell> </table:table-row> <table:table-row> @@ -1212,24 +1209,24 @@ <text:p text:style-name="Table_20_Contents">Andreas Bregas<text:line-break/>Commits: 470<text:line-break/>Joined: 2000-09-25</text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Jean-Pierre Ledure<text:line-break/>Commits: 455<text:line-break/>Joined: <text:span text:style-name="T3">2013-10-12</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Jean-Pierre Ledure<text:line-break/>Commits: 466<text:line-break/>Joined: <text:span text:style-name="T3">2013-10-12</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Henry Castro<text:line-break/>Commits: 415<text:line-break/>Joined: <text:span text:style-name="T3">2015-01-09</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Henry Castro<text:line-break/>Commits: 417<text:line-break/>Joined: <text:span text:style-name="T3">2015-01-09</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Ashod Nakashian<text:line-break/>Commits: 405<text:line-break/>Joined: <text:span text:style-name="T3">2015-01-07</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Justin Luth<text:line-break/>Commits: 409<text:line-break/>Joined: <text:span text:style-name="T3">2020-02-03</text:span></text:p> </table:table-cell> </table:table-row> <table:table-row> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Marco Cecchetti<text:line-break/>Commits: 399<text:line-break/>Joined: <text:span text:style-name="T3">2011-04-14</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Ashod Nakashian<text:line-break/>Commits: 405<text:line-break/>Joined: <text:span text:style-name="T3">2015-01-07</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Rafael Lima<text:line-break/>Commits: 399<text:line-break/>Joined: <text:span text:style-name="T3">2020-11-13</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Marco Cecchetti<text:line-break/>Commits: 399<text:line-break/>Joined: <text:span text:style-name="T3">2011-04-14</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Justin Luth<text:line-break/>Commits: 395<text:line-break/>Joined: <text:span text:style-name="T3">2020-02-03</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Rafael Lima<text:line-break/>Commits: 399<text:line-break/>Joined: <text:span text:style-name="T3">2020-11-13</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Bogdan Buzea<text:line-break/>Commits: 393<text:line-break/>Joined: <text:span text:style-name="T3">2022-11-01</text:span></text:p> @@ -1243,7 +1240,7 @@ <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Laurent BP<text:line-break/>Commits: 389<text:line-break/>Joined: <text:span text:style-name="T3">2011-08-31</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Arnaud VERSINI<text:line-break/>Commits: 385<text:line-break/>Joined: <text:span text:style-name="T3">2010-10-05</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Arnaud Versini<text:line-break/>Commits: 386<text:line-break/>Joined: <text:span text:style-name="T3">2010-10-05</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Ivan Timofeev<text:line-break/>Commits: 380<text:line-break/>Joined: <text:span text:style-name="T3">2011-09-16</text:span></text:p> @@ -1268,21 +1265,21 @@ <text:p text:style-name="Table_20_Contents">Matthias Huetsch [mhu]<text:line-break/>Commits: 360<text:line-break/>Joined: 2000-09-28</text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Andreas Heinisch<text:line-break/>Commits: 338<text:line-break/>Joined: <text:span text:style-name="T3">2019-05-13</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Andreas Heinisch<text:line-break/>Commits: 343<text:line-break/>Joined: <text:span text:style-name="T3">2019-05-13</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents">Patrick Luby<text:line-break/>Commits: 335<text:line-break/>Joined: 2000-09-21</text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Stanislav Horacek<text:line-break/>Commits: 338<text:line-break/>Joined: <text:span text:style-name="T3">2012-12-09</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>David Ostrovsky<text:line-break/>Commits: 334<text:line-break/>Joined: <text:span text:style-name="T3">2012-04-01</text:span></text:p> + <text:p text:style-name="Table_20_Contents">Patrick Luby<text:line-break/>Commits: 335<text:line-break/>Joined: 2000-09-21</text:p> </table:table-cell> </table:table-row> <table:table-row> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Stanislav Horacek<text:line-break/>Commits: 333<text:line-break/>Joined: <text:span text:style-name="T3">2012-12-09</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>David Ostrovsky<text:line-break/>Commits: 334<text:line-break/>Joined: <text:span text:style-name="T3">2012-04-01</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Regina Henschel<text:line-break/>Commits: 310<text:line-break/>Joined: <text:span text:style-name="T3">2010-11-04</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Regina Henschel<text:line-break/>Commits: 316<text:line-break/>Joined: <text:span text:style-name="T3">2010-11-04</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents">Radek Doulik<text:line-break/>Commits: 305<text:line-break/>Joined: 2010-05-03</text:p> @@ -1296,7 +1293,7 @@ <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Chr. Rossmanith<text:line-break/>Commits: 300<text:line-break/>Joined: <text:span text:style-name="T3">2011-01-03</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Ilmari Lauhakangas<text:line-break/>Commits: 294<text:line-break/>Joined: <text:span text:style-name="T3">2017-04-15</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Ilmari Lauhakangas<text:line-break/>Commits: 296<text:line-break/>Joined: <text:span text:style-name="T3">2017-04-15</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Balazs Varga<text:line-break/>Commits: 286<text:line-break/>Joined: <text:span text:style-name="T3">2022-06-29</text:span></text:p> @@ -1338,7 +1335,7 @@ <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Winfried Donkers<text:line-break/>Commits: 217<text:line-break/>Joined: <text:span text:style-name="T3">2011-11-11</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Dennis Francis<text:line-break/>Commits: 212<text:line-break/>Joined: <text:span text:style-name="T3">2018-11-15</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Dennis Francis<text:line-break/>Commits: 213<text:line-break/>Joined: <text:span text:style-name="T3">2018-11-15</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Tamas Bunth<text:line-break/>Commits: 203<text:line-break/>Joined: <text:span text:style-name="T3">2016-03-08</text:span></text:p> @@ -1352,10 +1349,10 @@ <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Arkadiy Illarionov<text:line-break/>Commits: 201<text:line-break/>Joined: <text:span text:style-name="T3">2017-01-15</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Jacobo Aragunde Pérez<text:line-break/>Commits: 192<text:line-break/>Joined: <text:span text:style-name="T3">2013-09-25</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Gülşah Köse<text:line-break/>Commits: 194<text:line-break/>Joined: <text:span text:style-name="T3">2015-03-14</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> - <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Gülşah Köse<text:line-break/>Commits: 192<text:line-break/>Joined: <text:span text:style-name="T3">2015-03-14</text:span></text:p> + <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Jacobo Aragunde Pérez<text:line-break/>Commits: 192<text:line-break/>Joined: <text:span text:style-name="T3">2013-09-25</text:span></text:p> </table:table-cell> <table:table-cell table:style-name="Tabelle1.A1" office:value-type="string"> <text:p text:style-name="Table_20_Contents"><text:span text:style-name="T2">*</text:span>Robert Nagy<text:line-break/>Commits: 191<text:line-break/>Joined: <text:span text:style-name="T3">2010-11-04</text:span></text:p> @@ -1369,41 +1366,44 @@ -e ... etc. - the rest is truncated
