1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #include "precompiled_svx.hxx" 25 #include <svx/sdr/primitive2d/sdrattributecreator.hxx> 26 #include <svl/itemset.hxx> 27 #include <svx/xdef.hxx> 28 #include <basegfx/polygon/b2dpolygon.hxx> 29 #include <svx/xlineit0.hxx> 30 #include <svx/xfillit0.hxx> 31 #include <svx/xlntrit.hxx> 32 #include <svx/xlnwtit.hxx> 33 #include <svx/xlinjoit.hxx> 34 #include <svx/xlncapit.hxx> 35 #include <svx/xlnclit.hxx> 36 #include <svx/xlnstwit.hxx> 37 #include <svx/xlnedwit.hxx> 38 #include <svx/xlnstit.hxx> 39 #include <svx/xlnstcit.hxx> 40 #include <svx/xlnedit.hxx> 41 #include <svx/xlnedcit.hxx> 42 #include <svx/xdash.hxx> 43 #include <svx/xlndsit.hxx> 44 #include <svx/xfltrit.hxx> 45 #include <svx/xflftrit.hxx> 46 #include <svx/xflclit.hxx> 47 #include <svx/xgrscit.hxx> 48 #include <svx/xflhtit.hxx> 49 #include <svx/xflbckit.hxx> 50 #include <svx/sdshitm.hxx> 51 #include <svx/sdsxyitm.hxx> 52 #include <svx/sdshcitm.hxx> 53 #include <svx/sdshtitm.hxx> 54 #include <drawinglayer/attribute/sdrfillbitmapattribute.hxx> 55 #include <basegfx/polygon/b2dlinegeometry.hxx> 56 #include <svx/svdotext.hxx> 57 #include <drawinglayer/attribute/fillbitmapattribute.hxx> 58 #include <svx/sdr/attribute/sdrtextattribute.hxx> 59 #include <svx/xbtmpit.hxx> 60 #include <svl/itempool.hxx> 61 #include <vcl/svapp.hxx> 62 #include <basegfx/range/b2drange.hxx> 63 #include <svx/svx3ditems.hxx> 64 #include <com/sun/star/drawing/ProjectionMode.hpp> 65 #include <com/sun/star/drawing/ShadeMode.hpp> 66 #include <drawinglayer/attribute/sdrallattribute3d.hxx> 67 #include <svx/rectenum.hxx> 68 #include <svx/sdtfchim.hxx> 69 #include <svx/svdoutl.hxx> 70 #include <svx/svdmodel.hxx> 71 #include <editeng/editstat.hxx> 72 #include <drawinglayer/attribute/fillhatchattribute.hxx> 73 #include <drawinglayer/attribute/fillgradientattribute.hxx> 74 #include <svx/sdr/attribute/sdrshadowtextattribute.hxx> 75 #include <svx/sdr/attribute/sdrlineshadowtextattribute.hxx> 76 #include <svx/sdr/attribute/sdrformtextattribute.hxx> 77 #include <svx/sdr/attribute/sdrlinefillshadowtextattribute.hxx> 78 #include <drawinglayer/attribute/sdrsceneattribute3d.hxx> 79 #include <drawinglayer/attribute/sdrlightingattribute3d.hxx> 80 #include <drawinglayer/attribute/sdrlightattribute3d.hxx> 81 #include <svx/sdr/attribute/sdrfilltextattribute.hxx> 82 #include <com/sun/star/drawing/LineCap.hpp> 83 84 ////////////////////////////////////////////////////////////////////////////// 85 86 namespace drawinglayer 87 { 88 namespace 89 { 90 attribute::GradientStyle XGradientStyleToGradientStyle(XGradientStyle eStyle) 91 { 92 switch(eStyle) 93 { 94 case XGRAD_LINEAR : 95 { 96 return attribute::GRADIENTSTYLE_LINEAR; 97 } 98 case XGRAD_AXIAL : 99 { 100 return attribute::GRADIENTSTYLE_AXIAL; 101 } 102 case XGRAD_RADIAL : 103 { 104 return attribute::GRADIENTSTYLE_RADIAL; 105 } 106 case XGRAD_ELLIPTICAL : 107 { 108 return attribute::GRADIENTSTYLE_ELLIPTICAL; 109 } 110 case XGRAD_SQUARE : 111 { 112 return attribute::GRADIENTSTYLE_SQUARE; 113 } 114 default : 115 { 116 return attribute::GRADIENTSTYLE_RECT; // XGRAD_RECT 117 } 118 } 119 } 120 121 attribute::HatchStyle XHatchStyleToHatchStyle(XHatchStyle eStyle) 122 { 123 switch(eStyle) 124 { 125 case XHATCH_SINGLE : 126 { 127 return attribute::HATCHSTYLE_SINGLE; 128 } 129 case XHATCH_DOUBLE : 130 { 131 return attribute::HATCHSTYLE_DOUBLE; 132 } 133 default : 134 { 135 return attribute::HATCHSTYLE_TRIPLE; // XHATCH_TRIPLE 136 } 137 } 138 } 139 140 basegfx::B2DLineJoin XLineJointtoB2DLineJoin(XLineJoint eLineJoint) 141 { 142 switch(eLineJoint) 143 { 144 case XLINEJOINT_MIDDLE : 145 { 146 return basegfx::B2DLINEJOIN_MIDDLE; 147 } 148 case XLINEJOINT_BEVEL : 149 { 150 return basegfx::B2DLINEJOIN_BEVEL; 151 } 152 case XLINEJOINT_MITER : 153 { 154 return basegfx::B2DLINEJOIN_MITER; 155 } 156 case XLINEJOINT_ROUND : 157 { 158 return basegfx::B2DLINEJOIN_ROUND; 159 } 160 default : 161 { 162 return basegfx::B2DLINEJOIN_NONE; // XLINEJOINT_NONE 163 } 164 } 165 } 166 167 basegfx::B2DVector RectPointToB2DVector(RECT_POINT eRectPoint) 168 { 169 basegfx::B2DVector aRetval(0.0, 0.0); 170 171 // position changes X 172 switch(eRectPoint) 173 { 174 case RP_LT: case RP_LM: case RP_LB: 175 { 176 aRetval.setX(-1.0); 177 break; 178 } 179 180 case RP_RT: case RP_RM: case RP_RB: 181 { 182 aRetval.setX(1.0); 183 break; 184 } 185 186 default : 187 { 188 break; 189 } 190 } 191 192 // position changes Y 193 switch(eRectPoint) 194 { 195 case RP_LT: case RP_MT: case RP_RT: 196 { 197 aRetval.setY(-1.0); 198 break; 199 } 200 201 case RP_LB: case RP_MB: case RP_RB: 202 { 203 aRetval.setY(1.0); 204 break; 205 } 206 207 default : 208 { 209 break; 210 } 211 } 212 213 return aRetval; 214 } 215 } // end of anonymous namespace 216 } // end of namespace drawinglayer 217 218 ////////////////////////////////////////////////////////////////////////////// 219 220 namespace drawinglayer 221 { 222 namespace primitive2d 223 { 224 attribute::SdrLineAttribute createNewSdrLineAttribute(const SfxItemSet& rSet) 225 { 226 const XLineStyle eStyle(((XLineStyleItem&)(rSet.Get(XATTR_LINESTYLE))).GetValue()); 227 228 if(XLINE_NONE != eStyle) 229 { 230 sal_uInt16 nTransparence(((const XLineTransparenceItem&)(rSet.Get(XATTR_LINETRANSPARENCE))).GetValue()); 231 232 if(nTransparence > 100) 233 { 234 nTransparence = 100; 235 } 236 237 if(100 != nTransparence) 238 { 239 const sal_uInt32 nWidth(((const XLineWidthItem&)(rSet.Get(XATTR_LINEWIDTH))).GetValue()); 240 const Color aColor(((const XLineColorItem&)(rSet.Get(XATTR_LINECOLOR))).GetColorValue()); 241 const XLineJoint eJoint(((const XLineJointItem&)(rSet.Get(XATTR_LINEJOINT))).GetValue()); 242 const com::sun::star::drawing::LineCap eCap(((const XLineCapItem&)(rSet.Get(XATTR_LINECAP))).GetValue()); 243 ::std::vector< double > aDotDashArray; 244 double fFullDotDashLen(0.0); 245 246 if(XLINE_DASH == eStyle) 247 { 248 const XDash& rDash = ((const XLineDashItem&)(rSet.Get(XATTR_LINEDASH))).GetDashValue(); 249 250 if(rDash.GetDots() || rDash.GetDashes()) 251 { 252 fFullDotDashLen = rDash.CreateDotDashArray(aDotDashArray, (double)nWidth); 253 } 254 } 255 256 return attribute::SdrLineAttribute( 257 XLineJointtoB2DLineJoin(eJoint), 258 (double)nWidth, 259 (double)nTransparence * 0.01, 260 aColor.getBColor(), 261 eCap, 262 aDotDashArray, 263 fFullDotDashLen); 264 } 265 } 266 267 return attribute::SdrLineAttribute(); 268 } 269 270 attribute::SdrLineStartEndAttribute createNewSdrLineStartEndAttribute( 271 const SfxItemSet& rSet, 272 double fWidth) 273 { 274 const sal_Int32 nTempStartWidth(((const XLineStartWidthItem&)(rSet.Get(XATTR_LINESTARTWIDTH))).GetValue()); 275 const sal_Int32 nTempEndWidth(((const XLineEndWidthItem&)(rSet.Get(XATTR_LINEENDWIDTH))).GetValue()); 276 basegfx::B2DPolyPolygon aStartPolyPolygon; 277 basegfx::B2DPolyPolygon aEndPolyPolygon; 278 double fStartWidth(0.0); 279 double fEndWidth(0.0); 280 bool bStartActive(false); 281 bool bEndActive(false); 282 bool bStartCentered(true); 283 bool bEndCentered(true); 284 285 if(nTempStartWidth) 286 { 287 if(nTempStartWidth < 0L) 288 { 289 fStartWidth = ((double)(-nTempStartWidth) * fWidth) * 0.01; 290 } 291 else 292 { 293 fStartWidth = (double)nTempStartWidth; 294 } 295 296 if(0.0 != fStartWidth) 297 { 298 aStartPolyPolygon = basegfx::B2DPolyPolygon(((const XLineStartItem&)(rSet.Get(XATTR_LINESTART))).GetLineStartValue()); 299 300 if(aStartPolyPolygon.count() && aStartPolyPolygon.getB2DPolygon(0L).count()) 301 { 302 bStartActive = true; 303 bStartCentered = ((const XLineStartCenterItem&)(rSet.Get(XATTR_LINESTARTCENTER))).GetValue(); 304 } 305 } 306 } 307 308 if(nTempEndWidth) 309 { 310 if(nTempEndWidth < 0L) 311 { 312 fEndWidth = ((double)(-nTempEndWidth) * fWidth) * 0.01; 313 } 314 else 315 { 316 fEndWidth = (double)nTempEndWidth; 317 } 318 319 if(0.0 != fEndWidth) 320 { 321 aEndPolyPolygon = basegfx::B2DPolyPolygon(((const XLineEndItem&)(rSet.Get(XATTR_LINEEND))).GetLineEndValue()); 322 323 if(aEndPolyPolygon.count() && aEndPolyPolygon.getB2DPolygon(0L).count()) 324 { 325 bEndActive = true; 326 bEndCentered = ((const XLineEndCenterItem&)(rSet.Get(XATTR_LINEENDCENTER))).GetValue(); 327 } 328 } 329 } 330 331 if(bStartActive || bEndActive) 332 { 333 return attribute::SdrLineStartEndAttribute( 334 aStartPolyPolygon, aEndPolyPolygon, fStartWidth, fEndWidth, 335 bStartActive, bEndActive, bStartCentered, bEndCentered); 336 } 337 338 return attribute::SdrLineStartEndAttribute(); 339 } 340 341 attribute::SdrShadowAttribute createNewSdrShadowAttribute(const SfxItemSet& rSet) 342 { 343 const bool bShadow(((SdrShadowItem&)rSet.Get(SDRATTR_SHADOW)).GetValue()); 344 345 if(bShadow) 346 { 347 sal_uInt16 nTransparence(((SdrShadowTransparenceItem&)(rSet.Get(SDRATTR_SHADOWTRANSPARENCE))).GetValue()); 348 349 if(nTransparence > 100) 350 { 351 nTransparence = 100; 352 } 353 354 if(nTransparence) 355 { 356 sal_uInt16 nFillTransparence(((const XFillTransparenceItem&)(rSet.Get(XATTR_FILLTRANSPARENCE))).GetValue()); 357 358 if(nFillTransparence > 100) 359 { 360 nFillTransparence = 100; 361 } 362 363 if(nTransparence == nFillTransparence) 364 { 365 // shadow does not really have an own transparence, but the application 366 // sets the shadow transparence equal to the object transparence for 367 // convenience. This is not useful for primitive creation, so take 368 // this as no shadow transparence 369 nTransparence = 0; 370 } 371 } 372 373 if(100 != nTransparence) 374 { 375 const basegfx::B2DVector aOffset( 376 (double)((SdrShadowXDistItem&)(rSet.Get(SDRATTR_SHADOWXDIST))).GetValue(), 377 (double)((SdrShadowYDistItem&)(rSet.Get(SDRATTR_SHADOWYDIST))).GetValue()); 378 const Color aColor(((SdrShadowColorItem&)(rSet.Get(SDRATTR_SHADOWCOLOR))).GetColorValue()); 379 380 return attribute::SdrShadowAttribute(aOffset, (double)nTransparence * 0.01, aColor.getBColor()); 381 } 382 } 383 384 return attribute::SdrShadowAttribute(); 385 } 386 387 attribute::SdrFillAttribute createNewSdrFillAttribute(const SfxItemSet& rSet) 388 { 389 const XFillStyle eStyle(((XFillStyleItem&)(rSet.Get(XATTR_FILLSTYLE))).GetValue()); 390 391 if(XFILL_NONE != eStyle) 392 { 393 sal_uInt16 nTransparence(((const XFillTransparenceItem&)(rSet.Get(XATTR_FILLTRANSPARENCE))).GetValue()); 394 395 if(nTransparence > 100) 396 { 397 nTransparence = 100; 398 } 399 400 if(100 != nTransparence) 401 { 402 const Color aColor(((const XFillColorItem&)(rSet.Get(XATTR_FILLCOLOR))).GetColorValue()); 403 attribute::FillGradientAttribute aGradient; 404 attribute::FillHatchAttribute aHatch; 405 attribute::SdrFillBitmapAttribute aBitmap; 406 407 switch(eStyle) 408 { 409 case XFILL_NONE : // for warnings 410 case XFILL_SOLID : 411 { 412 // nothing to do, color is defined 413 break; 414 } 415 case XFILL_GRADIENT : 416 { 417 XGradient aXGradient(((XFillGradientItem&)(rSet.Get(XATTR_FILLGRADIENT))).GetGradientValue()); 418 419 const Color aStartColor(aXGradient.GetStartColor()); 420 const sal_uInt16 nStartIntens(aXGradient.GetStartIntens()); 421 basegfx::BColor aStart(aStartColor.getBColor()); 422 423 if(nStartIntens != 100) 424 { 425 const basegfx::BColor aBlack; 426 aStart = interpolate(aBlack, aStart, (double)nStartIntens * 0.01); 427 } 428 429 const Color aEndColor(aXGradient.GetEndColor()); 430 const sal_uInt16 nEndIntens(aXGradient.GetEndIntens()); 431 basegfx::BColor aEnd(aEndColor.getBColor()); 432 433 if(nEndIntens != 100) 434 { 435 const basegfx::BColor aBlack; 436 aEnd = interpolate(aBlack, aEnd, (double)nEndIntens * 0.01); 437 } 438 439 aGradient = attribute::FillGradientAttribute( 440 XGradientStyleToGradientStyle(aXGradient.GetGradientStyle()), 441 (double)aXGradient.GetBorder() * 0.01, 442 (double)aXGradient.GetXOffset() * 0.01, 443 (double)aXGradient.GetYOffset() * 0.01, 444 (double)aXGradient.GetAngle() * F_PI1800, 445 aStart, 446 aEnd, 447 ((const XGradientStepCountItem&)rSet.Get(XATTR_GRADIENTSTEPCOUNT)).GetValue()); 448 449 break; 450 } 451 case XFILL_HATCH : 452 { 453 const XHatch& rHatch(((XFillHatchItem&)(rSet.Get(XATTR_FILLHATCH))).GetHatchValue()); 454 const Color aColorB(rHatch.GetColor()); 455 456 aHatch = attribute::FillHatchAttribute( 457 XHatchStyleToHatchStyle(rHatch.GetHatchStyle()), 458 (double)rHatch.GetDistance(), 459 (double)rHatch.GetAngle() * F_PI1800, 460 aColorB.getBColor(), 461 3, // same default as VCL, a minimum of three discrete units (pixels) offset 462 ((const XFillBackgroundItem&)(rSet.Get(XATTR_FILLBACKGROUND))).GetValue()); 463 464 break; 465 } 466 case XFILL_BITMAP : 467 { 468 aBitmap = createNewSdrFillBitmapAttribute(rSet); 469 break; 470 } 471 } 472 473 return attribute::SdrFillAttribute( 474 (double)nTransparence * 0.01, 475 aColor.getBColor(), 476 aGradient, 477 aHatch, 478 aBitmap); 479 } 480 } 481 482 return attribute::SdrFillAttribute(); 483 } 484 485 // #i101508# Support handing over given text-to-border distances 486 attribute::SdrTextAttribute createNewSdrTextAttribute( 487 const SfxItemSet& rSet, 488 const SdrText& rText, 489 const sal_Int32* pLeft, 490 const sal_Int32* pUpper, 491 const sal_Int32* pRight, 492 const sal_Int32* pLower) 493 { 494 const SdrTextObj& rTextObj = rText.GetObject(); 495 496 if(rText.GetOutlinerParaObject() && rText.GetModel()) 497 { 498 // added TextEdit text suppression 499 bool bInEditMode(false); 500 501 if(rText.GetObject().getTextCount() > 1) 502 { 503 bInEditMode = rTextObj.IsInEditMode() && rText.GetObject().getActiveText() == &rText; 504 } 505 else 506 { 507 bInEditMode = rTextObj.IsInEditMode(); 508 } 509 510 OutlinerParaObject aOutlinerParaObject(*rText.GetOutlinerParaObject()); 511 512 if(bInEditMode) 513 { 514 OutlinerParaObject* pTempObj = rTextObj.GetEditOutlinerParaObject(); 515 516 if(pTempObj) 517 { 518 aOutlinerParaObject = *pTempObj; 519 delete pTempObj; 520 } 521 else 522 { 523 // #i100537# 524 // GetEditOutlinerParaObject() returning no object does not mean that 525 // text edit mode is not active. Do not reset the flag here 526 // bInEditMode = false; 527 } 528 } 529 530 const SdrFitToSizeType eFit(rTextObj.GetFitToSize()); 531 const SdrTextAniKind eAniKind(rTextObj.GetTextAniKind()); 532 533 // #i107346# 534 const SdrOutliner& rDrawTextOutliner = rText.GetModel()->GetDrawOutliner(&rTextObj); 535 const bool bWrongSpell(rDrawTextOutliner.GetControlWord() & EE_CNTRL_ONLINESPELLING); 536 537 return attribute::SdrTextAttribute( 538 rText, 539 aOutlinerParaObject, 540 ((const XFormTextStyleItem&)rSet.Get(XATTR_FORMTXTSTYLE)).GetValue(), 541 pLeft ? *pLeft : rTextObj.GetTextLeftDistance(), 542 pUpper ? *pUpper : rTextObj.GetTextUpperDistance(), 543 pRight ? *pRight : rTextObj.GetTextRightDistance(), 544 pLower ? *pLower : rTextObj.GetTextLowerDistance(), 545 rTextObj.GetTextHorizontalAdjust(rSet), 546 rTextObj.GetTextVerticalAdjust(rSet), 547 ((const SdrTextContourFrameItem&)rSet.Get(SDRATTR_TEXT_CONTOURFRAME)).GetValue(), 548 (SDRTEXTFIT_PROPORTIONAL == eFit || SDRTEXTFIT_ALLLINES == eFit), 549 ((const XFormTextHideFormItem&)rSet.Get(XATTR_FORMTXTHIDEFORM)).GetValue(), 550 SDRTEXTANI_BLINK == eAniKind, 551 SDRTEXTANI_SCROLL == eAniKind || SDRTEXTANI_ALTERNATE == eAniKind || SDRTEXTANI_SLIDE == eAniKind, 552 bInEditMode, 553 ((const SdrTextFixedCellHeightItem&)rSet.Get(SDRATTR_TEXT_USEFIXEDCELLHEIGHT)).GetValue(), 554 bWrongSpell); 555 } 556 557 return attribute::SdrTextAttribute(); 558 } 559 560 attribute::FillGradientAttribute createNewTransparenceGradientAttribute(const SfxItemSet& rSet) 561 { 562 const SfxPoolItem* pGradientItem; 563 564 if(SFX_ITEM_SET == rSet.GetItemState(XATTR_FILLFLOATTRANSPARENCE, sal_True, &pGradientItem) 565 && ((XFillFloatTransparenceItem*)pGradientItem)->IsEnabled()) 566 { 567 // test if float transparence is completely transparent 568 const XGradient& rGradient = ((XFillFloatTransparenceItem*)pGradientItem)->GetGradientValue(); 569 const sal_uInt8 nStartLuminance(rGradient.GetStartColor().GetLuminance()); 570 const sal_uInt8 nEndLuminance(rGradient.GetEndColor().GetLuminance()); 571 const bool bCompletelyTransparent(0xff == nStartLuminance && 0xff == nEndLuminance); 572 573 if(!bCompletelyTransparent) 574 { 575 const double fStartLum(nStartLuminance / 255.0); 576 const double fEndLum(nEndLuminance / 255.0); 577 578 return attribute::FillGradientAttribute( 579 XGradientStyleToGradientStyle(rGradient.GetGradientStyle()), 580 (double)rGradient.GetBorder() * 0.01, 581 (double)rGradient.GetXOffset() * 0.01, 582 (double)rGradient.GetYOffset() * 0.01, 583 (double)rGradient.GetAngle() * F_PI1800, 584 basegfx::BColor(fStartLum, fStartLum, fStartLum), 585 basegfx::BColor(fEndLum, fEndLum, fEndLum), 586 0); 587 } 588 } 589 590 return attribute::FillGradientAttribute(); 591 } 592 593 attribute::SdrFillBitmapAttribute createNewSdrFillBitmapAttribute(const SfxItemSet& rSet) 594 { 595 BitmapEx aBitmapEx(((const XFillBitmapItem&)(rSet.Get(XATTR_FILLBITMAP))).GetGraphicObject().GetGraphic().GetBitmapEx()); 596 597 // make sure it's not empty, use default instead 598 if(aBitmapEx.IsEmpty()) 599 { 600 // #i118485# Add PrefMapMode and PrefSize to avoid mini-tiling and 601 // expensive primitive processing in this case. Use 10x10 cm 602 aBitmapEx = Bitmap(Size(4,4), 8); 603 aBitmapEx.SetPrefMapMode(MapMode(MAP_100TH_MM)); 604 aBitmapEx.SetPrefSize(Size(10000.0, 10000.0)); 605 } 606 607 // if there is no logical size, create a size from pixel size and set MapMode accordingly 608 if(0L == aBitmapEx.GetPrefSize().Width() || 0L == aBitmapEx.GetPrefSize().Height()) 609 { 610 aBitmapEx.SetPrefSize(aBitmapEx.GetSizePixel()); 611 aBitmapEx.SetPrefMapMode(MAP_PIXEL); 612 } 613 614 // convert size and MapMode to destination logical size and MapMode. The created 615 // bitmap must have a valid logical size (PrefSize) 616 const MapUnit aDestinationMapUnit((MapUnit)rSet.GetPool()->GetMetric(0)); 617 618 if(aBitmapEx.GetPrefMapMode() != aDestinationMapUnit) 619 { 620 // #i100360# for MAP_PIXEL, LogicToLogic will not work properly, 621 // so fallback to Application::GetDefaultDevice() 622 if(MAP_PIXEL == aBitmapEx.GetPrefMapMode().GetMapUnit()) 623 { 624 aBitmapEx.SetPrefSize(Application::GetDefaultDevice()->PixelToLogic( 625 aBitmapEx.GetPrefSize(), aDestinationMapUnit)); 626 } 627 else 628 { 629 aBitmapEx.SetPrefSize(OutputDevice::LogicToLogic( 630 aBitmapEx.GetPrefSize(), aBitmapEx.GetPrefMapMode(), aDestinationMapUnit)); 631 } 632 } 633 634 // get size 635 const basegfx::B2DVector aSize( 636 (double)((const SfxMetricItem&)(rSet.Get(XATTR_FILLBMP_SIZEX))).GetValue(), 637 (double)((const SfxMetricItem&)(rSet.Get(XATTR_FILLBMP_SIZEY))).GetValue()); 638 const basegfx::B2DVector aOffset( 639 (double)((const SfxUInt16Item&) (rSet.Get(XATTR_FILLBMP_TILEOFFSETX))).GetValue(), 640 (double)((const SfxUInt16Item&) (rSet.Get(XATTR_FILLBMP_TILEOFFSETY))).GetValue()); 641 const basegfx::B2DVector aOffsetPosition( 642 (double)((const SfxUInt16Item&) (rSet.Get(XATTR_FILLBMP_POSOFFSETX))).GetValue(), 643 (double)((const SfxUInt16Item&) (rSet.Get(XATTR_FILLBMP_POSOFFSETY))).GetValue()); 644 645 return attribute::SdrFillBitmapAttribute( 646 aBitmapEx, 647 aSize, 648 aOffset, 649 aOffsetPosition, 650 RectPointToB2DVector((RECT_POINT)((const SfxEnumItem&)(rSet.Get(XATTR_FILLBMP_POS))).GetValue()), 651 ((const SfxBoolItem&) (rSet.Get(XATTR_FILLBMP_TILE))).GetValue(), 652 ((const SfxBoolItem&) (rSet.Get(XATTR_FILLBMP_STRETCH))).GetValue(), 653 ((const SfxBoolItem&) (rSet.Get(XATTR_FILLBMP_SIZELOG))).GetValue()); 654 } 655 656 attribute::SdrShadowTextAttribute createNewSdrShadowTextAttribute( 657 const SfxItemSet& rSet, 658 const SdrText* pText, 659 bool bSuppressText) 660 { 661 attribute::SdrTextAttribute aText; 662 663 // #i98072# added option to suppress text 664 // look for text first 665 if(!bSuppressText && pText) 666 { 667 aText = createNewSdrTextAttribute(rSet, *pText); 668 } 669 670 // try shadow 671 const attribute::SdrShadowAttribute aShadow(createNewSdrShadowAttribute(rSet)); 672 673 return attribute::SdrShadowTextAttribute(aShadow, aText); 674 } 675 676 attribute::SdrLineShadowTextAttribute createNewSdrLineShadowTextAttribute( 677 const SfxItemSet& rSet, 678 const SdrText* pText) 679 { 680 attribute::SdrLineAttribute aLine; 681 attribute::SdrLineStartEndAttribute aLineStartEnd; 682 attribute::SdrTextAttribute aText; 683 bool bFontworkHideContour(false); 684 685 // look for text first 686 if(pText) 687 { 688 aText = createNewSdrTextAttribute(rSet, *pText); 689 690 // when object has text and text is fontwork and hide contour is set for fontwork, force 691 // line and fill style to empty 692 if(!aText.isDefault() 693 && !aText.getSdrFormTextAttribute().isDefault() 694 && aText.isHideContour()) 695 { 696 bFontworkHideContour = true; 697 } 698 } 699 700 // try line style 701 if(!bFontworkHideContour) 702 { 703 aLine = createNewSdrLineAttribute(rSet); 704 705 if(!aLine.isDefault()) 706 { 707 // try LineStartEnd 708 aLineStartEnd = createNewSdrLineStartEndAttribute(rSet, aLine.getWidth()); 709 } 710 } 711 712 if(!aLine.isDefault() || !aText.isDefault()) 713 { 714 // try shadow 715 const attribute::SdrShadowAttribute aShadow(createNewSdrShadowAttribute(rSet)); 716 717 return attribute::SdrLineShadowTextAttribute(aLine, aLineStartEnd, aShadow, aText); 718 } 719 720 return attribute::SdrLineShadowTextAttribute(); 721 } 722 723 attribute::SdrLineFillShadowTextAttribute createNewSdrLineFillShadowTextAttribute( 724 const SfxItemSet& rSet, 725 const SdrText* pText, 726 bool bHasContent) 727 { 728 attribute::SdrLineAttribute aLine; 729 attribute::SdrFillAttribute aFill; 730 attribute::SdrLineStartEndAttribute aLineStartEnd; 731 attribute::SdrShadowAttribute aShadow; 732 attribute::FillGradientAttribute aFillFloatTransGradient; 733 attribute::SdrTextAttribute aText; 734 bool bFontworkHideContour(false); 735 736 // look for text first 737 if(pText) 738 { 739 aText = createNewSdrTextAttribute(rSet, *pText); 740 741 // when object has text and text is fontwork and hide contour is set for fontwork, force 742 // line and fill style to empty 743 if(!aText.getSdrFormTextAttribute().isDefault() && aText.isHideContour()) 744 { 745 bFontworkHideContour = true; 746 } 747 } 748 749 if(!bFontworkHideContour) 750 { 751 // try line style 752 aLine = createNewSdrLineAttribute(rSet); 753 754 if(!aLine.isDefault()) 755 { 756 // try LineStartEnd 757 aLineStartEnd = createNewSdrLineStartEndAttribute(rSet, aLine.getWidth()); 758 } 759 760 // try fill style 761 aFill = createNewSdrFillAttribute(rSet); 762 763 if(!aFill.isDefault()) 764 { 765 // try fillfloattransparence 766 aFillFloatTransGradient = createNewTransparenceGradientAttribute(rSet); 767 } 768 } 769 770 // bHasContent is used from OLE and graphic objects. Normally a possible shadow 771 // depends on line, fill or text to be set, but for these objects it is possible 772 // to have none of these, but still content which needs to have a shadow (if set), 773 // so shadow needs to be tried 774 if(bHasContent || !aLine.isDefault() || !aFill.isDefault() || !aText.isDefault()) 775 { 776 // try shadow 777 aShadow = createNewSdrShadowAttribute(rSet); 778 779 return attribute::SdrLineFillShadowTextAttribute( 780 aLine, aFill, aLineStartEnd, aShadow, aFillFloatTransGradient, aText); 781 } 782 783 return attribute::SdrLineFillShadowTextAttribute(); 784 } 785 786 attribute::SdrLineFillShadowAttribute3D createNewSdrLineFillShadowAttribute(const SfxItemSet& rSet, bool bSuppressFill) 787 { 788 attribute::SdrFillAttribute aFill; 789 attribute::SdrLineStartEndAttribute aLineStartEnd; 790 attribute::SdrShadowAttribute aShadow; 791 attribute::FillGradientAttribute aFillFloatTransGradient; 792 793 // try line style 794 const attribute::SdrLineAttribute aLine(createNewSdrLineAttribute(rSet)); 795 796 if(!aLine.isDefault()) 797 { 798 // try LineStartEnd 799 aLineStartEnd = createNewSdrLineStartEndAttribute(rSet, aLine.getWidth()); 800 } 801 802 // try fill style 803 if(!bSuppressFill) 804 { 805 aFill = createNewSdrFillAttribute(rSet); 806 807 if(!aFill.isDefault()) 808 { 809 // try fillfloattransparence 810 aFillFloatTransGradient = createNewTransparenceGradientAttribute(rSet); 811 } 812 } 813 814 if(!aLine.isDefault() || !aFill.isDefault()) 815 { 816 // try shadow 817 aShadow = createNewSdrShadowAttribute(rSet); 818 819 return attribute::SdrLineFillShadowAttribute3D( 820 aLine, aFill, aLineStartEnd, aShadow, aFillFloatTransGradient); 821 } 822 823 return attribute::SdrLineFillShadowAttribute3D(); 824 } 825 826 attribute::SdrSceneAttribute createNewSdrSceneAttribute(const SfxItemSet& rSet) 827 { 828 // get perspective 829 ::com::sun::star::drawing::ProjectionMode aProjectionMode(::com::sun::star::drawing::ProjectionMode_PARALLEL); 830 const sal_uInt16 nProjectionValue(((const Svx3DPerspectiveItem&)rSet.Get(SDRATTR_3DSCENE_PERSPECTIVE)).GetValue()); 831 832 if(1L == nProjectionValue) 833 { 834 aProjectionMode = ::com::sun::star::drawing::ProjectionMode_PERSPECTIVE; 835 } 836 837 // get distance 838 const double fDistance(((const Svx3DDistanceItem&)rSet.Get(SDRATTR_3DSCENE_DISTANCE)).GetValue()); 839 840 // get shadow slant 841 const double fShadowSlant(F_PI180 * ((const Svx3DShadowSlantItem&)rSet.Get(SDRATTR_3DSCENE_SHADOW_SLANT)).GetValue()); 842 843 // get shade mode 844 ::com::sun::star::drawing::ShadeMode aShadeMode(::com::sun::star::drawing::ShadeMode_FLAT); 845 const sal_uInt16 nShadeValue(((const Svx3DShadeModeItem&)rSet.Get(SDRATTR_3DSCENE_SHADE_MODE)).GetValue()); 846 847 if(1L == nShadeValue) 848 { 849 aShadeMode = ::com::sun::star::drawing::ShadeMode_PHONG; 850 } 851 else if(2L == nShadeValue) 852 { 853 aShadeMode = ::com::sun::star::drawing::ShadeMode_SMOOTH; 854 } 855 else if(3L == nShadeValue) 856 { 857 aShadeMode = ::com::sun::star::drawing::ShadeMode_DRAFT; 858 } 859 860 // get two sided lighting 861 const bool bTwoSidedLighting(((const Svx3DTwoSidedLightingItem&)rSet.Get(SDRATTR_3DSCENE_TWO_SIDED_LIGHTING)).GetValue()); 862 863 return attribute::SdrSceneAttribute(fDistance, fShadowSlant, aProjectionMode, aShadeMode, bTwoSidedLighting); 864 } 865 866 attribute::SdrLightingAttribute createNewSdrLightingAttribute(const SfxItemSet& rSet) 867 { 868 // extract lights from given SfxItemSet (from scene) 869 ::std::vector< attribute::Sdr3DLightAttribute > aLightVector; 870 871 if(((const Svx3DLightOnOff1Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTON_1)).GetValue()) 872 { 873 const basegfx::BColor aColor(((const Svx3DLightcolor1Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_1)).GetValue().getBColor()); 874 const basegfx::B3DVector aDirection(((const Svx3DLightDirection1Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_1)).GetValue()); 875 aLightVector.push_back(attribute::Sdr3DLightAttribute(aColor, aDirection, true)); 876 } 877 878 if(((const Svx3DLightOnOff2Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTON_2)).GetValue()) 879 { 880 const basegfx::BColor aColor(((const Svx3DLightcolor2Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_2)).GetValue().getBColor()); 881 const basegfx::B3DVector aDirection(((const Svx3DLightDirection2Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_2)).GetValue()); 882 aLightVector.push_back(attribute::Sdr3DLightAttribute(aColor, aDirection, false)); 883 } 884 885 if(((const Svx3DLightOnOff3Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTON_3)).GetValue()) 886 { 887 const basegfx::BColor aColor(((const Svx3DLightcolor3Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_3)).GetValue().getBColor()); 888 const basegfx::B3DVector aDirection(((const Svx3DLightDirection3Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_3)).GetValue()); 889 aLightVector.push_back(attribute::Sdr3DLightAttribute(aColor, aDirection, false)); 890 } 891 892 if(((const Svx3DLightOnOff4Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTON_4)).GetValue()) 893 { 894 const basegfx::BColor aColor(((const Svx3DLightcolor4Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_4)).GetValue().getBColor()); 895 const basegfx::B3DVector aDirection(((const Svx3DLightDirection4Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_4)).GetValue()); 896 aLightVector.push_back(attribute::Sdr3DLightAttribute(aColor, aDirection, false)); 897 } 898 899 if(((const Svx3DLightOnOff5Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTON_5)).GetValue()) 900 { 901 const basegfx::BColor aColor(((const Svx3DLightcolor5Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_5)).GetValue().getBColor()); 902 const basegfx::B3DVector aDirection(((const Svx3DLightDirection5Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_5)).GetValue()); 903 aLightVector.push_back(attribute::Sdr3DLightAttribute(aColor, aDirection, false)); 904 } 905 906 if(((const Svx3DLightOnOff6Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTON_6)).GetValue()) 907 { 908 const basegfx::BColor aColor(((const Svx3DLightcolor6Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_6)).GetValue().getBColor()); 909 const basegfx::B3DVector aDirection(((const Svx3DLightDirection6Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_6)).GetValue()); 910 aLightVector.push_back(attribute::Sdr3DLightAttribute(aColor, aDirection, false)); 911 } 912 913 if(((const Svx3DLightOnOff7Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTON_7)).GetValue()) 914 { 915 const basegfx::BColor aColor(((const Svx3DLightcolor7Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_7)).GetValue().getBColor()); 916 const basegfx::B3DVector aDirection(((const Svx3DLightDirection7Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_7)).GetValue()); 917 aLightVector.push_back(attribute::Sdr3DLightAttribute(aColor, aDirection, false)); 918 } 919 920 if(((const Svx3DLightOnOff8Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTON_8)).GetValue()) 921 { 922 const basegfx::BColor aColor(((const Svx3DLightcolor8Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_8)).GetValue().getBColor()); 923 const basegfx::B3DVector aDirection(((const Svx3DLightDirection8Item&)rSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_8)).GetValue()); 924 aLightVector.push_back(attribute::Sdr3DLightAttribute(aColor, aDirection, false)); 925 } 926 927 // get ambient color 928 const Color aAmbientValue(((const Svx3DAmbientcolorItem&)rSet.Get(SDRATTR_3DSCENE_AMBIENTCOLOR)).GetValue()); 929 const basegfx::BColor aAmbientLight(aAmbientValue.getBColor()); 930 931 return attribute::SdrLightingAttribute(aAmbientLight, aLightVector); 932 } 933 934 void calculateRelativeCornerRadius(sal_Int32 nRadius, const basegfx::B2DRange& rObjectRange, double& rfCornerRadiusX, double& rfCornerRadiusY) 935 { 936 rfCornerRadiusX = rfCornerRadiusY = (double)nRadius; 937 938 if(0.0 != rfCornerRadiusX) 939 { 940 const double fHalfObjectWidth(rObjectRange.getWidth() * 0.5); 941 942 if(0.0 != fHalfObjectWidth) 943 { 944 if(rfCornerRadiusX < 0.0) 945 { 946 rfCornerRadiusX = 0.0; 947 } 948 949 if(rfCornerRadiusX > fHalfObjectWidth) 950 { 951 rfCornerRadiusX = fHalfObjectWidth; 952 } 953 954 rfCornerRadiusX /= fHalfObjectWidth; 955 } 956 else 957 { 958 rfCornerRadiusX = 0.0; 959 } 960 } 961 962 if(0.0 != rfCornerRadiusY) 963 { 964 const double fHalfObjectHeight(rObjectRange.getHeight() * 0.5); 965 966 if(0.0 != fHalfObjectHeight) 967 { 968 if(rfCornerRadiusY < 0.0) 969 { 970 rfCornerRadiusY = 0.0; 971 } 972 973 if(rfCornerRadiusY > fHalfObjectHeight) 974 { 975 rfCornerRadiusY = fHalfObjectHeight; 976 } 977 978 rfCornerRadiusY /= fHalfObjectHeight; 979 } 980 else 981 { 982 rfCornerRadiusY = 0.0; 983 } 984 } 985 } 986 987 // #i101508# Support handing over given text-to-border distances 988 attribute::SdrFillTextAttribute createNewSdrFillTextAttribute( 989 const SfxItemSet& rSet, 990 const SdrText* pText, 991 const sal_Int32* pLeft, 992 const sal_Int32* pUpper, 993 const sal_Int32* pRight, 994 const sal_Int32* pLower) 995 { 996 attribute::SdrFillAttribute aFill; 997 attribute::FillGradientAttribute aFillFloatTransGradient; 998 attribute::SdrTextAttribute aText; 999 bool bFontworkHideContour(false); 1000 1001 // look for text first 1002 if(pText) 1003 { 1004 aText = createNewSdrTextAttribute(rSet, *pText, pLeft, pUpper, pRight, pLower); 1005 1006 // when object has text and text is fontwork and hide contour is set for fontwork, force 1007 // fill style to empty 1008 if(!aText.getSdrFormTextAttribute().isDefault() && aText.isHideContour()) 1009 { 1010 bFontworkHideContour = true; 1011 } 1012 } 1013 1014 if(!bFontworkHideContour) 1015 { 1016 // try fill style 1017 aFill = createNewSdrFillAttribute(rSet); 1018 1019 if(!aFill.isDefault()) 1020 { 1021 // try fillfloattransparence 1022 aFillFloatTransGradient = createNewTransparenceGradientAttribute(rSet); 1023 } 1024 } 1025 1026 if(!aFill.isDefault() || !aText.isDefault()) 1027 { 1028 return attribute::SdrFillTextAttribute(aFill, aFillFloatTransGradient, aText); 1029 } 1030 1031 return attribute::SdrFillTextAttribute(); 1032 } 1033 1034 } // end of namespace primitive2d 1035 } // end of namespace drawinglayer 1036 1037 ////////////////////////////////////////////////////////////////////////////// 1038 // eof 1039