LCOV - code coverage report
Current view: top level - vcl/source/gdi - outmap.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 1 965 0.1 %
Date: 2014-04-14 Functions: 2 79 2.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 <limits.h>
      21             : 
      22             : #include <tools/bigint.hxx>
      23             : #include <tools/debug.hxx>
      24             : #include <tools/poly.hxx>
      25             : 
      26             : #include <vcl/virdev.hxx>
      27             : #include <vcl/region.hxx>
      28             : #include <vcl/wrkwin.hxx>
      29             : #include <vcl/cursor.hxx>
      30             : #include <vcl/metaact.hxx>
      31             : #include <vcl/gdimtf.hxx>
      32             : #include <vcl/lineinfo.hxx>
      33             : #include <vcl/outdev.hxx>
      34             : 
      35             : #include <svdata.hxx>
      36             : #include <window.h>
      37             : #include <outdev.h>
      38             : #include <salgdi.hxx>
      39             : 
      40             : #include <basegfx/matrix/b2dhommatrix.hxx>
      41             : #include <basegfx/polygon/b2dpolygon.hxx>
      42             : #include <basegfx/polygon/b2dpolypolygon.hxx>
      43             : 
      44             : static int const s_ImplArySize = MAP_PIXEL+1;
      45             : static const long aImplNumeratorAry[s_ImplArySize] =
      46             :     {    1,   1,   5,  50,    1,   1,  1, 1,  1,    1, 1 };
      47             : static const long aImplDenominatorAry[s_ImplArySize] =
      48             :      { 2540, 254, 127, 127, 1000, 100, 10, 1, 72, 1440, 1 };
      49             : 
      50             : /*
      51             : Reduces accuracy until it is a fraction (should become
      52             : ctor fraction once); we could also do this with BigInts
      53             : */
      54             : 
      55           0 : static Fraction ImplMakeFraction( long nN1, long nN2, long nD1, long nD2 )
      56             : {
      57           0 :     long i = 1;
      58             : 
      59           0 :     if ( nN1 < 0 ) { i = -i; nN1 = -nN1; }
      60           0 :     if ( nN2 < 0 ) { i = -i; nN2 = -nN2; }
      61           0 :     if ( nD1 < 0 ) { i = -i; nD1 = -nD1; }
      62           0 :     if ( nD2 < 0 ) { i = -i; nD2 = -nD2; }
      63             :     // all positive; i sign
      64             : 
      65           0 :     Fraction aF( i*nN1, nD1 );
      66           0 :     aF *= Fraction( nN2, nD2 );
      67             : 
      68           0 :     if( nD1 == 0 || nD2 == 0 ) //under these bad circumstances the following while loop will be endless
      69             :     {
      70             :         DBG_ASSERT(false,"Invalid parameter for ImplMakeFraction");
      71           0 :         return Fraction( 1, 1 );
      72             :     }
      73             : 
      74           0 :     while ( aF.GetDenominator() == -1 )
      75             :     {
      76           0 :         if ( nN1 > nN2 )
      77           0 :             nN1 = (nN1 + 1) / 2;
      78             :         else
      79           0 :             nN2 = (nN2 + 1) / 2;
      80           0 :         if ( nD1 > nD2 )
      81           0 :             nD1 = (nD1 + 1) / 2;
      82             :         else
      83           0 :             nD2 = (nD2 + 1) / 2;
      84             : 
      85           0 :         aF = Fraction( i*nN1, nD1 );
      86           0 :         aF *= Fraction( nN2, nD2 );
      87             :     }
      88             : 
      89           0 :     return aF;
      90             : }
      91             : 
      92             : // Fraction.GetNumerator()
      93             : // Fraction.GetDenominator()    > 0
      94             : // rOutRes.nPixPerInch?         > 0
      95             : // rMapRes.nMapScNum?
      96             : // rMapRes.nMapScDenom?         > 0
      97             : 
      98           0 : static void ImplCalcBigIntThreshold( long nDPIX, long nDPIY,
      99             :                                      const ImplMapRes& rMapRes,
     100             :                                      ImplThresholdRes& rThresRes )
     101             : {
     102           0 :     if ( nDPIX && (LONG_MAX / nDPIX < std::abs( rMapRes.mnMapScNumX ) ) ) // #111139# avoid div by zero
     103             :     {
     104           0 :         rThresRes.mnThresLogToPixX = 0;
     105           0 :         rThresRes.mnThresPixToLogX = 0;
     106             :     }
     107             :     else
     108             :     {
     109             :         // calculate thresholds for BigInt arithmetic
     110           0 :         long    nDenomHalfX = rMapRes.mnMapScDenomX / 2;
     111           0 :         sal_uLong   nDenomX     = rMapRes.mnMapScDenomX;
     112           0 :         long    nProductX   = nDPIX * rMapRes.mnMapScNumX;
     113             : 
     114           0 :         if ( !nProductX )
     115           0 :             rThresRes.mnThresLogToPixX = LONG_MAX;
     116             :         else
     117           0 :             rThresRes.mnThresLogToPixX = std::abs( (LONG_MAX - nDenomHalfX) / nProductX );
     118             : 
     119           0 :         if ( !nDenomX )
     120           0 :             rThresRes.mnThresPixToLogX = LONG_MAX;
     121           0 :         else if ( nProductX >= 0 )
     122           0 :             rThresRes.mnThresPixToLogX = (long)(((sal_uLong)LONG_MAX - (sal_uLong)( nProductX/2)) / nDenomX);
     123             :         else
     124           0 :             rThresRes.mnThresPixToLogX = (long)(((sal_uLong)LONG_MAX + (sal_uLong)(-nProductX/2)) / nDenomX);
     125             :     }
     126             : 
     127           0 :     if ( nDPIY && (LONG_MAX / nDPIY < std::abs( rMapRes.mnMapScNumY ) ) ) // #111139# avoid div by zero
     128             :     {
     129           0 :         rThresRes.mnThresLogToPixY = 0;
     130           0 :         rThresRes.mnThresPixToLogY = 0;
     131             :     }
     132             :     else
     133             :     {
     134             :         // calculate thresholds for BigInt arithmetic
     135           0 :         long    nDenomHalfY = rMapRes.mnMapScDenomY / 2;
     136           0 :         sal_uLong   nDenomY     = rMapRes.mnMapScDenomY;
     137           0 :         long    nProductY   = nDPIY * rMapRes.mnMapScNumY;
     138             : 
     139           0 :         if ( !nProductY )
     140           0 :             rThresRes.mnThresLogToPixY = LONG_MAX;
     141             :         else
     142           0 :             rThresRes.mnThresLogToPixY = std::abs( (LONG_MAX - nDenomHalfY) / nProductY );
     143             : 
     144           0 :         if ( !nDenomY )
     145           0 :             rThresRes.mnThresPixToLogY = LONG_MAX;
     146           0 :         else if ( nProductY >= 0 )
     147           0 :             rThresRes.mnThresPixToLogY = (long)(((sal_uLong)LONG_MAX - (sal_uLong)( nProductY/2)) / nDenomY);
     148             :         else
     149           0 :             rThresRes.mnThresPixToLogY = (long)(((sal_uLong)LONG_MAX + (sal_uLong)(-nProductY/2)) / nDenomY);
     150             :     }
     151             : 
     152           0 :     rThresRes.mnThresLogToPixX /= 2;
     153           0 :     rThresRes.mnThresLogToPixY /= 2;
     154           0 :     rThresRes.mnThresPixToLogX /= 2;
     155           0 :     rThresRes.mnThresPixToLogY /= 2;
     156           0 : }
     157             : 
     158           0 : static void ImplCalcMapResolution( const MapMode& rMapMode,
     159             :                                    long nDPIX, long nDPIY, ImplMapRes& rMapRes )
     160             : {
     161           0 :     switch ( rMapMode.GetMapUnit() )
     162             :     {
     163             :         case MAP_RELATIVE:
     164           0 :             break;
     165             :         case MAP_100TH_MM:
     166           0 :             rMapRes.mnMapScNumX   = 1;
     167           0 :             rMapRes.mnMapScDenomX = 2540;
     168           0 :             rMapRes.mnMapScNumY   = 1;
     169           0 :             rMapRes.mnMapScDenomY = 2540;
     170           0 :             break;
     171             :         case MAP_10TH_MM:
     172           0 :             rMapRes.mnMapScNumX   = 1;
     173           0 :             rMapRes.mnMapScDenomX = 254;
     174           0 :             rMapRes.mnMapScNumY   = 1;
     175           0 :             rMapRes.mnMapScDenomY = 254;
     176           0 :             break;
     177             :         case MAP_MM:
     178           0 :             rMapRes.mnMapScNumX   = 5;      // 10
     179           0 :             rMapRes.mnMapScDenomX = 127;    // 254
     180           0 :             rMapRes.mnMapScNumY   = 5;      // 10
     181           0 :             rMapRes.mnMapScDenomY = 127;    // 254
     182           0 :             break;
     183             :         case MAP_CM:
     184           0 :             rMapRes.mnMapScNumX   = 50;     // 100
     185           0 :             rMapRes.mnMapScDenomX = 127;    // 254
     186           0 :             rMapRes.mnMapScNumY   = 50;     // 100
     187           0 :             rMapRes.mnMapScDenomY = 127;    // 254
     188           0 :             break;
     189             :         case MAP_1000TH_INCH:
     190           0 :             rMapRes.mnMapScNumX   = 1;
     191           0 :             rMapRes.mnMapScDenomX = 1000;
     192           0 :             rMapRes.mnMapScNumY   = 1;
     193           0 :             rMapRes.mnMapScDenomY = 1000;
     194           0 :             break;
     195             :         case MAP_100TH_INCH:
     196           0 :             rMapRes.mnMapScNumX   = 1;
     197           0 :             rMapRes.mnMapScDenomX = 100;
     198           0 :             rMapRes.mnMapScNumY   = 1;
     199           0 :             rMapRes.mnMapScDenomY = 100;
     200           0 :             break;
     201             :         case MAP_10TH_INCH:
     202           0 :             rMapRes.mnMapScNumX   = 1;
     203           0 :             rMapRes.mnMapScDenomX = 10;
     204           0 :             rMapRes.mnMapScNumY   = 1;
     205           0 :             rMapRes.mnMapScDenomY = 10;
     206           0 :             break;
     207             :         case MAP_INCH:
     208           0 :             rMapRes.mnMapScNumX   = 1;
     209           0 :             rMapRes.mnMapScDenomX = 1;
     210           0 :             rMapRes.mnMapScNumY   = 1;
     211           0 :             rMapRes.mnMapScDenomY = 1;
     212           0 :             break;
     213             :         case MAP_POINT:
     214           0 :             rMapRes.mnMapScNumX   = 1;
     215           0 :             rMapRes.mnMapScDenomX = 72;
     216           0 :             rMapRes.mnMapScNumY   = 1;
     217           0 :             rMapRes.mnMapScDenomY = 72;
     218           0 :             break;
     219             :         case MAP_TWIP:
     220           0 :             rMapRes.mnMapScNumX   = 1;
     221           0 :             rMapRes.mnMapScDenomX = 1440;
     222           0 :             rMapRes.mnMapScNumY   = 1;
     223           0 :             rMapRes.mnMapScDenomY = 1440;
     224           0 :             break;
     225             :         case MAP_PIXEL:
     226           0 :             rMapRes.mnMapScNumX   = 1;
     227           0 :             rMapRes.mnMapScDenomX = nDPIX;
     228           0 :             rMapRes.mnMapScNumY   = 1;
     229           0 :             rMapRes.mnMapScDenomY = nDPIY;
     230           0 :             break;
     231             :         case MAP_SYSFONT:
     232             :         case MAP_APPFONT:
     233             :             {
     234           0 :             ImplSVData* pSVData = ImplGetSVData();
     235           0 :             if ( !pSVData->maGDIData.mnAppFontX )
     236             :             {
     237           0 :                 if( pSVData->maWinData.mpFirstFrame )
     238           0 :                     Window::ImplInitAppFontData( pSVData->maWinData.mpFirstFrame );
     239             :                 else
     240             :                 {
     241           0 :                     WorkWindow* pWin = new WorkWindow( NULL, 0 );
     242           0 :                     Window::ImplInitAppFontData( pWin );
     243           0 :                     delete pWin;
     244             :                 }
     245             :             }
     246           0 :             rMapRes.mnMapScNumX   = pSVData->maGDIData.mnAppFontX;
     247           0 :             rMapRes.mnMapScDenomX = nDPIX * 40;
     248           0 :             rMapRes.mnMapScNumY   = pSVData->maGDIData.mnAppFontY;
     249           0 :             rMapRes.mnMapScDenomY = nDPIY * 80;
     250             :             }
     251           0 :             break;
     252             :         default:
     253             :             OSL_FAIL( "unhandled MapUnit" );
     254           0 :             break;
     255             :     }
     256             : 
     257           0 :     Fraction aScaleX = rMapMode.GetScaleX();
     258           0 :     Fraction aScaleY = rMapMode.GetScaleY();
     259             : 
     260             :     // set offset according to MapMode
     261           0 :     Point aOrigin = rMapMode.GetOrigin();
     262           0 :     if ( rMapMode.GetMapUnit() != MAP_RELATIVE )
     263             :     {
     264           0 :         rMapRes.mnMapOfsX = aOrigin.X();
     265           0 :         rMapRes.mnMapOfsY = aOrigin.Y();
     266             :     }
     267             :     else
     268             :     {
     269           0 :         BigInt aX( rMapRes.mnMapOfsX );
     270           0 :         aX *= BigInt( aScaleX.GetDenominator() );
     271           0 :         if ( rMapRes.mnMapOfsX >= 0 )
     272             :         {
     273           0 :             if ( aScaleX.GetNumerator() >= 0 )
     274           0 :                 aX += BigInt( aScaleX.GetNumerator()/2 );
     275             :             else
     276           0 :                 aX -= BigInt( (aScaleX.GetNumerator()+1)/2 );
     277             :         }
     278             :         else
     279             :         {
     280           0 :             if ( aScaleX.GetNumerator() >= 0 )
     281           0 :                 aX -= BigInt( (aScaleX.GetNumerator()-1)/2 );
     282             :             else
     283           0 :                 aX += BigInt( aScaleX.GetNumerator()/2 );
     284             :         }
     285           0 :         aX /= BigInt( aScaleX.GetNumerator() );
     286           0 :         rMapRes.mnMapOfsX = (long)aX + aOrigin.X();
     287           0 :         BigInt aY( rMapRes.mnMapOfsY );
     288           0 :         aY *= BigInt( aScaleY.GetDenominator() );
     289           0 :         if( rMapRes.mnMapOfsY >= 0 )
     290             :         {
     291           0 :             if ( aScaleY.GetNumerator() >= 0 )
     292           0 :                 aY += BigInt( aScaleY.GetNumerator()/2 );
     293             :             else
     294           0 :                 aY -= BigInt( (aScaleY.GetNumerator()+1)/2 );
     295             :         }
     296             :         else
     297             :         {
     298           0 :             if ( aScaleY.GetNumerator() >= 0 )
     299           0 :                 aY -= BigInt( (aScaleY.GetNumerator()-1)/2 );
     300             :             else
     301           0 :                 aY += BigInt( aScaleY.GetNumerator()/2 );
     302             :         }
     303           0 :         aY /= BigInt( aScaleY.GetNumerator() );
     304           0 :         rMapRes.mnMapOfsY = (long)aY + aOrigin.Y();
     305             :     }
     306             : 
     307             :     // calculate scaling factor according to MapMode
     308             :     // aTemp? = rMapRes.mnMapSc? * aScale?
     309             :     Fraction aTempX = ImplMakeFraction( rMapRes.mnMapScNumX,
     310             :                                         aScaleX.GetNumerator(),
     311             :                                         rMapRes.mnMapScDenomX,
     312           0 :                                         aScaleX.GetDenominator() );
     313             :     Fraction aTempY = ImplMakeFraction( rMapRes.mnMapScNumY,
     314             :                                         aScaleY.GetNumerator(),
     315             :                                         rMapRes.mnMapScDenomY,
     316           0 :                                         aScaleY.GetDenominator() );
     317           0 :     rMapRes.mnMapScNumX   = aTempX.GetNumerator();
     318           0 :     rMapRes.mnMapScDenomX = aTempX.GetDenominator();
     319           0 :     rMapRes.mnMapScNumY   = aTempY.GetNumerator();
     320           0 :     rMapRes.mnMapScDenomY = aTempY.GetDenominator();
     321             : 
     322             :     // hack: 0/n approximately 1/max
     323           0 :     if ( !rMapRes.mnMapScNumX )
     324             :     {
     325           0 :         rMapRes.mnMapScNumX = 1;
     326           0 :         rMapRes.mnMapScDenomX = LONG_MAX;
     327             :     }
     328           0 :     if ( !rMapRes.mnMapScNumY )
     329             :     {
     330           0 :         rMapRes.mnMapScNumY = 1;
     331           0 :         rMapRes.mnMapScDenomY = LONG_MAX;
     332             :     }
     333           0 : }
     334             : 
     335           0 : inline void ImplCalcMapResolution( const MapMode& rMapMode,
     336             :                                    long nDPIX, long nDPIY,
     337             :                                    ImplMapRes& rMapRes,
     338             :                                    ImplThresholdRes& rThresRes )
     339             : {
     340           0 :     ImplCalcMapResolution( rMapMode, nDPIX, nDPIY, rMapRes );
     341           0 :     ImplCalcBigIntThreshold( nDPIX, nDPIY, rMapRes, rThresRes );
     342           0 : }
     343             : 
     344           0 : static long ImplLogicToPixel( long n, long nDPI, long nMapNum, long nMapDenom,
     345             :                               long nThres )
     346             : {
     347             :     // To "use" it...
     348             :     (void) nThres;
     349             : #if (SAL_TYPES_SIZEOFLONG < 8)
     350           0 :     if( (+n < nThres) && (-n < nThres) )
     351             :     {
     352           0 :        n *= nMapNum * nDPI;
     353           0 :        if( nMapDenom != 1 )
     354             :        {
     355           0 :           n = (2 * n) / nMapDenom;
     356           0 :           if( n < 0 ) --n; else ++n;
     357           0 :           n /= 2;
     358             :        }
     359             :     }
     360             :     else
     361             : #endif
     362             :     {
     363           0 :        sal_Int64 n64 = n;
     364           0 :        n64 *= nMapNum;
     365           0 :        n64 *= nDPI;
     366           0 :        if( nMapDenom == 1 )
     367           0 :           n = (long)n64;
     368             :        else
     369             :        {
     370           0 :           n = (long)(2 * n64 / nMapDenom);
     371           0 :           if( n < 0 ) --n; else ++n;
     372           0 :           n /= 2;
     373             :        }
     374             :     }
     375           0 :     return n;
     376             : }
     377             : 
     378           0 : static long ImplPixelToLogic( long n, long nDPI, long nMapNum, long nMapDenom,
     379             :                               long nThres )
     380             : {
     381             :     // To "use" it...
     382             :    (void) nThres;
     383             : #if (SAL_TYPES_SIZEOFLONG < 8)
     384           0 :     if( (+n < nThres) && (-n < nThres) )
     385           0 :         n = (2 * n * nMapDenom) / (nDPI * nMapNum);
     386             :     else
     387             : #endif
     388             :     {
     389           0 :         sal_Int64 n64 = n;
     390           0 :         n64 *= nMapDenom;
     391           0 :         long nDenom  = nDPI * nMapNum;
     392           0 :         n = (long)(2 * n64 / nDenom);
     393             :     }
     394           0 :     if( n < 0 ) --n; else ++n;
     395           0 :     return (n / 2);
     396             : }
     397             : 
     398           0 : long OutputDevice::ImplLogicXToDevicePixel( long nX ) const
     399             : {
     400           0 :     if ( !mbMap )
     401           0 :         return nX+mnOutOffX;
     402             : 
     403             :     return ImplLogicToPixel( nX + maMapRes.mnMapOfsX, mnDPIX,
     404             :                              maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     405           0 :                              maThresRes.mnThresLogToPixX )+mnOutOffX+mnOutOffOrigX;
     406             : }
     407             : 
     408           0 : long OutputDevice::ImplLogicYToDevicePixel( long nY ) const
     409             : {
     410           0 :     if ( !mbMap )
     411           0 :         return nY+mnOutOffY;
     412             : 
     413             :     return ImplLogicToPixel( nY + maMapRes.mnMapOfsY, mnDPIY,
     414             :                              maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     415           0 :                              maThresRes.mnThresLogToPixY )+mnOutOffY+mnOutOffOrigY;
     416             : }
     417             : 
     418           0 : long OutputDevice::ImplLogicWidthToDevicePixel( long nWidth ) const
     419             : {
     420           0 :     if ( !mbMap )
     421           0 :         return nWidth;
     422             : 
     423             :     return ImplLogicToPixel( nWidth, mnDPIX,
     424             :                              maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     425           0 :                              maThresRes.mnThresLogToPixX );
     426             : }
     427             : 
     428           0 : long OutputDevice::ImplLogicHeightToDevicePixel( long nHeight ) const
     429             : {
     430           0 :     if ( !mbMap )
     431           0 :         return nHeight;
     432             : 
     433             :     return ImplLogicToPixel( nHeight, mnDPIY,
     434             :                              maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     435           0 :                              maThresRes.mnThresLogToPixY );
     436             : }
     437             : 
     438           0 : float OutputDevice::ImplFloatLogicHeightToDevicePixel( float fLogicHeight) const
     439             : {
     440           0 :     if( !mbMap)
     441           0 :         return fLogicHeight;
     442           0 :     float fPixelHeight = (fLogicHeight * mnDPIY * maMapRes.mnMapScNumY) / maMapRes.mnMapScDenomY;
     443           0 :     return fPixelHeight;
     444             : }
     445             : 
     446           0 : long OutputDevice::ImplDevicePixelToLogicWidth( long nWidth ) const
     447             : {
     448           0 :     if ( !mbMap )
     449           0 :         return nWidth;
     450             : 
     451             :     return ImplPixelToLogic( nWidth, mnDPIX,
     452             :                              maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     453           0 :                              maThresRes.mnThresPixToLogX );
     454             : }
     455             : 
     456           0 : long OutputDevice::ImplDevicePixelToLogicHeight( long nHeight ) const
     457             : {
     458           0 :     if ( !mbMap )
     459           0 :         return nHeight;
     460             : 
     461             :     return ImplPixelToLogic( nHeight, mnDPIY,
     462             :                              maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     463           0 :                              maThresRes.mnThresPixToLogY );
     464             : }
     465             : 
     466           0 : Point OutputDevice::ImplLogicToDevicePixel( const Point& rLogicPt ) const
     467             : {
     468           0 :     if ( !mbMap )
     469           0 :         return Point( rLogicPt.X()+mnOutOffX, rLogicPt.Y()+mnOutOffY );
     470             : 
     471           0 :     return Point( ImplLogicToPixel( rLogicPt.X() + maMapRes.mnMapOfsX, mnDPIX,
     472             :                                     maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     473           0 :                                     maThresRes.mnThresLogToPixX )+mnOutOffX+mnOutOffOrigX,
     474           0 :                   ImplLogicToPixel( rLogicPt.Y() + maMapRes.mnMapOfsY, mnDPIY,
     475             :                                     maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     476           0 :                                     maThresRes.mnThresLogToPixY )+mnOutOffY+mnOutOffOrigY );
     477             : }
     478             : 
     479           0 : Size OutputDevice::ImplLogicToDevicePixel( const Size& rLogicSize ) const
     480             : {
     481           0 :     if ( !mbMap )
     482           0 :         return rLogicSize;
     483             : 
     484             :     return Size( ImplLogicToPixel( rLogicSize.Width(), mnDPIX,
     485             :                                    maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     486             :                                    maThresRes.mnThresLogToPixX ),
     487             :                  ImplLogicToPixel( rLogicSize.Height(), mnDPIY,
     488             :                                    maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     489           0 :                                    maThresRes.mnThresLogToPixY ) );
     490             : }
     491             : 
     492           0 : Rectangle OutputDevice::ImplLogicToDevicePixel( const Rectangle& rLogicRect ) const
     493             : {
     494           0 :     if ( rLogicRect.IsEmpty() )
     495           0 :         return rLogicRect;
     496             : 
     497           0 :     if ( !mbMap )
     498             :     {
     499           0 :         return Rectangle( rLogicRect.Left()+mnOutOffX, rLogicRect.Top()+mnOutOffY,
     500           0 :                           rLogicRect.Right()+mnOutOffX, rLogicRect.Bottom()+mnOutOffY );
     501             :     }
     502             : 
     503           0 :     return Rectangle( ImplLogicToPixel( rLogicRect.Left()+maMapRes.mnMapOfsX, mnDPIX,
     504             :                                         maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     505           0 :                                         maThresRes.mnThresLogToPixX )+mnOutOffX+mnOutOffOrigX,
     506           0 :                       ImplLogicToPixel( rLogicRect.Top()+maMapRes.mnMapOfsY, mnDPIY,
     507             :                                         maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     508           0 :                                         maThresRes.mnThresLogToPixY )+mnOutOffY+mnOutOffOrigY,
     509           0 :                       ImplLogicToPixel( rLogicRect.Right()+maMapRes.mnMapOfsX, mnDPIX,
     510             :                                         maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     511           0 :                                         maThresRes.mnThresLogToPixX )+mnOutOffX+mnOutOffOrigX,
     512           0 :                       ImplLogicToPixel( rLogicRect.Bottom()+maMapRes.mnMapOfsY, mnDPIY,
     513             :                                         maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     514           0 :                                         maThresRes.mnThresLogToPixY )+mnOutOffY+mnOutOffOrigY );
     515             : }
     516             : 
     517           0 : Polygon OutputDevice::ImplLogicToDevicePixel( const Polygon& rLogicPoly ) const
     518             : {
     519           0 :     if ( !mbMap && !mnOutOffX && !mnOutOffY )
     520           0 :         return rLogicPoly;
     521             : 
     522             :     sal_uInt16  i;
     523           0 :     sal_uInt16  nPoints = rLogicPoly.GetSize();
     524           0 :     Polygon aPoly( rLogicPoly );
     525             : 
     526             :     // get pointer to Point-array (copy data)
     527           0 :     const Point* pPointAry = aPoly.GetConstPointAry();
     528             : 
     529           0 :     if ( mbMap )
     530             :     {
     531           0 :         for ( i = 0; i < nPoints; i++ )
     532             :         {
     533           0 :             const Point* pPt = &(pPointAry[i]);
     534           0 :             Point aPt;
     535           0 :             aPt.X() = ImplLogicToPixel( pPt->X()+maMapRes.mnMapOfsX, mnDPIX,
     536             :                                         maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     537           0 :                                         maThresRes.mnThresLogToPixX )+mnOutOffX+mnOutOffOrigX;
     538           0 :             aPt.Y() = ImplLogicToPixel( pPt->Y()+maMapRes.mnMapOfsY, mnDPIY,
     539             :                                         maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     540           0 :                                         maThresRes.mnThresLogToPixY )+mnOutOffY+mnOutOffOrigY;
     541           0 :             aPoly[i] = aPt;
     542             :         }
     543             :     }
     544             :     else
     545             :     {
     546           0 :         for ( i = 0; i < nPoints; i++ )
     547             :         {
     548           0 :             Point aPt = pPointAry[i];
     549           0 :             aPt.X() += mnOutOffX;
     550           0 :             aPt.Y() += mnOutOffY;
     551           0 :             aPoly[i] = aPt;
     552             :         }
     553             :     }
     554             : 
     555           0 :     return aPoly;
     556             : }
     557             : 
     558           0 : PolyPolygon OutputDevice::ImplLogicToDevicePixel( const PolyPolygon& rLogicPolyPoly ) const
     559             : {
     560           0 :     if ( !mbMap && !mnOutOffX && !mnOutOffY )
     561           0 :         return rLogicPolyPoly;
     562             : 
     563           0 :     PolyPolygon aPolyPoly( rLogicPolyPoly );
     564           0 :     sal_uInt16      nPoly = aPolyPoly.Count();
     565           0 :     for( sal_uInt16 i = 0; i < nPoly; i++ )
     566             :     {
     567           0 :         Polygon& rPoly = aPolyPoly[i];
     568           0 :         rPoly = ImplLogicToDevicePixel( rPoly );
     569             :     }
     570           0 :     return aPolyPoly;
     571             : }
     572             : 
     573           0 : LineInfo OutputDevice::ImplLogicToDevicePixel( const LineInfo& rLineInfo ) const
     574             : {
     575           0 :     LineInfo aInfo( rLineInfo );
     576             : 
     577           0 :     if( aInfo.GetStyle() == LINE_DASH )
     578             :     {
     579           0 :         if( aInfo.GetDotCount() && aInfo.GetDotLen() )
     580           0 :             aInfo.SetDotLen( std::max( ImplLogicWidthToDevicePixel( aInfo.GetDotLen() ), 1L ) );
     581             :         else
     582           0 :             aInfo.SetDotCount( 0 );
     583             : 
     584           0 :         if( aInfo.GetDashCount() && aInfo.GetDashLen() )
     585           0 :             aInfo.SetDashLen( std::max( ImplLogicWidthToDevicePixel( aInfo.GetDashLen() ), 1L ) );
     586             :         else
     587           0 :             aInfo.SetDashCount( 0 );
     588             : 
     589           0 :         aInfo.SetDistance( ImplLogicWidthToDevicePixel( aInfo.GetDistance() ) );
     590             : 
     591           0 :         if( ( !aInfo.GetDashCount() && !aInfo.GetDotCount() ) || !aInfo.GetDistance() )
     592           0 :             aInfo.SetStyle( LINE_SOLID );
     593             :     }
     594             : 
     595           0 :     aInfo.SetWidth( ImplLogicWidthToDevicePixel( aInfo.GetWidth() ) );
     596             : 
     597           0 :     return aInfo;
     598             : }
     599             : 
     600           0 : Rectangle OutputDevice::ImplDevicePixelToLogic( const Rectangle& rPixelRect ) const
     601             : {
     602           0 :     if ( rPixelRect.IsEmpty() )
     603           0 :         return rPixelRect;
     604             : 
     605           0 :     if ( !mbMap )
     606             :     {
     607           0 :         return Rectangle( rPixelRect.Left()-mnOutOffX, rPixelRect.Top()-mnOutOffY,
     608           0 :                           rPixelRect.Right()-mnOutOffX, rPixelRect.Bottom()-mnOutOffY );
     609             :     }
     610             : 
     611           0 :     return Rectangle( ImplPixelToLogic( rPixelRect.Left()-mnOutOffX-mnOutOffOrigX, mnDPIX,
     612             :                                         maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     613           0 :                                         maThresRes.mnThresPixToLogX )-maMapRes.mnMapOfsX,
     614           0 :                       ImplPixelToLogic( rPixelRect.Top()-mnOutOffY-mnOutOffOrigY, mnDPIY,
     615             :                                         maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     616           0 :                                         maThresRes.mnThresPixToLogY )-maMapRes.mnMapOfsY,
     617           0 :                       ImplPixelToLogic( rPixelRect.Right()-mnOutOffX-mnOutOffOrigX, mnDPIX,
     618             :                                         maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     619           0 :                                         maThresRes.mnThresPixToLogX )-maMapRes.mnMapOfsX,
     620           0 :                       ImplPixelToLogic( rPixelRect.Bottom()-mnOutOffY-mnOutOffOrigY, mnDPIY,
     621             :                                         maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     622           0 :                                         maThresRes.mnThresPixToLogY )-maMapRes.mnMapOfsY );
     623             : }
     624             : 
     625           0 : Region OutputDevice::ImplPixelToDevicePixel( const Region& rRegion ) const
     626             : {
     627           0 :     if ( !mnOutOffX && !mnOutOffY )
     628           0 :         return rRegion;
     629             : 
     630           0 :     Region aRegion( rRegion );
     631           0 :     aRegion.Move( mnOutOffX+mnOutOffOrigX, mnOutOffY+mnOutOffOrigY );
     632           0 :     return aRegion;
     633             : }
     634             : 
     635           0 : void OutputDevice::EnableMapMode( bool bEnable )
     636             : {
     637           0 :     mbMap = bEnable;
     638             : 
     639           0 :     if( mpAlphaVDev )
     640           0 :         mpAlphaVDev->EnableMapMode( bEnable );
     641           0 : }
     642             : 
     643           0 : void OutputDevice::SetMapMode()
     644             : {
     645             : 
     646           0 :     if ( mpMetaFile )
     647           0 :         mpMetaFile->AddAction( new MetaMapModeAction( MapMode() ) );
     648             : 
     649           0 :     if ( mbMap || !maMapMode.IsDefault() )
     650             :     {
     651           0 :         mbMap       = false;
     652           0 :         maMapMode   = MapMode();
     653             : 
     654             :         // create new objects (clip region are not re-scaled)
     655           0 :         mbNewFont   = true;
     656           0 :         mbInitFont  = true;
     657           0 :         if ( GetOutDevType() == OUTDEV_WINDOW )
     658             :         {
     659           0 :             if ( ((Window*)this)->mpWindowImpl->mpCursor )
     660           0 :                 ((Window*)this)->mpWindowImpl->mpCursor->ImplNew();
     661             :         }
     662             : 
     663             :         // #106426# Adapt logical offset when changing mapmode
     664           0 :         mnOutOffLogicX = mnOutOffOrigX; // no mapping -> equal offsets
     665           0 :         mnOutOffLogicY = mnOutOffOrigY;
     666             : 
     667             :         // #i75163#
     668           0 :         ImplInvalidateViewTransform();
     669             :     }
     670             : 
     671           0 :     if( mpAlphaVDev )
     672           0 :         mpAlphaVDev->SetMapMode();
     673           0 : }
     674             : 
     675           0 : void OutputDevice::SetMapMode( const MapMode& rNewMapMode )
     676             : {
     677             : 
     678           0 :     bool bRelMap = (rNewMapMode.GetMapUnit() == MAP_RELATIVE);
     679             : 
     680           0 :     if ( mpMetaFile )
     681             :     {
     682           0 :         mpMetaFile->AddAction( new MetaMapModeAction( rNewMapMode ) );
     683             : #ifdef DBG_UTIL
     684             :         if ( GetOutDevType() != OUTDEV_PRINTER )
     685             :             DBG_ASSERTWARNING( bRelMap, "Please record only relative MapModes!" );
     686             : #endif
     687             :     }
     688             : 
     689             :     // do nothing if MapMode was not changed
     690           0 :     if ( maMapMode == rNewMapMode )
     691           0 :         return;
     692             : 
     693           0 :     if( mpAlphaVDev )
     694           0 :         mpAlphaVDev->SetMapMode( rNewMapMode );
     695             : 
     696             :      // if default MapMode calculate nothing
     697           0 :     bool bOldMap = mbMap;
     698           0 :     mbMap = !rNewMapMode.IsDefault();
     699           0 :     if ( mbMap )
     700             :     {
     701             :         // if only the origin is converted, do not scale new
     702           0 :         if ( (rNewMapMode.GetMapUnit() == maMapMode.GetMapUnit()) &&
     703           0 :              (rNewMapMode.GetScaleX()  == maMapMode.GetScaleX())  &&
     704           0 :              (rNewMapMode.GetScaleY()  == maMapMode.GetScaleY())  &&
     705           0 :              (bOldMap                  == mbMap) )
     706             :         {
     707             :             // set offset
     708           0 :             Point aOrigin = rNewMapMode.GetOrigin();
     709           0 :             maMapRes.mnMapOfsX = aOrigin.X();
     710           0 :             maMapRes.mnMapOfsY = aOrigin.Y();
     711           0 :             maMapMode = rNewMapMode;
     712             : 
     713             :             // #i75163#
     714           0 :             ImplInvalidateViewTransform();
     715             : 
     716           0 :             return;
     717             :         }
     718           0 :         if ( !bOldMap && bRelMap )
     719             :         {
     720           0 :             maMapRes.mnMapScNumX    = 1;
     721           0 :             maMapRes.mnMapScNumY    = 1;
     722           0 :             maMapRes.mnMapScDenomX  = mnDPIX;
     723           0 :             maMapRes.mnMapScDenomY  = mnDPIY;
     724           0 :             maMapRes.mnMapOfsX      = 0;
     725           0 :             maMapRes.mnMapOfsY      = 0;
     726             :         }
     727             : 
     728             :         // calculate new MapMode-resolution
     729           0 :         ImplCalcMapResolution( rNewMapMode, mnDPIX, mnDPIY, maMapRes, maThresRes );
     730             :     }
     731             : 
     732             :     // set new MapMode
     733           0 :     if ( bRelMap )
     734             :     {
     735           0 :         Point aOrigin( maMapRes.mnMapOfsX, maMapRes.mnMapOfsY );
     736             :         // aScale? = maMapMode.GetScale?() * rNewMapMode.GetScale?()
     737           0 :         Fraction aScaleX = ImplMakeFraction( maMapMode.GetScaleX().GetNumerator(),
     738           0 :                                              rNewMapMode.GetScaleX().GetNumerator(),
     739           0 :                                              maMapMode.GetScaleX().GetDenominator(),
     740           0 :                                              rNewMapMode.GetScaleX().GetDenominator() );
     741           0 :         Fraction aScaleY = ImplMakeFraction( maMapMode.GetScaleY().GetNumerator(),
     742           0 :                                              rNewMapMode.GetScaleY().GetNumerator(),
     743           0 :                                              maMapMode.GetScaleY().GetDenominator(),
     744           0 :                                              rNewMapMode.GetScaleY().GetDenominator() );
     745           0 :         maMapMode.SetOrigin( aOrigin );
     746           0 :         maMapMode.SetScaleX( aScaleX );
     747           0 :         maMapMode.SetScaleY( aScaleY );
     748             :     }
     749             :     else
     750           0 :         maMapMode = rNewMapMode;
     751             : 
     752             :     // create new objects (clip region are not re-scaled)
     753           0 :     mbNewFont   = true;
     754           0 :     mbInitFont  = true;
     755           0 :     if ( GetOutDevType() == OUTDEV_WINDOW )
     756             :     {
     757           0 :         if ( ((Window*)this)->mpWindowImpl->mpCursor )
     758           0 :             ((Window*)this)->mpWindowImpl->mpCursor->ImplNew();
     759             :     }
     760             : 
     761             :     // #106426# Adapt logical offset when changing mapmode
     762             :     mnOutOffLogicX = ImplPixelToLogic( mnOutOffOrigX, mnDPIX,
     763             :                                        maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     764           0 :                                        maThresRes.mnThresPixToLogX );
     765             :     mnOutOffLogicY = ImplPixelToLogic( mnOutOffOrigY, mnDPIY,
     766             :                                        maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     767           0 :                                        maThresRes.mnThresPixToLogY );
     768             : 
     769             :     // #i75163#
     770           0 :     ImplInvalidateViewTransform();
     771             : }
     772             : 
     773           0 : void OutputDevice::SetRelativeMapMode( const MapMode& rNewMapMode )
     774             : {
     775             :     // do nothing if MapMode did not change
     776           0 :     if ( maMapMode == rNewMapMode )
     777           0 :         return;
     778             : 
     779           0 :     MapUnit eOld = maMapMode.GetMapUnit();
     780           0 :     MapUnit eNew = rNewMapMode.GetMapUnit();
     781             : 
     782             :     // a?F = rNewMapMode.GetScale?() / maMapMode.GetScale?()
     783           0 :     Fraction aXF = ImplMakeFraction( rNewMapMode.GetScaleX().GetNumerator(),
     784           0 :                                      maMapMode.GetScaleX().GetDenominator(),
     785           0 :                                      rNewMapMode.GetScaleX().GetDenominator(),
     786           0 :                                      maMapMode.GetScaleX().GetNumerator() );
     787           0 :     Fraction aYF = ImplMakeFraction( rNewMapMode.GetScaleY().GetNumerator(),
     788           0 :                                      maMapMode.GetScaleY().GetDenominator(),
     789           0 :                                      rNewMapMode.GetScaleY().GetDenominator(),
     790           0 :                                      maMapMode.GetScaleY().GetNumerator() );
     791             : 
     792           0 :     Point aPt( LogicToLogic( Point(), NULL, &rNewMapMode ) );
     793           0 :     if ( eNew != eOld )
     794             :     {
     795           0 :         if ( eOld > MAP_PIXEL )
     796             :         {
     797             :             SAL_WARN( "vcl.gdi", "Not implemented MapUnit" );
     798             :         }
     799           0 :         else if ( eNew > MAP_PIXEL )
     800             :         {
     801             :             SAL_WARN( "vcl.gdi", "Not implemented MapUnit" );
     802             :         }
     803             :         else
     804             :         {
     805           0 :             Fraction aF( aImplNumeratorAry[eNew] * aImplDenominatorAry[eOld],
     806           0 :                          aImplNumeratorAry[eOld] * aImplDenominatorAry[eNew] );
     807             : 
     808             :             // a?F =  a?F * aF
     809           0 :             aXF = ImplMakeFraction( aXF.GetNumerator(),   aF.GetNumerator(),
     810           0 :                                     aXF.GetDenominator(), aF.GetDenominator() );
     811           0 :             aYF = ImplMakeFraction( aYF.GetNumerator(),   aF.GetNumerator(),
     812           0 :                                     aYF.GetDenominator(), aF.GetDenominator() );
     813           0 :             if ( eOld == MAP_PIXEL )
     814             :             {
     815           0 :                 aXF *= Fraction( mnDPIX, 1 );
     816           0 :                 aYF *= Fraction( mnDPIY, 1 );
     817             :             }
     818           0 :             else if ( eNew == MAP_PIXEL )
     819             :             {
     820           0 :                 aXF *= Fraction( 1, mnDPIX );
     821           0 :                 aYF *= Fraction( 1, mnDPIY );
     822             :             }
     823             :         }
     824             :     }
     825             : 
     826           0 :     MapMode aNewMapMode( MAP_RELATIVE, Point( -aPt.X(), -aPt.Y() ), aXF, aYF );
     827           0 :     SetMapMode( aNewMapMode );
     828             : 
     829           0 :     if ( eNew != eOld )
     830           0 :         maMapMode = rNewMapMode;
     831             : 
     832             :     // #106426# Adapt logical offset when changing MapMode
     833             :     mnOutOffLogicX = ImplPixelToLogic( mnOutOffOrigX, mnDPIX,
     834             :                                        maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     835           0 :                                        maThresRes.mnThresPixToLogX );
     836             :     mnOutOffLogicY = ImplPixelToLogic( mnOutOffOrigY, mnDPIY,
     837             :                                        maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     838           0 :                                        maThresRes.mnThresPixToLogY );
     839             : 
     840           0 :     if( mpAlphaVDev )
     841           0 :         mpAlphaVDev->SetRelativeMapMode( rNewMapMode );
     842             : }
     843             : 
     844             : // #i75163#
     845           0 : basegfx::B2DHomMatrix OutputDevice::GetViewTransformation() const
     846             : {
     847           0 :     if(mbMap)
     848             :     {
     849             :         // #i82615#
     850           0 :         if(!mpOutDevData)
     851             :         {
     852           0 :             const_cast< OutputDevice* >(this)->ImplInitOutDevData();
     853             :         }
     854             : 
     855           0 :         if(!mpOutDevData->mpViewTransform)
     856             :         {
     857           0 :             mpOutDevData->mpViewTransform = new basegfx::B2DHomMatrix;
     858             : 
     859           0 :             const double fScaleFactorX((double)mnDPIX * (double)maMapRes.mnMapScNumX / (double)maMapRes.mnMapScDenomX);
     860           0 :             const double fScaleFactorY((double)mnDPIY * (double)maMapRes.mnMapScNumY / (double)maMapRes.mnMapScDenomY);
     861           0 :             const double fZeroPointX(((double)maMapRes.mnMapOfsX * fScaleFactorX) + (double)mnOutOffOrigX);
     862           0 :             const double fZeroPointY(((double)maMapRes.mnMapOfsY * fScaleFactorY) + (double)mnOutOffOrigY);
     863             : 
     864           0 :             mpOutDevData->mpViewTransform->set(0, 0, fScaleFactorX);
     865           0 :             mpOutDevData->mpViewTransform->set(1, 1, fScaleFactorY);
     866           0 :             mpOutDevData->mpViewTransform->set(0, 2, fZeroPointX);
     867           0 :             mpOutDevData->mpViewTransform->set(1, 2, fZeroPointY);
     868             :         }
     869             : 
     870           0 :         return *mpOutDevData->mpViewTransform;
     871             :     }
     872             :     else
     873             :     {
     874           0 :         return basegfx::B2DHomMatrix();
     875             :     }
     876             : }
     877             : 
     878             : // #i75163#
     879           0 : basegfx::B2DHomMatrix OutputDevice::GetInverseViewTransformation() const
     880             : {
     881           0 :     if(mbMap)
     882             :     {
     883             :         // #i82615#
     884           0 :         if(!mpOutDevData)
     885             :         {
     886           0 :             const_cast< OutputDevice* >(this)->ImplInitOutDevData();
     887             :         }
     888             : 
     889           0 :         if(!mpOutDevData->mpInverseViewTransform)
     890             :         {
     891           0 :             GetViewTransformation();
     892           0 :             mpOutDevData->mpInverseViewTransform = new basegfx::B2DHomMatrix(*mpOutDevData->mpViewTransform);
     893           0 :             mpOutDevData->mpInverseViewTransform->invert();
     894             :         }
     895             : 
     896           0 :         return *mpOutDevData->mpInverseViewTransform;
     897             :     }
     898             :     else
     899             :     {
     900           0 :         return basegfx::B2DHomMatrix();
     901             :     }
     902             : }
     903             : 
     904             : // #i75163#
     905           0 : basegfx::B2DHomMatrix OutputDevice::GetViewTransformation( const MapMode& rMapMode ) const
     906             : {
     907             :     // #i82615#
     908             :     ImplMapRes          aMapRes;
     909             :     ImplThresholdRes    aThresRes;
     910           0 :     ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
     911             : 
     912           0 :     basegfx::B2DHomMatrix aTransform;
     913             : 
     914           0 :     const double fScaleFactorX((double)mnDPIX * (double)aMapRes.mnMapScNumX / (double)aMapRes.mnMapScDenomX);
     915           0 :     const double fScaleFactorY((double)mnDPIY * (double)aMapRes.mnMapScNumY / (double)aMapRes.mnMapScDenomY);
     916           0 :     const double fZeroPointX(((double)aMapRes.mnMapOfsX * fScaleFactorX) + (double)mnOutOffOrigX);
     917           0 :     const double fZeroPointY(((double)aMapRes.mnMapOfsY * fScaleFactorY) + (double)mnOutOffOrigY);
     918             : 
     919           0 :     aTransform.set(0, 0, fScaleFactorX);
     920           0 :     aTransform.set(1, 1, fScaleFactorY);
     921           0 :     aTransform.set(0, 2, fZeroPointX);
     922           0 :     aTransform.set(1, 2, fZeroPointY);
     923             : 
     924           0 :     return aTransform;
     925             : }
     926             : 
     927             : // #i75163#
     928           0 : basegfx::B2DHomMatrix OutputDevice::GetInverseViewTransformation( const MapMode& rMapMode ) const
     929             : {
     930           0 :     basegfx::B2DHomMatrix aMatrix( GetViewTransformation( rMapMode ) );
     931           0 :     aMatrix.invert();
     932           0 :     return aMatrix;
     933             : }
     934             : 
     935           0 : basegfx::B2DHomMatrix OutputDevice::ImplGetDeviceTransformation() const
     936             : {
     937           0 :     basegfx::B2DHomMatrix aTransformation = GetViewTransformation();
     938             :     // TODO: is it worth to cache the transformed result?
     939           0 :     if( mnOutOffX || mnOutOffY )
     940           0 :         aTransformation.translate( mnOutOffX, mnOutOffY );
     941           0 :     return aTransformation;
     942             : }
     943             : 
     944           0 : Point OutputDevice::LogicToPixel( const Point& rLogicPt ) const
     945             : {
     946             : 
     947           0 :     if ( !mbMap )
     948           0 :         return rLogicPt;
     949             : 
     950           0 :     return Point( ImplLogicToPixel( rLogicPt.X() + maMapRes.mnMapOfsX, mnDPIX,
     951             :                                     maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     952           0 :                                     maThresRes.mnThresLogToPixX )+mnOutOffOrigX,
     953           0 :                   ImplLogicToPixel( rLogicPt.Y() + maMapRes.mnMapOfsY, mnDPIY,
     954             :                                     maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     955           0 :                                     maThresRes.mnThresLogToPixY )+mnOutOffOrigY );
     956             : }
     957             : 
     958           0 : Size OutputDevice::LogicToPixel( const Size& rLogicSize ) const
     959             : {
     960             : 
     961           0 :     if ( !mbMap )
     962           0 :         return rLogicSize;
     963             : 
     964             :     return Size( ImplLogicToPixel( rLogicSize.Width(), mnDPIX,
     965             :                                    maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     966             :                                    maThresRes.mnThresLogToPixX ),
     967             :                  ImplLogicToPixel( rLogicSize.Height(), mnDPIY,
     968             :                                    maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     969           0 :                                    maThresRes.mnThresLogToPixY ) );
     970             : }
     971             : 
     972           0 : Rectangle OutputDevice::LogicToPixel( const Rectangle& rLogicRect ) const
     973             : {
     974             : 
     975           0 :     if ( !mbMap || rLogicRect.IsEmpty() )
     976           0 :         return rLogicRect;
     977             : 
     978           0 :     return Rectangle( ImplLogicToPixel( rLogicRect.Left() + maMapRes.mnMapOfsX, mnDPIX,
     979             :                                         maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     980           0 :                                         maThresRes.mnThresLogToPixX )+mnOutOffOrigX,
     981           0 :                       ImplLogicToPixel( rLogicRect.Top() + maMapRes.mnMapOfsY, mnDPIY,
     982             :                                         maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     983           0 :                                         maThresRes.mnThresLogToPixY )+mnOutOffOrigY,
     984           0 :                       ImplLogicToPixel( rLogicRect.Right() + maMapRes.mnMapOfsX, mnDPIX,
     985             :                                         maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
     986           0 :                                         maThresRes.mnThresLogToPixX )+mnOutOffOrigX,
     987           0 :                       ImplLogicToPixel( rLogicRect.Bottom() + maMapRes.mnMapOfsY, mnDPIY,
     988             :                                         maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
     989           0 :                                         maThresRes.mnThresLogToPixY )+mnOutOffOrigY );
     990             : }
     991             : 
     992           0 : Polygon OutputDevice::LogicToPixel( const Polygon& rLogicPoly ) const
     993             : {
     994             : 
     995           0 :     if ( !mbMap )
     996           0 :         return rLogicPoly;
     997             : 
     998             :     sal_uInt16  i;
     999           0 :     sal_uInt16  nPoints = rLogicPoly.GetSize();
    1000           0 :     Polygon aPoly( rLogicPoly );
    1001             : 
    1002             :     // get pointer to Point-array (copy data)
    1003           0 :     const Point* pPointAry = aPoly.GetConstPointAry();
    1004             : 
    1005           0 :     for ( i = 0; i < nPoints; i++ )
    1006             :     {
    1007           0 :         const Point* pPt = &(pPointAry[i]);
    1008           0 :         Point aPt;
    1009           0 :         aPt.X() = ImplLogicToPixel( pPt->X() + maMapRes.mnMapOfsX, mnDPIX,
    1010             :                                     maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
    1011           0 :                                     maThresRes.mnThresLogToPixX )+mnOutOffOrigX;
    1012           0 :         aPt.Y() = ImplLogicToPixel( pPt->Y() + maMapRes.mnMapOfsY, mnDPIY,
    1013             :                                     maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
    1014           0 :                                     maThresRes.mnThresLogToPixY )+mnOutOffOrigY;
    1015           0 :         aPoly[i] = aPt;
    1016             :     }
    1017             : 
    1018           0 :     return aPoly;
    1019             : }
    1020             : 
    1021           0 : PolyPolygon OutputDevice::LogicToPixel( const PolyPolygon& rLogicPolyPoly ) const
    1022             : {
    1023             : 
    1024           0 :     if ( !mbMap )
    1025           0 :         return rLogicPolyPoly;
    1026             : 
    1027           0 :     PolyPolygon aPolyPoly( rLogicPolyPoly );
    1028           0 :     sal_uInt16      nPoly = aPolyPoly.Count();
    1029           0 :     for( sal_uInt16 i = 0; i < nPoly; i++ )
    1030             :     {
    1031           0 :         Polygon& rPoly = aPolyPoly[i];
    1032           0 :         rPoly = LogicToPixel( rPoly );
    1033             :     }
    1034           0 :     return aPolyPoly;
    1035             : }
    1036             : 
    1037           0 : basegfx::B2DPolygon OutputDevice::LogicToPixel( const basegfx::B2DPolygon& rLogicPoly ) const
    1038             : {
    1039           0 :     basegfx::B2DPolygon aTransformedPoly = rLogicPoly;
    1040           0 :     const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetViewTransformation();
    1041           0 :     aTransformedPoly.transform( rTransformationMatrix );
    1042           0 :     return aTransformedPoly;
    1043             : }
    1044             : 
    1045           0 : basegfx::B2DPolyPolygon OutputDevice::LogicToPixel( const basegfx::B2DPolyPolygon& rLogicPolyPoly ) const
    1046             : {
    1047           0 :     basegfx::B2DPolyPolygon aTransformedPoly = rLogicPolyPoly;
    1048           0 :     const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetViewTransformation();
    1049           0 :     aTransformedPoly.transform( rTransformationMatrix );
    1050           0 :     return aTransformedPoly;
    1051             : }
    1052             : 
    1053           0 : Region OutputDevice::LogicToPixel( const Region& rLogicRegion ) const
    1054             : {
    1055             : 
    1056           0 :     if(!mbMap || rLogicRegion.IsNull() || rLogicRegion.IsEmpty())
    1057             :     {
    1058           0 :         return rLogicRegion;
    1059             :     }
    1060             : 
    1061           0 :     Region aRegion;
    1062             : 
    1063           0 :     if(rLogicRegion.getB2DPolyPolygon())
    1064             :     {
    1065           0 :         aRegion = Region(LogicToPixel(*rLogicRegion.getB2DPolyPolygon()));
    1066             :     }
    1067           0 :     else if(rLogicRegion.getPolyPolygon())
    1068             :     {
    1069           0 :         aRegion = Region(LogicToPixel(*rLogicRegion.getPolyPolygon()));
    1070             :     }
    1071           0 :     else if(rLogicRegion.getRegionBand())
    1072             :     {
    1073           0 :         RectangleVector aRectangles;
    1074           0 :         rLogicRegion.GetRegionRectangles(aRectangles);
    1075           0 :         const RectangleVector& rRectangles(aRectangles); // needed to make the '!=' work
    1076             : 
    1077             :         // make reverse run to fill new region bottom-up, this will speed it up due to the used data structuring
    1078           0 :         for(RectangleVector::const_reverse_iterator aRectIter(rRectangles.rbegin()); aRectIter != rRectangles.rend(); ++aRectIter)
    1079             :         {
    1080           0 :             aRegion.Union(LogicToPixel(*aRectIter));
    1081           0 :         }
    1082             :     }
    1083             : 
    1084           0 :     return aRegion;
    1085             : }
    1086             : 
    1087           0 : Point OutputDevice::LogicToPixel( const Point& rLogicPt,
    1088             :                                   const MapMode& rMapMode ) const
    1089             : {
    1090             : 
    1091           0 :     if ( rMapMode.IsDefault() )
    1092           0 :         return rLogicPt;
    1093             : 
    1094             :     // convert MapMode resolution and convert
    1095             :     ImplMapRes          aMapRes;
    1096             :     ImplThresholdRes    aThresRes;
    1097           0 :     ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
    1098             : 
    1099           0 :     return Point( ImplLogicToPixel( rLogicPt.X() + aMapRes.mnMapOfsX, mnDPIX,
    1100             :                                     aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
    1101           0 :                                     aThresRes.mnThresLogToPixX )+mnOutOffOrigX,
    1102           0 :                   ImplLogicToPixel( rLogicPt.Y() + aMapRes.mnMapOfsY, mnDPIY,
    1103             :                                     aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
    1104           0 :                                     aThresRes.mnThresLogToPixY )+mnOutOffOrigY );
    1105             : }
    1106             : 
    1107           0 : Size OutputDevice::LogicToPixel( const Size& rLogicSize,
    1108             :                                  const MapMode& rMapMode ) const
    1109             : {
    1110             : 
    1111           0 :     if ( rMapMode.IsDefault() )
    1112           0 :         return rLogicSize;
    1113             : 
    1114             :     // convert MapMode resolution and convert
    1115             :     ImplMapRes          aMapRes;
    1116             :     ImplThresholdRes    aThresRes;
    1117           0 :     ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
    1118             : 
    1119             :     return Size( ImplLogicToPixel( rLogicSize.Width(), mnDPIX,
    1120             :                                    aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
    1121             :                                    aThresRes.mnThresLogToPixX ),
    1122             :                  ImplLogicToPixel( rLogicSize.Height(), mnDPIY,
    1123             :                                    aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
    1124           0 :                                    aThresRes.mnThresLogToPixY ) );
    1125             : }
    1126             : 
    1127           0 : Rectangle OutputDevice::LogicToPixel( const Rectangle& rLogicRect,
    1128             :                                       const MapMode& rMapMode ) const
    1129             : {
    1130             : 
    1131           0 :     if ( rMapMode.IsDefault() || rLogicRect.IsEmpty() )
    1132           0 :         return rLogicRect;
    1133             : 
    1134             :     // convert MapMode resolution and convert
    1135             :     ImplMapRes          aMapRes;
    1136             :     ImplThresholdRes    aThresRes;
    1137           0 :     ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
    1138             : 
    1139           0 :     return Rectangle( ImplLogicToPixel( rLogicRect.Left() + aMapRes.mnMapOfsX, mnDPIX,
    1140             :                                         aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
    1141           0 :                                         aThresRes.mnThresLogToPixX )+mnOutOffOrigX,
    1142           0 :                       ImplLogicToPixel( rLogicRect.Top() + aMapRes.mnMapOfsY, mnDPIY,
    1143             :                                         aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
    1144           0 :                                         aThresRes.mnThresLogToPixY )+mnOutOffOrigY,
    1145           0 :                       ImplLogicToPixel( rLogicRect.Right() + aMapRes.mnMapOfsX, mnDPIX,
    1146             :                                         aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
    1147           0 :                                         aThresRes.mnThresLogToPixX )+mnOutOffOrigX,
    1148           0 :                       ImplLogicToPixel( rLogicRect.Bottom() + aMapRes.mnMapOfsY, mnDPIY,
    1149             :                                         aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
    1150           0 :                                         aThresRes.mnThresLogToPixY )+mnOutOffOrigY );
    1151             : }
    1152             : 
    1153           0 : Polygon OutputDevice::LogicToPixel( const Polygon& rLogicPoly,
    1154             :                                     const MapMode& rMapMode ) const
    1155             : {
    1156             : 
    1157           0 :     if ( rMapMode.IsDefault() )
    1158           0 :         return rLogicPoly;
    1159             : 
    1160             :     // convert MapMode resolution and convert
    1161             :     ImplMapRes          aMapRes;
    1162             :     ImplThresholdRes    aThresRes;
    1163           0 :     ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
    1164             : 
    1165             :     sal_uInt16  i;
    1166           0 :     sal_uInt16  nPoints = rLogicPoly.GetSize();
    1167           0 :     Polygon aPoly( rLogicPoly );
    1168             : 
    1169             :     // get pointer to Point-array (copy data)
    1170           0 :     const Point* pPointAry = aPoly.GetConstPointAry();
    1171             : 
    1172           0 :     for ( i = 0; i < nPoints; i++ )
    1173             :     {
    1174           0 :         const Point* pPt = &(pPointAry[i]);
    1175           0 :         Point aPt;
    1176           0 :         aPt.X() = ImplLogicToPixel( pPt->X() + aMapRes.mnMapOfsX, mnDPIX,
    1177             :                                     aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
    1178           0 :                                     aThresRes.mnThresLogToPixX )+mnOutOffOrigX;
    1179           0 :         aPt.Y() = ImplLogicToPixel( pPt->Y() + aMapRes.mnMapOfsY, mnDPIY,
    1180             :                                     aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
    1181           0 :                                     aThresRes.mnThresLogToPixY )+mnOutOffOrigY;
    1182           0 :         aPoly[i] = aPt;
    1183             :     }
    1184             : 
    1185           0 :     return aPoly;
    1186             : }
    1187             : 
    1188           0 : PolyPolygon OutputDevice::LogicToPixel( const PolyPolygon& rLogicPolyPoly,
    1189             :     const MapMode& rMapMode ) const
    1190             : {
    1191             : 
    1192           0 :     if ( rMapMode.IsDefault() )
    1193           0 :         return rLogicPolyPoly;
    1194             : 
    1195           0 :     PolyPolygon aPolyPoly( rLogicPolyPoly );
    1196           0 :     sal_uInt16              nPoly = aPolyPoly.Count();
    1197           0 :     for( sal_uInt16 i = 0; i < nPoly; i++ )
    1198             :     {
    1199           0 :         Polygon& rPoly = aPolyPoly[i];
    1200           0 :         rPoly = LogicToPixel( rPoly, rMapMode );
    1201             :     }
    1202           0 :     return aPolyPoly;
    1203             : }
    1204             : 
    1205           0 : basegfx::B2DPolyPolygon OutputDevice::LogicToPixel( const basegfx::B2DPolyPolygon& rLogicPolyPoly,
    1206             :                                                     const MapMode& rMapMode ) const
    1207             : {
    1208           0 :     basegfx::B2DPolyPolygon aTransformedPoly = rLogicPolyPoly;
    1209           0 :     const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetViewTransformation( rMapMode );
    1210           0 :     aTransformedPoly.transform( rTransformationMatrix );
    1211           0 :     return aTransformedPoly;
    1212             : }
    1213             : 
    1214           0 : basegfx::B2DPolygon OutputDevice::LogicToPixel( const basegfx::B2DPolygon& rLogicPoly,
    1215             :                                                 const MapMode& rMapMode ) const
    1216             : {
    1217           0 :     basegfx::B2DPolygon aTransformedPoly = rLogicPoly;
    1218           0 :     const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetViewTransformation( rMapMode );
    1219           0 :     aTransformedPoly.transform( rTransformationMatrix );
    1220           0 :     return aTransformedPoly;
    1221             : }
    1222             : 
    1223           0 : Region OutputDevice::LogicToPixel( const Region& rLogicRegion, const MapMode& rMapMode ) const
    1224             : {
    1225             : 
    1226           0 :     if(rMapMode.IsDefault() || rLogicRegion.IsNull() || rLogicRegion.IsEmpty())
    1227             :     {
    1228           0 :         return rLogicRegion;
    1229             :     }
    1230             : 
    1231           0 :     Region aRegion;
    1232             : 
    1233           0 :     if(rLogicRegion.getB2DPolyPolygon())
    1234             :     {
    1235           0 :         aRegion = Region(LogicToPixel(*rLogicRegion.getB2DPolyPolygon(), rMapMode));
    1236             :     }
    1237           0 :     else if(rLogicRegion.getPolyPolygon())
    1238             :     {
    1239           0 :         aRegion = Region(LogicToPixel(*rLogicRegion.getPolyPolygon(), rMapMode));
    1240             :     }
    1241           0 :     else if(rLogicRegion.getRegionBand())
    1242             :     {
    1243           0 :         RectangleVector aRectangles;
    1244           0 :         rLogicRegion.GetRegionRectangles(aRectangles);
    1245           0 :         const RectangleVector& rRectangles(aRectangles); // needed to make the '!=' work
    1246             : 
    1247             :         // make reverse run to fill new region bottom-up, this will speed it up due to the used data structuring
    1248           0 :         for(RectangleVector::const_reverse_iterator aRectIter(rRectangles.rbegin()); aRectIter != rRectangles.rend(); ++aRectIter)
    1249             :         {
    1250           0 :             aRegion.Union(LogicToPixel(*aRectIter, rMapMode));
    1251           0 :         }
    1252             :     }
    1253             : 
    1254           0 :     return aRegion;
    1255             : }
    1256             : 
    1257           0 : Point OutputDevice::PixelToLogic( const Point& rDevicePt ) const
    1258             : {
    1259             : 
    1260           0 :     if ( !mbMap )
    1261           0 :         return rDevicePt;
    1262             : 
    1263             :     return Point( ImplPixelToLogic( rDevicePt.X(), mnDPIX,
    1264             :                                     maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
    1265           0 :                                     maThresRes.mnThresPixToLogX ) - maMapRes.mnMapOfsX - mnOutOffLogicX,
    1266             :                   ImplPixelToLogic( rDevicePt.Y(), mnDPIY,
    1267             :                                     maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
    1268           0 :                                     maThresRes.mnThresPixToLogY ) - maMapRes.mnMapOfsY - mnOutOffLogicY );
    1269             : }
    1270             : 
    1271           0 : Size OutputDevice::PixelToLogic( const Size& rDeviceSize ) const
    1272             : {
    1273             : 
    1274           0 :     if ( !mbMap )
    1275           0 :         return rDeviceSize;
    1276             : 
    1277             :     return Size( ImplPixelToLogic( rDeviceSize.Width(), mnDPIX,
    1278             :                                    maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
    1279             :                                    maThresRes.mnThresPixToLogX ),
    1280             :                  ImplPixelToLogic( rDeviceSize.Height(), mnDPIY,
    1281             :                                    maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
    1282           0 :                                    maThresRes.mnThresPixToLogY ) );
    1283             : }
    1284             : 
    1285           0 : Rectangle OutputDevice::PixelToLogic( const Rectangle& rDeviceRect ) const
    1286             : {
    1287             : 
    1288           0 :     if ( !mbMap || rDeviceRect.IsEmpty() )
    1289           0 :         return rDeviceRect;
    1290             : 
    1291             :     return Rectangle( ImplPixelToLogic( rDeviceRect.Left(), mnDPIX,
    1292             :                                         maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
    1293           0 :                                         maThresRes.mnThresPixToLogX ) - maMapRes.mnMapOfsX - mnOutOffLogicX,
    1294             :                       ImplPixelToLogic( rDeviceRect.Top(), mnDPIY,
    1295             :                                         maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
    1296           0 :                                         maThresRes.mnThresPixToLogY ) - maMapRes.mnMapOfsY - mnOutOffLogicY,
    1297             :                       ImplPixelToLogic( rDeviceRect.Right(), mnDPIX,
    1298             :                                         maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
    1299           0 :                                         maThresRes.mnThresPixToLogX ) - maMapRes.mnMapOfsX - mnOutOffLogicX,
    1300             :                       ImplPixelToLogic( rDeviceRect.Bottom(), mnDPIY,
    1301             :                                         maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
    1302           0 :                                         maThresRes.mnThresPixToLogY ) - maMapRes.mnMapOfsY - mnOutOffLogicY );
    1303             : }
    1304             : 
    1305           0 : Polygon OutputDevice::PixelToLogic( const Polygon& rDevicePoly ) const
    1306             : {
    1307             : 
    1308           0 :     if ( !mbMap )
    1309           0 :         return rDevicePoly;
    1310             : 
    1311             :     sal_uInt16  i;
    1312           0 :     sal_uInt16  nPoints = rDevicePoly.GetSize();
    1313           0 :     Polygon aPoly( rDevicePoly );
    1314             : 
    1315             :     // get pointer to Point-array (copy data)
    1316           0 :     const Point* pPointAry = aPoly.GetConstPointAry();
    1317             : 
    1318           0 :     for ( i = 0; i < nPoints; i++ )
    1319             :     {
    1320           0 :         const Point* pPt = &(pPointAry[i]);
    1321           0 :         Point aPt;
    1322           0 :         aPt.X() = ImplPixelToLogic( pPt->X(), mnDPIX,
    1323             :                                     maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
    1324           0 :                                     maThresRes.mnThresPixToLogX ) - maMapRes.mnMapOfsX - mnOutOffLogicX;
    1325           0 :         aPt.Y() = ImplPixelToLogic( pPt->Y(), mnDPIY,
    1326             :                                     maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
    1327           0 :                                     maThresRes.mnThresPixToLogY ) - maMapRes.mnMapOfsY - mnOutOffLogicY;
    1328           0 :         aPoly[i] = aPt;
    1329             :     }
    1330             : 
    1331           0 :     return aPoly;
    1332             : }
    1333             : 
    1334           0 : PolyPolygon OutputDevice::PixelToLogic( const PolyPolygon& rDevicePolyPoly ) const
    1335             : {
    1336             : 
    1337           0 :     if ( !mbMap )
    1338           0 :         return rDevicePolyPoly;
    1339             : 
    1340           0 :     PolyPolygon aPolyPoly( rDevicePolyPoly );
    1341           0 :     sal_uInt16      nPoly = aPolyPoly.Count();
    1342           0 :     for( sal_uInt16 i = 0; i < nPoly; i++ )
    1343             :     {
    1344           0 :         Polygon& rPoly = aPolyPoly[i];
    1345           0 :         rPoly = PixelToLogic( rPoly );
    1346             :     }
    1347           0 :     return aPolyPoly;
    1348             : }
    1349             : 
    1350           0 : basegfx::B2DPolyPolygon OutputDevice::PixelToLogic( const basegfx::B2DPolyPolygon& rPixelPolyPoly ) const
    1351             : {
    1352           0 :     basegfx::B2DPolyPolygon aTransformedPoly = rPixelPolyPoly;
    1353           0 :     const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetInverseViewTransformation();
    1354           0 :     aTransformedPoly.transform( rTransformationMatrix );
    1355           0 :     return aTransformedPoly;
    1356             : }
    1357             : 
    1358           0 : Region OutputDevice::PixelToLogic( const Region& rDeviceRegion ) const
    1359             : {
    1360             : 
    1361           0 :     if(!mbMap || rDeviceRegion.IsNull() || rDeviceRegion.IsEmpty())
    1362             :     {
    1363           0 :         return rDeviceRegion;
    1364             :     }
    1365             : 
    1366           0 :     Region aRegion;
    1367             : 
    1368           0 :     if(rDeviceRegion.getB2DPolyPolygon())
    1369             :     {
    1370           0 :         aRegion = Region(PixelToLogic(*rDeviceRegion.getB2DPolyPolygon()));
    1371             :     }
    1372           0 :     else if(rDeviceRegion.getPolyPolygon())
    1373             :     {
    1374           0 :         aRegion = Region(PixelToLogic(*rDeviceRegion.getPolyPolygon()));
    1375             :     }
    1376           0 :     else if(rDeviceRegion.getRegionBand())
    1377             :     {
    1378           0 :         RectangleVector aRectangles;
    1379           0 :         rDeviceRegion.GetRegionRectangles(aRectangles);
    1380           0 :         const RectangleVector& rRectangles(aRectangles); // needed to make the '!=' work
    1381             : 
    1382             :         // make reverse run to fill new region bottom-up, this will speed it up due to the used data structuring
    1383           0 :         for(RectangleVector::const_reverse_iterator aRectIter(rRectangles.rbegin()); aRectIter != rRectangles.rend(); ++aRectIter)
    1384             :         {
    1385           0 :             aRegion.Union(PixelToLogic(*aRectIter));
    1386           0 :         }
    1387             :     }
    1388             : 
    1389           0 :     return aRegion;
    1390             : }
    1391             : 
    1392           0 : Point OutputDevice::PixelToLogic( const Point& rDevicePt,
    1393             :                                   const MapMode& rMapMode ) const
    1394             : {
    1395             : 
    1396             :     // calculate nothing if default-MapMode
    1397           0 :     if ( rMapMode.IsDefault() )
    1398           0 :         return rDevicePt;
    1399             : 
    1400             :     // calculate MapMode-resolution and convert
    1401             :     ImplMapRes          aMapRes;
    1402             :     ImplThresholdRes    aThresRes;
    1403           0 :     ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
    1404             : 
    1405             :     return Point( ImplPixelToLogic( rDevicePt.X(), mnDPIX,
    1406             :                                     aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
    1407           0 :                                     aThresRes.mnThresPixToLogX ) - aMapRes.mnMapOfsX - mnOutOffLogicX,
    1408             :                   ImplPixelToLogic( rDevicePt.Y(), mnDPIY,
    1409             :                                     aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
    1410           0 :                                     aThresRes.mnThresPixToLogY ) - aMapRes.mnMapOfsY - mnOutOffLogicY );
    1411             : }
    1412             : 
    1413           0 : Size OutputDevice::PixelToLogic( const Size& rDeviceSize,
    1414             :                                  const MapMode& rMapMode ) const
    1415             : {
    1416             : 
    1417             :     // calculate nothing if default-MapMode
    1418           0 :     if ( rMapMode.IsDefault() )
    1419           0 :         return rDeviceSize;
    1420             : 
    1421             :     // calculate MapMode-resolution and convert
    1422             :     ImplMapRes          aMapRes;
    1423             :     ImplThresholdRes    aThresRes;
    1424           0 :     ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
    1425             : 
    1426             :     return Size( ImplPixelToLogic( rDeviceSize.Width(), mnDPIX,
    1427             :                                    aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
    1428             :                                    aThresRes.mnThresPixToLogX ),
    1429             :                  ImplPixelToLogic( rDeviceSize.Height(), mnDPIY,
    1430             :                                    aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
    1431           0 :                                    aThresRes.mnThresPixToLogY ) );
    1432             : }
    1433             : 
    1434           0 : Rectangle OutputDevice::PixelToLogic( const Rectangle& rDeviceRect,
    1435             :                                       const MapMode& rMapMode ) const
    1436             : {
    1437             : 
    1438             :     // calculate nothing if default-MapMode
    1439           0 :     if ( rMapMode.IsDefault() || rDeviceRect.IsEmpty() )
    1440           0 :         return rDeviceRect;
    1441             : 
    1442             :     // calculate MapMode-resolution and convert
    1443             :     ImplMapRes          aMapRes;
    1444             :     ImplThresholdRes    aThresRes;
    1445           0 :     ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
    1446             : 
    1447             :     return Rectangle( ImplPixelToLogic( rDeviceRect.Left(), mnDPIX,
    1448             :                                         aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
    1449           0 :                                         aThresRes.mnThresPixToLogX ) - aMapRes.mnMapOfsX - mnOutOffLogicX,
    1450             :                       ImplPixelToLogic( rDeviceRect.Top(), mnDPIY,
    1451             :                                         aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
    1452           0 :                                         aThresRes.mnThresPixToLogY ) - aMapRes.mnMapOfsY - mnOutOffLogicY,
    1453             :                       ImplPixelToLogic( rDeviceRect.Right(), mnDPIX,
    1454             :                                         aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
    1455           0 :                                         aThresRes.mnThresPixToLogX ) - aMapRes.mnMapOfsX - mnOutOffLogicX,
    1456             :                       ImplPixelToLogic( rDeviceRect.Bottom(), mnDPIY,
    1457             :                                         aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
    1458           0 :                                         aThresRes.mnThresPixToLogY ) - aMapRes.mnMapOfsY - mnOutOffLogicY );
    1459             : }
    1460             : 
    1461           0 : Polygon OutputDevice::PixelToLogic( const Polygon& rDevicePoly,
    1462             :                                     const MapMode& rMapMode ) const
    1463             : {
    1464             : 
    1465             :     // calculate nothing if default-MapMode
    1466           0 :     if ( rMapMode.IsDefault() )
    1467           0 :         return rDevicePoly;
    1468             : 
    1469             :     // calculate MapMode-resolution and convert
    1470             :     ImplMapRes          aMapRes;
    1471             :     ImplThresholdRes    aThresRes;
    1472           0 :     ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
    1473             : 
    1474             :     sal_uInt16  i;
    1475           0 :     sal_uInt16  nPoints = rDevicePoly.GetSize();
    1476           0 :     Polygon aPoly( rDevicePoly );
    1477             : 
    1478             :     // get pointer to Point-array (copy data)
    1479           0 :     const Point* pPointAry = aPoly.GetConstPointAry();
    1480             : 
    1481           0 :     for ( i = 0; i < nPoints; i++ )
    1482             :     {
    1483           0 :         const Point* pPt = &(pPointAry[i]);
    1484           0 :         Point aPt;
    1485           0 :         aPt.X() = ImplPixelToLogic( pPt->X(), mnDPIX,
    1486             :                                     aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
    1487           0 :                                     aThresRes.mnThresPixToLogX ) - aMapRes.mnMapOfsX - mnOutOffLogicX;
    1488           0 :         aPt.Y() = ImplPixelToLogic( pPt->Y(), mnDPIY,
    1489             :                                     aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
    1490           0 :                                     aThresRes.mnThresPixToLogY ) - aMapRes.mnMapOfsY - mnOutOffLogicY;
    1491           0 :         aPoly[i] = aPt;
    1492             :     }
    1493             : 
    1494           0 :     return aPoly;
    1495             : }
    1496             : 
    1497           0 : PolyPolygon OutputDevice::PixelToLogic( const PolyPolygon& rDevicePolyPoly,
    1498             :     const MapMode& rMapMode ) const
    1499             : {
    1500             : 
    1501           0 :     if ( rMapMode.IsDefault() )
    1502           0 :         return rDevicePolyPoly;
    1503             : 
    1504           0 :     PolyPolygon aPolyPoly( rDevicePolyPoly );
    1505           0 :     sal_uInt16      nPoly = aPolyPoly.Count();
    1506           0 :     for( sal_uInt16 i = 0; i < nPoly; i++ )
    1507             :     {
    1508           0 :         Polygon& rPoly = aPolyPoly[i];
    1509           0 :         rPoly = PixelToLogic( rPoly, rMapMode );
    1510             :     }
    1511           0 :     return aPolyPoly;
    1512             : }
    1513             : 
    1514           0 : basegfx::B2DPolygon OutputDevice::PixelToLogic( const basegfx::B2DPolygon& rPixelPoly,
    1515             :                                                 const MapMode& rMapMode ) const
    1516             : {
    1517           0 :     basegfx::B2DPolygon aTransformedPoly = rPixelPoly;
    1518           0 :     const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetInverseViewTransformation( rMapMode );
    1519           0 :     aTransformedPoly.transform( rTransformationMatrix );
    1520           0 :     return aTransformedPoly;
    1521             : }
    1522             : 
    1523           0 : basegfx::B2DPolyPolygon OutputDevice::PixelToLogic( const basegfx::B2DPolyPolygon& rPixelPolyPoly,
    1524             :                                                     const MapMode& rMapMode ) const
    1525             : {
    1526           0 :     basegfx::B2DPolyPolygon aTransformedPoly = rPixelPolyPoly;
    1527           0 :     const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetInverseViewTransformation( rMapMode );
    1528           0 :     aTransformedPoly.transform( rTransformationMatrix );
    1529           0 :     return aTransformedPoly;
    1530             : }
    1531             : 
    1532           0 : Region OutputDevice::PixelToLogic( const Region& rDeviceRegion, const MapMode& rMapMode ) const
    1533             : {
    1534             : 
    1535           0 :     if(rMapMode.IsDefault() || rDeviceRegion.IsNull() || rDeviceRegion.IsEmpty())
    1536             :     {
    1537           0 :         return rDeviceRegion;
    1538             :     }
    1539             : 
    1540           0 :     Region aRegion;
    1541             : 
    1542           0 :     if(rDeviceRegion.getB2DPolyPolygon())
    1543             :     {
    1544           0 :         aRegion = Region(PixelToLogic(*rDeviceRegion.getB2DPolyPolygon(), rMapMode));
    1545             :     }
    1546           0 :     else if(rDeviceRegion.getPolyPolygon())
    1547             :     {
    1548           0 :         aRegion = Region(PixelToLogic(*rDeviceRegion.getPolyPolygon(), rMapMode));
    1549             :     }
    1550           0 :     else if(rDeviceRegion.getRegionBand())
    1551             :     {
    1552           0 :         RectangleVector aRectangles;
    1553           0 :         rDeviceRegion.GetRegionRectangles(aRectangles);
    1554           0 :         const RectangleVector& rRectangles(aRectangles); // needed to make the '!=' work
    1555             : 
    1556             :         // make reverse run to fill new region bottom-up, this will speed it up due to the used data structuring
    1557           0 :         for(RectangleVector::const_reverse_iterator aRectIter(rRectangles.rbegin()); aRectIter != rRectangles.rend(); ++aRectIter)
    1558             :         {
    1559           0 :             aRegion.Union(PixelToLogic(*aRectIter, rMapMode));
    1560           0 :         }
    1561             :     }
    1562             : 
    1563           0 :     return aRegion;
    1564             : }
    1565             : 
    1566             : #define ENTER0( rSource, pMapModeSource, pMapModeDest )                 \
    1567             :     if ( !pMapModeSource )                                              \
    1568             :         pMapModeSource = &maMapMode;                                    \
    1569             :     if ( !pMapModeDest )                                                \
    1570             :         pMapModeDest = &maMapMode;                                      \
    1571             :     if ( *pMapModeSource == *pMapModeDest )                             \
    1572             :         return rSource
    1573             : 
    1574             : #define ENTER1( rSource, pMapModeSource, pMapModeDest )                 \
    1575             :     ENTER0( rSource, pMapModeSource, pMapModeDest );                    \
    1576             :                                                                         \
    1577             :     ImplMapRes aMapResSource;                                           \
    1578             :     aMapResSource.mnMapOfsX          = 0;                               \
    1579             :     aMapResSource.mnMapOfsY          = 0;                               \
    1580             :     aMapResSource.mnMapScNumX        = 1;                               \
    1581             :     aMapResSource.mnMapScNumY        = 1;                               \
    1582             :     aMapResSource.mnMapScDenomX      = 1;                               \
    1583             :     aMapResSource.mnMapScDenomY      = 1;                               \
    1584             :     ImplMapRes aMapResDest(aMapResSource);                              \
    1585             :                                                                         \
    1586             :     if ( !mbMap || pMapModeSource != &maMapMode )                       \
    1587             :     {                                                                   \
    1588             :         if ( pMapModeSource->GetMapUnit() == MAP_RELATIVE )             \
    1589             :             aMapResSource = maMapRes;                                   \
    1590             :         ImplCalcMapResolution( *pMapModeSource,                         \
    1591             :                                mnDPIX, mnDPIY, aMapResSource );         \
    1592             :     }                                                                   \
    1593             :     else                                                                \
    1594             :         aMapResSource = maMapRes;                                       \
    1595             :     if ( !mbMap || pMapModeDest != &maMapMode )                         \
    1596             :     {                                                                   \
    1597             :         if ( pMapModeDest->GetMapUnit() == MAP_RELATIVE )               \
    1598             :             aMapResDest = maMapRes;                                     \
    1599             :         ImplCalcMapResolution( *pMapModeDest,                           \
    1600             :                                mnDPIX, mnDPIY, aMapResDest );           \
    1601             :     }                                                                   \
    1602             :     else                                                                \
    1603             :         aMapResDest = maMapRes
    1604             : 
    1605             : #define ENTER2( eUnitSource, eUnitDest )                                \
    1606             :     DBG_ASSERT( eUnitSource != MAP_SYSFONT                              \
    1607             :                 && eUnitSource != MAP_APPFONT                           \
    1608             :                 && eUnitSource != MAP_RELATIVE,                         \
    1609             :                 "Source MapUnit nicht erlaubt" );                       \
    1610             :     DBG_ASSERT( eUnitDest != MAP_SYSFONT                                \
    1611             :                 && eUnitDest != MAP_APPFONT                             \
    1612             :                 && eUnitDest != MAP_RELATIVE,                           \
    1613             :                 "Destination MapUnit nicht erlaubt" );                  \
    1614             :     DBG_ASSERTWARNING( eUnitSource != MAP_PIXEL,                        \
    1615             :                        "MAP_PIXEL mit 72dpi angenaehert" );             \
    1616             :     DBG_ASSERTWARNING( eUnitDest != MAP_PIXEL,                          \
    1617             :                        "MAP_PIXEL mit 72dpi angenaehert" )
    1618             : 
    1619             : #define ENTER3( eUnitSource, eUnitDest )                                \
    1620             :     long nNumerator      = 1;       \
    1621             :     long nDenominator    = 1;       \
    1622             :     DBG_ASSERT( eUnitSource < s_ImplArySize, "Invalid source map unit");    \
    1623             :     DBG_ASSERT( eUnitDest < s_ImplArySize, "Invalid destination map unit"); \
    1624             :     if( (eUnitSource < s_ImplArySize) && (eUnitDest < s_ImplArySize) )  \
    1625             :     {   \
    1626             :         nNumerator   = aImplNumeratorAry[eUnitSource] *             \
    1627             :                            aImplDenominatorAry[eUnitDest];              \
    1628             :         nDenominator     = aImplNumeratorAry[eUnitDest] *               \
    1629             :                            aImplDenominatorAry[eUnitSource];            \
    1630             :     } \
    1631             :     if ( eUnitSource == MAP_PIXEL )                                     \
    1632             :         nDenominator *= 72;                                             \
    1633             :     else if( eUnitDest == MAP_PIXEL )                                   \
    1634             :         nNumerator *= 72
    1635             : 
    1636             : #define ENTER4( rMapModeSource, rMapModeDest )                          \
    1637             :     ImplMapRes aMapResSource;                                           \
    1638             :     aMapResSource.mnMapOfsX          = 0;                               \
    1639             :     aMapResSource.mnMapOfsY          = 0;                               \
    1640             :     aMapResSource.mnMapScNumX        = 1;                               \
    1641             :     aMapResSource.mnMapScNumY        = 1;                               \
    1642             :     aMapResSource.mnMapScDenomX      = 1;                               \
    1643             :     aMapResSource.mnMapScDenomY      = 1;                               \
    1644             :     ImplMapRes aMapResDest(aMapResSource);                              \
    1645             :                                                                         \
    1646             :     ImplCalcMapResolution( rMapModeSource, 72, 72, aMapResSource );     \
    1647             :     ImplCalcMapResolution( rMapModeDest, 72, 72, aMapResDest )
    1648             : 
    1649             : // return (n1 * n2 * n3) / (n4 * n5)
    1650           0 : static long fn5( const long n1,
    1651             :                  const long n2,
    1652             :                  const long n3,
    1653             :                  const long n4,
    1654             :                  const long n5 )
    1655             : {
    1656           0 :     if ( n1 == 0 || n2 == 0 || n3 == 0 || n4 == 0 || n5 == 0 )
    1657           0 :         return 0;
    1658           0 :     if ( LONG_MAX / std::abs(n2) < std::abs(n3) )
    1659             :     {
    1660             :         // a6 is skipped
    1661           0 :         BigInt a7 = n2;
    1662           0 :         a7 *= n3;
    1663           0 :         a7 *= n1;
    1664             : 
    1665           0 :         if ( LONG_MAX / std::abs(n4) < std::abs(n5) )
    1666             :         {
    1667           0 :             BigInt a8 = n4;
    1668           0 :             a8 *= n5;
    1669             : 
    1670           0 :             BigInt a9 = a8;
    1671           0 :             a9 /= 2;
    1672           0 :             if ( a7.IsNeg() )
    1673           0 :                 a7 -= a9;
    1674             :             else
    1675           0 :                 a7 += a9;
    1676             : 
    1677           0 :             a7 /= a8;
    1678             :         } // of if
    1679             :         else
    1680             :         {
    1681           0 :             long n8 = n4 * n5;
    1682             : 
    1683           0 :             if ( a7.IsNeg() )
    1684           0 :                 a7 -= n8 / 2;
    1685             :             else
    1686           0 :                 a7 += n8 / 2;
    1687             : 
    1688           0 :             a7 /= n8;
    1689             :         } // of else
    1690           0 :         return (long)a7;
    1691             :     } // of if
    1692             :     else
    1693             :     {
    1694           0 :         long n6 = n2 * n3;
    1695             : 
    1696           0 :         if ( LONG_MAX / std::abs(n1) < std::abs(n6) )
    1697             :         {
    1698           0 :             BigInt a7 = n1;
    1699           0 :             a7 *= n6;
    1700             : 
    1701           0 :             if ( LONG_MAX / std::abs(n4) < std::abs(n5) )
    1702             :             {
    1703           0 :                 BigInt a8 = n4;
    1704           0 :                 a8 *= n5;
    1705             : 
    1706           0 :                 BigInt a9 = a8;
    1707           0 :                 a9 /= 2;
    1708           0 :                 if ( a7.IsNeg() )
    1709           0 :                     a7 -= a9;
    1710             :                 else
    1711           0 :                     a7 += a9;
    1712             : 
    1713           0 :                 a7 /= a8;
    1714             :             } // of if
    1715             :             else
    1716             :             {
    1717           0 :                 long n8 = n4 * n5;
    1718             : 
    1719           0 :                 if ( a7.IsNeg() )
    1720           0 :                     a7 -= n8 / 2;
    1721             :                 else
    1722           0 :                     a7 += n8 / 2;
    1723             : 
    1724           0 :                 a7 /= n8;
    1725             :             } // of else
    1726           0 :             return (long)a7;
    1727             :         } // of if
    1728             :         else
    1729             :         {
    1730           0 :             long n7 = n1 * n6;
    1731             : 
    1732           0 :             if ( LONG_MAX / std::abs(n4) < std::abs(n5) )
    1733             :             {
    1734           0 :                 BigInt a7 = n7;
    1735           0 :                 BigInt a8 = n4;
    1736           0 :                 a8 *= n5;
    1737             : 
    1738           0 :                 BigInt a9 = a8;
    1739           0 :                 a9 /= 2;
    1740           0 :                 if ( a7.IsNeg() )
    1741           0 :                     a7 -= a9;
    1742             :                 else
    1743           0 :                     a7 += a9;
    1744             : 
    1745           0 :                 a7 /= a8;
    1746           0 :                 return (long)a7;
    1747             :             } // of if
    1748             :             else
    1749             :             {
    1750           0 :                 const long n8 = n4 * n5;
    1751           0 :                 const long n8_2 = n8 / 2;
    1752             : 
    1753           0 :                 if( n7 < 0 )
    1754             :                 {
    1755           0 :                     if( ( n7 - LONG_MIN ) >= n8_2 )
    1756           0 :                         n7 -= n8_2;
    1757             :                 }
    1758           0 :                 else if( ( LONG_MAX - n7 ) >= n8_2 )
    1759           0 :                     n7 += n8_2;
    1760             : 
    1761           0 :                 return n7 / n8;
    1762             :             } // of else
    1763             :         } // of else
    1764             :     } // of else
    1765             : }
    1766             : 
    1767             : // return (n1 * n2) / n3
    1768           0 : static long fn3( const long n1, const long n2, const long n3 )
    1769             : {
    1770           0 :     if ( n1 == 0 || n2 == 0 || n3 == 0 )
    1771           0 :         return 0;
    1772           0 :     if ( LONG_MAX / std::abs(n1) < std::abs(n2) )
    1773             :     {
    1774           0 :         BigInt a4 = n1;
    1775           0 :         a4 *= n2;
    1776             : 
    1777           0 :         if ( a4.IsNeg() )
    1778           0 :             a4 -= n3 / 2;
    1779             :         else
    1780           0 :             a4 += n3 / 2;
    1781             : 
    1782           0 :         a4 /= n3;
    1783           0 :         return (long)a4;
    1784             :     } // of if
    1785             :     else
    1786             :     {
    1787           0 :         long        n4 = n1 * n2;
    1788           0 :         const long  n3_2 = n3 / 2;
    1789             : 
    1790           0 :         if( n4 < 0 )
    1791             :         {
    1792           0 :             if( ( n4 - LONG_MIN ) >= n3_2 )
    1793           0 :                 n4 -= n3_2;
    1794             :         }
    1795           0 :         else if( ( LONG_MAX - n4 ) >= n3_2 )
    1796           0 :             n4 += n3_2;
    1797             : 
    1798           0 :         return n4 / n3;
    1799             :     } // of else
    1800             : }
    1801             : 
    1802           0 : Point OutputDevice::LogicToLogic( const Point& rPtSource,
    1803             :                                   const MapMode* pMapModeSource,
    1804             :                                   const MapMode* pMapModeDest ) const
    1805             : {
    1806           0 :     ENTER1( rPtSource, pMapModeSource, pMapModeDest );
    1807             : 
    1808           0 :     return Point( fn5( rPtSource.X() + aMapResSource.mnMapOfsX,
    1809             :                        aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
    1810           0 :                        aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
    1811             :                   aMapResDest.mnMapOfsX,
    1812           0 :                   fn5( rPtSource.Y() + aMapResSource.mnMapOfsY,
    1813             :                        aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
    1814           0 :                        aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
    1815           0 :                   aMapResDest.mnMapOfsY );
    1816             : }
    1817             : 
    1818           0 : Size OutputDevice::LogicToLogic( const Size& rSzSource,
    1819             :                                  const MapMode* pMapModeSource,
    1820             :                                  const MapMode* pMapModeDest ) const
    1821             : {
    1822           0 :     ENTER1( rSzSource, pMapModeSource, pMapModeDest );
    1823             : 
    1824             :     return Size( fn5( rSzSource.Width(),
    1825             :                       aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
    1826             :                       aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ),
    1827             :                  fn5( rSzSource.Height(),
    1828             :                       aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
    1829           0 :                       aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) );
    1830             : }
    1831             : 
    1832           0 : Rectangle OutputDevice::LogicToLogic( const Rectangle& rRectSource,
    1833             :                                       const MapMode* pMapModeSource,
    1834             :                                       const MapMode* pMapModeDest ) const
    1835             : {
    1836           0 :     ENTER1( rRectSource, pMapModeSource, pMapModeDest );
    1837             : 
    1838           0 :     return Rectangle( fn5( rRectSource.Left() + aMapResSource.mnMapOfsX,
    1839             :                            aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
    1840           0 :                            aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
    1841             :                       aMapResDest.mnMapOfsX,
    1842           0 :                       fn5( rRectSource.Top() + aMapResSource.mnMapOfsY,
    1843             :                            aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
    1844           0 :                            aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
    1845             :                       aMapResDest.mnMapOfsY,
    1846           0 :                       fn5( rRectSource.Right() + aMapResSource.mnMapOfsX,
    1847             :                            aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
    1848           0 :                            aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
    1849             :                       aMapResDest.mnMapOfsX,
    1850           0 :                       fn5( rRectSource.Bottom() + aMapResSource.mnMapOfsY,
    1851             :                            aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
    1852           0 :                            aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
    1853           0 :                       aMapResDest.mnMapOfsY );
    1854             : }
    1855             : 
    1856           0 : Point OutputDevice::LogicToLogic( const Point& rPtSource,
    1857             :                                   const MapMode& rMapModeSource,
    1858             :                                   const MapMode& rMapModeDest )
    1859             : {
    1860           0 :     if ( rMapModeSource == rMapModeDest )
    1861           0 :         return rPtSource;
    1862             : 
    1863           0 :     MapUnit eUnitSource = rMapModeSource.GetMapUnit();
    1864           0 :     MapUnit eUnitDest   = rMapModeDest.GetMapUnit();
    1865             :     ENTER2( eUnitSource, eUnitDest );
    1866             : 
    1867           0 :     if ( rMapModeSource.mpImplMapMode->mbSimple &&
    1868             :          rMapModeDest.mpImplMapMode->mbSimple )
    1869             :     {
    1870           0 :         ENTER3( eUnitSource, eUnitDest );
    1871             : 
    1872             :         return Point( fn3( rPtSource.X(), nNumerator, nDenominator ),
    1873           0 :                       fn3( rPtSource.Y(), nNumerator, nDenominator ) );
    1874             :     }
    1875             :     else
    1876             :     {
    1877           0 :         ENTER4( rMapModeSource, rMapModeDest );
    1878             : 
    1879           0 :         return Point( fn5( rPtSource.X() + aMapResSource.mnMapOfsX,
    1880             :                            aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
    1881           0 :                            aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
    1882             :                       aMapResDest.mnMapOfsX,
    1883           0 :                       fn5( rPtSource.Y() + aMapResSource.mnMapOfsY,
    1884             :                            aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
    1885           0 :                            aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
    1886           0 :                       aMapResDest.mnMapOfsY );
    1887             :     }
    1888             : }
    1889             : 
    1890           0 : Size OutputDevice::LogicToLogic( const Size& rSzSource,
    1891             :                                  const MapMode& rMapModeSource,
    1892             :                                  const MapMode& rMapModeDest )
    1893             : {
    1894           0 :     if ( rMapModeSource == rMapModeDest )
    1895           0 :         return rSzSource;
    1896             : 
    1897           0 :     MapUnit eUnitSource = rMapModeSource.GetMapUnit();
    1898           0 :     MapUnit eUnitDest   = rMapModeDest.GetMapUnit();
    1899             :     ENTER2( eUnitSource, eUnitDest );
    1900             : 
    1901           0 :     if ( rMapModeSource.mpImplMapMode->mbSimple &&
    1902             :          rMapModeDest.mpImplMapMode->mbSimple )
    1903             :     {
    1904           0 :         ENTER3( eUnitSource, eUnitDest );
    1905             : 
    1906             :         return Size( fn3( rSzSource.Width(),  nNumerator, nDenominator ),
    1907           0 :                      fn3( rSzSource.Height(), nNumerator, nDenominator ) );
    1908             :     }
    1909             :     else
    1910             :     {
    1911           0 :         ENTER4( rMapModeSource, rMapModeDest );
    1912             : 
    1913             :         return Size( fn5( rSzSource.Width(),
    1914             :                           aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
    1915             :                           aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ),
    1916             :                      fn5( rSzSource.Height(),
    1917             :                           aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
    1918           0 :                           aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) );
    1919             :     }
    1920             : }
    1921             : 
    1922           0 : basegfx::B2DPolygon OutputDevice::LogicToLogic( const basegfx::B2DPolygon& rPolySource,
    1923             :                                                 const MapMode& rMapModeSource,
    1924             :                                                 const MapMode& rMapModeDest )
    1925             : {
    1926           0 :     if(rMapModeSource == rMapModeDest)
    1927             :     {
    1928           0 :         return rPolySource;
    1929             :     }
    1930             : 
    1931           0 :     const basegfx::B2DHomMatrix aTransform(LogicToLogic(rMapModeSource, rMapModeDest));
    1932           0 :     basegfx::B2DPolygon aPoly(rPolySource);
    1933             : 
    1934           0 :     aPoly.transform(aTransform);
    1935           0 :     return aPoly;
    1936             : }
    1937             : 
    1938           0 : basegfx::B2DPolyPolygon OutputDevice::LogicToLogic( const basegfx::B2DPolyPolygon& rPolySource,
    1939             :                                                     const MapMode& rMapModeSource,
    1940             :                                                     const MapMode& rMapModeDest )
    1941             : {
    1942           0 :     if(rMapModeSource == rMapModeDest)
    1943             :     {
    1944           0 :         return rPolySource;
    1945             :     }
    1946             : 
    1947           0 :     const basegfx::B2DHomMatrix aTransform(LogicToLogic(rMapModeSource, rMapModeDest));
    1948           0 :     basegfx::B2DPolyPolygon aPoly(rPolySource);
    1949             : 
    1950           0 :     aPoly.transform(aTransform);
    1951           0 :     return aPoly;
    1952             : }
    1953             : 
    1954           0 : basegfx::B2DHomMatrix OutputDevice::LogicToLogic(const MapMode& rMapModeSource, const MapMode& rMapModeDest)
    1955             : {
    1956           0 :     basegfx::B2DHomMatrix aTransform;
    1957             : 
    1958           0 :     if(rMapModeSource == rMapModeDest)
    1959             :     {
    1960           0 :         return aTransform;
    1961             :     }
    1962             : 
    1963           0 :     MapUnit eUnitSource = rMapModeSource.GetMapUnit();
    1964           0 :     MapUnit eUnitDest   = rMapModeDest.GetMapUnit();
    1965             :     ENTER2(eUnitSource, eUnitDest);
    1966             : 
    1967           0 :     if(rMapModeSource.mpImplMapMode->mbSimple && rMapModeDest.mpImplMapMode->mbSimple)
    1968             :     {
    1969           0 :         ENTER3(eUnitSource, eUnitDest);
    1970             : 
    1971           0 :         const double fScaleFactor((double)nNumerator / (double)nDenominator);
    1972           0 :         aTransform.set(0, 0, fScaleFactor);
    1973           0 :         aTransform.set(1, 1, fScaleFactor);
    1974             :     }
    1975             :     else
    1976             :     {
    1977           0 :         ENTER4(rMapModeSource, rMapModeDest);
    1978             : 
    1979           0 :         const double fScaleFactorX((double(aMapResSource.mnMapScNumX) * double(aMapResDest.mnMapScDenomX)) / (double(aMapResSource.mnMapScDenomX) * double(aMapResDest.mnMapScNumX)));
    1980           0 :         const double fScaleFactorY((double(aMapResSource.mnMapScNumY) * double(aMapResDest.mnMapScDenomY)) / (double(aMapResSource.mnMapScDenomY) * double(aMapResDest.mnMapScNumY)));
    1981           0 :         const double fZeroPointX(double(aMapResSource.mnMapOfsX) * fScaleFactorX - double(aMapResDest.mnMapOfsX));
    1982           0 :         const double fZeroPointY(double(aMapResSource.mnMapOfsY) * fScaleFactorY - double(aMapResDest.mnMapOfsY));
    1983             : 
    1984           0 :         aTransform.set(0, 0, fScaleFactorX);
    1985           0 :         aTransform.set(1, 1, fScaleFactorY);
    1986           0 :         aTransform.set(0, 2, fZeroPointX);
    1987           0 :         aTransform.set(1, 2, fZeroPointY);
    1988             :     }
    1989             : 
    1990           0 :     return aTransform;
    1991             : }
    1992             : 
    1993           0 : Rectangle OutputDevice::LogicToLogic( const Rectangle& rRectSource,
    1994             :                                       const MapMode& rMapModeSource,
    1995             :                                       const MapMode& rMapModeDest )
    1996             : {
    1997           0 :     if ( rMapModeSource == rMapModeDest )
    1998           0 :         return rRectSource;
    1999             : 
    2000           0 :     MapUnit eUnitSource = rMapModeSource.GetMapUnit();
    2001           0 :     MapUnit eUnitDest   = rMapModeDest.GetMapUnit();
    2002             :     ENTER2( eUnitSource, eUnitDest );
    2003             : 
    2004           0 :     if ( rMapModeSource.mpImplMapMode->mbSimple &&
    2005             :          rMapModeDest.mpImplMapMode->mbSimple )
    2006             :     {
    2007           0 :         ENTER3( eUnitSource, eUnitDest );
    2008             : 
    2009             :         return Rectangle( fn3( rRectSource.Left(), nNumerator, nDenominator ),
    2010             :                           fn3( rRectSource.Top(), nNumerator, nDenominator ),
    2011             :                           fn3( rRectSource.Right(), nNumerator, nDenominator ),
    2012           0 :                           fn3( rRectSource.Bottom(), nNumerator, nDenominator ) );
    2013             :     }
    2014             :     else
    2015             :     {
    2016           0 :         ENTER4( rMapModeSource, rMapModeDest );
    2017             : 
    2018           0 :         return Rectangle( fn5( rRectSource.Left() + aMapResSource.mnMapOfsX,
    2019             :                                aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
    2020           0 :                                aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
    2021             :                           aMapResDest.mnMapOfsX,
    2022           0 :                           fn5( rRectSource.Top() + aMapResSource.mnMapOfsY,
    2023             :                                aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
    2024           0 :                                aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
    2025             :                           aMapResDest.mnMapOfsY,
    2026           0 :                           fn5( rRectSource.Right() + aMapResSource.mnMapOfsX,
    2027             :                                aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
    2028           0 :                                aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
    2029             :                           aMapResDest.mnMapOfsX,
    2030           0 :                           fn5( rRectSource.Bottom() + aMapResSource.mnMapOfsY,
    2031             :                                aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
    2032           0 :                                aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
    2033           0 :                           aMapResDest.mnMapOfsY );
    2034             :     }
    2035             : }
    2036             : 
    2037           0 : long OutputDevice::LogicToLogic( long nLongSource,
    2038             :                                  MapUnit eUnitSource, MapUnit eUnitDest )
    2039             : {
    2040           0 :     if ( eUnitSource == eUnitDest )
    2041           0 :         return nLongSource;
    2042             : 
    2043             :     ENTER2( eUnitSource, eUnitDest );
    2044           0 :     ENTER3( eUnitSource, eUnitDest );
    2045             : 
    2046           0 :     return fn3( nLongSource, nNumerator, nDenominator );
    2047             : }
    2048             : 
    2049           0 : void OutputDevice::SetPixelOffset( const Size& rOffset )
    2050             : {
    2051           0 :     mnOutOffOrigX  = rOffset.Width();
    2052           0 :     mnOutOffOrigY  = rOffset.Height();
    2053             : 
    2054             :     mnOutOffLogicX = ImplPixelToLogic( mnOutOffOrigX, mnDPIX,
    2055             :                                        maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
    2056           0 :                                        maThresRes.mnThresPixToLogX );
    2057             :     mnOutOffLogicY = ImplPixelToLogic( mnOutOffOrigY, mnDPIY,
    2058             :                                        maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
    2059           0 :                                        maThresRes.mnThresPixToLogY );
    2060             : 
    2061           0 :     if( mpAlphaVDev )
    2062           0 :         mpAlphaVDev->SetPixelOffset( rOffset );
    2063           0 : }
    2064             : 
    2065           0 : Size OutputDevice::GetPixelOffset() const
    2066             : {
    2067           0 :     return Size(mnOutOffOrigX, mnOutOffOrigY);
    2068             : }
    2069             : 
    2070           0 : long Window::ImplLogicUnitToPixelX( long nX, MapUnit eUnit )
    2071             : {
    2072           0 :     if ( eUnit != MAP_PIXEL )
    2073             :     {
    2074           0 :         ImplFrameData* pFrameData = mpWindowImpl->mpFrameData;
    2075             : 
    2076             :         // shift map unit, then re-calculate
    2077           0 :         if ( pFrameData->meMapUnit != eUnit )
    2078             :         {
    2079           0 :             pFrameData->meMapUnit = eUnit;
    2080             :             ImplCalcMapResolution( MapMode( eUnit ), mnDPIX, mnDPIY,
    2081           0 :                                    pFrameData->maMapUnitRes );
    2082             :         }
    2083             : 
    2084             :         // BigInt is not required, as this function is only used to
    2085             :         // convert the window position
    2086           0 :         nX  = nX * mnDPIX * pFrameData->maMapUnitRes.mnMapScNumX;
    2087           0 :         nX += nX >= 0 ?  (pFrameData->maMapUnitRes.mnMapScDenomX/2) :
    2088           0 :                         -((pFrameData->maMapUnitRes.mnMapScDenomX-1)/2);
    2089           0 :         nX /= pFrameData->maMapUnitRes.mnMapScDenomX;
    2090             :     }
    2091             : 
    2092           0 :     return nX;
    2093             : }
    2094             : 
    2095           0 : long Window::ImplLogicUnitToPixelY( long nY, MapUnit eUnit )
    2096             : {
    2097           0 :     if ( eUnit != MAP_PIXEL )
    2098             :     {
    2099           0 :         ImplFrameData* pFrameData = mpWindowImpl->mpFrameData;
    2100             : 
    2101             :         // shift map unit, then re-calculate
    2102           0 :         if ( pFrameData->meMapUnit != eUnit )
    2103             :         {
    2104           0 :             pFrameData->meMapUnit = eUnit;
    2105             :             ImplCalcMapResolution( MapMode( eUnit ), mnDPIX, mnDPIY,
    2106           0 :                                    pFrameData->maMapUnitRes );
    2107             :         }
    2108             : 
    2109             :         // BigInt is not required, as this function is only used to
    2110             :         // convert the window position
    2111           0 :         nY  = nY * mnDPIY * pFrameData->maMapUnitRes.mnMapScNumY;
    2112           0 :         nY += nY >= 0 ?  (pFrameData->maMapUnitRes.mnMapScDenomY/2) :
    2113           0 :                         -((pFrameData->maMapUnitRes.mnMapScDenomY-1)/2);
    2114           0 :         nY /= pFrameData->maMapUnitRes.mnMapScDenomY;
    2115             :     }
    2116             : 
    2117           0 :     return nY;
    2118           3 : }
    2119             : 
    2120             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10