[Libreoffice-commits] core.git: include/oox include/vcl offapi/com oox/source svtools/source vcl/source

Muthu Subramanian sumuthu at suse.com
Wed Jul 17 00:20:50 PDT 2013


 include/oox/drawingml/fillproperties.hxx             |    1 
 include/oox/drawingml/fillpropertiesgroupcontext.hxx |   24 ++++++++++
 include/vcl/bitmap.hxx                               |    2 
 offapi/com/sun/star/graphic/XGraphicTransformer.idl  |    9 +++
 oox/source/drawingml/fillproperties.cxx              |   18 +++++++
 oox/source/drawingml/fillpropertiesgroupcontext.cxx  |   25 +++++++++++
 svtools/source/graphic/transformer.cxx               |   19 ++++++++
 svtools/source/graphic/transformer.hxx               |    5 ++
 vcl/source/gdi/bitmap4.cxx                           |   43 +++++++++++++++++++
 9 files changed, 145 insertions(+), 1 deletion(-)

New commits:
commit 8b716072410bcfd252739fb953d5ac198e27a895
Author: Muthu Subramanian <sumuthu at suse.com>
Date:   Wed Jul 17 12:59:40 2013 +0530

    n#820077: Import images with duotone filter.
    
    Also, contains implementation for a simple duotone filter.

diff --git a/include/oox/drawingml/fillproperties.hxx b/include/oox/drawingml/fillproperties.hxx
index fb9aa84..4a54fa3 100644
--- a/include/oox/drawingml/fillproperties.hxx
+++ b/include/oox/drawingml/fillproperties.hxx
@@ -93,6 +93,7 @@ struct BlipFillProperties
     OptValue< sal_Int32 > moContrast;           /// Contrast in the range [-100000,100000].
     Color               maColorChangeFrom;      /// Start color of color transformation.
     Color               maColorChangeTo;        /// Destination color of color transformation.
+    Color               maDuotoneColors[2];     /// Duotone Colors
 
     /** Overwrites all members that are explicitly set in rSourceProps. */
     void                assignUsed( const BlipFillProperties& rSourceProps );
diff --git a/include/oox/drawingml/fillpropertiesgroupcontext.hxx b/include/oox/drawingml/fillpropertiesgroupcontext.hxx
index 64980aa..139521b 100644
--- a/include/oox/drawingml/fillpropertiesgroupcontext.hxx
+++ b/include/oox/drawingml/fillpropertiesgroupcontext.hxx
@@ -76,6 +76,30 @@ private:
     PatternFillProperties& mrPatternProps;
 };
 
+ // ============================================================================
+
+/** Context handler that imports the a:duotone element containing the colors
+    of a bitmap duotone transformation. */
+class DuotoneContext : public ::oox::core::ContextHandler2
+{
+public:
+    explicit            DuotoneContext(
+                            ::oox::core::ContextHandler2Helper& rParent,
+                            const ::oox::AttributeList& rAttribs,
+                            BlipFillProperties& rBlipProps );
+    virtual             ~DuotoneContext();
+
+    virtual ::oox::core::ContextHandlerRef
+                        onCreateContext(
+                            sal_Int32 nElement,
+                            const ::oox::AttributeList& rAttribs ) SAL_OVERRIDE;
+
+private:
+    BlipFillProperties& mrBlipProps;
+    int                 mnColorIndex;
+};
+
+ // ============================================================================
 
 /** Context handler that imports the a:clrChange element containing the colors
     of a bitmap color change transformation. */
diff --git a/include/vcl/bitmap.hxx b/include/vcl/bitmap.hxx
index 49dd147..b386de2 100644
--- a/include/vcl/bitmap.hxx
+++ b/include/vcl/bitmap.hxx
@@ -120,6 +120,7 @@ enum BmpFilter
     BMP_FILTER_SEPIA = 6,
     BMP_FILTER_MOSAIC = 7,
     BMP_FILTER_POPART = 8,
+    BMP_FILTER_DUOTONE = 9,
 
     BMP_FILTER_UNKNOWN = 65535
 };
