1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_drawinglayer.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <drawinglayer/processor2d/textaspolygonextractor2d.hxx>
28*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
29*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
30*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
31*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/modifiedcolorprimitive2d.hxx>
32*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/transformprimitive2d.hxx>
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski namespace drawinglayer
37*b1cdbd2cSJim Jagielski {
38*b1cdbd2cSJim Jagielski 	namespace processor2d
39*b1cdbd2cSJim Jagielski 	{
processBasePrimitive2D(const primitive2d::BasePrimitive2D & rCandidate)40*b1cdbd2cSJim Jagielski 		void TextAsPolygonExtractor2D::processBasePrimitive2D(const primitive2d::BasePrimitive2D& rCandidate)
41*b1cdbd2cSJim Jagielski 		{
42*b1cdbd2cSJim Jagielski 			switch(rCandidate.getPrimitive2DID())
43*b1cdbd2cSJim Jagielski 			{
44*b1cdbd2cSJim Jagielski 				case PRIMITIVE2D_ID_TEXTDECORATEDPORTIONPRIMITIVE2D :
45*b1cdbd2cSJim Jagielski 				{
46*b1cdbd2cSJim Jagielski 					// TextDecoratedPortionPrimitive2D can produce the following primitives
47*b1cdbd2cSJim Jagielski 					// when being decomposed:
48*b1cdbd2cSJim Jagielski 					//
49*b1cdbd2cSJim Jagielski 					// - TextSimplePortionPrimitive2D
50*b1cdbd2cSJim Jagielski 					// - PolygonWavePrimitive2D
51*b1cdbd2cSJim Jagielski 					//		- PolygonStrokePrimitive2D
52*b1cdbd2cSJim Jagielski 					// - PolygonStrokePrimitive2D
53*b1cdbd2cSJim Jagielski 					//		- PolyPolygonColorPrimitive2D
54*b1cdbd2cSJim Jagielski 					//		- PolyPolygonHairlinePrimitive2D
55*b1cdbd2cSJim Jagielski 					//			- PolygonHairlinePrimitive2D
56*b1cdbd2cSJim Jagielski 					// - ShadowPrimitive2D
57*b1cdbd2cSJim Jagielski 					//		- ModifiedColorPrimitive2D
58*b1cdbd2cSJim Jagielski 					//		- TransformPrimitive2D
59*b1cdbd2cSJim Jagielski 					// - TextEffectPrimitive2D
60*b1cdbd2cSJim Jagielski 					//		- ModifiedColorPrimitive2D
61*b1cdbd2cSJim Jagielski 					//		- TransformPrimitive2D
62*b1cdbd2cSJim Jagielski 					//		- GroupPrimitive2D
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski 					// encapsulate with flag and use decomposition
65*b1cdbd2cSJim Jagielski 					mnInText++;
66*b1cdbd2cSJim Jagielski 					process(rCandidate.get2DDecomposition(getViewInformation2D()));
67*b1cdbd2cSJim Jagielski 					mnInText--;
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski 					break;
70*b1cdbd2cSJim Jagielski 				}
71*b1cdbd2cSJim Jagielski 				case PRIMITIVE2D_ID_TEXTSIMPLEPORTIONPRIMITIVE2D :
72*b1cdbd2cSJim Jagielski 				{
73*b1cdbd2cSJim Jagielski 					// TextSimplePortionPrimitive2D can produce the following primitives
74*b1cdbd2cSJim Jagielski 					// when being decomposed:
75*b1cdbd2cSJim Jagielski 					//
76*b1cdbd2cSJim Jagielski 					// - PolyPolygonColorPrimitive2D
77*b1cdbd2cSJim Jagielski 					// - TextEffectPrimitive2D
78*b1cdbd2cSJim Jagielski 					//		- ModifiedColorPrimitive2D
79*b1cdbd2cSJim Jagielski 					//		- TransformPrimitive2D
80*b1cdbd2cSJim Jagielski 					//		- GroupPrimitive2D
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski 					// encapsulate with flag and use decomposition
83*b1cdbd2cSJim Jagielski 					mnInText++;
84*b1cdbd2cSJim Jagielski 					process(rCandidate.get2DDecomposition(getViewInformation2D()));
85*b1cdbd2cSJim Jagielski 					mnInText--;
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski 					break;
88*b1cdbd2cSJim Jagielski 				}
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski 				// as can be seen from the TextSimplePortionPrimitive2D and the
91*b1cdbd2cSJim Jagielski 				// TextDecoratedPortionPrimitive2D, inside of the mnInText marks
92*b1cdbd2cSJim Jagielski 				// the following primitives can occurr containing geometry data
93*b1cdbd2cSJim Jagielski 				// from text decomposition:
94*b1cdbd2cSJim Jagielski 				//
95*b1cdbd2cSJim Jagielski 				// - PolyPolygonColorPrimitive2D
96*b1cdbd2cSJim Jagielski 				// - PolygonHairlinePrimitive2D
97*b1cdbd2cSJim Jagielski 				// - PolyPolygonHairlinePrimitive2D (for convenience)
98*b1cdbd2cSJim Jagielski 				//
99*b1cdbd2cSJim Jagielski 				case PRIMITIVE2D_ID_POLYPOLYGONCOLORPRIMITIVE2D :
100*b1cdbd2cSJim Jagielski 				{
101*b1cdbd2cSJim Jagielski 					if(mnInText)
102*b1cdbd2cSJim Jagielski 					{
103*b1cdbd2cSJim Jagielski 						const primitive2d::PolyPolygonColorPrimitive2D& rPoPoCoCandidate(static_cast< const primitive2d::PolyPolygonColorPrimitive2D& >(rCandidate));
104*b1cdbd2cSJim Jagielski 						basegfx::B2DPolyPolygon aPolyPolygon(rPoPoCoCandidate.getB2DPolyPolygon());
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski 						if(aPolyPolygon.count())
107*b1cdbd2cSJim Jagielski 						{
108*b1cdbd2cSJim Jagielski 							// transform the PolyPolygon
109*b1cdbd2cSJim Jagielski 							aPolyPolygon.transform(getViewInformation2D().getObjectToViewTransformation());
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski 							// get evtl. corrected color
112*b1cdbd2cSJim Jagielski 							const basegfx::BColor aColor(maBColorModifierStack.getModifiedColor(rPoPoCoCandidate.getBColor()));
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski 							// add to result vector
115*b1cdbd2cSJim Jagielski 							maTarget.push_back(TextAsPolygonDataNode(aPolyPolygon, aColor, true));
116*b1cdbd2cSJim Jagielski 						}
117*b1cdbd2cSJim Jagielski 					}
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski 					break;
120*b1cdbd2cSJim Jagielski 				}
121*b1cdbd2cSJim Jagielski 				case PRIMITIVE2D_ID_POLYGONHAIRLINEPRIMITIVE2D :
122*b1cdbd2cSJim Jagielski 				{
123*b1cdbd2cSJim Jagielski 					if(mnInText)
124*b1cdbd2cSJim Jagielski 					{
125*b1cdbd2cSJim Jagielski 						const primitive2d::PolygonHairlinePrimitive2D& rPoHaCandidate(static_cast< const primitive2d::PolygonHairlinePrimitive2D& >(rCandidate));
126*b1cdbd2cSJim Jagielski 						basegfx::B2DPolygon aPolygon(rPoHaCandidate.getB2DPolygon());
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski 						if(aPolygon.count())
129*b1cdbd2cSJim Jagielski 						{
130*b1cdbd2cSJim Jagielski 							// transform the Polygon
131*b1cdbd2cSJim Jagielski 							aPolygon.transform(getViewInformation2D().getObjectToViewTransformation());
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 							// get evtl. corrected color
134*b1cdbd2cSJim Jagielski 							const basegfx::BColor aColor(maBColorModifierStack.getModifiedColor(rPoHaCandidate.getBColor()));
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski 							// add to result vector
137*b1cdbd2cSJim Jagielski 							maTarget.push_back(TextAsPolygonDataNode(basegfx::B2DPolyPolygon(aPolygon), aColor, false));
138*b1cdbd2cSJim Jagielski 						}
139*b1cdbd2cSJim Jagielski 					}
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski 					break;
142*b1cdbd2cSJim Jagielski 				}
143*b1cdbd2cSJim Jagielski 				case PRIMITIVE2D_ID_POLYPOLYGONHAIRLINEPRIMITIVE2D :
144*b1cdbd2cSJim Jagielski 				{
145*b1cdbd2cSJim Jagielski 					if(mnInText)
146*b1cdbd2cSJim Jagielski 					{
147*b1cdbd2cSJim Jagielski 						const primitive2d::PolyPolygonHairlinePrimitive2D& rPoPoHaCandidate(static_cast< const primitive2d::PolyPolygonHairlinePrimitive2D& >(rCandidate));
148*b1cdbd2cSJim Jagielski 						basegfx::B2DPolyPolygon aPolyPolygon(rPoPoHaCandidate.getB2DPolyPolygon());
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski 						if(aPolyPolygon.count())
151*b1cdbd2cSJim Jagielski 						{
152*b1cdbd2cSJim Jagielski 							// transform the Polygon
153*b1cdbd2cSJim Jagielski 							aPolyPolygon.transform(getViewInformation2D().getObjectToViewTransformation());
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 							// get evtl. corrected color
156*b1cdbd2cSJim Jagielski 							const basegfx::BColor aColor(maBColorModifierStack.getModifiedColor(rPoPoHaCandidate.getBColor()));
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski 							// add to result vector
159*b1cdbd2cSJim Jagielski 							maTarget.push_back(TextAsPolygonDataNode(aPolyPolygon, aColor, false));
160*b1cdbd2cSJim Jagielski 						}
161*b1cdbd2cSJim Jagielski 					}
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski 					break;
164*b1cdbd2cSJim Jagielski 				}
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski 				// usage of color modification stack is needed
167*b1cdbd2cSJim Jagielski 				case PRIMITIVE2D_ID_MODIFIEDCOLORPRIMITIVE2D :
168*b1cdbd2cSJim Jagielski 				{
169*b1cdbd2cSJim Jagielski 					const primitive2d::ModifiedColorPrimitive2D& rModifiedColorCandidate(static_cast< const primitive2d::ModifiedColorPrimitive2D& >(rCandidate));
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski 					if(rModifiedColorCandidate.getChildren().hasElements())
172*b1cdbd2cSJim Jagielski 					{
173*b1cdbd2cSJim Jagielski 						maBColorModifierStack.push(rModifiedColorCandidate.getColorModifier());
174*b1cdbd2cSJim Jagielski 						process(rModifiedColorCandidate.getChildren());
175*b1cdbd2cSJim Jagielski 						maBColorModifierStack.pop();
176*b1cdbd2cSJim Jagielski 					}
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski 					break;
179*b1cdbd2cSJim Jagielski 				}
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 				// usage of transformation stack is needed
182*b1cdbd2cSJim Jagielski 				case PRIMITIVE2D_ID_TRANSFORMPRIMITIVE2D :
183*b1cdbd2cSJim Jagielski 				{
184*b1cdbd2cSJim Jagielski 					// remember current transformation and ViewInformation
185*b1cdbd2cSJim Jagielski 					const primitive2d::TransformPrimitive2D& rTransformCandidate(static_cast< const primitive2d::TransformPrimitive2D& >(rCandidate));
186*b1cdbd2cSJim Jagielski 					const geometry::ViewInformation2D aLastViewInformation2D(getViewInformation2D());
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski 					// create new transformations for CurrentTransformation and for local ViewInformation2D
189*b1cdbd2cSJim Jagielski 					const geometry::ViewInformation2D aViewInformation2D(
190*b1cdbd2cSJim Jagielski 						getViewInformation2D().getObjectTransformation() * rTransformCandidate.getTransformation(),
191*b1cdbd2cSJim Jagielski 						getViewInformation2D().getViewTransformation(),
192*b1cdbd2cSJim Jagielski 						getViewInformation2D().getViewport(),
193*b1cdbd2cSJim Jagielski 						getViewInformation2D().getVisualizedPage(),
194*b1cdbd2cSJim Jagielski 						getViewInformation2D().getViewTime(),
195*b1cdbd2cSJim Jagielski 						getViewInformation2D().getExtendedInformationSequence());
196*b1cdbd2cSJim Jagielski 					updateViewInformation(aViewInformation2D);
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski 					// proccess content
199*b1cdbd2cSJim Jagielski 					process(rTransformCandidate.getChildren());
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski 					// restore transformations
202*b1cdbd2cSJim Jagielski 					updateViewInformation(aLastViewInformation2D);
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski 					break;
205*b1cdbd2cSJim Jagielski 				}
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski 				// ignorable primitives
208*b1cdbd2cSJim Jagielski 				case PRIMITIVE2D_ID_SCENEPRIMITIVE2D :
209*b1cdbd2cSJim Jagielski                 case PRIMITIVE2D_ID_WRONGSPELLPRIMITIVE2D :
210*b1cdbd2cSJim Jagielski 				case PRIMITIVE2D_ID_MARKERARRAYPRIMITIVE2D :
211*b1cdbd2cSJim Jagielski 				case PRIMITIVE2D_ID_POINTARRAYPRIMITIVE2D :
212*b1cdbd2cSJim Jagielski 				case PRIMITIVE2D_ID_BITMAPPRIMITIVE2D :
213*b1cdbd2cSJim Jagielski 				case PRIMITIVE2D_ID_METAFILEPRIMITIVE2D :
214*b1cdbd2cSJim Jagielski 				case PRIMITIVE2D_ID_MASKPRIMITIVE2D :
215*b1cdbd2cSJim Jagielski                 {
216*b1cdbd2cSJim Jagielski 					break;
217*b1cdbd2cSJim Jagielski 				}
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski 				default :
220*b1cdbd2cSJim Jagielski 				{
221*b1cdbd2cSJim Jagielski 					// process recursively
222*b1cdbd2cSJim Jagielski 					process(rCandidate.get2DDecomposition(getViewInformation2D()));
223*b1cdbd2cSJim Jagielski 					break;
224*b1cdbd2cSJim Jagielski 				}
225*b1cdbd2cSJim Jagielski 			}
226*b1cdbd2cSJim Jagielski 		}
227*b1cdbd2cSJim Jagielski 
TextAsPolygonExtractor2D(const geometry::ViewInformation2D & rViewInformation)228*b1cdbd2cSJim Jagielski 		TextAsPolygonExtractor2D::TextAsPolygonExtractor2D(const geometry::ViewInformation2D& rViewInformation)
229*b1cdbd2cSJim Jagielski 		:	BaseProcessor2D(rViewInformation),
230*b1cdbd2cSJim Jagielski 			maTarget(),
231*b1cdbd2cSJim Jagielski 			maBColorModifierStack(),
232*b1cdbd2cSJim Jagielski 			mnInText(0)
233*b1cdbd2cSJim Jagielski 		{
234*b1cdbd2cSJim Jagielski 		}
235*b1cdbd2cSJim Jagielski 
~TextAsPolygonExtractor2D()236*b1cdbd2cSJim Jagielski 		TextAsPolygonExtractor2D::~TextAsPolygonExtractor2D()
237*b1cdbd2cSJim Jagielski 		{
238*b1cdbd2cSJim Jagielski 		}
239*b1cdbd2cSJim Jagielski 	} // end of namespace processor2d
240*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
243*b1cdbd2cSJim Jagielski // eof
244