/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include "precompiled_svx.hxx" #include #include #include #include #include #include #include #include #include #include ////////////////////////////////////////////////////////////////////////////// namespace drawinglayer { namespace primitive2d { Primitive2DSequence SdrOleContentPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*aViewInformation*/) const { Primitive2DSequence aRetval; const SdrOle2Obj* pSource = (mpSdrOle2Obj.is() ? static_cast< SdrOle2Obj* >(mpSdrOle2Obj.get()) : 0); bool bScaleContent(false); Graphic aGraphic; if(pSource) { Graphic* pOLEGraphic = (getHighContrast()) ? pSource->getEmbeddedObjectRef().GetHCGraphic() : pSource->GetGraphic(); if(pOLEGraphic) { aGraphic = *pOLEGraphic; bScaleContent = pSource->IsEmptyPresObj(); } } if(GRAPHIC_NONE == aGraphic.GetType()) { // no source, use fallback resource empty OLE graphic const Bitmap aEmptyOLEBitmap(SdrOle2Obj::GetEmptyOLEReplacementBitmap()); aGraphic = Graphic(aEmptyOLEBitmap); bScaleContent = true; } if(GRAPHIC_NONE != aGraphic.GetType()) { const GraphicObject aGraphicObject(aGraphic); const GraphicAttr aGraphicAttr; drawinglayer::primitive2d::Primitive2DSequence xOLEContent; if(bScaleContent) { // get transformation atoms basegfx::B2DVector aScale, aTranslate; double fRotate, fShearX; getObjectTransform().decompose(aScale, aTranslate, fRotate, fShearX); // get PrefSize from the graphic in 100th mm Size aPrefSize(aGraphic.GetPrefSize()); if(MAP_PIXEL == aGraphic.GetPrefMapMode().GetMapUnit()) { aPrefSize = Application::GetDefaultDevice()->PixelToLogic(aPrefSize, MAP_100TH_MM); } else { aPrefSize = Application::GetDefaultDevice()->LogicToLogic(aPrefSize, aGraphic.GetPrefMapMode(), MAP_100TH_MM); } const double fOffsetX((aScale.getX() - aPrefSize.getWidth()) / 2.0); const double fOffsetY((aScale.getY() - aPrefSize.getHeight()) / 2.0); if(basegfx::fTools::moreOrEqual(fOffsetX, 0.0) && basegfx::fTools::moreOrEqual(fOffsetY, 0.0)) { // if content fits into frame, create it basegfx::B2DHomMatrix aInnerObjectMatrix(basegfx::tools::createScaleTranslateB2DHomMatrix( aPrefSize.getWidth(), aPrefSize.getHeight(), fOffsetX, fOffsetY)); aInnerObjectMatrix = basegfx::tools::createShearXRotateTranslateB2DHomMatrix(fShearX, fRotate, aTranslate) * aInnerObjectMatrix; const drawinglayer::primitive2d::Primitive2DReference aGraphicPrimitive( new drawinglayer::primitive2d::GraphicPrimitive2D( aInnerObjectMatrix, aGraphicObject, aGraphicAttr)); drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(aRetval, aGraphicPrimitive); } } else { // create graphic primitive for content const drawinglayer::primitive2d::Primitive2DReference aGraphicPrimitive( new drawinglayer::primitive2d::GraphicPrimitive2D( getObjectTransform(), aGraphicObject, aGraphicAttr)); drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(aRetval, aGraphicPrimitive); } // a standard gray outline is created for scaled content if(bScaleContent) { const svtools::ColorConfig aColorConfig; const svtools::ColorConfigValue aColor(aColorConfig.GetColorValue(svtools::OBJECTBOUNDARIES)); if(aColor.bIsVisible) { basegfx::B2DPolygon aOutline(basegfx::tools::createUnitPolygon()); const Color aVclColor(aColor.nColor); aOutline.transform(getObjectTransform()); const drawinglayer::primitive2d::Primitive2DReference xOutline( new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aOutline, aVclColor.getBColor())); drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(aRetval, xOutline); } } } // get graphic and check scale content state return aRetval; } SdrOleContentPrimitive2D::SdrOleContentPrimitive2D( const SdrOle2Obj& rSdrOle2Obj, const basegfx::B2DHomMatrix& rObjectTransform, sal_uInt32 nGraphicVersion, bool bHighContrast) : BufferedDecompositionPrimitive2D(), mpSdrOle2Obj(const_cast< SdrOle2Obj* >(&rSdrOle2Obj)), maObjectTransform(rObjectTransform), mnGraphicVersion(nGraphicVersion), mbHighContrast(bHighContrast) { } bool SdrOleContentPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const { if(BufferedDecompositionPrimitive2D::operator==(rPrimitive)) { const SdrOleContentPrimitive2D& rCompare = (SdrOleContentPrimitive2D&)rPrimitive; const bool bBothNot(!mpSdrOle2Obj.is() && !rCompare.mpSdrOle2Obj.is()); const bool bBothAndEqual(mpSdrOle2Obj.is() && rCompare.mpSdrOle2Obj.is() && mpSdrOle2Obj.get() == rCompare.mpSdrOle2Obj.get()); return ((bBothNot || bBothAndEqual) && getObjectTransform() == rCompare.getObjectTransform() // #i104867# to find out if the Graphic content of the // OLE has changed, use GraphicVersion number && getGraphicVersion() == rCompare.getGraphicVersion() && getHighContrast() == rCompare.getHighContrast()); } return false; } basegfx::B2DRange SdrOleContentPrimitive2D::getB2DRange(const geometry::ViewInformation2D& /*rViewInformation*/) const { basegfx::B2DRange aRange(0.0, 0.0, 1.0, 1.0); aRange.transform(getObjectTransform()); return aRange; } // provide unique ID ImplPrimitrive2DIDBlock(SdrOleContentPrimitive2D, PRIMITIVE2D_ID_SDROLECONTENTPRIMITIVE2D) } // end of namespace primitive2d } // end of namespace drawinglayer /* vim: set noet sw=4 ts=4: */