@@ -362,6 +363,7 @@ public:
 
     SAL_DLLPRIVATE bool                 ImplSeparableBlurFilter( const double aRadius = 0.7 );
     SAL_DLLPRIVATE bool                 ImplSeparableUnsharpenFilter( const double aRadius = 0.7 );
+    SAL_DLLPRIVATE bool                 ImplDuotoneFilter( const sal_uLong nColorOne,  sal_uLong nColorTwo );
     SAL_DLLPRIVATE void                 ImplBlurContributions( const int aSize, const int aNumberOfContributions,
                                                 double* pBlurVector, double*& pWeights, int*& pPixels, int*& pCount );
 public:
diff --git a/offapi/com/sun/star/graphic/XGraphicTransformer.idl b/offapi/com/sun/star/graphic/XGraphicTransformer.idl
index 11b2896..d1a6ddf 100644
--- a/offapi/com/sun/star/graphic/XGraphicTransformer.idl
+++ b/offapi/com/sun/star/graphic/XGraphicTransformer.idl
@@ -42,6 +42,15 @@ interface XGraphicTransformer : ::com::sun::star::uno::XInterface
     com::sun::star::graphic::XGraphic colorChange( [ in ] com::sun::star::graphic::XGraphic In,
         [ in ] long ColorFrom, [ in ] byte tolerance, [ in ] long ColorTo, [ in ] byte AlphaTo )
             raises( ::com::sun::star::lang::IllegalArgumentException );
+
+    /** applies Duotone effect
+
+        @returns
+            The modified graphic
+    */
+    com::sun::star::graphic::XGraphic applyDuotone( [ in ] com::sun::star::graphic::XGraphic In,
+        [ in ] long ColorOne, [ in ] long ColorTwo )
+            raises( ::com::sun::star::lang::IllegalArgumentException );
 };
 
 } ; } ; } ; } ;
diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx
index d1d097f..92b4b0a 100644
--- a/oox/source/drawingml/fillproperties.cxx
+++ b/oox/source/drawingml/fillproperties.cxx
@@ -149,6 +149,8 @@ void BlipFillProperties::assignUsed( const BlipFillProperties& rSourceProps )
     moContrast.assignIfUsed( rSourceProps.moContrast );
     maColorChangeFrom.assignIfUsed( rSourceProps.maColorChangeFrom );
     maColorChangeTo.assignIfUsed( rSourceProps.maColorChangeTo );
+    maDuotoneColors[0].assignIfUsed( rSourceProps.maDuotoneColors[0] );
+    maDuotoneColors[1].assignIfUsed( rSourceProps.maDuotoneColors[1] );
 }
 
 // ============================================================================
