[Libreoffice-commits] core.git: drawinglayer/source include/drawinglayer

Noel Grandin noel.grandin at collabora.co.uk
Wed Jun 6 23:25:25 UTC 2018


 drawinglayer/source/texture/texture3d.cxx  |  100 +++++++++++++++++++++++------
 include/drawinglayer/texture/texture3d.hxx |    4 +
 2 files changed, 86 insertions(+), 18 deletions(-)

New commits:
commit b292a27698e85fd9d60c03613c3b0c67835c4dc1
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date:   Wed Jun 6 16:31:03 2018 +0200

    tdf#118029 crashtesting ooo24656-1.doc with --convert-to pdf
    
    Revert "dont use GetMask in GeoTexSvxBitmapEx"
    
    This reverts commit 63e65d1743264dfa26d2aba615d71978e65784e8.
    
    Until we come up with something better
    
    Change-Id: I246468abdd5e3ee917143e251c2e95430d84f77b
    Reviewed-on: https://gerrit.libreoffice.org/55385
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/drawinglayer/source/texture/texture3d.cxx b/drawinglayer/source/texture/texture3d.cxx
index 647b671c5ea7..0dac447ccf50 100644
--- a/drawinglayer/source/texture/texture3d.cxx
+++ b/drawinglayer/source/texture/texture3d.cxx
@@ -64,22 +64,39 @@ namespace drawinglayer
             const BitmapEx& rBitmapEx,
             const basegfx::B2DRange& rRange)
         :   maBitmapEx(rBitmapEx),
+            maTransparence(),
             maTopLeft(rRange.getMinimum()),
             maSize(rRange.getRange()),
             mfMulX(0.0),
             mfMulY(0.0),
