drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx | 16 ++++++-- include/vcl/vectorgraphicdata.hxx | 3 + svx/source/svdraw/svdxcgv.cxx | 11 +++++ sw/qa/extras/htmlexport/htmlexport.cxx | 9 ++++ sw/source/filter/html/htmlflywriter.cxx | 22 +++++++++-- vcl/source/gdi/vectorgraphicdata.cxx | 7 ++- 6 files changed, 58 insertions(+), 10 deletions(-)
New commits: commit 26d2b19d4e9388072b8dae574efdf00d7f7a0f2f Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Fri Jun 4 14:02:52 2021 +0200 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Fri Jun 4 14:54:45 2021 +0200 sw HTML export: fix pixel size of shapes - the twips logic size was set, but it was consumed as mm100 logic size, so the pixel size was about half of the correct one - the HTML export didn't write a logic size ("CSS pixels size") for shapes Change-Id: I37f6b4acde9d1298fae81f9975e9db95485631ee Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116691 Reviewed-by: Miklos Vajna <vmik...@collabora.com> Tested-by: Jenkins diff --git a/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx b/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx index 2f750e73af65..63b4ffd6986d 100644 --- a/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx +++ b/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx @@ -34,6 +34,7 @@ #include <drawinglayer/primitive2d/transformprimitive2d.hxx> #include <drawinglayer/converters.hxx> +#include <comphelper/sequenceashashmap.hxx> using namespace ::com::sun::star; @@ -81,6 +82,16 @@ namespace drawinglayer::unorenderer const css::geometry::RealRectangle2D& Range, ::sal_uInt32 MaximumQuadraticPixels) { + o3tl::Length eRangeUnit = o3tl::Length::mm100; + comphelper::SequenceAsHashMap aViewInformationMap(aViewInformationSequence); + auto it = aViewInformationMap.find("RangeUnit"); + if (it != aViewInformationMap.end()) + { + sal_Int32 nVal{}; + it->second >>= nVal; + eRangeUnit = static_cast<o3tl::Length>(nVal); + } + uno::Reference< rendering::XBitmap > XBitmap; if(aPrimitive2DSequence.hasElements()) @@ -107,9 +118,8 @@ namespace drawinglayer::unorenderer } const geometry::ViewInformation2D aViewInformation2D(aViewInformationSequence); - const double fFactor100th_mmToInch(1.0 / (2.54 * 1000.0)); - const sal_uInt32 nDiscreteWidth(basegfx::fround((fWidth * fFactor100th_mmToInch) * DPI_X)); - const sal_uInt32 nDiscreteHeight(basegfx::fround((fHeight * fFactor100th_mmToInch) * DPI_Y)); + const sal_uInt32 nDiscreteWidth(basegfx::fround(o3tl::convert(fWidth, eRangeUnit, o3tl::Length::in) * DPI_X)); + const sal_uInt32 nDiscreteHeight(basegfx::fround(o3tl::convert(fHeight, eRangeUnit, o3tl::Length::in) * DPI_Y)); basegfx::B2DHomMatrix aEmbedding( basegfx::utils::createTranslateB2DHomMatrix( diff --git a/include/vcl/vectorgraphicdata.hxx b/include/vcl/vectorgraphicdata.hxx index 90b92411dfab..3057ea82b8b8 100644 --- a/include/vcl/vectorgraphicdata.hxx +++ b/include/vcl/vectorgraphicdata.hxx @@ -41,7 +41,8 @@ typedef css::uno::Sequence<sal_Int8> VectorGraphicDataArray; BitmapEx VCL_DLLPUBLIC convertPrimitive2DSequenceToBitmapEx( const std::deque< css::uno::Reference< css::graphic::XPrimitive2D > >& rSequence, const basegfx::B2DRange& rTargetRange, - const sal_uInt32 nMaximumQuadraticPixels = 500000); + const sal_uInt32 nMaximumQuadraticPixels = 500000, + const o3tl::Length eTargetUnit = o3tl::Length::mm100); enum class VectorGraphicDataType diff --git a/svx/source/svdraw/svdxcgv.cxx b/svx/source/svdraw/svdxcgv.cxx index 1cf15c720a31..7d52431cd2b7 100644 --- a/svx/source/svdraw/svdxcgv.cxx +++ b/svx/source/svdraw/svdxcgv.cxx @@ -490,11 +490,20 @@ BitmapEx SdrExchangeView::GetMarkedObjBitmapEx(bool bNoVDevIfOneBmpMarked) const if(!aRange.isEmpty()) { + o3tl::Length eRangeUnit = o3tl::Length::mm100; + + if (GetModel()->IsWriter()) + { + eRangeUnit = o3tl::Length::twip; + } + // if we have geometry and it has a range, convert to BitmapEx using // common tooling aBmp = convertPrimitive2DSequenceToBitmapEx( xPrimitives, - aRange); + aRange, + /*nMaximumQuadraticPixels=*/ 500000, + eRangeUnit); } } } diff --git a/sw/qa/extras/htmlexport/htmlexport.cxx b/sw/qa/extras/htmlexport/htmlexport.cxx index b97cf7968640..1f5182ac6e4c 100644 --- a/sw/qa/extras/htmlexport/htmlexport.cxx +++ b/sw/qa/extras/htmlexport/htmlexport.cxx @@ -1723,6 +1723,15 @@ CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifEmbedShapeAsPNG) // - Actual : image/x-vclgraphic // i.e. the result was invalid ReqIF. assertXPath(pXmlDoc, "//reqif-xhtml:p/reqif-xhtml:object", "type", "image/png"); + + // Then check the pixel size of the shape: + Size aPixelSize(Application::GetDefaultDevice()->LogicToPixel(Size(10000, 10000), + MapMode(MapUnit::Map100thMM))); + // Without the accompanying fix in place, this test would have failed with: + // - no attribute 'width' exist + // i.e. shapes had no width. + assertXPath(pXmlDoc, "//reqif-xhtml:p/reqif-xhtml:object", "width", + OUString::number(aPixelSize.getWidth())); } CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/filter/html/htmlflywriter.cxx b/sw/source/filter/html/htmlflywriter.cxx index ed6d646594ee..8f6608097f07 100644 --- a/sw/source/filter/html/htmlflywriter.cxx +++ b/sw/source/filter/html/htmlflywriter.cxx @@ -933,12 +933,28 @@ void SwHTMLWriter::writeFrameFormatOptions(HtmlWriter& aHtml, const SwFrameForma // "width" and/or "height" // Only output SwFrameSize::Variable/SwFrameSize::Minimum if ANYSIZE is set + const SwFormatFrameSize* pFSItem = nullptr; + std::optional<SwFormatFrameSize> aFrameSize; + if (SfxItemState::SET == rItemSet.GetItemState( RES_FRM_SIZE, true, &pItem )) + { + pFSItem = static_cast<const SwFormatFrameSize *>(pItem); + } + else if (const SdrObject* pObject = rFrameFormat.FindSdrObject()) + { + // Write size for Draw shapes as well. + const tools::Rectangle& rSnapRect = pObject->GetSnapRect(); + aFrameSize.emplace(); + aFrameSize->SetWidthSizeType(SwFrameSize::Fixed); + aFrameSize->SetWidth(rSnapRect.getWidth()); + aFrameSize->SetHeightSizeType(SwFrameSize::Fixed); + aFrameSize->SetHeight(rSnapRect.getHeight()); + pFSItem = &*aFrameSize; + } if( (nFrameOptions & HtmlFrmOpts::Size) && - SfxItemState::SET == rItemSet.GetItemState( RES_FRM_SIZE, true, &pItem ) && + pFSItem && ( (nFrameOptions & HtmlFrmOpts::AnySize) || - SwFrameSize::Fixed == static_cast<const SwFormatFrameSize *>(pItem)->GetHeightSizeType()) ) + SwFrameSize::Fixed == pFSItem->GetHeightSizeType()) ) { - const SwFormatFrameSize *pFSItem = static_cast<const SwFormatFrameSize *>(pItem); sal_uInt8 nPercentWidth = pFSItem->GetWidthPercent(); sal_uInt8 nPercentHeight = pFSItem->GetHeightPercent(); diff --git a/vcl/source/gdi/vectorgraphicdata.cxx b/vcl/source/gdi/vectorgraphicdata.cxx index 8430ebe2b289..b424d4dcd503 100644 --- a/vcl/source/gdi/vectorgraphicdata.cxx +++ b/vcl/source/gdi/vectorgraphicdata.cxx @@ -48,7 +48,8 @@ using namespace ::com::sun::star; BitmapEx convertPrimitive2DSequenceToBitmapEx( const std::deque< css::uno::Reference< css::graphic::XPrimitive2D > >& rSequence, const basegfx::B2DRange& rTargetRange, - const sal_uInt32 nMaximumQuadraticPixels) + const sal_uInt32 nMaximumQuadraticPixels, + const o3tl::Length eTargetUnit) { BitmapEx aRetval; @@ -61,7 +62,9 @@ BitmapEx convertPrimitive2DSequenceToBitmapEx( uno::Reference< uno::XComponentContext > xContext(::comphelper::getProcessComponentContext()); const uno::Reference< graphic::XPrimitive2DRenderer > xPrimitive2DRenderer = graphic::Primitive2DTools::create(xContext); - uno::Sequence< beans::PropertyValue > aViewParameters; + uno::Sequence< beans::PropertyValue > aViewParameters = { + comphelper::makePropertyValue("RangeUnit", static_cast<sal_Int32>(eTargetUnit)), + }; geometry::RealRectangle2D aRealRect; aRealRect.X1 = rTargetRange.getMinX(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits