From ad4604428dc98686d00637b06fe09078873c9acf Mon Sep 17 00:00:00 2001 From: Muthu Subramanian Date: Wed, 17 Jul 2013 13:13:30 +0530 Subject: n#820077: Import images with duotone filter. Also, contains implementation for a simple duotone filter. (Port from commit: 8b716072410bcfd252739fb953d5ac198e27a895) --- oox/inc/oox/drawingml/fillproperties.hxx | 1 + .../oox/drawingml/fillpropertiesgroupcontext.hxx | 24 ++++++++++++++++++++ oox/source/drawingml/fillproperties.cxx | 18 ++++++++++++++- .../drawingml/fillpropertiesgroupcontext.cxx | 26 ++++++++++++++++++++++ 4 files changed, 68 insertions(+), 1 deletion(-) (limited to 'oox') diff --git a/oox/inc/oox/drawingml/fillproperties.hxx b/oox/inc/oox/drawingml/fillproperties.hxx index fb9aa849e92e..4a54fa327546 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 81d8a6e0db20..2b6ab859a6cf 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 78184aa0f1a0..c4f58a884acc 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 ad928cd5980f..b73fb2fc91b8 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 ), -- cgit v1.2.3