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/primitive2d/texteffectprimitive2d.hxx> 28*b1cdbd2cSJim Jagielski #include <drawinglayer/geometry/viewinformation2d.hxx> 29*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/modifiedcolorprimitive2d.hxx> 30*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/transformprimitive2d.hxx> 31*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx> 32*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrixtools.hxx> 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski namespace drawinglayer 37*b1cdbd2cSJim Jagielski { 38*b1cdbd2cSJim Jagielski namespace primitive2d 39*b1cdbd2cSJim Jagielski { 40*b1cdbd2cSJim Jagielski static double fDiscreteSize(1.1); 41*b1cdbd2cSJim Jagielski create2DDecomposition(const geometry::ViewInformation2D & rViewInformation) const42*b1cdbd2cSJim Jagielski Primitive2DSequence TextEffectPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const 43*b1cdbd2cSJim Jagielski { 44*b1cdbd2cSJim Jagielski Primitive2DSequence aRetval; 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski // get the distance of one discrete units from target display. Use between 1.0 and sqrt(2) to 47*b1cdbd2cSJim Jagielski // have good results on rotated objects, too 48*b1cdbd2cSJim Jagielski const basegfx::B2DVector aDistance(rViewInformation.getInverseObjectToViewTransformation() * 49*b1cdbd2cSJim Jagielski basegfx::B2DVector(fDiscreteSize, fDiscreteSize)); 50*b1cdbd2cSJim Jagielski const basegfx::B2DVector aDiagonalDistance(aDistance * (1.0 / 1.44)); 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski switch(getTextEffectStyle2D()) 53*b1cdbd2cSJim Jagielski { 54*b1cdbd2cSJim Jagielski case TEXTEFFECTSTYLE2D_RELIEF_EMBOSSED: 55*b1cdbd2cSJim Jagielski case TEXTEFFECTSTYLE2D_RELIEF_ENGRAVED: 56*b1cdbd2cSJim Jagielski case TEXTEFFECTSTYLE2D_RELIEF_EMBOSSED_DEFAULT: 57*b1cdbd2cSJim Jagielski case TEXTEFFECTSTYLE2D_RELIEF_ENGRAVED_DEFAULT: 58*b1cdbd2cSJim Jagielski { 59*b1cdbd2cSJim Jagielski // prepare transform of sub-group back to (0,0) and align to X-Axis 60*b1cdbd2cSJim Jagielski basegfx::B2DHomMatrix aBackTransform(basegfx::tools::createTranslateB2DHomMatrix( 61*b1cdbd2cSJim Jagielski -getRotationCenter().getX(), -getRotationCenter().getY())); 62*b1cdbd2cSJim Jagielski aBackTransform.rotate(-getDirection()); 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski // prepare transform of sub-group back to it's position and rotation 65*b1cdbd2cSJim Jagielski basegfx::B2DHomMatrix aForwardTransform(basegfx::tools::createRotateB2DHomMatrix(getDirection())); 66*b1cdbd2cSJim Jagielski aForwardTransform.translate(getRotationCenter().getX(), getRotationCenter().getY()); 67*b1cdbd2cSJim Jagielski 68*b1cdbd2cSJim Jagielski // create transformation for one discrete unit 69*b1cdbd2cSJim Jagielski const bool bEmbossed( 70*b1cdbd2cSJim Jagielski TEXTEFFECTSTYLE2D_RELIEF_EMBOSSED == getTextEffectStyle2D() 71*b1cdbd2cSJim Jagielski || TEXTEFFECTSTYLE2D_RELIEF_EMBOSSED_DEFAULT == getTextEffectStyle2D()); 72*b1cdbd2cSJim Jagielski const bool bDefaultTextColor( 73*b1cdbd2cSJim Jagielski TEXTEFFECTSTYLE2D_RELIEF_EMBOSSED_DEFAULT == getTextEffectStyle2D() 74*b1cdbd2cSJim Jagielski || TEXTEFFECTSTYLE2D_RELIEF_ENGRAVED_DEFAULT == getTextEffectStyle2D()); 75*b1cdbd2cSJim Jagielski basegfx::B2DHomMatrix aTransform(aBackTransform); 76*b1cdbd2cSJim Jagielski aRetval.realloc(2); 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski if(bEmbossed) 79*b1cdbd2cSJim Jagielski { 80*b1cdbd2cSJim Jagielski // to bottom-right 81*b1cdbd2cSJim Jagielski aTransform.translate(aDiagonalDistance.getX(), aDiagonalDistance.getY()); 82*b1cdbd2cSJim Jagielski } 83*b1cdbd2cSJim Jagielski else 84*b1cdbd2cSJim Jagielski { 85*b1cdbd2cSJim Jagielski // to top-left 86*b1cdbd2cSJim Jagielski aTransform.translate(-aDiagonalDistance.getX(), -aDiagonalDistance.getY()); 87*b1cdbd2cSJim Jagielski } 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski aTransform *= aForwardTransform; 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski if(bDefaultTextColor) 92*b1cdbd2cSJim Jagielski { 93*b1cdbd2cSJim Jagielski // emboss/engrave in black, original forced to white 94*b1cdbd2cSJim Jagielski const basegfx::BColorModifierSharedPtr aBColorModifierToGray( 95*b1cdbd2cSJim Jagielski new basegfx::BColorModifier_replace( 96*b1cdbd2cSJim Jagielski basegfx::BColor(0.0))); 97*b1cdbd2cSJim Jagielski const Primitive2DReference xModifiedColor( 98*b1cdbd2cSJim Jagielski new ModifiedColorPrimitive2D( 99*b1cdbd2cSJim Jagielski getTextContent(), 100*b1cdbd2cSJim Jagielski aBColorModifierToGray)); 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski aRetval[0] = Primitive2DReference( 103*b1cdbd2cSJim Jagielski new TransformPrimitive2D( 104*b1cdbd2cSJim Jagielski aTransform, 105*b1cdbd2cSJim Jagielski Primitive2DSequence(&xModifiedColor, 1))); 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski // add original, too 108*b1cdbd2cSJim Jagielski const basegfx::BColorModifierSharedPtr aBColorModifierToWhite( 109*b1cdbd2cSJim Jagielski new basegfx::BColorModifier_replace( 110*b1cdbd2cSJim Jagielski basegfx::BColor(1.0))); 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski aRetval[1] = Primitive2DReference( 113*b1cdbd2cSJim Jagielski new ModifiedColorPrimitive2D( 114*b1cdbd2cSJim Jagielski getTextContent(), 115*b1cdbd2cSJim Jagielski aBColorModifierToWhite)); 116*b1cdbd2cSJim Jagielski } 117*b1cdbd2cSJim Jagielski else 118*b1cdbd2cSJim Jagielski { 119*b1cdbd2cSJim Jagielski // emboss/engrave in gray, keep original's color 120*b1cdbd2cSJim Jagielski const basegfx::BColorModifierSharedPtr aBColorModifierToGray( 121*b1cdbd2cSJim Jagielski new basegfx::BColorModifier_replace( 122*b1cdbd2cSJim Jagielski basegfx::BColor(0.75))); // 192 123*b1cdbd2cSJim Jagielski const Primitive2DReference xModifiedColor( 124*b1cdbd2cSJim Jagielski new ModifiedColorPrimitive2D( 125*b1cdbd2cSJim Jagielski getTextContent(), 126*b1cdbd2cSJim Jagielski aBColorModifierToGray)); 127*b1cdbd2cSJim Jagielski 128*b1cdbd2cSJim Jagielski aRetval[0] = Primitive2DReference( 129*b1cdbd2cSJim Jagielski new TransformPrimitive2D( 130*b1cdbd2cSJim Jagielski aTransform, 131*b1cdbd2cSJim Jagielski Primitive2DSequence(&xModifiedColor, 1))); 132*b1cdbd2cSJim Jagielski 133*b1cdbd2cSJim Jagielski // add original, too 134*b1cdbd2cSJim Jagielski aRetval[1] = Primitive2DReference(new GroupPrimitive2D(getTextContent())); 135*b1cdbd2cSJim Jagielski } 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski break; 138*b1cdbd2cSJim Jagielski } 139*b1cdbd2cSJim Jagielski case TEXTEFFECTSTYLE2D_OUTLINE: 140*b1cdbd2cSJim Jagielski { 141*b1cdbd2cSJim Jagielski // create transform primitives in all directions 142*b1cdbd2cSJim Jagielski basegfx::B2DHomMatrix aTransform; 143*b1cdbd2cSJim Jagielski aRetval.realloc(9); 144*b1cdbd2cSJim Jagielski 145*b1cdbd2cSJim Jagielski aTransform.set(0, 2, aDistance.getX()); 146*b1cdbd2cSJim Jagielski aTransform.set(1, 2, 0.0); 147*b1cdbd2cSJim Jagielski aRetval[0] = Primitive2DReference(new TransformPrimitive2D(aTransform, getTextContent())); 148*b1cdbd2cSJim Jagielski 149*b1cdbd2cSJim Jagielski aTransform.set(0, 2, aDiagonalDistance.getX()); 150*b1cdbd2cSJim Jagielski aTransform.set(1, 2, aDiagonalDistance.getY()); 151*b1cdbd2cSJim Jagielski aRetval[1] = Primitive2DReference(new TransformPrimitive2D(aTransform, getTextContent())); 152*b1cdbd2cSJim Jagielski 153*b1cdbd2cSJim Jagielski aTransform.set(0, 2, 0.0); 154*b1cdbd2cSJim Jagielski aTransform.set(1, 2, aDistance.getY()); 155*b1cdbd2cSJim Jagielski aRetval[2] = Primitive2DReference(new TransformPrimitive2D(aTransform, getTextContent())); 156*b1cdbd2cSJim Jagielski 157*b1cdbd2cSJim Jagielski aTransform.set(0, 2, -aDiagonalDistance.getX()); 158*b1cdbd2cSJim Jagielski aTransform.set(1, 2, aDiagonalDistance.getY()); 159*b1cdbd2cSJim Jagielski aRetval[3] = Primitive2DReference(new TransformPrimitive2D(aTransform, getTextContent())); 160*b1cdbd2cSJim Jagielski 161*b1cdbd2cSJim Jagielski aTransform.set(0, 2, -aDistance.getX()); 162*b1cdbd2cSJim Jagielski aTransform.set(1, 2, 0.0); 163*b1cdbd2cSJim Jagielski aRetval[4] = Primitive2DReference(new TransformPrimitive2D(aTransform, getTextContent())); 164*b1cdbd2cSJim Jagielski 165*b1cdbd2cSJim Jagielski aTransform.set(0, 2, -aDiagonalDistance.getX()); 166*b1cdbd2cSJim Jagielski aTransform.set(1, 2, -aDiagonalDistance.getY()); 167*b1cdbd2cSJim Jagielski aRetval[5] = Primitive2DReference(new TransformPrimitive2D(aTransform, getTextContent())); 168*b1cdbd2cSJim Jagielski 169*b1cdbd2cSJim Jagielski aTransform.set(0, 2, 0.0); 170*b1cdbd2cSJim Jagielski aTransform.set(1, 2, -aDistance.getY()); 171*b1cdbd2cSJim Jagielski aRetval[6] = Primitive2DReference(new TransformPrimitive2D(aTransform, getTextContent())); 172*b1cdbd2cSJim Jagielski 173*b1cdbd2cSJim Jagielski aTransform.set(0, 2, aDiagonalDistance.getX()); 174*b1cdbd2cSJim Jagielski aTransform.set(1, 2, -aDiagonalDistance.getY()); 175*b1cdbd2cSJim Jagielski aRetval[7] = Primitive2DReference(new TransformPrimitive2D(aTransform, getTextContent())); 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski // at last, place original over it, but force to white 178*b1cdbd2cSJim Jagielski const basegfx::BColorModifierSharedPtr aBColorModifierToWhite( 179*b1cdbd2cSJim Jagielski new basegfx::BColorModifier_replace( 180*b1cdbd2cSJim Jagielski basegfx::BColor(1.0, 1.0, 1.0))); 181*b1cdbd2cSJim Jagielski aRetval[8] = Primitive2DReference( 182*b1cdbd2cSJim Jagielski new ModifiedColorPrimitive2D( 183*b1cdbd2cSJim Jagielski getTextContent(), 184*b1cdbd2cSJim Jagielski aBColorModifierToWhite)); 185*b1cdbd2cSJim Jagielski 186*b1cdbd2cSJim Jagielski break; 187*b1cdbd2cSJim Jagielski } 188*b1cdbd2cSJim Jagielski } 189*b1cdbd2cSJim Jagielski 190*b1cdbd2cSJim Jagielski return aRetval; 191*b1cdbd2cSJim Jagielski } 192*b1cdbd2cSJim Jagielski TextEffectPrimitive2D(const Primitive2DSequence & rTextContent,const basegfx::B2DPoint & rRotationCenter,double fDirection,TextEffectStyle2D eTextEffectStyle2D)193*b1cdbd2cSJim Jagielski TextEffectPrimitive2D::TextEffectPrimitive2D( 194*b1cdbd2cSJim Jagielski const Primitive2DSequence& rTextContent, 195*b1cdbd2cSJim Jagielski const basegfx::B2DPoint& rRotationCenter, 196*b1cdbd2cSJim Jagielski double fDirection, 197*b1cdbd2cSJim Jagielski TextEffectStyle2D eTextEffectStyle2D) 198*b1cdbd2cSJim Jagielski : BufferedDecompositionPrimitive2D(), 199*b1cdbd2cSJim Jagielski maTextContent(rTextContent), 200*b1cdbd2cSJim Jagielski maRotationCenter(rRotationCenter), 201*b1cdbd2cSJim Jagielski mfDirection(fDirection), 202*b1cdbd2cSJim Jagielski meTextEffectStyle2D(eTextEffectStyle2D) 203*b1cdbd2cSJim Jagielski { 204*b1cdbd2cSJim Jagielski } 205*b1cdbd2cSJim Jagielski operator ==(const BasePrimitive2D & rPrimitive) const206*b1cdbd2cSJim Jagielski bool TextEffectPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const 207*b1cdbd2cSJim Jagielski { 208*b1cdbd2cSJim Jagielski if(BasePrimitive2D::operator==(rPrimitive)) 209*b1cdbd2cSJim Jagielski { 210*b1cdbd2cSJim Jagielski const TextEffectPrimitive2D& rCompare = (TextEffectPrimitive2D&)rPrimitive; 211*b1cdbd2cSJim Jagielski 212*b1cdbd2cSJim Jagielski return (getTextContent() == rCompare.getTextContent() 213*b1cdbd2cSJim Jagielski && getRotationCenter() == rCompare.getRotationCenter() 214*b1cdbd2cSJim Jagielski && getDirection() == rCompare.getDirection() 215*b1cdbd2cSJim Jagielski && getTextEffectStyle2D() == rCompare.getTextEffectStyle2D()); 216*b1cdbd2cSJim Jagielski } 217*b1cdbd2cSJim Jagielski 218*b1cdbd2cSJim Jagielski return false; 219*b1cdbd2cSJim Jagielski } 220*b1cdbd2cSJim Jagielski getB2DRange(const geometry::ViewInformation2D & rViewInformation) const221*b1cdbd2cSJim Jagielski basegfx::B2DRange TextEffectPrimitive2D::getB2DRange(const geometry::ViewInformation2D& rViewInformation) const 222*b1cdbd2cSJim Jagielski { 223*b1cdbd2cSJim Jagielski // get range of content and grow by used fDiscreteSize. That way it is not necessary to ask 224*b1cdbd2cSJim Jagielski // the whole decomposition for it's ranges (which may be expensive with outline mode which 225*b1cdbd2cSJim Jagielski // then will ask 9 times at nearly the same content. This may even be refined here using the 226*b1cdbd2cSJim Jagielski // TextEffectStyle information, e.g. for TEXTEFFECTSTYLE2D_RELIEF the grow needs only to 227*b1cdbd2cSJim Jagielski // be in two directions 228*b1cdbd2cSJim Jagielski basegfx::B2DRange aRetval(getB2DRangeFromPrimitive2DSequence(getTextContent(), rViewInformation)); 229*b1cdbd2cSJim Jagielski aRetval.grow(fDiscreteSize); 230*b1cdbd2cSJim Jagielski 231*b1cdbd2cSJim Jagielski return aRetval; 232*b1cdbd2cSJim Jagielski } 233*b1cdbd2cSJim Jagielski get2DDecomposition(const geometry::ViewInformation2D & rViewInformation) const234*b1cdbd2cSJim Jagielski Primitive2DSequence TextEffectPrimitive2D::get2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const 235*b1cdbd2cSJim Jagielski { 236*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 237*b1cdbd2cSJim Jagielski 238*b1cdbd2cSJim Jagielski if(getBuffered2DDecomposition().hasElements()) 239*b1cdbd2cSJim Jagielski { 240*b1cdbd2cSJim Jagielski if(maLastObjectToViewTransformation != rViewInformation.getObjectToViewTransformation()) 241*b1cdbd2cSJim Jagielski { 242*b1cdbd2cSJim Jagielski // conditions of last local decomposition have changed, delete 243*b1cdbd2cSJim Jagielski const_cast< TextEffectPrimitive2D* >(this)->setBuffered2DDecomposition(Primitive2DSequence()); 244*b1cdbd2cSJim Jagielski } 245*b1cdbd2cSJim Jagielski } 246*b1cdbd2cSJim Jagielski 247*b1cdbd2cSJim Jagielski if(!getBuffered2DDecomposition().hasElements()) 248*b1cdbd2cSJim Jagielski { 249*b1cdbd2cSJim Jagielski // remember ViewRange and ViewTransformation 250*b1cdbd2cSJim Jagielski const_cast< TextEffectPrimitive2D* >(this)->maLastObjectToViewTransformation = rViewInformation.getObjectToViewTransformation(); 251*b1cdbd2cSJim Jagielski } 252*b1cdbd2cSJim Jagielski 253*b1cdbd2cSJim Jagielski // use parent implementation 254*b1cdbd2cSJim Jagielski return BufferedDecompositionPrimitive2D::get2DDecomposition(rViewInformation); 255*b1cdbd2cSJim Jagielski } 256*b1cdbd2cSJim Jagielski 257*b1cdbd2cSJim Jagielski // provide unique ID 258*b1cdbd2cSJim Jagielski ImplPrimitrive2DIDBlock(TextEffectPrimitive2D, PRIMITIVE2D_ID_TEXTEFFECTPRIMITIVE2D) 259*b1cdbd2cSJim Jagielski 260*b1cdbd2cSJim Jagielski } // end of namespace primitive2d 261*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer 262*b1cdbd2cSJim Jagielski 263*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 264*b1cdbd2cSJim Jagielski // eof 265