[Libreoffice-commits] core.git: svx/inc svx/source vcl/inc vcl/source

Armin Le Grand alg at apache.org
Fri Mar 15 16:43:19 PDT 2013


 svx/inc/svx/svdpntv.hxx       |    9 +++
 svx/source/svdraw/svdfmtf.cxx |  109 +++++++++++++++++++++++++++---------------
 svx/source/svdraw/svdpntv.cxx |   30 ++++++++++-
 svx/source/svdraw/svdxcgv.cxx |   36 +++++--------
 vcl/inc/vcl/svgdata.hxx       |    3 -
 vcl/source/gdi/impgraph.cxx   |    4 -
 vcl/source/gdi/svgdata.cxx    |    5 +
 7 files changed, 126 insertions(+), 70 deletions(-)

New commits:
commit 33b4c9938ddcf5555b55088531cce3f2493c1459
Author: Armin Le Grand <alg at apache.org>
Date:   Mon May 14 14:21:26 2012 +0000

    Resolves: #i119125# various actions implemented, clipping added.
    
    Esp hard was ImpSdrGDIMetaFileImport, but working now. Needed to hand-craft
    alpha addition for alpha in Metafile content and gradient of action. Also added
    better BitmapEx creation for convert to bitmap for draw objects.
    
    Conflicts:
    	svx/source/svdraw/svdxcgv.cxx
    	vcl/source/gdi/impgraph.cxx
    
    Change-Id: Ic6ac9fb3132dd122e16a5cd8f9c5ddd155ec9882

diff --git a/svx/inc/svx/svdpntv.hxx b/svx/inc/svx/svdpntv.hxx
index eca5710f..2e9bc25 100644
--- a/svx/inc/svx/svdpntv.hxx
+++ b/svx/inc/svx/svdpntv.hxx
@@ -113,6 +113,15 @@ private:
 class SdrPaintWindow;
 typedef ::std::vector< SdrPaintWindow* > SdrPaintWindowVector;
 
+//////////////////////////////////////////////////////////////////////////////
+// helper to convert any GDIMetaFile to a good quality BitmapEx,
+// using default parameters and graphic::XPrimitive2DRenderer
+
+BitmapEx SVX_DLLPUBLIC convertMetafileToBitmapEx(
+    const GDIMetaFile& rMtf,
+    const basegfx::B2DRange& rTargetRange,
+    const sal_uInt32 nMaximumQuadraticPixels = 500000);
+
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
 class SVX_DLLPUBLIC SdrPaintView : public SfxListener, public SfxRepeatTarget, public SfxBroadcaster, public ::utl::ConfigurationListener
diff --git a/svx/source/svdraw/svdfmtf.cxx b/svx/source/svdraw/svdfmtf.cxx
index 4d9af43..583e54c 100644
--- a/svx/source/svdraw/svdfmtf.cxx
+++ b/svx/source/svdraw/svdfmtf.cxx
@@ -65,8 +65,9 @@
 #include <svx/xbtmpit.hxx>
 #include <svx/xfltrit.hxx>
 #include <vcl/bmpacc.hxx>
-#include <vcl/svgdata.hxx>
-#include <drawinglayer/primitive2d/metafileprimitive2d.hxx>
+#include <svx/xflbmtit.hxx>
+#include <svx/xflbstit.hxx>
+#include <svx/svdpntv.hxx>
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -513,6 +514,8 @@ void ImpSdrGDIMetaFileImport::InsertObj(SdrObject* pObj, bool bScale)
 
                     pObj->SetMergedItem(XFillStyleItem(XFILL_BITMAP));
                     pObj->SetMergedItem(XFillBitmapItem(String(), Graphic(aClippedBitmap)));
+                    pObj->SetMergedItem(XFillBmpTileItem(false));
+                    pObj->SetMergedItem(XFillBmpStretchItem(true));
                 }
             }
         }
@@ -1399,21 +1402,16 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaFloatTransparentAction& rAct)
 
     if(rMtf.GetActionSize())
     {
-        Rectangle aRect(rAct.GetPoint(),rAct.GetSize());
-        aRect.Right()++; aRect.Bottom()++;
-
-        // get metafile content as bitmap
-        const basegfx::B2DRange aTargetRange(
-            aRect.Left(), aRect.Top(), aRect.Right(), aRect.Bottom());
-        const drawinglayer::primitive2d::Primitive2DReference aMtf(
-            new drawinglayer::primitive2d::MetafilePrimitive2D(
-                basegfx::tools::createScaleTranslateB2DHomMatrix(
-                    aTargetRange.getRange(),
-                    aTargetRange.getMinimum()),
-                rMtf));
-        BitmapEx aBitmapEx(convertPrimitive2DSequenceToBitmapEx(
-            drawinglayer::primitive2d::Primitive2DSequence(&aMtf, 1),
-            aTargetRange));
+        const Rectangle aRect(rAct.GetPoint(),rAct.GetSize());
+
+        // convert metafile sub-content to BitmapEx
+        BitmapEx aBitmapEx(
+            convertMetafileToBitmapEx(
+                rMtf,
+                basegfx::B2DRange(
+                    aRect.Left(), aRect.Top(),
+                    aRect.Right(), aRect.Bottom()),
+                125000));
 
         // handle colors
         const Gradient& rGradient = rAct.GetGradient();
@@ -1435,12 +1433,14 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaFloatTransparentAction& rAct)
         bool bCreateObject(true);
         bool bHasNewMask(false);
         AlphaMask aNewMask;
+        double fTransparence(0.0);
+        bool bFixedTransparence(false);
 
         if(bEqualColors || bNoSteps)
         {
             // single transparence
             const basegfx::BColor aMedium(basegfx::average(aStart, aEnd));
-            const double fTransparence(aMedium.luminance());
+            fTransparence = aMedium.luminance();
 
             if(basegfx::fTools::lessOrEqual(fTransparence, 0.0))
             {
@@ -1453,11 +1453,8 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaFloatTransparentAction& rAct)
             }
             else
             {
-                // 0.0 < transparence < 1.0, apply
-                sal_uInt8 aAlpha(basegfx::fround(fTransparence * 255.0));
-
-                aNewMask = AlphaMask(aBitmapEx.GetBitmap().GetSizePixel(), &aAlpha);
-                bHasNewMask = true;
+                // 0.0 < transparence < 1.0, apply fixed transparence
+                bFixedTransparence = true;
             }
         }
         else
@@ -1474,11 +1471,18 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaFloatTransparentAction& rAct)
 
         if(bCreateObject)
         {
-            if(bHasNewMask)
+            if(bHasNewMask || bFixedTransparence)
             {
                 if(!aBitmapEx.IsAlpha() && !aBitmapEx.IsTransparent())
                 {
                     // no transparence yet, apply new one
+                    if(bFixedTransparence)
+                    {
+                        sal_uInt8 aAlpha(basegfx::fround(fTransparence * 255.0));
+
+                        aNewMask = AlphaMask(aBitmapEx.GetBitmap().GetSizePixel(), &aAlpha);
+                    }
+
                     aBitmapEx = BitmapEx(aBitmapEx.GetBitmap(), aNewMask);
                 }
                 else
@@ -1499,40 +1503,69 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaFloatTransparentAction& rAct)
                         aOldMask = aBitmapEx.GetBitmap().CreateMask(aBitmapEx.GetTransparentColor());
                     }
 
-                    BitmapReadAccess* pOld = aOldMask.AcquireReadAccess();
-                    BitmapWriteAccess* pNew = aNewMask.AcquireWriteAccess();
+                    BitmapWriteAccess* pOld = aOldMask.AcquireWriteAccess();
 
-                    if(pOld && pNew)
+                    if(pOld)
                     {
-                        if(pOld->Width() == pNew->Width() && pOld->Height() == pNew->Height())
+                        const double fFactor(1.0 / 255.0);
+
+                        if(bFixedTransparence)
                         {
-                            for(sal_uInt32 y(0); y < pNew->Height(); y++)
+                            const double fOpNew(1.0 - fTransparence);
+
+                            for(sal_uInt32 y(0); y < pOld->Height(); y++)
                             {
-                                for(sal_uInt32 x(0); x < pNew->Width(); x++)
+                                for(sal_uInt32 x(0); x < pOld->Width(); x++)
                                 {
-                                    const BitmapColor aColOld(pOld->GetPixel(y, x));
-                                    const BitmapColor aColNew(pNew->GetPixel(y, x));
-                                    const sal_uInt16 aCombine(sal_uInt16(aColOld.GetIndex()) + sal_uInt16(aColNew.GetIndex()));
+                                    const double fOpOld(1.0 - (pOld->GetPixel(y, x).GetIndex() * fFactor));
+                                    const sal_uInt8 aCol(basegfx::fround((1.0 - (fOpOld * fOpNew)) * 255.0));
 
-                                    pNew->SetPixel(y, x, BitmapColor(aCombine > 255 ? 255 : sal_uInt8(aCombine)));
+                                    pOld->SetPixel(y, x, BitmapColor(aCol));
                                 }
                             }
                         }
                         else
                         {
-                            OSL_ENSURE(false, "Alpha masks have different sizes (!)");
+                            BitmapReadAccess* pNew = aNewMask.AcquireReadAccess();
+
+                            if(pNew)
+                            {
+                                if(pOld->Width() == pNew->Width() && pOld->Height() == pNew->Height())
+                                {
+                                    for(sal_uInt32 y(0); y < pOld->Height(); y++)
+                                    {
+                                        for(sal_uInt32 x(0); x < pOld->Width(); x++)
+                                        {
+                                            const double fOpOld(1.0 - (pOld->GetPixel(y, x).GetIndex() * fFactor));
+                                            const double fOpNew(1.0 - (pNew->GetPixel(y, x).GetIndex() * fFactor));
+                                            const sal_uInt8 aCol(basegfx::fround((1.0 - (fOpOld * fOpNew)) * 255.0));
+
+                                            pOld->SetPixel(y, x, BitmapColor(aCol));
+                                        }
+                                    }
+                                }
+                                else
+                                {
+                                    OSL_ENSURE(false, "Alpha masks have different sizes (!)");
+                                }
+
+                                aNewMask.ReleaseAccess(pNew);
+                            }
+                            else
+                            {
+                                OSL_ENSURE(false, "Got no access to new alpha mask (!)");
+                            }
                         }
 
                         aOldMask.ReleaseAccess(pOld);
-                        aNewMask.ReleaseAccess(pNew);
                     }
                     else
                     {
-                        OSL_ENSURE(false, "Got no access to alpha bitmaps (!)");
+                        OSL_ENSURE(false, "Got no access to old alpha mask (!)");
                     }
 
                     // apply combined bitmap as mask
