[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.0' - 3 commits - vcl/inc vcl/source vcl/uiconfig
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Mon Mar 11 23:39:04 UTC 2019
vcl/inc/svdata.hxx | 4
vcl/source/app/svmain.cxx | 3
vcl/source/gdi/FileDefinitionWidgetDraw.cxx | 146 +++++++++++++++-----------
vcl/uiconfig/theme_definitions/definition.xml | 2
4 files changed, 96 insertions(+), 59 deletions(-)
New commits:
commit fe4da4c2ec02159afe6206db78920e8fde7691d0
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Mon Mar 11 17:08:18 2019 +0100
Commit: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Tue Mar 12 00:38:24 2019 +0100
widget theme: change the tab item height to (min) 32 px
Change-Id: I1919300071a06242fe832880b46c944989daa4b6
Reviewed-on: https://gerrit.libreoffice.org/69057
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
(cherry picked from commit 212a40aaf7ec3316d5209b688f5f79821f99fbdc)
diff --git a/vcl/source/gdi/FileDefinitionWidgetDraw.cxx b/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
index a15010014aa4..06b85f9a2928 100644
--- a/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
+++ b/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
@@ -775,10 +775,12 @@ bool FileDefinitionWidgetDraw::getNativeControlRegion(
if (!pPart)
return false;
- rNativeBoundingRegion = tools::Rectangle(
- rBoundingControlRegion.TopLeft(),
- Size(rBoundingControlRegion.GetWidth() + pPart->mnMarginWidth,
- rBoundingControlRegion.GetHeight() + pPart->mnMarginHeight));
+ long nWidth = std::max(rBoundingControlRegion.GetWidth() + pPart->mnMarginWidth,
+ long(pPart->mnWidth));
+ long nHeight = std::max(rBoundingControlRegion.GetHeight() + pPart->mnMarginHeight,
+ long(pPart->mnHeight));
+
+ rNativeBoundingRegion = tools::Rectangle(aLocation, Size(nWidth, nHeight));
rNativeContentRegion = rNativeBoundingRegion;
return true;
}
diff --git a/vcl/uiconfig/theme_definitions/definition.xml b/vcl/uiconfig/theme_definitions/definition.xml
index e91953109554..5a4be114ea97 100644
--- a/vcl/uiconfig/theme_definitions/definition.xml
+++ b/vcl/uiconfig/theme_definitions/definition.xml
@@ -320,7 +320,7 @@
</progress>
<tabitem>
- <part value="Entire" margin-width="20" margin-height="6">
+ <part value="Entire" margin-width="8" height="32">
<state selected="false" extra="first">
<external source="tabitem-first.svgx" />
</state>
commit 7a6e7ed16ed57e131079ee79d06b03141117d9d7
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Mon Mar 11 16:52:37 2019 +0100
Commit: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Tue Mar 12 00:38:11 2019 +0100
better adjustment algorithm for dynamic sized widgets
A algorithm that gives better results for dynamically sized
widgets is to increase proportionally only the points in shapes
that are over the half of the widget width (or height, when
adjusting the other dimension). This preserves the margins and
doesn't distort the shape of the paths, which is especially
visible when the source needs to be largely resized in one
dimension only.
Change-Id: I2cceb249063387c0f7400ef8d75adb5899aa8c23
Reviewed-on: https://gerrit.libreoffice.org/69056
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
(cherry picked from commit 897f6f6252f38e93764aa0e72135768ab1ec3679)
diff --git a/vcl/source/gdi/FileDefinitionWidgetDraw.cxx b/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
index ae303d966897..a15010014aa4 100644
--- a/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
+++ b/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
@@ -168,24 +168,18 @@ void drawFromDrawCommands(gfx::DrawRoot const& rDrawRoot, SalGraphics& rGraphics
basegfx::B2DRange aInputRectangle(rRectangle.maRectangle);
+ double fDeltaX = aTargetSurface.getWidth() - aSVGRect.getWidth();
+ double fDeltaY = aTargetSurface.getHeight() - aSVGRect.getHeight();
+
basegfx::B2DRange aFinalRectangle(
- aTargetSurface.getMinX() + aInputRectangle.getMinX(),
- aTargetSurface.getMinY() + aInputRectangle.getMinY(),
- aTargetSurface.getMaxX() - (aSVGRect.getMaxX() - aInputRectangle.getMaxX()),
- aTargetSurface.getMaxY() - (aSVGRect.getMaxY() - aInputRectangle.getMaxY()));
-
- aInputRectangle.transform(basegfx::utils::createTranslateB2DHomMatrix(
- -aInputRectangle.getMinX(), -aInputRectangle.getMinY()));
- aInputRectangle.transform(basegfx::utils::createScaleB2DHomMatrix(
- aFinalRectangle.getWidth() / aInputRectangle.getWidth(),
- aFinalRectangle.getHeight() / aInputRectangle.getHeight()));
- aInputRectangle.transform(basegfx::utils::createTranslateB2DHomMatrix(
- aFinalRectangle.getMinX() - 0.5,
- aFinalRectangle.getMinY()
- - 0.5)); // compensate 0.5 for different interpretation of where the center of a pixel is
+ aInputRectangle.getMinX(), aInputRectangle.getMinY(),
+ aInputRectangle.getMaxX() + fDeltaX, aInputRectangle.getMaxY() + fDeltaY);
+
+ aFinalRectangle.transform(basegfx::utils::createTranslateB2DHomMatrix(
+ aTargetSurface.getMinX() - 0.5, aTargetSurface.getMinY() - 0.5));
basegfx::B2DPolygon aB2DPolygon = basegfx::utils::createPolygonFromRect(
- aInputRectangle, rRectangle.mnRx / aFinalRectangle.getWidth() * 2.0,
+ aFinalRectangle, rRectangle.mnRx / aFinalRectangle.getWidth() * 2.0,
rRectangle.mnRy / aFinalRectangle.getHeight() * 2.0);
if (rRectangle.mpFillColor)
@@ -209,29 +203,27 @@ void drawFromDrawCommands(gfx::DrawRoot const& rDrawRoot, SalGraphics& rGraphics
{
auto const& rPath = static_cast<gfx::DrawPath const&>(*pDrawBase);
- basegfx::B2DRange aPolyPolygonRange(rPath.maPolyPolygon.getB2DRange());
- basegfx::B2DPolyPolygon aPolyPolygon(rPath.maPolyPolygon);
-
- basegfx::B2DRange aFinalRectangle(
- aTargetSurface.getMinX() + aPolyPolygonRange.getMinX(),
- aTargetSurface.getMinY() + aPolyPolygonRange.getMinY(),
- aTargetSurface.getMaxX() - (aSVGRect.getMaxX() - aPolyPolygonRange.getMaxX()),
- aTargetSurface.getMaxY() - (aSVGRect.getMaxY() - aPolyPolygonRange.getMaxY()));
-
- aPolyPolygon.transform(basegfx::utils::createTranslateB2DHomMatrix(
- -aPolyPolygonRange.getMinX(), -aPolyPolygonRange.getMinY()));
-
- double fScaleX = 1.0;
- double fScaleY = 1.0;
- if (aPolyPolygonRange.getWidth() > 0.0)
- fScaleX = aFinalRectangle.getWidth() / aPolyPolygonRange.getWidth();
- if (aPolyPolygonRange.getHeight() > 0.0)
- fScaleY = aFinalRectangle.getHeight() / aPolyPolygonRange.getHeight();
-
- aPolyPolygon.transform(basegfx::utils::createScaleB2DHomMatrix(fScaleX, fScaleY));
+ double fDeltaX = aTargetSurface.getWidth() - aSVGRect.getWidth();
+ double fDeltaY = aTargetSurface.getHeight() - aSVGRect.getHeight();
+ basegfx::B2DPolyPolygon aPolyPolygon(rPath.maPolyPolygon);
+ for (auto& rPolygon : aPolyPolygon)
+ {
+ for (size_t i = 0; i < rPolygon.count(); ++i)
+ {
+ auto& rPoint = rPolygon.getB2DPoint(i);
+ double x = rPoint.getX();
+ double y = rPoint.getY();
+
+ if (x > aSVGRect.getCenterX())
+ x = x + fDeltaX;
+ if (y > aSVGRect.getCenterY())
+ y = y + fDeltaY;
+ rPolygon.setB2DPoint(i, basegfx::B2DPoint(x, y));
+ }
+ }
aPolyPolygon.transform(basegfx::utils::createTranslateB2DHomMatrix(
- aFinalRectangle.getMinX() - 0.5, aFinalRectangle.getMinY() - 0.5));
+ aTargetSurface.getMinX() - 0.5, aTargetSurface.getMinY() - 0.5));
if (rPath.mpFillColor)
{
commit 8307ecbd6afd5012d46841d7bac34befea1b6d05
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Mon Mar 11 16:38:32 2019 +0100
Commit: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Tue Mar 12 00:37:49 2019 +0100
cache file based widget images and draw commands
It is wasteful to parse svg icons all the time so lets cache the
result when this make sense in a LRU map.
Change-Id: I95cc317c9301138a9e384d270223ba147a123e59
Reviewed-on: https://gerrit.libreoffice.org/69055
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
(cherry picked from commit 805b15ce536e3d6c40d0dc4f98b5aa6ffa5344c0)
diff --git a/vcl/inc/svdata.hxx b/vcl/inc/svdata.hxx
index f35ea6da1730..10051ec30660 100644
--- a/vcl/inc/svdata.hxx
+++ b/vcl/inc/svdata.hxx
@@ -40,6 +40,7 @@
#include <boost/functional/hash.hpp>
#include "ControlCacheKey.hxx"
#include "schedulerimpl.hxx"
+#include <basegfx/DrawCommands.hxx>
struct ImplPostEventData;
struct ImplTimerData;
@@ -191,6 +192,9 @@ struct ImplSVGDIData
long mnAppFontX = 0; // AppFont X-Numenator for 40/tel Width
long mnAppFontY = 0; // AppFont Y-Numenator for 80/tel Height
bool mbFontSubChanged = false; // true: FontSubstitution was changed between Begin/End
+
+ o3tl::lru_map<OUString, BitmapEx> maThemeImageCache = o3tl::lru_map<OUString, BitmapEx>(10);
+ o3tl::lru_map<OUString, gfx::DrawRoot> maThemeDrawCommandsCache = o3tl::lru_map<OUString, gfx::DrawRoot>(50);
};
struct ImplSVWinData
diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx
index 3a444e9c6119..cbf2f6b63054 100644
--- a/vcl/source/app/svmain.cxx
+++ b/vcl/source/app/svmain.cxx
@@ -701,6 +701,9 @@ void DeInitVCL()
delete pSVData->maGDIData.mpScreenFontCache;
pSVData->maGDIData.mpScreenFontCache = nullptr;
+ pSVData->maGDIData.maThemeDrawCommandsCache.clear();
+ pSVData->maGDIData.maThemeImageCache.clear();
+
// Deinit Sal
if (pSVData->mpDefInst)
{
diff --git a/vcl/source/gdi/FileDefinitionWidgetDraw.cxx b/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
index 0799c68d8775..ae303d966897 100644
--- a/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
+++ b/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
@@ -342,9 +342,26 @@ void munchDrawCommands(std::vector<std::shared_ptr<DrawCommand>> const& rDrawCom
nScaleFactor = comphelper::LibreOfficeKit::getDPIScale();
auto const& rDrawCommand = static_cast<ImageDrawCommand const&>(*pDrawCommand);
- SvFileStream aFileStream(rDrawCommand.msSource, StreamMode::READ);
+ auto& rCacheImages = ImplGetSVData()->maGDIData.maThemeImageCache;
+ OUString rCacheKey = rDrawCommand.msSource + "@" + OUString::number(nScaleFactor);
+ auto& aIterator = rCacheImages.find(rCacheKey);
+
BitmapEx aBitmap;
- vcl::bitmap::loadFromSvg(aFileStream, "", aBitmap, nScaleFactor);
+ if (aIterator == rCacheImages.end())
+ {
+ SvFileStream aFileStream(rDrawCommand.msSource, StreamMode::READ);
+
+ vcl::bitmap::loadFromSvg(aFileStream, "", aBitmap, nScaleFactor);
+ if (!!aBitmap)
+ {
+ rCacheImages.insert(std::make_pair(rCacheKey, aBitmap));
+ }
+ }
+ else
+ {
+ aBitmap = aIterator->second;
+ }
+
long nImageWidth = aBitmap.GetSizePixel().Width();
long nImageHeight = aBitmap.GetSizePixel().Height();
SalTwoRect aTR(0, 0, nImageWidth, nImageHeight, nX, nY, nImageWidth / nScaleFactor,
@@ -369,27 +386,46 @@ void munchDrawCommands(std::vector<std::shared_ptr<DrawCommand>> const& rDrawCom
case DrawCommandType::EXTERNAL:
{
auto const& rDrawCommand = static_cast<ImageDrawCommand const&>(*pDrawCommand);
- SvFileStream aFileStream(rDrawCommand.msSource, StreamMode::READ);
- uno::Reference<uno::XComponentContext> xContext(
- comphelper::getProcessComponentContext());
- const uno::Reference<graphic::XSvgParser> xSvgParser
- = graphic::SvgTools::create(xContext);
+ auto& rCacheDrawCommands = ImplGetSVData()->maGDIData.maThemeDrawCommandsCache;
- std::size_t nSize = aFileStream.remainingSize();
- std::vector<sal_Int8> aBuffer(nSize + 1);
- aFileStream.ReadBytes(aBuffer.data(), nSize);
- aBuffer[nSize] = 0;
+ auto& aIterator = rCacheDrawCommands.find(rDrawCommand.msSource);
- uno::Sequence<sal_Int8> aData(aBuffer.data(), nSize + 1);
- uno::Reference<io::XInputStream> aInputStream(
- new comphelper::SequenceInputStream(aData));
+ gfx::DrawRoot aDrawRoot;
- uno::Any aAny = xSvgParser->getDrawCommands(aInputStream, "");
- if (aAny.has<sal_uInt64>())
+ if (aIterator == rCacheDrawCommands.end())
+ {
+ SvFileStream aFileStream(rDrawCommand.msSource, StreamMode::READ);
+
+ uno::Reference<uno::XComponentContext> xContext(
+ comphelper::getProcessComponentContext());
+ const uno::Reference<graphic::XSvgParser> xSvgParser
+ = graphic::SvgTools::create(xContext);
+
+ std::size_t nSize = aFileStream.remainingSize();
+ std::vector<sal_Int8> aBuffer(nSize + 1);
+ aFileStream.ReadBytes(aBuffer.data(), nSize);
+ aBuffer[nSize] = 0;
+
+ uno::Sequence<sal_Int8> aData(aBuffer.data(), nSize + 1);
+ uno::Reference<io::XInputStream> aInputStream(
+ new comphelper::SequenceInputStream(aData));
+
+ uno::Any aAny = xSvgParser->getDrawCommands(aInputStream, "");
+ if (aAny.has<sal_uInt64>())
+ {
+ auto* pDrawRoot = reinterpret_cast<gfx::DrawRoot*>(aAny.get<sal_uInt64>());
+ if (pDrawRoot)
+ {
+ rCacheDrawCommands.insert(
+ std::make_pair(rDrawCommand.msSource, *pDrawRoot));
+ drawFromDrawCommands(*pDrawRoot, rGraphics, nX, nY, nWidth, nHeight);
+ }
+ }
+ }
+ else
{
- auto* pDrawRoot = reinterpret_cast<gfx::DrawRoot*>(aAny.get<sal_uInt64>());
- drawFromDrawCommands(*pDrawRoot, rGraphics, nX, nY, nWidth, nHeight);
+ drawFromDrawCommands(aIterator->second, rGraphics, nX, nY, nWidth, nHeight);
}
}
break;
More information about the Libreoffice-commits
mailing list