LCOV - code coverage report
Current view: top level - libreoffice/vcl/source/gdi - mapmod.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 111 116 95.7 %
Date: 2012-12-27 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             : // =======================================================================
      26             : 
      27             : DBG_NAME( MapMode )
      28             : 
      29             : // -----------------------------------------------------------------------
      30             : 
      31        2917 : ImplMapMode::ImplMapMode() :
      32             :     maOrigin( 0, 0 ),
      33             :     maScaleX( 1, 1 ),
      34        2917 :     maScaleY( 1, 1 )
      35             : {
      36        2917 :     mnRefCount  = 1;
      37        2917 :     meUnit      = MAP_PIXEL;
      38        2917 :     mbSimple    = sal_False;
      39        2917 : }
      40             : 
      41             : // -----------------------------------------------------------------------
      42             : 
      43        6575 : ImplMapMode::ImplMapMode( const ImplMapMode& rImplMapMode ) :
      44             :     maOrigin( rImplMapMode.maOrigin ),
      45             :     maScaleX( rImplMapMode.maScaleX ),
      46        6575 :     maScaleY( rImplMapMode.maScaleY )
      47             : {
      48        6575 :     mnRefCount      = 1;
      49        6575 :     meUnit          = rImplMapMode.meUnit;
      50        6575 :     mbSimple        = sal_False;
      51        6575 : }
      52             : 
      53             : // -----------------------------------------------------------------------
      54             : 
      55        2289 : SvStream& operator>>( SvStream& rIStm, ImplMapMode& rImplMapMode )
      56             : {
      57        2289 :     VersionCompat   aCompat( rIStm, STREAM_READ );
      58             :     sal_uInt16          nTmp16;
      59             : 
      60        2289 :     rIStm >> nTmp16; rImplMapMode.meUnit = (MapUnit) nTmp16;
      61        2289 :     rIStm >> rImplMapMode.maOrigin >> rImplMapMode.maScaleX >>
      62        4578 :              rImplMapMode.maScaleY >> rImplMapMode.mbSimple;
      63             : 
      64        2289 :     return rIStm;
      65             : }
      66             : 
      67             : // -----------------------------------------------------------------------
      68             : 
      69        2454 : SvStream& operator<<( SvStream& rOStm, const ImplMapMode& rImplMapMode )
      70             : {
      71        2454 :     VersionCompat aCompat( rOStm, STREAM_WRITE, 1 );
      72             : 
      73        2454 :     rOStm << (sal_uInt16) rImplMapMode.meUnit <<
      74        4908 :              rImplMapMode.maOrigin <<
      75        4908 :              rImplMapMode.maScaleX <<
      76        4908 :              rImplMapMode.maScaleY <<
      77        4908 :              rImplMapMode.mbSimple;
      78             : 
      79        2454 :     return rOStm;
      80             : }
      81             : 
      82             : // -----------------------------------------------------------------------
      83             : 
      84      221306 : ImplMapMode* ImplMapMode::ImplGetStaticMapMode( MapUnit eUnit )
      85             : {
      86             :     static long aStaticImplMapModeAry[(MAP_LASTENUMDUMMY)*sizeof(ImplMapMode)/sizeof(long)];
      87             : 
      88             :     // #i19496 check for out-of-bounds
      89      221306 :      if( eUnit >= MAP_LASTENUMDUMMY )
      90           0 :         return (ImplMapMode*)aStaticImplMapModeAry;
      91             : 
      92      221306 :     ImplMapMode* pImplMapMode = ((ImplMapMode*)aStaticImplMapModeAry)+eUnit;
      93      221306 :     if ( !pImplMapMode->mbSimple )
      94             :     {
      95          86 :         Fraction aDefFraction( 1, 1 );
      96          86 :         pImplMapMode->maScaleX  = aDefFraction;
      97          86 :         pImplMapMode->maScaleY  = aDefFraction;
      98          86 :         pImplMapMode->meUnit    = eUnit;
      99          86 :         pImplMapMode->mbSimple  = sal_True;
     100             :     }
     101             : 
     102      221306 :     return pImplMapMode;
     103             : }
     104             : 
     105             : // -----------------------------------------------------------------------
     106             : 
     107       11987 : inline void MapMode::ImplMakeUnique()
     108             : {
     109             :     // Falls noch andere Referenzen bestehen, dann kopieren
     110       11987 :     if ( mpImplMapMode->mnRefCount != 1 )
     111             :     {
     112        6575 :         if ( mpImplMapMode->mnRefCount )
     113         575 :             mpImplMapMode->mnRefCount--;
     114        6575 :         mpImplMapMode = new ImplMapMode( *mpImplMapMode );
     115             :     }
     116       11987 : }
     117             : 
     118             : // -----------------------------------------------------------------------
     119             : 
     120      124442 : MapMode::MapMode()
     121             : {
     122             :     DBG_CTOR( MapMode, NULL );
     123             : 
     124      124442 :     mpImplMapMode = ImplMapMode::ImplGetStaticMapMode( MAP_PIXEL );
     125      124442 : }
     126             : 
     127             : // -----------------------------------------------------------------------
     128             : 
     129       99880 : MapMode::MapMode( const MapMode& rMapMode )
     130             : {
     131             :     DBG_CTOR( MapMode, NULL );
     132             :     DBG_CHKOBJ( &rMapMode, MapMode, NULL );
     133             :     DBG_ASSERT( rMapMode.mpImplMapMode->mnRefCount < 0xFFFFFFFE, "MapMode: RefCount overflow" );
     134             : 
     135             :     // shared Instance Daten uebernehmen und Referenzcounter erhoehen
     136       99880 :     mpImplMapMode = rMapMode.mpImplMapMode;
     137             :     // RefCount == 0 fuer statische Objekte
     138       99880 :     if ( mpImplMapMode->mnRefCount )
     139       26271 :         mpImplMapMode->mnRefCount++;
     140       99880 : }
     141             : 
     142             : // -----------------------------------------------------------------------
     143             : 
     144       18103 : MapMode::MapMode( MapUnit eUnit )
     145             : {
     146             :     DBG_CTOR( MapMode, NULL );
     147             : 
     148       18103 :     mpImplMapMode = ImplMapMode::ImplGetStaticMapMode( eUnit );
     149       18103 : }
     150             : 
     151             : // -----------------------------------------------------------------------
     152             : 
     153        2917 : MapMode::MapMode( MapUnit eUnit, const Point& rLogicOrg,
     154             :                   const Fraction& rScaleX, const Fraction& rScaleY )
     155             : {
     156             :     DBG_CTOR( MapMode, NULL );
     157             : 
     158        2917 :     mpImplMapMode           = new ImplMapMode;
     159        2917 :     mpImplMapMode->meUnit   = eUnit;
     160        2917 :     mpImplMapMode->maOrigin = rLogicOrg;
     161        2917 :     mpImplMapMode->maScaleX = rScaleX;
     162        2917 :     mpImplMapMode->maScaleY = rScaleY;
     163        2917 : }
     164             : 
     165             : // -----------------------------------------------------------------------
     166             : 
     167      233902 : MapMode::~MapMode()
     168             : {
     169             :     DBG_DTOR( MapMode, NULL );
     170             : 
     171             :     // Wenn es keine statischen ImpDaten sind, dann loeschen, wenn es
     172             :     // die letzte Referenz ist, sonst Referenzcounter decrementieren
     173      233902 :     if ( mpImplMapMode->mnRefCount )
     174             :     {
     175       38796 :         if ( mpImplMapMode->mnRefCount == 1 )
     176        8477 :             delete mpImplMapMode;
     177             :         else
     178       30319 :             mpImplMapMode->mnRefCount--;
     179             :     }
     180      233902 : }
     181             : 
     182             : // -----------------------------------------------------------------------
     183             : 
     184        1185 : void MapMode::SetMapUnit( MapUnit eUnit )
     185             : {
     186             :     DBG_CHKTHIS( MapMode, NULL );
     187             : 
     188        1185 :     ImplMakeUnique();
     189        1185 :     mpImplMapMode->meUnit = eUnit;
     190        1185 : }
     191             : 
     192             : // -----------------------------------------------------------------------
     193             : 
     194        3353 : void MapMode::SetOrigin( const Point& rLogicOrg )
     195             : {
     196             :     DBG_CHKTHIS( MapMode, NULL );
     197             : 
     198        3353 :     ImplMakeUnique();
     199        3353 :     mpImplMapMode->maOrigin = rLogicOrg;
     200        3353 : }
     201             : 
     202             : // -----------------------------------------------------------------------
     203             : 
     204        2580 : void MapMode::SetScaleX( const Fraction& rScaleX )
     205             : {
     206             :     DBG_CHKTHIS( MapMode, NULL );
     207             : 
     208        2580 :     ImplMakeUnique();
     209        2580 :     mpImplMapMode->maScaleX = rScaleX;
     210        2580 : }
     211             : 
     212             : // -----------------------------------------------------------------------
     213             : 
     214        2580 : void MapMode::SetScaleY( const Fraction& rScaleY )
     215             : {
     216             :     DBG_CHKTHIS( MapMode, NULL );
     217             : 
     218        2580 :     ImplMakeUnique();
     219        2580 :     mpImplMapMode->maScaleY = rScaleY;
     220        2580 : }
     221             : 
     222             : // -----------------------------------------------------------------------
     223             : 
     224       62253 : MapMode& MapMode::operator=( const MapMode& rMapMode )
     225             : {
     226             :     DBG_CHKTHIS( MapMode, NULL );
     227             :     DBG_CHKOBJ( &rMapMode, MapMode, NULL );
     228             :     DBG_ASSERT( rMapMode.mpImplMapMode->mnRefCount < 0xFFFFFFFE, "MapMode: RefCount overflow" );
     229             : 
     230             :     // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann
     231             :     // RefCount == 0 fuer statische Objekte
     232       62253 :     if ( rMapMode.mpImplMapMode->mnRefCount )
     233        6045 :         rMapMode.mpImplMapMode->mnRefCount++;
     234             : 
     235             :     // Wenn es keine statischen ImpDaten sind, dann loeschen, wenn es
     236             :     // die letzte Referenz ist, sonst Referenzcounter decrementieren
     237       62253 :     if ( mpImplMapMode->mnRefCount )
     238             :     {
     239        1749 :         if ( mpImplMapMode->mnRefCount == 1 )
     240         374 :             delete mpImplMapMode;
     241             :         else
     242        1375 :             mpImplMapMode->mnRefCount--;
     243             :     }
     244             : 
     245       62253 :     mpImplMapMode = rMapMode.mpImplMapMode;
     246             : 
     247       62253 :     return *this;
     248             : }
     249             : 
     250             : // -----------------------------------------------------------------------
     251             : 
     252       73165 : sal_Bool MapMode::operator==( const MapMode& rMapMode ) const
     253             : {
     254             :     DBG_CHKTHIS( MapMode, NULL );
     255             :     DBG_CHKOBJ( &rMapMode, MapMode, NULL );
     256             : 
     257       73165 :     if ( mpImplMapMode == rMapMode.mpImplMapMode )
     258       52636 :         return sal_True;
     259             : 
     260       46340 :     if ( (mpImplMapMode->meUnit   == rMapMode.mpImplMapMode->meUnit)   &&
     261        8660 :          (mpImplMapMode->maOrigin == rMapMode.mpImplMapMode->maOrigin) &&
     262        8592 :          (mpImplMapMode->maScaleX == rMapMode.mpImplMapMode->maScaleX) &&
     263        8559 :          (mpImplMapMode->maScaleY == rMapMode.mpImplMapMode->maScaleY) )
     264        8559 :         return sal_True;
     265             :     else
     266       11970 :         return sal_False;
     267             : }
     268             : 
     269             : // -----------------------------------------------------------------------
     270             : 
     271       78761 : sal_Bool MapMode::IsDefault() const
     272             : {
     273             :     DBG_CHKTHIS( MapMode, NULL );
     274             : 
     275       78761 :     ImplMapMode* pDefMapMode = ImplMapMode::ImplGetStaticMapMode( MAP_PIXEL );
     276       78761 :     if ( mpImplMapMode == pDefMapMode )
     277         129 :         return sal_True;
     278             : 
     279       78632 :     if ( (mpImplMapMode->meUnit   == pDefMapMode->meUnit)   &&
     280           0 :          (mpImplMapMode->maOrigin == pDefMapMode->maOrigin) &&
     281           0 :          (mpImplMapMode->maScaleX == pDefMapMode->maScaleX) &&
     282           0 :          (mpImplMapMode->maScaleY == pDefMapMode->maScaleY) )
     283           0 :         return sal_True;
     284             :     else
     285       78632 :         return sal_False;
     286             : }
     287             : 
     288             : // -----------------------------------------------------------------------
     289             : 
     290        2289 : SvStream& operator>>( SvStream& rIStm, MapMode& rMapMode )
     291             : {
     292        2289 :     rMapMode.ImplMakeUnique();
     293        2289 :     return (rIStm >> *rMapMode.mpImplMapMode);
     294             : }
     295             : 
     296             : // -----------------------------------------------------------------------
     297             : 
     298        2454 : SvStream& operator<<( SvStream& rOStm, const MapMode& rMapMode )
     299             : {
     300        2454 :     return (rOStm << *rMapMode.mpImplMapMode);
     301             : }
     302             : 
     303             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10