@@ -372,9 +374,23 @@ void FillProperties::pushToPropMap( ShapePropertyMap& rPropMap,
                 // do not start complex graphic transformation if property is not supported...
                 if( maBlipProps.mxGraphic.is() && rPropMap.supportsProperty( SHAPEPROP_FillBitmapUrl ) )
                 {
+                    Reference< XGraphic > xGraphic = maBlipProps.mxGraphic;
+                    if( maBlipProps.maDuotoneColors[0].isUsed() && maBlipProps.maDuotoneColors[1].isUsed() )
+                    {
+                        sal_Int32 nColor1 = maBlipProps.maDuotoneColors[0].getColor( rGraphicHelper, nPhClr );
+                        sal_Int32 nColor2 = maBlipProps.maDuotoneColors[1].getColor( rGraphicHelper, nPhClr );
+                        try
+                        {
+                            Reference< XGraphicTransformer > xTransformer( maBlipProps.mxGraphic, UNO_QUERY_THROW );
+                            xGraphic = xTransformer->applyDuotone( maBlipProps.mxGraphic, nColor1, nColor2 );
+                        }
+                        catch( Exception& )
+                        {
+                        }
+                    }
                     // TODO: "rotate with shape" is not possible with our current core
 
-                    OUString aGraphicUrl = rGraphicHelper.createGraphicObject( maBlipProps.mxGraphic );
+                    OUString aGraphicUrl = rGraphicHelper.createGraphicObject( xGraphic );
                     // push bitmap or named bitmap to property map
                     if( !aGraphicUrl.isEmpty() && rPropMap.setProperty( SHAPEPROP_FillBitmapUrl, aGraphicUrl ) )
                         eFillStyle = FillStyle_BITMAP;
diff --git a/oox/source/drawingml/fillpropertiesgroupcontext.cxx b/oox/source/drawingml/fillpropertiesgroupcontext.cxx
index 0d84d3a..8483e81 100644
--- a/oox/source/drawingml/fillpropertiesgroupcontext.cxx
+++ b/oox/source/drawingml/fillpropertiesgroupcontext.cxx
@@ -179,6 +179,9 @@ ContextHandlerRef BlipContext::onCreateContext(
         case A_TOKEN( clrChange ):
             return new ColorChangeContext( *this, rAttribs, mrBlipProps );
 
+        case A_TOKEN( duotone ):
+            return new DuotoneContext( *this, rAttribs, mrBlipProps );
+
         case A_TOKEN( lum ):
             mrBlipProps.moBrightness = rAttribs.getInteger( XML_bright );
             mrBlipProps.moContrast = rAttribs.getInteger( XML_contrast );
@@ -187,6 +190,28 @@ ContextHandlerRef BlipContext::onCreateContext(
     return 0;
 }
 
+DuotoneContext::DuotoneContext( ContextHandler2Helper& rParent,
+        const AttributeList& /*rAttribs*/, BlipFillProperties& rBlipProps ) :
+    ContextHandler2( rParent ),
+    mrBlipProps( rBlipProps ),
+    mnColorIndex( 0 )
+{
+    mrBlipProps.maDuotoneColors[0].setUnused();
+    mrBlipProps.maDuotoneColors[1].setUnused();
+}
+
+DuotoneContext::~DuotoneContext()
+{
+}
+
+::oox::core::ContextHandlerRef DuotoneContext::onCreateContext(
+        sal_Int32 /*nElement*/, const AttributeList& /*rAttribs*/ )
+{
+    if( mnColorIndex < 2 )
+        return new ColorValueContext( *this, mrBlipProps.maDuotoneColors[mnColorIndex++] );
+    return 0;
+}
+
 BlipFillContext::BlipFillContext( ContextHandler2Helper& rParent,
         const AttributeList& rAttribs, BlipFillProperties& rBlipProps ) :
     ContextHandler2( rParent ),
diff --git a/svtools/source/graphic/transformer.cxx b/svtools/source/graphic/transformer.cxx
index 1b8e3c2..18b4721 100644
--- a/svtools/source/graphic/transformer.cxx
+++ b/svtools/source/graphic/transformer.cxx
@@ -139,6 +139,25 @@ uno::Reference< graphic::XGraphic > SAL_CALL GraphicTransformer::colorChange(
     return xRet;
 }
 
+uno::Reference< graphic::XGraphic > SAL_CALL GraphicTransformer::applyDuotone(
+    const uno::Reference< graphic::XGraphic >& rxGraphic, sal_Int32 nColorOne, sal_Int32 nColorTwo )
+        throw ( lang::IllegalArgumentException, uno::RuntimeException)
+{
+    const uno::Reference< uno::XInterface > xIFace( rxGraphic, uno::UNO_QUERY );
+    ::Graphic aGraphic( *::unographic::Graphic::getImplementation( xIFace ) );
+
+    BitmapEx    aBitmapEx( aGraphic.GetBitmapEx() );
+    Bitmap      aBitmap( aBitmapEx.GetBitmap() );
+    BmpFilterParam aFilter( (sal_uLong) nColorOne, (sal_uLong) nColorTwo );
+    aBitmap.Filter( BMP_FILTER_DUOTONE, &aFilter );
+    aGraphic = ::Graphic( BitmapEx( aBitmap ) );
+
+    ::unographic::Graphic* pUnoGraphic = new ::unographic::Graphic();
+    pUnoGraphic->init( aGraphic );
+    uno::Reference< graphic::XGraphic > xRet( pUnoGraphic );
+    return xRet;
+}
+
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svtools/source/graphic/transformer.hxx b/svtools/source/graphic/transformer.hxx
index 6abef36..4c83662 100644
--- a/svtools/source/graphic/transformer.hxx
+++ b/svtools/source/graphic/transformer.hxx
@@ -46,6 +46,11 @@ class GraphicTransformer : public GraphicTransformer_UnoImplHelper1
             sal_Int32 nColorFrom, sal_Int8 nTolerance, sal_Int32 nColorTo, sal_Int8 nAlphaTo )
                 throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
 
+    virtual ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > SAL_CALL applyDuotone(
+        const ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic >& rGraphic,
+            sal_Int32 nColorOne, sal_Int32 nColorTwo )
+                throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
+
 };
 
 }