-            mbIsAlpha(false)
+            mbIsAlpha(false),
+            mbIsTransparent(maBitmapEx.IsTransparent())
         {
-            if(maBitmapEx.IsTransparent())
+            // #121194# Todo: use alpha channel, too (for 3d)
+            maBitmap = maBitmapEx.GetBitmap();
+
+            if(mbIsTransparent)
             {
                 if(maBitmapEx.IsAlpha())
                 {
                     mbIsAlpha = true;
+                    maTransparence = rBitmapEx.GetAlpha().GetBitmap();
+                }
+                else
+                {
+                    maTransparence = rBitmapEx.GetMask();
                 }
+
+                mpReadTransparence = Bitmap::ScopedReadAccess(maTransparence);
             }
 
-            mfMulX = static_cast<double>(maBitmapEx.GetSizePixel().Width()) / maSize.getX();
-            mfMulY = static_cast<double>(maBitmapEx.GetSizePixel().Height()) / maSize.getY();
+            mpReadBitmap = Bitmap::ScopedReadAccess(maBitmap);
+            SAL_WARN_IF(!mpReadBitmap, "drawinglayer", "GeoTexSvxBitmapEx: Got no read access to Bitmap");
+            if (mpReadBitmap)
+            {
+                mfMulX = static_cast<double>(mpReadBitmap->Width()) / maSize.getX();
+                mfMulY = static_cast<double>(mpReadBitmap->Height()) / maSize.getY();
+            }
 
             if(maSize.getX() <= 1.0)
             {
@@ -96,20 +113,60 @@ namespace drawinglayer
         {
         }
 
-        sal_uInt8 GeoTexSvxBitmapEx::impGetTransparence(sal_Int32 nX, sal_Int32 nY) const
+        sal_uInt8 GeoTexSvxBitmapEx::impGetTransparence(sal_Int32 rX, sal_Int32 rY) const
         {
-            return maBitmapEx.GetTransparency(nX, nY);
+            switch(maBitmapEx.GetTransparentType())
+            {
+                case TransparentType::NONE:
+                {
+                    break;
+                }
+                case TransparentType::Color:
+                {
+                    const BitmapColor aBitmapColor(mpReadBitmap->GetColor(rY, rX));
+
+                    if(maBitmapEx.GetTransparentColor() == aBitmapColor.GetColor())
+                    {
+                        return 255;
+                    }
+
+                    break;
+                }
+                case TransparentType::Bitmap:
+                {
+                    OSL_ENSURE(mpReadTransparence, "OOps, transparence type Bitmap, but no read access created in the constructor (?)");
+                    const BitmapColor aBitmapColor(mpReadTransparence->GetPixel(rY, rX));
+
+                    if(mbIsAlpha)
+                    {
+                        return aBitmapColor.GetIndex();
+                    }
+                    else
+                    {
+                        if(0x00 != aBitmapColor.GetIndex())
+                        {
+                            return 255;
+                        }
+                    }
+                    break;
+                }
+            }
+
+            return 0;
         }
 
         bool GeoTexSvxBitmapEx::impIsValid(const basegfx::B2DPoint& rUV, sal_Int32& rX, sal_Int32& rY) const
         {
-            rX = static_cast<sal_Int32>((rUV.getX() - maTopLeft.getX()) * mfMulX);
-
-            if(rX >= 0 && rX < maBitmapEx.GetSizePixel().Width())
+            if(mpReadBitmap)
             {
-                rY = static_cast<sal_Int32>((rUV.getY() - maTopLeft.getY()) * mfMulY);
+                rX = static_cast<sal_Int32>((rUV.getX() - maTopLeft.getX()) * mfMulX);
+
+                if(rX >= 0 && rX < mpReadBitmap->Width())
+                {
+                    rY = static_cast<sal_Int32>((rUV.getY() - maTopLeft.getY()) * mfMulY);
 
-                return (rY >= 0 && rY < maBitmapEx.GetSizePixel().Height());
+                    return (rY >= 0 && rY < mpReadBitmap->Height());
+                }
             }
 
             return false;
@@ -122,7 +179,7 @@ namespace drawinglayer
             if(impIsValid(rUV, nX, nY))
             {
                 const double fConvertColor(1.0 / 255.0);
-                const ::Color aBMCol(maBitmapEx.GetPixelColor(nX, nY));
+                const BitmapColor aBMCol(mpReadBitmap->GetColor(nY, nX));
                 const basegfx::BColor aBSource(
                     static_cast<double>(aBMCol.GetRed()) * fConvertColor,
                     static_cast<double>(aBMCol.GetGreen()) * fConvertColor,
@@ -130,10 +187,10 @@ namespace drawinglayer
 
                 rBColor = aBSource;
 
-                if(maBitmapEx.IsTransparent())
+                if(mbIsTransparent)
                 {
                     // when we have a transparence, make use of it
-                    const sal_uInt8 aLuminance = aBMCol.GetTransparency();
+                    const sal_uInt8 aLuminance(impGetTransparence(nX, nY));
 
                     rfOpacity = (static_cast<double>(0xff - aLuminance) * (1.0 / 255.0));
                 }
@@ -154,7 +211,7 @@ namespace drawinglayer
 
             if(impIsValid(rUV, nX, nY))
             {
-                if(maBitmapEx.IsTransparent())
+                if(mbIsTransparent)
                 {
                     // this texture has an alpha part, use it
                     const sal_uInt8 aLuminance(impGetTransparence(nX, nY));
@@ -165,7 +222,8 @@ namespace drawinglayer
                 else
                 {
                     // this texture is a color bitmap used as transparence map
-                    const ::Color aColor(maBitmapEx.GetPixelColor(nX, nY));
+                    const BitmapColor aBMCol(mpReadBitmap->GetColor(nY, nX));
+                    const Color aColor(aBMCol.GetRed(), aBMCol.GetGreen(), aBMCol.GetBlue());
 
                     rfOpacity = (static_cast<double>(0xff - aColor.GetLuminance()) * (1.0 / 255.0));
                 }
@@ -238,12 +296,18 @@ namespace drawinglayer
 
         void GeoTexSvxBitmapExTiled::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& rfOpacity) const
         {
-            GeoTexSvxBitmapEx::modifyBColor(impGetCorrected(rUV), rBColor, rfOpacity);
+            if(mpReadBitmap)
+            {
+                GeoTexSvxBitmapEx::modifyBColor(impGetCorrected(rUV), rBColor, rfOpacity);
+            }
         }
 
         void GeoTexSvxBitmapExTiled::modifyOpacity(const basegfx::B2DPoint& rUV, double& rfOpacity) const
         {
-            GeoTexSvxBitmapEx::modifyOpacity(impGetCorrected(rUV), rfOpacity);
+            if(mpReadBitmap)
+            {
+                GeoTexSvxBitmapEx::modifyOpacity(impGetCorrected(rUV), rfOpacity);
+            }
         }
     } // end of namespace texture
 } // end of namespace drawinglayer
diff --git a/include/drawinglayer/texture/texture3d.hxx b/include/drawinglayer/texture/texture3d.hxx
index fda5b45b1a2f..628edb1ec670 100644
--- a/include/drawinglayer/texture/texture3d.hxx
+++ b/include/drawinglayer/texture/texture3d.hxx
@@ -60,12 +60,16 @@ namespace drawinglayer
         protected:
             BitmapEx                                    maBitmapEx;
             Bitmap                                      maBitmap;   // Bitmap held within maBitmapEx, to exist during mpReadBitmap scope
+            Bitmap::ScopedReadAccess                    mpReadBitmap;
+            Bitmap                                      maTransparence;
+            Bitmap::ScopedReadAccess                    mpReadTransparence;
             basegfx::B2DPoint                           maTopLeft;
             basegfx::B2DVector                          maSize;
             double                                      mfMulX;
             double                                      mfMulY;
 
             bool                                        mbIsAlpha : 1;
+            bool                                        mbIsTransparent : 1;
 
             // helpers
             bool impIsValid(const basegfx::B2DPoint& rUV, sal_Int32& rX, sal_Int32& rY) const;


More information about the Libreoffice-commits mailing list