[Libreoffice-commits] core.git: Branch 'distro/suse/suse-4.0' - offapi/com oox/inc oox/source svtools/source vcl/inc vcl/source

Muthu Subramanian sumuthu at suse.com
Wed Jul 17 00:32:57 PDT 2013


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

New commits:
commit ad4604428dc98686d00637b06fe09078873c9acf
Author: Muthu Subramanian <sumuthu at suse.com>
Date:   Wed Jul 17 13:13:30 2013 +0530

    n#820077: Import images with duotone filter.
    
    Also, contains implementation for a simple duotone filter.
    (Port from commit: 8b716072410bcfd252739fb953d5ac198e27a895)

diff --git a/offapi/com/sun/star/graphic/XGraphicTransformer.idl b/offapi/com/sun/star/graphic/XGraphicTransformer.idl
index 51a88e4..df0b81b 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/inc/oox/drawingml/fillproperties.hxx b/oox/inc/oox/drawingml/fillproperties.hxx
index fb9aa84..4a54fa3 100644
--- a/oox/inc/oox/drawingml/fillproperties.hxx
+++ b/oox/inc/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/oox/inc/oox/drawingml/fillpropertiesgroupcontext.hxx b/oox/inc/oox/drawingml/fillpropertiesgroupcontext.hxx
index 81d8a6e..2b6ab85 100644
--- a/oox/inc/oox/drawingml/fillpropertiesgroupcontext.hxx
+++ b/oox/inc/oox/drawingml/fillpropertiesgroupcontext.hxx
@@ -81,6 +81,30 @@ private:
 };
 
 // ============================================================================
+
+/** Context handler that imports the a:duotone element containing the colors
+    of a bitmap duotone transformation. */
+class DuotoneContext : public ::oox::core::ContextHandler
+{
+public:
+    explicit            DuotoneContext(
+                            ::oox::core::ContextHandler& rParent,
+                            const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs,
+                            BlipFillProperties& rBlipProps );
+    virtual             ~DuotoneContext();
+
+    virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL
+                        createFastChildContext(
+                            sal_Int32 nElement,
+                            const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs )
+                        throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException );
+
+private:
+    BlipFillProperties& mrBlipProps;
+    int                 mnColorIndex;
+};
+
+
 // ============================================================================
 
 /** Context handler that imports the a:clrChange element containing the colors
diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx
index 78184aa..c4f58a8 100644
--- a/oox/source/drawingml/fillproperties.cxx
+++ b/oox/source/drawingml/fillproperties.cxx
@@ -150,6 +150,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] );
 }
 
 // ============================================================================
@@ -373,9 +375,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 ad928cd..b73fb2f 100644
--- a/oox/source/drawingml/fillpropertiesgroupcontext.cxx
+++ b/oox/source/drawingml/fillpropertiesgroupcontext.cxx
@@ -187,6 +187,9 @@ Reference< XFastContextHandler > BlipContext::createFastChildContext(
         case A_TOKEN( clrChange ):
             return new ColorChangeContext( *this, rxAttribs, mrBlipProps );
 
+        case A_TOKEN( duotone ):
+            return new DuotoneContext( *this, rxAttribs, mrBlipProps );
+
         case A_TOKEN( lum ):
             mrBlipProps.moBrightness = aAttribs.getInteger( XML_bright );
             mrBlipProps.moContrast = aAttribs.getInteger( XML_contrast );
@@ -197,6 +200,29 @@ Reference< XFastContextHandler > BlipContext::createFastChildContext(
 
 // ============================================================================
 
+DuotoneContext::DuotoneContext( ContextHandler& rParent,
+        const Reference< XFastAttributeList >& rxAttribs, BlipFillProperties& rBlipProps ) :
+    ContextHandler( rParent ),
+    mrBlipProps( rBlipProps ),
+    mnColorIndex( 0 )
+{
+    AttributeList aAttribs( rxAttribs );
+    mrBlipProps.maDuotoneColors[0].setUnused();
+    mrBlipProps.maDuotoneColors[1].setUnused();
+}
+
+DuotoneContext::~DuotoneContext()
+{
+}
+
+Reference< XFastContextHandler > DuotoneContext::createFastChildContext(
+        sal_Int32 /*nElement*/, const Reference< XFastAttributeList >& ) throw (SAXException, RuntimeException)
+{
+    if( mnColorIndex < 2 )
+        return new ColorValueContext( *this, mrBlipProps.maDuotoneColors[mnColorIndex++] );
+    return 0;
+}
+
 BlipFillContext::BlipFillContext( ContextHandler& rParent,
         const Reference< XFastAttributeList >& rxAttribs, BlipFillProperties& rBlipProps ) :
     ContextHandler( rParent ),
diff --git a/svtools/source/graphic/transformer.cxx b/svtools/source/graphic/transformer.cxx
index 874bb34..684c75c 100644
--- a/svtools/source/graphic/transformer.cxx
+++ b/svtools/source/graphic/transformer.cxx
@@ -141,6 +141,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 9ae4cff..f6a24d1 100644
--- a/svtools/source/graphic/transformer.hxx
+++ b/svtools/source/graphic/transformer.hxx
@@ -48,6 +48,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/inc/vcl/bitmap.hxx b/vcl/inc/vcl/bitmap.hxx
index ea52068..46448b3 100644
--- a/vcl/inc/vcl/bitmap.hxx
+++ b/vcl/inc/vcl/bitmap.hxx
@@ -139,6 +139,7 @@ enum BmpFilter
     BMP_FILTER_SEPIA = 6,
     BMP_FILTER_MOSAIC = 7,
     BMP_FILTER_POPART = 8,
+    BMP_FILTER_DUOTONE = 9,
 
     BMP_FILTER_UNKNOWN = 65535
 };
@@ -402,6 +403,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/vcl/source/gdi/bitmap4.cxx b/vcl/source/gdi/bitmap4.cxx
index be50269..b5eb7d3 100644
--- a/vcl/source/gdi/bitmap4.cxx
+++ b/vcl/source/gdi/bitmap4.cxx
@@ -38,6 +38,14 @@
 // - Bitmap -
 // ----------
 
+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;
@@ -98,6 +106,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;
@@ -1199,4 +1211,35 @@ bool Bitmap::ImplSeparableUnsharpenFilter(const double radius) {
 }
 
 
+
+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