basctl/source/basicide/unomodel.cxx | 2 basegfx/source/curve/b2dcubicbezier.cxx | 24 basic/source/basmgr/basicmanagerrepository.cxx | 2 basic/source/basmgr/basmgr.cxx | 18 basic/source/uno/scriptcont.cxx | 2 canvas/source/directx/dx_textlayout_drawhelper.cxx | 4 canvas/source/opengl/ogl_canvashelper.cxx | 2 canvas/source/tools/surface.cxx | 9 canvas/source/vcl/canvasfont.cxx | 2 canvas/source/vcl/canvashelper.cxx | 4 canvas/source/vcl/canvashelper_texturefill.cxx | 36 canvas/source/vcl/impltools.cxx | 8 chart2/qa/extras/xshape/data/reference/fdo75075.xml | 736 +++++----- chart2/qa/extras/xshape/data/reference/property-mapping-bar.xml | 546 +++---- chart2/qa/extras/xshape/data/reference/tdf149204.xml | 116 - chart2/qa/extras/xshape/data/reference/tdf150832.xml | 428 ++--- chart2/qa/extras/xshape/data/reference/tdf151424.xml | 468 +++--- chart2/qa/extras/xshape/data/reference/tdf90839-1.xml | 86 - chart2/qa/extras/xshape/data/reference/tdf90839-2.xml | 64 chart2/qa/extras/xshape/data/reference/tdf90839-3.xml | 64 chart2/qa/extras/xshape/data/reference/tdf90839-4.xml | 64 chart2/qa/extras/xshape/data/reference/testChart.xml | 560 +++---- chart2/source/controller/main/SelectionHelper.cxx | 2 cppcanvas/source/mtfrenderer/transparencygroupaction.cxx | 4 cui/source/dialogs/cuigrfflt.cxx | 8 cui/source/tabpages/transfrm.cxx | 4 drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx | 2 drawinglayer/source/processor2d/SDPRProcessor2dTools.cxx | 6 drawinglayer/source/processor2d/helperwrongspellrenderer.cxx | 6 drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx | 32 drawinglayer/source/processor2d/vclprocessor2d.cxx | 50 drawinglayer/source/tools/converters.cxx | 2 drawinglayer/source/tools/emfphelperdata.cxx | 34 drawinglayer/source/tools/emfphelperdata.hxx | 10 editeng/source/editeng/impedit3.cxx | 6 editeng/source/editeng/impedit4.cxx | 3 editeng/source/items/svxfont.cxx | 4 editeng/source/misc/svxacorr.cxx | 34 editeng/source/outliner/outliner.cxx | 4 embeddedobj/source/inc/oleembobj.hxx | 28 embeddedobj/source/msole/olecomponent.cxx | 529 ++++--- embeddedobj/source/msole/olecomponent.hxx | 12 embeddedobj/source/msole/oleembed.cxx | 28 embeddedobj/source/msole/olepersist.cxx | 19 embeddedobj/source/msole/olevisual.cxx | 7 emfio/qa/cppunit/emf/EmfImportTest.cxx | 4 emfio/source/reader/mtftools.cxx | 6 filter/source/msfilter/escherex.cxx | 2 filter/source/msfilter/eschesdo.cxx | 15 filter/source/msfilter/msdffimp.cxx | 30 filter/source/msfilter/msoleexp.cxx | 8 filter/source/msfilter/rtfutil.cxx | 6 filter/source/msfilter/svdfppt.cxx | 22 filter/source/msfilter/svxmsbas2.cxx | 8 filter/source/svg/svgfilter.cxx | 2 filter/source/svg/svgwriter.cxx | 24 fpicker/source/win32/VistaFilePickerImpl.cxx | 1 hwpfilter/source/drawing.h | 1 include/basegfx/numeric/ftools.hxx | 20 include/editeng/svxacorr.hxx | 5 include/filter/msfilter/msdffimp.hxx | 6 include/filter/msfilter/svdfppt.hxx | 4 include/filter/msfilter/svxmsbas.hxx | 2 include/oox/ole/olehelper.hxx | 8 include/sal/types.h | 6 include/sfx2/event.hxx | 9 include/sfx2/objsh.hxx | 13 include/sot/object.hxx | 6 include/sot/storage.hxx | 6 include/svx/svdtrans.hxx | 12 include/svx/transfrmhelper.hxx | 8 include/tools/helpers.hxx | 8 include/vcl/bitmap.hxx | 5 include/vcl/outdev.hxx | 14 include/vcl/scheduler.hxx | 7 include/vcl/svapp.hxx | 12 include/vcl/vcllayout.hxx | 6 oox/source/crypto/CryptTools.cxx | 11 oox/source/export/drawingml.cxx | 2 oox/source/ole/olehelper.cxx | 18 oox/source/ole/vbaexport.cxx | 12 sc/inc/global.hxx | 4 sc/inc/rangelst.hxx | 1 sc/inc/tablink.hxx | 5 sc/qa/uitest/chart/chartDataLabels.py | 4 sc/qa/uitest/chart/chartLegend.py | 4 sc/source/core/data/drwlayer.cxx | 12 sc/source/core/data/global.cxx | 2 sc/source/filter/excel/excel.cxx | 30 sc/source/filter/excel/excimp8.cxx | 6 sc/source/filter/excel/expop2.cxx | 4 sc/source/filter/excel/xepivot.cxx | 4 sc/source/filter/excel/xeroot.cxx | 2 sc/source/filter/excel/xestream.cxx | 4 sc/source/filter/excel/xiescher.cxx | 2 sc/source/filter/excel/xipivot.cxx | 4 sc/source/filter/excel/xiroot.cxx | 2 sc/source/filter/excel/xlroot.cxx | 12 sc/source/filter/ftools/ftools.cxx | 16 sc/source/filter/inc/XclImpChangeTrack.hxx | 2 sc/source/filter/inc/ftools.hxx | 10 sc/source/filter/inc/xcl97esc.hxx | 2 sc/source/filter/inc/xeroot.hxx | 2 sc/source/filter/inc/xiescher.hxx | 2 sc/source/filter/inc/xiroot.hxx | 2 sc/source/filter/inc/xlroot.hxx | 16 sc/source/filter/xcl97/XclExpChangeTrack.cxx | 4 sc/source/filter/xcl97/XclImpChangeTrack.cxx | 2 sc/source/filter/xcl97/xcl97rec.cxx | 2 sc/source/ui/app/drwtrans.cxx | 15 sc/source/ui/app/seltrans.cxx | 6 sc/source/ui/app/transobj.cxx | 19 sc/source/ui/docshell/arealink.cxx | 5 sc/source/ui/docshell/docsh4.cxx | 3 sc/source/ui/docshell/externalrefmgr.cxx | 15 sc/source/ui/docshell/tablink.cxx | 18 sc/source/ui/inc/docsh.hxx | 2 sc/source/ui/inc/drwtrans.hxx | 2 sc/source/ui/inc/instbdlg.hxx | 5 sc/source/ui/inc/linkarea.hxx | 3 sc/source/ui/inc/transobj.hxx | 2 sc/source/ui/miscdlgs/autofmt.cxx | 8 sc/source/ui/miscdlgs/instbdlg.cxx | 5 sc/source/ui/miscdlgs/linkarea.cxx | 9 sc/source/ui/unoobj/exceldetect.cxx | 2 sc/source/ui/unoobj/unodoc.cxx | 2 sc/source/ui/view/drawvie4.cxx | 6 sc/source/ui/view/drawview.cxx | 4 sc/source/ui/view/viewfun3.cxx | 4 sd/inc/drawdoc.hxx | 2 sd/inc/sdfilter.hxx | 4 sd/inc/sdmod.hxx | 4 sd/qa/unit/layout-tests.cxx | 38 sd/qa/unit/tiledrendering/LOKitSearchTest.cxx | 4 sd/source/core/sdpage.cxx | 16 sd/source/filter/eppt/eppt.cxx | 20 sd/source/filter/eppt/eppt.hxx | 10 sd/source/filter/eppt/epptso.cxx | 4 sd/source/filter/ppt/pptin.cxx | 8 sd/source/filter/ppt/pptin.hxx | 4 sd/source/filter/ppt/propread.hxx | 3 sd/source/filter/sdpptwrp.cxx | 24 sd/source/ui/app/optsitem.cxx | 4 sd/source/ui/app/sdmod.cxx | 4 sd/source/ui/app/sdmod1.cxx | 10 sd/source/ui/dlg/morphdlg.cxx | 4 sd/source/ui/dlg/vectdlg.cxx | 10 sd/source/ui/func/fuoaprms.cxx | 3 sd/source/ui/inc/DrawDocShell.hxx | 3 sd/source/ui/inc/sdtreelb.hxx | 2 sd/source/ui/unoidl/sddetect.cxx | 2 sd/source/ui/unoidl/unodoc.cxx | 4 sd/source/ui/view/drviews8.cxx | 4 sfx2/source/appl/appcfg.cxx | 10 sfx2/source/appl/appopen.cxx | 3 sfx2/source/appl/sfxpicklist.cxx | 6 sfx2/source/appl/xpackcreator.cxx | 4 sfx2/source/control/bindings.cxx | 1 sfx2/source/doc/objcont.cxx | 5 sfx2/source/doc/objxtor.cxx | 38 sfx2/source/doc/oleprops.cxx | 4 sfx2/source/inc/objshimp.hxx | 4 slideshow/source/engine/eventmultiplexer.cxx | 8 slideshow/source/engine/shapes/drawinglayeranimation.cxx | 6 slideshow/source/engine/slideview.cxx | 4 sot/qa/cppunit/test_sot.cxx | 20 sot/source/base/object.cxx | 6 sot/source/sdstor/storage.cxx | 22 starmath/qa/cppunit/test_cursor.cxx | 2 starmath/qa/cppunit/test_node.cxx | 2 starmath/qa/cppunit/test_nodetotextvisitors.cxx | 2 starmath/qa/cppunit/test_parse.cxx | 2 starmath/qa/cppunit/test_starmath.cxx | 2 starmath/source/document.cxx | 2 starmath/source/eqnolefilehdr.cxx | 2 starmath/source/mathtype.cxx | 10 starmath/source/smdetect.cxx | 2 starmath/source/unodoc.cxx | 2 starmath/source/unofilter.cxx | 2 svtools/source/misc/imagemgr.cxx | 2 svtools/source/svhtml/htmlout.cxx | 4 svx/inc/galleryfilestorage.hxx | 4 svx/qa/unit/customshapes.cxx | 18 svx/source/customshapes/EnhancedCustomShape2d.cxx | 4 svx/source/customshapes/EnhancedCustomShape3d.cxx | 2 svx/source/dialog/_contdlg.cxx | 4 svx/source/dialog/frmsel.cxx | 12 svx/source/engine3d/obj3d.cxx | 2 svx/source/engine3d/view3d.cxx | 6 svx/source/gallery2/galleryfilestorage.cxx | 22 svx/source/gallery2/galobj.cxx | 4 svx/source/svdraw/gradtrns.cxx | 24 svx/source/svdraw/sdrpagewindow.cxx | 7 svx/source/svdraw/svdcrtv.cxx | 4 svx/source/svdraw/svddrgmt.cxx | 16 svx/source/svdraw/svddrgv.cxx | 16 svx/source/svdraw/svdedtv1.cxx | 4 svx/source/svdraw/svdedxv.cxx | 8 svx/source/svdraw/svdfmtf.cxx | 15 svx/source/svdraw/svdhdl.cxx | 12 svx/source/svdraw/svdmrkv.cxx | 12 svx/source/svdraw/svdoashp.cxx | 18 svx/source/svdraw/svdobj.cxx | 6 svx/source/svdraw/svdocapt.cxx | 6 svx/source/svdraw/svdocirc.cxx | 11 svx/source/svdraw/svdoedge.cxx | 20 svx/source/svdraw/svdograf.cxx | 18 svx/source/svdraw/svdomeas.cxx | 22 svx/source/svdraw/svdopath.cxx | 37 svx/source/svdraw/svdorect.cxx | 2 svx/source/svdraw/svdotext.cxx | 10 svx/source/svdraw/svdotextdecomposition.cxx | 12 svx/source/svdraw/svdpdf.cxx | 20 svx/source/svdraw/svdpoev.cxx | 9 svx/source/svdraw/svdtrans.cxx | 24 svx/source/unodraw/UnoGraphicExporter.cxx | 8 svx/source/unodraw/unoshape.cxx | 8 svx/source/xoutdev/_xpoly.cxx | 7 sw/inc/doc.hxx | 2 sw/inc/shellio.hxx | 10 sw/qa/core/filters-test.cxx | 2 sw/qa/core/macros-test.cxx | 2 sw/qa/core/uwriter.cxx | 2 sw/qa/extras/htmlexport/data/tdf160867_image_with_link.fodt | 25 sw/qa/extras/htmlexport/htmlexport.cxx | 46 sw/qa/extras/layout/data/i84870.fodt | 61 sw/qa/extras/layout/layout3.cxx | 8 sw/qa/extras/ww8export/data/empty_group.docx |binary sw/qa/extras/ww8export/ww8export4.cxx | 24 sw/source/core/doc/DocumentLayoutManager.cxx | 4 sw/source/core/doc/docnew.cxx | 4 sw/source/core/draw/dflyobj.cxx | 32 sw/source/core/graphic/ndgrf.cxx | 3 sw/source/core/inc/SwXMLTextBlocks.hxx | 4 sw/source/core/inc/noteurl.hxx | 36 sw/source/core/inc/swfont.hxx | 3 sw/source/core/layout/fly.cxx | 2 sw/source/core/layout/paintfrm.cxx | 5 sw/source/core/layout/wsfrm.cxx | 28 sw/source/core/ole/ndole.cxx | 8 sw/source/core/swg/SwXMLTextBlocks.cxx | 14 sw/source/core/text/atrhndl.hxx | 2 sw/source/core/text/atrstck.cxx | 15 sw/source/core/text/inftxt.cxx | 37 sw/source/core/text/inftxt.hxx | 7 sw/source/core/text/itrform2.cxx | 2 sw/source/core/text/itrpaint.cxx | 20 sw/source/core/text/noteurl.cxx | 37 sw/source/core/text/porfly.hxx | 1 sw/source/core/text/pormulti.cxx | 3 sw/source/core/txtnode/swfont.cxx | 2 sw/source/filter/basflt/iodetect.cxx | 4 sw/source/filter/basflt/shellio.cxx | 4 sw/source/filter/html/htmlflywriter.cxx | 31 sw/source/filter/html/htmlplug.cxx | 2 sw/source/filter/html/htmlreqifreader.cxx | 16 sw/source/filter/writer/writer.cxx | 2 sw/source/filter/ww8/wrtw8esh.cxx | 6 sw/source/filter/ww8/wrtww8.cxx | 12 sw/source/filter/ww8/wrtww8.hxx | 6 sw/source/filter/ww8/wrtww8gr.cxx | 16 sw/source/filter/ww8/ww8glsy.cxx | 2 sw/source/filter/ww8/ww8glsy.hxx | 8 sw/source/filter/ww8/ww8par.cxx | 36 sw/source/filter/ww8/ww8par.hxx | 10 sw/source/filter/ww8/ww8par4.cxx | 20 sw/source/filter/ww8/ww8par5.cxx | 6 sw/source/ui/table/autoformatpreview.cxx | 15 sw/source/ui/uno/swdetect.cxx | 4 sw/source/uibase/app/apphdl.cxx | 2 sw/source/uibase/app/docsh.cxx | 4 sw/source/uibase/app/docsh2.cxx | 3 sw/source/uibase/dochdl/swdtflvr.cxx | 4 sw/source/uibase/inc/glosdoc.hxx | 4 sw/source/uibase/inc/unoatxt.hxx | 3 sw/source/uibase/misc/glshell.cxx | 4 sw/source/uibase/uno/unodoc.cxx | 6 sw/source/uibase/uno/unotxvw.cxx | 4 toolkit/source/awt/vclxfont.cxx | 2 tools/CppunitTest_tools_test.mk | 1 tools/qa/cppunit/test_fround.cxx | 62 tools/source/generic/color.cxx | 7 tools/source/generic/line.cxx | 7 tools/source/generic/poly.cxx | 37 vcl/inc/svdata.hxx | 5 vcl/inc/win/DWriteTextRenderer.hxx | 15 vcl/inc/win/winlayout.hxx | 3 vcl/osx/salframeview.mm | 3 vcl/qa/cppunit/complextext.cxx | 28 vcl/qa/cppunit/text.cxx | 4 vcl/skia/gdiimpl.cxx | 15 vcl/skia/salbmp.cxx | 3 vcl/skia/win/gdiimpl.cxx | 34 vcl/skia/x11/textrender.cxx | 10 vcl/source/animate/AnimationRenderer.cxx | 8 vcl/source/app/scheduler.cxx | 33 vcl/source/app/svapp.cxx | 4 vcl/source/app/svmain.cxx | 3 vcl/source/bitmap/BitmapEmbossGreyFilter.cxx | 4 vcl/source/bitmap/BitmapEx.cxx | 2 vcl/source/bitmap/BitmapFastScaleFilter.cxx | 4 vcl/source/bitmap/BitmapInterpolateScaleFilter.cxx | 4 vcl/source/bitmap/BitmapScaleConvolutionFilter.cxx | 8 vcl/source/bitmap/BitmapScaleSuperFilter.cxx | 4 vcl/source/bitmap/BitmapTools.cxx | 16 vcl/source/bitmap/bitmap.cxx | 16 vcl/source/bitmap/impvect.cxx | 6 vcl/source/filter/eps/eps.cxx | 4 vcl/source/filter/wmf/emfwr.cxx | 8 vcl/source/filter/wmf/wmfwr.cxx | 6 vcl/source/gdi/gdimetafiletools.cxx | 8 vcl/source/gdi/gdimtf.cxx | 28 vcl/source/gdi/impgraph.cxx | 6 vcl/source/gdi/metaact.cxx | 30 vcl/source/gdi/pdfwriter_impl.cxx | 8 vcl/source/gdi/pdfwriter_impl2.cxx | 8 vcl/source/gdi/print.cxx | 10 vcl/source/gdi/regband.cxx | 7 vcl/source/gdi/region.cxx | 4 vcl/source/gdi/regionband.cxx | 4 vcl/source/graphic/GraphicObject.cxx | 24 vcl/source/helper/canvastools.cxx | 4 vcl/source/outdev/bitmapex.cxx | 18 vcl/source/outdev/hatch.cxx | 19 vcl/source/outdev/map.cxx | 29 vcl/source/outdev/rect.cxx | 16 vcl/source/outdev/text.cxx | 33 vcl/source/outdev/textline.cxx | 4 vcl/source/outdev/transparent.cxx | 2 vcl/source/text/textlayout.cxx | 4 vcl/source/window/printdlg.cxx | 4 vcl/source/window/window2.cxx | 6 vcl/unx/gtk3/gtkinst.cxx | 3 vcl/win/dtrans/MtaOleClipb.cxx | 35 vcl/win/dtrans/WinClipboard.cxx | 14 vcl/win/gdi/DWriteTextRenderer.cxx | 61 vcl/win/gdi/gdiimpl.cxx | 4 vcl/win/gdi/winlayout.cxx | 18 vcl/win/window/salframe.cxx | 10 writerperfect/inc/WPXSvInputStream.hxx | 2 writerperfect/source/common/WPXSvInputStream.cxx | 28 xmloff/source/draw/shapeexport.cxx | 17 342 files changed, 3833 insertions(+), 3193 deletions(-)
New commits: commit dba44b488c46cd9d1cc512628ef110486b96aac3 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Fri May 17 20:40:37 2024 +0500 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Tue Jun 18 03:22:43 2024 +0500 tdf#161154: pass "scaling is done externally" information down the stack VclProcessor2D::RenderTextSimpleOrDecoratedPortionPrimitive2D does the scaling, taking into account the font scaling. Before commit 8557ea84c9336ba8061246f1f46ddb6e02f413a1, D2DWriteTextOutRenderer was doing own scaling in addition, but it seems that it somehow didn't affect the result much. The said commit removed the scalng from D2DWriteTextOutRenderer. As tdf#160901 demonstrated, the scaling is necessary in different code paths - and it turns out, that we need to know, if the caller does its own scaling or not, to make a decision, if the scaling should be fone in D2DWriteTextOutRenderer. This hack passes this from VclProcessor2D to D2DWriteTextOutRenderer through OutputDevice. Thanks to Miklos for the isea. I still don't understand, why all this seemingly doesn't affect other renderers. Change-Id: I001036f4574898b8e7606652525638df43c35240 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167786 Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> Tested-by: Jenkins diff --git a/drawinglayer/source/processor2d/vclprocessor2d.cxx b/drawinglayer/source/processor2d/vclprocessor2d.cxx index f7a21a8e698c..f6b8dbc8f953 100644 --- a/drawinglayer/source/processor2d/vclprocessor2d.cxx +++ b/drawinglayer/source/processor2d/vclprocessor2d.cxx @@ -441,17 +441,21 @@ void VclProcessor2D::RenderTextSimpleOrDecoratedPortionPrimitive2D( mpOutputDevice->SetFont(aFont); mpOutputDevice->SetTextColor(Color(aRGBFontColor)); - if (!aDXArray.empty()) { - const SalLayoutGlyphs* pGlyphs = SalLayoutGlyphsCache::self()->GetLayoutGlyphs( - mpOutputDevice, aText, nPos, nLen); - mpOutputDevice->DrawTextArray(aStartPoint, aText, aDXArray, - rTextCandidate.getKashidaArray(), nPos, nLen, - SalLayoutFlags::NONE, pGlyphs); - } - else - { - mpOutputDevice->DrawText(aStartPoint, aText, nPos, nLen); + // For D2DWriteTextOutRenderer, we must pass a flag to not use font scaling + auto guard = mpOutputDevice->ScopedNoFontScaling(); + if (!aDXArray.empty()) + { + const SalLayoutGlyphs* pGlyphs = SalLayoutGlyphsCache::self()->GetLayoutGlyphs( + mpOutputDevice, aText, nPos, nLen); + mpOutputDevice->DrawTextArray(aStartPoint, aText, aDXArray, + rTextCandidate.getKashidaArray(), nPos, nLen, + SalLayoutFlags::NONE, pGlyphs); + } + else + { + mpOutputDevice->DrawText(aStartPoint, aText, nPos, nLen); + } } if (rTextCandidate.getFontAttribute().getRTL()) diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx index bdbb2ecd1847..15c6cd130f71 100644 --- a/include/vcl/outdev.hxx +++ b/include/vcl/outdev.hxx @@ -21,6 +21,7 @@ #include <sal/config.h> +#include <comphelper/flagguard.hxx> #include <tools/gen.hxx> #include <tools/ref.hxx> #include <tools/solar.h> @@ -259,6 +260,8 @@ private: mutable bool mbRefPoint : 1; mutable bool mbEnableRTL : 1; + bool mbNoFontScaling = false; // Used only by D2DWriteTextOutRenderer + protected: mutable std::shared_ptr<vcl::font::PhysicalFontCollection> mxFontCollection; mutable std::shared_ptr<ImplFontCache> mxFontCache; @@ -341,6 +344,8 @@ public: /// request XSpriteCanvas render interface css::uno::Reference< css::rendering::XSpriteCanvas > GetSpriteCanvas() const; + auto ScopedNoFontScaling() { return comphelper::FlagRestorationGuard(mbNoFontScaling, true); } + protected: /** Acquire a graphics device that the output device uses to draw on. diff --git a/include/vcl/vcllayout.hxx b/include/vcl/vcllayout.hxx index c946f6f67884..b37e8ff6e45b 100644 --- a/include/vcl/vcllayout.hxx +++ b/include/vcl/vcllayout.hxx @@ -22,6 +22,7 @@ #include <basegfx/point/b2dpoint.hxx> #include <basegfx/polygon/b2dpolypolygon.hxx> #include <basegfx/range/b2drectangle.hxx> +#include <comphelper/flagguard.hxx> #include <i18nlangtag/languagetag.hxx> #include <tools/gen.hxx> #include <tools/degree.hxx> @@ -110,6 +111,9 @@ public: virtual SalLayoutGlyphs GetGlyphs() const; + auto ScopedFontScaling(bool v) { return comphelper::FlagRestorationGuard(mbScaleFont, v); } + bool ScaleFont() const { return mbScaleFont; } + protected: // used by layout engines SalLayout(); @@ -118,6 +122,8 @@ private: SalLayout(const SalLayout&) = delete; SalLayout& operator=(const SalLayout&) = delete; + bool mbScaleFont = true; // Used only by D2DWriteTextOutRenderer + protected: int mnMinCharPos; int mnEndCharPos; diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx index b68602e9e90c..edd215943a3c 100644 --- a/vcl/source/outdev/text.cxx +++ b/vcl/source/outdev/text.cxx @@ -449,7 +449,7 @@ void OutputDevice::ImplDrawSpecialText( SalLayout& rSalLayout ) void OutputDevice::ImplDrawText( SalLayout& rSalLayout ) { - + auto guard = rSalLayout.ScopedFontScaling(!mbNoFontScaling); if( mbInitClipRegion ) InitClipRegion(); if( mbOutputClipped ) diff --git a/vcl/win/gdi/DWriteTextRenderer.cxx b/vcl/win/gdi/DWriteTextRenderer.cxx index ff39275b36b9..6a28cb4b4d98 100644 --- a/vcl/win/gdi/DWriteTextRenderer.cxx +++ b/vcl/win/gdi/DWriteTextRenderer.cxx @@ -332,12 +332,14 @@ WinFontTransformGuard::WinFontTransformGuard(ID2D1RenderTarget* pRenderTarget, bool bIsVertical) : mpRenderTarget(pRenderTarget) { - const float hscale = [&font = rLayout.GetFont()] + const float hscale = [&rLayout] { - const auto& rPattern = font.GetFontSelectPattern(); + if (!rLayout.ScaleFont()) + return 1.0; + const auto& rPattern = rLayout.GetFont().GetFontSelectPattern(); if (!rPattern.mnHeight || !rPattern.mnWidth) return 1.0; - return rPattern.mnWidth * font.GetAverageWidthFactor() / rPattern.mnHeight; + return rPattern.mnWidth * rLayout.GetFont().GetAverageWidthFactor() / rPattern.mnHeight; }(); Degree10 angle = rLayout.GetOrientation(); commit f085903137c40f3714b9e82c8180abdce95d2549 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Thu May 2 14:23:53 2024 +0500 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Tue Jun 18 03:20:40 2024 +0500 tdf#160901: partially revert 8557ea84c9336ba8061246f1f46ddb6e02f413a1 It turns out, that the horizontal scale is needed in the applied transform. Change-Id: Ic07e015f0ddeee3d66653b683d83435d04b9ab81 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167004 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/vcl/win/gdi/DWriteTextRenderer.cxx b/vcl/win/gdi/DWriteTextRenderer.cxx index c6c2d4bb1acb..ff39275b36b9 100644 --- a/vcl/win/gdi/DWriteTextRenderer.cxx +++ b/vcl/win/gdi/DWriteTextRenderer.cxx @@ -332,19 +332,32 @@ WinFontTransformGuard::WinFontTransformGuard(ID2D1RenderTarget* pRenderTarget, bool bIsVertical) : mpRenderTarget(pRenderTarget) { + const float hscale = [&font = rLayout.GetFont()] + { + const auto& rPattern = font.GetFontSelectPattern(); + if (!rPattern.mnHeight || !rPattern.mnWidth) + return 1.0; + return rPattern.mnWidth * font.GetAverageWidthFactor() / rPattern.mnHeight; + }(); + Degree10 angle = rLayout.GetOrientation(); if (bIsVertical) angle += 900_deg10; - if (angle) + if (hscale != 1.0f || angle) { D2D1::Matrix3x2F aTransform; pRenderTarget->GetTransform(&aTransform); moTransform = aTransform; + if (hscale != 1.0f) // basegfx::fTools::equal is useless with float + aTransform = aTransform * D2D1::Matrix3x2F::Scale(hscale, 1.0f, { 0, 0 }); + // DWrite angle is in clockwise degrees, our orientation is in counter-clockwise 10th // degrees. - aTransform = aTransform * D2D1::Matrix3x2F::Rotation(-toDegrees(angle), rBaseline); + if (angle) + aTransform = aTransform * D2D1::Matrix3x2F::Rotation(-toDegrees(angle), rBaseline); + mpRenderTarget->SetTransform(aTransform); } } commit 500bbe695777d396fbd0ef2ce50684a6d10f0401 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Wed Apr 10 22:45:41 2024 +0500 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Tue Jun 18 03:19:48 2024 +0500 Only call ID2D1RenderTarget::Get/SetTransform when needed Change-Id: Ifde2c24c222e3c316f5a4f47e86c2c08f676639a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165983 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/vcl/win/gdi/DWriteTextRenderer.cxx b/vcl/win/gdi/DWriteTextRenderer.cxx index c9f14dc91219..c6c2d4bb1acb 100644 --- a/vcl/win/gdi/DWriteTextRenderer.cxx +++ b/vcl/win/gdi/DWriteTextRenderer.cxx @@ -108,7 +108,7 @@ public: private: ID2D1RenderTarget* mpRenderTarget; - D2D1::Matrix3x2F maTransform; + std::optional<D2D1::Matrix3x2F> moTransform; }; } // end anonymous namespace @@ -332,25 +332,27 @@ WinFontTransformGuard::WinFontTransformGuard(ID2D1RenderTarget* pRenderTarget, bool bIsVertical) : mpRenderTarget(pRenderTarget) { - pRenderTarget->GetTransform(&maTransform); - D2D1::Matrix3x2F aTransform = maTransform; - Degree10 angle = rLayout.GetOrientation(); - if (bIsVertical) angle += 900_deg10; if (angle) { + D2D1::Matrix3x2F aTransform; + pRenderTarget->GetTransform(&aTransform); + moTransform = aTransform; + // DWrite angle is in clockwise degrees, our orientation is in counter-clockwise 10th // degrees. - aTransform = aTransform - * D2D1::Matrix3x2F::Rotation( - -toDegrees(angle), rBaseline); + aTransform = aTransform * D2D1::Matrix3x2F::Rotation(-toDegrees(angle), rBaseline); + mpRenderTarget->SetTransform(aTransform); } - mpRenderTarget->SetTransform(aTransform); } -WinFontTransformGuard::~WinFontTransformGuard() { mpRenderTarget->SetTransform(maTransform); } +WinFontTransformGuard::~WinFontTransformGuard() +{ + if (moTransform) + mpRenderTarget->SetTransform(*moTransform); +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 34a79b0ffa3530d5c0c761d0f51d1f903f7eef58 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Fri Apr 26 01:00:21 2024 +0500 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Tue Jun 18 03:18:42 2024 +0500 tdf#157240: also set font color together with font Commit b008831a5545e5a777d77547ef96b9798d795f30 (tdf#152990 set the font after the MapMode is (potentially) set, 2023-01-14) had moved setting of font forward, but left setting the font color behind. This fixed that. Change-Id: I73fadc7c139da3b6f84b7fc875c585d02fc1c719 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166654 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/drawinglayer/source/processor2d/vclprocessor2d.cxx b/drawinglayer/source/processor2d/vclprocessor2d.cxx index 5e5da4f712fa..f7a21a8e698c 100644 --- a/drawinglayer/source/processor2d/vclprocessor2d.cxx +++ b/drawinglayer/source/processor2d/vclprocessor2d.cxx @@ -328,8 +328,6 @@ void VclProcessor2D::RenderTextSimpleOrDecoratedPortionPrimitive2D( mpOutputDevice->SetLayoutMode(nRTLLayoutMode); } - mpOutputDevice->SetTextColor(Color(aRGBFontColor)); - OUString aText(rTextCandidate.getText()); sal_Int32 nPos = rTextCandidate.getTextPosition(); sal_Int32 nLen = rTextCandidate.getTextLength(); @@ -441,6 +439,7 @@ void VclProcessor2D::RenderTextSimpleOrDecoratedPortionPrimitive2D( // tdf#152990 set the font after the MapMode is (potentially) set so canvas uses the desired // font size mpOutputDevice->SetFont(aFont); + mpOutputDevice->SetTextColor(Color(aRGBFontColor)); if (!aDXArray.empty()) { commit 320cae1d8dabc5cc4bec79fe221cc3fb9722ab68 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Wed May 1 12:10:23 2024 +0500 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Tue Jun 18 03:16:24 2024 +0500 tdf#160867: only output first element of the map in ReqIF case It should be investigated, how the whole image map can be output in that case - something to be done separately. Change-Id: I6543c0d238205fabdb0a688e32a2d08423d7a5d3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166948 Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> Tested-by: Jenkins diff --git a/sw/qa/extras/htmlexport/htmlexport.cxx b/sw/qa/extras/htmlexport/htmlexport.cxx index f54ad6e7fce2..e05fa2f27df2 100644 --- a/sw/qa/extras/htmlexport/htmlexport.cxx +++ b/sw/qa/extras/htmlexport/htmlexport.cxx @@ -3085,6 +3085,21 @@ CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testHTML_160867) assertXPath(pDoc, "/html/body/p[2]/img"_ostr, "usemap"_ostr, "#" + mapName); } +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqIF_160867) +{ + // Given a document with an image with hyperlink, and text with hyperlink, both in a frame: + createSwDoc("tdf160867_image_with_link.fodt"); + // When exporting to reqif: + ExportToReqif(); + // For now, we don't (yet) output the whole map in ReqIF case. + // Make sure that the first hyperlink from the objects in the frame is output as an <a> element + // around the whole image of the frame. + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + assertXPath(pXmlDoc, "//reqif-xhtml:p[2]/reqif-xhtml:a/reqif-xhtml:object"_ostr); + CPPUNIT_ASSERT(getXPath(pXmlDoc, "//reqif-xhtml:p[2]/reqif-xhtml:a"_ostr, "href"_ostr) + .endsWith("foo/bar")); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/html/htmlflywriter.cxx b/sw/source/filter/html/htmlflywriter.cxx index ef3e4b19c35b..bc301b29566a 100644 --- a/sw/source/filter/html/htmlflywriter.cxx +++ b/sw/source/filter/html/htmlflywriter.cxx @@ -1080,17 +1080,17 @@ OUString lclWriteOutImap(SwHTMLWriter& rWrt, const SfxItemSet& rItemSet, const S OUString aIMapName; // Only consider the URL attribute if no ImageMap was supplied - if (!pAltImgMap) - pURLItem = rItemSet.GetItemIfSet( RES_URL ); // write ImageMap const ImageMap* pIMap = pAltImgMap; - if( !pIMap && pURLItem ) + if( !pIMap ) { - pIMap = pURLItem->GetMap(); + pURLItem = rItemSet.GetItemIfSet(RES_URL); + if (pURLItem) + pIMap = pURLItem->GetMap(); } - if (pIMap) + if (pIMap && !rWrt.mbReqIF) { // make the name unique aIMapName = pIMap->GetName(); @@ -1098,10 +1098,10 @@ OUString lclWriteOutImap(SwHTMLWriter& rWrt, const SfxItemSet& rItemSet, const S if (!aIMapName.isEmpty()) aNameBase = aIMapName; else + { aNameBase = OOO_STRING_SVTOOLS_HTML_map; - - if (aIMapName.isEmpty()) aIMapName = aNameBase + OUString::number(rWrt.m_nImgMapCnt); + } bool bFound; do @@ -1271,7 +1271,7 @@ SwHTMLWriter& OutHTML_ImageStart( HtmlWriter& rHtml, SwHTMLWriter& rWrt, const S // URL -> <a>...<img ... >...</a> const SvxMacroItem *pMacItem = rItemSet.GetItemIfSet(RES_FRMMACRO); - if (pURLItem || pMacItem) + if (pURLItem || pMacItem || (rWrt.mbReqIF && pAltImgMap)) { OUString aMapURL; OUString aName; @@ -1283,6 +1283,21 @@ SwHTMLWriter& OutHTML_ImageStart( HtmlWriter& rHtml, SwHTMLWriter& rWrt, const S aName = pURLItem->GetName(); aTarget = pURLItem->GetTargetFrameName(); } + else if (rWrt.mbReqIF && pAltImgMap) + { + // Get first non-empty map element + for (size_t i = 0; i < pAltImgMap->GetIMapObjectCount(); ++i) + { + if (auto* pIMapObject = pAltImgMap->GetIMapObject(i)) + { + aMapURL = pIMapObject->GetURL(); + aName = pIMapObject->GetName(); + aTarget = pIMapObject->GetTarget(); + if (!aMapURL.isEmpty() || !aName.isEmpty() || !aTarget.isEmpty()) + break; + } + } + } bool bEvents = pMacItem && !pMacItem->GetMacroTable().empty(); commit f93a01d929ef91b84b2d8260ecab74c6f39699bf Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Wed May 1 10:00:25 2024 +0500 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Tue Jun 18 03:14:11 2024 +0500 Make pNoteURL thread-local, just in case Change-Id: I27247a85f0d7497f70c5d97a8955b68a29be1176 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166946 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/sw/source/core/inc/noteurl.hxx b/sw/source/core/inc/noteurl.hxx index eeae15642a43..b575b60d20a0 100644 --- a/sw/source/core/inc/noteurl.hxx +++ b/sw/source/core/inc/noteurl.hxx @@ -59,7 +59,7 @@ public: }; // globale Variable, in NoteURL.Cxx angelegt -extern SwNoteURL* pNoteURL; +extern thread_local SwNoteURL* pNoteURL; #endif diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index 69c571e1afe0..e04720c309b1 100644 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -8036,7 +8036,7 @@ Graphic SwFlyFrameFormat::MakeGraphic( ImageMap* pMap, const sal_uInt32 /*nMaxim SfxItemState::SET != GetAttrSet().GetItemState( RES_URL ); if( bNoteURL ) { - OSL_ENSURE( !pNoteURL, "MakeGraphic: pNoteURL already used? " ); + assert(!pNoteURL); pNoteURL = new SwNoteURL; } SwFlyFrame *pFly = static_cast<SwFlyFrame*>(pFirst); @@ -8117,7 +8117,7 @@ Graphic SwFlyFrameFormat::MakeGraphic( ImageMap* pMap, const sal_uInt32 /*nMaxim if( bNoteURL ) { - OSL_ENSURE( pNoteURL, "MakeGraphic: Good Bye, NoteURL." ); + assert(pNoteURL); pNoteURL->FillImageMap(pMap, pFly->getFrameArea().Pos(), aMap); delete pNoteURL; pNoteURL = nullptr; diff --git a/sw/source/core/text/noteurl.cxx b/sw/source/core/text/noteurl.cxx index ae52e1c29a91..d66736280bb5 100644 --- a/sw/source/core/text/noteurl.cxx +++ b/sw/source/core/text/noteurl.cxx @@ -25,7 +25,7 @@ #include <vcl/outdev.hxx> // Global variable -SwNoteURL* pNoteURL = nullptr; +thread_local SwNoteURL* pNoteURL = nullptr; void SwNoteURL::InsertURLNote(const OUString& rURL, const OUString& rTarget, const SwRect& rRect) { commit 958efa1943e3a5f303cd9a85d7af3e8dabaff3da Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Tue Apr 30 22:16:12 2024 +0500 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Tue Jun 18 03:09:59 2024 +0500 tdf#160867: export as-char frames' hyperlinks to image map Change-Id: Idc8d41a27c8ee9cdd12fb5e17a328ec6aa104a16 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166935 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/sw/qa/extras/htmlexport/htmlexport.cxx b/sw/qa/extras/htmlexport/htmlexport.cxx index acad980505e3..f54ad6e7fce2 100644 --- a/sw/qa/extras/htmlexport/htmlexport.cxx +++ b/sw/qa/extras/htmlexport/htmlexport.cxx @@ -3071,13 +3071,17 @@ CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testHTML_160867) CPPUNIT_ASSERT(pDoc); assertXPath(pDoc, "/html/body/p"_ostr, 2); - // Test export of text hyperlink in the image map. TODO: implement export of image hyperlink. + // Test export of image and text hyperlinks in the image map. // Without the fix, the test would fail with // - Expected: 1 // - Actual : 0 // - In <>, XPath '/html/body/p[2]/map' number of nodes is incorrect const OUString mapName = getXPath(pDoc, "/html/body/p[2]/map"_ostr, "name"_ostr); - assertXPath(pDoc, "/html/body/p[2]/map/area"_ostr, "shape"_ostr, u"rect"_ustr); + assertXPath(pDoc, "/html/body/p[2]/map/area[1]"_ostr, "shape"_ostr, u"rect"_ustr); + CPPUNIT_ASSERT( + getXPath(pDoc, "/html/body/p[2]/map/area[1]"_ostr, "href"_ostr).endsWith("foo/bar")); + assertXPath(pDoc, "/html/body/p[2]/map/area[2]"_ostr, "shape"_ostr, u"rect"_ustr); + CPPUNIT_ASSERT(getXPath(pDoc, "/html/body/p[2]/map/area[2]"_ostr, "href"_ostr).endsWith("baz")); assertXPath(pDoc, "/html/body/p[2]/img"_ostr, "usemap"_ostr, "#" + mapName); } diff --git a/sw/source/core/text/inftxt.cxx b/sw/source/core/text/inftxt.cxx index 73295ffae113..18cd23ebef61 100644 --- a/sw/source/core/text/inftxt.cxx +++ b/sw/source/core/text/inftxt.cxx @@ -44,6 +44,7 @@ #include <viewsh.hxx> #include <viewopt.hxx> #include <frmtool.hxx> +#include <fmturl.hxx> #include <IDocumentSettingAccess.hxx> #include <IDocumentDeviceAccess.hxx> #include <IDocumentMarkAccess.hxx> @@ -51,6 +52,7 @@ #include <rootfrm.hxx> #include "inftxt.hxx" #include <noteurl.hxx> +#include "porfly.hxx" #include "porftn.hxx" #include "porrst.hxx" #include "itratr.hxx" @@ -1477,6 +1479,20 @@ void SwTextPaintInfo::NotifyURL_(const SwLinePortion& rPor) const const SwFormatINetFormat& rFormat = pAttr->GetINetFormat(); pNoteURL->InsertURLNote(rFormat.GetValue(), rFormat.GetTargetFrame(), aIntersect); } + else if (rPor.IsFlyCntPortion()) + { + if (auto* pFlyContentPortion = dynamic_cast<const sw::FlyContentPortion*>(&rPor)) + { + if (auto* pFlyFtame = pFlyContentPortion->GetFlyFrame()) + { + if (auto* pFormat = pFlyFtame->GetFormat()) + { + auto& url = pFormat->GetURL(); // TODO: url.GetMap() ? + pNoteURL->InsertURLNote(url.GetURL(), url.GetTargetFrameName(), aIntersect); + } + } + } + } } } diff --git a/sw/source/core/text/itrpaint.cxx b/sw/source/core/text/itrpaint.cxx index 8fa9ca45f5fd..f02beed8ce5b 100644 --- a/sw/source/core/text/itrpaint.cxx +++ b/sw/source/core/text/itrpaint.cxx @@ -33,6 +33,7 @@ #include <swfont.hxx> #include "txtpaint.hxx" #include "porfld.hxx" +#include "porfly.hxx" #include "portab.hxx" #include <txatbase.hxx> #include <charfmt.hxx> @@ -40,6 +41,7 @@ #include "porrst.hxx" #include "pormulti.hxx" #include <doc.hxx> +#include <fmturl.hxx> // Returns, if we have an underline breaking situation // Adding some more conditions here means you also have to change them @@ -461,6 +463,21 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint, SwSaveClip &rClip, if (GetFnt()->IsURL() && pPor->InTextGrp()) GetInfo().NotifyURL(*pPor); + else if (pPor->IsFlyCntPortion()) + { + if (auto* pFlyContentPortion = dynamic_cast<sw::FlyContentPortion*>(pPor)) + { + if (auto* pFlyFrame = pFlyContentPortion->GetFlyFrame()) + { + if (auto* pFormat = pFlyFrame->GetFormat()) + { + auto& url = pFormat->GetURL(); + if (!url.GetURL().isEmpty()) // TODO: url.GetMap() ? + GetInfo().NotifyURL(*pPor); + } + } + } + } bFirst &= !pPor->GetLen(); if( pNext || !pPor->IsMarginPortion() ) diff --git a/sw/source/core/text/porfly.hxx b/sw/source/core/text/porfly.hxx index a519c1109c87..2c56563a4436 100644 --- a/sw/source/core/text/porfly.hxx +++ b/sw/source/core/text/porfly.hxx @@ -76,6 +76,7 @@ namespace sw FlyContentPortion(SwFlyInContentFrame* pFly); static FlyContentPortion* Create(const SwTextFrame& rFrame, SwFlyInContentFrame* pFly, const Point& rBase, tools::Long nAscent, tools::Long nDescent, tools::Long nFlyAsc, tools::Long nFlyDesc, AsCharFlags nFlags); SwFlyInContentFrame* GetFlyFrame() { return m_pFly; } + const SwFlyInContentFrame* GetFlyFrame() const { return m_pFly; } void GetFlyCursorOfst(Point& rPoint, SwPosition& rPos, SwCursorMoveState* pCMS) const { m_pFly->GetModelPositionForViewPoint(&rPos, rPoint, pCMS); }; virtual void Paint(const SwTextPaintInfo& rInf) const override; virtual ~FlyContentPortion() override; commit 473a9e3e0b124beb11fdd07099ac221513ce1b64 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Tue Apr 30 15:40:41 2024 +0500 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Tue Jun 18 03:08:50 2024 +0500 tdf#160867: restore HTML map export for text hyperlinks in frames The most exciting was to discover that this functionality was actually already implemented prior to 2001, and then accidentally dropped, and nobody noticed, until Noel did his great cleanups, and made an amazing investigation in commit ed2ae3c3bb0a708cafc3de6a01adc9ddc43fb859 (remove dead SwNoteURL, 2018-03-14). The detailed commit message made my task so much easier: I knew where and what to restore. So this change restores relevant pieces removed over the time in commits * 1b666235f6b0b0f0b13f473bf3b639f4f5f0b12f (loplugin:singlevalfields improve copy constructor check, 2018-01-03), * be8c414567f49242164b1fdfb12764b16be355c1 (loplugin:unusedmethods also check for functions returning bool, 2018-01-19), * 73139fe600fc1399ae828077981a2498cb0a0b0c (loplugin:unusedmethods, 2018-01-20) * bb7ade140df807b6a0f12766a1365b8f8d0fd342 (loplugin:unusedmethods, 2018-03-08), * ed2ae3c3bb0a708cafc3de6a01adc9ddc43fb859 (remove dead SwNoteURL, 2018-03-14), * fd1cfd25b48cb4bd5c87e9cb317b37699ca3a1d6 (PortionType::Url is unused, 2019-01-18). It re-implements the functionality accidentally removed in commit da7671e4f7482110ecd0cfbfd7dbd9e0b873c81c (Opt.(FME): The new attribute handler makes a lot of code superfluous, 2001-03-15), moving it into SwAttrHandler, which replaced the ChgFnt in SwTxtAttr. It also fixes the code writing the HTML image map, to output valid HTML. And finally, it adds a unit test, to avoid repeating the story :-) Change-Id: I72ae3cf30f0e9689f50a2c877e1622e4ae46de49 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166924 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/svtools/source/svhtml/htmlout.cxx b/svtools/source/svhtml/htmlout.cxx index 4f027b0c10de..2616624bdc60 100644 --- a/svtools/source/svhtml/htmlout.cxx +++ b/svtools/source/svhtml/htmlout.cxx @@ -701,7 +701,7 @@ SvStream& HTMLOutFuncs::Out_ImageMap( SvStream& rStream, sOut.append(OString::Concat("<") + OOO_STRING_SVTOOLS_HTML_area " " OOO_STRING_SVTOOLS_HTML_O_shape - "=" + pShape + " " + "=\"" + pShape + "\" " OOO_STRING_SVTOOLS_HTML_O_coords "=\"" + aCoords + "\" "); rStream.WriteOString( sOut ); @@ -755,7 +755,7 @@ SvStream& HTMLOutFuncs::Out_ImageMap( SvStream& rStream, Out_Events( rStream, rMacroTab, pEventTable, bOutStarBasic ); - rStream.WriteChar( '>' ); + rStream.WriteOString("/>"); } } diff --git a/sw/qa/extras/htmlexport/data/tdf160867_image_with_link.fodt b/sw/qa/extras/htmlexport/data/tdf160867_image_with_link.fodt new file mode 100644 index 000000000000..43c35cdff13e --- /dev/null +++ b/sw/qa/extras/htmlexport/data/tdf160867_image_with_link.fodt @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text"> + <office:styles> + <style:style style:name="Frame" style:family="graphic"> + <style:graphic-properties text:anchor-type="as-char" svg:x="0" svg:y="0" style:number-wrapped-paragraphs="no-limit" style:wrap-contour="false" fo:background-color="transparent" draw:fill="none" fo:margin-left="0" fo:margin-right="0" fo:margin-top="0" fo:margin-bottom="0" style:wrap="none" style:vertical-pos="middle" style:vertical-rel="baseline" style:horizontal-pos="from-left" style:horizontal-rel="paragraph" fo:padding="0" fo:border="none" loext:rel-width-rel="paragraph"/> + </style:style> + </office:styles> + <office:body> + <office:text> + <text:p><draw:a xlink:type="simple" xlink:href="foo/bar"><draw:frame draw:style-name="Frame" draw:name="image1" svg:width="17cm" svg:height="25mm" style:rel-height="scale"><draw:image draw:mime-type="image/png"> + <office:binary-data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAMSURBVBhXY/jPwAAAAwEBAGMkVdMAAAAASUVORK5C</office:binary-data> + </draw:image> + </draw:frame></draw:a>image1 with a hyperlink, and this text with <text:a xlink:type="simple" xlink:href="baz" text:style-name="Internet_20_link" text:visited-style-name="Visited_20_Internet_20_Link">another hyperlink</text:a></text:p> + <text:p><draw:frame draw:style-name="Frame" draw:name="frame" svg:width="17cm"> + <draw:text-box fo:min-height="1pt"> + <text:p><draw:a xlink:type="simple" xlink:href="foo/bar"><draw:frame draw:style-name="Frame" draw:name="image2" svg:width="17cm" svg:height="25mm"><draw:image draw:mime-type="image/png"> + <office:binary-data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAMSURBVBhXY/jPwAAAAwEBAGMkVdMAAAAASUVORK5C</office:binary-data> + </draw:image> + </draw:frame></draw:a>image2 with a hyperlink, and this text with <text:a xlink:type="simple" xlink:href="baz" text:style-name="Internet_20_link" text:visited-style-name="Visited_20_Internet_20_Link">another hyperlink</text:a>, in a frame</text:p> + </draw:text-box> + </draw:frame></text:p> + </office:text> + </office:body> +</office:document> \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/htmlexport.cxx b/sw/qa/extras/htmlexport/htmlexport.cxx index ca777fc980f7..acad980505e3 100644 --- a/sw/qa/extras/htmlexport/htmlexport.cxx +++ b/sw/qa/extras/htmlexport/htmlexport.cxx @@ -3060,6 +3060,27 @@ CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testHTML_Tdf160390) ExportToHTML(); } +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testHTML_160867) +{ + // Given a document with an image with hyperlink, and text with hyperlink, both in a frame: + createSwDoc("tdf160867_image_with_link.fodt"); + // When exporting to HTML: + ExportToHTML(); + // Parse it as XML (strict!) + xmlDocUniquePtr pDoc = parseXml(maTempFile); + CPPUNIT_ASSERT(pDoc); + assertXPath(pDoc, "/html/body/p"_ostr, 2); + + // Test export of text hyperlink in the image map. TODO: implement export of image hyperlink. + // Without the fix, the test would fail with + // - Expected: 1 + // - Actual : 0 + // - In <>, XPath '/html/body/p[2]/map' number of nodes is incorrect + const OUString mapName = getXPath(pDoc, "/html/body/p[2]/map"_ostr, "name"_ostr); + assertXPath(pDoc, "/html/body/p[2]/map/area"_ostr, "shape"_ostr, u"rect"_ustr); + assertXPath(pDoc, "/html/body/p[2]/img"_ostr, "usemap"_ostr, "#" + mapName); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/inc/noteurl.hxx b/sw/source/core/inc/noteurl.hxx index 1e5775d3c099..eeae15642a43 100644 --- a/sw/source/core/inc/noteurl.hxx +++ b/sw/source/core/inc/noteurl.hxx @@ -20,8 +20,42 @@ #ifndef INCLUDED_SW_SOURCE_CORE_INC_NOTEURL_HXX #define INCLUDED_SW_SOURCE_CORE_INC_NOTEURL_HXX +#include <swrect.hxx> + +#include <rtl/ustring.hxx> + +#include <vector> + +class ImageMap; +class MapMode; + +class SwURLNote +{ + OUString aURL; + OUString aTarget; + SwRect aRect; + +public: + SwURLNote(const OUString& rURL, const OUString& rTarget, const SwRect& rRect) + : aURL(rURL) + , aTarget(rTarget) + , aRect(rRect) + { + } + const OUString& GetURL() const { return aURL; } + const OUString& GetTarget() const { return aTarget; } + const SwRect& GetRect() const { return aRect; } +}; + class SwNoteURL { +private: + std::vector<SwURLNote> m_List; + +public: + SwNoteURL() {} + void InsertURLNote(const OUString& rURL, const OUString& rTarget, const SwRect& rRect); + void FillImageMap(ImageMap* pMap, const Point& rPos, const MapMode& rMap); }; // globale Variable, in NoteURL.Cxx angelegt diff --git a/sw/source/core/inc/swfont.hxx b/sw/source/core/inc/swfont.hxx index 86f44fb3eb64..bde9fee7b842 100644 --- a/sw/source/core/inc/swfont.hxx +++ b/sw/source/core/inc/swfont.hxx @@ -172,6 +172,7 @@ class SwFont bool m_bFontChg :1; bool m_bOrgChg :1; // nOrgHeight/Ascent are invalid bool m_bGreyWave :1; // for the extended TextInput: gray waveline + bool m_bURL : 1 = false; public: SwFont( const SwAttrSet* pSet, const IDocumentSettingAccess* pIDocumentSettingAccess ); @@ -262,6 +263,8 @@ public: inline void SetGreyWave( const bool bNew ); bool IsGreyWave() const { return m_bGreyWave; } bool IsPaintBlank() const { return m_bPaintBlank; } + void SetURL(const bool bURL) { m_bURL = bURL; } + bool IsURL() const { return m_bURL; } // setting of the base class font for SwTextCharFormat void SetDiffFnt( const SfxItemSet* pSet, diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index 2375fae0db3c..69c571e1afe0 100644 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -8118,6 +8118,7 @@ Graphic SwFlyFrameFormat::MakeGraphic( ImageMap* pMap, const sal_uInt32 /*nMaxim if( bNoteURL ) { OSL_ENSURE( pNoteURL, "MakeGraphic: Good Bye, NoteURL." ); + pNoteURL->FillImageMap(pMap, pFly->getFrameArea().Pos(), aMap); delete pNoteURL; pNoteURL = nullptr; } diff --git a/sw/source/core/text/atrhndl.hxx b/sw/source/core/text/atrhndl.hxx index 851615325a06..efe1ae954958 100644 --- a/sw/source/core/text/atrhndl.hxx +++ b/sw/source/core/text/atrhndl.hxx @@ -46,6 +46,8 @@ private: // a template, if we have to restart the attribute evaluation std::optional<SwFont> m_oFnt; + int m_nINETFMT = 0; // for font's SetURL + bool m_bVertLayout; bool m_bVertLayoutLRBT; diff --git a/sw/source/core/text/atrstck.cxx b/sw/source/core/text/atrstck.cxx index 048878292fc0..965f23b297f1 100644 --- a/sw/source/core/text/atrstck.cxx +++ b/sw/source/core/text/atrstck.cxx @@ -367,6 +367,13 @@ void SwAttrHandler::PushAndChg( const SwTextAttr& rAttr, SwFont& rFnt ) } } } + + if (rAttr.Which() == RES_TXTATR_INETFMT) + { + if (m_nINETFMT == 0) + rFnt.SetURL(true); + ++m_nINETFMT; + } } // this is the usual case, we have a basic attribute, push it onto the // stack and change the font @@ -433,6 +440,14 @@ void SwAttrHandler::PopAndChg( const SwTextAttr& rAttr, SwFont& rFnt ) const SfxItemSet* pSet = CharFormat::GetItemSet( rAttr.GetAttr() ); if ( !pSet ) return; + if (rAttr.Which() == RES_TXTATR_INETFMT) + { + assert(m_nINETFMT > 0); + --m_nINETFMT; + if (m_nINETFMT == 0) + rFnt.SetURL(false); + } + for ( sal_uInt16 i = RES_CHRATR_BEGIN; i < RES_CHRATR_END; i++) { const SfxPoolItem* pItem; diff --git a/sw/source/core/text/inftxt.cxx b/sw/source/core/text/inftxt.cxx index 66dae09b35c4..73295ffae113 100644 --- a/sw/source/core/text/inftxt.cxx +++ b/sw/source/core/text/inftxt.cxx @@ -21,7 +21,9 @@ #include <unotools/linguprops.hxx> #include <unotools/lingucfg.hxx> +#include <fmtinfmt.hxx> #include <hintids.hxx> +#include <txatbase.hxx> #include <svl/ctloptions.hxx> #include <sfx2/infobar.hxx> #include <sfx2/printer.hxx> @@ -1459,6 +1461,25 @@ void SwTextPaintInfo::DrawViewOpt( const SwLinePortion &rPor, DrawBackground( rPor, pColor ); } +void SwTextPaintInfo::NotifyURL_(const SwLinePortion& rPor) const +{ + assert(pNoteURL); + + SwRect aIntersect; + CalcRect(rPor, nullptr, &aIntersect); + + if (aIntersect.HasArea()) + { + SwTextNode* pNd = const_cast<SwTextNode*>(GetTextFrame()->GetTextNodeFirst()); + SwTextAttr* const pAttr = pNd->GetTextAttrAt(sal_Int32(GetIdx()), RES_TXTATR_INETFMT); + if (pAttr) + { + const SwFormatINetFormat& rFormat = pAttr->GetINetFormat(); + pNoteURL->InsertURLNote(rFormat.GetValue(), rFormat.GetTargetFrame(), aIntersect); + } + } +} + static void lcl_InitHyphValues( PropertyValues &rVals, sal_Int16 nMinLeading, sal_Int16 nMinTrailing, bool bNoCapsHyphenation, bool bNoLastWordHyphenation, diff --git a/sw/source/core/text/inftxt.hxx b/sw/source/core/text/inftxt.hxx index cb11d02b1e8d..9c4126a7a6e9 100644 --- a/sw/source/core/text/inftxt.hxx +++ b/sw/source/core/text/inftxt.hxx @@ -358,6 +358,7 @@ class SwTextPaintInfo : public SwTextSizeInfo const bool bGrammarCheck = false ); SwTextPaintInfo &operator=(const SwTextPaintInfo&) = delete; + void NotifyURL_(const SwLinePortion& rPor) const; protected: SwTextPaintInfo() @@ -418,6 +419,12 @@ public: void DrawCSDFHighlighting(const SwLinePortion &rPor) const; + void NotifyURL(const SwLinePortion& rPor) const + { + if (URLNotify()) + NotifyURL_(rPor); + } + /** * Calculate the rectangular area where the portion takes place. * @param[in] rPor portion for which the method specify the painting area diff --git a/sw/source/core/text/itrform2.cxx b/sw/source/core/text/itrform2.cxx index dad32bf4fcac..e7eeed46384f 100644 --- a/sw/source/core/text/itrform2.cxx +++ b/sw/source/core/text/itrform2.cxx @@ -1319,7 +1319,7 @@ SwTextPortion *SwTextFormatter::WhichTextPor( SwTextFormatInfo &rInf ) const } if( !pPor ) { - if( !rInf.X() && !m_pCurr->GetNextPortion() && !m_pCurr->GetLen() ) + if( !rInf.X() && !m_pCurr->GetNextPortion() && !m_pCurr->GetLen() && !GetFnt()->IsURL() ) pPor = m_pCurr; else pPor = new SwTextPortion; diff --git a/sw/source/core/text/itrpaint.cxx b/sw/source/core/text/itrpaint.cxx index 5b6bb1288d57..8fa9ca45f5fd 100644 --- a/sw/source/core/text/itrpaint.cxx +++ b/sw/source/core/text/itrpaint.cxx @@ -459,6 +459,9 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint, SwSaveClip &rClip, // reset (for special vertical alignment) GetInfo().Y( nOldY ); + if (GetFnt()->IsURL() && pPor->InTextGrp()) + GetInfo().NotifyURL(*pPor); + bFirst &= !pPor->GetLen(); if( pNext || !pPor->IsMarginPortion() ) pPor->Move( GetInfo() ); diff --git a/sw/source/core/text/noteurl.cxx b/sw/source/core/text/noteurl.cxx index fa91ea252d5f..ae52e1c29a91 100644 --- a/sw/source/core/text/noteurl.cxx +++ b/sw/source/core/text/noteurl.cxx @@ -19,7 +19,42 @@ #include <noteurl.hxx> +#include <vcl/imap.hxx> +#include <vcl/imaprect.hxx> +#include <vcl/mapmod.hxx> +#include <vcl/outdev.hxx> + // Global variable SwNoteURL* pNoteURL = nullptr; +void SwNoteURL::InsertURLNote(const OUString& rURL, const OUString& rTarget, const SwRect& rRect) +{ + const size_t nCount = m_List.size(); + for (size_t i = 0; i < nCount; ++i) + if (rRect == m_List[i].GetRect()) + return; + + m_List.emplace_back(rURL, rTarget, rRect); +} + +void SwNoteURL::FillImageMap(ImageMap* pMap, const Point& rPos, const MapMode& rMap) +{ + assert(pMap && "FillImageMap: No ImageMap, no cookies!"); + const size_t nCount = m_List.size(); + if (nCount) + { + MapMode aMap(MapUnit::Map100thMM); + for (size_t i = 0; i < nCount; ++i) + { + const SwURLNote& rNote = m_List[i]; + SwRect aSwRect(rNote.GetRect()); + aSwRect -= rPos; + tools::Rectangle aRect(OutputDevice::LogicToLogic(aSwRect.SVRect(), rMap, aMap)); + IMapRectangleObject aObj(aRect, rNote.GetURL(), OUString(), OUString(), + rNote.GetTarget(), OUString(), true, false); + pMap->InsertIMapObject(aObj); + } + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/text/pormulti.cxx b/sw/source/core/text/pormulti.cxx index 7771ab9b5e8f..240ada4ab0bf 100644 --- a/sw/source/core/text/pormulti.cxx +++ b/sw/source/core/text/pormulti.cxx @@ -1785,6 +1785,9 @@ void SwTextPainter::PaintMultiPortion( const SwRect &rPaint, pPor->Paint( GetInfo() ); } + if (GetFnt()->IsURL() && pPor->InTextGrp()) + GetInfo().NotifyURL(*pPor); + bFirst &= !pPor->GetLen(); if( pNext || !pPor->IsMarginPortion() ) pPor->Move( GetInfo() ); diff --git a/sw/source/core/txtnode/swfont.cxx b/sw/source/core/txtnode/swfont.cxx index 98fec0f153e2..20b3062267f7 100644 --- a/sw/source/core/txtnode/swfont.cxx +++ b/sw/source/core/txtnode/swfont.cxx @@ -684,6 +684,7 @@ SwFont::SwFont( const SwFont &rFont ) m_bOrgChg = rFont.m_bOrgChg; m_bPaintBlank = rFont.m_bPaintBlank; m_bGreyWave = rFont.m_bGreyWave; + m_bURL = rFont.m_bURL; } SwFont::SwFont( const SwAttrSet* pAttrSet, @@ -873,6 +874,7 @@ SwFont& SwFont::operator=( const SwFont &rFont ) m_bOrgChg = rFont.m_bOrgChg; m_bPaintBlank = rFont.m_bPaintBlank; m_bGreyWave = rFont.m_bGreyWave; + m_bURL = rFont.m_bURL; } return *this; } commit 84991971fc00759cb97b52d968affb3698defaeb Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Thu Apr 18 13:18:37 2024 +0500 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Tue Jun 18 02:36:41 2024 +0500 Return double from OutputDevice::GetTextArray And introduce GetTextWidth / GetTextHeight variants returning double. It allows to avoid premature rounding. At least in one case - testTdf145111_anchor_in_Fontwork - it allowed to make the test DPI-independent (at least in my testing on Windows, using 125, 150, and 175% UI scaling). Change-Id: I973d2c729ec6bb7114b4f99b9027f1ead7c1d061 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166237 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/chart2/qa/extras/xshape/data/reference/fdo75075.xml b/chart2/qa/extras/xshape/data/reference/fdo75075.xml index fe8cb00cf178..6f401aa41edd 100644 --- a/chart2/qa/extras/xshape/data/reference/fdo75075.xml +++ b/chart2/qa/extras/xshape/data/reference/fdo75075.xml @@ -14,9 +14,9 @@ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> - <XShape positionX="320" positionY="180" sizeX="12852" sizeY="8640" type="com.sun.star.drawing.GroupShape" name="CID/D=0"> + <XShape positionX="320" positionY="180" sizeX="12850" sizeY="8640" type="com.sun.star.drawing.GroupShape" name="CID/D=0"> <XShapes> - <XShape positionX="1524" positionY="379" sizeX="10364" sizeY="7794" type="com.sun.star.drawing.RectangleShape" name="MarkHandles" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName=""> + <XShape positionX="1527" positionY="379" sizeX="10339" sizeY="7794" type="com.sun.star.drawing.RectangleShape" name="MarkHandles" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName=""> <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/> <FillGradient style="LINEAR" startColor="000000" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/> <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/> @@ -25,12 +25,12 @@ <LineStart/> <LineEnd/> <Transformation> - <Line1 column1="10365.000000" column2="0.000000" column3="1524.000000"/> + <Line1 column1="10340.000000" column2="0.000000" column3="1527.000000"/> <Line2 column1="0.000000" column2="7795.000000" column3="379.000000"/> <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> - <XShape positionX="320" positionY="180" sizeX="12852" sizeY="8640" type="com.sun.star.drawing.RectangleShape" name="PlotAreaIncludingAxes" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName=""> + <XShape positionX="320" positionY="180" sizeX="12850" sizeY="8640" type="com.sun.star.drawing.RectangleShape" name="PlotAreaIncludingAxes" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName=""> <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/> <FillGradient style="LINEAR" startColor="000000" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/> <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/> @@ -39,18 +39,18 @@ <LineStart/> <LineEnd/> <Transformation> - <Line1 column1="12853.000000" column2="0.000000" column3="320.000000"/> + <Line1 column1="12851.000000" column2="0.000000" column3="320.000000"/> <Line2 column1="0.000000" column2="8641.000000" column3="180.000000"/> <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> - <XShape positionX="320" positionY="180" sizeX="12852" sizeY="8640" type="com.sun.star.drawing.GroupShape"> + <XShape positionX="320" positionY="180" sizeX="12850" sizeY="8640" type="com.sun.star.drawing.GroupShape"> <XShapes> - <XShape positionX="1374" positionY="378" sizeX="10664" sizeY="7944" type="com.sun.star.drawing.GroupShape"> + <XShape positionX="1377" positionY="378" sizeX="10639" sizeY="7944" type="com.sun.star.drawing.GroupShape"> <XShapes> - <XShape positionX="1524" positionY="379" sizeX="10364" sizeY="7794" type="com.sun.star.drawing.GroupShape" name="PlotAreaExcludingAxes"> + <XShape positionX="1527" positionY="379" sizeX="10339" sizeY="7794" type="com.sun.star.drawing.GroupShape" name="PlotAreaExcludingAxes"> <XShapes> - <XShape positionX="1524" positionY="379" sizeX="10364" sizeY="7794" type="com.sun.star.drawing.RectangleShape" name="CID/DiagramWall=" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="e6e6e6" fillTransparence="0" fillTransparenceGradientName=""> + <XShape positionX="1527" positionY="379" sizeX="10339" sizeY="7794" type="com.sun.star.drawing.RectangleShape" name="CID/DiagramWall=" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="e6e6e6" fillTransparence="0" fillTransparenceGradientName=""> <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/> <FillGradient style="LINEAR" startColor="000000" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/> <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/> @@ -59,125 +59,125 @@ <LineStart/> <LineEnd/> <Transformation> - <Line1 column1="10365.000000" column2="0.000000" column3="1524.000000"/> + <Line1 column1="10340.000000" column2="0.000000" column3="1527.000000"/> <Line2 column1="0.000000" column2="7795.000000" column3="379.000000"/> <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> </XShapes> <Transformation> - <Line1 column1="10365.000000" column2="0.000000" column3="1524.000000"/> + <Line1 column1="10340.000000" column2="0.000000" column3="1527.000000"/> <Line2 column1="0.000000" column2="7795.000000" column3="379.000000"/> <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> - <XShape positionX="1374" positionY="378" sizeX="10664" sizeY="7944" type="com.sun.star.drawing.GroupShape" name="testonly;CooContainer=XXX_CID"> + <XShape positionX="1377" positionY="378" sizeX="10639" sizeY="7944" type="com.sun.star.drawing.GroupShape" name="testonly;CooContainer=XXX_CID"> <XShapes> - <XShape positionX="1524" positionY="378" sizeX="10364" sizeY="7794" type="com.sun.star.drawing.GroupShape"> + <XShape positionX="1527" positionY="378" sizeX="10339" sizeY="7794" type="com.sun.star.drawing.GroupShape"> <XShapes> - <XShape positionX="1524" positionY="378" sizeX="10364" sizeY="7794" type="com.sun.star.drawing.GroupShape" name="CID/D=0:CS=0:Axis=1,0:Grid=0"> + <XShape positionX="1527" positionY="378" sizeX="10339" sizeY="7794" type="com.sun.star.drawing.GroupShape" name="CID/D=0:CS=0:Axis=1,0:Grid=0"> <XShapes> - <XShape positionX="1524" positionY="378" sizeX="10364" sizeY="7794" type="com.sun.star.drawing.PolyLineShape" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID"> + <XShape positionX="1527" positionY="378" sizeX="10339" sizeY="7794" type="com.sun.star.drawing.PolyLineShape" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID"> <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/> <LineStart/> <LineEnd/> <PolyPolygon> <pointSequence> - <point positionX="11888" positionY="8172"/> - <point positionX="1524" positionY="8172"/> + <point positionX="11866" positionY="8172"/> + <point positionX="1527" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="11888" positionY="7197"/> - <point positionX="1524" positionY="7197"/> + <point positionX="11866" positionY="7197"/> + <point positionX="1527" positionY="7197"/> </pointSequence> <pointSequence> - <point positionX="11888" positionY="6223"/> - <point positionX="1524" positionY="6223"/> + <point positionX="11866" positionY="6223"/> + <point positionX="1527" positionY="6223"/> </pointSequence> <pointSequence> - <point positionX="11888" positionY="5249"/> - <point positionX="1524" positionY="5249"/> + <point positionX="11866" positionY="5249"/> + <point positionX="1527" positionY="5249"/> </pointSequence> <pointSequence> - <point positionX="11888" positionY="4275"/> - <point positionX="1524" positionY="4275"/> + <point positionX="11866" positionY="4275"/> + <point positionX="1527" positionY="4275"/> </pointSequence> <pointSequence> - <point positionX="11888" positionY="3300"/> - <point positionX="1524" positionY="3300"/> + <point positionX="11866" positionY="3300"/> + <point positionX="1527" positionY="3300"/> </pointSequence> <pointSequence> - <point positionX="11888" positionY="2326"/> - <point positionX="1524" positionY="2326"/> + <point positionX="11866" positionY="2326"/> + <point positionX="1527" positionY="2326"/> </pointSequence> <pointSequence> - <point positionX="11888" positionY="1352"/> - <point positionX="1524" positionY="1352"/> + <point positionX="11866" positionY="1352"/> + <point positionX="1527" positionY="1352"/> </pointSequence> <pointSequence> - <point positionX="11888" positionY="378"/> - <point positionX="1524" positionY="378"/> + <point positionX="11866" positionY="378"/> + <point positionX="1527" positionY="378"/> </pointSequence> </PolyPolygon> <Geometry> <pointSequence> - <point positionX="10364" positionY="7794"/> + <point positionX="10339" positionY="7794"/> <point positionX="0" positionY="7794"/> </pointSequence> <pointSequence> - <point positionX="10364" positionY="6819"/> + <point positionX="10339" positionY="6819"/> <point positionX="0" positionY="6819"/> </pointSequence> <pointSequence> - <point positionX="10364" positionY="5845"/> + <point positionX="10339" positionY="5845"/> <point positionX="0" positionY="5845"/> </pointSequence> <pointSequence> - <point positionX="10364" positionY="4871"/> + <point positionX="10339" positionY="4871"/> <point positionX="0" positionY="4871"/> </pointSequence> <pointSequence> - <point positionX="10364" positionY="3897"/> + <point positionX="10339" positionY="3897"/> <point positionX="0" positionY="3897"/> </pointSequence> <pointSequence> - <point positionX="10364" positionY="2922"/> + <point positionX="10339" positionY="2922"/> <point positionX="0" positionY="2922"/> </pointSequence> <pointSequence> - <point positionX="10364" positionY="1948"/> + <point positionX="10339" positionY="1948"/> <point positionX="0" positionY="1948"/> </pointSequence> <pointSequence> - <point positionX="10364" positionY="974"/> + <point positionX="10339" positionY="974"/> <point positionX="0" positionY="974"/> </pointSequence> <pointSequence> - <point positionX="10364" positionY="0"/> + <point positionX="10339" positionY="0"/> <point positionX="0" positionY="0"/> </pointSequence> </Geometry> <Transformation> - <Line1 column1="10364.000000" column2="0.000000" column3="1524.000000"/> + <Line1 column1="10339.000000" column2="0.000000" column3="1527.000000"/> <Line2 column1="0.000000" column2="7794.000000" column3="378.000000"/> <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> - <XShape positionX="1524" positionY="378" sizeX="0" sizeY="7794" type="com.sun.star.drawing.PolyLineShape" name="HandlesOnly" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="NONE"> + <XShape positionX="1527" positionY="378" sizeX="0" sizeY="7794" type="com.sun.star.drawing.PolyLineShape" name="HandlesOnly" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="NONE"> <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/> <LineStart/> <LineEnd/> <PolyPolygon> <pointSequence> - <point positionX="1524" positionY="8172"/> - <point positionX="1524" positionY="7197"/> - <point positionX="1524" positionY="6223"/> - <point positionX="1524" positionY="5249"/> - <point positionX="1524" positionY="4275"/> - <point positionX="1524" positionY="3300"/> - <point positionX="1524" positionY="2326"/> - <point positionX="1524" positionY="1352"/> - <point positionX="1524" positionY="378"/> + <point positionX="1527" positionY="8172"/> + <point positionX="1527" positionY="7197"/> + <point positionX="1527" positionY="6223"/> + <point positionX="1527" positionY="5249"/> + <point positionX="1527" positionY="4275"/> + <point positionX="1527" positionY="3300"/> + <point positionX="1527" positionY="2326"/> + <point positionX="1527" positionY="1352"/> + <point positionX="1527" positionY="378"/> </pointSequence> </PolyPolygon> <Geometry> @@ -194,81 +194,81 @@ </pointSequence> </Geometry> <Transformation> - <Line1 column1="0.000000" column2="0.000000" column3="1524.000000"/> + <Line1 column1="0.000000" column2="0.000000" column3="1527.000000"/> <Line2 column1="0.000000" column2="7794.000000" column3="378.000000"/> <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> </XShapes> <Transformation> - <Line1 column1="10365.000000" column2="0.000000" column3="1524.000000"/> + <Line1 column1="10340.000000" column2="0.000000" column3="1527.000000"/> <Line2 column1="0.000000" column2="7795.000000" column3="378.000000"/> <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> </XShapes> <Transformation> - <Line1 column1="10365.000000" column2="0.000000" column3="1524.000000"/> + <Line1 column1="10340.000000" column2="0.000000" column3="1527.000000"/> <Line2 column1="0.000000" column2="7795.000000" column3="378.000000"/> <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> - <XShape positionX="1374" positionY="378" sizeX="10664" sizeY="7944" type="com.sun.star.drawing.GroupShape"> + <XShape positionX="1377" positionY="378" sizeX="10639" sizeY="7944" type="com.sun.star.drawing.GroupShape"> <XShapes> - <XShape positionX="1524" positionY="8172" sizeX="10364" sizeY="150" type="com.sun.star.drawing.GroupShape" name="CID/D=0:CS=0:Axis=0,0"> + <XShape positionX="1527" positionY="8172" sizeX="10339" sizeY="150" type="com.sun.star.drawing.GroupShape" name="CID/D=0:CS=0:Axis=0,0"> <XShapes> - <XShape positionX="1524" positionY="8172" sizeX="10364" sizeY="150" type="com.sun.star.drawing.PolyLineShape" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID"> + <XShape positionX="1527" positionY="8172" sizeX="10339" sizeY="150" type="com.sun.star.drawing.PolyLineShape" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID"> <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/> <LineStart/> <LineEnd/> <PolyPolygon> <pointSequence> - <point positionX="1524" positionY="8322"/> - <point positionX="1524" positionY="8172"/> + <point positionX="1527" positionY="8322"/> + <point positionX="1527" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="1524" positionY="8322"/> - <point positionX="1524" positionY="8172"/> + <point positionX="1527" positionY="8322"/> + <point positionX="1527" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="3596" positionY="8322"/> - <point positionX="3596" positionY="8172"/> + <point positionX="3594" positionY="8322"/> + <point positionX="3594" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="3596" positionY="8322"/> - <point positionX="3596" positionY="8172"/> + <point positionX="3594" positionY="8322"/> + <point positionX="3594" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="5669" positionY="8322"/> - <point positionX="5669" positionY="8172"/> + <point positionX="5662" positionY="8322"/> + <point positionX="5662" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="5669" positionY="8322"/> - <point positionX="5669" positionY="8172"/> + <point positionX="5662" positionY="8322"/> + <point positionX="5662" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="7742" positionY="8322"/> - <point positionX="7742" positionY="8172"/> + <point positionX="7730" positionY="8322"/> + <point positionX="7730" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="7742" positionY="8322"/> - <point positionX="7742" positionY="8172"/> + <point positionX="7730" positionY="8322"/> + <point positionX="7730" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="9815" positionY="8322"/> - <point positionX="9815" positionY="8172"/> + <point positionX="9798" positionY="8322"/> + <point positionX="9798" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="9815" positionY="8322"/> - <point positionX="9815" positionY="8172"/> + <point positionX="9798" positionY="8322"/> + <point positionX="9798" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="11888" positionY="8322"/> - <point positionX="11888" positionY="8172"/> + <point positionX="11866" positionY="8322"/> + <point positionX="11866" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="11888" positionY="8322"/> - <point positionX="11888" positionY="8172"/> + <point positionX="11866" positionY="8322"/> + <point positionX="11866" positionY="8172"/> </pointSequence> </PolyPolygon> <Geometry> @@ -281,159 +281,159 @@ <point positionX="0" positionY="0"/> </pointSequence> <pointSequence> - <point positionX="2072" positionY="150"/> - <point positionX="2072" positionY="0"/> + <point positionX="2067" positionY="150"/> + <point positionX="2067" positionY="0"/> </pointSequence> <pointSequence> - <point positionX="2072" positionY="150"/> - <point positionX="2072" positionY="0"/> + <point positionX="2067" positionY="150"/> + <point positionX="2067" positionY="0"/> </pointSequence> <pointSequence> - <point positionX="4145" positionY="150"/> - <point positionX="4145" positionY="0"/> + <point positionX="4135" positionY="150"/> + <point positionX="4135" positionY="0"/> </pointSequence> <pointSequence> - <point positionX="4145" positionY="150"/> - <point positionX="4145" positionY="0"/> + <point positionX="4135" positionY="150"/> + <point positionX="4135" positionY="0"/> </pointSequence> <pointSequence> - <point positionX="6218" positionY="150"/> - <point positionX="6218" positionY="0"/> + <point positionX="6203" positionY="150"/> + <point positionX="6203" positionY="0"/> </pointSequence> <pointSequence> - <point positionX="6218" positionY="150"/> - <point positionX="6218" positionY="0"/> + <point positionX="6203" positionY="150"/> + <point positionX="6203" positionY="0"/> </pointSequence> <pointSequence> - <point positionX="8291" positionY="150"/> - <point positionX="8291" positionY="0"/> + <point positionX="8271" positionY="150"/> + <point positionX="8271" positionY="0"/> </pointSequence> <pointSequence> - <point positionX="8291" positionY="150"/> - <point positionX="8291" positionY="0"/> + <point positionX="8271" positionY="150"/> + <point positionX="8271" positionY="0"/> </pointSequence> <pointSequence> - <point positionX="10364" positionY="150"/> - <point positionX="10364" positionY="0"/> + <point positionX="10339" positionY="150"/> + <point positionX="10339" positionY="0"/> </pointSequence> <pointSequence> - <point positionX="10364" positionY="150"/> - <point positionX="10364" positionY="0"/> + <point positionX="10339" positionY="150"/> + <point positionX="10339" positionY="0"/> </pointSequence> </Geometry> <Transformation> - <Line1 column1="10364.000000" column2="0.000000" column3="1524.000000"/> + <Line1 column1="10339.000000" column2="0.000000" column3="1527.000000"/> <Line2 column1="0.000000" column2="150.000000" column3="8172.000000"/> <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> - <XShape positionX="1524" positionY="8172" sizeX="10364" sizeY="0" type="com.sun.star.drawing.LineShape" name="MarkHandles" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID"> + <XShape positionX="1527" positionY="8172" sizeX="10339" sizeY="0" type="com.sun.star.drawing.LineShape" name="MarkHandles" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID"> <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/> <LineStart/> <LineEnd/> <PolyPolygon> <pointSequence> - <point positionX="1524" positionY="8172"/> - <point positionX="11888" positionY="8172"/> + <point positionX="1527" positionY="8172"/> + <point positionX="11866" positionY="8172"/> </pointSequence> </PolyPolygon> <Geometry> <pointSequence> <point positionX="0" positionY="0"/> - <point positionX="10364" positionY="0"/> + <point positionX="10339" positionY="0"/> </pointSequence> </Geometry> <Transformation> - <Line1 column1="10364.000000" column2="0.000000" column3="1524.000000"/> + <Line1 column1="10339.000000" column2="0.000000" column3="1527.000000"/> <Line2 column1="0.000000" column2="0.000000" column3="8172.000000"/> <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> </XShapes> <Transformation> - <Line1 column1="10365.000000" column2="0.000000" column3="1524.000000"/> + <Line1 column1="10340.000000" column2="0.000000" column3="1527.000000"/> <Line2 column1="0.000000" column2="151.000000" column3="8172.000000"/> <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> - <XShape positionX="1374" positionY="378" sizeX="150" sizeY="7794" type="com.sun.star.drawing.GroupShape" name="CID/D=0:CS=0:Axis=1,0"> + <XShape positionX="1377" positionY="378" sizeX="150" sizeY="7794" type="com.sun.star.drawing.GroupShape" name="CID/D=0:CS=0:Axis=1,0"> <XShapes> - <XShape positionX="1374" positionY="378" sizeX="150" sizeY="7794" type="com.sun.star.drawing.PolyLineShape" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID"> + <XShape positionX="1377" positionY="378" sizeX="150" sizeY="7794" type="com.sun.star.drawing.PolyLineShape" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID"> <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/> <LineStart/> <LineEnd/> <PolyPolygon> <pointSequence> - <point positionX="1374" positionY="8172"/> - <point positionX="1524" positionY="8172"/> + <point positionX="1377" positionY="8172"/> + <point positionX="1527" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="8172"/> - <point positionX="1524" positionY="8172"/> + <point positionX="1377" positionY="8172"/> + <point positionX="1527" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="7197"/> - <point positionX="1524" positionY="7197"/> + <point positionX="1377" positionY="7197"/> + <point positionX="1527" positionY="7197"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="7197"/> - <point positionX="1524" positionY="7197"/> + <point positionX="1377" positionY="7197"/> + <point positionX="1527" positionY="7197"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="6223"/> - <point positionX="1524" positionY="6223"/> + <point positionX="1377" positionY="6223"/> + <point positionX="1527" positionY="6223"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="6223"/> - <point positionX="1524" positionY="6223"/> + <point positionX="1377" positionY="6223"/> + <point positionX="1527" positionY="6223"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="5249"/> - <point positionX="1524" positionY="5249"/> + <point positionX="1377" positionY="5249"/> + <point positionX="1527" positionY="5249"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="5249"/> - <point positionX="1524" positionY="5249"/> + <point positionX="1377" positionY="5249"/> + <point positionX="1527" positionY="5249"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="4275"/> - <point positionX="1524" positionY="4275"/> + <point positionX="1377" positionY="4275"/> + <point positionX="1527" positionY="4275"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="4275"/> - <point positionX="1524" positionY="4275"/> + <point positionX="1377" positionY="4275"/> + <point positionX="1527" positionY="4275"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="3300"/> - <point positionX="1524" positionY="3300"/> + <point positionX="1377" positionY="3300"/> + <point positionX="1527" positionY="3300"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="3300"/> - <point positionX="1524" positionY="3300"/> + <point positionX="1377" positionY="3300"/> + <point positionX="1527" positionY="3300"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="2326"/> - <point positionX="1524" positionY="2326"/> + <point positionX="1377" positionY="2326"/> + <point positionX="1527" positionY="2326"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="2326"/> - <point positionX="1524" positionY="2326"/> + <point positionX="1377" positionY="2326"/> + <point positionX="1527" positionY="2326"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="1352"/> - <point positionX="1524" positionY="1352"/> + <point positionX="1377" positionY="1352"/> + <point positionX="1527" positionY="1352"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="1352"/> - <point positionX="1524" positionY="1352"/> + <point positionX="1377" positionY="1352"/> + <point positionX="1527" positionY="1352"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="378"/> - <point positionX="1524" positionY="378"/> + <point positionX="1377" positionY="378"/> + <point positionX="1527" positionY="378"/> </pointSequence> <pointSequence> - <point positionX="1374" positionY="378"/> - <point positionX="1524" positionY="378"/> + <point positionX="1377" positionY="378"/> + <point positionX="1527" positionY="378"/> </pointSequence> </PolyPolygon> <Geometry> @@ -511,19 +511,19 @@ </pointSequence> </Geometry> <Transformation> - <Line1 column1="150.000000" column2="0.000000" column3="1374.000000"/> + <Line1 column1="150.000000" column2="0.000000" column3="1377.000000"/> <Line2 column1="0.000000" column2="7794.000000" column3="378.000000"/> <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> - <XShape positionX="1524" positionY="378" sizeX="0" sizeY="7794" type="com.sun.star.drawing.LineShape" name="MarkHandles" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID"> + <XShape positionX="1527" positionY="378" sizeX="0" sizeY="7794" type="com.sun.star.drawing.LineShape" name="MarkHandles" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID"> <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/> <LineStart/> <LineEnd/> <PolyPolygon> <pointSequence> - <point positionX="1524" positionY="8172"/> - <point positionX="1524" positionY="378"/> + <point positionX="1527" positionY="8172"/> + <point positionX="1527" positionY="378"/> </pointSequence> </PolyPolygon> <Geometry> @@ -533,88 +533,88 @@ </pointSequence> </Geometry> <Transformation> - <Line1 column1="0.000000" column2="0.000000" column3="1524.000000"/> + <Line1 column1="0.000000" column2="0.000000" column3="1527.000000"/> <Line2 column1="0.000000" column2="7794.000000" column3="378.000000"/> <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> </XShapes> <Transformation> - <Line1 column1="151.000000" column2="0.000000" column3="1374.000000"/> + <Line1 column1="151.000000" column2="0.000000" column3="1377.000000"/> <Line2 column1="0.000000" column2="7795.000000" column3="378.000000"/> <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> - <XShape positionX="11888" positionY="378" sizeX="150" sizeY="7794" type="com.sun.star.drawing.GroupShape" name="CID/D=0:CS=0:Axis=1,1"> + <XShape positionX="11866" positionY="378" sizeX="150" sizeY="7794" type="com.sun.star.drawing.GroupShape" name="CID/D=0:CS=0:Axis=1,1"> <XShapes> - <XShape positionX="11888" positionY="378" sizeX="150" sizeY="7794" type="com.sun.star.drawing.PolyLineShape" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID"> + <XShape positionX="11866" positionY="378" sizeX="150" sizeY="7794" type="com.sun.star.drawing.PolyLineShape" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID"> <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/> <LineStart/> <LineEnd/> <PolyPolygon> <pointSequence> - <point positionX="12038" positionY="8172"/> - <point positionX="11888" positionY="8172"/> + <point positionX="12016" positionY="8172"/> + <point positionX="11866" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="12038" positionY="8172"/> - <point positionX="11888" positionY="8172"/> + <point positionX="12016" positionY="8172"/> + <point positionX="11866" positionY="8172"/> </pointSequence> <pointSequence> - <point positionX="12038" positionY="7058"/> - <point positionX="11888" positionY="7058"/> + <point positionX="12016" positionY="7058"/> + <point positionX="11866" positionY="7058"/> </pointSequence> <pointSequence> - <point positionX="12038" positionY="7058"/> - <point positionX="11888" positionY="7058"/> + <point positionX="12016" positionY="7058"/> + <point positionX="11866" positionY="7058"/> </pointSequence> <pointSequence> - <point positionX="12038" positionY="5945"/> - <point positionX="11888" positionY="5945"/> + <point positionX="12016" positionY="5945"/> + <point positionX="11866" positionY="5945"/> </pointSequence> <pointSequence> - <point positionX="12038" positionY="5945"/> - <point positionX="11888" positionY="5945"/> + <point positionX="12016" positionY="5945"/> + <point positionX="11866" positionY="5945"/> </pointSequence> <pointSequence> - <point positionX="12038" positionY="4831"/> - <point positionX="11888" positionY="4831"/> + <point positionX="12016" positionY="4831"/> + <point positionX="11866" positionY="4831"/> </pointSequence> <pointSequence> - <point positionX="12038" positionY="4831"/> - <point positionX="11888" positionY="4831"/> + <point positionX="12016" positionY="4831"/> + <point positionX="11866" positionY="4831"/> </pointSequence> <pointSequence> - <point positionX="12038" positionY="3718"/> - <point positionX="11888" positionY="3718"/> + <point positionX="12016" positionY="3718"/> + <point positionX="11866" positionY="3718"/> </pointSequence> <pointSequence> - <point positionX="12038" positionY="3718"/> - <point positionX="11888" positionY="3718"/> + <point positionX="12016" positionY="3718"/> + <point positionX="11866" positionY="3718"/> </pointSequence> <pointSequence> - <point positionX="12038" positionY="2604"/> - <point positionX="11888" positionY="2604"/> + <point positionX="12016" positionY="2604"/> + <point positionX="11866" positionY="2604"/> </pointSequence> <pointSequence> - <point positionX="12038" positionY="2604"/> - <point positionX="11888" positionY="2604"/> + <point positionX="12016" positionY="2604"/> + <point positionX="11866" positionY="2604"/> </pointSequence> <pointSequence> - <point positionX="12038" positionY="1491"/> - <point positionX="11888" positionY="1491"/> + <point positionX="12016" positionY="1491"/> + <point positionX="11866" positionY="1491"/> </pointSequence> <pointSequence> - <point positionX="12038" positionY="1491"/> - <point positionX="11888" positionY="1491"/> + <point positionX="12016" positionY="1491"/> + <point positionX="11866" positionY="1491"/> </pointSequence> <pointSequence> - <point positionX="12038" positionY="378"/> - <point positionX="11888" positionY="378"/> + <point positionX="12016" positionY="378"/> + <point positionX="11866" positionY="378"/> </pointSequence> <pointSequence> - <point positionX="12038" positionY="378"/> - <point positionX="11888" positionY="378"/> + <point positionX="12016" positionY="378"/> + <point positionX="11866" positionY="378"/> </pointSequence> </PolyPolygon> <Geometry> @@ -684,19 +684,19 @@ </pointSequence> </Geometry> <Transformation> - <Line1 column1="150.000000" column2="0.000000" column3="11888.000000"/> + <Line1 column1="150.000000" column2="0.000000" column3="11866.000000"/> <Line2 column1="0.000000" column2="7794.000000" column3="378.000000"/> <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/> </Transformation> </XShape> - <XShape positionX="11888" positionY="378" sizeX="0" sizeY="7794" type="com.sun.star.drawing.LineShape" name="MarkHandles" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID"> + <XShape positionX="11866" positionY="378" sizeX="0" sizeY="7794" type="com.sun.star.drawing.LineShape" name="MarkHandles" fontHeight="12.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID"> <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/> <LineStart/> <LineEnd/> <PolyPolygon> <pointSequence> - <point positionX="11888" positionY="8172"/> - <point positionX="11888" positionY="378"/> + <point positionX="11866" positionY="8172"/> + <point positionX="11866" positionY="378"/> </pointSequence> </PolyPolygon> <Geometry> -e ... etc. - the rest is truncated