[Libreoffice-commits] core.git: Branch 'libreoffice-4-0' - 2 commits - cui/Library_cui.mk cui/source svx/inc svx/source

David Tardon dtardon at redhat.com
Tue Feb 19 01:42:59 PST 2013


 cui/Library_cui.mk            |    1 
 cui/source/dialogs/about.cxx  |  123 ++++++++++++++++++++++++++++++++++--------
 svx/inc/svx/svdundo.hxx       |    9 +++
 svx/source/svdraw/svdundo.cxx |   62 ++++++++++++++++++++-
 4 files changed, 173 insertions(+), 22 deletions(-)

New commits:
commit 3432c63c0cdcdfe3e74702c16ce6c746d9c0fdf4
Author: David Tardon <dtardon at redhat.com>
Date:   Wed Feb 13 08:52:52 2013 +0100

    fdo#34548 don't crash on undoing text frame removal
    
    Change-Id: I48b95c6c0cbfb2f4c4b09cc90b254b96de40b3e9
    (cherry picked from commit 115054fef08998c56cba8f14472df1d15007f635)
    Reviewed-on: https://gerrit.libreoffice.org/2232
    Reviewed-by: Thorsten Behrens <tbehrens at suse.com>
    Tested-by: Thorsten Behrens <tbehrens at suse.com>

diff --git a/svx/inc/svx/svdundo.hxx b/svx/inc/svx/svdundo.hxx
index 0d3713e..2221164 100644
--- a/svx/inc/svx/svdundo.hxx
+++ b/svx/inc/svx/svdundo.hxx
@@ -253,6 +253,10 @@ public:
 //************************************************************
 
 class SVX_DLLPUBLIC SdrUndoObjList : public SdrUndoObj {
+    class ObjListListener;
+    friend class ObjListListener;
+
+private:
     bool                        bOwner;
 
 protected:
@@ -262,6 +266,7 @@ protected:
     sal_uInt32                      nOrdNum;
     // Bei einem Undo/Redo findet moeglicherweise Uebereignung des Objektes
     // statt. Im Dtor wird das Obj deleted, wenn bOwner==TRUE
+    ObjListListener*            m_pListener;
 
 protected:
     SdrUndoObjList(SdrObject& rNewObj, bool bOrdNumDirect = false);
@@ -270,6 +275,10 @@ protected:
     void SetView(SdrView* pView1, SdrPageView* pPageView1) { pView=pView1; pPageView=pPageView1; }
     bool IsOwner() { return bOwner; }
     void SetOwner(bool bNew);
+
+private:
+    sal_uInt32 GetOrdNum() const;
+    void SetOrdNum(sal_uInt32 nOrdNum_);
 };
 
 //************************************************************
diff --git a/svx/source/svdraw/svdundo.cxx b/svx/source/svdraw/svdundo.cxx
index 452761d..c1e4b4d 100644
--- a/svx/source/svdraw/svdundo.cxx
+++ b/svx/source/svdraw/svdundo.cxx
@@ -18,6 +18,8 @@
  */
 
 
+#include <svl/lstner.hxx>
+
 #include <svx/svdundo.hxx>
 #include "svx/svditext.hxx"
 #include <svx/svdotext.hxx>
@@ -655,11 +657,55 @@ OUString SdrUndoGeoObj::GetComment() const
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
+class SdrUndoObjList::ObjListListener : public SfxListener
+{
+public:
+    ObjListListener(SdrUndoObjList& rThat, SdrObject& rObject, SfxBroadcaster& rBroadcaster);
+    ~ObjListListener();
+
+private:
+    virtual void Notify(SfxBroadcaster& rBroadcaster, const SfxHint& rHint);
+
+private:
+    SdrUndoObjList& m_rThat;
+    SdrObject& m_rObject;
+    SfxBroadcaster* m_pBroadcaster;
+};
+
+SdrUndoObjList::ObjListListener::ObjListListener(SdrUndoObjList& rThat, SdrObject& rObject, SfxBroadcaster& rBroadcaster)
+    : m_rThat(rThat)
+    , m_rObject(rObject)
+    , m_pBroadcaster(&rBroadcaster)
+{
+    StartListening(*m_pBroadcaster);
+}
+
+SdrUndoObjList::ObjListListener::~ObjListListener()
+{
+    if (m_pBroadcaster)
+        EndListening(*m_pBroadcaster);
+}
+
+void SdrUndoObjList::ObjListListener::Notify(SfxBroadcaster&, const SfxHint& rHint)
+{
+    const SdrHint* const pSdrHint(dynamic_cast<const SdrHint*>(&rHint));
+    if (pSdrHint)
+    {
+        if ((pSdrHint->GetObject() == &m_rObject) && (pSdrHint->GetKind() == HINT_OBJCHG))
+        {
+            const sal_uInt32 nNewOrdNum(m_rObject.GetOrdNum());
+            if (nNewOrdNum != m_rThat.GetOrdNum())
+                m_rThat.SetOrdNum(nNewOrdNum);
+        }
+    }
+}
+
 SdrUndoObjList::SdrUndoObjList(SdrObject& rNewObj, bool bOrdNumDirect)
 :   SdrUndoObj(rNewObj),
     bOwner(sal_False),
     pView(NULL),
-    pPageView(NULL)
+    pPageView(NULL),
+    m_pListener(NULL)
 {
     pObjList=pObj->GetObjList();
     if (bOrdNumDirect) {
@@ -667,10 +713,14 @@ SdrUndoObjList::SdrUndoObjList(SdrObject& rNewObj, bool bOrdNumDirect)
     } else {
         nOrdNum=pObj->GetOrdNum();
     }
+
+    m_pListener = new ObjListListener(*this, *pObj, *pObjList->GetModel());
 }
 
 SdrUndoObjList::~SdrUndoObjList()
 {
+    delete m_pListener;
+
     if (pObj!=NULL && IsOwner())
     {
         // Attribute have to go back to the regular Pool
@@ -686,6 +736,16 @@ void SdrUndoObjList::SetOwner(bool bNew)
     bOwner = bNew;
 }
 
+sal_uInt32 SdrUndoObjList::GetOrdNum() const
+{
+    return nOrdNum;
+}
+
+void SdrUndoObjList::SetOrdNum(sal_uInt32 nOrdNum_)
+{
+    nOrdNum = nOrdNum_;
+}
+
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
 void SdrUndoRemoveObj::Undo()
commit d35dd1dbd89e390eb1bcfa50e2f02e7c65bdb0ab
Author: Thorsten Behrens <tbehrens at suse.com>
Date:   Thu Jan 31 23:59:10 2013 +0100

    Fix fdo#59970 slowless of about box rendering
    
    Prevent creation of transparent bitmap at arbitrary scale, and
    subsequent scaling down. For remote X, that even has to fetch
    pixel back from remote side for manual scaling.
    
    Change-Id: I58e011231f2b81b913a6b02dd973385ef5664379
    
    Signed-off-by: Petr Mladek <pmladek at suse.cz>

diff --git a/cui/Library_cui.mk b/cui/Library_cui.mk
index 404e72f..b367ad1 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 2c9df74..f7332b9 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 );
 
 }


More information about the Libreoffice-commits mailing list