-                    aBitmapEx = BitmapEx(aBitmapEx.GetBitmap(), aNewMask);
+                    aBitmapEx = BitmapEx(aBitmapEx.GetBitmap(), aOldMask);
                 }
             }
 
diff --git a/svx/source/svdraw/svdpntv.cxx b/svx/source/svdraw/svdpntv.cxx
index 3f53923..6e9993a 100644
--- a/svx/source/svdraw/svdpntv.cxx
+++ b/svx/source/svdraw/svdpntv.cxx
@@ -54,11 +54,11 @@
 #include <vcl/svapp.hxx>
 #include <com/sun/star/awt/PosSize.hpp>
 #include <com/sun/star/awt/XControl.hpp>
-
-// #i38135#
 #include <svx/sdr/contact/objectcontact.hxx>
 #include <svx/sdr/animation/objectanimator.hxx>
 #include <svx/sdr/contact/viewcontact.hxx>
+#include <drawinglayer/primitive2d/metafileprimitive2d.hxx>
+#include <basegfx/matrix/b2dhommatrixtools.hxx>
 
 using namespace ::rtl;
 using namespace ::com::sun::star;
@@ -136,6 +136,32 @@ SvxViewHint::HintType SvxViewHint::GetHintType (void) const
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
+BitmapEx convertMetafileToBitmapEx(
+    const GDIMetaFile& rMtf,
+    const basegfx::B2DRange& rTargetRange,
+    const sal_uInt32 nMaximumQuadraticPixels)
+{
+    BitmapEx aBitmapEx;
+
+    if(rMtf.GetActionSize())
+    {
+        const drawinglayer::primitive2d::Primitive2DReference aMtf(
+            new drawinglayer::primitive2d::MetafilePrimitive2D(
+                basegfx::tools::createScaleTranslateB2DHomMatrix(
+                    rTargetRange.getRange(),
+                    rTargetRange.getMinimum()),
+                rMtf));
+        aBitmapEx = convertPrimitive2DSequenceToBitmapEx(
+            drawinglayer::primitive2d::Primitive2DSequence(&aMtf, 1),
+            rTargetRange,
+            nMaximumQuadraticPixels);
+    }
+
+    return aBitmapEx;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
 TYPEINIT2(SdrPaintView,SfxListener,SfxRepeatTarget);
 
 DBG_NAME(SdrPaintView);
diff --git a/svx/source/svdraw/svdxcgv.cxx b/svx/source/svdraw/svdxcgv.cxx
index 6256e23..a85b378 100644
--- a/svx/source/svdraw/svdxcgv.cxx
+++ b/svx/source/svdraw/svdxcgv.cxx
@@ -19,11 +19,12 @@
 
 #include <vector>
 #include <editeng/editeng.hxx>
-#include "svx/xexch.hxx"
+#include <rtl/strbuf.hxx>
+#include <svx/xexch.hxx>
 #include <svx/xflclit.hxx>
 #include <svx/svdxcgv.hxx>
 #include <svx/svdoutl.hxx>
-#include "svx/svditext.hxx"
+#include <svx/svditext.hxx>
 #include <svx/svdetc.hxx>
 #include <svx/svdundo.hxx>
 #include <svx/svdograf.hxx>
@@ -42,16 +43,11 @@
 #include <svl/itempool.hxx>
 #include <tools/bigint.hxx>
 #include <sot/formats.hxx>
-
-// #i13033#
 #include <clonelist.hxx>
 #include <vcl/virdev.hxx>
-
 #include <svl/style.hxx>
-
-// #i72535#
-#include "fmobj.hxx"
-#include <rtl/strbuf.hxx>
+#include <fmobj.hxx>
+#include <vcl/svgdata.hxx>
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -442,8 +438,6 @@ void SdrExchangeView::ImpPasteObject(SdrObject* pObj, SdrObjList& rLst, const Po
     }
 }
 
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
 BitmapEx SdrExchangeView::GetMarkedObjBitmapEx(bool bNoVDevIfOneBmpMarked) const
 {
     BitmapEx aBmp;
@@ -475,18 +469,14 @@ BitmapEx SdrExchangeView::GetMarkedObjBitmapEx(bool bNoVDevIfOneBmpMarked) const
 
         if( !aBmp )
         {
-            const Graphic aGraphic(GetMarkedObjMetaFile(bNoVDevIfOneBmpMarked));
-
-            // #i102089# support user's settings of AA and LineSnap when the MetaFile gets
-            // raster-converted to a bitmap
-            const SvtOptionsDrawinglayer aDrawinglayerOpt;
-            const GraphicConversionParameters aParameters(
-                Size(),
-                false,
-                aDrawinglayerOpt.IsAntiAliasing(),
-                aDrawinglayerOpt.IsSnapHorVerLinesToDiscrete());
-
-            aBmp = aGraphic.GetBitmapEx(aParameters);
+            const GDIMetaFile aGDIMetaFile(GetMarkedObjMetaFile(bNoVDevIfOneBmpMarked));
+            const Rectangle aBound(GetMarkedObjBoundRect());
+
+            aBmp = convertMetafileToBitmapEx(
+                aGDIMetaFile,
+                basegfx::B2DRange(
+                    aBound.Left(), aBound.Top(),
+                    aBound.Right(), aBound.Bottom()));
         }
     }
 
