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/textdecoratedprimitive2d.hxx> 28*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/polygonprimitive2d.hxx> 29*b1cdbd2cSJim Jagielski #include <drawinglayer/attribute/strokeattribute.hxx> 30*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx> 31*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrixtools.hxx> 32*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/texteffectprimitive2d.hxx> 33*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/shadowprimitive2d.hxx> 34*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/transformprimitive2d.hxx> 35*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/textlineprimitive2d.hxx> 36*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/textstrikeoutprimitive2d.hxx> 37*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/textbreakuphelper.hxx> 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 40*b1cdbd2cSJim Jagielski 41*b1cdbd2cSJim Jagielski namespace drawinglayer 42*b1cdbd2cSJim Jagielski { 43*b1cdbd2cSJim Jagielski namespace primitive2d 44*b1cdbd2cSJim Jagielski { impCreateGeometryContent(std::vector<Primitive2DReference> & rTarget,basegfx::tools::B2DHomMatrixBufferedOnDemandDecompose & rDecTrans,const String & rText,xub_StrLen aTextPosition,xub_StrLen aTextLength,const::std::vector<double> & rDXArray,const attribute::FontAttribute & rFontAttribute) const45*b1cdbd2cSJim Jagielski void TextDecoratedPortionPrimitive2D::impCreateGeometryContent( 46*b1cdbd2cSJim Jagielski std::vector< Primitive2DReference >& rTarget, 47*b1cdbd2cSJim Jagielski basegfx::tools::B2DHomMatrixBufferedOnDemandDecompose& rDecTrans, 48*b1cdbd2cSJim Jagielski const String& rText, 49*b1cdbd2cSJim Jagielski xub_StrLen aTextPosition, 50*b1cdbd2cSJim Jagielski xub_StrLen aTextLength, 51*b1cdbd2cSJim Jagielski const ::std::vector< double >& rDXArray, 52*b1cdbd2cSJim Jagielski const attribute::FontAttribute& rFontAttribute) const 53*b1cdbd2cSJim Jagielski { 54*b1cdbd2cSJim Jagielski // create the SimpleTextPrimitive needed in any case 55*b1cdbd2cSJim Jagielski rTarget.push_back(Primitive2DReference( 56*b1cdbd2cSJim Jagielski new TextSimplePortionPrimitive2D( 57*b1cdbd2cSJim Jagielski rDecTrans.getB2DHomMatrix(), 58*b1cdbd2cSJim Jagielski rText, 59*b1cdbd2cSJim Jagielski aTextPosition, 60*b1cdbd2cSJim Jagielski aTextLength, 61*b1cdbd2cSJim Jagielski rDXArray, 62*b1cdbd2cSJim Jagielski rFontAttribute, 63*b1cdbd2cSJim Jagielski getLocale(), 64*b1cdbd2cSJim Jagielski getFontColor()))); 65*b1cdbd2cSJim Jagielski 66*b1cdbd2cSJim Jagielski // see if something else needs to be done 67*b1cdbd2cSJim Jagielski const bool bOverlineUsed(TEXT_LINE_NONE != getFontOverline()); 68*b1cdbd2cSJim Jagielski const bool bUnderlineUsed(TEXT_LINE_NONE != getFontUnderline()); 69*b1cdbd2cSJim Jagielski const bool bStrikeoutUsed(TEXT_STRIKEOUT_NONE != getTextStrikeout()); 70*b1cdbd2cSJim Jagielski 71*b1cdbd2cSJim Jagielski if(bUnderlineUsed || bStrikeoutUsed || bOverlineUsed) 72*b1cdbd2cSJim Jagielski { 73*b1cdbd2cSJim Jagielski // common preparations 74*b1cdbd2cSJim Jagielski TextLayouterDevice aTextLayouter; 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski // TextLayouterDevice is needed to get metrics for text decorations like 77*b1cdbd2cSJim Jagielski // underline/strikeout/emphasis marks from it. For setup, the font size is needed 78*b1cdbd2cSJim Jagielski aTextLayouter.setFontAttribute( 79*b1cdbd2cSJim Jagielski getFontAttribute(), 80*b1cdbd2cSJim Jagielski rDecTrans.getScale().getX(), 81*b1cdbd2cSJim Jagielski rDecTrans.getScale().getY(), 82*b1cdbd2cSJim Jagielski getLocale()); 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski // get text width 85*b1cdbd2cSJim Jagielski double fTextWidth(0.0); 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski if(rDXArray.empty()) 88*b1cdbd2cSJim Jagielski { 89*b1cdbd2cSJim Jagielski fTextWidth = aTextLayouter.getTextWidth(rText, aTextPosition, aTextLength); 90*b1cdbd2cSJim Jagielski } 91*b1cdbd2cSJim Jagielski else 92*b1cdbd2cSJim Jagielski { 93*b1cdbd2cSJim Jagielski fTextWidth = rDXArray.back() * rDecTrans.getScale().getX(); 94*b1cdbd2cSJim Jagielski const double fFontScaleX(rDecTrans.getScale().getX()); 95*b1cdbd2cSJim Jagielski 96*b1cdbd2cSJim Jagielski if(!basegfx::fTools::equal(fFontScaleX, 1.0) 97*b1cdbd2cSJim Jagielski && !basegfx::fTools::equalZero(fFontScaleX)) 98*b1cdbd2cSJim Jagielski { 99*b1cdbd2cSJim Jagielski // need to take FontScaling out of the DXArray 100*b1cdbd2cSJim Jagielski fTextWidth /= fFontScaleX; 101*b1cdbd2cSJim Jagielski } 102*b1cdbd2cSJim Jagielski } 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski if(bOverlineUsed) 105*b1cdbd2cSJim Jagielski { 106*b1cdbd2cSJim Jagielski // create primitive geometry for overline 107*b1cdbd2cSJim Jagielski rTarget.push_back(Primitive2DReference( 108*b1cdbd2cSJim Jagielski new TextLinePrimitive2D( 109*b1cdbd2cSJim Jagielski rDecTrans.getB2DHomMatrix(), 110*b1cdbd2cSJim Jagielski fTextWidth, 111*b1cdbd2cSJim Jagielski aTextLayouter.getOverlineOffset(), 112*b1cdbd2cSJim Jagielski aTextLayouter.getOverlineHeight(), 113*b1cdbd2cSJim Jagielski getFontOverline(), 114*b1cdbd2cSJim Jagielski getOverlineColor()))); 115*b1cdbd2cSJim Jagielski } 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski if(bUnderlineUsed) 118*b1cdbd2cSJim Jagielski { 119*b1cdbd2cSJim Jagielski // create primitive geometry for underline 120*b1cdbd2cSJim Jagielski rTarget.push_back(Primitive2DReference( 121*b1cdbd2cSJim Jagielski new TextLinePrimitive2D( 122*b1cdbd2cSJim Jagielski rDecTrans.getB2DHomMatrix(), 123*b1cdbd2cSJim Jagielski fTextWidth, 124*b1cdbd2cSJim Jagielski aTextLayouter.getUnderlineOffset(), 125*b1cdbd2cSJim Jagielski aTextLayouter.getUnderlineHeight(), 126*b1cdbd2cSJim Jagielski getFontUnderline(), 127*b1cdbd2cSJim Jagielski getTextlineColor()))); 128*b1cdbd2cSJim Jagielski } 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski if(bStrikeoutUsed) 131*b1cdbd2cSJim Jagielski { 132*b1cdbd2cSJim Jagielski // create primitive geometry for strikeout 133*b1cdbd2cSJim Jagielski if(TEXT_STRIKEOUT_SLASH == getTextStrikeout() || TEXT_STRIKEOUT_X == getTextStrikeout()) 134*b1cdbd2cSJim Jagielski { 135*b1cdbd2cSJim Jagielski // strikeout with character 136*b1cdbd2cSJim Jagielski const sal_Unicode aStrikeoutChar(TEXT_STRIKEOUT_SLASH == getTextStrikeout() ? '/' : 'X'); 137*b1cdbd2cSJim Jagielski 138*b1cdbd2cSJim Jagielski rTarget.push_back(Primitive2DReference( 139*b1cdbd2cSJim Jagielski new TextCharacterStrikeoutPrimitive2D( 140*b1cdbd2cSJim Jagielski rDecTrans.getB2DHomMatrix(), 141*b1cdbd2cSJim Jagielski fTextWidth, 142*b1cdbd2cSJim Jagielski getFontColor(), 143*b1cdbd2cSJim Jagielski aStrikeoutChar, 144*b1cdbd2cSJim Jagielski getFontAttribute(), 145*b1cdbd2cSJim Jagielski getLocale()))); 146*b1cdbd2cSJim Jagielski } 147*b1cdbd2cSJim Jagielski else 148*b1cdbd2cSJim Jagielski { 149*b1cdbd2cSJim Jagielski // strikeout with geometry 150*b1cdbd2cSJim Jagielski rTarget.push_back(Primitive2DReference( 151*b1cdbd2cSJim Jagielski new TextGeometryStrikeoutPrimitive2D( 152*b1cdbd2cSJim Jagielski rDecTrans.getB2DHomMatrix(), 153*b1cdbd2cSJim Jagielski fTextWidth, 154*b1cdbd2cSJim Jagielski getFontColor(), 155*b1cdbd2cSJim Jagielski aTextLayouter.getUnderlineHeight(), 156*b1cdbd2cSJim Jagielski aTextLayouter.getStrikeoutOffset(), 157*b1cdbd2cSJim Jagielski getTextStrikeout()))); 158*b1cdbd2cSJim Jagielski } 159*b1cdbd2cSJim Jagielski } 160*b1cdbd2cSJim Jagielski } 161*b1cdbd2cSJim Jagielski 162*b1cdbd2cSJim Jagielski // TODO: Handle Font Emphasis Above/Below 163*b1cdbd2cSJim Jagielski } 164*b1cdbd2cSJim Jagielski create2DDecomposition(const geometry::ViewInformation2D &) const165*b1cdbd2cSJim Jagielski Primitive2DSequence TextDecoratedPortionPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const 166*b1cdbd2cSJim Jagielski { 167*b1cdbd2cSJim Jagielski if(getWordLineMode()) 168*b1cdbd2cSJim Jagielski { 169*b1cdbd2cSJim Jagielski // support for single word mode; split to single word primitives 170*b1cdbd2cSJim Jagielski // using TextBreakupHelper 171*b1cdbd2cSJim Jagielski const TextBreakupHelper aTextBreakupHelper(*this); 172*b1cdbd2cSJim Jagielski const Primitive2DSequence aBroken(aTextBreakupHelper.getResult(BreakupUnit_word)); 173*b1cdbd2cSJim Jagielski 174*b1cdbd2cSJim Jagielski if(aBroken.hasElements()) 175*b1cdbd2cSJim Jagielski { 176*b1cdbd2cSJim Jagielski // was indeed split to several words, use as result 177*b1cdbd2cSJim Jagielski return aBroken; 178*b1cdbd2cSJim Jagielski } 179*b1cdbd2cSJim Jagielski else 180*b1cdbd2cSJim Jagielski { 181*b1cdbd2cSJim Jagielski // no split, was already a single word. Continue to 182*b1cdbd2cSJim Jagielski // decompse local entity 183*b1cdbd2cSJim Jagielski } 184*b1cdbd2cSJim Jagielski } 185*b1cdbd2cSJim Jagielski std::vector< Primitive2DReference > aNewPrimitives; 186*b1cdbd2cSJim Jagielski basegfx::tools::B2DHomMatrixBufferedOnDemandDecompose aDecTrans(getTextTransform()); 187*b1cdbd2cSJim Jagielski Primitive2DSequence aRetval; 188*b1cdbd2cSJim Jagielski 189*b1cdbd2cSJim Jagielski // create basic geometry such as SimpleTextPrimitive, Overline, Underline, 190*b1cdbd2cSJim Jagielski // Strikeout, etc... 191*b1cdbd2cSJim Jagielski // prepare new font attributes WITHOUT outline 192*b1cdbd2cSJim Jagielski const attribute::FontAttribute aNewFontAttribute( 193*b1cdbd2cSJim Jagielski getFontAttribute().getFamilyName(), 194*b1cdbd2cSJim Jagielski getFontAttribute().getStyleName(), 195*b1cdbd2cSJim Jagielski getFontAttribute().getWeight(), 196*b1cdbd2cSJim Jagielski getFontAttribute().getSymbol(), 197*b1cdbd2cSJim Jagielski getFontAttribute().getVertical(), 198*b1cdbd2cSJim Jagielski getFontAttribute().getItalic(), 199*b1cdbd2cSJim Jagielski false, // no outline anymore, handled locally 200*b1cdbd2cSJim Jagielski getFontAttribute().getRTL(), 201*b1cdbd2cSJim Jagielski getFontAttribute().getBiDiStrong()); 202*b1cdbd2cSJim Jagielski 203*b1cdbd2cSJim Jagielski // handle as one word 204*b1cdbd2cSJim Jagielski impCreateGeometryContent(aNewPrimitives, aDecTrans, getText(), getTextPosition(), getTextLength(), getDXArray(), aNewFontAttribute); 205*b1cdbd2cSJim Jagielski 206*b1cdbd2cSJim Jagielski // convert to Primitive2DSequence 207*b1cdbd2cSJim Jagielski const sal_uInt32 nMemberCount(aNewPrimitives.size()); 208*b1cdbd2cSJim Jagielski 209*b1cdbd2cSJim Jagielski if(nMemberCount) 210*b1cdbd2cSJim Jagielski { 211*b1cdbd2cSJim Jagielski aRetval.realloc(nMemberCount); 212*b1cdbd2cSJim Jagielski 213*b1cdbd2cSJim Jagielski for(sal_uInt32 a(0); a < nMemberCount; a++) 214*b1cdbd2cSJim Jagielski { 215*b1cdbd2cSJim Jagielski aRetval[a] = aNewPrimitives[a]; 216*b1cdbd2cSJim Jagielski } 217*b1cdbd2cSJim Jagielski } 218*b1cdbd2cSJim Jagielski 219*b1cdbd2cSJim Jagielski // Handle Shadow, Outline and TextRelief 220*b1cdbd2cSJim Jagielski if(aRetval.hasElements()) 221*b1cdbd2cSJim Jagielski { 222*b1cdbd2cSJim Jagielski // outline AND shadow depend on NO TextRelief (see dialog) 223*b1cdbd2cSJim Jagielski const bool bHasTextRelief(TEXT_RELIEF_NONE != getTextRelief()); 224*b1cdbd2cSJim Jagielski const bool bHasShadow(!bHasTextRelief && getShadow()); 225*b1cdbd2cSJim Jagielski const bool bHasOutline(!bHasTextRelief && getFontAttribute().getOutline()); 226*b1cdbd2cSJim Jagielski 227*b1cdbd2cSJim Jagielski if(bHasShadow || bHasTextRelief || bHasOutline) 228*b1cdbd2cSJim Jagielski { 229*b1cdbd2cSJim Jagielski Primitive2DReference aShadow; 230*b1cdbd2cSJim Jagielski 231*b1cdbd2cSJim Jagielski if(bHasShadow) 232*b1cdbd2cSJim Jagielski { 233*b1cdbd2cSJim Jagielski // create shadow with current content (in aRetval). Text shadow 234*b1cdbd2cSJim Jagielski // is constant, relative to font size, rotated with the text and has a 235*b1cdbd2cSJim Jagielski // constant color. 236*b1cdbd2cSJim Jagielski // shadow parameter values 237*b1cdbd2cSJim Jagielski static double fFactor(1.0 / 24.0); 238*b1cdbd2cSJim Jagielski const double fTextShadowOffset(aDecTrans.getScale().getY() * fFactor); 239*b1cdbd2cSJim Jagielski static basegfx::BColor aShadowColor(0.3, 0.3, 0.3); 240*b1cdbd2cSJim Jagielski 241*b1cdbd2cSJim Jagielski // preapare shadow transform matrix 242*b1cdbd2cSJim Jagielski const basegfx::B2DHomMatrix aShadowTransform(basegfx::tools::createTranslateB2DHomMatrix( 243*b1cdbd2cSJim Jagielski fTextShadowOffset, fTextShadowOffset)); 244*b1cdbd2cSJim Jagielski 245*b1cdbd2cSJim Jagielski // create shadow primitive 246*b1cdbd2cSJim Jagielski aShadow = Primitive2DReference(new ShadowPrimitive2D( 247*b1cdbd2cSJim Jagielski aShadowTransform, 248*b1cdbd2cSJim Jagielski aShadowColor, 249*b1cdbd2cSJim Jagielski aRetval)); 250*b1cdbd2cSJim Jagielski } 251*b1cdbd2cSJim Jagielski 252*b1cdbd2cSJim Jagielski if(bHasTextRelief) 253*b1cdbd2cSJim Jagielski { 254*b1cdbd2cSJim Jagielski // create emboss using an own helper primitive since this will 255*b1cdbd2cSJim Jagielski // be view-dependent 256*b1cdbd2cSJim Jagielski const basegfx::BColor aBBlack(0.0, 0.0, 0.0); 257*b1cdbd2cSJim Jagielski const bool bDefaultTextColor(aBBlack == getFontColor()); 258*b1cdbd2cSJim Jagielski TextEffectStyle2D aTextEffectStyle2D(TEXTEFFECTSTYLE2D_RELIEF_EMBOSSED); 259*b1cdbd2cSJim Jagielski 260*b1cdbd2cSJim Jagielski if(bDefaultTextColor) 261*b1cdbd2cSJim Jagielski { 262*b1cdbd2cSJim Jagielski if(TEXT_RELIEF_ENGRAVED == getTextRelief()) 263*b1cdbd2cSJim Jagielski { 264*b1cdbd2cSJim Jagielski aTextEffectStyle2D = TEXTEFFECTSTYLE2D_RELIEF_ENGRAVED_DEFAULT; 265*b1cdbd2cSJim Jagielski } 266*b1cdbd2cSJim Jagielski else 267*b1cdbd2cSJim Jagielski { 268*b1cdbd2cSJim Jagielski aTextEffectStyle2D = TEXTEFFECTSTYLE2D_RELIEF_EMBOSSED_DEFAULT; 269*b1cdbd2cSJim Jagielski } 270*b1cdbd2cSJim Jagielski } 271*b1cdbd2cSJim Jagielski else 272*b1cdbd2cSJim Jagielski { 273*b1cdbd2cSJim Jagielski if(TEXT_RELIEF_ENGRAVED == getTextRelief()) 274*b1cdbd2cSJim Jagielski { 275*b1cdbd2cSJim Jagielski aTextEffectStyle2D = TEXTEFFECTSTYLE2D_RELIEF_ENGRAVED; 276*b1cdbd2cSJim Jagielski } 277*b1cdbd2cSJim Jagielski else 278*b1cdbd2cSJim Jagielski { 279*b1cdbd2cSJim Jagielski aTextEffectStyle2D = TEXTEFFECTSTYLE2D_RELIEF_EMBOSSED; 280*b1cdbd2cSJim Jagielski } 281*b1cdbd2cSJim Jagielski } 282*b1cdbd2cSJim Jagielski 283*b1cdbd2cSJim Jagielski Primitive2DReference aNewTextEffect(new TextEffectPrimitive2D( 284*b1cdbd2cSJim Jagielski aRetval, 285*b1cdbd2cSJim Jagielski aDecTrans.getTranslate(), 286*b1cdbd2cSJim Jagielski aDecTrans.getRotate(), 287*b1cdbd2cSJim Jagielski aTextEffectStyle2D)); 288*b1cdbd2cSJim Jagielski aRetval = Primitive2DSequence(&aNewTextEffect, 1); 289*b1cdbd2cSJim Jagielski } 290*b1cdbd2cSJim Jagielski else if(bHasOutline) 291*b1cdbd2cSJim Jagielski { 292*b1cdbd2cSJim Jagielski // create outline using an own helper primitive since this will 293*b1cdbd2cSJim Jagielski // be view-dependent 294*b1cdbd2cSJim Jagielski Primitive2DReference aNewTextEffect(new TextEffectPrimitive2D( 295*b1cdbd2cSJim Jagielski aRetval, 296*b1cdbd2cSJim Jagielski aDecTrans.getTranslate(), 297*b1cdbd2cSJim Jagielski aDecTrans.getRotate(), 298*b1cdbd2cSJim Jagielski TEXTEFFECTSTYLE2D_OUTLINE)); 299*b1cdbd2cSJim Jagielski aRetval = Primitive2DSequence(&aNewTextEffect, 1); 300*b1cdbd2cSJim Jagielski } 301*b1cdbd2cSJim Jagielski 302*b1cdbd2cSJim Jagielski if(aShadow.is()) 303*b1cdbd2cSJim Jagielski { 304*b1cdbd2cSJim Jagielski // put shadow in front if there is one to paint timely before 305*b1cdbd2cSJim Jagielski // but placed behind content 306*b1cdbd2cSJim Jagielski const Primitive2DSequence aContent(aRetval); 307*b1cdbd2cSJim Jagielski aRetval = Primitive2DSequence(&aShadow, 1); 308*b1cdbd2cSJim Jagielski appendPrimitive2DSequenceToPrimitive2DSequence(aRetval, aContent); 309*b1cdbd2cSJim Jagielski } 310*b1cdbd2cSJim Jagielski } 311*b1cdbd2cSJim Jagielski } 312*b1cdbd2cSJim Jagielski 313*b1cdbd2cSJim Jagielski return aRetval; 314*b1cdbd2cSJim Jagielski } 315*b1cdbd2cSJim Jagielski TextDecoratedPortionPrimitive2D(const basegfx::B2DHomMatrix & rNewTransform,const String & rText,xub_StrLen aTextPosition,xub_StrLen aTextLength,const::std::vector<double> & rDXArray,const attribute::FontAttribute & rFontAttribute,const::com::sun::star::lang::Locale & rLocale,const basegfx::BColor & rFontColor,const basegfx::BColor & rOverlineColor,const basegfx::BColor & rTextlineColor,TextLine eFontOverline,TextLine eFontUnderline,bool bUnderlineAbove,TextStrikeout eTextStrikeout,bool bWordLineMode,TextEmphasisMark eTextEmphasisMark,bool bEmphasisMarkAbove,bool bEmphasisMarkBelow,TextRelief eTextRelief,bool bShadow)316*b1cdbd2cSJim Jagielski TextDecoratedPortionPrimitive2D::TextDecoratedPortionPrimitive2D( 317*b1cdbd2cSJim Jagielski 318*b1cdbd2cSJim Jagielski // TextSimplePortionPrimitive2D parameters 319*b1cdbd2cSJim Jagielski const basegfx::B2DHomMatrix& rNewTransform, 320*b1cdbd2cSJim Jagielski const String& rText, 321*b1cdbd2cSJim Jagielski xub_StrLen aTextPosition, 322*b1cdbd2cSJim Jagielski xub_StrLen aTextLength, 323*b1cdbd2cSJim Jagielski const ::std::vector< double >& rDXArray, 324*b1cdbd2cSJim Jagielski const attribute::FontAttribute& rFontAttribute, 325*b1cdbd2cSJim Jagielski const ::com::sun::star::lang::Locale& rLocale, 326*b1cdbd2cSJim Jagielski const basegfx::BColor& rFontColor, 327*b1cdbd2cSJim Jagielski 328*b1cdbd2cSJim Jagielski // local parameters 329*b1cdbd2cSJim Jagielski const basegfx::BColor& rOverlineColor, 330*b1cdbd2cSJim Jagielski const basegfx::BColor& rTextlineColor, 331*b1cdbd2cSJim Jagielski TextLine eFontOverline, 332*b1cdbd2cSJim Jagielski TextLine eFontUnderline, 333*b1cdbd2cSJim Jagielski bool bUnderlineAbove, 334*b1cdbd2cSJim Jagielski TextStrikeout eTextStrikeout, 335*b1cdbd2cSJim Jagielski bool bWordLineMode, 336*b1cdbd2cSJim Jagielski TextEmphasisMark eTextEmphasisMark, 337*b1cdbd2cSJim Jagielski bool bEmphasisMarkAbove, 338*b1cdbd2cSJim Jagielski bool bEmphasisMarkBelow, 339*b1cdbd2cSJim Jagielski TextRelief eTextRelief, 340*b1cdbd2cSJim Jagielski bool bShadow) 341*b1cdbd2cSJim Jagielski : TextSimplePortionPrimitive2D(rNewTransform, rText, aTextPosition, aTextLength, rDXArray, rFontAttribute, rLocale, rFontColor), 342*b1cdbd2cSJim Jagielski maOverlineColor(rOverlineColor), 343*b1cdbd2cSJim Jagielski maTextlineColor(rTextlineColor), 344*b1cdbd2cSJim Jagielski meFontOverline(eFontOverline), 345*b1cdbd2cSJim Jagielski meFontUnderline(eFontUnderline), 346*b1cdbd2cSJim Jagielski meTextStrikeout(eTextStrikeout), 347*b1cdbd2cSJim Jagielski meTextEmphasisMark(eTextEmphasisMark), 348*b1cdbd2cSJim Jagielski meTextRelief(eTextRelief), 349*b1cdbd2cSJim Jagielski mbUnderlineAbove(bUnderlineAbove), 350*b1cdbd2cSJim Jagielski mbWordLineMode(bWordLineMode), 351*b1cdbd2cSJim Jagielski mbEmphasisMarkAbove(bEmphasisMarkAbove), 352*b1cdbd2cSJim Jagielski mbEmphasisMarkBelow(bEmphasisMarkBelow), 353*b1cdbd2cSJim Jagielski mbShadow(bShadow) 354*b1cdbd2cSJim Jagielski { 355*b1cdbd2cSJim Jagielski } 356*b1cdbd2cSJim Jagielski decoratedIsNeeded() const357*b1cdbd2cSJim Jagielski bool TextDecoratedPortionPrimitive2D::decoratedIsNeeded() const 358*b1cdbd2cSJim Jagielski { 359*b1cdbd2cSJim Jagielski return (TEXT_LINE_NONE != getFontOverline() 360*b1cdbd2cSJim Jagielski || TEXT_LINE_NONE != getFontUnderline() 361*b1cdbd2cSJim Jagielski || TEXT_STRIKEOUT_NONE != getTextStrikeout() 362*b1cdbd2cSJim Jagielski || TEXT_EMPHASISMARK_NONE != getTextEmphasisMark() 363*b1cdbd2cSJim Jagielski || TEXT_RELIEF_NONE != getTextRelief() 364*b1cdbd2cSJim Jagielski || getShadow()); 365*b1cdbd2cSJim Jagielski } 366*b1cdbd2cSJim Jagielski operator ==(const BasePrimitive2D & rPrimitive) const367*b1cdbd2cSJim Jagielski bool TextDecoratedPortionPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const 368*b1cdbd2cSJim Jagielski { 369*b1cdbd2cSJim Jagielski if(TextSimplePortionPrimitive2D::operator==(rPrimitive)) 370*b1cdbd2cSJim Jagielski { 371*b1cdbd2cSJim Jagielski const TextDecoratedPortionPrimitive2D& rCompare = (TextDecoratedPortionPrimitive2D&)rPrimitive; 372*b1cdbd2cSJim Jagielski 373*b1cdbd2cSJim Jagielski return (getOverlineColor() == rCompare.getOverlineColor() 374*b1cdbd2cSJim Jagielski && getTextlineColor() == rCompare.getTextlineColor() 375*b1cdbd2cSJim Jagielski && getFontOverline() == rCompare.getFontOverline() 376*b1cdbd2cSJim Jagielski && getFontUnderline() == rCompare.getFontUnderline() 377*b1cdbd2cSJim Jagielski && getTextStrikeout() == rCompare.getTextStrikeout() 378*b1cdbd2cSJim Jagielski && getTextEmphasisMark() == rCompare.getTextEmphasisMark() 379*b1cdbd2cSJim Jagielski && getTextRelief() == rCompare.getTextRelief() 380*b1cdbd2cSJim Jagielski && getUnderlineAbove() == rCompare.getUnderlineAbove() 381*b1cdbd2cSJim Jagielski && getWordLineMode() == rCompare.getWordLineMode() 382*b1cdbd2cSJim Jagielski && getEmphasisMarkAbove() == rCompare.getEmphasisMarkAbove() 383*b1cdbd2cSJim Jagielski && getEmphasisMarkBelow() == rCompare.getEmphasisMarkBelow() 384*b1cdbd2cSJim Jagielski && getShadow() == rCompare.getShadow()); 385*b1cdbd2cSJim Jagielski } 386*b1cdbd2cSJim Jagielski 387*b1cdbd2cSJim Jagielski return false; 388*b1cdbd2cSJim Jagielski } 389*b1cdbd2cSJim Jagielski 390*b1cdbd2cSJim Jagielski // #i96475# 391*b1cdbd2cSJim Jagielski // Added missing implementation. Decorations may (will) stick out of the text's 392*b1cdbd2cSJim Jagielski // inking area, so add them if needed getB2DRange(const geometry::ViewInformation2D & rViewInformation) const393*b1cdbd2cSJim Jagielski basegfx::B2DRange TextDecoratedPortionPrimitive2D::getB2DRange(const geometry::ViewInformation2D& rViewInformation) const 394*b1cdbd2cSJim Jagielski { 395*b1cdbd2cSJim Jagielski if(decoratedIsNeeded()) 396*b1cdbd2cSJim Jagielski { 397*b1cdbd2cSJim Jagielski // decoration is used, fallback to BufferedDecompositionPrimitive2D::getB2DRange which uses 398*b1cdbd2cSJim Jagielski // the own local decomposition for computation and thus creates all necessary 399*b1cdbd2cSJim Jagielski // geometric objects 400*b1cdbd2cSJim Jagielski return BufferedDecompositionPrimitive2D::getB2DRange(rViewInformation); 401*b1cdbd2cSJim Jagielski } 402*b1cdbd2cSJim Jagielski else 403*b1cdbd2cSJim Jagielski { 404*b1cdbd2cSJim Jagielski // no relevant decoration used, fallback to TextSimplePortionPrimitive2D::getB2DRange 405*b1cdbd2cSJim Jagielski return TextSimplePortionPrimitive2D::getB2DRange(rViewInformation); 406*b1cdbd2cSJim Jagielski } 407*b1cdbd2cSJim Jagielski } 408*b1cdbd2cSJim Jagielski 409*b1cdbd2cSJim Jagielski // provide unique ID 410*b1cdbd2cSJim Jagielski ImplPrimitrive2DIDBlock(TextDecoratedPortionPrimitive2D, PRIMITIVE2D_ID_TEXTDECORATEDPORTIONPRIMITIVE2D) 411*b1cdbd2cSJim Jagielski 412*b1cdbd2cSJim Jagielski } // end of namespace primitive2d 413*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer 414*b1cdbd2cSJim Jagielski 415*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 416*b1cdbd2cSJim Jagielski // eof 417