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 // MARKER(update_precomp.py): autogen include statement, do not remove 23 #include "precompiled_sw.hxx" 24 25 #include <hintids.hxx> 26 #include <tools/urlobj.hxx> 27 #include <vcl/print.hxx> 28 #include <vcl/virdev.hxx> 29 #include <vcl/svapp.hxx> 30 #include <svtools/imapobj.hxx> 31 #include <svtools/imap.hxx> 32 #include <svl/urihelper.hxx> 33 #include <svtools/soerr.hxx> 34 #include <sfx2/progress.hxx> 35 #include <sfx2/docfile.hxx> 36 #include <sfx2/printer.hxx> 37 #include <editeng/udlnitem.hxx> 38 #include <editeng/colritem.hxx> 39 #include <svx/xoutbmp.hxx> 40 #include <vcl/window.hxx> 41 #include <fmturl.hxx> 42 #include <fmtsrnd.hxx> 43 #include <frmfmt.hxx> 44 #include <swrect.hxx> 45 #include <fesh.hxx> 46 #include <doc.hxx> 47 #include <flyfrm.hxx> 48 #include <frmtool.hxx> 49 #include <viewopt.hxx> 50 #include <viewimp.hxx> 51 #include <pam.hxx> 52 #include <hints.hxx> 53 #include <rootfrm.hxx> 54 #include <dflyobj.hxx> 55 #include <pagefrm.hxx> 56 #include <notxtfrm.hxx> 57 #include <grfatr.hxx> 58 #include <charatr.hxx> 59 #include <fmtornt.hxx> 60 #include <ndnotxt.hxx> 61 #include <ndgrf.hxx> 62 #include <ndole.hxx> 63 #include <swregion.hxx> 64 #include <poolfmt.hxx> 65 #include <mdiexp.hxx> 66 #include <swwait.hxx> 67 #include <comcore.hrc> 68 #include <accessibilityoptions.hxx> 69 #include <com/sun/star/embed/EmbedMisc.hpp> 70 #include <com/sun/star/embed/EmbedStates.hpp> 71 #include <svtools/embedhlp.hxx> 72 #include <svx/charthelper.hxx> 73 #include <dview.hxx> 74 #include <basegfx/matrix/b2dhommatrix.hxx> 75 #include <drawinglayer/processor2d/baseprocessor2d.hxx> 76 #include <basegfx/matrix/b2dhommatrixtools.hxx> 77 #include <drawinglayer/processor2d/processor2dtools.hxx> 78 #include <basegfx/matrix/b2dhommatrixtools.hxx> 79 #include <drawinglayer/primitive2d/bitmapprimitive2d.hxx> 80 81 using namespace com::sun::star; 82 83 #define DEFTEXTSIZE 12 84 85 extern void ClrContourCache( const SdrObject *pObj ); // TxtFly.Cxx 86 87 88 inline sal_Bool GetRealURL( const SwGrfNode& rNd, String& rTxt ) 89 { 90 sal_Bool bRet = rNd.GetFileFilterNms( &rTxt, 0 ); 91 if( bRet ) 92 rTxt = URIHelper::removePassword( rTxt, INetURLObject::WAS_ENCODED, 93 INetURLObject::DECODE_UNAMBIGUOUS); 94 return bRet; 95 } 96 97 void lcl_PaintReplacement( const SwRect &rRect, const String &rText, 98 const ViewShell &rSh, const SwNoTxtFrm *pFrm, 99 sal_Bool bDefect ) 100 { 101 static Font *pFont = 0; 102 if ( !pFont ) 103 { 104 pFont = new Font(); 105 pFont->SetWeight( WEIGHT_BOLD ); 106 pFont->SetStyleName( aEmptyStr ); 107 pFont->SetName( String::CreateFromAscii( 108 RTL_CONSTASCII_STRINGPARAM( "Arial Unicode" ))); 109 pFont->SetFamily( FAMILY_SWISS ); 110 pFont->SetTransparent( sal_True ); 111 } 112 113 Color aCol( COL_RED ); 114 FontUnderline eUnderline = UNDERLINE_NONE; 115 const SwFmtURL &rURL = pFrm->FindFlyFrm()->GetFmt()->GetURL(); 116 if( rURL.GetURL().Len() || rURL.GetMap() ) 117 { 118 sal_Bool bVisited = sal_False; 119 if ( rURL.GetMap() ) 120 { 121 ImageMap *pMap = (ImageMap*)rURL.GetMap(); 122 for( sal_uInt16 i = 0; i < pMap->GetIMapObjectCount(); i++ ) 123 { 124 IMapObject *pObj = pMap->GetIMapObject( i ); 125 if( rSh.GetDoc()->IsVisitedURL( pObj->GetURL() ) ) 126 { 127 bVisited = sal_True; 128 break; 129 } 130 } 131 } 132 else if ( rURL.GetURL().Len() ) 133 bVisited = rSh.GetDoc()->IsVisitedURL( rURL.GetURL() ); 134 135 SwFmt *pFmt = rSh.GetDoc()->GetFmtFromPool( static_cast<sal_uInt16> 136 (bVisited ? RES_POOLCHR_INET_VISIT : RES_POOLCHR_INET_NORMAL ) ); 137 aCol = pFmt->GetColor().GetValue(); 138 eUnderline = pFmt->GetUnderline().GetLineStyle(); 139 } 140 141 pFont->SetUnderline( eUnderline ); 142 pFont->SetColor( aCol ); 143 144 const BitmapEx& rBmp = ViewShell::GetReplacementBitmap( bDefect != sal_False ); 145 Graphic::DrawEx( rSh.GetOut(), rText, *pFont, rBmp, rRect.Pos(), rRect.SSize() ); 146 } 147 148 /************************************************************************* 149 |* 150 |* SwGrfFrm::SwGrfFrm(ViewShell * const,SwGrfNode *) 151 |* 152 |* Beschreibung 153 |* Ersterstellung JP 05.03.91 154 |* Letzte Aenderung MA 03. Mar. 93 155 |* 156 *************************************************************************/ 157 158 159 SwNoTxtFrm::SwNoTxtFrm(SwNoTxtNode * const pNode, SwFrm* pSib ) 160 : SwCntntFrm( pNode, pSib ) 161 { 162 InitCtor(); 163 } 164 165 // Initialisierung: z.Zt. Eintragen des Frames im Cache 166 167 168 void SwNoTxtFrm::InitCtor() 169 { 170 nType = FRMC_NOTXT; 171 // Das Gewicht der Grafik ist 0, wenn sie noch nicht 172 // gelesen ist, < 0, wenn ein Lesefehler auftrat und 173 // Ersatzdarstellung angewendet werden musste und >0, 174 // wenn sie zur Verfuegung steht. 175 nWeight = 0; 176 } 177 178 /************************************************************************* 179 |* 180 |* SwNoTxtNode::MakeFrm() 181 |* 182 |* Beschreibung 183 |* Ersterstellung JP 05.03.91 184 |* Letzte Aenderung MA 03. Mar. 93 185 |* 186 *************************************************************************/ 187 188 189 SwCntntFrm *SwNoTxtNode::MakeFrm( SwFrm* pSib ) 190 { 191 return new SwNoTxtFrm(this, pSib); 192 } 193 194 /************************************************************************* 195 |* 196 |* SwNoTxtFrm::~SwNoTxtFrm() 197 |* 198 |* Beschreibung 199 |* Ersterstellung JP 05.03.91 200 |* Letzte Aenderung MA 30. Apr. 96 201 |* 202 *************************************************************************/ 203 204 SwNoTxtFrm::~SwNoTxtFrm() 205 { 206 StopAnimation(); 207 } 208 209 /************************************************************************* 210 |* 211 |* void SwNoTxtFrm::Modify( SwHint * pOld, SwHint * pNew ) 212 |* 213 |* Beschreibung 214 |* Ersterstellung JP 05.03.91 215 |* Letzte Aenderung JP 05.03.91 216 |* 217 *************************************************************************/ 218 219 void SetOutDev( ViewShell *pSh, OutputDevice *pOut ) 220 { 221 pSh->pOut = pOut; 222 } 223 224 225 226 227 void lcl_ClearArea( const SwFrm &rFrm, 228 OutputDevice &rOut, const SwRect& rPtArea, 229 const SwRect &rGrfArea ) 230 { 231 SwRegionRects aRegion( rPtArea, 4, 4 ); 232 aRegion -= rGrfArea; 233 234 if ( aRegion.Count() ) 235 { 236 const SvxBrushItem *pItem; const Color *pCol; SwRect aOrigRect; 237 if ( rFrm.GetBackgroundBrush( pItem, pCol, aOrigRect, sal_False ) ) 238 for( sal_uInt16 i = 0; i < aRegion.Count(); ++i ) 239 ::DrawGraphic( pItem, &rOut, aOrigRect, aRegion[i] ); 240 else 241 { 242 // OD 2004-04-23 #116347# 243 rOut.Push( PUSH_FILLCOLOR|PUSH_LINECOLOR ); 244 rOut.SetFillColor( rFrm.getRootFrm()->GetCurrShell()->Imp()->GetRetoucheColor()); 245 rOut.SetLineColor(); 246 for( sal_uInt16 i = 0; i < aRegion.Count(); ++i ) 247 rOut.DrawRect( aRegion[i].SVRect() ); 248 rOut.Pop(); 249 } 250 } 251 } 252 253 /************************************************************************* 254 |* 255 |* void SwNoTxtFrm::Paint() 256 |* 257 |* Beschreibung 258 |* Ersterstellung JP 05.03.91 259 |* Letzte Aenderung MA 10. Jan. 97 260 |* 261 *************************************************************************/ 262 263 void SwNoTxtFrm::Paint(SwRect const& rRect, SwPrintData const*const) const 264 { 265 if ( Frm().IsEmpty() ) 266 return; 267 268 const ViewShell* pSh = getRootFrm()->GetCurrShell(); 269 if( !pSh->GetViewOptions()->IsGraphic() ) 270 { 271 StopAnimation(); 272 // OD 10.01.2003 #i6467# - no paint of placeholder for page preview 273 if ( pSh->GetWin() && !pSh->IsPreView() ) 274 { 275 const SwNoTxtNode* pNd = GetNode()->GetNoTxtNode(); 276 String aTxt( pNd->GetTitle() ); 277 if ( !aTxt.Len() && pNd->IsGrfNode() ) 278 GetRealURL( *(SwGrfNode*)pNd, aTxt ); 279 if( !aTxt.Len() ) 280 aTxt = FindFlyFrm()->GetFmt()->GetName(); 281 lcl_PaintReplacement( Frm(), aTxt, *pSh, this, sal_False ); 282 } 283 return; 284 } 285 286 if( pSh->GetAccessibilityOptions()->IsStopAnimatedGraphics() || 287 // --> FME 2004-06-21 #i9684# Stop animation during printing/pdf export 288 !pSh->GetWin() ) 289 // <-- 290 StopAnimation(); 291 292 SfxProgress::EnterLock(); //Keine Progress-Reschedules im Paint (SwapIn) 293 294 OutputDevice *pOut = pSh->GetOut(); 295 pOut->Push(); 296 sal_Bool bClip = sal_True; 297 PolyPolygon aPoly; 298 299 SwNoTxtNode& rNoTNd = *(SwNoTxtNode*)GetNode(); 300 SwGrfNode* pGrfNd = rNoTNd.GetGrfNode(); 301 if( pGrfNd ) 302 pGrfNd->SetFrameInPaint( sal_True ); 303 304 // OD 16.04.2003 #i13147# - add 2nd parameter with value <sal_True> to 305 // method call <FindFlyFrm().GetContour(..)> to indicate that it is called 306 // for paint in order to avoid load of the intrinsic graphic. 307 if ( ( !pOut->GetConnectMetaFile() || 308 !pSh->GetWin() ) && 309 FindFlyFrm()->GetContour( aPoly, sal_True ) 310 ) 311 { 312 pOut->SetClipRegion( aPoly ); 313 bClip = sal_False; 314 } 315 316 SwRect aOrigPaint( rRect ); 317 if ( HasAnimation() && pSh->GetWin() ) 318 { 319 aOrigPaint = Frm(); aOrigPaint += Prt().Pos(); 320 } 321 322 SwRect aGrfArea( Frm() ); 323 SwRect aPaintArea( aGrfArea ); 324 aPaintArea._Intersection( aOrigPaint ); 325 326 SwRect aNormal( Frm().Pos() + Prt().Pos(), Prt().SSize() ); 327 aNormal.Justify(); //Normalisiertes Rechteck fuer die Vergleiche 328 329 if( aPaintArea.IsOver( aNormal ) ) 330 { 331 // berechne die 4 zu loeschenden Rechtecke 332 if( pSh->GetWin() ) 333 ::lcl_ClearArea( *this, *pSh->GetOut(), aPaintArea, aNormal ); 334 335 // in der Schnittmenge vom PaintBereich und der Bitmap liegt 336 // der absolut sichtbare Bereich vom Frame 337 aPaintArea._Intersection( aNormal ); 338 339 if ( bClip ) 340 pOut->IntersectClipRegion( aPaintArea.SVRect() ); 341 /// OD 25.09.2002 #99739# - delete unused 3rd parameter 342 PaintPicture( pOut, aGrfArea ); 343 } 344 else 345 // wenn nicht sichtbar, loesche einfach den angegebenen Bereich 346 lcl_ClearArea( *this, *pSh->GetOut(), aPaintArea, SwRect() ); 347 if( pGrfNd ) 348 pGrfNd->SetFrameInPaint( sal_False ); 349 350 pOut->Pop(); 351 SfxProgress::LeaveLock(); 352 } 353 354 /************************************************************************* 355 |* 356 |* void lcl_CalcRect( Point & aPt, Size & aDim, 357 |* sal_uInt16 nMirror ) 358 |* 359 |* Beschreibung Errechne die Position und die Groesse der Grafik im 360 |* Frame, entsprechen der aktuellen Grafik-Attribute 361 |* 362 |* Parameter Point& die Position im Frame ( auch Return-Wert ) 363 |* Size& die Groesse der Grafik ( auch Return-Wert ) 364 |* MirrorGrf akt. Spiegelungs-Attribut 365 |* Ersterstellung JP 04.03.91 366 |* Letzte Aenderung JP 31.08.94 367 |* 368 *************************************************************************/ 369 370 371 void lcl_CalcRect( Point& rPt, Size& rDim, sal_uInt16 nMirror ) 372 { 373 if( nMirror == RES_MIRROR_GRAPH_VERT || nMirror == RES_MIRROR_GRAPH_BOTH ) 374 { 375 rPt.X() += rDim.Width() -1; 376 rDim.Width() = -rDim.Width(); 377 } 378 379 if( nMirror == RES_MIRROR_GRAPH_HOR || nMirror == RES_MIRROR_GRAPH_BOTH ) 380 { 381 rPt.Y() += rDim.Height() -1; 382 rDim.Height() = -rDim.Height(); 383 } 384 } 385 386 /************************************************************************* 387 |* 388 |* void SwNoTxtFrm::GetGrfArea() 389 |* 390 |* Beschreibung Errechne die Position und die Groesse der Bitmap 391 |* innerhalb des uebergebenem Rechtecks. 392 |* 393 |* Ersterstellung JP 03.09.91 394 |* Letzte Aenderung MA 11. Oct. 94 395 |* 396 *************************************************************************/ 397 398 void SwNoTxtFrm::GetGrfArea( SwRect &rRect, SwRect* pOrigRect, 399 sal_Bool ) const 400 { 401 // JP 23.01.2001: currently only used for scaling, cropping and mirroring 402 // the contour of graphics! 403 // all other is handled by the GraphicObject 404 405 //In rRect wird das sichbare Rechteck der Grafik gesteckt. 406 //In pOrigRect werden Pos+Size der Gesamtgrafik gesteck. 407 408 const SwAttrSet& rAttrSet = GetNode()->GetSwAttrSet(); 409 const SwCropGrf& rCrop = rAttrSet.GetCropGrf(); 410 sal_uInt16 nMirror = rAttrSet.GetMirrorGrf().GetValue(); 411 412 if( rAttrSet.GetMirrorGrf().IsGrfToggle() ) 413 { 414 if( !(FindPageFrm()->GetVirtPageNum() % 2) ) 415 { 416 switch ( nMirror ) 417 { 418 case RES_MIRROR_GRAPH_DONT: nMirror = RES_MIRROR_GRAPH_VERT; break; 419 case RES_MIRROR_GRAPH_VERT: nMirror = RES_MIRROR_GRAPH_DONT; break; 420 case RES_MIRROR_GRAPH_HOR: nMirror = RES_MIRROR_GRAPH_BOTH; break; 421 default: nMirror = RES_MIRROR_GRAPH_HOR; break; 422 } 423 } 424 } 425 426 //Grafik wird vom Node eingelesen falls notwendig. Kann aber schiefgehen. 427 long nLeftCrop, nRightCrop, nTopCrop, nBottomCrop; 428 Size aOrigSz( ((SwNoTxtNode*)GetNode())->GetTwipSize() ); 429 if ( !aOrigSz.Width() ) 430 { 431 aOrigSz.Width() = Prt().Width(); 432 nLeftCrop = -rCrop.GetLeft(); 433 nRightCrop = -rCrop.GetRight(); 434 } 435 else 436 { 437 nLeftCrop = Max( aOrigSz.Width() - 438 (rCrop.GetRight() + rCrop.GetLeft()), long(1) ); 439 const double nScale = double(Prt().Width()) / double(nLeftCrop); 440 nLeftCrop = long(nScale * -rCrop.GetLeft() ); 441 nRightCrop = long(nScale * -rCrop.GetRight() ); 442 } 443 444 // crop values have to be mirrored too 445 if( nMirror == RES_MIRROR_GRAPH_VERT || nMirror == RES_MIRROR_GRAPH_BOTH ) 446 { 447 long nTmpCrop = nLeftCrop; 448 nLeftCrop = nRightCrop; 449 nRightCrop= nTmpCrop; 450 } 451 452 if( !aOrigSz.Height() ) 453 { 454 aOrigSz.Height() = Prt().Height(); 455 nTopCrop = -rCrop.GetTop(); 456 nBottomCrop= -rCrop.GetBottom(); 457 } 458 else 459 { 460 nTopCrop = Max( aOrigSz.Height() - (rCrop.GetTop() + rCrop.GetBottom()), long(1) ); 461 const double nScale = double(Prt().Height()) / double(nTopCrop); 462 nTopCrop = long(nScale * -rCrop.GetTop() ); 463 nBottomCrop= long(nScale * -rCrop.GetBottom() ); 464 } 465 466 // crop values have to be mirrored too 467 if( nMirror == RES_MIRROR_GRAPH_HOR || nMirror == RES_MIRROR_GRAPH_BOTH ) 468 { 469 long nTmpCrop = nTopCrop; 470 nTopCrop = nBottomCrop; 471 nBottomCrop= nTmpCrop; 472 } 473 474 Size aVisSz( Prt().SSize() ); 475 Size aGrfSz( aVisSz ); 476 Point aVisPt( Frm().Pos() + Prt().Pos() ); 477 Point aGrfPt( aVisPt ); 478 479 //Erst das 'sichtbare' Rect einstellen. 480 if ( nLeftCrop > 0 ) 481 { 482 aVisPt.X() += nLeftCrop; 483 aVisSz.Width() -= nLeftCrop; 484 } 485 if ( nTopCrop > 0 ) 486 { 487 aVisPt.Y() += nTopCrop; 488 aVisSz.Height() -= nTopCrop; 489 } 490 if ( nRightCrop > 0 ) 491 aVisSz.Width() -= nRightCrop; 492 if ( nBottomCrop > 0 ) 493 aVisSz.Height() -= nBottomCrop; 494 495 rRect.Pos ( aVisPt ); 496 rRect.SSize( aVisSz ); 497 498 //Ggf. Die Gesamtgrafik berechnen 499 if ( pOrigRect ) 500 { 501 Size aTmpSz( aGrfSz ); 502 aGrfPt.X() += nLeftCrop; 503 aTmpSz.Width() -= nLeftCrop + nRightCrop; 504 aGrfPt.Y() += nTopCrop; 505 aTmpSz.Height()-= nTopCrop + nBottomCrop; 506 507 if( RES_MIRROR_GRAPH_DONT != nMirror ) 508 lcl_CalcRect( aGrfPt, aTmpSz, nMirror ); 509 510 pOrigRect->Pos ( aGrfPt ); 511 pOrigRect->SSize( aTmpSz ); 512 } 513 } 514 515 /************************************************************************* 516 |* 517 |* Size SwNoTxtFrm::GetSize() 518 |* 519 |* Beschreibung Gebe die Groesse des umgebenen FLys und 520 |* damit die der Grafik zurueck. 521 |* Ersterstellung JP 04.03.91 522 |* Letzte Aenderung JP 31.08.94 523 |* 524 *************************************************************************/ 525 526 527 const Size& SwNoTxtFrm::GetSize() const 528 { 529 // gebe die Groesse des Frames zurueck 530 const SwFrm *pFly = FindFlyFrm(); 531 if( !pFly ) 532 pFly = this; 533 return pFly->Prt().SSize(); 534 } 535 536 /************************************************************************* 537 |* 538 |* SwNoTxtFrm::MakeAll() 539 |* 540 |* Ersterstellung MA 29. Nov. 96 541 |* Letzte Aenderung MA 29. Nov. 96 542 |* 543 *************************************************************************/ 544 545 546 void SwNoTxtFrm::MakeAll() 547 { 548 SwCntntNotify aNotify( this ); 549 SwBorderAttrAccess aAccess( SwFrm::GetCache(), this ); 550 const SwBorderAttrs &rAttrs = *aAccess.Get(); 551 552 while ( !bValidPos || !bValidSize || !bValidPrtArea ) 553 { 554 MakePos(); 555 556 if ( !bValidSize ) 557 Frm().Width( GetUpper()->Prt().Width() ); 558 559 MakePrtArea( rAttrs ); 560 561 if ( !bValidSize ) 562 { bValidSize = sal_True; 563 Format(); 564 } 565 } 566 } 567 568 /************************************************************************* 569 |* 570 |* SwNoTxtFrm::Format() 571 |* 572 |* Beschreibung Errechne die Groesse der Bitmap, wenn noetig 573 |* Ersterstellung JP 11.03.91 574 |* Letzte Aenderung MA 13. Mar. 96 575 |* 576 *************************************************************************/ 577 578 579 void SwNoTxtFrm::Format( const SwBorderAttrs * ) 580 { 581 const Size aNewSize( GetSize() ); 582 583 // hat sich die Hoehe geaendert? 584 SwTwips nChgHght = IsVertical() ? 585 (SwTwips)(aNewSize.Width() - Prt().Width()) : 586 (SwTwips)(aNewSize.Height() - Prt().Height()); 587 if( nChgHght > 0) 588 Grow( nChgHght ); 589 else if( nChgHght < 0) 590 Shrink( Min(Prt().Height(), -nChgHght) ); 591 } 592 593 /************************************************************************* 594 |* 595 |* SwNoTxtFrm::GetCharRect() 596 |* 597 |* Beschreibung 598 |* Ersterstellung SS 29-Apr-1991 599 |* Letzte Aenderung MA 10. Oct. 94 600 |* 601 |*************************************************************************/ 602 603 604 sal_Bool SwNoTxtFrm::GetCharRect( SwRect &rRect, const SwPosition& rPos, 605 SwCrsrMoveState *pCMS ) const 606 { 607 if ( &rPos.nNode.GetNode() != (SwNode*)GetNode() ) 608 return sal_False; 609 610 Calc(); 611 SwRect aFrameRect( Frm() ); 612 rRect = aFrameRect; 613 rRect.Pos( Frm().Pos() + Prt().Pos() ); 614 rRect.SSize( Prt().SSize() ); 615 616 rRect.Justify(); 617 618 // liegt die Bitmap ueberhaupt im sichtbaren Berich ? 619 if( !aFrameRect.IsOver( rRect ) ) 620 { 621 // wenn nicht dann steht der Cursor auf dem Frame 622 rRect = aFrameRect; 623 rRect.Width( 1 ); 624 } 625 else 626 rRect._Intersection( aFrameRect ); 627 628 if ( pCMS ) 629 { 630 if ( pCMS->bRealHeight ) 631 { 632 pCMS->aRealHeight.Y() = rRect.Height(); 633 pCMS->aRealHeight.X() = 0; 634 } 635 } 636 637 return sal_True; 638 } 639 640 641 sal_Bool SwNoTxtFrm::GetCrsrOfst(SwPosition* pPos, Point& , 642 SwCrsrMoveState* ) const 643 { 644 SwCntntNode* pCNd = (SwCntntNode*)GetNode(); 645 pPos->nNode = *pCNd; 646 pPos->nContent.Assign( pCNd, 0 ); 647 return sal_True; 648 } 649 650 #define CLEARCACHE( pNd ) {\ 651 (pNd)->ReleaseGraphicFromCache();\ 652 SwFlyFrm* pFly = FindFlyFrm();\ 653 if( pFly && pFly->GetFmt()->GetSurround().IsContour() )\ 654 {\ 655 ClrContourCache( pFly->GetVirtDrawObj() );\ 656 pFly->NotifyBackground( FindPageFrm(), Prt(), PREP_FLY_ATTR_CHG );\ 657 }\ 658 } 659 660 void SwNoTxtFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) 661 { 662 sal_uInt16 nWhich = pNew ? pNew->Which() : pOld ? pOld->Which() : 0; 663 664 // --> OD 2007-03-06 #i73788# 665 // no <SwCntntFrm::Modify(..)> for RES_LINKED_GRAPHIC_STREAM_ARRIVED 666 if ( RES_GRAPHIC_PIECE_ARRIVED != nWhich && 667 RES_GRAPHIC_ARRIVED != nWhich && 668 RES_GRF_REREAD_AND_INCACHE != nWhich && 669 RES_LINKED_GRAPHIC_STREAM_ARRIVED != nWhich ) 670 // <-- 671 { 672 SwCntntFrm::Modify( pOld, pNew ); 673 } 674 675 sal_Bool bComplete = sal_True; 676 677 switch( nWhich ) 678 { 679 case RES_OBJECTDYING: 680 break; 681 682 case RES_GRF_REREAD_AND_INCACHE: 683 if( ND_GRFNODE == GetNode()->GetNodeType() ) 684 { 685 bComplete = sal_False; 686 SwGrfNode* pNd = (SwGrfNode*) GetNode(); 687 688 ViewShell *pVSh = 0; 689 pNd->GetDoc()->GetEditShell( &pVSh ); 690 if( pVSh ) 691 { 692 GraphicAttr aAttr; 693 if( pNd->GetGrfObj().IsCached( pVSh->GetOut(), Point(), 694 Prt().SSize(), &pNd->GetGraphicAttr( aAttr, this ) )) 695 { 696 ViewShell *pSh = pVSh; 697 do { 698 SET_CURR_SHELL( pSh ); 699 if( pSh->GetWin() ) 700 { 701 if( pSh->IsPreView() ) 702 ::RepaintPagePreview( pSh, Frm().SVRect() ); 703 else 704 pSh->GetWin()->Invalidate( Frm().SVRect() ); 705 } 706 } while( pVSh != (pSh = (ViewShell*)pSh->GetNext() )); 707 } 708 else 709 pNd->SwapIn(); 710 } 711 } 712 break; 713 714 case RES_UPDATE_ATTR: 715 case RES_FMT_CHG: 716 CLEARCACHE( (SwGrfNode*) GetNode() ) 717 break; 718 719 case RES_ATTRSET_CHG: 720 { 721 sal_uInt16 n; 722 for( n = RES_GRFATR_BEGIN; n < RES_GRFATR_END; ++n ) 723 if( SFX_ITEM_SET == ((SwAttrSetChg*)pOld)->GetChgSet()-> 724 GetItemState( n, sal_False )) 725 { 726 CLEARCACHE( (SwGrfNode*) GetNode() ) 727 break; 728 } 729 if( RES_GRFATR_END == n ) // not found 730 return ; 731 } 732 break; 733 734 case RES_GRAPHIC_PIECE_ARRIVED: 735 case RES_GRAPHIC_ARRIVED: 736 // --> OD 2007-03-06 #i73788# 737 // handle RES_LINKED_GRAPHIC_STREAM_ARRIVED as RES_GRAPHIC_ARRIVED 738 case RES_LINKED_GRAPHIC_STREAM_ARRIVED: 739 // <-- 740 if ( GetNode()->GetNodeType() == ND_GRFNODE ) 741 { 742 bComplete = sal_False; 743 SwGrfNode* pNd = (SwGrfNode*) GetNode(); 744 745 CLEARCACHE( pNd ) 746 747 SwRect aRect( Frm() ); 748 749 ViewShell *pVSh = 0; 750 pNd->GetDoc()->GetEditShell( &pVSh ); 751 if( !pVSh ) 752 break; 753 754 ViewShell *pSh = pVSh; 755 do { 756 SET_CURR_SHELL( pSh ); 757 if( pSh->IsPreView() ) 758 { 759 if( pSh->GetWin() ) 760 ::RepaintPagePreview( pSh, aRect ); 761 } 762 else if ( pSh->VisArea().IsOver( aRect ) && 763 OUTDEV_WINDOW == pSh->GetOut()->GetOutDevType() ) 764 { 765 // OD 27.11.2002 #105519# - invalidate instead of painting 766 pSh->GetWin()->Invalidate( aRect.SVRect() ); 767 } 768 769 pSh = (ViewShell *)pSh->GetNext(); 770 } while( pSh != pVSh ); 771 } 772 break; 773 774 default: 775 if ( !pNew || !isGRFATR(nWhich) ) 776 return; 777 } 778 779 if( bComplete ) 780 { 781 InvalidatePrt(); 782 SetCompletePaint(); 783 } 784 } 785 786 void lcl_correctlyAlignRect( SwRect& rAlignedGrfArea, const SwRect& rInArea, OutputDevice* pOut ) 787 { 788 789 if(!pOut) 790 return; 791 Rectangle aPxRect = pOut->LogicToPixel( rInArea.SVRect() ); 792 Rectangle aNewPxRect( aPxRect ); 793 while( aNewPxRect.Left() < aPxRect.Left() ) 794 { 795 rAlignedGrfArea.Left( rAlignedGrfArea.Left()+1 ); 796 aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() ); 797 } 798 while( aNewPxRect.Top() < aPxRect.Top() ) 799 { 800 rAlignedGrfArea.Top( rAlignedGrfArea.Top()+1 ); 801 aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() ); 802 } 803 while( aNewPxRect.Bottom() > aPxRect.Bottom() ) 804 { 805 rAlignedGrfArea.Bottom( rAlignedGrfArea.Bottom()-1 ); 806 aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() ); 807 } 808 while( aNewPxRect.Right() > aPxRect.Right() ) 809 { 810 rAlignedGrfArea.Right( rAlignedGrfArea.Right()-1 ); 811 aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() ); 812 } 813 } 814 815 bool paintUsingPrimitivesHelper( 816 OutputDevice& rOutputDevice, 817 const drawinglayer::primitive2d::Primitive2DSequence& rSequence, 818 const basegfx::B2DRange& rSourceRange, 819 const basegfx::B2DRange& rTargetRange, 820 const sal_Int32 nLeftCrop = 0, 821 const sal_Int32 nTopCrop = 0, 822 const sal_Int32 nRightCrop = 0, 823 const sal_Int32 nBottomCrop = 0, 824 const bool bMirrorX = false, 825 const bool bMirrorY = false) 826 { 827 const double fSourceWidth(rSourceRange.getWidth()); 828 const double fSourceHeight(rSourceRange.getHeight()); 829 830 if(rSequence.hasElements() && !basegfx::fTools::equalZero(fSourceWidth) && !basegfx::fTools::equalZero(fSourceHeight)) 831 { 832 // copy target range and apply evtl. cropping 833 basegfx::B2DRange aTargetRange(rTargetRange); 834 835 if(nLeftCrop || nTopCrop || nRightCrop || nBottomCrop) 836 { 837 // calculate original TargetRange 838 const double fFactor100thmmToTwips(72.0 / 127.0); 839 840 aTargetRange = basegfx::B2DRange( 841 aTargetRange.getMinX() - (nLeftCrop * fFactor100thmmToTwips), 842 aTargetRange.getMinY() - (nTopCrop * fFactor100thmmToTwips), 843 aTargetRange.getMaxX() + (nRightCrop * fFactor100thmmToTwips), 844 aTargetRange.getMaxY() + (nBottomCrop * fFactor100thmmToTwips)); 845 } 846 847 const double fTargetWidth(aTargetRange.getWidth()); 848 const double fTargetHeight(aTargetRange.getHeight()); 849 850 if(!basegfx::fTools::equalZero(fTargetWidth) && !basegfx::fTools::equalZero(fTargetHeight)) 851 { 852 // map graphic range to target range. This will automatically include 853 // tme mapping from Svg 1/100th mm content to twips since the target 854 // range is twips already 855 basegfx::B2DHomMatrix aMappingTransform( 856 basegfx::tools::createTranslateB2DHomMatrix( 857 -rSourceRange.getMinX(), 858 -rSourceRange.getMinY())); 859 860 aMappingTransform.scale(fTargetWidth / fSourceWidth, fTargetHeight / fSourceHeight); 861 aMappingTransform.translate(aTargetRange.getMinX(), aTargetRange.getMinY()); 862 863 // apply mirrorings 864 if(bMirrorX || bMirrorY) 865 { 866 aMappingTransform.translate(-aTargetRange.getCenterX(), -aTargetRange.getCenterY()); 867 aMappingTransform.scale(bMirrorX ? -1.0 : 1.0, bMirrorY ? -1.0 : 1.0); // #119176# small typo with X/Y 868 aMappingTransform.translate(aTargetRange.getCenterX(), aTargetRange.getCenterY()); 869 } 870 871 // Fill ViewInformation. Use MappingTransform here, so there is no need to 872 // embed the primitives to it. Use original TargetRange here so there is also 873 // no need to embed the primitives to a MaskPrimitive for cropping. This works 874 // only in this case where the graphic object cannot be rotated, though. 875 const drawinglayer::geometry::ViewInformation2D aViewInformation2D( 876 aMappingTransform, 877 rOutputDevice.GetViewTransformation(), 878 aTargetRange, 879 0, 880 0.0, 881 uno::Sequence< beans::PropertyValue >()); 882 883 // get a primitive processor for rendering 884 drawinglayer::processor2d::BaseProcessor2D* pProcessor2D = drawinglayer::processor2d::createProcessor2DFromOutputDevice( 885 rOutputDevice, 886 aViewInformation2D); 887 888 if(pProcessor2D) 889 { 890 // render and cleanup 891 pProcessor2D->process(rSequence); 892 delete pProcessor2D; 893 return true; 894 } 895 } 896 } 897 898 return false; 899 } 900 901 // Ausgabe der Grafik. Hier wird entweder eine QuickDraw-Bmp oder 902 // eine Grafik vorausgesetzt. Ist nichts davon vorhanden, wird 903 // eine Ersatzdarstellung ausgegeben. 904 /// OD 25.09.2002 #99739# - delete unused 3rd parameter. 905 /// OD 25.09.2002 #99739# - use aligned rectangle for drawing graphic. 906 /// OD 25.09.2002 #99739# - pixel-align coordinations for drawing graphic. 907 void SwNoTxtFrm::PaintPicture( OutputDevice* pOut, const SwRect &rGrfArea ) const 908 { 909 ViewShell* pShell = getRootFrm()->GetCurrShell(); 910 911 SwNoTxtNode& rNoTNd = *(SwNoTxtNode*)GetNode(); 912 SwGrfNode* pGrfNd = rNoTNd.GetGrfNode(); 913 SwOLENode* pOLENd = rNoTNd.GetOLENode(); 914 915 const sal_Bool bPrn = pOut == rNoTNd.getIDocumentDeviceAccess()->getPrinter( false ) || 916 pOut->GetConnectMetaFile(); 917 918 const bool bIsChart = pOLENd && ChartHelper::IsChart( pOLENd->GetOLEObj().GetObject() ); 919 920 /// OD 25.09.2002 #99739# - calculate aligned rectangle from parameter <rGrfArea>. 921 /// Use aligned rectangle <aAlignedGrfArea> instead of <rGrfArea> in 922 /// the following code. 923 SwRect aAlignedGrfArea = rGrfArea; 924 ::SwAlignRect( aAlignedGrfArea, pShell ); 925 926 if( !bIsChart ) 927 { 928 /// OD 25.09.2002 #99739# 929 /// Because for drawing a graphic left-top-corner and size coordinations are 930 /// used, these coordinations have to be determined on pixel level. 931 ::SwAlignGrfRect( &aAlignedGrfArea, *pOut ); 932 } 933 else //if( bIsChart ) 934 { 935 //#i78025# charts own borders are not completely visible 936 //the above pixel correction is not correct - at least not for charts 937 //so a different pixel correction is choosen here 938 //this might be a good idea for all other OLE objects also, 939 //but as I cannot oversee the consequences I fix it only for charts for now 940 lcl_correctlyAlignRect( aAlignedGrfArea, rGrfArea, pOut ); 941 } 942 943 if( pGrfNd ) 944 { 945 sal_Bool bForceSwap = sal_False, bContinue = sal_True; 946 const GraphicObject& rGrfObj = pGrfNd->GetGrfObj(); 947 948 GraphicAttr aGrfAttr; 949 pGrfNd->GetGraphicAttr( aGrfAttr, this ); 950 951 if( !bPrn ) 952 { 953 // --> OD 2007-01-02 #i73788# 954 if ( pGrfNd->IsLinkedInputStreamReady() ) 955 { 956 pGrfNd->UpdateLinkWithInputStream(); 957 } 958 // <-- 959 // --> OD 2008-01-30 #i85717# 960 // --> OD 2008-07-21 #i90395# - check, if asynchronous retrieval 961 // if input stream for the graphic is possible 962 // else if( GRAPHIC_DEFAULT == rGrfObj.GetType() && 963 else if ( ( rGrfObj.GetType() == GRAPHIC_DEFAULT || 964 rGrfObj.GetType() == GRAPHIC_NONE ) && 965 pGrfNd->IsLinkedFile() && 966 pGrfNd->IsAsyncRetrieveInputStreamPossible() ) 967 // <-- 968 { 969 Size aTmpSz; 970 ::sfx2::SvLinkSource* pGrfObj = pGrfNd->GetLink()->GetObj(); 971 if( !pGrfObj || 972 !pGrfObj->IsDataComplete() || 973 !(aTmpSz = pGrfNd->GetTwipSize()).Width() || 974 !aTmpSz.Height() || !pGrfNd->GetAutoFmtLvl() ) 975 { 976 // --> OD 2006-12-22 #i73788# 977 pGrfNd->TriggerAsyncRetrieveInputStream(); 978 // <-- 979 } 980 String aTxt( pGrfNd->GetTitle() ); 981 if ( !aTxt.Len() ) 982 GetRealURL( *pGrfNd, aTxt ); 983 ::lcl_PaintReplacement( aAlignedGrfArea, aTxt, *pShell, this, sal_False ); 984 bContinue = sal_False; 985 } 986 else if( rGrfObj.IsCached( pOut, aAlignedGrfArea.Pos(), 987 aAlignedGrfArea.SSize(), &aGrfAttr )) 988 { 989 pGrfNd->DrawGraphicWithPDFHandling(*pOut, 990 aAlignedGrfArea.Pos(), aAlignedGrfArea.SSize(), 991 &aGrfAttr ); 992 bContinue = sal_False; 993 } 994 } 995 996 if( bContinue ) 997 { 998 const sal_Bool bSwapped = rGrfObj.IsSwappedOut(); 999 const sal_Bool bSwappedIn = 0 != pGrfNd->SwapIn( bPrn ); 1000 if( bSwappedIn && rGrfObj.GetGraphic().IsSupportedGraphic()) 1001 { 1002 const sal_Bool bAnimate = rGrfObj.IsAnimated() && 1003 !pShell->IsPreView() && 1004 !pShell->GetAccessibilityOptions()->IsStopAnimatedGraphics() && 1005 // --> FME 2004-06-21 #i9684# Stop animation during printing/pdf export 1006 pShell->GetWin(); 1007 // <-- 1008 1009 if( bAnimate && 1010 FindFlyFrm() != ::GetFlyFromMarked( 0, pShell )) 1011 { 1012 OutputDevice* pVout; 1013 if( pOut == pShell->GetOut() && SwRootFrm::FlushVout() ) 1014 pVout = pOut, pOut = pShell->GetOut(); 1015 else if( pShell->GetWin() && 1016 OUTDEV_VIRDEV == pOut->GetOutDevType() ) 1017 pVout = pOut, pOut = pShell->GetWin(); 1018 else 1019 pVout = 0; 1020 1021 ASSERT( OUTDEV_VIRDEV != pOut->GetOutDevType() || 1022 pShell->GetViewOptions()->IsPDFExport(), 1023 "pOut sollte kein virtuelles Device sein" ); 1024 1025 pGrfNd->StartGraphicAnimation(pOut, aAlignedGrfArea.Pos(), 1026 aAlignedGrfArea.SSize(), long(this), 1027 0, GRFMGR_DRAW_STANDARD, pVout ); 1028 } 1029 else 1030 { 1031 const SvgDataPtr& rSvgDataPtr = rGrfObj.GetGraphic().getSvgData(); 1032 bool bDone(false); 1033 1034 if(rSvgDataPtr.get()) 1035 { 1036 // Graphic is Svg and can be painted as primitives (vector graphic) 1037 const basegfx::B2DRange aTargetRange( 1038 aAlignedGrfArea.Left(), aAlignedGrfArea.Top(), 1039 aAlignedGrfArea.Right(), aAlignedGrfArea.Bottom()); 1040 const bool bCropped(aGrfAttr.IsCropped()); 1041 drawinglayer::primitive2d::Primitive2DSequence aContent; 1042 GraphicAttr aSuppressGraphicAttr(aGrfAttr); 1043 1044 aSuppressGraphicAttr.SetCrop(0, 0, 0, 0); 1045 aSuppressGraphicAttr.SetRotation(0); 1046 aSuppressGraphicAttr.SetMirrorFlags(0); 1047 1048 const bool bNeedTransformedGraphic( 1049 aSuppressGraphicAttr.IsSpecialDrawMode() || 1050 aSuppressGraphicAttr.IsAdjusted() || 1051 aSuppressGraphicAttr.IsMirrored() || 1052 aSuppressGraphicAttr.IsRotated() || 1053 aSuppressGraphicAttr.IsTransparent()); 1054 1055 if(bNeedTransformedGraphic) 1056 { 1057 // #122039# need to apply graphic transformation if GraphicAttr are used qwhich need this 1058 const Graphic aTransformedGraphic(rGrfObj.GetTransformedGraphic(&aSuppressGraphicAttr)); 1059 const basegfx::B2DRange aRange(rSvgDataPtr->getRange()); 1060 const basegfx::B2DHomMatrix aTransform( 1061 basegfx::tools::createScaleTranslateB2DHomMatrix( 1062 aRange.getRange(), 1063 aRange.getMinimum())); 1064 1065 aContent.realloc(1); 1066 aContent[0] = new drawinglayer::primitive2d::BitmapPrimitive2D( 1067 aTransformedGraphic.GetBitmapEx(), 1068 aTransform); 1069 } 1070 else 1071 { 1072 aContent = rSvgDataPtr->getPrimitive2DSequence(); 1073 } 1074 1075 bDone = paintUsingPrimitivesHelper( 1076 *pOut, 1077 aContent, 1078 rSvgDataPtr->getRange(), 1079 aTargetRange, 1080 bCropped ? aGrfAttr.GetLeftCrop() : 0, 1081 bCropped ? aGrfAttr.GetTopCrop() : 0, 1082 bCropped ? aGrfAttr.GetRightCrop() : 0, 1083 bCropped ? aGrfAttr.GetBottomCrop() : 0, 1084 aGrfAttr.GetMirrorFlags() & BMP_MIRROR_HORZ, 1085 aGrfAttr.GetMirrorFlags() & BMP_MIRROR_VERT); 1086 } 1087 1088 if(!bDone) 1089 { 1090 // fallback paint, uses replacement image 1091 pGrfNd->DrawGraphicWithPDFHandling(*pOut, aAlignedGrfArea.Pos(), aAlignedGrfArea.SSize(), &aGrfAttr); 1092 } 1093 } 1094 } 1095 else 1096 { 1097 sal_uInt16 nResId = 0; 1098 if( bSwappedIn ) 1099 { 1100 if( GRAPHIC_NONE == rGrfObj.GetType() ) 1101 nResId = STR_COMCORE_READERROR; 1102 else if ( !rGrfObj.GetGraphic().IsSupportedGraphic() ) 1103 nResId = STR_COMCORE_CANT_SHOW; 1104 } 1105 ((SwNoTxtFrm*)this)->nWeight = -1; 1106 String aText; 1107 if ( !nResId && 1108 !(aText = pGrfNd->GetTitle()).Len() && 1109 (!GetRealURL( *pGrfNd, aText ) || !aText.Len())) 1110 { 1111 nResId = STR_COMCORE_READERROR; 1112 } 1113 if ( nResId ) 1114 aText = SW_RESSTR( nResId ); 1115 1116 ::lcl_PaintReplacement( aAlignedGrfArea, aText, *pShell, this, sal_True ); 1117 } 1118 1119 //Beim Drucken duerfen wir nicht die Grafiken sammeln... 1120 if( bSwapped && bPrn ) 1121 bForceSwap = sal_True; 1122 } 1123 if( bForceSwap ) 1124 pGrfNd->SwapOut(); 1125 } 1126 else // bIsChart || pOLENd 1127 { 1128 // --> OD 2009-03-05 #i99665# 1129 // Adjust AntiAliasing mode at output device for chart OLE 1130 const sal_uInt16 nFormerAntialiasingAtOutput( pOut->GetAntialiasing() ); 1131 if ( pOLENd->IsChart() && 1132 pShell->Imp()->GetDrawView()->IsAntiAliasing() ) 1133 { 1134 const sal_uInt16 nAntialiasingForChartOLE = 1135 nFormerAntialiasingAtOutput | ANTIALIASING_PIXELSNAPHAIRLINE; 1136 pOut->SetAntialiasing( nAntialiasingForChartOLE ); 1137 } 1138 // <-- 1139 1140 bool bDone(false); 1141 1142 if(bIsChart) 1143 { 1144 const uno::Reference< frame::XModel > aXModel(pOLENd->GetOLEObj().GetOleRef()->getComponent(), uno::UNO_QUERY); 1145 1146 if(aXModel.is()) 1147 { 1148 basegfx::B2DRange aSourceRange; 1149 1150 const drawinglayer::primitive2d::Primitive2DSequence aSequence( 1151 ChartHelper::tryToGetChartContentAsPrimitive2DSequence( 1152 aXModel, 1153 aSourceRange)); 1154 1155 if(aSequence.hasElements() && !aSourceRange.isEmpty()) 1156 { 1157 const basegfx::B2DRange aTargetRange( 1158 aAlignedGrfArea.Left(), aAlignedGrfArea.Top(), 1159 aAlignedGrfArea.Right(), aAlignedGrfArea.Bottom()); 1160 1161 bDone = paintUsingPrimitivesHelper( 1162 *pOut, 1163 aSequence, 1164 aSourceRange, 1165 aTargetRange); 1166 } 1167 } 1168 } 1169 1170 if(!bDone && pOLENd) 1171 { 1172 Point aPosition(aAlignedGrfArea.Pos()); 1173 Size aSize(aAlignedGrfArea.SSize()); 1174 1175 // Im BrowseModus gibt es nicht unbedingt einen Drucker und 1176 // damit kein JobSetup, also legen wir eines an ... 1177 const JobSetup* pJobSetup = pOLENd->getIDocumentDeviceAccess()->getJobsetup(); 1178 sal_Bool bDummyJobSetup = 0 == pJobSetup; 1179 if( bDummyJobSetup ) 1180 pJobSetup = new JobSetup(); 1181 1182 // #i42323# 1183 // The reason for #114233# is gone, so i remove it again 1184 //TODO/LATER: is it a problem that the JopSetup isn't used? 1185 //xRef->DoDraw( pOut, aAlignedGrfArea.Pos(), aAlignedGrfArea.SSize(), *pJobSetup ); 1186 1187 // get hi-contrast image, but never for printing 1188 Graphic* pGraphic = NULL; 1189 if (pOut && !bPrn && Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) 1190 pGraphic = pOLENd->GetHCGraphic(); 1191 1192 // when it is not possible to get HC-representation, the original image should be used 1193 if ( !pGraphic ) 1194 pGraphic = pOLENd->GetGraphic(); 1195 1196 if ( pGraphic && pGraphic->GetType() != GRAPHIC_NONE ) 1197 { 1198 pGraphic->Draw( pOut, aPosition, aSize ); 1199 1200 // shade the representation if the object is activated outplace 1201 uno::Reference < embed::XEmbeddedObject > xObj = pOLENd->GetOLEObj().GetOleRef(); 1202 if ( xObj.is() && xObj->getCurrentState() == embed::EmbedStates::ACTIVE ) 1203 { 1204 ::svt::EmbeddedObjectRef::DrawShading( Rectangle( aPosition, aSize ), pOut ); 1205 } 1206 } 1207 else 1208 ::svt::EmbeddedObjectRef::DrawPaintReplacement( Rectangle( aPosition, aSize ), pOLENd->GetOLEObj().GetCurrentPersistName(), pOut ); 1209 1210 if( bDummyJobSetup ) 1211 delete pJobSetup; // ... und raeumen wieder auf. 1212 1213 sal_Int64 nMiscStatus = pOLENd->GetOLEObj().GetOleRef()->getStatus( pOLENd->GetAspect() ); 1214 if ( !bPrn && pShell->ISA( SwCrsrShell ) && 1215 nMiscStatus & embed::EmbedMisc::MS_EMBED_ACTIVATEWHENVISIBLE ) 1216 { 1217 const SwFlyFrm *pFly = FindFlyFrm(); 1218 ASSERT( pFly, "OLE not in FlyFrm" ); 1219 ((SwFEShell*)pShell)->ConnectObj( pOLENd->GetOLEObj().GetObject(), pFly->Prt(), pFly->Frm()); 1220 } 1221 } 1222 1223 // --> OD 2009-03-05 #i99665# 1224 if ( pOLENd->IsChart() && 1225 pShell->Imp()->GetDrawView()->IsAntiAliasing() ) 1226 { 1227 pOut->SetAntialiasing( nFormerAntialiasingAtOutput ); 1228 } 1229 // <-- 1230 } 1231 } 1232 1233 1234 sal_Bool SwNoTxtFrm::IsTransparent() const 1235 { 1236 const ViewShell* pSh = getRootFrm()->GetCurrShell(); 1237 if ( !pSh || !pSh->GetViewOptions()->IsGraphic() ) 1238 return sal_True; 1239 1240 const SwGrfNode *pNd; 1241 if( 0 != (pNd = GetNode()->GetGrfNode()) ) 1242 return pNd->IsTransparent(); 1243 1244 //#29381# OLE sind immer Transparent. 1245 return sal_True; 1246 } 1247 1248 1249 void SwNoTxtFrm::StopAnimation( OutputDevice* pOut ) const 1250 { 1251 //animierte Grafiken anhalten 1252 const SwGrfNode* pGrfNd = dynamic_cast< const SwGrfNode* >(GetNode()->GetGrfNode()); 1253 1254 if( pGrfNd && pGrfNd->IsAnimated() ) 1255 { 1256 const_cast< SwGrfNode* >(pGrfNd)->StopGraphicAnimation( pOut, long(this) ); 1257 } 1258 } 1259 1260 1261 sal_Bool SwNoTxtFrm::HasAnimation() const 1262 { 1263 const SwGrfNode* pGrfNd = GetNode()->GetGrfNode(); 1264 return pGrfNd && pGrfNd->IsAnimated(); 1265 } 1266 1267 1268 1269