[Libreoffice-commits] core.git: Branch 'libreoffice-4-2' - offapi/com oox/source svtools/source

Luboš Luňák l.lunak at collabora.com
Thu May 1 02:24:51 PDT 2014


 offapi/com/sun/star/graphic/XGraphicTransformer.idl |   10 +++++++
 oox/source/drawingml/fillproperties.cxx             |   26 ++++++++++++++++++--
 svtools/source/graphic/transformer.cxx              |   17 +++++++++++++
 svtools/source/graphic/transformer.hxx              |    5 +++
 4 files changed, 56 insertions(+), 2 deletions(-)

New commits:
commit 75a839188d1cac5f0ac602e59462b32879d2242a
Author: Luboš Luňák <l.lunak at collabora.com>
Date:   Wed Apr 30 22:19:08 2014 +0200

    handle brightness+contrast from msoffice (bnc#875713)
    
    This is the same like 1139d618b8bc6ab823a96184bd0f0257980aad24, for docx.
    
    (cherry picked from commit 893fe88469dec5b727d96f8ea1b4edb9e88288a7)
    
    Conflicts:
    	oox/source/drawingml/fillproperties.cxx
    
    Change-Id: I1ef4e18444e8c60e9ae8f67249bcef1053f0d62d
    Reviewed-on: https://gerrit.libreoffice.org/9217
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/offapi/com/sun/star/graphic/XGraphicTransformer.idl b/offapi/com/sun/star/graphic/XGraphicTransformer.idl
index d1a6ddf..dbd9c8d 100644
--- a/offapi/com/sun/star/graphic/XGraphicTransformer.idl
+++ b/offapi/com/sun/star/graphic/XGraphicTransformer.idl
@@ -51,6 +51,16 @@ interface XGraphicTransformer : ::com::sun::star::uno::XInterface
     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 );
+
+    /** changes brightness/contrast
+
+        @param mso whether to use MSOffice brightness/contrast formula
+        @returns
+            The modified graphic
+    */
+    com::sun::star::graphic::XGraphic applyBrightnessContrast( [ in ] com::sun::star::graphic::XGraphic In,
+        [ in ] long brightness, [ in ] long contrast, [ in ] boolean mso )
+            raises( ::com::sun::star::lang::IllegalArgumentException );
 };
 
 } ; } ; } ; } ;
diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx
index c96c77a..99026a9 100644
--- a/oox/source/drawingml/fillproperties.cxx
+++ b/oox/source/drawingml/fillproperties.cxx
@@ -92,6 +92,18 @@ Reference< XGraphic > lclCheckAndApplyChangeColorTransform( const BlipFillProper
     return xGraphic;
 }
 
+Reference< XGraphic > applyBrightnessContrast( Reference< XGraphic > xGraphic, sal_Int32 brightness, sal_Int32 contrast )
+{
+    try
+        {
+            Reference< XGraphicTransformer > xTransformer( xGraphic, UNO_QUERY_THROW );
+            xGraphic = xTransformer->applyBrightnessContrast( xGraphic, brightness, contrast, true );
+        }
+        catch( Exception& )
+        {
+        }
+    return xGraphic;
+}
 
 
 BitmapMode lclGetBitmapMode( sal_Int32 nToken )
