1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_drawinglayer.hxx"
30 
31 #include <drawinglayer/processor3d/geometry2dextractor.hxx>
32 #include <drawinglayer/primitive3d/drawinglayer_primitivetypes3d.hxx>
33 #include <drawinglayer/primitive3d/transformprimitive3d.hxx>
34 #include <drawinglayer/primitive3d/modifiedcolorprimitive3d.hxx>
35 #include <drawinglayer/primitive3d/polygonprimitive3d.hxx>
36 #include <basegfx/polygon/b2dpolygontools.hxx>
37 #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
38 #include <drawinglayer/primitive3d/polypolygonprimitive3d.hxx>
39 #include <basegfx/polygon/b2dpolypolygontools.hxx>
40 #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
41 #include <drawinglayer/primitive3d/textureprimitive3d.hxx>
42 
43 //////////////////////////////////////////////////////////////////////////////
44 
45 using namespace com::sun::star;
46 
47 //////////////////////////////////////////////////////////////////////////////
48 
49 namespace drawinglayer
50 {
51 	namespace processor3d
52 	{
53 		// as tooling, the process() implementation takes over API handling and calls this
54 		// virtual render method when the primitive implementation is BasePrimitive3D-based.
55 		void Geometry2DExtractingProcessor::processBasePrimitive3D(const primitive3d::BasePrimitive3D& rCandidate)
56 		{
57 			// it is a BasePrimitive3D implementation, use getPrimitive3DID() call for switch
58 			switch(rCandidate.getPrimitive3DID())
59 			{
60 				case PRIMITIVE3D_ID_TRANSFORMPRIMITIVE3D :
61 				{
62 					// transform group. Remember current transformations
63 					const primitive3d::TransformPrimitive3D& rPrimitive = static_cast< const primitive3d::TransformPrimitive3D& >(rCandidate);
64 					const geometry::ViewInformation3D aLastViewInformation3D(getViewInformation3D());
65 
66 					// create new transformation; add new object transform from right side
67 					const geometry::ViewInformation3D aNewViewInformation3D(
68 						aLastViewInformation3D.getObjectTransformation() * rPrimitive.getTransformation(),
69 						aLastViewInformation3D.getOrientation(),
70 						aLastViewInformation3D.getProjection(),
71 						aLastViewInformation3D.getDeviceToView(),
72 						aLastViewInformation3D.getViewTime(),
73 						aLastViewInformation3D.getExtendedInformationSequence());
74 					updateViewInformation(aNewViewInformation3D);
75 
76 					// let break down recursively
77 					process(rPrimitive.getChildren());
78 
79 					// restore transformations
80 					updateViewInformation(aLastViewInformation3D);
81 					break;
82 				}
83 				case PRIMITIVE3D_ID_MODIFIEDCOLORPRIMITIVE3D :
84 				{
85 					// ModifiedColorPrimitive3D; push, process and pop
86 					const primitive3d::ModifiedColorPrimitive3D& rModifiedCandidate = static_cast< const primitive3d::ModifiedColorPrimitive3D& >(rCandidate);
87 					const primitive3d::Primitive3DSequence& rSubSequence = rModifiedCandidate.getChildren();
88 
89 					if(rSubSequence.hasElements())
90 					{
91 						maBColorModifierStack.push(rModifiedCandidate.getColorModifier());
92 						process(rModifiedCandidate.getChildren());
93 						maBColorModifierStack.pop();
94 					}
95 					break;
96 				}
97 				case PRIMITIVE3D_ID_POLYGONHAIRLINEPRIMITIVE3D :
98 				{
99 					// PolygonHairlinePrimitive3D
100 					const primitive3d::PolygonHairlinePrimitive3D& rPrimitive = static_cast< const primitive3d::PolygonHairlinePrimitive3D& >(rCandidate);
101 					basegfx::B2DPolygon a2DHairline(basegfx::tools::createB2DPolygonFromB3DPolygon(rPrimitive.getB3DPolygon(), getViewInformation3D().getObjectToView()));
102 
103 					if(a2DHairline.count())
104 					{
105 						a2DHairline.transform(getObjectTransformation());
106 						const basegfx::BColor aModifiedColor(maBColorModifierStack.getModifiedColor(rPrimitive.getBColor()));
107 						const primitive2d::Primitive2DReference xRef(new primitive2d::PolygonHairlinePrimitive2D(a2DHairline, aModifiedColor));
108 						primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(maPrimitive2DSequence, xRef);
109 					}
110 					break;
111 				}
112 				case PRIMITIVE3D_ID_POLYPOLYGONMATERIALPRIMITIVE3D :
113 				{
114 					// PolyPolygonMaterialPrimitive3D
115 					const primitive3d::PolyPolygonMaterialPrimitive3D& rPrimitive = static_cast< const primitive3d::PolyPolygonMaterialPrimitive3D& >(rCandidate);
116 					basegfx::B2DPolyPolygon a2DFill(basegfx::tools::createB2DPolyPolygonFromB3DPolyPolygon(rPrimitive.getB3DPolyPolygon(), getViewInformation3D().getObjectToView()));
117 
118 					if(a2DFill.count())
119 					{
120 						a2DFill.transform(getObjectTransformation());
121 						const basegfx::BColor aModifiedColor(maBColorModifierStack.getModifiedColor(rPrimitive.getMaterial().getColor()));
122 						const primitive2d::Primitive2DReference xRef(new primitive2d::PolyPolygonColorPrimitive2D(a2DFill, aModifiedColor));
123 						primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(maPrimitive2DSequence, xRef);
124 					}
125 					break;
126 				}
127 				case PRIMITIVE3D_ID_GRADIENTTEXTUREPRIMITIVE3D :
128 				case PRIMITIVE3D_ID_HATCHTEXTUREPRIMITIVE3D :
129 				case PRIMITIVE3D_ID_BITMAPTEXTUREPRIMITIVE3D :
130 				case PRIMITIVE3D_ID_TRANSPARENCETEXTUREPRIMITIVE3D :
131 				case PRIMITIVE3D_ID_UNIFIEDTRANSPARENCETEXTUREPRIMITIVE3D :
132 				{
133 					// TexturePrimitive3D: Process children, do not try to decompose
134 					const primitive3d::TexturePrimitive3D& rTexturePrimitive = static_cast< const primitive3d::TexturePrimitive3D& >(rCandidate);
135 					const primitive3d::Primitive3DSequence aChildren(rTexturePrimitive.getChildren());
136 
137 					if(aChildren.hasElements())
138 					{
139 						process(aChildren);
140 					}
141 					break;
142 				}
143 				case PRIMITIVE3D_ID_SHADOWPRIMITIVE3D :
144 				{
145 					// accept but ignore labels and shadow; these should be extracted seperately
146 					break;
147 				}
148 				default :
149 				{
150 					// process recursively
151 					process(rCandidate.get3DDecomposition(getViewInformation3D()));
152 					break;
153 				}
154 			}
155 		}
156 
157 		Geometry2DExtractingProcessor::Geometry2DExtractingProcessor(
158 			const geometry::ViewInformation3D& rViewInformation,
159 			const basegfx::B2DHomMatrix& rObjectTransformation)
160 		:	BaseProcessor3D(rViewInformation),
161 			maPrimitive2DSequence(),
162 			maObjectTransformation(rObjectTransformation),
163 			maBColorModifierStack()
164 		{
165 		}
166 	} // end of namespace processor3d
167 } // end of namespace drawinglayer
168 
169 //////////////////////////////////////////////////////////////////////////////
170 // eof
171