LCOV - code coverage report
Current view: top level - vcl/source/outdev - outdevstate.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 288 355 81.1 %
Date: 2014-11-03 Functions: 21 22 95.5 %
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 <sal/types.h>
      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 <vcl/outdevstate.hxx>
      37             : 
      38             : #include "outdev.h"
      39             : #include "outdata.hxx"
      40             : #include "salgdi.hxx"
      41             : #include "sallayout.hxx"
      42             : 
      43     1131692 : OutDevState::~OutDevState()
      44             : {
      45     1131692 :     if ( mnFlags & PushFlags::LINECOLOR )
      46      233622 :         delete mpLineColor;
      47     1131692 :     if ( mnFlags & PushFlags::FILLCOLOR )
      48      194710 :         delete mpFillColor;
      49     1131692 :     if ( mnFlags & PushFlags::FONT )
      50      196426 :         delete mpFont;
      51     1131692 :     if ( mnFlags & PushFlags::TEXTCOLOR )
      52      177645 :         delete mpTextColor;
      53     1131692 :     if ( mnFlags & PushFlags::TEXTFILLCOLOR )
      54       50832 :         delete mpTextFillColor;
      55     1131692 :     if ( mnFlags & PushFlags::TEXTLINECOLOR )
      56       50832 :         delete mpTextLineColor;
      57     1131692 :     if ( mnFlags & PushFlags::OVERLINECOLOR )
      58       50832 :         delete mpOverlineColor;
      59     1131692 :     if ( mnFlags & PushFlags::MAPMODE )
      60      218291 :         delete mpMapMode;
      61     1131692 :     if ( mnFlags & PushFlags::CLIPREGION )
      62      616877 :         delete mpClipRegion;
      63     1131692 :     if ( mnFlags & PushFlags::REFPOINT )
      64       50832 :         delete mpRefPoint;
      65     1131692 : }
      66             : 
      67             : 
      68     1131692 : void OutputDevice::Push( PushFlags nFlags )
      69             : {
      70             : 
      71     1131692 :     if ( mpMetaFile )
      72       99634 :         mpMetaFile->AddAction( new MetaPushAction( nFlags ) );
      73             : 
      74     1131692 :     OutDevState* pState = new OutDevState;
      75             : 
      76     1131692 :     pState->mnFlags = nFlags;
      77             : 
      78     1131692 :     if ( nFlags & PushFlags::LINECOLOR )
      79             :     {
      80      233622 :         if ( mbLineColor )
      81      167774 :             pState->mpLineColor = new Color( maLineColor );
      82             :         else
      83       65848 :             pState->mpLineColor = NULL;
      84             :     }
      85     1131692 :     if ( nFlags & PushFlags::FILLCOLOR )
      86             :     {
      87      194710 :         if ( mbFillColor )
      88      185984 :             pState->mpFillColor = new Color( maFillColor );
      89             :         else
      90        8726 :             pState->mpFillColor = NULL;
      91             :     }
      92     1131692 :     if ( nFlags & PushFlags::FONT )
      93      196426 :         pState->mpFont = new vcl::Font( maFont );
      94     1131692 :     if ( nFlags & PushFlags::TEXTCOLOR )
      95      177645 :         pState->mpTextColor = new Color( GetTextColor() );
      96     1131692 :     if ( nFlags & PushFlags::TEXTFILLCOLOR )
      97             :     {
      98       50832 :         if ( IsTextFillColor() )
      99         422 :             pState->mpTextFillColor = new Color( GetTextFillColor() );
     100             :         else
     101       50410 :             pState->mpTextFillColor = NULL;
     102             :     }
     103     1131692 :     if ( nFlags & PushFlags::TEXTLINECOLOR )
     104             :     {
     105       50832 :         if ( IsTextLineColor() )
     106         552 :             pState->mpTextLineColor = new Color( GetTextLineColor() );
     107             :         else
     108       50280 :             pState->mpTextLineColor = NULL;
     109             :     }
     110     1131692 :     if ( nFlags & PushFlags::OVERLINECOLOR )
     111             :     {
     112       50832 :         if ( IsOverlineColor() )
     113         530 :             pState->mpOverlineColor = new Color( GetOverlineColor() );
     114             :         else
     115       50302 :             pState->mpOverlineColor = NULL;
     116             :     }
     117     1131692 :     if ( nFlags & PushFlags::TEXTALIGN )
     118       50832 :         pState->meTextAlign = GetTextAlign();
     119     1131692 :     if( nFlags & PushFlags::TEXTLAYOUTMODE )
     120      280724 :         pState->mnTextLayoutMode = GetLayoutMode();
     121     1131692 :     if( nFlags & PushFlags::TEXTLANGUAGE )
     122      279955 :         pState->meTextLanguage = GetDigitLanguage();
     123     1131692 :     if ( nFlags & PushFlags::RASTEROP )
     124       50832 :         pState->meRasterOp = GetRasterOp();
     125     1131692 :     if ( nFlags & PushFlags::MAPMODE )
     126             :     {
     127      218291 :         pState->mpMapMode = new MapMode( maMapMode );
     128      218291 :         pState->mbMapActive = mbMap;
     129             :     }
     130     1131692 :     if ( nFlags & PushFlags::CLIPREGION )
     131             :     {
     132      616877 :         if ( mbClipRegion )
     133      266742 :             pState->mpClipRegion = new vcl::Region( maRegion );
     134             :         else
     135      350135 :             pState->mpClipRegion = NULL;
     136             :     }
     137     1131692 :     if ( nFlags & PushFlags::REFPOINT )
     138             :     {
     139       50832 :         if ( mbRefPoint )
     140           0 :             pState->mpRefPoint = new Point( maRefPoint );
     141             :         else
     142       50832 :             pState->mpRefPoint = NULL;
     143             :     }
     144             : 
     145     1131692 :     mpOutDevStateStack->push_back( pState );
     146             : 
     147     1131692 :     if( mpAlphaVDev )
     148       14826 :         mpAlphaVDev->Push();
     149     1131692 : }
     150             : 
     151     1131692 : void OutputDevice::Pop()
     152             : {
     153             : 
     154     1131692 :     if( mpMetaFile )
     155       99634 :         mpMetaFile->AddAction( new MetaPopAction() );
     156             : 
     157     1131692 :     GDIMetaFile* pOldMetaFile = mpMetaFile;
     158     1131692 :     mpMetaFile = NULL;
     159             : 
     160     1131692 :     if ( mpOutDevStateStack->empty() )
     161             :     {
     162             :         SAL_WARN( "vcl.gdi", "OutputDevice::Pop() without OutputDevice::Push()" );
     163     1131692 :         return;
     164             :     }
     165     1131692 :     const OutDevState& rState = mpOutDevStateStack->back();
     166             : 
     167     1131692 :     if( mpAlphaVDev )
     168       14826 :         mpAlphaVDev->Pop();
     169             : 
     170     1131692 :     if ( rState.mnFlags & PushFlags::LINECOLOR )
     171             :     {
     172      233622 :         if ( rState.mpLineColor )
     173      167774 :             SetLineColor( *rState.mpLineColor );
     174             :         else
     175       65848 :             SetLineColor();
     176             :     }
     177             : 
     178     1131692 :     if ( rState.mnFlags & PushFlags::FILLCOLOR )
     179             :     {
     180      194710 :         if ( rState.mpFillColor )
     181      185984 :             SetFillColor( *rState.mpFillColor );
     182             :         else
     183        8726 :             SetFillColor();
     184             :     }
     185             : 
     186     1131692 :     if ( rState.mnFlags & PushFlags::FONT )
     187      196426 :         SetFont( *rState.mpFont );
     188             : 
     189     1131692 :     if ( rState.mnFlags & PushFlags::TEXTCOLOR )
     190      177645 :         SetTextColor( *rState.mpTextColor );
     191             : 
     192     1131692 :     if ( rState.mnFlags & PushFlags::TEXTFILLCOLOR )
     193             :     {
     194       50832 :         if ( rState.mpTextFillColor )
     195         422 :             SetTextFillColor( *rState.mpTextFillColor );
     196             :         else
     197       50410 :             SetTextFillColor();
     198             :     }
     199             : 
     200     1131692 :     if ( rState.mnFlags & PushFlags::TEXTLINECOLOR )
     201             :     {
     202       50832 :         if ( rState.mpTextLineColor )
     203         552 :             SetTextLineColor( *rState.mpTextLineColor );
     204             :         else
     205       50280 :             SetTextLineColor();
     206             :     }
     207             : 
     208     1131692 :     if ( rState.mnFlags & PushFlags::OVERLINECOLOR )
     209             :     {
     210       50832 :         if ( rState.mpOverlineColor )
     211         530 :             SetOverlineColor( *rState.mpOverlineColor );
     212             :         else
     213       50302 :             SetOverlineColor();
     214             :     }
     215             : 
     216     1131692 :     if ( rState.mnFlags & PushFlags::TEXTALIGN )
     217       50832 :         SetTextAlign( rState.meTextAlign );
     218             : 
     219     1131692 :     if( rState.mnFlags & PushFlags::TEXTLAYOUTMODE )
     220      280724 :         SetLayoutMode( rState.mnTextLayoutMode );
     221             : 
     222     1131692 :     if( rState.mnFlags & PushFlags::TEXTLANGUAGE )
     223      279955 :         SetDigitLanguage( rState.meTextLanguage );
     224             : 
     225     1131692 :     if ( rState.mnFlags & PushFlags::RASTEROP )
     226       50832 :         SetRasterOp( rState.meRasterOp );
     227             : 
     228     1131692 :     if ( rState.mnFlags & PushFlags::MAPMODE )
     229             :     {
     230      218291 :         if ( rState.mpMapMode )
     231      218291 :             SetMapMode( *rState.mpMapMode );
     232             :         else
     233           0 :             SetMapMode();
     234      218291 :         mbMap = rState.mbMapActive;
     235             :     }
     236             : 
     237     1131692 :     if ( rState.mnFlags & PushFlags::CLIPREGION )
     238      616877 :         SetDeviceClipRegion( rState.mpClipRegion );
     239             : 
     240     1131692 :     if ( rState.mnFlags & PushFlags::REFPOINT )
     241             :     {
     242       50832 :         if ( rState.mpRefPoint )
     243           0 :             SetRefPoint( *rState.mpRefPoint );
     244             :         else
     245       50832 :             SetRefPoint();
     246             :     }
     247             : 
     248     1131692 :     mpOutDevStateStack->pop_back();
     249             : 
     250     1131692 :     mpMetaFile = pOldMetaFile;
     251             : }
     252             : 
     253           0 : sal_uInt32 OutputDevice::GetGCStackDepth() const
     254             : {
     255           0 :     return mpOutDevStateStack->size();
     256             : }
     257             : 
     258       37697 : void OutputDevice::EnableOutput( bool bEnable )
     259             : {
     260       37697 :     mbOutput = bEnable;
     261             : 
     262       37697 :     if( mpAlphaVDev )
     263           0 :         mpAlphaVDev->EnableOutput( bEnable );
     264       37697 : }
     265             : 
     266      184470 : void OutputDevice::SetAntialiasing( sal_uInt16 nMode )
     267             : {
     268      184470 :     if ( mnAntialiasing != nMode )
     269             :     {
     270       13401 :         mnAntialiasing = nMode;
     271       13401 :         mbInitFont = true;
     272             : 
     273       13401 :         if(mpGraphics)
     274             :         {
     275           4 :             mpGraphics->setAntiAliasB2DDraw(mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW);
     276             :         }
     277             :     }
     278             : 
     279      184470 :     if( mpAlphaVDev )
     280           0 :         mpAlphaVDev->SetAntialiasing( nMode );
     281      184470 : }
     282             : 
     283      104866 : void OutputDevice::SetDrawMode( sal_uLong nDrawMode )
     284             : {
     285             : 
     286      104866 :     mnDrawMode = nDrawMode;
     287             : 
     288      104866 :     if( mpAlphaVDev )
     289           0 :         mpAlphaVDev->SetDrawMode( nDrawMode );
     290      104866 : }
     291             : 
     292     1544353 : void OutputDevice::SetLayoutMode( ComplexTextLayoutMode nTextLayoutMode )
     293             : {
     294     1544353 :     if( mpMetaFile )
     295       26229 :         mpMetaFile->AddAction( new MetaLayoutModeAction( nTextLayoutMode ) );
     296             : 
     297     1544353 :     mnTextLayoutMode = nTextLayoutMode;
     298             : 
     299     1544353 :     if( mpAlphaVDev )
     300       27025 :         mpAlphaVDev->SetLayoutMode( nTextLayoutMode );
     301     1544353 : }
     302             : 
     303     1698277 : void OutputDevice::SetDigitLanguage( LanguageType eTextLanguage )
     304             : {
     305     1698277 :     if( mpMetaFile )
     306       37115 :         mpMetaFile->AddAction( new MetaTextLanguageAction( eTextLanguage ) );
     307             : 
     308     1698277 :     meTextLanguage = eTextLanguage;
     309             : 
     310     1698277 :     if( mpAlphaVDev )
     311       26544 :         mpAlphaVDev->SetDigitLanguage( eTextLanguage );
     312     1698277 : }
     313             : 
     314       88796 : void OutputDevice::SetRasterOp( RasterOp eRasterOp )
     315             : {
     316             : 
     317       88796 :     if ( mpMetaFile )
     318       10225 :         mpMetaFile->AddAction( new MetaRasterOpAction( eRasterOp ) );
     319             : 
     320       88796 :     if ( meRasterOp != eRasterOp )
     321             :     {
     322        8424 :         meRasterOp = eRasterOp;
     323        8424 :         mbInitLineColor = mbInitFillColor = true;
     324             : 
     325        8424 :         if( mpGraphics || AcquireGraphics() )
     326        8424 :             mpGraphics->SetXORMode( (ROP_INVERT == meRasterOp) || (ROP_XOR == meRasterOp), ROP_INVERT == meRasterOp );
     327             :     }
     328             : 
     329       88796 :     if( mpAlphaVDev )
     330       13282 :         mpAlphaVDev->SetRasterOp( eRasterOp );
     331       88796 : }
     332             : 
     333             : 
     334      488854 : void OutputDevice::SetFillColor()
     335             : {
     336             : 
     337      488854 :     if ( mpMetaFile )
     338        6528 :         mpMetaFile->AddAction( new MetaFillColorAction( Color(), false ) );
     339             : 
     340      488854 :     if ( mbFillColor )
     341             :     {
     342      106098 :         mbInitFillColor = true;
     343      106098 :         mbFillColor = false;
     344      106098 :         maFillColor = Color( COL_TRANSPARENT );
     345             :     }
     346             : 
     347      488854 :     if( mpAlphaVDev )
     348        2416 :         mpAlphaVDev->SetFillColor();
     349      488854 : }
     350             : 
     351     2423818 : void OutputDevice::SetFillColor( const Color& rColor )
     352             : {
     353             : 
     354     2423818 :     Color aColor( rColor );
     355             : 
     356     2423818 :     if( mnDrawMode & ( DRAWMODE_BLACKFILL | DRAWMODE_WHITEFILL |
     357             :                        DRAWMODE_GRAYFILL | DRAWMODE_NOFILL |
     358             :                        DRAWMODE_GHOSTEDFILL | DRAWMODE_SETTINGSFILL ) )
     359             :     {
     360           0 :         if( !ImplIsColorTransparent( aColor ) )
     361             :         {
     362           0 :             if( mnDrawMode & DRAWMODE_BLACKFILL )
     363             :             {
     364           0 :                 aColor = Color( COL_BLACK );
     365             :             }
     366           0 :             else if( mnDrawMode & DRAWMODE_WHITEFILL )
     367             :             {
     368           0 :                 aColor = Color( COL_WHITE );
     369             :             }
     370           0 :             else if( mnDrawMode & DRAWMODE_GRAYFILL )
     371             :             {
     372           0 :                 const sal_uInt8 cLum = aColor.GetLuminance();
     373           0 :                 aColor = Color( cLum, cLum, cLum );
     374             :             }
     375           0 :             else if( mnDrawMode & DRAWMODE_NOFILL )
     376             :             {
     377           0 :                 aColor = Color( COL_TRANSPARENT );
     378             :             }
     379           0 :             else if( mnDrawMode & DRAWMODE_SETTINGSFILL )
     380             :             {
     381           0 :                 aColor = GetSettings().GetStyleSettings().GetWindowColor();
     382             :             }
     383             : 
     384           0 :             if( mnDrawMode & DRAWMODE_GHOSTEDFILL )
     385             :             {
     386           0 :                 aColor = Color( (aColor.GetRed() >> 1) | 0x80,
     387           0 :                                 (aColor.GetGreen() >> 1) | 0x80,
     388           0 :                                 (aColor.GetBlue() >> 1) | 0x80);
     389             :             }
     390             :         }
     391             :     }
     392             : 
     393     2423818 :     if ( mpMetaFile )
     394       31839 :         mpMetaFile->AddAction( new MetaFillColorAction( aColor, true ) );
     395             : 
     396     2423818 :     if ( ImplIsColorTransparent( aColor ) )
     397             :     {
     398       48666 :         if ( mbFillColor )
     399             :         {
     400       47670 :             mbInitFillColor = true;
     401       47670 :             mbFillColor = false;
     402       47670 :             maFillColor = Color( COL_TRANSPARENT );
     403             :         }
     404             :     }
     405             :     else
     406             :     {
     407     2375152 :         if ( maFillColor != aColor )
     408             :         {
     409     1299436 :             mbInitFillColor = true;
     410     1299436 :             mbFillColor = true;
     411     1299436 :             maFillColor = aColor;
     412             :         }
     413             :     }
     414             : 
     415     2423818 :     if( mpAlphaVDev )
     416       37592 :         mpAlphaVDev->SetFillColor( COL_BLACK );
     417     2423818 : }
     418             : 
     419     1238050 : void OutputDevice::SetLineColor()
     420             : {
     421             : 
     422     1238050 :     if ( mpMetaFile )
     423       15298 :         mpMetaFile->AddAction( new MetaLineColorAction( Color(), false ) );
     424             : 
     425     1238050 :     if ( mbLineColor )
     426             :     {
     427      780861 :         mbInitLineColor = true;
     428      780861 :         mbLineColor = false;
     429      780861 :         maLineColor = Color( COL_TRANSPARENT );
     430             :     }
     431             : 
     432     1238050 :     if( mpAlphaVDev )
     433        9187 :         mpAlphaVDev->SetLineColor();
     434     1238050 : }
     435             : 
     436     2707473 : void OutputDevice::SetLineColor( const Color& rColor )
     437             : {
     438             : 
     439     2707473 :     Color aColor = ImplDrawModeToColor( rColor );
     440             : 
     441     2707473 :     if( mpMetaFile )
     442       39093 :         mpMetaFile->AddAction( new MetaLineColorAction( aColor, true ) );
     443             : 
     444     2707473 :     if( ImplIsColorTransparent( aColor ) )
     445             :     {
     446      216422 :         if ( mbLineColor )
     447             :         {
     448       54540 :             mbInitLineColor = true;
     449       54540 :             mbLineColor = false;
     450       54540 :             maLineColor = Color( COL_TRANSPARENT );
     451             :         }
     452             :     }
     453             :     else
     454             :     {
     455     2491051 :         if( maLineColor != aColor )
     456             :         {
     457     1702926 :             mbInitLineColor = true;
     458     1702926 :             mbLineColor = true;
     459     1702926 :             maLineColor = aColor;
     460             :         }
     461             :     }
     462             : 
     463     2707473 :     if( mpAlphaVDev )
     464       40589 :         mpAlphaVDev->SetLineColor( COL_BLACK );
     465     2707473 : }
     466             : 
     467      127779 : void OutputDevice::SetBackground()
     468             : {
     469             : 
     470      127779 :     maBackground = Wallpaper();
     471      127779 :     mbBackground = false;
     472             : 
     473      127779 :     if( mpAlphaVDev )
     474           0 :         mpAlphaVDev->SetBackground();
     475      127779 : }
     476             : 
     477     1244956 : void OutputDevice::SetBackground( const Wallpaper& rBackground )
     478             : {
     479             : 
     480     1244956 :     maBackground = rBackground;
     481             : 
     482     1244956 :     if( rBackground.GetStyle() == WALLPAPER_NULL )
     483       39936 :         mbBackground = false;
     484             :     else
     485     1205020 :         mbBackground = true;
     486             : 
     487     1244956 :     if( mpAlphaVDev )
     488           0 :         mpAlphaVDev->SetBackground( rBackground );
     489     1244956 : }
     490             : 
     491     1534147 : void OutputDevice::SetFont( const vcl::Font& rNewFont )
     492             : {
     493             : 
     494     1534147 :     vcl::Font aFont( rNewFont );
     495     1534147 :     aFont.SetLanguage(rNewFont.GetLanguage());
     496     1534147 :     if ( mnDrawMode & (DRAWMODE_BLACKTEXT | DRAWMODE_WHITETEXT | DRAWMODE_GRAYTEXT | DRAWMODE_GHOSTEDTEXT | DRAWMODE_SETTINGSTEXT |
     497             :                        DRAWMODE_BLACKFILL | DRAWMODE_WHITEFILL | DRAWMODE_GRAYFILL | DRAWMODE_NOFILL |
     498             :                        DRAWMODE_GHOSTEDFILL | DRAWMODE_SETTINGSFILL ) )
     499             :     {
     500           0 :         Color aTextColor( aFont.GetColor() );
     501             : 
     502           0 :         if ( mnDrawMode & DRAWMODE_BLACKTEXT )
     503           0 :             aTextColor = Color( COL_BLACK );
     504           0 :         else if ( mnDrawMode & DRAWMODE_WHITETEXT )
     505           0 :             aTextColor = Color( COL_WHITE );
     506           0 :         else if ( mnDrawMode & DRAWMODE_GRAYTEXT )
     507             :         {
     508           0 :             const sal_uInt8 cLum = aTextColor.GetLuminance();
     509           0 :             aTextColor = Color( cLum, cLum, cLum );
     510             :         }
     511           0 :         else if ( mnDrawMode & DRAWMODE_SETTINGSTEXT )
     512           0 :             aTextColor = GetSettings().GetStyleSettings().GetFontColor();
     513             : 
     514           0 :         if ( mnDrawMode & DRAWMODE_GHOSTEDTEXT )
     515             :         {
     516           0 :             aTextColor = Color( (aTextColor.GetRed() >> 1 ) | 0x80,
     517           0 :                                 (aTextColor.GetGreen() >> 1 ) | 0x80,
     518           0 :                                 (aTextColor.GetBlue() >> 1 ) | 0x80 );
     519             :         }
     520             : 
     521           0 :         aFont.SetColor( aTextColor );
     522             : 
     523           0 :         bool bTransFill = aFont.IsTransparent();
     524           0 :         if ( !bTransFill )
     525             :         {
     526           0 :             Color aTextFillColor( aFont.GetFillColor() );
     527             : 
     528           0 :             if ( mnDrawMode & DRAWMODE_BLACKFILL )
     529           0 :                 aTextFillColor = Color( COL_BLACK );
     530           0 :             else if ( mnDrawMode & DRAWMODE_WHITEFILL )
     531           0 :                 aTextFillColor = Color( COL_WHITE );
     532           0 :             else if ( mnDrawMode & DRAWMODE_GRAYFILL )
     533             :             {
     534           0 :                 const sal_uInt8 cLum = aTextFillColor.GetLuminance();
     535           0 :                 aTextFillColor = Color( cLum, cLum, cLum );
     536             :             }
     537           0 :             else if( mnDrawMode & DRAWMODE_SETTINGSFILL )
     538           0 :                 aTextFillColor = GetSettings().GetStyleSettings().GetWindowColor();
     539           0 :             else if ( mnDrawMode & DRAWMODE_NOFILL )
     540             :             {
     541           0 :                 aTextFillColor = Color( COL_TRANSPARENT );
     542           0 :                 bTransFill = true;
     543             :             }
     544             : 
     545           0 :             if ( !bTransFill && (mnDrawMode & DRAWMODE_GHOSTEDFILL) )
     546             :             {
     547           0 :                 aTextFillColor = Color( (aTextFillColor.GetRed() >> 1) | 0x80,
     548           0 :                                         (aTextFillColor.GetGreen() >> 1) | 0x80,
     549           0 :                                         (aTextFillColor.GetBlue() >> 1) | 0x80 );
     550             :             }
     551             : 
     552           0 :             aFont.SetFillColor( aTextFillColor );
     553             :         }
     554             :     }
     555             : 
     556     1534147 :     if ( mpMetaFile )
     557             :     {
     558       85857 :         mpMetaFile->AddAction( new MetaFontAction( aFont ) );
     559             :         // the color and alignment actions don't belong here
     560             :         // TODO: get rid of them without breaking anything...
     561       85857 :         mpMetaFile->AddAction( new MetaTextAlignAction( aFont.GetAlign() ) );
     562       85857 :         mpMetaFile->AddAction( new MetaTextFillColorAction( aFont.GetFillColor(), !aFont.IsTransparent() ) );
     563             :     }
     564             : 
     565     1534147 :     if ( !maFont.IsSameInstance( aFont ) )
     566             :     {
     567             :         // Optimization MT/HDU: COL_TRANSPARENT means SetFont should ignore the font color,
     568             :         // because SetTextColor() is used for this.
     569             :         // #i28759# maTextColor might have been changed behind our back, commit then, too.
     570     4112547 :         if( aFont.GetColor() != COL_TRANSPARENT
     571     4112547 :         && (aFont.GetColor() != maFont.GetColor() || aFont.GetColor() != maTextColor ) )
     572             :         {
     573      129850 :             maTextColor = aFont.GetColor();
     574      129850 :             mbInitTextColor = true;
     575      129850 :             if( mpMetaFile )
     576        2128 :                 mpMetaFile->AddAction( new MetaTextColorAction( aFont.GetColor() ) );
     577             :         }
     578     1370849 :         maFont      = aFont;
     579     1370849 :         mbNewFont   = true;
     580             : 
     581     1370849 :         if( mpAlphaVDev )
     582             :         {
     583             :             // #i30463#
     584             :             // Since SetFont might change the text color, apply that only
     585             :             // selectively to alpha vdev (which normally paints opaque text
     586             :             // with COL_BLACK)
     587       13767 :             if( aFont.GetColor() != COL_TRANSPARENT )
     588             :             {
     589          79 :                 mpAlphaVDev->SetTextColor( COL_BLACK );
     590          79 :                 aFont.SetColor( COL_TRANSPARENT );
     591             :             }
     592             : 
     593       13767 :             mpAlphaVDev->SetFont( aFont );
     594             :         }
     595     1534147 :     }
     596     1534147 : }
     597             : 
     598             : 
     599     1656897 : void OutputDevice::InitLineColor()
     600             : {
     601             :     DBG_TESTSOLARMUTEX();
     602             : 
     603     1656897 :     if( mbLineColor )
     604             :     {
     605      925449 :         if( ROP_0 == meRasterOp )
     606           0 :             mpGraphics->SetROPLineColor( SAL_ROP_0 );
     607      925449 :         else if( ROP_1 == meRasterOp )
     608           0 :             mpGraphics->SetROPLineColor( SAL_ROP_1 );
     609      925449 :         else if( ROP_INVERT == meRasterOp )
     610           0 :             mpGraphics->SetROPLineColor( SAL_ROP_INVERT );
     611             :         else
     612      925449 :             mpGraphics->SetLineColor( ImplColorToSal( maLineColor ) );
     613             :     }
     614             :     else
     615      731448 :         mpGraphics->SetLineColor();
     616             : 
     617     1656897 :     mbInitLineColor = false;
     618     1656897 : }
     619             : 
     620             : 
     621      942174 : void OutputDevice::InitFillColor()
     622             : {
     623             :     DBG_TESTSOLARMUTEX();
     624             : 
     625      942174 :     if( mbFillColor )
     626             :     {
     627      932700 :         if( ROP_0 == meRasterOp )
     628           0 :             mpGraphics->SetROPFillColor( SAL_ROP_0 );
     629      932700 :         else if( ROP_1 == meRasterOp )
     630           0 :             mpGraphics->SetROPFillColor( SAL_ROP_1 );
     631      932700 :         else if( ROP_INVERT == meRasterOp )
     632           0 :             mpGraphics->SetROPFillColor( SAL_ROP_INVERT );
     633             :         else
     634      932700 :             mpGraphics->SetFillColor( ImplColorToSal( maFillColor ) );
     635             :     }
     636             :     else
     637        9474 :         mpGraphics->SetFillColor();
     638             : 
     639      942174 :     mbInitFillColor = false;
     640      942174 : }
     641             : 
     642      624776 : void OutputDevice::ImplReleaseFonts()
     643             : {
     644      624776 :     mpGraphics->ReleaseFonts();
     645      624776 :     mbNewFont = true;
     646      624776 :     mbInitFont = true;
     647             : 
     648      624776 :     if ( mpFontEntry )
     649             :     {
     650      154470 :         mpFontCache->Release( mpFontEntry );
     651      154470 :         mpFontEntry = NULL;
     652             :     }
     653             : 
     654      624776 :     if ( mpGetDevFontList )
     655             :     {
     656        7909 :         delete mpGetDevFontList;
     657        7909 :         mpGetDevFontList = NULL;
     658             :     }
     659             : 
     660      624776 :     if ( mpGetDevSizeList )
     661             :     {
     662        1680 :         delete mpGetDevSizeList;
     663        1680 :         mpGetDevSizeList = NULL;
     664             :     }
     665      626009 : }
     666             : 
     667             : 
     668             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10