@@ -501,12 +513,24 @@ void FillProperties::pushToPropMap( ShapePropertyMap& rPropMap,
 
 void GraphicProperties::pushToPropMap( PropertyMap& rPropMap, const GraphicHelper& rGraphicHelper, sal_Int32 nPhClr ) const
 {
+    sal_Int16 nBrightness = getLimitedValue< sal_Int16, sal_Int32 >( maBlipProps.moBrightness.get( 0 ) / PER_PERCENT, -100, 100 );
+    sal_Int16 nContrast = getLimitedValue< sal_Int16, sal_Int32 >( maBlipProps.moContrast.get( 0 ) / PER_PERCENT, -100, 100 );
     if( maBlipProps.mxGraphic.is() )
     {
         // created transformed graphic
         Reference< XGraphic > xGraphic = lclCheckAndApplyDuotoneTransform( maBlipProps, maBlipProps.mxGraphic, rGraphicHelper, nPhClr );
         xGraphic = lclCheckAndApplyChangeColorTransform( maBlipProps, xGraphic, rGraphicHelper, nPhClr );
 
+        // MSO uses a different algorithm for contrast+brightness, LO applies contrast before brightness,
+        // while MSO apparently applies half of brightness before contrast and half after. So if only
+        // contrast or brightness need to be altered, the result is the same, but if both are involved,
+        // there's no way to map that, so just force a conversion of the image.
+        if( nBrightness != 0 && nContrast != 0 )
+        {
+            xGraphic = applyBrightnessContrast( xGraphic, nBrightness, nContrast );
+            nBrightness = 0;
+            nContrast = 0;
+        }
         rPropMap[ PROP_Graphic ] <<= xGraphic;
 
         // do we still need to set GraphicURL as well? (TODO)
@@ -545,10 +569,8 @@ void GraphicProperties::pushToPropMap( PropertyMap& rPropMap, const GraphicHelpe
     rPropMap[ PROP_GraphicColorMode ] <<= eColorMode;
 
     // brightness and contrast
-    sal_Int16 nBrightness = getLimitedValue< sal_Int16, sal_Int32 >( maBlipProps.moBrightness.get( 0 ) / PER_PERCENT, -100, 100 );
     if( nBrightness != 0 )
         rPropMap[ PROP_AdjustLuminance ] <<= nBrightness;
-    sal_Int16 nContrast = getLimitedValue< sal_Int16, sal_Int32 >( maBlipProps.moContrast.get( 0 ) / PER_PERCENT, -100, 100 );
     if( nContrast != 0 )
         rPropMap[ PROP_AdjustContrast ] <<= nContrast;
 
diff --git a/svtools/source/graphic/transformer.cxx b/svtools/source/graphic/transformer.cxx
index 30f07c7..bf63621 100644
--- a/svtools/source/graphic/transformer.cxx
+++ b/svtools/source/graphic/transformer.cxx
@@ -159,6 +159,23 @@ uno::Reference< graphic::XGraphic > SAL_CALL GraphicTransformer::applyDuotone(
     return xRet;
 }
 
+uno::Reference< graphic::XGraphic > SAL_CALL GraphicTransformer::applyBrightnessContrast(
+    const uno::Reference< graphic::XGraphic >& rxGraphic, sal_Int32 nBrightness, sal_Int32 nContrast, sal_Bool mso )
+        throw ( lang::IllegalArgumentException, uno::RuntimeException, std::exception)
+{
+    const uno::Reference< uno::XInterface > xIFace( rxGraphic, uno::UNO_QUERY );
+    ::Graphic aGraphic( *::unographic::Graphic::getImplementation( xIFace ) );
+
+    BitmapEx    aBitmapEx( aGraphic.GetBitmapEx() );
+    aBitmapEx.Adjust( nBrightness, nContrast, 0, 0, 0, 0, false, mso );
+    aGraphic = ::Graphic( aBitmapEx );
+
+    ::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 e57b8fa..1707183 100644
--- a/svtools/source/graphic/transformer.hxx
+++ b/svtools/source/graphic/transformer.hxx
@@ -51,6 +51,11 @@ class GraphicTransformer : public GraphicTransformer_UnoImplHelper1
             sal_Int32 nColorOne, sal_Int32 nColorTwo )
                 throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
 
+    virtual ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > SAL_CALL applyBrightnessContrast(
+        const ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic >& rxGraphic,
+            sal_Int32 nBrightness, sal_Int32 nContrast, sal_Bool mso )
+                throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
+
 };
 
 }


More information about the Libreoffice-commits mailing list