LCOV - code coverage report
Current view: top level - vcl/source/outdev - outdevstate.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 283 336 84.2 %
Date: 2015-06-13 12:38:46 Functions: 22 23 95.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <vcl/outdevstate.hxx>
      21             : 
      22             : #include <vcl/outdev.hxx>
      23             : #include <vcl/virdev.hxx>
      24             : 
      25             : #include <vcl/settings.hxx>
      26             : 
      27             : #include <vcl/mapmod.hxx>
      28             : #include <vcl/region.hxx>
      29             : #include <vcl/font.hxx>
      30             : #include <vcl/vclenum.hxx>
      31             : 
      32             : #include <tools/gen.hxx>
      33             : #include <tools/color.hxx>
      34             : #include <tools/fontenum.hxx>
      35             : 
      36             : #include "outdev.h"
      37             : #include "outdata.hxx"
      38             : #include <outdevstatestack.hxx>
      39             : #include "salgdi.hxx"
      40             : #include "sallayout.hxx"
      41             : 
      42     1174849 : OutDevState::OutDevState()
      43             :     : mpMapMode(0)
      44             :     , mbMapActive(false)
      45             :     , mpClipRegion(0)
      46             :     , mpLineColor(0)
      47             :     , mpFillColor(0)
      48             :     , mpFont(0)
      49             :     , mpTextColor(0)
      50             :     , mpTextFillColor(0)
      51             :     , mpTextLineColor(0)
      52             :     , mpOverlineColor(0)
      53             :     , mpRefPoint(0)
      54             :     , meTextAlign(ALIGN_TOP)
      55             :     , meRasterOp(ROP_OVERPAINT)
      56             :     , mnTextLayoutMode(TEXT_LAYOUT_DEFAULT)
      57             :     , meTextLanguage(0)
      58     1174849 :     , mnFlags(PushFlags::NONE)
      59             : {
      60     1174849 : }
      61             : 
      62     1174422 : OutDevState::~OutDevState()
      63             : {
      64     1174422 :     delete mpLineColor;
      65     1174422 :     delete mpFillColor;
      66     1174422 :     delete mpFont;
      67     1174422 :     delete mpTextColor;
      68     1174422 :     delete mpTextFillColor;
      69     1174422 :     delete mpTextLineColor;
      70     1174422 :     delete mpOverlineColor;
      71     1174422 :     delete mpMapMode;
      72     1174422 :     delete mpClipRegion;
      73     1174422 :     delete mpRefPoint;
      74     1174422 : }
      75             : 
      76      907009 : void OutputDevice::Push( PushFlags nFlags )
      77             : {
      78             : 
      79      907009 :     if ( mpMetaFile )
      80       61902 :         mpMetaFile->AddAction( new MetaPushAction( nFlags ) );
      81             : 
      82      907009 :     OutDevState* pState = new OutDevState;
      83             : 
      84      907009 :     pState->mnFlags = nFlags;
      85             : 
      86      907009 :     if (nFlags & PushFlags::LINECOLOR && mbLineColor)
      87             :     {
      88      146332 :         pState->mpLineColor = new Color( maLineColor );
      89             :     }
      90      907009 :     if (nFlags & PushFlags::FILLCOLOR && mbFillColor)
      91             :     {
      92      191364 :         pState->mpFillColor = new Color( maFillColor );
      93             :     }
      94      907009 :     if ( nFlags & PushFlags::FONT )
      95      176675 :         pState->mpFont = new vcl::Font( maFont );
      96      907009 :     if ( nFlags & PushFlags::TEXTCOLOR )
      97      165739 :         pState->mpTextColor = new Color( GetTextColor() );
      98      907009 :     if (nFlags & PushFlags::TEXTFILLCOLOR && IsTextFillColor())
      99             :     {
     100        1048 :         pState->mpTextFillColor = new Color( GetTextFillColor() );
     101             :     }
     102      907009 :     if (nFlags & PushFlags::TEXTLINECOLOR && IsTextLineColor())
     103             :     {
     104         852 :         pState->mpTextLineColor = new Color( GetTextLineColor() );
     105             :     }
     106      907009 :     if (nFlags & PushFlags::OVERLINECOLOR && IsOverlineColor())
     107             :     {
     108         848 :         pState->mpOverlineColor = new Color( GetOverlineColor() );
     109             :     }
     110      907009 :     if ( nFlags & PushFlags::TEXTALIGN )
     111       76998 :         pState->meTextAlign = GetTextAlign();
     112      907009 :     if( nFlags & PushFlags::TEXTLAYOUTMODE )
     113      367780 :         pState->mnTextLayoutMode = GetLayoutMode();
     114      907009 :     if( nFlags & PushFlags::TEXTLANGUAGE )
     115      366431 :         pState->meTextLanguage = GetDigitLanguage();
     116      907009 :     if ( nFlags & PushFlags::RASTEROP )
     117       77006 :         pState->meRasterOp = GetRasterOp();
     118      907009 :     if ( nFlags & PushFlags::MAPMODE )
     119             :     {
     120      179885 :         pState->mpMapMode = new MapMode( maMapMode );
     121      179885 :         pState->mbMapActive = mbMap;
     122             :     }
     123      907009 :     if (nFlags & PushFlags::CLIPREGION && mbClipRegion)
     124             :     {
     125      166264 :         pState->mpClipRegion = new vcl::Region( maRegion );
     126             :     }
     127      907009 :     if (nFlags & PushFlags::REFPOINT && mbRefPoint)
     128             :     {
     129           0 :         pState->mpRefPoint = new Point( maRefPoint );
     130             :     }
     131             : 
     132      907009 :     mpOutDevStateStack->push_back( pState );
     133             : 
     134      907009 :     if( mpAlphaVDev )
     135       28614 :         mpAlphaVDev->Push();
     136      907009 : }
     137             : 
     138      907009 : void OutputDevice::Pop()
     139             : {
     140             : 
     141      907009 :     if( mpMetaFile )
     142       61902 :         mpMetaFile->AddAction( new MetaPopAction() );
     143             : 
     144      907009 :     GDIMetaFile* pOldMetaFile = mpMetaFile;
     145      907009 :     mpMetaFile = NULL;
     146             : 
     147      907009 :     if ( mpOutDevStateStack->empty() )
     148             :     {
     149             :         SAL_WARN( "vcl.gdi", "OutputDevice::Pop() without OutputDevice::Push()" );
     150      907009 :         return;
     151             :     }
     152      907009 :     const OutDevState& rState = mpOutDevStateStack->back();
     153             : 
     154      907009 :     if( mpAlphaVDev )
     155       28614 :         mpAlphaVDev->Pop();
     156             : 
     157      907009 :     if ( rState.mnFlags & PushFlags::LINECOLOR )
     158             :     {
     159      228289 :         if ( rState.mpLineColor )
     160      146332 :             SetLineColor( *rState.mpLineColor );
     161             :         else
     162       81957 :             SetLineColor();
     163             :     }
     164             : 
     165      907009 :     if ( rState.mnFlags & PushFlags::FILLCOLOR )
     166             :     {
     167      204276 :         if ( rState.mpFillColor )
     168      191364 :             SetFillColor( *rState.mpFillColor );
     169             :         else
     170       12912 :             SetFillColor();
     171             :     }
     172             : 
     173      907009 :     if ( rState.mnFlags & PushFlags::FONT )
     174      176675 :         SetFont( *rState.mpFont );
     175             : 
     176      907009 :     if ( rState.mnFlags & PushFlags::TEXTCOLOR )
     177      165739 :         SetTextColor( *rState.mpTextColor );
     178             : 
     179      907009 :     if ( rState.mnFlags & PushFlags::TEXTFILLCOLOR )
     180             :     {
     181       76998 :         if ( rState.mpTextFillColor )
     182        1048 :             SetTextFillColor( *rState.mpTextFillColor );
     183             :         else
     184       75950 :             SetTextFillColor();
     185             :     }
     186             : 
     187      907009 :     if ( rState.mnFlags & PushFlags::TEXTLINECOLOR )
     188             :     {
     189       76998 :         if ( rState.mpTextLineColor )
     190         852 :             SetTextLineColor( *rState.mpTextLineColor );
     191             :         else
     192       76146 :             SetTextLineColor();
     193             :     }
     194             : 
     195      907009 :     if ( rState.mnFlags & PushFlags::OVERLINECOLOR )
     196             :     {
     197       76998 :         if ( rState.mpOverlineColor )
     198         848 :             SetOverlineColor( *rState.mpOverlineColor );
     199             :         else
     200       76150 :             SetOverlineColor();
     201             :     }
     202             : 
     203      907009 :     if ( rState.mnFlags & PushFlags::TEXTALIGN )
     204       76998 :         SetTextAlign( rState.meTextAlign );
     205             : 
     206      907009 :     if( rState.mnFlags & PushFlags::TEXTLAYOUTMODE )
     207      367780 :         SetLayoutMode( rState.mnTextLayoutMode );
     208             : 
     209      907009 :     if( rState.mnFlags & PushFlags::TEXTLANGUAGE )
     210      366431 :         SetDigitLanguage( rState.meTextLanguage );
     211             : 
     212      907009 :     if ( rState.mnFlags & PushFlags::RASTEROP )
     213       77006 :         SetRasterOp( rState.meRasterOp );
     214             : 
     215      907009 :     if ( rState.mnFlags & PushFlags::MAPMODE )
     216             :     {
     217      179885 :         if ( rState.mpMapMode )
     218      179885 :             SetMapMode( *rState.mpMapMode );
     219             :         else
     220           0 :             SetMapMode();
     221      179885 :         mbMap = rState.mbMapActive;
     222             :     }
     223             : 
     224      907009 :     if ( rState.mnFlags & PushFlags::CLIPREGION )
     225      375390 :         SetDeviceClipRegion( rState.mpClipRegion );
     226             : 
     227      907009 :     if ( rState.mnFlags & PushFlags::REFPOINT )
     228             :     {
     229       76998 :         if ( rState.mpRefPoint )
     230           0 :             SetRefPoint( *rState.mpRefPoint );
     231             :         else
     232       76998 :             SetRefPoint();
     233             :     }
     234             : 
     235      907009 :     mpOutDevStateStack->pop_back();
     236             : 
     237      907009 :     mpMetaFile = pOldMetaFile;
     238             : }
     239             : 
     240           0 : sal_uInt32 OutputDevice::GetGCStackDepth() const
     241             : {
     242           0 :     return mpOutDevStateStack->size();
     243             : }
     244             : 
     245       47992 : void OutputDevice::EnableOutput( bool bEnable )
     246             : {
     247       47992 :     mbOutput = bEnable;
     248             : 
     249       47992 :     if( mpAlphaVDev )
     250           0 :         mpAlphaVDev->EnableOutput( bEnable );
     251       47992 : }
     252             : 
     253      167063 : void OutputDevice::SetAntialiasing( AntialiasingFlags nMode )
     254             : {
     255      167063 :     if ( mnAntialiasing != nMode )
     256             :     {
     257       18524 :         mnAntialiasing = nMode;
     258       18524 :         mbInitFont = true;
     259             : 
     260       18524 :         if(mpGraphics)
     261             :         {
     262       12959 :             mpGraphics->setAntiAliasB2DDraw(bool(mnAntialiasing & AntialiasingFlags::EnableB2dDraw));
     263             :         }
     264             :     }
     265             : 
     266      167063 :     if( mpAlphaVDev )
     267           0 :         mpAlphaVDev->SetAntialiasing( nMode );
     268      167063 : }
     269             : 
     270      114263 : void OutputDevice::SetDrawMode( DrawModeFlags nDrawMode )
     271             : {
     272             : 
     273      114263 :     mnDrawMode = nDrawMode;
     274             : 
     275      114263 :     if( mpAlphaVDev )
     276           0 :         mpAlphaVDev->SetDrawMode( nDrawMode );
     277      114263 : }
     278             : 
     279     1334450 : void OutputDevice::SetLayoutMode( ComplexTextLayoutMode nTextLayoutMode )
     280             : {
     281     1334450 :     if( mpMetaFile )
     282       23258 :         mpMetaFile->AddAction( new MetaLayoutModeAction( nTextLayoutMode ) );
     283             : 
     284     1334450 :     mnTextLayoutMode = nTextLayoutMode;
     285             : 
     286     1334450 :     if( mpAlphaVDev )
     287       52158 :         mpAlphaVDev->SetLayoutMode( nTextLayoutMode );
     288     1334450 : }
     289             : 
     290     1768739 : void OutputDevice::SetDigitLanguage( LanguageType eTextLanguage )
     291             : {
     292     1768739 :     if( mpMetaFile )
     293       28755 :         mpMetaFile->AddAction( new MetaTextLanguageAction( eTextLanguage ) );
     294             : 
     295     1768739 :     meTextLanguage = eTextLanguage;
     296             : 
     297     1768739 :     if( mpAlphaVDev )
     298       51236 :         mpAlphaVDev->SetDigitLanguage( eTextLanguage );
     299     1768739 : }
     300             : 
     301      135551 : void OutputDevice::SetRasterOp( RasterOp eRasterOp )
     302             : {
     303             : 
     304      135551 :     if ( mpMetaFile )
     305       14601 :         mpMetaFile->AddAction( new MetaRasterOpAction( eRasterOp ) );
     306             : 
     307      135551 :     if ( meRasterOp != eRasterOp )
     308             :     {
     309        7256 :         meRasterOp = eRasterOp;
     310        7256 :         mbInitLineColor = mbInitFillColor = true;
     311             : 
     312        7256 :         if( mpGraphics || AcquireGraphics() )
     313        7256 :             mpGraphics->SetXORMode( (ROP_INVERT == meRasterOp) || (ROP_XOR == meRasterOp), ROP_INVERT == meRasterOp );
     314             :     }
     315             : 
     316      135551 :     if( mpAlphaVDev )
     317       25670 :         mpAlphaVDev->SetRasterOp( eRasterOp );
     318      135551 : }
     319             : 
     320             : 
     321      371538 : void OutputDevice::SetFillColor()
     322             : {
     323             : 
     324      371538 :     if ( mpMetaFile )
     325        7194 :         mpMetaFile->AddAction( new MetaFillColorAction( Color(), false ) );
     326             : 
     327      371538 :     if ( mbFillColor )
     328             :     {
     329       61898 :         mbInitFillColor = true;
     330       61898 :         mbFillColor = false;
     331       61898 :         maFillColor = Color( COL_TRANSPARENT );
     332             :     }
     333             : 
     334      371538 :     if( mpAlphaVDev )
     335        3238 :         mpAlphaVDev->SetFillColor();
     336      371538 : }
     337             : 
     338     1871380 : void OutputDevice::SetFillColor( const Color& rColor )
     339             : {
     340             : 
     341     1871380 :     Color aColor( rColor );
     342             : 
     343     1871380 :     if( mnDrawMode & ( DrawModeFlags::BlackFill | DrawModeFlags::WhiteFill |
     344             :                        DrawModeFlags::GrayFill | DrawModeFlags::NoFill |
     345     1871380 :                        DrawModeFlags::GhostedFill | DrawModeFlags::SettingsFill ) )
     346             :     {
     347          79 :         if( !ImplIsColorTransparent( aColor ) )
     348             :         {
     349          70 :             if( mnDrawMode & DrawModeFlags::BlackFill )
     350             :             {
     351           0 :                 aColor = Color( COL_BLACK );
     352             :             }
     353          70 :             else if( mnDrawMode & DrawModeFlags::WhiteFill )
     354             :             {
     355          70 :                 aColor = Color( COL_WHITE );
     356             :             }
     357           0 :             else if( mnDrawMode & DrawModeFlags::GrayFill )
     358             :             {
     359           0 :                 const sal_uInt8 cLum = aColor.GetLuminance();
     360           0 :                 aColor = Color( cLum, cLum, cLum );
     361             :             }
     362           0 :             else if( mnDrawMode & DrawModeFlags::NoFill )
     363             :             {
     364           0 :                 aColor = Color( COL_TRANSPARENT );
     365             :             }
     366           0 :             else if( mnDrawMode & DrawModeFlags::SettingsFill )
     367             :             {
     368           0 :                 aColor = GetSettings().GetStyleSettings().GetWindowColor();
     369             :             }
     370             : 
     371          70 :             if( mnDrawMode & DrawModeFlags::GhostedFill )
     372             :             {
     373           0 :                 aColor = Color( (aColor.GetRed() >> 1) | 0x80,
     374           0 :                                 (aColor.GetGreen() >> 1) | 0x80,
     375           0 :                                 (aColor.GetBlue() >> 1) | 0x80);
     376             :             }
     377             :         }
     378             :     }
     379             : 
     380     1871380 :     if ( mpMetaFile )
     381       52011 :         mpMetaFile->AddAction( new MetaFillColorAction( aColor, true ) );
     382             : 
     383     1871380 :     if ( ImplIsColorTransparent( aColor ) )
     384             :     {
     385       19544 :         if ( mbFillColor )
     386             :         {
     387       17458 :             mbInitFillColor = true;
     388       17458 :             mbFillColor = false;
     389       17458 :             maFillColor = Color( COL_TRANSPARENT );
     390             :         }
     391             :     }
     392             :     else
     393             :     {
     394     1851836 :         if ( maFillColor != aColor )
     395             :         {
     396     1000573 :             mbInitFillColor = true;
     397     1000573 :             mbFillColor = true;
     398     1000573 :             maFillColor = aColor;
     399             :         }
     400             :     }
     401             : 
     402     1871380 :     if( mpAlphaVDev )
     403       70481 :         mpAlphaVDev->SetFillColor( COL_BLACK );
     404     1871380 : }
     405             : 
     406     1030479 : void OutputDevice::SetLineColor()
     407             : {
     408             : 
     409     1030479 :     if ( mpMetaFile )
     410       17532 :         mpMetaFile->AddAction( new MetaLineColorAction( Color(), false ) );
     411             : 
     412     1030479 :     if ( mbLineColor )
     413             :     {
     414      571251 :         mbInitLineColor = true;
     415      571251 :         mbLineColor = false;
     416      571251 :         maLineColor = Color( COL_TRANSPARENT );
     417             :     }
     418             : 
     419     1030479 :     if( mpAlphaVDev )
     420       17181 :         mpAlphaVDev->SetLineColor();
     421     1030479 : }
     422             : 
     423     1851736 : void OutputDevice::SetLineColor( const Color& rColor )
     424             : {
     425             : 
     426     1851736 :     Color aColor = ImplDrawModeToColor( rColor );
     427             : 
     428     1851736 :     if( mpMetaFile )
     429       64688 :         mpMetaFile->AddAction( new MetaLineColorAction( aColor, true ) );
     430             : 
     431     1851736 :     if( ImplIsColorTransparent( aColor ) )
     432             :     {
     433      117460 :         if ( mbLineColor )
     434             :         {
     435       34780 :             mbInitLineColor = true;
     436       34780 :             mbLineColor = false;
     437       34780 :             maLineColor = Color( COL_TRANSPARENT );
     438             :         }
     439             :     }
     440             :     else
     441             :     {
     442     1734276 :         if( maLineColor != aColor )
     443             :         {
     444     1139098 :             mbInitLineColor = true;
     445     1139098 :             mbLineColor = true;
     446     1139098 :             maLineColor = aColor;
     447             :         }
     448             :     }
     449             : 
     450     1851736 :     if( mpAlphaVDev )
     451       76251 :         mpAlphaVDev->SetLineColor( COL_BLACK );
     452     1851736 : }
     453             : 
     454       80864 : void OutputDevice::SetBackground()
     455             : {
     456             : 
     457       80864 :     maBackground = Wallpaper();
     458       80864 :     mbBackground = false;
     459             : 
     460       80864 :     if( mpAlphaVDev )
     461          10 :         mpAlphaVDev->SetBackground();
     462       80864 : }
     463             : 
     464      712649 : void OutputDevice::SetBackground( const Wallpaper& rBackground )
     465             : {
     466             : 
     467      712649 :     maBackground = rBackground;
     468             : 
     469      712649 :     if( rBackground.GetStyle() == WALLPAPER_NULL )
     470       26425 :         mbBackground = false;
     471             :     else
     472      686224 :         mbBackground = true;
     473             : 
     474      712649 :     if( mpAlphaVDev )
     475           0 :         mpAlphaVDev->SetBackground( rBackground );
     476      712649 : }
     477             : 
     478     1391535 : void OutputDevice::SetFont( const vcl::Font& rNewFont )
     479             : {
     480             : 
     481     1391535 :     vcl::Font aFont( rNewFont );
     482     1391535 :     aFont.SetLanguage(rNewFont.GetLanguage());
     483     1391535 :     if ( mnDrawMode & (DrawModeFlags::BlackText | DrawModeFlags::WhiteText | DrawModeFlags::GrayText | DrawModeFlags::GhostedText | DrawModeFlags::SettingsText |
     484             :                        DrawModeFlags::BlackFill | DrawModeFlags::WhiteFill | DrawModeFlags::GrayFill | DrawModeFlags::NoFill |
     485     1391535 :                        DrawModeFlags::GhostedFill | DrawModeFlags::SettingsFill ) )
     486             :     {
     487          18 :         Color aTextColor( aFont.GetColor() );
     488             : 
     489          18 :         if ( mnDrawMode & DrawModeFlags::BlackText )
     490           0 :             aTextColor = Color( COL_BLACK );
     491          18 :         else if ( mnDrawMode & DrawModeFlags::WhiteText )
     492          18 :             aTextColor = Color( COL_WHITE );
     493           0 :         else if ( mnDrawMode & DrawModeFlags::GrayText )
     494             :         {
     495           0 :             const sal_uInt8 cLum = aTextColor.GetLuminance();
     496           0 :             aTextColor = Color( cLum, cLum, cLum );
     497             :         }
     498           0 :         else if ( mnDrawMode & DrawModeFlags::SettingsText )
     499           0 :             aTextColor = GetSettings().GetStyleSettings().GetFontColor();
     500             : 
     501          18 :         if ( mnDrawMode & DrawModeFlags::GhostedText )
     502             :         {
     503           0 :             aTextColor = Color( (aTextColor.GetRed() >> 1 ) | 0x80,
     504           0 :                                 (aTextColor.GetGreen() >> 1 ) | 0x80,
     505           0 :                                 (aTextColor.GetBlue() >> 1 ) | 0x80 );
     506             :         }
     507             : 
     508          18 :         aFont.SetColor( aTextColor );
     509             : 
     510          18 :         bool bTransFill = aFont.IsTransparent();
     511          18 :         if ( !bTransFill )
     512             :         {
     513           0 :             Color aTextFillColor( aFont.GetFillColor() );
     514             : 
     515           0 :             if ( mnDrawMode & DrawModeFlags::BlackFill )
     516           0 :                 aTextFillColor = Color( COL_BLACK );
     517           0 :             else if ( mnDrawMode & DrawModeFlags::WhiteFill )
     518           0 :                 aTextFillColor = Color( COL_WHITE );
     519           0 :             else if ( mnDrawMode & DrawModeFlags::GrayFill )
     520             :             {
     521           0 :                 const sal_uInt8 cLum = aTextFillColor.GetLuminance();
     522           0 :                 aTextFillColor = Color( cLum, cLum, cLum );
     523             :             }
     524           0 :             else if( mnDrawMode & DrawModeFlags::SettingsFill )
     525           0 :                 aTextFillColor = GetSettings().GetStyleSettings().GetWindowColor();
     526           0 :             else if ( mnDrawMode & DrawModeFlags::NoFill )
     527             :             {
     528           0 :                 aTextFillColor = Color( COL_TRANSPARENT );
     529           0 :                 bTransFill = true;
     530             :             }
     531             : 
     532           0 :             if ( !bTransFill && (mnDrawMode & DrawModeFlags::GhostedFill) )
     533             :             {
     534           0 :                 aTextFillColor = Color( (aTextFillColor.GetRed() >> 1) | 0x80,
     535           0 :                                         (aTextFillColor.GetGreen() >> 1) | 0x80,
     536           0 :                                         (aTextFillColor.GetBlue() >> 1) | 0x80 );
     537             :             }
     538             : 
     539           0 :             aFont.SetFillColor( aTextFillColor );
     540             :         }
     541             :     }
     542             : 
     543     1391535 :     if ( mpMetaFile )
     544             :     {
     545       53915 :         mpMetaFile->AddAction( new MetaFontAction( aFont ) );
     546             :         // the color and alignment actions don't belong here
     547             :         // TODO: get rid of them without breaking anything...
     548       53915 :         mpMetaFile->AddAction( new MetaTextAlignAction( aFont.GetAlign() ) );
     549       53915 :         mpMetaFile->AddAction( new MetaTextFillColorAction( aFont.GetFillColor(), !aFont.IsTransparent() ) );
     550             :     }
     551             : 
     552     1391535 :     if ( !maFont.IsSameInstance( aFont ) )
     553             :     {
     554             :         // Optimization MT/HDU: COL_TRANSPARENT means SetFont should ignore the font color,
     555             :         // because SetTextColor() is used for this.
     556             :         // #i28759# maTextColor might have been changed behind our back, commit then, too.
     557     3757296 :         if( aFont.GetColor() != COL_TRANSPARENT
     558     3757296 :         && (aFont.GetColor() != maFont.GetColor() || aFont.GetColor() != maTextColor ) )
     559             :         {
     560      103563 :             maTextColor = aFont.GetColor();
     561      103563 :             mbInitTextColor = true;
     562      103563 :             if( mpMetaFile )
     563        1264 :                 mpMetaFile->AddAction( new MetaTextColorAction( aFont.GetColor() ) );
     564             :         }
     565     1252432 :         maFont      = aFont;
     566     1252432 :         mbNewFont   = true;
     567             : 
     568     1252432 :         if( mpAlphaVDev )
     569             :         {
     570             :             // #i30463#
     571             :             // Since SetFont might change the text color, apply that only
     572             :             // selectively to alpha vdev (which normally paints opaque text
     573             :             // with COL_BLACK)
     574       27027 :             if( aFont.GetColor() != COL_TRANSPARENT )
     575             :             {
     576         226 :                 mpAlphaVDev->SetTextColor( COL_BLACK );
     577         226 :                 aFont.SetColor( COL_TRANSPARENT );
     578             :             }
     579             : 
     580       27027 :             mpAlphaVDev->SetFont( aFont );
     581             :         }
     582     1391535 :     }
     583     1391535 : }
     584             : 
     585             : 
     586     1078999 : void OutputDevice::InitLineColor()
     587             : {
     588             :     DBG_TESTSOLARMUTEX();
     589             : 
     590     1078999 :     if( mbLineColor )
     591             :     {
     592      577232 :         if( ROP_0 == meRasterOp )
     593           0 :             mpGraphics->SetROPLineColor( SAL_ROP_0 );
     594      577232 :         else if( ROP_1 == meRasterOp )
     595           0 :             mpGraphics->SetROPLineColor( SAL_ROP_1 );
     596      577232 :         else if( ROP_INVERT == meRasterOp )
     597           0 :             mpGraphics->SetROPLineColor( SAL_ROP_INVERT );
     598             :         else
     599      577232 :             mpGraphics->SetLineColor( ImplColorToSal( maLineColor ) );
     600             :     }
     601             :     else
     602      501767 :         mpGraphics->SetLineColor();
     603             : 
     604     1078999 :     mbInitLineColor = false;
     605     1078999 : }
     606             : 
     607             : 
     608      809291 : void OutputDevice::InitFillColor()
     609             : {
     610             :     DBG_TESTSOLARMUTEX();
     611             : 
     612      809291 :     if( mbFillColor )
     613             :     {
     614      804562 :         if( ROP_0 == meRasterOp )
     615           0 :             mpGraphics->SetROPFillColor( SAL_ROP_0 );
     616      804562 :         else if( ROP_1 == meRasterOp )
     617           0 :             mpGraphics->SetROPFillColor( SAL_ROP_1 );
     618      804562 :         else if( ROP_INVERT == meRasterOp )
     619           0 :             mpGraphics->SetROPFillColor( SAL_ROP_INVERT );
     620             :         else
     621      804562 :             mpGraphics->SetFillColor( ImplColorToSal( maFillColor ) );
     622             :     }
     623             :     else
     624        4729 :         mpGraphics->SetFillColor();
     625             : 
     626      809291 :     mbInitFillColor = false;
     627      809291 : }
     628             : 
     629      410096 : void OutputDevice::ImplReleaseFonts()
     630             : {
     631      410096 :     mpGraphics->ReleaseFonts();
     632             : 
     633      410096 :     mbNewFont = true;
     634      410096 :     mbInitFont = true;
     635             : 
     636      410096 :     if ( mpFontEntry )
     637             :     {
     638      101695 :         mpFontCache->Release( mpFontEntry );
     639      101695 :         mpFontEntry = NULL;
     640             :     }
     641             : 
     642      410096 :     if ( mpGetDevFontList )
     643             :     {
     644        4534 :         delete mpGetDevFontList;
     645        4534 :         mpGetDevFontList = NULL;
     646             :     }
     647             : 
     648      410096 :     if ( mpGetDevSizeList )
     649             :     {
     650         981 :         delete mpGetDevSizeList;
     651         981 :         mpGetDevSizeList = NULL;
     652             :     }
     653      410897 : }
     654             : 
     655             : 
     656             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11