diff options
author | Chris Sherlock <chris.sherlock79@gmail.com> | 2020-05-11 07:28:22 +1000 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2020-05-14 10:13:23 +0200 |
commit | 6da4777b647157aa7ed65e271778bb00373098a0 (patch) | |
tree | 9e4dff150a54a0a8c1526fcbfcde49099aacf911 | |
parent | 879d293d2f7734d7de51e57532743a24a3dd322d (diff) |
vcl: move transparency checks into MetaAction and GDIMetaFile
I want to remove the final bits of meOutDevType but need to refactor
the function OutputDevice::RemoveTransparenciesFromMetaFile(). This
is the start.
Change-Id: I7c5330540fb396f033b40831b24028c7bfec4832
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93940
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
-rw-r--r-- | include/vcl/gdimtf.hxx | 2 | ||||
-rw-r--r-- | include/vcl/metaact.hxx | 10 | ||||
-rw-r--r-- | vcl/qa/cppunit/svm/svmtest.cxx | 1 | ||||
-rw-r--r-- | vcl/source/gdi/gdimtf.cxx | 25 | ||||
-rw-r--r-- | vcl/source/gdi/print2.cxx | 54 |
5 files changed, 41 insertions, 51 deletions
diff --git a/include/vcl/gdimtf.hxx b/include/vcl/gdimtf.hxx index 661caf863a22..3727f6531eff 100644 --- a/include/vcl/gdimtf.hxx +++ b/include/vcl/gdimtf.hxx @@ -118,6 +118,8 @@ public: void Scale( const Fraction& rScaleX, const Fraction& rScaleY ); void Rotate( long nAngle10 ); void Clip( const tools::Rectangle& ); + bool HasTransparentActions() const; + /* get the bound rect of the contained actions * caveats: * - clip actions will limit the contained actions, diff --git a/include/vcl/metaact.hxx b/include/vcl/metaact.hxx index 92592bd209dc..fad89ec4b838 100644 --- a/include/vcl/metaact.hxx +++ b/include/vcl/metaact.hxx @@ -88,6 +88,10 @@ public: virtual void Read( SvStream& rIStm, ImplMetaReadData* pData ); MetaActionType GetType() const { return mnType; } + /** \#i10613# Extracted from Printer::GetPreparedMetaFile. Returns true + if given action requires special transparency handling + */ + virtual bool IsTransparent() const { return false; } public: static MetaAction* ReadMetaAction( SvStream& rIStm, ImplMetaReadData* pData ); @@ -768,6 +772,7 @@ public: const BitmapEx& GetBitmapEx() const { return maBmpEx; } const Point& GetPoint() const { return maPt; } + bool IsTransparent() const override { return GetBitmapEx().IsTransparent(); } }; class VCL_DLLPUBLIC MetaBmpExScaleAction final : public MetaAction @@ -801,6 +806,7 @@ public: const BitmapEx& GetBitmapEx() const { return maBmpEx; } const Point& GetPoint() const { return maPt; } const Size& GetSize() const { return maSz; } + bool IsTransparent() const override { return GetBitmapEx().IsTransparent(); } }; class UNLESS_MERGELIBS(VCL_DLLPUBLIC) MetaBmpExScalePartAction final : public MetaAction @@ -839,6 +845,7 @@ public: const Size& GetDestSize() const { return maDstSz; } const Point& GetSrcPoint() const { return maSrcPt; } const Size& GetSrcSize() const { return maSrcSz; } + bool IsTransparent() const override { return GetBitmapEx().IsTransparent(); } }; class SAL_DLLPUBLIC_RTTI MetaMaskAction final : public MetaAction @@ -1523,6 +1530,8 @@ public: const tools::PolyPolygon& GetPolyPolygon() const { return maPolyPoly; } sal_uInt16 GetTransparence() const { return mnTransPercent; } + + bool IsTransparent() const override { return true; } }; class SAL_DLLPUBLIC_RTTI MetaFloatTransparentAction final : public MetaAction @@ -1558,6 +1567,7 @@ public: const Point& GetPoint() const { return maPoint; } const Size& GetSize() const { return maSize; } const Gradient& GetGradient() const { return maGradient; } + bool IsTransparent() const override { return true; } }; class VCL_DLLPUBLIC MetaEPSAction final : public MetaAction diff --git a/vcl/qa/cppunit/svm/svmtest.cxx b/vcl/qa/cppunit/svm/svmtest.cxx index 9f2629960cf5..413c3b7f69f4 100644 --- a/vcl/qa/cppunit/svm/svmtest.cxx +++ b/vcl/qa/cppunit/svm/svmtest.cxx @@ -1654,6 +1654,7 @@ void SvmTest::testTransparent() pVirtualDev->DrawTransparent(aPolygon, 50); + CPPUNIT_ASSERT(aGDIMetaFile.HasTransparentActions()); checkTransparent(writeAndReadStream(aGDIMetaFile)); checkTransparent(readFile("transparent.svm")); } diff --git a/vcl/source/gdi/gdimtf.cxx b/vcl/source/gdi/gdimtf.cxx index 2353af9e0d39..46a145750609 100644 --- a/vcl/source/gdi/gdimtf.cxx +++ b/vcl/source/gdi/gdimtf.cxx @@ -154,6 +154,31 @@ GDIMetaFile::~GDIMetaFile() Clear(); } +bool GDIMetaFile::HasTransparentActions() const +{ + MetaAction* pCurrAct; + + // watch for transparent drawing actions + for(pCurrAct = const_cast<GDIMetaFile*>(this)->FirstAction(); + pCurrAct; + pCurrAct = const_cast<GDIMetaFile*>(this)->NextAction()) + { + // #i10613# determine if the action is transparency capable + + // #107169# Also examine metafiles with masked bitmaps in + // detail. Further down, this is optimized in such a way + // that there's no unnecessary painting of masked bitmaps + // (which are _always_ subdivided into rectangular regions + // of uniform opacity): if a masked bitmap is printed over + // empty background, we convert to a plain bitmap with + // white background. + if (pCurrAct->IsTransparent()) + return true; + } + + return false; +} + size_t GDIMetaFile::GetActionSize() const { return m_aList.size(); diff --git a/vcl/source/gdi/print2.cxx b/vcl/source/gdi/print2.cxx index 927e40131f21..d60ba034742c 100644 --- a/vcl/source/gdi/print2.cxx +++ b/vcl/source/gdi/print2.cxx @@ -63,34 +63,6 @@ struct ConnectedComponents namespace { -/** \#i10613# Extracted from Printer::GetPreparedMetaFile. Returns true - if given action requires special transparency handling -*/ -bool IsTransparentAction( const MetaAction& rAct ) -{ - switch( rAct.GetType() ) - { - case MetaActionType::Transparent: - return true; - - case MetaActionType::FLOATTRANSPARENT: - return true; - - case MetaActionType::BMPEX: - return static_cast<const MetaBmpExAction&>(rAct).GetBitmapEx().IsTransparent(); - - case MetaActionType::BMPEXSCALE: - return static_cast<const MetaBmpExScaleAction&>(rAct).GetBitmapEx().IsTransparent(); - - case MetaActionType::BMPEXSCALEPART: - return static_cast<const MetaBmpExScalePartAction&>(rAct).GetBitmapEx().IsTransparent(); - - default: - return false; - } -} - - /** Determines whether the action can handle transparency correctly (i.e. when painted on white background, does the action still look correct)? @@ -657,28 +629,8 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, rOutMtf.Clear(); - if( ! bReduceTransparency || bTransparencyAutoMode ) - { - // watch for transparent drawing actions - for( pCurrAct = const_cast<GDIMetaFile&>(rInMtf).FirstAction(); - pCurrAct && !bTransparent; - pCurrAct = const_cast<GDIMetaFile&>(rInMtf).NextAction() ) - { - // #i10613# determine if the action is transparency capable - - // #107169# Also examine metafiles with masked bitmaps in - // detail. Further down, this is optimized in such a way - // that there's no unnecessary painting of masked bitmaps - // (which are _always_ subdivided into rectangular regions - // of uniform opacity): if a masked bitmap is printed over - // empty background, we convert to a plain bitmap with - // white background. - if( IsTransparentAction( *pCurrAct ) ) - { - bTransparent = true; - } - } - } + if(!bReduceTransparency || bTransparencyAutoMode) + bTransparent = rInMtf.HasTransparentActions(); // #i10613# Determine set of connected components containing transparent objects. These are // then processed as bitmaps, the original actions are removed from the metafile. @@ -991,7 +943,7 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, // prev component(s) special -> this one, too aTotalComponents.bIsSpecial = true; } - else if( !IsTransparentAction( *pCurrAct ) ) + else if(!pCurrAct->IsTransparent()) { // added action and none of prev components special -> // this one normal, too |