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