diff --git a/vcl/source/gdi/bitmap4.cxx b/vcl/source/gdi/bitmap4.cxx
index 821c16b..dbda9e6 100644
--- a/vcl/source/gdi/bitmap4.cxx
+++ b/vcl/source/gdi/bitmap4.cxx
@@ -30,6 +30,14 @@
 #define MNMX5(a,b,c,d,e)    S2(a,b); S2(c,d); MN3(a,c,e); MX3(b,d,e);
 #define MNMX6(a,b,c,d,e,f)  S2(a,d); S2(b,e); S2(c,f); MN3(a,b,c); MX3(d,e,f);
 
+static inline sal_uInt8 lcl_getDuotoneColorComponent( sal_uInt8 base, sal_uInt16 color1, sal_uInt16 color2 )
+{
+    color2 = color2*base/0xFF;
+    color1 = color1*(0xFF-base)/0xFF;
+
+    return (sal_uInt8) (color1+color2);
+}
+
 sal_Bool Bitmap::Filter( BmpFilter eFilter, const BmpFilterParam* pFilterParam, const Link* pProgress )
 {
     sal_Bool bRet = sal_False;
@@ -90,6 +98,10 @@ sal_Bool Bitmap::Filter( BmpFilter eFilter, const BmpFilterParam* pFilterParam,
             bRet = ImplPopArt( pFilterParam, pProgress );
         break;
 
+        case( BMP_FILTER_DUOTONE ):
+            bRet = ImplDuotoneFilter( pFilterParam->mnProgressStart, pFilterParam->mnProgressEnd );
+        break;
+
         default:
             OSL_FAIL( "Bitmap::Convert(): Unsupported filter" );
         break;
@@ -1163,4 +1175,35 @@ bool Bitmap::ImplSeparableUnsharpenFilter(const double radius) {
     return true;
 }
 
+
+bool Bitmap::ImplDuotoneFilter( const sal_uLong nColorOne, const sal_uLong nColorTwo )
+{
+    const long  nWidth = GetSizePixel().Width();
+    const long  nHeight = GetSizePixel().Height();
+
+    Bitmap aResultBitmap( GetSizePixel(), 24);
+    BitmapReadAccess* pReadAcc = AcquireReadAccess();
+    BitmapWriteAccess* pWriteAcc = aResultBitmap.AcquireWriteAccess();
+    const BitmapColor aColorOne( static_cast< sal_uInt8 >( nColorOne >> 16 ), static_cast< sal_uInt8 >( nColorOne >> 8 ), static_cast< sal_uInt8 >( nColorOne ) );
+    const BitmapColor aColorTwo( static_cast< sal_uInt8 >( nColorTwo >> 16 ), static_cast< sal_uInt8 >( nColorTwo >> 8 ), static_cast< sal_uInt8 >( nColorTwo ) );
+
+    for( int x = 0; x < nWidth; x++ )
+    {
+        for( int y = 0; y < nHeight; y++ )
+        {
+            BitmapColor aColor = pReadAcc->GetColor( y, x );
+            BitmapColor aResultColor(
+                    lcl_getDuotoneColorComponent( aColor.GetRed(), aColorOne.GetRed(), aColorTwo.GetRed() ) ,
+                    lcl_getDuotoneColorComponent( aColor.GetGreen(), aColorOne.GetGreen(), aColorTwo.GetGreen() ) ,
+                    lcl_getDuotoneColorComponent( aColor.GetBlue(), aColorOne.GetBlue(), aColorTwo.GetBlue() ) );
+            pWriteAcc->SetPixel( y, x, aResultColor );
+        }
+    }
+
+    ReleaseAccess( pWriteAcc );
+    ReleaseAccess( pReadAcc );
+    ImplAssignWithSize ( aResultBitmap );
+    return true;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list