LCOV - code coverage report
Current view: top level - svx/source/svdraw - svdtrans.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 171 653 26.2 %
Date: 2015-06-13 12:38:46 Functions: 19 46 41.3 %
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             : 
      21             : #include <svx/svdtrans.hxx>
      22             : #include <math.h>
      23             : #include <svx/xpoly.hxx>
      24             : 
      25             : #include <vcl/virdev.hxx>
      26             : #include <tools/bigint.hxx>
      27             : #include <tools/debug.hxx>
      28             : #include <unotools/syslocale.hxx>
      29             : 
      30           0 : void MoveXPoly(XPolygon& rPoly, const Size& S)
      31             : {
      32           0 :     rPoly.Move(S.Width(),S.Height());
      33           0 : }
      34             : 
      35       87682 : void ResizeRect(Rectangle& rRect, const Point& rRef, const Fraction& rxFact, const Fraction& ryFact, bool bNoJustify)
      36             : {
      37       87682 :     Fraction xFact(rxFact);
      38      175364 :     Fraction yFact(ryFact);
      39             : 
      40       87682 :     if (!xFact.IsValid()) {
      41             :         SAL_WARN( "svx.svdraw", "invalid fraction xFract, using Fraction(1,1)" );
      42           5 :         xFact = Fraction(1,1);
      43           5 :         long nWdt = rRect.Right() - rRect.Left();
      44           5 :         if (nWdt == 0) rRect.Right()++;
      45             :     }
      46       87682 :     rRect.Left()  = rRef.X() + Round( (rRect.Left()  - rRef.X()) * double(xFact) );
      47       87682 :     rRect.Right() = rRef.X() + Round( (rRect.Right() - rRef.X()) * double(xFact) );
      48             : 
      49       87682 :     if (!yFact.IsValid()) {
      50             :         SAL_WARN( "svx.svdraw", "invalid fraction yFract, using Fraction(1,1)" );
      51           5 :         yFact = Fraction(1,1);
      52           5 :         long nHgt = rRect.Bottom() - rRect.Top();
      53           5 :         if (nHgt == 0) rRect.Bottom()++;
      54             :     }
      55       87682 :     rRect.Top()    = rRef.Y() + Round( (rRect.Top()    - rRef.Y()) * double(yFact) );
      56       87682 :     rRect.Bottom() = rRef.Y() + Round( (rRect.Bottom() - rRef.Y()) * double(yFact) );
      57             : 
      58      175364 :     if (!bNoJustify) rRect.Justify();
      59       87682 : }
      60             : 
      61             : 
      62           0 : void ResizePoly(Polygon& rPoly, const Point& rRef, const Fraction& xFact, const Fraction& yFact)
      63             : {
      64           0 :     sal_uInt16 nCount=rPoly.GetSize();
      65           0 :     for (sal_uInt16 i=0; i<nCount; i++) {
      66           0 :         ResizePoint(rPoly[i],rRef,xFact,yFact);
      67             :     }
      68           0 : }
      69             : 
      70           0 : void ResizeXPoly(XPolygon& rPoly, const Point& rRef, const Fraction& xFact, const Fraction& yFact)
      71             : {
      72           0 :     sal_uInt16 nCount=rPoly.GetPointCount();
      73           0 :     for (sal_uInt16 i=0; i<nCount; i++) {
      74           0 :         ResizePoint(rPoly[i],rRef,xFact,yFact);
      75             :     }
      76           0 : }
      77             : 
      78       20364 : void RotatePoly(Polygon& rPoly, const Point& rRef, double sn, double cs)
      79             : {
      80       20364 :     sal_uInt16 nCount=rPoly.GetSize();
      81      121879 :     for (sal_uInt16 i=0; i<nCount; i++) {
      82      101515 :         RotatePoint(rPoly[i],rRef,sn,cs);
      83             :     }
      84       20364 : }
      85             : 
      86          11 : void RotateXPoly(XPolygon& rPoly, const Point& rRef, double sn, double cs)
      87             : {
      88          11 :     sal_uInt16 nCount=rPoly.GetPointCount();
      89         101 :     for (sal_uInt16 i=0; i<nCount; i++) {
      90          90 :         RotatePoint(rPoly[i],rRef,sn,cs);
      91             :     }
      92          11 : }
      93             : 
      94           0 : void RotateXPoly(XPolyPolygon& rPoly, const Point& rRef, double sn, double cs)
      95             : {
      96           0 :     sal_uInt16 nCount=rPoly.Count();
      97           0 :     for (sal_uInt16 i=0; i<nCount; i++) {
      98           0 :         RotateXPoly(rPoly[i],rRef,sn,cs);
      99             :     }
     100           0 : }
     101             : 
     102        2197 : void MirrorPoint(Point& rPnt, const Point& rRef1, const Point& rRef2)
     103             : {
     104        2197 :     long mx=rRef2.X()-rRef1.X();
     105        2197 :     long my=rRef2.Y()-rRef1.Y();
     106        2197 :     if (mx==0) { // vertical axis
     107         421 :         long dx=rRef1.X()-rPnt.X();
     108         421 :         rPnt.X()+=2*dx;
     109        1776 :     } else if (my==0) { // horizontal axis
     110        1776 :         long dy=rRef1.Y()-rPnt.Y();
     111        1776 :         rPnt.Y()+=2*dy;
     112           0 :     } else if (mx==my) { // diagonal axis '\'
     113           0 :         long dx1=rPnt.X()-rRef1.X();
     114           0 :         long dy1=rPnt.Y()-rRef1.Y();
     115           0 :         rPnt.X()=rRef1.X()+dy1;
     116           0 :         rPnt.Y()=rRef1.Y()+dx1;
     117           0 :     } else if (mx==-my) { // diagonal axis '/'
     118           0 :         long dx1=rPnt.X()-rRef1.X();
     119           0 :         long dy1=rPnt.Y()-rRef1.Y();
     120           0 :         rPnt.X()=rRef1.X()-dy1;
     121           0 :         rPnt.Y()=rRef1.Y()-dx1;
     122             :     } else { // arbitrary axis
     123             :         // TODO: Optimize this! Raise perpendicular on the mirroring axis..?
     124           0 :         long nRefWink=GetAngle(rRef2-rRef1);
     125           0 :         rPnt-=rRef1;
     126           0 :         long nPntWink=GetAngle(rPnt);
     127           0 :         long nAngle=2*(nRefWink-nPntWink);
     128           0 :         double a=nAngle*nPi180;
     129           0 :         double nSin=sin(a);
     130           0 :         double nCos=cos(a);
     131           0 :         RotatePoint(rPnt,Point(),nSin,nCos);
     132           0 :         rPnt+=rRef1;
     133             :     }
     134        2197 : }
     135             : 
     136           0 : void MirrorPoly(Polygon& rPoly, const Point& rRef1, const Point& rRef2)
     137             : {
     138           0 :     sal_uInt16 nCount=rPoly.GetSize();
     139           0 :     for (sal_uInt16 i=0; i<nCount; i++) {
     140           0 :         MirrorPoint(rPoly[i],rRef1,rRef2);
     141             :     }
     142           0 : }
     143             : 
     144           0 : void MirrorXPoly(XPolygon& rPoly, const Point& rRef1, const Point& rRef2)
     145             : {
     146           0 :     sal_uInt16 nCount=rPoly.GetPointCount();
     147           0 :     for (sal_uInt16 i=0; i<nCount; i++) {
     148           0 :         MirrorPoint(rPoly[i],rRef1,rRef2);
     149             :     }
     150           0 : }
     151             : 
     152           8 : void ShearPoly(Polygon& rPoly, const Point& rRef, double tn, bool bVShear)
     153             : {
     154           8 :     sal_uInt16 nCount=rPoly.GetSize();
     155          48 :     for (sal_uInt16 i=0; i<nCount; i++) {
     156          40 :         ShearPoint(rPoly[i],rRef,tn,bVShear);
     157             :     }
     158           8 : }
     159             : 
     160           0 : void ShearXPoly(XPolygon& rPoly, const Point& rRef, double tn, bool bVShear)
     161             : {
     162           0 :     sal_uInt16 nCount=rPoly.GetPointCount();
     163           0 :     for (sal_uInt16 i=0; i<nCount; i++) {
     164           0 :         ShearPoint(rPoly[i],rRef,tn,bVShear);
     165             :     }
     166           0 : }
     167             : 
     168           0 : double CrookRotateXPoint(Point& rPnt, Point* pC1, Point* pC2, const Point& rCenter,
     169             :                          const Point& rRad, double& rSin, double& rCos, bool bVert)
     170             : {
     171           0 :     bool bC1=pC1!=NULL;
     172           0 :     bool bC2=pC2!=NULL;
     173           0 :     long x0=rPnt.X();
     174           0 :     long y0=rPnt.Y();
     175           0 :     long cx=rCenter.X();
     176           0 :     long cy=rCenter.Y();
     177           0 :     double nAngle=GetCrookAngle(rPnt,rCenter,rRad,bVert);
     178           0 :     double sn=sin(nAngle);
     179           0 :     double cs=cos(nAngle);
     180           0 :     RotatePoint(rPnt,rCenter,sn,cs);
     181           0 :     if (bC1) {
     182           0 :         if (bVert) {
     183             :             // move into the direction of the center, as a basic position for the rotation
     184           0 :             pC1->Y()-=y0;
     185             :             // resize, account for the distance from the center
     186           0 :             pC1->Y()=Round(((double)pC1->Y()) /rRad.X()*(cx-pC1->X()));
     187           0 :             pC1->Y()+=cy;
     188             :         } else {
     189             :             // move into the direction of the center, as a basic position for the rotation
     190           0 :             pC1->X()-=x0;
     191             :             // resize, account for the distance from the center
     192           0 :             long nPntRad=cy-pC1->Y();
     193           0 :             double nFact=(double)nPntRad/(double)rRad.Y();
     194           0 :             pC1->X()=Round((double)pC1->X()*nFact);
     195           0 :             pC1->X()+=cx;
     196             :         }
     197           0 :         RotatePoint(*pC1,rCenter,sn,cs);
     198             :     }
     199           0 :     if (bC2) {
     200           0 :         if (bVert) {
     201             :             // move into the direction of the center, as a basic position for the rotation
     202           0 :             pC2->Y()-=y0;
     203             :             // resize, account for the distance from the center
     204           0 :             pC2->Y()=Round(((double)pC2->Y()) /rRad.X()*(rCenter.X()-pC2->X()));
     205           0 :             pC2->Y()+=cy;
     206             :         } else {
     207             :             // move into the direction of the center, as a basic position for the rotation
     208           0 :             pC2->X()-=x0;
     209             :             // resize, account for the distance from the center
     210           0 :             long nPntRad=rCenter.Y()-pC2->Y();
     211           0 :             double nFact=(double)nPntRad/(double)rRad.Y();
     212           0 :             pC2->X()=Round((double)pC2->X()*nFact);
     213           0 :             pC2->X()+=cx;
     214             :         }
     215           0 :         RotatePoint(*pC2,rCenter,sn,cs);
     216             :     }
     217           0 :     rSin=sn;
     218           0 :     rCos=cs;
     219           0 :     return nAngle;
     220             : }
     221             : 
     222           0 : double CrookSlantXPoint(Point& rPnt, Point* pC1, Point* pC2, const Point& rCenter,
     223             :                         const Point& rRad, double& rSin, double& rCos, bool bVert)
     224             : {
     225           0 :     bool bC1=pC1!=NULL;
     226           0 :     bool bC2=pC2!=NULL;
     227           0 :     long x0=rPnt.X();
     228           0 :     long y0=rPnt.Y();
     229           0 :     long dx1=0,dy1=0;
     230           0 :     long dxC1=0,dyC1=0;
     231           0 :     long dxC2=0,dyC2=0;
     232           0 :     if (bVert) {
     233           0 :         long nStart=rCenter.X()-rRad.X();
     234           0 :         dx1=rPnt.X()-nStart;
     235           0 :         rPnt.X()=nStart;
     236           0 :         if (bC1) {
     237           0 :             dxC1=pC1->X()-nStart;
     238           0 :             pC1->X()=nStart;
     239             :         }
     240           0 :         if (bC2) {
     241           0 :             dxC2=pC2->X()-nStart;
     242           0 :             pC2->X()=nStart;
     243             :         }
     244             :     } else {
     245           0 :         long nStart=rCenter.Y()-rRad.Y();
     246           0 :         dy1=rPnt.Y()-nStart;
     247           0 :         rPnt.Y()=nStart;
     248           0 :         if (bC1) {
     249           0 :             dyC1=pC1->Y()-nStart;
     250           0 :             pC1->Y()=nStart;
     251             :         }
     252           0 :         if (bC2) {
     253           0 :             dyC2=pC2->Y()-nStart;
     254           0 :             pC2->Y()=nStart;
     255             :         }
     256             :     }
     257           0 :     double nAngle=GetCrookAngle(rPnt,rCenter,rRad,bVert);
     258           0 :     double sn=sin(nAngle);
     259           0 :     double cs=cos(nAngle);
     260           0 :     RotatePoint(rPnt,rCenter,sn,cs);
     261           0 :     if (bC1) { if (bVert) pC1->Y()-=y0-rCenter.Y(); else pC1->X()-=x0-rCenter.X(); RotatePoint(*pC1,rCenter,sn,cs); }
     262           0 :     if (bC2) { if (bVert) pC2->Y()-=y0-rCenter.Y(); else pC2->X()-=x0-rCenter.X(); RotatePoint(*pC2,rCenter,sn,cs); }
     263           0 :     if (bVert) {
     264           0 :         rPnt.X()+=dx1;
     265           0 :         if (bC1) pC1->X()+=dxC1;
     266           0 :         if (bC2) pC2->X()+=dxC2;
     267             :     } else {
     268           0 :         rPnt.Y()+=dy1;
     269           0 :         if (bC1) pC1->Y()+=dyC1;
     270           0 :         if (bC2) pC2->Y()+=dyC2;
     271             :     }
     272           0 :     rSin=sn;
     273           0 :     rCos=cs;
     274           0 :     return nAngle;
     275             : }
     276             : 
     277           0 : double CrookStretchXPoint(Point& rPnt, Point* pC1, Point* pC2, const Point& rCenter,
     278             :                           const Point& rRad, double& rSin, double& rCos, bool bVert,
     279             :                           const Rectangle& rRefRect)
     280             : {
     281           0 :     long y0=rPnt.Y();
     282           0 :     CrookSlantXPoint(rPnt,pC1,pC2,rCenter,rRad,rSin,rCos,bVert);
     283           0 :     if (bVert) {
     284             :     } else {
     285           0 :         long nTop=rRefRect.Top();
     286           0 :         long nBtm=rRefRect.Bottom();
     287           0 :         long nHgt=nBtm-nTop;
     288           0 :         long dy=rPnt.Y()-y0;
     289           0 :         double a=((double)(y0-nTop))/nHgt;
     290           0 :         a*=dy;
     291           0 :         rPnt.Y()=y0+Round(a);
     292           0 :     } return 0.0;
     293             : }
     294             : 
     295             : 
     296             : 
     297           0 : void CrookRotatePoly(XPolygon& rPoly, const Point& rCenter, const Point& rRad, bool bVert)
     298             : {
     299             :     double nSin,nCos;
     300           0 :     sal_uInt16 nPointAnz=rPoly.GetPointCount();
     301           0 :     sal_uInt16 i=0;
     302           0 :     while (i<nPointAnz) {
     303           0 :         Point* pPnt=&rPoly[i];
     304           0 :         Point* pC1=NULL;
     305           0 :         Point* pC2=NULL;
     306           0 :         if (i+1<nPointAnz && rPoly.IsControl(i)) { // control point to the left
     307           0 :             pC1=pPnt;
     308           0 :             i++;
     309           0 :             pPnt=&rPoly[i];
     310             :         }
     311           0 :         i++;
     312           0 :         if (i<nPointAnz && rPoly.IsControl(i)) { // control point to the right
     313           0 :             pC2=&rPoly[i];
     314           0 :             i++;
     315             :         }
     316           0 :         CrookRotateXPoint(*pPnt,pC1,pC2,rCenter,rRad,nSin,nCos,bVert);
     317             :     }
     318           0 : }
     319             : 
     320           0 : void CrookSlantPoly(XPolygon& rPoly, const Point& rCenter, const Point& rRad, bool bVert)
     321             : {
     322             :     double nSin,nCos;
     323           0 :     sal_uInt16 nPointAnz=rPoly.GetPointCount();
     324           0 :     sal_uInt16 i=0;
     325           0 :     while (i<nPointAnz) {
     326           0 :         Point* pPnt=&rPoly[i];
     327           0 :         Point* pC1=NULL;
     328           0 :         Point* pC2=NULL;
     329           0 :         if (i+1<nPointAnz && rPoly.IsControl(i)) { // control point to the left
     330           0 :             pC1=pPnt;
     331           0 :             i++;
     332           0 :             pPnt=&rPoly[i];
     333             :         }
     334           0 :         i++;
     335           0 :         if (i<nPointAnz && rPoly.IsControl(i)) { // control point to the right
     336           0 :             pC2=&rPoly[i];
     337           0 :             i++;
     338             :         }
     339           0 :         CrookSlantXPoint(*pPnt,pC1,pC2,rCenter,rRad,nSin,nCos,bVert);
     340             :     }
     341           0 : }
     342             : 
     343           0 : void CrookStretchPoly(XPolygon& rPoly, const Point& rCenter, const Point& rRad, bool bVert, const Rectangle& rRefRect)
     344             : {
     345             :     double nSin,nCos;
     346           0 :     sal_uInt16 nPointAnz=rPoly.GetPointCount();
     347           0 :     sal_uInt16 i=0;
     348           0 :     while (i<nPointAnz) {
     349           0 :         Point* pPnt=&rPoly[i];
     350           0 :         Point* pC1=NULL;
     351           0 :         Point* pC2=NULL;
     352           0 :         if (i+1<nPointAnz && rPoly.IsControl(i)) { //  control point to the left
     353           0 :             pC1=pPnt;
     354           0 :             i++;
     355           0 :             pPnt=&rPoly[i];
     356             :         }
     357           0 :         i++;
     358           0 :         if (i<nPointAnz && rPoly.IsControl(i)) { // control point to the right
     359           0 :             pC2=&rPoly[i];
     360           0 :             i++;
     361             :         }
     362           0 :         CrookStretchXPoint(*pPnt,pC1,pC2,rCenter,rRad,nSin,nCos,bVert,rRefRect);
     363             :     }
     364           0 : }
     365             : 
     366             : 
     367             : 
     368           0 : void CrookRotatePoly(XPolyPolygon& rPoly, const Point& rCenter, const Point& rRad, bool bVert)
     369             : {
     370           0 :     sal_uInt16 nPolyCount=rPoly.Count();
     371           0 :     for (sal_uInt16 nPolyNum=0; nPolyNum<nPolyCount; nPolyNum++) {
     372           0 :         CrookRotatePoly(rPoly[nPolyNum],rCenter,rRad,bVert);
     373             :     }
     374           0 : }
     375             : 
     376           0 : void CrookSlantPoly(XPolyPolygon& rPoly, const Point& rCenter, const Point& rRad, bool bVert)
     377             : {
     378           0 :     sal_uInt16 nPolyCount=rPoly.Count();
     379           0 :     for (sal_uInt16 nPolyNum=0; nPolyNum<nPolyCount; nPolyNum++) {
     380           0 :         CrookSlantPoly(rPoly[nPolyNum],rCenter,rRad,bVert);
     381             :     }
     382           0 : }
     383             : 
     384           0 : void CrookStretchPoly(XPolyPolygon& rPoly, const Point& rCenter, const Point& rRad, bool bVert, const Rectangle& rRefRect)
     385             : {
     386           0 :     sal_uInt16 nPolyCount=rPoly.Count();
     387           0 :     for (sal_uInt16 nPolyNum=0; nPolyNum<nPolyCount; nPolyNum++) {
     388           0 :         CrookStretchPoly(rPoly[nPolyNum],rCenter,rRad,bVert,rRefRect);
     389             :     }
     390           0 : }
     391             : 
     392             : 
     393             : 
     394       42533 : long GetAngle(const Point& rPnt)
     395             : {
     396       42533 :     long a=0;
     397       42533 :     if (rPnt.Y()==0) {
     398       38601 :         if (rPnt.X()<0) a=-18000;
     399        3932 :     } else if (rPnt.X()==0) {
     400        2788 :         if (rPnt.Y()>0) a=-9000;
     401        1240 :         else a=9000;
     402             :     } else {
     403        1144 :         a=Round((atan2((double)-rPnt.Y(),(double)rPnt.X())/nPi180));
     404             :     }
     405       42533 :     return a;
     406             : }
     407             : 
     408       19487 : long NormAngle180(long a)
     409             : {
     410       19487 :     while (a<18000) a+=36000;
     411       19487 :     while (a>=18000) a-=36000;
     412       19487 :     return a;
     413             : }
     414             : 
     415       22720 : long NormAngle360(long a)
     416             : {
     417       22720 :     while (a<0) a+=36000;
     418       22720 :     while (a>=36000) a-=36000;
     419       22720 :     return a;
     420             : }
     421             : 
     422           0 : sal_uInt16 GetAngleSector(long nAngle)
     423             : {
     424           0 :     while (nAngle<0) nAngle+=36000;
     425           0 :     while (nAngle>=36000) nAngle-=36000;
     426           0 :     if (nAngle< 9000) return 0;
     427           0 :     if (nAngle<18000) return 1;
     428           0 :     if (nAngle<27000) return 2;
     429           0 :     return 3;
     430             : }
     431             : 
     432         132 : long GetLen(const Point& rPnt)
     433             : {
     434         132 :     long x=std::abs(rPnt.X());
     435         132 :     long y=std::abs(rPnt.Y());
     436         132 :     if (x+y<0x8000) { // because 7FFF * 7FFF * 2 = 7FFE0002
     437         132 :         x*=x;
     438         132 :         y*=y;
     439         132 :         x+=y;
     440         132 :         x=Round(sqrt((double)x));
     441         132 :         return x;
     442             :     } else {
     443           0 :         double nx=x;
     444           0 :         double ny=y;
     445           0 :         nx*=nx;
     446           0 :         ny*=ny;
     447           0 :         nx+=ny;
     448           0 :         nx=sqrt(nx);
     449           0 :         if (nx>0x7FFFFFFF) {
     450           0 :             return 0x7FFFFFFF; // we can't go any further, for fear of an overrun!
     451             :         } else {
     452           0 :             return Round(nx);
     453             :         }
     454             :     }
     455             : }
     456             : 
     457             : 
     458             : 
     459       79368 : void GeoStat::RecalcSinCos()
     460             : {
     461       79368 :     if (nRotationAngle==0) {
     462       56599 :         nSin=0.0;
     463       56599 :         nCos=1.0;
     464             :     } else {
     465       22769 :         double a=nRotationAngle*nPi180;
     466       22769 :         nSin=sin(a);
     467       22769 :         nCos=cos(a);
     468             :     }
     469       79368 : }
     470             : 
     471       77644 : void GeoStat::RecalcTan()
     472             : {
     473       77644 :     if (nShearAngle==0) {
     474       59441 :         nTan=0.0;
     475             :     } else {
     476       18203 :         double a=nShearAngle*nPi180;
     477       18203 :         nTan=tan(a);
     478             :     }
     479       77644 : }
     480             : 
     481             : 
     482             : 
     483       19487 : Polygon Rect2Poly(const Rectangle& rRect, const GeoStat& rGeo)
     484             : {
     485       19487 :     Polygon aPol(5);
     486       19487 :     aPol[0]=rRect.TopLeft();
     487       19487 :     aPol[1]=rRect.TopRight();
     488       19487 :     aPol[2]=rRect.BottomRight();
     489       19487 :     aPol[3]=rRect.BottomLeft();
     490       19487 :     aPol[4]=rRect.TopLeft();
     491       19487 :     if (rGeo.nShearAngle!=0) ShearPoly(aPol,rRect.TopLeft(),rGeo.nTan);
     492       19487 :     if (rGeo.nRotationAngle!=0) RotatePoly(aPol,rRect.TopLeft(),rGeo.nSin,rGeo.nCos);
     493       19487 :     return aPol;
     494             : }
     495             : 
     496       19487 : void Poly2Rect(const Polygon& rPol, Rectangle& rRect, GeoStat& rGeo)
     497             : {
     498       19487 :     rGeo.nRotationAngle=GetAngle(rPol[1]-rPol[0]);
     499       19487 :     rGeo.nRotationAngle=NormAngle360(rGeo.nRotationAngle);
     500             :     // rotation successful
     501       19487 :     rGeo.RecalcSinCos();
     502             : 
     503       19487 :     Point aPt1(rPol[1]-rPol[0]);
     504       19487 :     if (rGeo.nRotationAngle!=0) RotatePoint(aPt1,Point(0,0),-rGeo.nSin,rGeo.nCos); // -Sin to reverse rotation
     505       19487 :     long nWdt=aPt1.X();
     506             : 
     507       19487 :     Point aPt0(rPol[0]);
     508       19487 :     Point aPt3(rPol[3]-rPol[0]);
     509       19487 :     if (rGeo.nRotationAngle!=0) RotatePoint(aPt3,Point(0,0),-rGeo.nSin,rGeo.nCos); // -Sin to reverse rotation
     510       19487 :     long nHgt=aPt3.Y();
     511             : 
     512             : 
     513       19487 :     long nShW=GetAngle(aPt3);
     514       19487 :     nShW-=27000; // ShearWink is measured against a vertical line
     515       19487 :     nShW=-nShW;  // Negieren, denn '+' ist Rechtskursivierung
     516             : 
     517       19487 :     bool bMirr=aPt3.Y()<0;
     518       19487 :     if (bMirr) { // "exchange of points" when mirroring
     519          55 :         nHgt=-nHgt;
     520          55 :         nShW+=18000;
     521          55 :         aPt0=rPol[3];
     522             :     }
     523       19487 :     nShW=NormAngle180(nShW);
     524       19487 :     if (nShW<-9000 || nShW>9000) {
     525           0 :         nShW=NormAngle180(nShW+18000);
     526             :     }
     527       19487 :     if (nShW<-SDRMAXSHEAR) nShW=-SDRMAXSHEAR; // limit ShearWinkel (shear angle) to +/- 89.00 deg
     528       19487 :     if (nShW>SDRMAXSHEAR)  nShW=SDRMAXSHEAR;
     529       19487 :     rGeo.nShearAngle=nShW;
     530       19487 :     rGeo.RecalcTan();
     531       19487 :     Point aRU(aPt0);
     532       19487 :     aRU.X()+=nWdt;
     533       19487 :     aRU.Y()+=nHgt;
     534       19487 :     rRect=Rectangle(aPt0,aRU);
     535       19487 : }
     536             : 
     537             : 
     538             : 
     539           0 : void OrthoDistance8(const Point& rPt0, Point& rPt, bool bBigOrtho)
     540             : {
     541           0 :     long dx=rPt.X()-rPt0.X();
     542           0 :     long dy=rPt.Y()-rPt0.Y();
     543           0 :     long dxa=std::abs(dx);
     544           0 :     long dya=std::abs(dy);
     545           0 :     if (dx==0 || dy==0 || dxa==dya) return;
     546           0 :     if (dxa>=dya*2) { rPt.Y()=rPt0.Y(); return; }
     547           0 :     if (dya>=dxa*2) { rPt.X()=rPt0.X(); return; }
     548           0 :     if ((dxa<dya) != bBigOrtho) {
     549           0 :         rPt.Y()=rPt0.Y()+(dxa* (dy>=0 ? 1 : -1) );
     550             :     } else {
     551           0 :         rPt.X()=rPt0.X()+(dya* (dx>=0 ? 1 : -1) );
     552             :     }
     553             : }
     554             : 
     555           0 : void OrthoDistance4(const Point& rPt0, Point& rPt, bool bBigOrtho)
     556             : {
     557           0 :     long dx=rPt.X()-rPt0.X();
     558           0 :     long dy=rPt.Y()-rPt0.Y();
     559           0 :     long dxa=std::abs(dx);
     560           0 :     long dya=std::abs(dy);
     561           0 :     if ((dxa<dya) != bBigOrtho) {
     562           0 :         rPt.Y()=rPt0.Y()+(dxa* (dy>=0 ? 1 : -1) );
     563             :     } else {
     564           0 :         rPt.X()=rPt0.X()+(dya* (dx>=0 ? 1 : -1) );
     565             :     }
     566           0 : }
     567             : 
     568             : 
     569             : 
     570       15969 : long BigMulDiv(long nVal, long nMul, long nDiv)
     571             : {
     572       15969 :     BigInt aVal(nVal);
     573       15969 :     aVal*=nMul;
     574       15969 :     if (aVal.IsNeg()!=(nDiv<0)) {
     575          67 :         aVal-=nDiv/2; // to round correctly
     576             :     } else {
     577       15902 :         aVal+=nDiv/2; // to round correctly
     578             :     }
     579       15969 :     if(nDiv)
     580             :     {
     581       15969 :         aVal/=nDiv;
     582       15969 :         return long(aVal);
     583             :     }
     584           0 :     return 0x7fffffff;
     585             : }
     586             : 
     587         356 : void Kuerzen(Fraction& rF, unsigned nDigits)
     588             : {
     589         356 :     sal_Int32 nMul=rF.GetNumerator();
     590         356 :     sal_Int32 nDiv=rF.GetDenominator();
     591         356 :     bool bNeg = false;
     592         356 :     if (nMul<0) { nMul=-nMul; bNeg=!bNeg; }
     593         356 :     if (nDiv<0) { nDiv=-nDiv; bNeg=!bNeg; }
     594         528 :     if (nMul==0 || nDiv==0) return;
     595             :     sal_uInt32 a;
     596         184 :     a=sal_uInt32(nMul); unsigned nMulZ=0; // count leading zeros
     597         184 :     while (a<0x00800000) { nMulZ+=8; a<<=8; }
     598         184 :     while (a<0x80000000) { nMulZ++; a<<=1; }
     599         184 :     a=sal_uInt32(nDiv); unsigned nDivZ=0; // count leading zeros
     600         184 :     while (a<0x00800000) { nDivZ+=8; a<<=8; }
     601         184 :     while (a<0x80000000) { nDivZ++; a<<=1; }
     602             :     // count the number of digits
     603         184 :     int nMulDigits=32-nMulZ;
     604         184 :     int nDivDigits=32-nDivZ;
     605             :     // count how many decimal places can be removed
     606         184 :     int nMulWeg=nMulDigits-nDigits; if (nMulWeg<0) nMulWeg=0;
     607         184 :     int nDivWeg=nDivDigits-nDigits; if (nDivWeg<0) nDivWeg=0;
     608         184 :     int nWeg=std::min(nMulWeg,nDivWeg);
     609         184 :     nMul>>=nWeg;
     610         184 :     nDiv>>=nWeg;
     611         184 :     if (nMul==0 || nDiv==0) {
     612             :         DBG_WARNING("Math error after canceling decimal places.");
     613           0 :         return;
     614             :     }
     615         184 :     if (bNeg) nMul=-nMul;
     616         184 :     rF=Fraction(nMul,nDiv);
     617             : }
     618             : 
     619             : 
     620             : // How many eU units fit into a mm, respectively an inch?
     621             : // Or: How many mm, respectively inches, are there in an eU (and then give me the inverse)
     622             : 
     623        1714 : FrPair GetInchOrMM(MapUnit eU)
     624             : {
     625        1714 :     switch (eU) {
     626           0 :         case MAP_1000TH_INCH: return FrPair(1000,1);
     627           0 :         case MAP_100TH_INCH : return FrPair( 100,1);
     628           0 :         case MAP_10TH_INCH  : return FrPair(  10,1);
     629         388 :         case MAP_INCH       : return FrPair(   1,1);
     630         388 :         case MAP_POINT      : return FrPair(  72,1);
     631         227 :         case MAP_TWIP       : return FrPair(1440,1);
     632         711 :         case MAP_100TH_MM   : return FrPair( 100,1);
     633           0 :         case MAP_10TH_MM    : return FrPair(  10,1);
     634           0 :         case MAP_MM         : return FrPair(   1,1);
     635           0 :         case MAP_CM         : return FrPair(   1,10);
     636             :         case MAP_PIXEL      : {
     637           0 :             ScopedVclPtrInstance< VirtualDevice > pVD;
     638           0 :             pVD->SetMapMode(MapMode(MAP_100TH_MM));
     639           0 :             Point aP(pVD->PixelToLogic(Point(64,64))); // 64 pixels for more accuracy
     640           0 :             return FrPair(6400,aP.X(),6400,aP.Y());
     641             :         }
     642             :         case MAP_APPFONT: case MAP_SYSFONT: {
     643           0 :             ScopedVclPtrInstance< VirtualDevice > pVD;
     644           0 :             pVD->SetMapMode(MapMode(eU));
     645           0 :             Point aP(pVD->LogicToPixel(Point(32,32))); // 32 units for more accuracy
     646           0 :             pVD->SetMapMode(MapMode(MAP_100TH_MM));
     647           0 :             aP=pVD->PixelToLogic(aP);
     648           0 :             return FrPair(3200,aP.X(),3200,aP.Y());
     649             :         }
     650           0 :         default: break;
     651             :     }
     652           0 :     return Fraction(1,1);
     653             : }
     654             : 
     655           0 : FrPair GetInchOrMM(FieldUnit eU)
     656             : {
     657           0 :     switch (eU) {
     658           0 :         case FUNIT_INCH       : return FrPair(   1,1);
     659           0 :         case FUNIT_POINT      : return FrPair(  72,1);
     660           0 :         case FUNIT_TWIP       : return FrPair(1440,1);
     661           0 :         case FUNIT_100TH_MM   : return FrPair( 100,1);
     662           0 :         case FUNIT_MM         : return FrPair(   1,1);
     663           0 :         case FUNIT_CM         : return FrPair(   1,10);
     664           0 :         case FUNIT_M          : return FrPair(   1,1000);
     665           0 :         case FUNIT_KM         : return FrPair(   1,1000000);
     666           0 :         case FUNIT_PICA       : return FrPair(   6,1);
     667           0 :         case FUNIT_FOOT       : return FrPair(   1,12);
     668           0 :         case FUNIT_MILE       : return FrPair(   1,63360);
     669           0 :         default: break;
     670             :     }
     671           0 :     return Fraction(1,1);
     672             : }
     673             : 
     674             : // Calculate the factor that we need to convert units from eS to eD.
     675             : // e. g. GetMapFactor(UNIT_MM,UNIT_100TH_MM) => 100.
     676             : 
     677        1172 : FrPair GetMapFactor(MapUnit eS, MapUnit eD)
     678             : {
     679        1172 :     if (eS==eD) return FrPair(1,1,1,1);
     680         857 :     FrPair aS(GetInchOrMM(eS));
     681        1714 :     FrPair aD(GetInchOrMM(eD));
     682         857 :     bool bSInch=IsInch(eS);
     683         857 :     bool bDInch=IsInch(eD);
     684        1714 :     FrPair aRet(aD.X()/aS.X(),aD.Y()/aS.Y());
     685         857 :     if (bSInch && !bDInch) { aRet.X()*=Fraction(127,5); aRet.Y()*=Fraction(127,5); }
     686         857 :     if (!bSInch && bDInch) { aRet.X()*=Fraction(5,127); aRet.Y()*=Fraction(5,127); }
     687        1714 :     return aRet;
     688             : };
     689             : 
     690           0 : FrPair GetMapFactor(FieldUnit eS, FieldUnit eD)
     691             : {
     692           0 :     if (eS==eD) return FrPair(1,1,1,1);
     693           0 :     FrPair aS(GetInchOrMM(eS));
     694           0 :     FrPair aD(GetInchOrMM(eD));
     695           0 :     bool bSInch=IsInch(eS);
     696           0 :     bool bDInch=IsInch(eD);
     697           0 :     FrPair aRet(aD.X()/aS.X(),aD.Y()/aS.Y());
     698           0 :     if (bSInch && !bDInch) { aRet.X()*=Fraction(127,5); aRet.Y()*=Fraction(127,5); }
     699           0 :     if (!bSInch && bDInch) { aRet.X()*=Fraction(5,127); aRet.Y()*=Fraction(5,127); }
     700           0 :     return aRet;
     701             : };
     702             : 
     703             : 
     704             : 
     705             :     // 1 mile    =  8 furlong = 63.360" = 1.609.344,0mm
     706             :     // 1 furlong = 10 chains  =  7.920" =   201.168,0mm
     707             :     // 1 chain   =  4 poles   =    792" =    20.116,8mm
     708             :     // 1 pole    =  5 1/2 yd  =    198" =     5.029,2mm
     709             :     // 1 yd      =  3 ft      =     36" =       914,4mm
     710             :     // 1 ft      = 12 "       =      1" =       304,8mm
     711             : 
     712           0 : void GetMeterOrInch(MapUnit eMU, short& rnKomma, long& rnMul, long& rnDiv, bool& rbMetr, bool& rbInch)
     713             : {
     714           0 :     rnMul=1; rnDiv=1;
     715           0 :     short nKomma=0;
     716           0 :     bool bMetr = false, bInch = false;
     717           0 :     switch (eMU) {
     718             :         // Metrisch
     719           0 :         case MAP_100TH_MM   : bMetr = true; nKomma=5; break;
     720           0 :         case MAP_10TH_MM    : bMetr = true; nKomma=4; break;
     721           0 :         case MAP_MM         : bMetr = true; nKomma=3; break;
     722           0 :         case MAP_CM         : bMetr = true; nKomma=2; break;
     723             :         // Inch
     724           0 :         case MAP_1000TH_INCH: bInch = true; nKomma=3; break;
     725           0 :         case MAP_100TH_INCH : bInch = true; nKomma=2; break;
     726           0 :         case MAP_10TH_INCH  : bInch = true; nKomma=1; break;
     727           0 :         case MAP_INCH       : bInch = true; nKomma=0; break;
     728           0 :         case MAP_POINT      : bInch = true; rnDiv=72;  break;          // 1Pt   = 1/72"
     729           0 :         case MAP_TWIP       : bInch = true; rnDiv=144; nKomma=1; break; // 1Twip = 1/1440"
     730             :         // Sonstiges
     731           0 :         case MAP_PIXEL      : break;
     732           0 :         case MAP_SYSFONT    : break;
     733           0 :         case MAP_APPFONT    : break;
     734           0 :         case MAP_RELATIVE   : break;
     735           0 :         default: break;
     736             :     } // switch
     737           0 :     rnKomma=nKomma;
     738           0 :     rbMetr=bMetr;
     739           0 :     rbInch=bInch;
     740           0 : }
     741             : 
     742           0 : void GetMeterOrInch(FieldUnit eFU, short& rnKomma, long& rnMul, long& rnDiv, bool& rbMetr, bool& rbInch)
     743             : {
     744           0 :     rnMul=1; rnDiv=1;
     745           0 :     short nKomma=0;
     746           0 :     bool bMetr = false, bInch = false;
     747           0 :     switch (eFU) {
     748           0 :         case FUNIT_NONE     : break;
     749             :         // metrically
     750           0 :         case FUNIT_100TH_MM : bMetr = true; nKomma=5; break;
     751           0 :         case FUNIT_MM       : bMetr = true; nKomma=3; break;
     752           0 :         case FUNIT_CM       : bMetr = true; nKomma=2; break;
     753           0 :         case FUNIT_M        : bMetr = true; nKomma=0; break;
     754           0 :         case FUNIT_KM       : bMetr = true; nKomma=-3; break;
     755             :         // Inch
     756           0 :         case FUNIT_TWIP     : bInch = true; rnDiv=144; nKomma=1; break;  // 1Twip = 1/1440"
     757           0 :         case FUNIT_POINT    : bInch = true; rnDiv=72; break;   // 1Pt   = 1/72"
     758           0 :         case FUNIT_PICA     : bInch = true; rnDiv=6; break;    // 1Pica = 1/6"  ?
     759           0 :         case FUNIT_INCH     : bInch = true; break;             // 1"    = 1"
     760           0 :         case FUNIT_FOOT     : bInch = true; rnMul=12; break;   // 1Ft   = 12"
     761           0 :         case FUNIT_MILE     : bInch = true; rnMul=6336; nKomma=-1; break; // 1mile = 63360"
     762             :         // others
     763           0 :         case FUNIT_CUSTOM   : break;
     764           0 :         case FUNIT_PERCENT  : nKomma=2; break;
     765             :         // TODO: Add code to handle the following (added to remove warning)
     766           0 :         case FUNIT_CHAR     : break;
     767           0 :         case FUNIT_LINE     : break;
     768           0 :         case FUNIT_PIXEL    : break;
     769           0 :         case FUNIT_DEGREE   : break;
     770           0 :         case FUNIT_SECOND   : break;
     771           0 :         case FUNIT_MILLISECOND   : break;
     772             :     } // switch
     773           0 :     rnKomma=nKomma;
     774           0 :     rbMetr=bMetr;
     775           0 :     rbInch=bInch;
     776           0 : }
     777             : 
     778           0 : void SdrFormatter::Undirty()
     779             : {
     780             :     bool bSrcMetr,bSrcInch,bDstMetr,bDstInch;
     781             :     long nMul1,nDiv1,nMul2,nDiv2;
     782             :     short nKomma1,nKomma2;
     783             :     // first: normalize to m or in
     784           0 :     if (!bSrcFU) {
     785           0 :         GetMeterOrInch(eSrcMU,nKomma1,nMul1,nDiv1,bSrcMetr,bSrcInch);
     786             :     } else {
     787           0 :         GetMeterOrInch(eSrcFU,nKomma1,nMul1,nDiv1,bSrcMetr,bSrcInch);
     788             :     }
     789           0 :     if (!bDstFU) {
     790           0 :         GetMeterOrInch(eDstMU,nKomma2,nMul2,nDiv2,bDstMetr,bDstInch);
     791             :     } else {
     792           0 :         GetMeterOrInch(eDstFU,nKomma2,nMul2,nDiv2,bDstMetr,bDstInch);
     793             :     }
     794           0 :     nMul1*=nDiv2;
     795           0 :     nDiv1*=nMul2;
     796           0 :     nKomma1=nKomma1-nKomma2;
     797             : 
     798           0 :     if (bSrcInch && bDstMetr) {
     799           0 :         nKomma1+=4;
     800           0 :         nMul1*=254;
     801             :     }
     802           0 :     if (bSrcMetr && bDstInch) {
     803           0 :         nKomma1-=4;
     804           0 :         nDiv1*=254;
     805             :     }
     806             : 
     807             :     // temporary fraction for canceling
     808           0 :     Fraction aTempFract(nMul1,nDiv1);
     809           0 :     nMul1=aTempFract.GetNumerator();
     810           0 :     nDiv1=aTempFract.GetDenominator();
     811             : 
     812           0 :     nMul_=nMul1;
     813           0 :     nDiv_=nDiv1;
     814           0 :     nKomma_=nKomma1;
     815           0 :     bDirty=false;
     816           0 : }
     817             : 
     818             : 
     819           0 : void SdrFormatter::TakeStr(long nVal, OUString& rStr) const
     820             : {
     821           0 :     OUString aNullCode("0");
     822             : 
     823           0 :     if(!nVal)
     824             :     {
     825           0 :         rStr = aNullCode;
     826           0 :         return;
     827             :     }
     828             : 
     829             :     // we may lose some decimal places here, because of MulDiv instead of Real
     830           0 :     bool bNeg(nVal < 0);
     831           0 :     SvtSysLocale aSysLoc;
     832           0 :     const LocaleDataWrapper& rLoc = aSysLoc.GetLocaleData();
     833             : 
     834           0 :     ForceUndirty();
     835             : 
     836           0 :     sal_Int16 nC(nKomma_);
     837             : 
     838           0 :     if(bNeg)
     839           0 :         nVal = -nVal;
     840             : 
     841           0 :     while(nC <= -3)
     842             :     {
     843           0 :         nVal *= 1000;
     844           0 :         nC += 3;
     845             :     }
     846             : 
     847           0 :     while(nC <= -1)
     848             :     {
     849           0 :         nVal *= 10;
     850           0 :         nC++;
     851             :     }
     852             : 
     853           0 :     if(nMul_ != nDiv_)
     854           0 :         nVal = BigMulDiv(nVal, nMul_, nDiv_);
     855             : 
     856           0 :     OUStringBuffer aStr = OUString::number(nVal);
     857             : 
     858           0 :     if(nC > 0 && aStr.getLength() <= nC )
     859             :     {
     860             :         // decimal separator necessary
     861           0 :         sal_Int32 nCount(nC - aStr.getLength());
     862             : 
     863           0 :         if(nCount >= 0 && LocaleDataWrapper::isNumLeadingZero())
     864           0 :             nCount++;
     865             : 
     866           0 :         for(sal_Int32  i=0; i<nCount; i++)
     867           0 :             aStr.insert(0, aNullCode);
     868             : 
     869             :         // remove superfluous decimal points
     870           0 :         sal_Int32 nNumDigits(LocaleDataWrapper::getNumDigits());
     871           0 :         sal_Int32 nWeg(nC - nNumDigits);
     872             : 
     873           0 :         if(nWeg > 0)
     874             :         {
     875             :             // TODO: we should round here
     876           0 :             aStr.remove(aStr.getLength() - nWeg, nWeg);
     877           0 :             nC = nNumDigits;
     878             :         }
     879             :     }
     880             : 
     881             :     // remember everything before the decimal separator for later
     882           0 :     sal_Int32 nForComma(aStr.getLength() - nC);
     883             : 
     884           0 :     if(nC > 0)
     885             :     {
     886             :         // insert comma char (decimal separator)
     887             :         // remove trailing zeros
     888           0 :         while(nC > 0 && aStr[aStr.getLength() - 1] == aNullCode[0])
     889             :         {
     890           0 :             aStr.remove(aStr.getLength() - 1, 1);
     891           0 :             nC--;
     892             :         }
     893             : 
     894           0 :         if(nC > 0)
     895             :         {
     896             :             // do we still have decimal places?
     897           0 :             sal_Unicode cDec(rLoc.getNumDecimalSep()[0]);
     898           0 :             aStr.insert(nForComma, cDec);
     899             :         }
     900             :     }
     901             : 
     902             :     // add in thousands separator (if necessary)
     903           0 :     if( nForComma > 3 )
     904             :     {
     905           0 :         OUString aThoSep( rLoc.getNumThousandSep() );
     906           0 :         if ( aThoSep.getLength() > 0 )
     907             :         {
     908           0 :             sal_Unicode cTho( aThoSep[0] );
     909           0 :             sal_Int32 i(nForComma - 3);
     910             : 
     911           0 :             while(i > 0)
     912             :             {
     913           0 :                 aStr.insert(i, cTho);
     914           0 :                 i -= 3;
     915             :             }
     916           0 :         }
     917             :     }
     918             : 
     919           0 :     if(aStr.isEmpty())
     920           0 :         aStr.insert(aStr.getLength(), aNullCode);
     921             : 
     922           0 :     if(bNeg && (aStr.getLength() > 1 || aStr[0] != aNullCode[0]))
     923             :     {
     924           0 :         aStr.insert(0, "-");
     925             :     }
     926             : 
     927           0 :     rStr = aStr.makeStringAndClear();
     928             : }
     929             : 
     930           0 : void SdrFormatter::TakeUnitStr(MapUnit eUnit, OUString& rStr)
     931             : {
     932           0 :     switch(eUnit)
     933             :     {
     934             :         // metrically
     935             :         case MAP_100TH_MM   :
     936             :         {
     937           0 :             rStr = "/100mm";
     938           0 :             break;
     939             :         }
     940             :         case MAP_10TH_MM    :
     941             :         {
     942           0 :             rStr = "/10mm";
     943           0 :             break;
     944             :         }
     945             :         case MAP_MM         :
     946             :         {
     947           0 :             rStr = "mm";
     948           0 :             break;
     949             :         }
     950             :         case MAP_CM         :
     951             :         {
     952           0 :             rStr = "cm";
     953           0 :             break;
     954             :         }
     955             : 
     956             :         // Inch
     957             :         case MAP_1000TH_INCH:
     958             :         {
     959           0 :             rStr = "/1000\"";
     960           0 :             break;
     961             :         }
     962             :         case MAP_100TH_INCH :
     963             :         {
     964           0 :             rStr = "/100\"";
     965           0 :             break;
     966             :         }
     967             :         case MAP_10TH_INCH  :
     968             :         {
     969           0 :             rStr = "/10\"";
     970           0 :             break;
     971             :         }
     972             :         case MAP_INCH       :
     973             :         {
     974           0 :             rStr = "\"";
     975           0 :             break;
     976             :         }
     977             :         case MAP_POINT      :
     978             :         {
     979           0 :             rStr = "pt";
     980           0 :             break;
     981             :         }
     982             :         case MAP_TWIP       :
     983             :         {
     984           0 :             rStr = "twip";
     985           0 :             break;
     986             :         }
     987             : 
     988             :         // others
     989             :         case MAP_PIXEL      :
     990             :         {
     991           0 :             rStr = "pixel";
     992           0 :             break;
     993             :         }
     994             :         case MAP_SYSFONT    :
     995             :         {
     996           0 :             rStr = "sysfont";
     997           0 :             break;
     998             :         }
     999             :         case MAP_APPFONT    :
    1000             :         {
    1001           0 :             rStr = "appfont";
    1002           0 :             break;
    1003             :         }
    1004             :         case MAP_RELATIVE   :
    1005             :         {
    1006           0 :             rStr = "%";
    1007           0 :             break;
    1008             :         }
    1009           0 :         default: break;
    1010             :     }
    1011           0 : }
    1012             : 
    1013           0 : void SdrFormatter::TakeUnitStr(FieldUnit eUnit, OUString& rStr)
    1014             : {
    1015           0 :     switch(eUnit)
    1016             :     {
    1017             :         default             :
    1018             :         case FUNIT_NONE     :
    1019             :         case FUNIT_CUSTOM   :
    1020             :         {
    1021           0 :             rStr.clear();
    1022           0 :             break;
    1023             :         }
    1024             : 
    1025             :         // metrically
    1026             :         case FUNIT_100TH_MM:
    1027             :         {
    1028           0 :             rStr = "/100mm";
    1029           0 :             break;
    1030             :         }
    1031             :         case FUNIT_MM     :
    1032             :         {
    1033           0 :             rStr = "mm";
    1034           0 :             break;
    1035             :         }
    1036             :         case FUNIT_CM     :
    1037             :         {
    1038           0 :             rStr = "cm";
    1039           0 :             break;
    1040             :         }
    1041             :         case FUNIT_M      :
    1042             :         {
    1043           0 :             rStr = "m";
    1044           0 :             break;
    1045             :         }
    1046             :         case FUNIT_KM     :
    1047             :         {
    1048           0 :             rStr = "km";
    1049           0 :             break;
    1050             :         }
    1051             : 
    1052             :         // Inch
    1053             :         case FUNIT_TWIP   :
    1054             :         {
    1055           0 :             rStr = "twip";
    1056           0 :             break;
    1057             :         }
    1058             :         case FUNIT_POINT  :
    1059             :         {
    1060           0 :             rStr = "pt";
    1061           0 :             break;
    1062             :         }
    1063             :         case FUNIT_PICA   :
    1064             :         {
    1065           0 :             rStr = "pica";
    1066           0 :             break;
    1067             :         }
    1068             :         case FUNIT_INCH   :
    1069             :         {
    1070           0 :             rStr = "\"";
    1071           0 :             break;
    1072             :         }
    1073             :         case FUNIT_FOOT   :
    1074             :         {
    1075           0 :             rStr = "ft";
    1076           0 :             break;
    1077             :         }
    1078             :         case FUNIT_MILE   :
    1079             :         {
    1080           0 :             rStr = "mile(s)";
    1081           0 :             break;
    1082             :         }
    1083             : 
    1084             :         // others
    1085             :         case FUNIT_PERCENT:
    1086             :         {
    1087           0 :             rStr = "%";
    1088           0 :             break;
    1089             :         }
    1090             :     }
    1091         435 : }
    1092             : 
    1093             : 
    1094             : 
    1095             : 
    1096             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11