[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.2' - include/svtools sfx2/source svtools/source
Muhammet Kara (via logerrit)
logerrit at kemper.freedesktop.org
Mon Jun 17 18:51:04 UTC 2019
include/svtools/DocumentToGraphicRenderer.hxx | 16 ++++-
sfx2/source/doc/objserv.cxx | 36 +++++++++++-
svtools/source/filter/DocumentToGraphicRenderer.cxx | 58 ++++++++++++++++++--
3 files changed, 99 insertions(+), 11 deletions(-)
New commits:
commit efd8813bb88ff3f3fd8c523d2f39ae595292163e
Author: Muhammet Kara <muhammet.kara at collabora.com>
AuthorDate: Fri Jan 18 14:07:56 2019 +0300
Commit: Muhammet Kara <muhammet.kara at collabora.com>
CommitDate: Mon Jun 17 20:50:20 2019 +0200
Redaction: Adjust offset for multiple Calc pages
* Add an enum and some methods to DocumentToGraphicRenderer
to differentiate between the doc/module types:
isWriter(), isCalc(), isImpress()
* Put some checks for module/doc type
* The result seems ok for a Calc document of multiple sheets
with hundreds of pages
Change-Id: Idf3e1966d4239df30a48a947a95c9085c25ee1bb
Reviewed-on: https://gerrit.libreoffice.org/66605
Tested-by: Jenkins
Reviewed-by: Muhammet Kara <muhammet.kara at collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/69815
Reviewed-by: Andras Timar <andras.timar at collabora.com>
Tested-by: Andras Timar <andras.timar at collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/74195
Tested-by: Muhammet Kara <muhammet.kara at collabora.com>
diff --git a/include/svtools/DocumentToGraphicRenderer.hxx b/include/svtools/DocumentToGraphicRenderer.hxx
index e547caacf38a..70837b4505a3 100644
--- a/include/svtools/DocumentToGraphicRenderer.hxx
+++ b/include/svtools/DocumentToGraphicRenderer.hxx
@@ -46,12 +46,19 @@ class SVT_DLLPUBLIC DocumentToGraphicRenderer
{
const css::uno::Reference<css::lang::XComponent>& mxDocument;
+ enum DocType {
+ WRITER,
+ CALC,
+ IMPRESS,
+ UNKNOWN
+ };
+
css::uno::Reference<css::frame::XModel> mxModel;
css::uno::Reference<css::frame::XController> mxController;
css::uno::Reference<css::view::XRenderable> mxRenderable;
css::uno::Reference<css::awt::XToolkit> mxToolkit;
css::uno::Any maSelection;
- bool mbIsWriter;
+ DocType meDocType;
std::vector<OUString> maChapterNames;
bool hasSelection() const;
@@ -79,7 +86,8 @@ public:
Size getDocumentSizeInPixels( sal_Int32 nCurrentPage );
- Size getDocumentSizeIn100mm(sal_Int32 nCurrentPage, Point* pDocumentPosition = nullptr);
+ Size getDocumentSizeIn100mm(sal_Int32 nCurrentPage, Point* pDocumentPosition = nullptr,
+ Point* pCalcPagePosition = nullptr, Size *pCalcPageSize = nullptr);
Graphic renderToGraphic( sal_Int32 nCurrentPage, Size aDocumentSizePixel,
Size aTargetSizePixel, Color aPageColor, bool bExtOutDevData);
@@ -94,6 +102,10 @@ public:
css::uno::Reference< css::drawing::XShapes > & rxShapes,
css::uno::Reference< css::drawing::XShape > & rxShape,
const css::uno::Reference< css::frame::XController > & rxController );
+
+ bool isWriter() const;
+ bool isCalc() const;
+ bool isImpress() const;
};
#endif
diff --git a/sfx2/source/doc/objserv.cxx b/sfx2/source/doc/objserv.cxx
index 666d1ec25252..53ce5ad2f03e 100644
--- a/sfx2/source/doc/objserv.cxx
+++ b/sfx2/source/doc/objserv.cxx
@@ -547,7 +547,16 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
uno::Reference< lang::XComponent > xSourceDoc( xModel );
- DocumentToGraphicRenderer aRenderer(xSourceDoc, /*bSelectionOnly=*/false);
+ DocumentToGraphicRenderer aRenderer(xSourceDoc, false);
+
+ bool bIsWriter = aRenderer.isWriter();
+ bool bIsCalc = aRenderer.isCalc();
+
+ if (!bIsWriter && !bIsCalc)
+ {
+ SAL_WARN( "sfx.doc", "Redaction is supported only for Writer and Calc! (for now...)");
+ return;
+ }
sal_Int32 nPages = aRenderer.getPageCount();
@@ -557,7 +566,9 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
{
::Size aDocumentSizePixel = aRenderer.getDocumentSizeInPixels(nPage);
::Point aLogicPos;
- ::Size aLogic = aRenderer.getDocumentSizeIn100mm(nPage, &aLogicPos);
+ ::Point aCalcPageLogicPos;
+ ::Size aCalcPageContentSize;
+ ::Size aLogic = aRenderer.getDocumentSizeIn100mm(nPage, &aLogicPos, &aCalcPageLogicPos, &aCalcPageContentSize);
// FIXME: This is a temporary hack. Need to figure out a proper way to derive this scale factor.
::Size aTargetSize(aDocumentSizePixel.Width() * 1.23, aDocumentSizePixel.Height() * 1.23);
@@ -570,9 +581,21 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
MapMode aMapMode;
aMapMode.SetMapUnit(MapUnit::Map100thMM);
// FIXME: This is a temporary hack. Need to figure out a proper way to derive these magic numbers.
- aMapMode.SetOrigin(::Point(-(aLogicPos.getX() - 512) * 1.53, -((aLogicPos.getY() - 501)* 1.53 + (nPage-1)*740 )));
+ if (bIsWriter)
+ aMapMode.SetOrigin(::Point(-(aLogicPos.getX() - 512) * 1.53, -((aLogicPos.getY() - 501)* 1.53 + (nPage-1)*740 )));
+ else if (bIsCalc)
+ rGDIMetaFile.Scale(0.566, 0.566);
+
rGDIMetaFile.SetPrefMapMode(aMapMode);
- rGDIMetaFile.SetPrefSize(aLogic);
+
+ if (bIsCalc)
+ {
+ double aWidthRatio = static_cast<double>(aCalcPageContentSize.Width()) / aLogic.Width();
+ // FIXME: Get rid of these magic numbers. Also watch for floating point rounding errors
+ rGDIMetaFile.Move(-2400 + aCalcPageLogicPos.X() * (aWidthRatio - 0.0887), -3300 + aCalcPageLogicPos.Y() * 0.64175);
+ }
+
+ rGDIMetaFile.SetPrefSize( bIsCalc ? aCalcPageContentSize : aLogic );
aMetaFiles.push_back(rGDIMetaFile);
}
@@ -606,6 +629,11 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
xShape->setSize(awt::Size(rGDIMetaFile.GetPrefSize().Width(),rGDIMetaFile.GetPrefSize().Height()) );
xPage->add(xShape);
+
+ // Shapes from Calc have the size of the content instead of the whole standard page (like A4)
+ // so it needs positioning on the draw page
+ if (bIsCalc)
+ xShape->setPosition(awt::Point(1000,1000));
}
// Remove the extra page at the beginning
diff --git a/svtools/source/filter/DocumentToGraphicRenderer.cxx b/svtools/source/filter/DocumentToGraphicRenderer.cxx
index 9d1becf178f8..27852455c44f 100644
--- a/svtools/source/filter/DocumentToGraphicRenderer.cxx
+++ b/svtools/source/filter/DocumentToGraphicRenderer.cxx
@@ -48,7 +48,7 @@ DocumentToGraphicRenderer::DocumentToGraphicRenderer( const Reference<XComponent
mxController( mxModel->getCurrentController() ),
mxRenderable (mxDocument, uno::UNO_QUERY ),
mxToolkit( VCLUnoHelper::CreateToolkit() ),
- mbIsWriter( false )
+ meDocType( UNKNOWN )
{
try
{
@@ -56,7 +56,13 @@ DocumentToGraphicRenderer::DocumentToGraphicRenderer( const Reference<XComponent
if (xServiceInfo.is())
{
if (xServiceInfo->supportsService("com.sun.star.text.TextDocument"))
- mbIsWriter = true;
+ meDocType = WRITER;
+ else if (xServiceInfo->supportsService("com.sun.star.sheet.SpreadsheetDocument"))
+ meDocType = CALC;
+ else if (xServiceInfo->supportsService("com.sun.star.presentation.PresentationDocument"))
+ meDocType = IMPRESS;
+ else
+ meDocType = UNKNOWN;
}
}
catch (const uno::Exception&)
@@ -79,7 +85,7 @@ DocumentToGraphicRenderer::DocumentToGraphicRenderer( const Reference<XComponent
* XRenderable::render() it always renders an empty page.
* So disable the selection already here. The current page
* the cursor is on is rendered. */
- if (!mbIsWriter)
+ if (!isWriter())
maSelection = aViewSelection;
}
}
@@ -115,7 +121,7 @@ uno::Any DocumentToGraphicRenderer::getSelection() const
}
Size DocumentToGraphicRenderer::getDocumentSizeIn100mm(sal_Int32 nCurrentPage,
- Point* pDocumentPosition)
+ Point* pDocumentPosition, Point* pCalcPagePosition, Size* pCalcPageSize)
{
Reference< awt::XDevice > xDevice(mxToolkit->createScreenCompatibleDevice( 32, 32 ) );
@@ -134,7 +140,9 @@ Size DocumentToGraphicRenderer::getDocumentSizeIn100mm(sal_Int32 nCurrentPage,
renderProperties[3].Value <<= true;
awt::Size aSize;
+ awt::Size aCalcPageSize;
awt::Point aPos;
+ awt::Point aCalcPos;
sal_Int32 nPages = mxRenderable->getRendererCount( selection, renderProperties );
if (nPages >= nCurrentPage)
@@ -150,6 +158,14 @@ Size DocumentToGraphicRenderer::getDocumentSizeIn100mm(sal_Int32 nCurrentPage,
{
aResult[nProperty].Value >>= aPos;
}
+ else if (aResult[nProperty].Name == "CalcPagePos")
+ {
+ aResult[nProperty].Value >>= aCalcPos;
+ }
+ else if (aResult[nProperty].Name == "CalcPageContentSize")
+ {
+ aResult[nProperty].Value >>= aCalcPageSize;
+ }
}
}
@@ -157,6 +173,14 @@ Size DocumentToGraphicRenderer::getDocumentSizeIn100mm(sal_Int32 nCurrentPage,
{
*pDocumentPosition = Point(aPos.X, aPos.Y);
}
+ if (pCalcPagePosition)
+ {
+ *pCalcPagePosition = Point(aCalcPos.X, aCalcPos.Y);
+ }
+ if (pCalcPageSize)
+ {
+ *pCalcPageSize = Size(aCalcPageSize.Width, aCalcPageSize.Height);
+ }
return Size( aSize.Width, aSize.Height );
}
@@ -245,7 +269,7 @@ sal_Int32 DocumentToGraphicRenderer::getCurrentPage()
if (hasSelection())
return 1;
- if (mbIsWriter)
+ if (isWriter())
return getCurrentPageWriter();
/* TODO: other application specific page detection? */
@@ -306,4 +330,28 @@ bool DocumentToGraphicRenderer::isShapeSelected(
return bShape;
}
+bool DocumentToGraphicRenderer::isWriter() const
+{
+ if (meDocType == WRITER)
+ return true;
+ else
+ return false;
+}
+
+bool DocumentToGraphicRenderer::isCalc() const
+{
+ if (meDocType == CALC)
+ return true;
+ else
+ return false;
+}
+
+bool DocumentToGraphicRenderer::isImpress() const
+{
+ if (meDocType == IMPRESS)
+ return true;
+ else
+ return false;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list