svx/source/sdr/contact/viewobjectcontact.cxx | 659 +++++++++++++-------------- 1 file changed, 328 insertions(+), 331 deletions(-)
New commits: commit 68754260e6f3fdc91a6ab55b4fd99fbd34bf3447 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Fri Oct 31 16:01:52 2014 -0400 Unindent. Change-Id: I875bdf1eb6df37b07dd19c6a7ff5ba5eb3b8a096 diff --git a/svx/source/sdr/contact/viewobjectcontact.cxx b/svx/source/sdr/contact/viewobjectcontact.cxx index 3491cfdf..140c5c8 100644 --- a/svx/source/sdr/contact/viewobjectcontact.cxx +++ b/svx/source/sdr/contact/viewobjectcontact.cxx @@ -41,409 +41,406 @@ using namespace com::sun::star; -namespace +namespace { + +// animated extractor + +// Necessary to filter a sequence of animated primitives from +// a sequence of primitives to find out if animated or not. The decision for +// what to decompose is hard-coded and only done for knowingly animated primitives +// to not decompose too deeply and unnecessarily. This implies that the list +// which is view-specific needs to be expanded by hand when new animated objects +// are added. This may eventually be changed to a dynamically configurable approach +// if necessary. +class AnimatedExtractingProcessor2D : public drawinglayer::processor2d::BaseProcessor2D { - // animated extractor - - // Necessary to filter a sequence of animated primitives from - // a sequence of primitives to find out if animated or not. The decision for - // what to decompose is hard-coded and only done for knowingly animated primitives - // to not decompose too deeply and unnecessarily. This implies that the list - // which is view-specific needs to be expanded by hand when new animated objects - // are added. This may eventually be changed to a dynamically configurable approach - // if necessary. - class AnimatedExtractingProcessor2D : public drawinglayer::processor2d::BaseProcessor2D - { - protected: - // the found animated primitives - drawinglayer::primitive2d::Primitive2DSequence maPrimitive2DSequence; - - // bitfield - // text animation allowed? - bool mbTextAnimationAllowed : 1; - - // graphic animation allowed? - bool mbGraphicAnimationAllowed : 1; - - // as tooling, the process() implementation takes over API handling and calls this - // virtual render method when the primitive implementation is BasePrimitive2D-based. - virtual void processBasePrimitive2D(const drawinglayer::primitive2d::BasePrimitive2D& rCandidate) SAL_OVERRIDE; - - public: - AnimatedExtractingProcessor2D( - const drawinglayer::geometry::ViewInformation2D& rViewInformation, - bool bTextAnimationAllowed, - bool bGraphicAnimationAllowed); - virtual ~AnimatedExtractingProcessor2D(); - - // data access - const drawinglayer::primitive2d::Primitive2DSequence& getPrimitive2DSequence() const { return maPrimitive2DSequence; } - bool isTextAnimationAllowed() const { return mbTextAnimationAllowed; } - bool isGraphicAnimationAllowed() const { return mbGraphicAnimationAllowed; } - }; - - AnimatedExtractingProcessor2D::AnimatedExtractingProcessor2D( +protected: + // the found animated primitives + drawinglayer::primitive2d::Primitive2DSequence maPrimitive2DSequence; + + // bitfield + // text animation allowed? + bool mbTextAnimationAllowed : 1; + + // graphic animation allowed? + bool mbGraphicAnimationAllowed : 1; + + // as tooling, the process() implementation takes over API handling and calls this + // virtual render method when the primitive implementation is BasePrimitive2D-based. + virtual void processBasePrimitive2D(const drawinglayer::primitive2d::BasePrimitive2D& rCandidate) SAL_OVERRIDE; + +public: + AnimatedExtractingProcessor2D( const drawinglayer::geometry::ViewInformation2D& rViewInformation, bool bTextAnimationAllowed, - bool bGraphicAnimationAllowed) - : drawinglayer::processor2d::BaseProcessor2D(rViewInformation), - maPrimitive2DSequence(), - mbTextAnimationAllowed(bTextAnimationAllowed), - mbGraphicAnimationAllowed(bGraphicAnimationAllowed) - { - } + bool bGraphicAnimationAllowed); + virtual ~AnimatedExtractingProcessor2D(); + + // data access + const drawinglayer::primitive2d::Primitive2DSequence& getPrimitive2DSequence() const { return maPrimitive2DSequence; } + bool isTextAnimationAllowed() const { return mbTextAnimationAllowed; } + bool isGraphicAnimationAllowed() const { return mbGraphicAnimationAllowed; } +}; + +AnimatedExtractingProcessor2D::AnimatedExtractingProcessor2D( + const drawinglayer::geometry::ViewInformation2D& rViewInformation, + bool bTextAnimationAllowed, + bool bGraphicAnimationAllowed) +: drawinglayer::processor2d::BaseProcessor2D(rViewInformation), + maPrimitive2DSequence(), + mbTextAnimationAllowed(bTextAnimationAllowed), + mbGraphicAnimationAllowed(bGraphicAnimationAllowed) +{ +} - AnimatedExtractingProcessor2D::~AnimatedExtractingProcessor2D() - { - } +AnimatedExtractingProcessor2D::~AnimatedExtractingProcessor2D() +{ +} - void AnimatedExtractingProcessor2D::processBasePrimitive2D(const drawinglayer::primitive2d::BasePrimitive2D& rCandidate) +void AnimatedExtractingProcessor2D::processBasePrimitive2D(const drawinglayer::primitive2d::BasePrimitive2D& rCandidate) +{ + // known implementation, access directly + switch(rCandidate.getPrimitive2DID()) { - // known implementation, access directly - switch(rCandidate.getPrimitive2DID()) + // add and accept animated primitives directly, no need to decompose + case PRIMITIVE2D_ID_ANIMATEDSWITCHPRIMITIVE2D : + case PRIMITIVE2D_ID_ANIMATEDBLINKPRIMITIVE2D : + case PRIMITIVE2D_ID_ANIMATEDINTERPOLATEPRIMITIVE2D : { - // add and accept animated primitives directly, no need to decompose - case PRIMITIVE2D_ID_ANIMATEDSWITCHPRIMITIVE2D : - case PRIMITIVE2D_ID_ANIMATEDBLINKPRIMITIVE2D : - case PRIMITIVE2D_ID_ANIMATEDINTERPOLATEPRIMITIVE2D : - { - const drawinglayer::primitive2d::AnimatedSwitchPrimitive2D& rSwitchPrimitive = static_cast< const drawinglayer::primitive2d::AnimatedSwitchPrimitive2D& >(rCandidate); - - if((rSwitchPrimitive.isTextAnimation() && isTextAnimationAllowed()) - || (rSwitchPrimitive.isGraphicAnimation() && isGraphicAnimationAllowed())) - { - const drawinglayer::primitive2d::Primitive2DReference xReference(const_cast< drawinglayer::primitive2d::BasePrimitive2D* >(&rCandidate)); - drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(maPrimitive2DSequence, xReference); - } - break; - } + const drawinglayer::primitive2d::AnimatedSwitchPrimitive2D& rSwitchPrimitive = static_cast< const drawinglayer::primitive2d::AnimatedSwitchPrimitive2D& >(rCandidate); - // decompose animated gifs where SdrGrafPrimitive2D produces a GraphicPrimitive2D - // which then produces the animation infos (all when used/needed) - case PRIMITIVE2D_ID_SDRGRAFPRIMITIVE2D : - case PRIMITIVE2D_ID_GRAPHICPRIMITIVE2D : - - // decompose SdrObjects with evtl. animated text - case PRIMITIVE2D_ID_SDRCAPTIONPRIMITIVE2D : - case PRIMITIVE2D_ID_SDRCONNECTORPRIMITIVE2D : - case PRIMITIVE2D_ID_SDRCUSTOMSHAPEPRIMITIVE2D : - case PRIMITIVE2D_ID_SDRELLIPSEPRIMITIVE2D : - case PRIMITIVE2D_ID_SDRELLIPSESEGMENTPRIMITIVE2D : - case PRIMITIVE2D_ID_SDRMEASUREPRIMITIVE2D : - case PRIMITIVE2D_ID_SDRPATHPRIMITIVE2D : - case PRIMITIVE2D_ID_SDRRECTANGLEPRIMITIVE2D : - - // #121194# With Graphic as Bitmap FillStyle, also check - // for primitives filled with animated graphics - case PRIMITIVE2D_ID_POLYPOLYGONGRAPHICPRIMITIVE2D: - case PRIMITIVE2D_ID_FILLGRAPHICPRIMITIVE2D: - case PRIMITIVE2D_ID_TRANSFORMPRIMITIVE2D: - - // decompose evtl. animated text contained in MaskPrimitive2D - // or group rimitives - case PRIMITIVE2D_ID_MASKPRIMITIVE2D : - case PRIMITIVE2D_ID_GROUPPRIMITIVE2D : + if((rSwitchPrimitive.isTextAnimation() && isTextAnimationAllowed()) + || (rSwitchPrimitive.isGraphicAnimation() && isGraphicAnimationAllowed())) { - process(rCandidate.get2DDecomposition(getViewInformation2D())); - break; + const drawinglayer::primitive2d::Primitive2DReference xReference(const_cast< drawinglayer::primitive2d::BasePrimitive2D* >(&rCandidate)); + drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(maPrimitive2DSequence, xReference); } + break; + } - default : - { - // nothing to do for the rest - break; - } + // decompose animated gifs where SdrGrafPrimitive2D produces a GraphicPrimitive2D + // which then produces the animation infos (all when used/needed) + case PRIMITIVE2D_ID_SDRGRAFPRIMITIVE2D : + case PRIMITIVE2D_ID_GRAPHICPRIMITIVE2D : + + // decompose SdrObjects with evtl. animated text + case PRIMITIVE2D_ID_SDRCAPTIONPRIMITIVE2D : + case PRIMITIVE2D_ID_SDRCONNECTORPRIMITIVE2D : + case PRIMITIVE2D_ID_SDRCUSTOMSHAPEPRIMITIVE2D : + case PRIMITIVE2D_ID_SDRELLIPSEPRIMITIVE2D : + case PRIMITIVE2D_ID_SDRELLIPSESEGMENTPRIMITIVE2D : + case PRIMITIVE2D_ID_SDRMEASUREPRIMITIVE2D : + case PRIMITIVE2D_ID_SDRPATHPRIMITIVE2D : + case PRIMITIVE2D_ID_SDRRECTANGLEPRIMITIVE2D : + + // #121194# With Graphic as Bitmap FillStyle, also check + // for primitives filled with animated graphics + case PRIMITIVE2D_ID_POLYPOLYGONGRAPHICPRIMITIVE2D: + case PRIMITIVE2D_ID_FILLGRAPHICPRIMITIVE2D: + case PRIMITIVE2D_ID_TRANSFORMPRIMITIVE2D: + + // decompose evtl. animated text contained in MaskPrimitive2D + // or group rimitives + case PRIMITIVE2D_ID_MASKPRIMITIVE2D : + case PRIMITIVE2D_ID_GROUPPRIMITIVE2D : + { + process(rCandidate.get2DDecomposition(getViewInformation2D())); + break; + } + + default : + { + // nothing to do for the rest + break; } } +} + } // end of anonymous namespace +namespace sdr { namespace contact { + +ViewObjectContact::ViewObjectContact(ObjectContact& rObjectContact, ViewContact& rViewContact) +: mrObjectContact(rObjectContact), + mrViewContact(rViewContact), + maObjectRange(), + mxPrimitive2DSequence(), + mpPrimitiveAnimation(0), + mbLazyInvalidate(false) +{ + // make the ViewContact remember me + mrViewContact.AddViewObjectContact(*this); + // make the ObjectContact remember me + mrObjectContact.AddViewObjectContact(*this); +} -namespace sdr +ViewObjectContact::~ViewObjectContact() { - namespace contact + // invalidate in view + if(!maObjectRange.isEmpty()) { - ViewObjectContact::ViewObjectContact(ObjectContact& rObjectContact, ViewContact& rViewContact) - : mrObjectContact(rObjectContact), - mrViewContact(rViewContact), - maObjectRange(), - mxPrimitive2DSequence(), - mpPrimitiveAnimation(0), - mbLazyInvalidate(false) - { - // make the ViewContact remember me - mrViewContact.AddViewObjectContact(*this); - - // make the ObjectContact remember me - mrObjectContact.AddViewObjectContact(*this); - } + GetObjectContact().InvalidatePartOfView(maObjectRange); + } - ViewObjectContact::~ViewObjectContact() - { - // invalidate in view - if(!maObjectRange.isEmpty()) - { - GetObjectContact().InvalidatePartOfView(maObjectRange); - } + // delete PrimitiveAnimation + if(mpPrimitiveAnimation) + { + delete mpPrimitiveAnimation; + mpPrimitiveAnimation = 0; + } - // delete PrimitiveAnimation - if(mpPrimitiveAnimation) - { - delete mpPrimitiveAnimation; - mpPrimitiveAnimation = 0; - } + // take care of remembered ObjectContact. Remove from + // OC first. The VC removal (below) CAN trigger a StopGettingViewed() + // which (depending of it's implementation) may destroy other OCs. This + // can trigger the deletion of the helper OC of a page visualising object + // which IS the OC of this object. Eventually StopGettingViewed() needs + // to get asynchron later + GetObjectContact().RemoveViewObjectContact(*this); - // take care of remembered ObjectContact. Remove from - // OC first. The VC removal (below) CAN trigger a StopGettingViewed() - // which (depending of it's implementation) may destroy other OCs. This - // can trigger the deletion of the helper OC of a page visualising object - // which IS the OC of this object. Eventually StopGettingViewed() needs - // to get asynchron later - GetObjectContact().RemoveViewObjectContact(*this); + // take care of remembered ViewContact + GetViewContact().RemoveViewObjectContact(*this); +} - // take care of remembered ViewContact - GetViewContact().RemoveViewObjectContact(*this); - } +const basegfx::B2DRange& ViewObjectContact::getObjectRange() const +{ + if(maObjectRange.isEmpty()) + { + // if range is not computed (new or LazyInvalidate objects), force it + const DisplayInfo aDisplayInfo; + const drawinglayer::primitive2d::Primitive2DSequence xSequence(getPrimitive2DSequence(aDisplayInfo)); - const basegfx::B2DRange& ViewObjectContact::getObjectRange() const + if(xSequence.hasElements()) { - if(maObjectRange.isEmpty()) - { - // if range is not computed (new or LazyInvalidate objects), force it - const DisplayInfo aDisplayInfo; - const drawinglayer::primitive2d::Primitive2DSequence xSequence(getPrimitive2DSequence(aDisplayInfo)); - - if(xSequence.hasElements()) - { - const drawinglayer::geometry::ViewInformation2D& rViewInformation2D(GetObjectContact().getViewInformation2D()); - const_cast< ViewObjectContact* >(this)->maObjectRange = - drawinglayer::primitive2d::getB2DRangeFromPrimitive2DSequence(xSequence, rViewInformation2D); - } - } - - return maObjectRange; + const drawinglayer::geometry::ViewInformation2D& rViewInformation2D(GetObjectContact().getViewInformation2D()); + const_cast< ViewObjectContact* >(this)->maObjectRange = + drawinglayer::primitive2d::getB2DRangeFromPrimitive2DSequence(xSequence, rViewInformation2D); } + } - void ViewObjectContact::ActionChanged() - { - if(!mbLazyInvalidate) - { - // set local flag - mbLazyInvalidate = true; + return maObjectRange; +} - // force ObjectRange - getObjectRange(); +void ViewObjectContact::ActionChanged() +{ + if(!mbLazyInvalidate) + { + // set local flag + mbLazyInvalidate = true; - if(!maObjectRange.isEmpty()) - { - // invalidate current valid range - GetObjectContact().InvalidatePartOfView(maObjectRange); + // force ObjectRange + getObjectRange(); - // reset ObjectRange, it needs to be recalculated - maObjectRange.reset(); - } + if(!maObjectRange.isEmpty()) + { + // invalidate current valid range + GetObjectContact().InvalidatePartOfView(maObjectRange); - // register at OC for lazy invalidate - GetObjectContact().setLazyInvalidate(*this); - } + // reset ObjectRange, it needs to be recalculated + maObjectRange.reset(); } - void ViewObjectContact::triggerLazyInvalidate() - { - if(mbLazyInvalidate) - { - // reset flag - mbLazyInvalidate = false; + // register at OC for lazy invalidate + GetObjectContact().setLazyInvalidate(*this); + } +} + +void ViewObjectContact::triggerLazyInvalidate() +{ + if(mbLazyInvalidate) + { + // reset flag + mbLazyInvalidate = false; #if HAVE_FEATURE_DESKTOP - // 3D charts need to be notified separately, they are not to be - // drawn by the drawinglayer - ViewContactOfSdrOle2Obj* pViewContact = dynamic_cast<ViewContactOfSdrOle2Obj*>(&GetViewContact()); - if (pViewContact && pViewContact->GetOle2Obj().IsReal3DChart()) - ChartHelper::updateChart(pViewContact->GetOle2Obj().getXModel()); + // 3D charts need to be notified separately, they are not to be + // drawn by the drawinglayer + ViewContactOfSdrOle2Obj* pViewContact = dynamic_cast<ViewContactOfSdrOle2Obj*>(&GetViewContact()); + if (pViewContact && pViewContact->GetOle2Obj().IsReal3DChart()) + ChartHelper::updateChart(pViewContact->GetOle2Obj().getXModel()); #endif - // force ObjectRange - getObjectRange(); + // force ObjectRange + getObjectRange(); - if(!maObjectRange.isEmpty()) - { - // invalidate current valid range - GetObjectContact().InvalidatePartOfView(maObjectRange); - } - } + if(!maObjectRange.isEmpty()) + { + // invalidate current valid range + GetObjectContact().InvalidatePartOfView(maObjectRange); } + } +} - // Take some action when new objects are inserted - void ViewObjectContact::ActionChildInserted(ViewContact& rChild) - { - // force creation of the new VOC and trigger it's refresh, so it - // will take part in LazyInvalidate immediately - rChild.GetViewObjectContact(GetObjectContact()).ActionChanged(); +// Take some action when new objects are inserted +void ViewObjectContact::ActionChildInserted(ViewContact& rChild) +{ + // force creation of the new VOC and trigger it's refresh, so it + // will take part in LazyInvalidate immediately + rChild.GetViewObjectContact(GetObjectContact()).ActionChanged(); - // forward action to ObjectContact - // const ViewObjectContact& rChildVOC = rChild.GetViewObjectContact(GetObjectContact()); - // GetObjectContact().InvalidatePartOfView(rChildVOC.getObjectRange()); - } + // forward action to ObjectContact + // const ViewObjectContact& rChildVOC = rChild.GetViewObjectContact(GetObjectContact()); + // GetObjectContact().InvalidatePartOfView(rChildVOC.getObjectRange()); +} + +void ViewObjectContact::checkForPrimitive2DAnimations() +{ + // remove old one + if(mpPrimitiveAnimation) + { + delete mpPrimitiveAnimation; + mpPrimitiveAnimation = 0; + } + + // check for animated primitives + if(mxPrimitive2DSequence.hasElements()) + { + const bool bTextAnimationAllowed(GetObjectContact().IsTextAnimationAllowed()); + const bool bGraphicAnimationAllowed(GetObjectContact().IsGraphicAnimationAllowed()); - void ViewObjectContact::checkForPrimitive2DAnimations() + if(bTextAnimationAllowed || bGraphicAnimationAllowed) { - // remove old one - if(mpPrimitiveAnimation) - { - delete mpPrimitiveAnimation; - mpPrimitiveAnimation = 0; - } + AnimatedExtractingProcessor2D aAnimatedExtractor(GetObjectContact().getViewInformation2D(), + bTextAnimationAllowed, bGraphicAnimationAllowed); + aAnimatedExtractor.process(mxPrimitive2DSequence); - // check for animated primitives - if(mxPrimitive2DSequence.hasElements()) + if(aAnimatedExtractor.getPrimitive2DSequence().hasElements()) { - const bool bTextAnimationAllowed(GetObjectContact().IsTextAnimationAllowed()); - const bool bGraphicAnimationAllowed(GetObjectContact().IsGraphicAnimationAllowed()); - - if(bTextAnimationAllowed || bGraphicAnimationAllowed) - { - AnimatedExtractingProcessor2D aAnimatedExtractor(GetObjectContact().getViewInformation2D(), - bTextAnimationAllowed, bGraphicAnimationAllowed); - aAnimatedExtractor.process(mxPrimitive2DSequence); - - if(aAnimatedExtractor.getPrimitive2DSequence().hasElements()) - { - // dervied primitiveList is animated, setup new PrimitiveAnimation - mpPrimitiveAnimation = new sdr::animation::PrimitiveAnimation(*this, aAnimatedExtractor.getPrimitive2DSequence()); - } - } + // dervied primitiveList is animated, setup new PrimitiveAnimation + mpPrimitiveAnimation = new sdr::animation::PrimitiveAnimation(*this, aAnimatedExtractor.getPrimitive2DSequence()); } } + } +} + +drawinglayer::primitive2d::Primitive2DSequence ViewObjectContact::createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const +{ + // get the view-independent Primitive from the viewContact + drawinglayer::primitive2d::Primitive2DSequence xRetval(GetViewContact().getViewIndependentPrimitive2DSequence()); - drawinglayer::primitive2d::Primitive2DSequence ViewObjectContact::createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const + if(xRetval.hasElements()) + { + // handle GluePoint + if(!GetObjectContact().isOutputToPrinter() && GetObjectContact().AreGluePointsVisible()) { - // get the view-independent Primitive from the viewContact - drawinglayer::primitive2d::Primitive2DSequence xRetval(GetViewContact().getViewIndependentPrimitive2DSequence()); + const drawinglayer::primitive2d::Primitive2DSequence xGlue(GetViewContact().createGluePointPrimitive2DSequence()); - if(xRetval.hasElements()) + if(xGlue.hasElements()) { - // handle GluePoint - if(!GetObjectContact().isOutputToPrinter() && GetObjectContact().AreGluePointsVisible()) - { - const drawinglayer::primitive2d::Primitive2DSequence xGlue(GetViewContact().createGluePointPrimitive2DSequence()); - - if(xGlue.hasElements()) - { - drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, xGlue); - } - } - - // handle ghosted - if(isPrimitiveGhosted(rDisplayInfo)) - { - const basegfx::BColor aRGBWhite(1.0, 1.0, 1.0); - const basegfx::BColorModifierSharedPtr aBColorModifier( - new basegfx::BColorModifier_interpolate( - aRGBWhite, - 0.5)); - const drawinglayer::primitive2d::Primitive2DReference xReference( - new drawinglayer::primitive2d::ModifiedColorPrimitive2D( - xRetval, - aBColorModifier)); - - xRetval = drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1); - } + drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, xGlue); } - - return xRetval; } - drawinglayer::primitive2d::Primitive2DSequence ViewObjectContact::getPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const + // handle ghosted + if(isPrimitiveGhosted(rDisplayInfo)) { - drawinglayer::primitive2d::Primitive2DSequence xNewPrimitiveSequence; + const basegfx::BColor aRGBWhite(1.0, 1.0, 1.0); + const basegfx::BColorModifierSharedPtr aBColorModifier( + new basegfx::BColorModifier_interpolate( + aRGBWhite, + 0.5)); + const drawinglayer::primitive2d::Primitive2DReference xReference( + new drawinglayer::primitive2d::ModifiedColorPrimitive2D( + xRetval, + aBColorModifier)); + + xRetval = drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1); + } + } - // take care of redirectors and create new list - ViewObjectContactRedirector* pRedirector = GetObjectContact().GetViewObjectContactRedirector(); + return xRetval; +} - if(pRedirector) - { - xNewPrimitiveSequence = pRedirector->createRedirectedPrimitive2DSequence(*this, rDisplayInfo); - } - else - { - xNewPrimitiveSequence = createPrimitive2DSequence(rDisplayInfo); - } +drawinglayer::primitive2d::Primitive2DSequence ViewObjectContact::getPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const +{ + drawinglayer::primitive2d::Primitive2DSequence xNewPrimitiveSequence; - // local up-to-date checks. New list different from local one? - if(!drawinglayer::primitive2d::arePrimitive2DSequencesEqual(mxPrimitive2DSequence, xNewPrimitiveSequence)) - { - // has changed, copy content - const_cast< ViewObjectContact* >(this)->mxPrimitive2DSequence = xNewPrimitiveSequence; + // take care of redirectors and create new list + ViewObjectContactRedirector* pRedirector = GetObjectContact().GetViewObjectContactRedirector(); + + if(pRedirector) + { + xNewPrimitiveSequence = pRedirector->createRedirectedPrimitive2DSequence(*this, rDisplayInfo); + } + else + { + xNewPrimitiveSequence = createPrimitive2DSequence(rDisplayInfo); + } - // check for animated stuff - const_cast< ViewObjectContact* >(this)->checkForPrimitive2DAnimations(); + // local up-to-date checks. New list different from local one? + if(!drawinglayer::primitive2d::arePrimitive2DSequencesEqual(mxPrimitive2DSequence, xNewPrimitiveSequence)) + { + // has changed, copy content + const_cast< ViewObjectContact* >(this)->mxPrimitive2DSequence = xNewPrimitiveSequence; - // always update object range when PrimitiveSequence changes - const drawinglayer::geometry::ViewInformation2D& rViewInformation2D(GetObjectContact().getViewInformation2D()); - const_cast< ViewObjectContact* >(this)->maObjectRange = - drawinglayer::primitive2d::getB2DRangeFromPrimitive2DSequence(mxPrimitive2DSequence, rViewInformation2D); - } + // check for animated stuff + const_cast< ViewObjectContact* >(this)->checkForPrimitive2DAnimations(); - // return current Primitive2DSequence - return mxPrimitive2DSequence; - } + // always update object range when PrimitiveSequence changes + const drawinglayer::geometry::ViewInformation2D& rViewInformation2D(GetObjectContact().getViewInformation2D()); + const_cast< ViewObjectContact* >(this)->maObjectRange = + drawinglayer::primitive2d::getB2DRangeFromPrimitive2DSequence(mxPrimitive2DSequence, rViewInformation2D); + } - bool ViewObjectContact::isPrimitiveVisible(const DisplayInfo& /*rDisplayInfo*/) const - { - // default: always visible - return true; - } + // return current Primitive2DSequence + return mxPrimitive2DSequence; +} - bool ViewObjectContact::isPrimitiveGhosted(const DisplayInfo& rDisplayInfo) const - { - // default: standard check - return (GetObjectContact().DoVisualizeEnteredGroup() && !GetObjectContact().isOutputToPrinter() && rDisplayInfo.IsGhostedDrawModeActive()); - } +bool ViewObjectContact::isPrimitiveVisible(const DisplayInfo& /*rDisplayInfo*/) const +{ + // default: always visible + return true; +} + +bool ViewObjectContact::isPrimitiveGhosted(const DisplayInfo& rDisplayInfo) const +{ + // default: standard check + return (GetObjectContact().DoVisualizeEnteredGroup() && !GetObjectContact().isOutputToPrinter() && rDisplayInfo.IsGhostedDrawModeActive()); +} + +drawinglayer::primitive2d::Primitive2DSequence ViewObjectContact::getPrimitive2DSequenceHierarchy(DisplayInfo& rDisplayInfo) const +{ + drawinglayer::primitive2d::Primitive2DSequence xRetval; + + // check model-view visibility + if(isPrimitiveVisible(rDisplayInfo)) + { + xRetval = getPrimitive2DSequence(rDisplayInfo); - drawinglayer::primitive2d::Primitive2DSequence ViewObjectContact::getPrimitive2DSequenceHierarchy(DisplayInfo& rDisplayInfo) const + if(xRetval.hasElements()) { - drawinglayer::primitive2d::Primitive2DSequence xRetval; + // get ranges + const drawinglayer::geometry::ViewInformation2D& rViewInformation2D(GetObjectContact().getViewInformation2D()); + const basegfx::B2DRange aObjectRange(drawinglayer::primitive2d::getB2DRangeFromPrimitive2DSequence(xRetval, rViewInformation2D)); + const basegfx::B2DRange aViewRange(rViewInformation2D.getViewport()); - // check model-view visibility - if(isPrimitiveVisible(rDisplayInfo)) + // check geometrical visibility + if(!aViewRange.isEmpty() && !aViewRange.overlaps(aObjectRange)) { - xRetval = getPrimitive2DSequence(rDisplayInfo); - - if(xRetval.hasElements()) - { - // get ranges - const drawinglayer::geometry::ViewInformation2D& rViewInformation2D(GetObjectContact().getViewInformation2D()); - const basegfx::B2DRange aObjectRange(drawinglayer::primitive2d::getB2DRangeFromPrimitive2DSequence(xRetval, rViewInformation2D)); - const basegfx::B2DRange aViewRange(rViewInformation2D.getViewport()); - - // check geometrical visibility - if(!aViewRange.isEmpty() && !aViewRange.overlaps(aObjectRange)) - { - // not visible, release - xRetval.realloc(0); - } - } + // not visible, release + xRetval.realloc(0); } - - return xRetval; } + } - drawinglayer::primitive2d::Primitive2DSequence ViewObjectContact::getPrimitive2DSequenceSubHierarchy(DisplayInfo& rDisplayInfo) const - { - const sal_uInt32 nSubHierarchyCount(GetViewContact().GetObjectCount()); - drawinglayer::primitive2d::Primitive2DSequence xSeqRetval; + return xRetval; +} - for(sal_uInt32 a(0); a < nSubHierarchyCount; a++) - { - const ViewObjectContact& rCandidate(GetViewContact().GetViewContact(a).GetViewObjectContact(GetObjectContact())); +drawinglayer::primitive2d::Primitive2DSequence ViewObjectContact::getPrimitive2DSequenceSubHierarchy(DisplayInfo& rDisplayInfo) const +{ + const sal_uInt32 nSubHierarchyCount(GetViewContact().GetObjectCount()); + drawinglayer::primitive2d::Primitive2DSequence xSeqRetval; - drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xSeqRetval, rCandidate.getPrimitive2DSequenceHierarchy(rDisplayInfo)); - } + for(sal_uInt32 a(0); a < nSubHierarchyCount; a++) + { + const ViewObjectContact& rCandidate(GetViewContact().GetViewContact(a).GetViewObjectContact(GetObjectContact())); - return xSeqRetval; - } - } // end of namespace contact -} // end of namespace sdr + drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xSeqRetval, rCandidate.getPrimitive2DSequenceHierarchy(rDisplayInfo)); + } + + return xSeqRetval; +} + +}} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits