summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cui/Library_cui.mk1
-rw-r--r--cui/source/dialogs/about.cxx123
2 files changed, 103 insertions, 21 deletions
diff --git a/cui/Library_cui.mk b/cui/Library_cui.mk
index 6e830b7aac95..1966b7fc1f33 100644
--- a/cui/Library_cui.mk
+++ b/cui/Library_cui.mk
@@ -50,6 +50,7 @@ $(eval $(call gb_Library_use_libraries,cui,\
comphelper \
cppu \
cppuhelper \
+ drawinglayer \
editeng \
i18nisolang1 \
jvmfwk \
diff --git a/cui/source/dialogs/about.cxx b/cui/source/dialogs/about.cxx
index 2c9df74420a7..f7332b991797 100644
--- a/cui/source/dialogs/about.cxx
+++ b/cui/source/dialogs/about.cxx
@@ -20,6 +20,7 @@
#include <vcl/svapp.hxx>
#include <vcl/msgbox.hxx>
+#include <osl/process.h>
#include <tools/stream.hxx>
#include <rtl/bootstrap.hxx>
#include <unotools/configmgr.hxx>
@@ -35,6 +36,13 @@
#include "comphelper/anytostring.hxx"
#include "cppuhelper/exc_hlp.hxx"
#include "cppuhelper/bootstrap.hxx"
+#include <com/sun/star/graphic/XPrimitive2DRenderer.hpp>
+#include <basegfx/numeric/ftools.hxx>
+#include <vcl/canvastools.hxx>
+#include <com/sun/star/geometry/RealRectangle2D.hpp>
+#include <com/sun/star/rendering/XIntegerReadOnlyBitmap.hpp>
+#include <basegfx/matrix/b2dhommatrixtools.hxx>
+#include <drawinglayer/primitive2d/transformprimitive2d.hxx>
#include <sfx2/sfxuno.hxx>
#include <sfx2/sfxcommands.h>
@@ -183,6 +191,91 @@ void AboutDialog::StyleControls()
aCancelButton.GrabFocus();
}
+static bool loadBrandSvg(const char *pName, BitmapEx &rBitmap, int nWidth )
+{
+ // Load from disk
+ // ---------------------------------------------------------------------
+ rtl::OUString aBaseName = ( rtl::OUString("/") +
+ rtl::OUString::createFromAscii( pName ) );
+ rtl::OUString aSvg( ".svg" );
+
+ rtl_Locale *pLoc = NULL;
+ osl_getProcessLocale (&pLoc);
+ LanguageTag aLanguageTag( *pLoc);
+
+ rtl::OUString aName = aBaseName + aSvg;
+ rtl::OUString aLocaleName = ( aBaseName + rtl::OUString("-") +
+ aLanguageTag.getBcp47() +
+ aSvg );
+ rtl::OUString uri = rtl::OUString::createFromAscii( "$BRAND_BASE_DIR/program" ) + aBaseName+aSvg;
+ rtl::Bootstrap::expandMacros( uri );
+ INetURLObject aObj( uri );
+ SvgData aSvgData(aObj.PathToFileName());
+
+ // transform into [0,0,width,width*aspect] std dimensions
+ // ---------------------------------------------------------------------
+ basegfx::B2DRange aRange(aSvgData.getRange());
+ const double fAspectRatio(aRange.getWidth()/aRange.getHeight());
+ basegfx::B2DHomMatrix aTransform(
+ basegfx::tools::createTranslateB2DHomMatrix(
+ -aRange.getMinX(),
+ -aRange.getMinY()));
+ aTransform.scale(
+ nWidth / aRange.getWidth(),
+ nWidth / fAspectRatio / aRange.getHeight());
+ const drawinglayer::primitive2d::Primitive2DReference xTransformRef(
+ new drawinglayer::primitive2d::TransformPrimitive2D(
+ aTransform,
+ aSvgData.getPrimitive2DSequence()));
+
+ // UNO dance to render from drawinglayer
+ // ---------------------------------------------------------------------
+ uno::Reference< lang::XMultiServiceFactory > xFactory(::comphelper::getProcessServiceFactory());
+ const rtl::OUString aServiceName("com.sun.star.graphic.Primitive2DTools");
+
+ try
+ {
+ const uno::Reference< graphic::XPrimitive2DRenderer > xPrimitive2DRenderer(
+ xFactory->createInstance(aServiceName),
+ uno::UNO_QUERY_THROW);
+
+ if(xPrimitive2DRenderer.is())
+ {
+ // cancel out rasterize's mm2pixel conversion
+ const double fFakeDPI=1000.0/2.54;
+
+ geometry::RealRectangle2D aRealRect(
+ 0, 0,
+ nWidth, nWidth / fAspectRatio);
+
+ const uno::Reference< rendering::XBitmap > xBitmap(
+ xPrimitive2DRenderer->rasterize(
+ drawinglayer::primitive2d::Primitive2DSequence(&xTransformRef, 1),
+ uno::Sequence< beans::PropertyValue >(),
+ fFakeDPI,
+ fFakeDPI,
+ aRealRect,
+ 500000));
+
+ if(xBitmap.is())
+ {
+ const uno::Reference< rendering::XIntegerReadOnlyBitmap> xIntBmp(xBitmap, uno::UNO_QUERY_THROW);
+
+ if(xIntBmp.is())
+ {
+ rBitmap = vcl::unotools::bitmapExFromXBitmap(xIntBmp);
+ return true;
+ }
+ }
+ }
+ }
+ catch(const uno::Exception&)
+ {
+ OSL_ENSURE(sal_False, "Got no graphic::XPrimitive2DRenderer (!)" );
+ }
+ return false;
+}
+
void AboutDialog::LayoutControls()
{
// Get the size of the screen
@@ -207,13 +300,13 @@ void AboutDialog::LayoutControls()
Size aLogoSize( aIdealTextWidth, aIdealTextWidth / 20 );
Point aLogoPos( 0, 0 );
- if( Application::LoadBrandSVG("flat_logo", aLogoBitmap) &&
+ // load svg logo, specify desired width, scale height isotrophically
+ if( loadBrandSvg("flat_logo",
+ aLogoBitmap,
+ aDialogSize.Width()) &&
!aLogoBitmap.IsEmpty() )
{
- const float aLogoWidthHeightRatio = (float)aLogoBitmap.GetSizePixel().Width() / (float)aLogoBitmap.GetSizePixel().Height();
- aLogoSize.Width() = aDialogSize.Width() ;
- aLogoSize.Height() = aLogoSize.Width() / aLogoWidthHeightRatio ;
- aLogoBitmap.Scale(aLogoSize);
+ aLogoSize = aLogoBitmap.GetSizePixel();
aLogoImage.SetImage( Image( aLogoBitmap ) );
aLogoImage.SetPosSizePixel( aLogoPos, aLogoSize );
@@ -274,22 +367,10 @@ void AboutDialog::LayoutControls()
// Layout background image
- if ( !(Application::GetSettings().GetStyleSettings().GetHighContrastMode()) &&
- Application::LoadBrandSVG("shell/about", aBackgroundBitmap) &&
- !aBackgroundBitmap.IsEmpty() )
- {
- const float aBackgroundWidthHeightRatio = (float)aBackgroundBitmap.GetSizePixel().Width() /
- (float)aBackgroundBitmap.GetSizePixel().Height();
- Size aBackgroundSize (aDialogSize.Width(), aDialogSize.Width() / aBackgroundWidthHeightRatio );
-
- if ( aBackgroundSize.Height() < aDialogSize.Height())
- {
- aBackgroundSize.Width() = aDialogSize.Height() * aBackgroundWidthHeightRatio ;
- aBackgroundSize.Height() = aDialogSize.Height();
- }
- aBackgroundBitmap.Scale(aBackgroundSize);
- }
-
+ if ( !(Application::GetSettings().GetStyleSettings().GetHighContrastMode()) )
+ loadBrandSvg("shell/about",
+ aBackgroundBitmap,
+ aDialogSize.Width());
SetOutputSizePixel( aDialogSize );
}