| /************************************************************** |
| * |
| * 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. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_drawinglayer.hxx" |
| |
| #include <drawinglayer/processor3d/geometry2dextractor.hxx> |
| #include <drawinglayer/primitive3d/drawinglayer_primitivetypes3d.hxx> |
| #include <drawinglayer/primitive3d/transformprimitive3d.hxx> |
| #include <drawinglayer/primitive3d/modifiedcolorprimitive3d.hxx> |
| #include <drawinglayer/primitive3d/polygonprimitive3d.hxx> |
| #include <basegfx/polygon/b2dpolygontools.hxx> |
| #include <drawinglayer/primitive2d/polygonprimitive2d.hxx> |
| #include <drawinglayer/primitive3d/polypolygonprimitive3d.hxx> |
| #include <basegfx/polygon/b2dpolypolygontools.hxx> |
| #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx> |
| #include <drawinglayer/primitive3d/textureprimitive3d.hxx> |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| using namespace com::sun::star; |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| namespace drawinglayer |
| { |
| namespace processor3d |
| { |
| // as tooling, the process() implementation takes over API handling and calls this |
| // virtual render method when the primitive implementation is BasePrimitive3D-based. |
| void Geometry2DExtractingProcessor::processBasePrimitive3D(const primitive3d::BasePrimitive3D& rCandidate) |
| { |
| // it is a BasePrimitive3D implementation, use getPrimitive3DID() call for switch |
| switch(rCandidate.getPrimitive3DID()) |
| { |
| case PRIMITIVE3D_ID_TRANSFORMPRIMITIVE3D : |
| { |
| // transform group. Remember current transformations |
| const primitive3d::TransformPrimitive3D& rPrimitive = static_cast< const primitive3d::TransformPrimitive3D& >(rCandidate); |
| const geometry::ViewInformation3D aLastViewInformation3D(getViewInformation3D()); |
| |
| // create new transformation; add new object transform from right side |
| const geometry::ViewInformation3D aNewViewInformation3D( |
| aLastViewInformation3D.getObjectTransformation() * rPrimitive.getTransformation(), |
| aLastViewInformation3D.getOrientation(), |
| aLastViewInformation3D.getProjection(), |
| aLastViewInformation3D.getDeviceToView(), |
| aLastViewInformation3D.getViewTime(), |
| aLastViewInformation3D.getExtendedInformationSequence()); |
| updateViewInformation(aNewViewInformation3D); |
| |
| // let break down recursively |
| process(rPrimitive.getChildren()); |
| |
| // restore transformations |
| updateViewInformation(aLastViewInformation3D); |
| break; |
| } |
| case PRIMITIVE3D_ID_MODIFIEDCOLORPRIMITIVE3D : |
| { |
| // ModifiedColorPrimitive3D; push, process and pop |
| const primitive3d::ModifiedColorPrimitive3D& rModifiedCandidate = static_cast< const primitive3d::ModifiedColorPrimitive3D& >(rCandidate); |
| const primitive3d::Primitive3DSequence& rSubSequence = rModifiedCandidate.getChildren(); |
| |
| if(rSubSequence.hasElements()) |
| { |
| maBColorModifierStack.push(rModifiedCandidate.getColorModifier()); |
| process(rModifiedCandidate.getChildren()); |
| maBColorModifierStack.pop(); |
| } |
| break; |
| } |
| case PRIMITIVE3D_ID_POLYGONHAIRLINEPRIMITIVE3D : |
| { |
| // PolygonHairlinePrimitive3D |
| const primitive3d::PolygonHairlinePrimitive3D& rPrimitive = static_cast< const primitive3d::PolygonHairlinePrimitive3D& >(rCandidate); |
| basegfx::B2DPolygon a2DHairline(basegfx::tools::createB2DPolygonFromB3DPolygon(rPrimitive.getB3DPolygon(), getViewInformation3D().getObjectToView())); |
| |
| if(a2DHairline.count()) |
| { |
| a2DHairline.transform(getObjectTransformation()); |
| const basegfx::BColor aModifiedColor(maBColorModifierStack.getModifiedColor(rPrimitive.getBColor())); |
| const primitive2d::Primitive2DReference xRef(new primitive2d::PolygonHairlinePrimitive2D(a2DHairline, aModifiedColor)); |
| primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(maPrimitive2DSequence, xRef); |
| } |
| break; |
| } |
| case PRIMITIVE3D_ID_POLYPOLYGONMATERIALPRIMITIVE3D : |
| { |
| // PolyPolygonMaterialPrimitive3D |
| const primitive3d::PolyPolygonMaterialPrimitive3D& rPrimitive = static_cast< const primitive3d::PolyPolygonMaterialPrimitive3D& >(rCandidate); |
| basegfx::B2DPolyPolygon a2DFill(basegfx::tools::createB2DPolyPolygonFromB3DPolyPolygon(rPrimitive.getB3DPolyPolygon(), getViewInformation3D().getObjectToView())); |
| |
| if(a2DFill.count()) |
| { |
| a2DFill.transform(getObjectTransformation()); |
| const basegfx::BColor aModifiedColor(maBColorModifierStack.getModifiedColor(rPrimitive.getMaterial().getColor())); |
| const primitive2d::Primitive2DReference xRef(new primitive2d::PolyPolygonColorPrimitive2D(a2DFill, aModifiedColor)); |
| primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(maPrimitive2DSequence, xRef); |
| } |
| break; |
| } |
| case PRIMITIVE3D_ID_GRADIENTTEXTUREPRIMITIVE3D : |
| case PRIMITIVE3D_ID_HATCHTEXTUREPRIMITIVE3D : |
| case PRIMITIVE3D_ID_BITMAPTEXTUREPRIMITIVE3D : |
| case PRIMITIVE3D_ID_TRANSPARENCETEXTUREPRIMITIVE3D : |
| case PRIMITIVE3D_ID_UNIFIEDTRANSPARENCETEXTUREPRIMITIVE3D : |
| { |
| // TexturePrimitive3D: Process children, do not try to decompose |
| const primitive3d::TexturePrimitive3D& rTexturePrimitive = static_cast< const primitive3d::TexturePrimitive3D& >(rCandidate); |
| const primitive3d::Primitive3DSequence aChildren(rTexturePrimitive.getChildren()); |
| |
| if(aChildren.hasElements()) |
| { |
| process(aChildren); |
| } |
| break; |
| } |
| case PRIMITIVE3D_ID_SHADOWPRIMITIVE3D : |
| { |
| // accept but ignore labels and shadow; these should be extracted separately |
| break; |
| } |
| default : |
| { |
| // process recursively |
| process(rCandidate.get3DDecomposition(getViewInformation3D())); |
| break; |
| } |
| } |
| } |
| |
| Geometry2DExtractingProcessor::Geometry2DExtractingProcessor( |
| const geometry::ViewInformation3D& rViewInformation, |
| const basegfx::B2DHomMatrix& rObjectTransformation) |
| : BaseProcessor3D(rViewInformation), |
| maPrimitive2DSequence(), |
| maObjectTransformation(rObjectTransformation), |
| maBColorModifierStack() |
| { |
| } |
| } // end of namespace processor3d |
| } // end of namespace drawinglayer |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| // eof |