LCOV - code coverage report
Current view: top level - usr/local/src/libreoffice/vcl/source/gdi - mapmod.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 115 116 99.1 %
Date: 2013-07-09 Functions: 20 20 100.0 %
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 <tools/stream.hxx>
      21             : #include <tools/vcompat.hxx>
      22             : #include <tools/debug.hxx>
      23             : #include <vcl/mapmod.hxx>
      24             : 
      25             : DBG_NAME( MapMode )
      26             : 
      27       15972 : ImplMapMode::ImplMapMode() :
      28             :     maOrigin( 0, 0 ),
      29             :     maScaleX( 1, 1 ),
      30       15972 :     maScaleY( 1, 1 )
      31             : {
      32       15972 :     mnRefCount  = 1;
      33       15972 :     meUnit      = MAP_PIXEL;
      34       15972 :     mbSimple    = sal_False;
      35       15972 : }
      36             : 
      37       34327 : ImplMapMode::ImplMapMode( const ImplMapMode& rImplMapMode ) :
      38             :     maOrigin( rImplMapMode.maOrigin ),
      39             :     maScaleX( rImplMapMode.maScaleX ),
      40       34327 :     maScaleY( rImplMapMode.maScaleY )
      41             : {
      42       34327 :     mnRefCount      = 1;
      43       34327 :     meUnit          = rImplMapMode.meUnit;
      44       34327 :     mbSimple        = sal_False;
      45       34327 : }
      46             : 
      47        2681 : SvStream& operator>>( SvStream& rIStm, ImplMapMode& rImplMapMode )
      48             : {
      49        2681 :     VersionCompat   aCompat( rIStm, STREAM_READ );
      50             :     sal_uInt16          nTmp16;
      51             : 
      52        2681 :     rIStm >> nTmp16; rImplMapMode.meUnit = (MapUnit) nTmp16;
      53        2681 :     rIStm >> rImplMapMode.maOrigin >> rImplMapMode.maScaleX >>
      54        5362 :              rImplMapMode.maScaleY >> rImplMapMode.mbSimple;
      55             : 
      56        2681 :     return rIStm;
      57             : }
      58             : 
      59        2839 : SvStream& operator<<( SvStream& rOStm, const ImplMapMode& rImplMapMode )
      60             : {
      61        2839 :     VersionCompat aCompat( rOStm, STREAM_WRITE, 1 );
      62             : 
      63        2839 :     rOStm << (sal_uInt16) rImplMapMode.meUnit <<
      64        5678 :              rImplMapMode.maOrigin <<
      65        5678 :              rImplMapMode.maScaleX <<
      66        5678 :              rImplMapMode.maScaleY <<
      67        5678 :              rImplMapMode.mbSimple;
      68             : 
      69        2839 :     return rOStm;
      70             : }
      71             : 
      72     3661762 : ImplMapMode* ImplMapMode::ImplGetStaticMapMode( MapUnit eUnit )
      73             : {
      74             :     static long aStaticImplMapModeAry[(MAP_LASTENUMDUMMY)*sizeof(ImplMapMode)/sizeof(long)];
      75             : 
      76             :     // #i19496 check for out-of-bounds
      77     3661762 :      if( eUnit >= MAP_LASTENUMDUMMY )
      78           0 :         return (ImplMapMode*)aStaticImplMapModeAry;
      79             : 
      80     3661762 :     ImplMapMode* pImplMapMode = ((ImplMapMode*)aStaticImplMapModeAry)+eUnit;
      81     3661762 :     if ( !pImplMapMode->mbSimple )
      82             :     {
      83         436 :         Fraction aDefFraction( 1, 1 );
      84         436 :         pImplMapMode->maScaleX  = aDefFraction;
      85         436 :         pImplMapMode->maScaleY  = aDefFraction;
      86         436 :         pImplMapMode->meUnit    = eUnit;
      87         436 :         pImplMapMode->mbSimple  = sal_True;
      88             :     }
      89             : 
      90     3661762 :     return pImplMapMode;
      91             : }
      92             : 
      93      106481 : inline void MapMode::ImplMakeUnique()
      94             : {
      95             :     // If there are other references, copy
      96      106481 :     if ( mpImplMapMode->mnRefCount != 1 )
      97             :     {
      98       34327 :         if ( mpImplMapMode->mnRefCount )
      99       19227 :             mpImplMapMode->mnRefCount--;
     100       34327 :         mpImplMapMode = new ImplMapMode( *mpImplMapMode );
     101             :     }
     102      106481 : }
     103             : 
     104     3173582 : MapMode::MapMode()
     105             : {
     106             :     DBG_CTOR( MapMode, NULL );
     107             : 
     108     3173582 :     mpImplMapMode = ImplMapMode::ImplGetStaticMapMode( MAP_PIXEL );
     109     3173582 : }
     110             : 
     111     2653762 : MapMode::MapMode( const MapMode& rMapMode )
     112             : {
     113             :     DBG_CTOR( MapMode, NULL );
     114             :     DBG_CHKOBJ( &rMapMode, MapMode, NULL );
     115             :     DBG_ASSERT( rMapMode.mpImplMapMode->mnRefCount < 0xFFFFFFFE, "MapMode: RefCount overflow" );
     116             : 
     117             :     // Take over Shared Instance Data and increment refcount
     118     2653762 :     mpImplMapMode = rMapMode.mpImplMapMode;
     119             :     // RefCount == 0 for static objects
     120     2653762 :     if ( mpImplMapMode->mnRefCount )
     121      236110 :         mpImplMapMode->mnRefCount++;
     122     2653762 : }
     123             : 
     124       92033 : MapMode::MapMode( MapUnit eUnit )
     125             : {
     126             :     DBG_CTOR( MapMode, NULL );
     127             : 
     128       92033 :     mpImplMapMode = ImplMapMode::ImplGetStaticMapMode( eUnit );
     129       92033 : }
     130             : 
     131       15972 : MapMode::MapMode( MapUnit eUnit, const Point& rLogicOrg,
     132             :                   const Fraction& rScaleX, const Fraction& rScaleY )
     133             : {
     134             :     DBG_CTOR( MapMode, NULL );
     135             : 
     136       15972 :     mpImplMapMode           = new ImplMapMode;
     137       15972 :     mpImplMapMode->meUnit   = eUnit;
     138       15972 :     mpImplMapMode->maOrigin = rLogicOrg;
     139       15972 :     mpImplMapMode->maScaleX = rScaleX;
     140       15972 :     mpImplMapMode->maScaleY = rScaleY;
     141       15972 : }
     142             : 
     143     5933350 : MapMode::~MapMode()
     144             : {
     145             :     DBG_DTOR( MapMode, NULL );
     146             : 
     147             :     // If it's not static ImpData and it's the last reference, delete it,
     148             :     // else decrement refcounter
     149     5933350 :     if ( mpImplMapMode->mnRefCount )
     150             :     {
     151      280091 :         if ( mpImplMapMode->mnRefCount == 1 )
     152       43452 :             delete mpImplMapMode;
     153             :         else
     154      236639 :             mpImplMapMode->mnRefCount--;
     155             :     }
     156     5933350 : }
     157             : 
     158        3793 : void MapMode::SetMapUnit( MapUnit eUnit )
     159             : {
     160             :     DBG_CHKTHIS( MapMode, NULL );
     161             : 
     162        3793 :     ImplMakeUnique();
     163        3793 :     mpImplMapMode->meUnit = eUnit;
     164        3793 : }
     165             : 
     166       59903 : void MapMode::SetOrigin( const Point& rLogicOrg )
     167             : {
     168             :     DBG_CHKTHIS( MapMode, NULL );
     169             : 
     170       59903 :     ImplMakeUnique();
     171       59903 :     mpImplMapMode->maOrigin = rLogicOrg;
     172       59903 : }
     173             : 
     174       20052 : void MapMode::SetScaleX( const Fraction& rScaleX )
     175             : {
     176             :     DBG_CHKTHIS( MapMode, NULL );
     177             : 
     178       20052 :     ImplMakeUnique();
     179       20052 :     mpImplMapMode->maScaleX = rScaleX;
     180       20052 : }
     181             : 
     182       20052 : void MapMode::SetScaleY( const Fraction& rScaleY )
     183             : {
     184             :     DBG_CHKTHIS( MapMode, NULL );
     185             : 
     186       20052 :     ImplMakeUnique();
     187       20052 :     mpImplMapMode->maScaleY = rScaleY;
     188       20052 : }
     189             : 
     190     2079157 : MapMode& MapMode::operator=( const MapMode& rMapMode )
     191             : {
     192             :     DBG_CHKTHIS( MapMode, NULL );
     193             :     DBG_CHKOBJ( &rMapMode, MapMode, NULL );
     194             :     DBG_ASSERT( rMapMode.mpImplMapMode->mnRefCount < 0xFFFFFFFE, "MapMode: RefCount overflow" );
     195             : 
     196             :     // First increment refcount so that we can reference ourselves
     197             :     // RefCount == 0 for static objects
     198     2079157 :     if ( rMapMode.mpImplMapMode->mnRefCount )
     199       55670 :         rMapMode.mpImplMapMode->mnRefCount++;
     200             : 
     201             :     // If it's not static ImpData and it's the last reference, delete it,
     202             :     // else decrement refcounter
     203     2079157 :     if ( mpImplMapMode->mnRefCount )
     204             :     {
     205       42728 :         if ( mpImplMapMode->mnRefCount == 1 )
     206        6816 :             delete mpImplMapMode;
     207             :         else
     208       35912 :             mpImplMapMode->mnRefCount--;
     209             :     }
     210             : 
     211     2079157 :     mpImplMapMode = rMapMode.mpImplMapMode;
     212             : 
     213     2079157 :     return *this;
     214             : }
     215             : 
     216      286071 : sal_Bool MapMode::operator==( const MapMode& rMapMode ) const
     217             : {
     218             :     DBG_CHKTHIS( MapMode, NULL );
     219             :     DBG_CHKOBJ( &rMapMode, MapMode, NULL );
     220             : 
     221      286071 :     if ( mpImplMapMode == rMapMode.mpImplMapMode )
     222      119886 :         return sal_True;
     223             : 
     224      387345 :     if ( (mpImplMapMode->meUnit   == rMapMode.mpImplMapMode->meUnit)   &&
     225       98081 :          (mpImplMapMode->maOrigin == rMapMode.mpImplMapMode->maOrigin) &&
     226      251683 :          (mpImplMapMode->maScaleX == rMapMode.mpImplMapMode->maScaleX) &&
     227       42392 :          (mpImplMapMode->maScaleY == rMapMode.mpImplMapMode->maScaleY) )
     228       42254 :         return sal_True;
     229             :     else
     230      123931 :         return sal_False;
     231             : }
     232             : 
     233      396147 : sal_Bool MapMode::IsDefault() const
     234             : {
     235             :     DBG_CHKTHIS( MapMode, NULL );
     236             : 
     237      396147 :     ImplMapMode* pDefMapMode = ImplMapMode::ImplGetStaticMapMode( MAP_PIXEL );
     238      396147 :     if ( mpImplMapMode == pDefMapMode )
     239       10677 :         return sal_True;
     240             : 
     241      790170 :     if ( (mpImplMapMode->meUnit   == pDefMapMode->meUnit)   &&
     242       19526 :          (mpImplMapMode->maOrigin == pDefMapMode->maOrigin) &&
     243      385784 :          (mpImplMapMode->maScaleX == pDefMapMode->maScaleX) &&
     244          18 :          (mpImplMapMode->maScaleY == pDefMapMode->maScaleY) )
     245          18 :         return sal_True;
     246             :     else
     247      385452 :         return sal_False;
     248             : }
     249             : 
     250        2681 : SvStream& operator>>( SvStream& rIStm, MapMode& rMapMode )
     251             : {
     252        2681 :     rMapMode.ImplMakeUnique();
     253        2681 :     return (rIStm >> *rMapMode.mpImplMapMode);
     254             : }
     255             : 
     256        2839 : SvStream& operator<<( SvStream& rOStm, const MapMode& rMapMode )
     257             : {
     258        2839 :     return (rOStm << *rMapMode.mpImplMapMode);
     259             : }
     260             : 
     261             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10