diff --git a/vcl/inc/vcl/svgdata.hxx b/vcl/inc/vcl/svgdata.hxx
index eaba004..8de8d3a 100644
--- a/vcl/inc/vcl/svgdata.hxx
+++ b/vcl/inc/vcl/svgdata.hxx
@@ -40,7 +40,8 @@ typedef ::com::sun::star::uno::Sequence< Primitive2DReference > Primitive2DSeque
 
 BitmapEx VCL_DLLPUBLIC convertPrimitive2DSequenceToBitmapEx(
     const Primitive2DSequence& rSequence,
-    const basegfx::B2DRange& rTargetRange);
+    const basegfx::B2DRange& rTargetRange,
+    const sal_uInt32 nMaximumQuadraticPixels = 500000);
 
 //////////////////////////////////////////////////////////////////////////////
 
diff --git a/vcl/source/gdi/impgraph.cxx b/vcl/source/gdi/impgraph.cxx
index 2421bcb..fc161a2 100644
--- a/vcl/source/gdi/impgraph.cxx
+++ b/vcl/source/gdi/impgraph.cxx
@@ -25,9 +25,7 @@
 #include <tools/debug.hxx>
 #include <tools/stream.hxx>
 #include <tools/helpers.hxx>
-
 #include <ucbhelper/content.hxx>
-
 #include <unotools/ucbstreamhelper.hxx>
 #include <unotools/tempfile.hxx>
 #include <vcl/outdev.hxx>
@@ -36,9 +34,7 @@
 #include <vcl/cvtgrf.hxx>
 #include <vcl/graph.hxx>
 #include <vcl/metaact.hxx>
-
 #include <impgraph.hxx>
-
 #include <com/sun/star/ucb/CommandAbortedException.hpp>
 
 // -----------
diff --git a/vcl/source/gdi/svgdata.cxx b/vcl/source/gdi/svgdata.cxx
index 9772e92..1db7c37 100644
--- a/vcl/source/gdi/svgdata.cxx
+++ b/vcl/source/gdi/svgdata.cxx
@@ -37,7 +37,8 @@ using namespace ::com::sun::star;
 
 BitmapEx VCL_DLLPUBLIC convertPrimitive2DSequenceToBitmapEx(
     const Primitive2DSequence& rSequence,
-    const basegfx::B2DRange& rTargetRange)
+    const basegfx::B2DRange& rTargetRange,
+    const sal_uInt32 nMaximumQuadraticPixels)
 {
     BitmapEx aRetval;
 
@@ -72,7 +73,7 @@ BitmapEx VCL_DLLPUBLIC convertPrimitive2DSequenceToBitmapEx(
                         aDPI.getWidth(),
                         aDPI.getHeight(),
                         aRealRect,
-                        500000));
+                        nMaximumQuadraticPixels));
 
                 if(xBitmap.is())
                 {


More information about the Libreoffice-commits mailing list