Kaydet (Commit) 893fe884 authored tarafından Luboš Luňák's avatar Luboš Luňák

handle brightness+contrast from msoffice (bnc#875713)

This is the same like 1139d618, for docx.

Change-Id: I1ef4e18444e8c60e9ae8f67249bcef1053f0d62d
üst 804da2a9
......@@ -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 );
};
} ; } ; } ; } ;
......
......@@ -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 )
......@@ -519,12 +531,23 @@ 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.setProperty(PROP_Graphic, xGraphic);
// do we still need to set GraphicURL as well? (TODO)
......@@ -563,10 +586,8 @@ void GraphicProperties::pushToPropMap( PropertyMap& rPropMap, const GraphicHelpe
rPropMap.setProperty(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.setProperty(PROP_AdjustLuminance, nBrightness);
sal_Int16 nContrast = getLimitedValue< sal_Int16, sal_Int32 >( maBlipProps.moContrast.get( 0 ) / PER_PERCENT, -100, 100 );
if( nContrast != 0 )
rPropMap.setProperty(PROP_AdjustContrast, nContrast);
......
......@@ -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: */
......@@ -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, std::exception) SAL_OVERRIDE;
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;
};
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment