PageRenderTime 70ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 1ms

/svx/source/svdraw/svdtrans.cxx

https://bitbucket.org/mst/ooo340
C++ | 1271 lines | 1046 code | 114 blank | 111 comment | 194 complexity | 1bba4ad298fcc9d375d186e8125e3a28 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, LGPL-3.0, AGPL-1.0, BSD-3-Clause-No-Nuclear-License-2014, GPL-3.0, GPL-2.0, BSD-3-Clause, LGPL-2.1
  1. /*************************************************************************
  2. *
  3. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4. *
  5. * Copyright 2000, 2010 Oracle and/or its affiliates.
  6. *
  7. * OpenOffice.org - a multi-platform office productivity suite
  8. *
  9. * This file is part of OpenOffice.org.
  10. *
  11. * OpenOffice.org is free software: you can redistribute it and/or modify
  12. * it under the terms of the GNU Lesser General Public License version 3
  13. * only, as published by the Free Software Foundation.
  14. *
  15. * OpenOffice.org is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU Lesser General Public License version 3 for more details
  19. * (a copy is included in the LICENSE file that accompanied this code).
  20. *
  21. * You should have received a copy of the GNU Lesser General Public License
  22. * version 3 along with OpenOffice.org. If not, see
  23. * <http://www.openoffice.org/license.html>
  24. * for a copy of the LGPLv3 License.
  25. *
  26. ************************************************************************/
  27. // MARKER(update_precomp.py): autogen include statement, do not remove
  28. #include "precompiled_svx.hxx"
  29. #include <svx/svdtrans.hxx>
  30. #include <math.h>
  31. #include <svx/xpoly.hxx>
  32. #include <vcl/virdev.hxx>
  33. #include <tools/bigint.hxx>
  34. #include <tools/debug.hxx>
  35. #include <unotools/syslocale.hxx>
  36. ////////////////////////////////////////////////////////////////////////////////////////////////////
  37. void MoveXPoly(XPolygon& rPoly, const Size& S)
  38. {
  39. rPoly.Move(S.Width(),S.Height());
  40. }
  41. void MoveXPoly(XPolyPolygon& rPoly, const Size& S)
  42. {
  43. rPoly.Move(S.Width(),S.Height());
  44. }
  45. ////////////////////////////////////////////////////////////////////////////////////////////////////
  46. void ResizeRect(Rectangle& rRect, const Point& rRef, const Fraction& rxFact, const Fraction& ryFact, FASTBOOL bNoJustify)
  47. {
  48. Fraction xFact(rxFact);
  49. Fraction yFact(ryFact);
  50. //long nHgt=rRect.Bottom()-rRect.Top();
  51. {
  52. if (xFact.GetDenominator()==0) {
  53. long nWdt=rRect.Right()-rRect.Left();
  54. if (xFact.GetNumerator()>=0) { // DivZero abfangen
  55. xFact=Fraction(xFact.GetNumerator(),1);
  56. if (nWdt==0) rRect.Right()++;
  57. } else {
  58. xFact=Fraction(xFact.GetNumerator(),-1);
  59. if (nWdt==0) rRect.Left()--;
  60. }
  61. }
  62. rRect.Left() =rRef.X()+Round(((double)(rRect.Left() -rRef.X())*xFact.GetNumerator())/xFact.GetDenominator());
  63. rRect.Right() =rRef.X()+Round(((double)(rRect.Right() -rRef.X())*xFact.GetNumerator())/xFact.GetDenominator());
  64. }
  65. {
  66. if (yFact.GetDenominator()==0) {
  67. long nHgt=rRect.Bottom()-rRect.Top();
  68. if (yFact.GetNumerator()>=0) { // DivZero abfangen
  69. yFact=Fraction(yFact.GetNumerator(),1);
  70. if (nHgt==0) rRect.Bottom()++;
  71. } else {
  72. yFact=Fraction(yFact.GetNumerator(),-1);
  73. if (nHgt==0) rRect.Top()--;
  74. }
  75. yFact=Fraction(yFact.GetNumerator(),1); // DivZero abfangen
  76. }
  77. rRect.Top() =rRef.Y()+Round(((double)(rRect.Top() -rRef.Y())*yFact.GetNumerator())/yFact.GetDenominator());
  78. rRect.Bottom()=rRef.Y()+Round(((double)(rRect.Bottom()-rRef.Y())*yFact.GetNumerator())/yFact.GetDenominator());
  79. }
  80. if (!bNoJustify) rRect.Justify();
  81. }
  82. void ResizePoly(Polygon& rPoly, const Point& rRef, const Fraction& xFact, const Fraction& yFact)
  83. {
  84. USHORT nAnz=rPoly.GetSize();
  85. for (USHORT i=0; i<nAnz; i++) {
  86. ResizePoint(rPoly[i],rRef,xFact,yFact);
  87. }
  88. }
  89. void ResizeXPoly(XPolygon& rPoly, const Point& rRef, const Fraction& xFact, const Fraction& yFact)
  90. {
  91. USHORT nAnz=rPoly.GetPointCount();
  92. for (USHORT i=0; i<nAnz; i++) {
  93. ResizePoint(rPoly[i],rRef,xFact,yFact);
  94. }
  95. }
  96. void ResizePoly(PolyPolygon& rPoly, const Point& rRef, const Fraction& xFact, const Fraction& yFact)
  97. {
  98. USHORT nAnz=rPoly.Count();
  99. for (USHORT i=0; i<nAnz; i++) {
  100. ResizePoly(rPoly[i],rRef,xFact,yFact);
  101. }
  102. }
  103. void ResizeXPoly(XPolyPolygon& rPoly, const Point& rRef, const Fraction& xFact, const Fraction& yFact)
  104. {
  105. USHORT nAnz=rPoly.Count();
  106. for (USHORT i=0; i<nAnz; i++) {
  107. ResizeXPoly(rPoly[i],rRef,xFact,yFact);
  108. }
  109. }
  110. ////////////////////////////////////////////////////////////////////////////////////////////////////
  111. void RotatePoly(Polygon& rPoly, const Point& rRef, double sn, double cs)
  112. {
  113. USHORT nAnz=rPoly.GetSize();
  114. for (USHORT i=0; i<nAnz; i++) {
  115. RotatePoint(rPoly[i],rRef,sn,cs);
  116. }
  117. }
  118. void RotateXPoly(XPolygon& rPoly, const Point& rRef, double sn, double cs)
  119. {
  120. USHORT nAnz=rPoly.GetPointCount();
  121. for (USHORT i=0; i<nAnz; i++) {
  122. RotatePoint(rPoly[i],rRef,sn,cs);
  123. }
  124. }
  125. void RotatePoly(PolyPolygon& rPoly, const Point& rRef, double sn, double cs)
  126. {
  127. USHORT nAnz=rPoly.Count();
  128. for (USHORT i=0; i<nAnz; i++) {
  129. RotatePoly(rPoly[i],rRef,sn,cs);
  130. }
  131. }
  132. void RotateXPoly(XPolyPolygon& rPoly, const Point& rRef, double sn, double cs)
  133. {
  134. USHORT nAnz=rPoly.Count();
  135. for (USHORT i=0; i<nAnz; i++) {
  136. RotateXPoly(rPoly[i],rRef,sn,cs);
  137. }
  138. }
  139. ////////////////////////////////////////////////////////////////////////////////////////////////////
  140. void MirrorRect(Rectangle& rRect, const Point& /*rRef1*/, const Point& /*rRef2*/, FASTBOOL bNoJustify)
  141. {
  142. // !!! fehlende Implementation !!!
  143. if (!bNoJustify) rRect.Justify();
  144. }
  145. void MirrorPoint(Point& rPnt, const Point& rRef1, const Point& rRef2)
  146. {
  147. long mx=rRef2.X()-rRef1.X();
  148. long my=rRef2.Y()-rRef1.Y();
  149. if (mx==0) { // Achse senkrecht
  150. long dx=rRef1.X()-rPnt.X();
  151. rPnt.X()+=2*dx;
  152. } else if (my==0) { // Achse waagerecht
  153. long dy=rRef1.Y()-rPnt.Y();
  154. rPnt.Y()+=2*dy;
  155. } else if (mx==my) { // Achse diagonal '\'
  156. long dx1=rPnt.X()-rRef1.X();
  157. long dy1=rPnt.Y()-rRef1.Y();
  158. rPnt.X()=rRef1.X()+dy1;
  159. rPnt.Y()=rRef1.Y()+dx1;
  160. } else if (mx==-my) { // Achse diagonal '/'
  161. long dx1=rPnt.X()-rRef1.X();
  162. long dy1=rPnt.Y()-rRef1.Y();
  163. rPnt.X()=rRef1.X()-dy1;
  164. rPnt.Y()=rRef1.Y()-dx1;
  165. } else { // beliebige Achse
  166. // mal optimieren !!!
  167. // Lot auf der Spiegelachse faellen oder so
  168. long nRefWink=GetAngle(rRef2-rRef1);
  169. rPnt-=rRef1;
  170. long nPntWink=GetAngle(rPnt);
  171. long nWink=2*(nRefWink-nPntWink);
  172. double a=nWink*nPi180;
  173. double nSin=sin(a);
  174. double nCos=cos(a);
  175. RotatePoint(rPnt,Point(),nSin,nCos);
  176. rPnt+=rRef1;
  177. }
  178. }
  179. void MirrorPoly(Polygon& rPoly, const Point& rRef1, const Point& rRef2)
  180. {
  181. USHORT nAnz=rPoly.GetSize();
  182. for (USHORT i=0; i<nAnz; i++) {
  183. MirrorPoint(rPoly[i],rRef1,rRef2);
  184. }
  185. }
  186. void MirrorXPoly(XPolygon& rPoly, const Point& rRef1, const Point& rRef2)
  187. {
  188. USHORT nAnz=rPoly.GetPointCount();
  189. for (USHORT i=0; i<nAnz; i++) {
  190. MirrorPoint(rPoly[i],rRef1,rRef2);
  191. }
  192. }
  193. void MirrorPoly(PolyPolygon& rPoly, const Point& rRef1, const Point& rRef2)
  194. {
  195. USHORT nAnz=rPoly.Count();
  196. for (USHORT i=0; i<nAnz; i++) {
  197. MirrorPoly(rPoly[i],rRef1,rRef2);
  198. }
  199. }
  200. void MirrorXPoly(XPolyPolygon& rPoly, const Point& rRef1, const Point& rRef2)
  201. {
  202. USHORT nAnz=rPoly.Count();
  203. for (USHORT i=0; i<nAnz; i++) {
  204. MirrorXPoly(rPoly[i],rRef1,rRef2);
  205. }
  206. }
  207. ////////////////////////////////////////////////////////////////////////////////////////////////////
  208. void ShearPoly(Polygon& rPoly, const Point& rRef, double tn, FASTBOOL bVShear)
  209. {
  210. USHORT nAnz=rPoly.GetSize();
  211. for (USHORT i=0; i<nAnz; i++) {
  212. ShearPoint(rPoly[i],rRef,tn,bVShear);
  213. }
  214. }
  215. void ShearXPoly(XPolygon& rPoly, const Point& rRef, double tn, FASTBOOL bVShear)
  216. {
  217. USHORT nAnz=rPoly.GetPointCount();
  218. for (USHORT i=0; i<nAnz; i++) {
  219. ShearPoint(rPoly[i],rRef,tn,bVShear);
  220. }
  221. }
  222. void ShearPoly(PolyPolygon& rPoly, const Point& rRef, double tn, FASTBOOL bVShear)
  223. {
  224. USHORT nAnz=rPoly.Count();
  225. for (USHORT i=0; i<nAnz; i++) {
  226. ShearPoly(rPoly[i],rRef,tn,bVShear);
  227. }
  228. }
  229. void ShearXPoly(XPolyPolygon& rPoly, const Point& rRef, double tn, FASTBOOL bVShear)
  230. {
  231. USHORT nAnz=rPoly.Count();
  232. for (USHORT i=0; i<nAnz; i++) {
  233. ShearXPoly(rPoly[i],rRef,tn,bVShear);
  234. }
  235. }
  236. ////////////////////////////////////////////////////////////////////////////////////////////////////
  237. //
  238. // @@@@ @@@@@ @@@@ @@@@ @@ @@
  239. // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
  240. // @@ @@ @@ @@ @@ @@ @@ @@ @@
  241. // @@ @@@@@ @@ @@ @@ @@ @@@@
  242. // @@ @@ @@ @@ @@ @@ @@ @@ @@
  243. // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
  244. // @@@@ @@ @@ @@@@ @@@@ @@ @@
  245. //
  246. ////////////////////////////////////////////////////////////////////////////////////////////////////
  247. double CrookRotateXPoint(Point& rPnt, Point* pC1, Point* pC2, const Point& rCenter,
  248. const Point& rRad, double& rSin, double& rCos, FASTBOOL bVert)
  249. {
  250. FASTBOOL bC1=pC1!=NULL;
  251. FASTBOOL bC2=pC2!=NULL;
  252. long x0=rPnt.X();
  253. long y0=rPnt.Y();
  254. long cx=rCenter.X();
  255. long cy=rCenter.Y();
  256. double nWink=GetCrookAngle(rPnt,rCenter,rRad,bVert);
  257. double sn=sin(nWink);
  258. double cs=cos(nWink);
  259. RotatePoint(rPnt,rCenter,sn,cs);
  260. if (bC1) {
  261. if (bVert) {
  262. // Richtung Zentrum verschieben, als Ausgangsposition fuer Rotate
  263. pC1->Y()-=y0;
  264. // Resize, entsprechend der Entfernung vom Zentrum
  265. pC1->Y()=Round(((double)pC1->Y()) /rRad.X()*(cx-pC1->X()));
  266. pC1->Y()+=cy;
  267. } else {
  268. // Richtung Zentrum verschieben, als Ausgangsposition fuer Rotate
  269. pC1->X()-=x0;
  270. // Resize, entsprechend der Entfernung vom Zentrum
  271. long nPntRad=cy-pC1->Y();
  272. double nFact=(double)nPntRad/(double)rRad.Y();
  273. pC1->X()=Round((double)pC1->X()*nFact);
  274. pC1->X()+=cx;
  275. }
  276. RotatePoint(*pC1,rCenter,sn,cs);
  277. }
  278. if (bC2) {
  279. if (bVert) {
  280. // Richtung Zentrum verschieben, als Ausgangsposition fuer Rotate
  281. pC2->Y()-=y0;
  282. // Resize, entsprechend der Entfernung vom Zentrum
  283. pC2->Y()=Round(((double)pC2->Y()) /rRad.X()*(rCenter.X()-pC2->X()));
  284. pC2->Y()+=cy;
  285. } else {
  286. // Richtung Zentrum verschieben, als Ausgangsposition fuer Rotate
  287. pC2->X()-=x0;
  288. // Resize, entsprechend der Entfernung vom Zentrum
  289. long nPntRad=rCenter.Y()-pC2->Y();
  290. double nFact=(double)nPntRad/(double)rRad.Y();
  291. pC2->X()=Round((double)pC2->X()*nFact);
  292. pC2->X()+=cx;
  293. }
  294. RotatePoint(*pC2,rCenter,sn,cs);
  295. }
  296. rSin=sn;
  297. rCos=cs;
  298. return nWink;
  299. }
  300. double CrookSlantXPoint(Point& rPnt, Point* pC1, Point* pC2, const Point& rCenter,
  301. const Point& rRad, double& rSin, double& rCos, FASTBOOL bVert)
  302. {
  303. FASTBOOL bC1=pC1!=NULL;
  304. FASTBOOL bC2=pC2!=NULL;
  305. long x0=rPnt.X();
  306. long y0=rPnt.Y();
  307. long dx1=0,dy1=0;
  308. long dxC1=0,dyC1=0;
  309. long dxC2=0,dyC2=0;
  310. if (bVert) {
  311. long nStart=rCenter.X()-rRad.X();
  312. dx1=rPnt.X()-nStart;
  313. rPnt.X()=nStart;
  314. if (bC1) {
  315. dxC1=pC1->X()-nStart;
  316. pC1->X()=nStart;
  317. }
  318. if (bC2) {
  319. dxC2=pC2->X()-nStart;
  320. pC2->X()=nStart;
  321. }
  322. } else {
  323. long nStart=rCenter.Y()-rRad.Y();
  324. dy1=rPnt.Y()-nStart;
  325. rPnt.Y()=nStart;
  326. if (bC1) {
  327. dyC1=pC1->Y()-nStart;
  328. pC1->Y()=nStart;
  329. }
  330. if (bC2) {
  331. dyC2=pC2->Y()-nStart;
  332. pC2->Y()=nStart;
  333. }
  334. }
  335. double nWink=GetCrookAngle(rPnt,rCenter,rRad,bVert);
  336. double sn=sin(nWink);
  337. double cs=cos(nWink);
  338. RotatePoint(rPnt,rCenter,sn,cs);
  339. if (bC1) { if (bVert) pC1->Y()-=y0-rCenter.Y(); else pC1->X()-=x0-rCenter.X(); RotatePoint(*pC1,rCenter,sn,cs); }
  340. if (bC2) { if (bVert) pC2->Y()-=y0-rCenter.Y(); else pC2->X()-=x0-rCenter.X(); RotatePoint(*pC2,rCenter,sn,cs); }
  341. if (bVert) {
  342. rPnt.X()+=dx1;
  343. if (bC1) pC1->X()+=dxC1;
  344. if (bC2) pC2->X()+=dxC2;
  345. } else {
  346. rPnt.Y()+=dy1;
  347. if (bC1) pC1->Y()+=dyC1;
  348. if (bC2) pC2->Y()+=dyC2;
  349. }
  350. rSin=sn;
  351. rCos=cs;
  352. return nWink;
  353. }
  354. double CrookStretchXPoint(Point& rPnt, Point* pC1, Point* pC2, const Point& rCenter,
  355. const Point& rRad, double& rSin, double& rCos, FASTBOOL bVert,
  356. const Rectangle rRefRect)
  357. {
  358. //FASTBOOL bC1=pC1!=NULL;
  359. //FASTBOOL bC2=pC2!=NULL;
  360. //long x0=rPnt.X();
  361. long y0=rPnt.Y();
  362. CrookSlantXPoint(rPnt,pC1,pC2,rCenter,rRad,rSin,rCos,bVert);
  363. if (bVert) {
  364. } else {
  365. //long nBase=rCenter.Y()-rRad.Y();
  366. long nTop=rRefRect.Top();
  367. long nBtm=rRefRect.Bottom();
  368. long nHgt=nBtm-nTop;
  369. long dy=rPnt.Y()-y0;
  370. //FASTBOOL bOben=rRad.Y()<0;
  371. double a=((double)(y0-nTop))/nHgt;
  372. a*=dy;
  373. rPnt.Y()=y0+Round(a);
  374. } return 0.0;
  375. }
  376. ////////////////////////////////////////////////////////////////////////////////////////////////////
  377. void CrookRotatePoly(XPolygon& rPoly, const Point& rCenter, const Point& rRad, FASTBOOL bVert)
  378. {
  379. double nSin,nCos;
  380. USHORT nPointAnz=rPoly.GetPointCount();
  381. USHORT i=0;
  382. while (i<nPointAnz) {
  383. Point* pPnt=&rPoly[i];
  384. Point* pC1=NULL;
  385. Point* pC2=NULL;
  386. if (i+1<nPointAnz && rPoly.IsControl(i)) { // Kontrollpunkt links
  387. pC1=pPnt;
  388. i++;
  389. pPnt=&rPoly[i];
  390. }
  391. i++;
  392. if (i<nPointAnz && rPoly.IsControl(i)) { // Kontrollpunkt rechts
  393. pC2=&rPoly[i];
  394. i++;
  395. }
  396. CrookRotateXPoint(*pPnt,pC1,pC2,rCenter,rRad,nSin,nCos,bVert);
  397. }
  398. }
  399. void CrookSlantPoly(XPolygon& rPoly, const Point& rCenter, const Point& rRad, FASTBOOL bVert)
  400. {
  401. double nSin,nCos;
  402. USHORT nPointAnz=rPoly.GetPointCount();
  403. USHORT i=0;
  404. while (i<nPointAnz) {
  405. Point* pPnt=&rPoly[i];
  406. Point* pC1=NULL;
  407. Point* pC2=NULL;
  408. if (i+1<nPointAnz && rPoly.IsControl(i)) { // Kontrollpunkt links
  409. pC1=pPnt;
  410. i++;
  411. pPnt=&rPoly[i];
  412. }
  413. i++;
  414. if (i<nPointAnz && rPoly.IsControl(i)) { // Kontrollpunkt rechts
  415. pC2=&rPoly[i];
  416. i++;
  417. }
  418. CrookSlantXPoint(*pPnt,pC1,pC2,rCenter,rRad,nSin,nCos,bVert);
  419. }
  420. }
  421. void CrookStretchPoly(XPolygon& rPoly, const Point& rCenter, const Point& rRad, FASTBOOL bVert, const Rectangle rRefRect)
  422. {
  423. double nSin,nCos;
  424. USHORT nPointAnz=rPoly.GetPointCount();
  425. USHORT i=0;
  426. while (i<nPointAnz) {
  427. Point* pPnt=&rPoly[i];
  428. Point* pC1=NULL;
  429. Point* pC2=NULL;
  430. if (i+1<nPointAnz && rPoly.IsControl(i)) { // Kontrollpunkt links
  431. pC1=pPnt;
  432. i++;
  433. pPnt=&rPoly[i];
  434. }
  435. i++;
  436. if (i<nPointAnz && rPoly.IsControl(i)) { // Kontrollpunkt rechts
  437. pC2=&rPoly[i];
  438. i++;
  439. }
  440. CrookStretchXPoint(*pPnt,pC1,pC2,rCenter,rRad,nSin,nCos,bVert,rRefRect);
  441. }
  442. }
  443. ////////////////////////////////////////////////////////////////////////////////////////////////////
  444. void CrookRotatePoly(XPolyPolygon& rPoly, const Point& rCenter, const Point& rRad, FASTBOOL bVert)
  445. {
  446. USHORT nPolyAnz=rPoly.Count();
  447. for (USHORT nPolyNum=0; nPolyNum<nPolyAnz; nPolyNum++) {
  448. CrookRotatePoly(rPoly[nPolyNum],rCenter,rRad,bVert);
  449. }
  450. }
  451. void CrookSlantPoly(XPolyPolygon& rPoly, const Point& rCenter, const Point& rRad, FASTBOOL bVert)
  452. {
  453. USHORT nPolyAnz=rPoly.Count();
  454. for (USHORT nPolyNum=0; nPolyNum<nPolyAnz; nPolyNum++) {
  455. CrookSlantPoly(rPoly[nPolyNum],rCenter,rRad,bVert);
  456. }
  457. }
  458. void CrookStretchPoly(XPolyPolygon& rPoly, const Point& rCenter, const Point& rRad, FASTBOOL bVert, const Rectangle rRefRect)
  459. {
  460. USHORT nPolyAnz=rPoly.Count();
  461. for (USHORT nPolyNum=0; nPolyNum<nPolyAnz; nPolyNum++) {
  462. CrookStretchPoly(rPoly[nPolyNum],rCenter,rRad,bVert,rRefRect);
  463. }
  464. }
  465. ////////////////////////////////////////////////////////////////////////////////////////////////////
  466. long GetAngle(const Point& rPnt)
  467. {
  468. long a=0;
  469. if (rPnt.Y()==0) {
  470. if (rPnt.X()<0) a=-18000;
  471. } else if (rPnt.X()==0) {
  472. if (rPnt.Y()>0) a=-9000;
  473. else a=9000;
  474. } else {
  475. a=Round((atan2((double)-rPnt.Y(),(double)rPnt.X())/nPi180));
  476. }
  477. return a;
  478. }
  479. long NormAngle180(long a)
  480. {
  481. while (a<18000) a+=36000;
  482. while (a>=18000) a-=36000;
  483. return a;
  484. }
  485. long NormAngle360(long a)
  486. {
  487. while (a<0) a+=36000;
  488. while (a>=36000) a-=36000;
  489. return a;
  490. }
  491. USHORT GetAngleSector(long nWink)
  492. {
  493. while (nWink<0) nWink+=36000;
  494. while (nWink>=36000) nWink-=36000;
  495. if (nWink< 9000) return 0;
  496. if (nWink<18000) return 1;
  497. if (nWink<27000) return 2;
  498. return 3;
  499. }
  500. long GetLen(const Point& rPnt)
  501. {
  502. long x=Abs(rPnt.X());
  503. long y=Abs(rPnt.Y());
  504. if (x+y<0x8000) { // weil 7FFF * 7FFF * 2 = 7FFE0002
  505. x*=x;
  506. y*=y;
  507. x+=y;
  508. x=Round(sqrt((double)x));
  509. return x;
  510. } else {
  511. double nx=x;
  512. double ny=y;
  513. nx*=nx;
  514. ny*=ny;
  515. nx+=ny;
  516. nx=sqrt(nx);
  517. if (nx>0x7FFFFFFF) {
  518. return 0x7FFFFFFF; // Ueberlauf, mehr is nich!
  519. } else {
  520. return Round(nx);
  521. }
  522. }
  523. }
  524. ////////////////////////////////////////////////////////////////////////////////////////////////////
  525. void GeoStat::RecalcSinCos()
  526. {
  527. if (nDrehWink==0) {
  528. nSin=0.0;
  529. nCos=1.0;
  530. } else {
  531. double a=nDrehWink*nPi180;
  532. nSin=sin(a);
  533. nCos=cos(a);
  534. }
  535. }
  536. void GeoStat::RecalcTan()
  537. {
  538. if (nShearWink==0) {
  539. nTan=0.0;
  540. } else {
  541. double a=nShearWink*nPi180;
  542. nTan=tan(a);
  543. }
  544. }
  545. ////////////////////////////////////////////////////////////////////////////////////////////////////
  546. Polygon Rect2Poly(const Rectangle& rRect, const GeoStat& rGeo)
  547. {
  548. Polygon aPol(5);
  549. aPol[0]=rRect.TopLeft();
  550. aPol[1]=rRect.TopRight();
  551. aPol[2]=rRect.BottomRight();
  552. aPol[3]=rRect.BottomLeft();
  553. aPol[4]=rRect.TopLeft();
  554. if (rGeo.nShearWink!=0) ShearPoly(aPol,rRect.TopLeft(),rGeo.nTan);
  555. if (rGeo.nDrehWink!=0) RotatePoly(aPol,rRect.TopLeft(),rGeo.nSin,rGeo.nCos);
  556. return aPol;
  557. }
  558. void Poly2Rect(const Polygon& rPol, Rectangle& rRect, GeoStat& rGeo)
  559. {
  560. rGeo.nDrehWink=GetAngle(rPol[1]-rPol[0]);
  561. rGeo.nDrehWink=NormAngle360(rGeo.nDrehWink);
  562. // Drehung ist damit im Kasten
  563. rGeo.RecalcSinCos();
  564. Point aPt1(rPol[1]-rPol[0]);
  565. if (rGeo.nDrehWink!=0) RotatePoint(aPt1,Point(0,0),-rGeo.nSin,rGeo.nCos); // -Sin fuer Rueckdrehung
  566. long nWdt=aPt1.X();
  567. Point aPt0(rPol[0]);
  568. Point aPt3(rPol[3]-rPol[0]);
  569. if (rGeo.nDrehWink!=0) RotatePoint(aPt3,Point(0,0),-rGeo.nSin,rGeo.nCos); // -Sin fuer Rueckdrehung
  570. long nHgt=aPt3.Y();
  571. if(aPt3.X())
  572. {
  573. // #i74358# the axes are not orthogonal, so for getting the correct height,
  574. // calculate the length of aPt3
  575. // #i74358# this change was wrong, in the field of the old geometry stuff
  576. // it is not an error. The new height always is the same as before; shear
  577. // does not change object height at all. This is different from the interactions,
  578. // but obviously wanted in the old versions.
  579. //
  580. // nHgt = static_cast< long >(sqrt(static_cast< double >(aPt3.X() * aPt3.X() + aPt3.Y() * aPt3.Y())));
  581. }
  582. long nShW=GetAngle(aPt3);
  583. nShW-=27000; // ShearWink wird zur Senkrechten gemessen
  584. nShW=-nShW; // Negieren, denn '+' ist Rechtskursivierung
  585. FASTBOOL bMirr=aPt3.Y()<0;
  586. if (bMirr) { // "Punktetausch" bei Spiegelung
  587. nHgt=-nHgt;
  588. nShW+=18000;
  589. aPt0=rPol[3];
  590. }
  591. nShW=NormAngle180(nShW);
  592. if (nShW<-9000 || nShW>9000) {
  593. nShW=NormAngle180(nShW+18000);
  594. }
  595. if (nShW<-SDRMAXSHEAR) nShW=-SDRMAXSHEAR; // ShearWinkel begrenzen auf +/- 89.00 deg
  596. if (nShW>SDRMAXSHEAR) nShW=SDRMAXSHEAR;
  597. rGeo.nShearWink=nShW;
  598. rGeo.RecalcTan();
  599. Point aRU(aPt0);
  600. aRU.X()+=nWdt;
  601. aRU.Y()+=nHgt;
  602. rRect=Rectangle(aPt0,aRU);
  603. }
  604. ////////////////////////////////////////////////////////////////////////////////////////////////////
  605. void OrthoDistance8(const Point& rPt0, Point& rPt, FASTBOOL bBigOrtho)
  606. {
  607. long dx=rPt.X()-rPt0.X();
  608. long dy=rPt.Y()-rPt0.Y();
  609. long dxa=Abs(dx);
  610. long dya=Abs(dy);
  611. if (dx==0 || dy==0 || dxa==dya) return;
  612. if (dxa>=dya*2) { rPt.Y()=rPt0.Y(); return; }
  613. if (dya>=dxa*2) { rPt.X()=rPt0.X(); return; }
  614. if ((dxa<dya) != bBigOrtho) {
  615. rPt.Y()=rPt0.Y()+(dxa* (dy>=0 ? 1 : -1) );
  616. } else {
  617. rPt.X()=rPt0.X()+(dya* (dx>=0 ? 1 : -1) );
  618. }
  619. }
  620. void OrthoDistance4(const Point& rPt0, Point& rPt, FASTBOOL bBigOrtho)
  621. {
  622. long dx=rPt.X()-rPt0.X();
  623. long dy=rPt.Y()-rPt0.Y();
  624. long dxa=Abs(dx);
  625. long dya=Abs(dy);
  626. if ((dxa<dya) != bBigOrtho) {
  627. rPt.Y()=rPt0.Y()+(dxa* (dy>=0 ? 1 : -1) );
  628. } else {
  629. rPt.X()=rPt0.X()+(dya* (dx>=0 ? 1 : -1) );
  630. }
  631. }
  632. ////////////////////////////////////////////////////////////////////////////////////////////////////
  633. long BigMulDiv(long nVal, long nMul, long nDiv)
  634. {
  635. BigInt aVal(nVal);
  636. aVal*=nMul;
  637. if (aVal.IsNeg()!=(nDiv<0)) {
  638. aVal-=nDiv/2; // fuer korrektes Runden
  639. } else {
  640. aVal+=nDiv/2; // fuer korrektes Runden
  641. }
  642. if(nDiv)
  643. {
  644. aVal/=nDiv;
  645. return long(aVal);
  646. }
  647. return 0x7fffffff;
  648. }
  649. void Kuerzen(Fraction& rF, unsigned nDigits)
  650. {
  651. INT32 nMul=rF.GetNumerator();
  652. INT32 nDiv=rF.GetDenominator();
  653. FASTBOOL bNeg=FALSE;
  654. if (nMul<0) { nMul=-nMul; bNeg=!bNeg; }
  655. if (nDiv<0) { nDiv=-nDiv; bNeg=!bNeg; }
  656. if (nMul==0 || nDiv==0) return;
  657. UINT32 a;
  658. a=UINT32(nMul); unsigned nMulZ=0; // Fuehrende Nullen zaehlen
  659. while (a<0x00800000) { nMulZ+=8; a<<=8; }
  660. while (a<0x80000000) { nMulZ++; a<<=1; }
  661. a=UINT32(nDiv); unsigned nDivZ=0; // Fuehrende Nullen zaehlen
  662. while (a<0x00800000) { nDivZ+=8; a<<=8; }
  663. while (a<0x80000000) { nDivZ++; a<<=1; }
  664. // Anzahl der verwendeten Digits bestimmen
  665. int nMulDigits=32-nMulZ;
  666. int nDivDigits=32-nDivZ;
  667. // Nun bestimmen, wieviele Stellen hinten weg koennen
  668. int nMulWeg=nMulDigits-nDigits; if (nMulWeg<0) nMulWeg=0;
  669. int nDivWeg=nDivDigits-nDigits; if (nDivWeg<0) nDivWeg=0;
  670. int nWeg=Min(nMulWeg,nDivWeg);
  671. nMul>>=nWeg;
  672. nDiv>>=nWeg;
  673. if (nMul==0 || nDiv==0) {
  674. DBG_WARNING("Oups, beim kuerzen einer Fraction hat sich Joe verrechnet.");
  675. return;
  676. }
  677. if (bNeg) nMul=-nMul;
  678. rF=Fraction(nMul,nDiv);
  679. }
  680. ////////////////////////////////////////////////////////////////////////////////////////////////////
  681. // Wieviele eU-Einheiten passen in einen mm bzw. Inch?
  682. // Oder wie gross ist ein eU in mm bzw. Inch, und davon der Kehrwert
  683. FrPair GetInchOrMM(MapUnit eU)
  684. {
  685. switch (eU) {
  686. case MAP_1000TH_INCH: return FrPair(1000,1);
  687. case MAP_100TH_INCH : return FrPair( 100,1);
  688. case MAP_10TH_INCH : return FrPair( 10,1);
  689. case MAP_INCH : return FrPair( 1,1);
  690. case MAP_POINT : return FrPair( 72,1);
  691. case MAP_TWIP : return FrPair(1440,1);
  692. case MAP_100TH_MM : return FrPair( 100,1);
  693. case MAP_10TH_MM : return FrPair( 10,1);
  694. case MAP_MM : return FrPair( 1,1);
  695. case MAP_CM : return FrPair( 1,10);
  696. case MAP_PIXEL : {
  697. VirtualDevice aVD;
  698. aVD.SetMapMode(MapMode(MAP_100TH_MM));
  699. Point aP(aVD.PixelToLogic(Point(64,64))); // 64 Pixel fuer bessere Genauigkeit
  700. return FrPair(6400,aP.X(),6400,aP.Y());
  701. }
  702. case MAP_APPFONT: case MAP_SYSFONT: {
  703. VirtualDevice aVD;
  704. aVD.SetMapMode(MapMode(eU));
  705. Point aP(aVD.LogicToPixel(Point(32,32))); // 32 Einheiten fuer bessere Genauigkeit
  706. aVD.SetMapMode(MapMode(MAP_100TH_MM));
  707. aP=aVD.PixelToLogic(aP);
  708. return FrPair(3200,aP.X(),3200,aP.Y());
  709. }
  710. default: break;
  711. }
  712. return Fraction(1,1);
  713. }
  714. FrPair GetInchOrMM(FieldUnit eU)
  715. {
  716. switch (eU) {
  717. case FUNIT_INCH : return FrPair( 1,1);
  718. case FUNIT_POINT : return FrPair( 72,1);
  719. case FUNIT_TWIP : return FrPair(1440,1);
  720. case FUNIT_100TH_MM : return FrPair( 100,1);
  721. case FUNIT_MM : return FrPair( 1,1);
  722. case FUNIT_CM : return FrPair( 1,10);
  723. case FUNIT_M : return FrPair( 1,1000);
  724. case FUNIT_KM : return FrPair( 1,1000000);
  725. case FUNIT_PICA : return FrPair( 6,1);
  726. case FUNIT_FOOT : return FrPair( 1,12);
  727. case FUNIT_MILE : return FrPair( 1,63360);
  728. default: break;
  729. }
  730. return Fraction(1,1);
  731. }
  732. // Den Faktor berechnen, der anzuwenden ist um n Einheiten von eS nach
  733. // eD umzurechnen. Z.B. GetMapFactor(UNIT_MM,UNIT_100TH_MM) => 100.
  734. FrPair GetMapFactor(MapUnit eS, MapUnit eD)
  735. {
  736. if (eS==eD) return FrPair(1,1,1,1);
  737. FrPair aS(GetInchOrMM(eS));
  738. FrPair aD(GetInchOrMM(eD));
  739. FASTBOOL bSInch=IsInch(eS);
  740. FASTBOOL bDInch=IsInch(eD);
  741. FrPair aRet(aD.X()/aS.X(),aD.Y()/aS.Y());
  742. if (bSInch && !bDInch) { aRet.X()*=Fraction(127,5); aRet.Y()*=Fraction(127,5); }
  743. if (!bSInch && bDInch) { aRet.X()*=Fraction(5,127); aRet.Y()*=Fraction(5,127); }
  744. return aRet;
  745. };
  746. FrPair GetMapFactor(MapUnit eS, FieldUnit eD)
  747. {
  748. FrPair aS(GetInchOrMM(eS));
  749. FrPair aD(GetInchOrMM(eD));
  750. FASTBOOL bSInch=IsInch(eS);
  751. FASTBOOL bDInch=IsInch(eD);
  752. FrPair aRet(aD.X()/aS.X(),aD.Y()/aS.Y());
  753. if (bSInch && !bDInch) { aRet.X()*=Fraction(127,5); aRet.Y()*=Fraction(127,5); }
  754. if (!bSInch && bDInch) { aRet.X()*=Fraction(5,127); aRet.Y()*=Fraction(5,127); }
  755. return aRet;
  756. };
  757. FrPair GetMapFactor(FieldUnit eS, MapUnit eD)
  758. {
  759. FrPair aS(GetInchOrMM(eS));
  760. FrPair aD(GetInchOrMM(eD));
  761. FASTBOOL bSInch=IsInch(eS);
  762. FASTBOOL bDInch=IsInch(eD);
  763. FrPair aRet(aD.X()/aS.X(),aD.Y()/aS.Y());
  764. if (bSInch && !bDInch) { aRet.X()*=Fraction(127,5); aRet.Y()*=Fraction(127,5); }
  765. if (!bSInch && bDInch) { aRet.X()*=Fraction(5,127); aRet.Y()*=Fraction(5,127); }
  766. return aRet;
  767. };
  768. FrPair GetMapFactor(FieldUnit eS, FieldUnit eD)
  769. {
  770. if (eS==eD) return FrPair(1,1,1,1);
  771. FrPair aS(GetInchOrMM(eS));
  772. FrPair aD(GetInchOrMM(eD));
  773. FASTBOOL bSInch=IsInch(eS);
  774. FASTBOOL bDInch=IsInch(eD);
  775. FrPair aRet(aD.X()/aS.X(),aD.Y()/aS.Y());
  776. if (bSInch && !bDInch) { aRet.X()*=Fraction(127,5); aRet.Y()*=Fraction(127,5); }
  777. if (!bSInch && bDInch) { aRet.X()*=Fraction(5,127); aRet.Y()*=Fraction(5,127); }
  778. return aRet;
  779. };
  780. ////////////////////////////////////////////////////////////////////////////////////////////////////
  781. // 1 mile = 8 furlong = 63.360" = 1.609.344,0mm
  782. // 1 furlong = 10 chains = 7.920" = 201.168,0mm
  783. // 1 chain = 4 poles = 792" = 20.116,8mm
  784. // 1 pole = 5 1/2 yd = 198" = 5.029,2mm
  785. // 1 yd = 3 ft = 36" = 914,4mm
  786. // 1 ft = 12 " = 1" = 304,8mm
  787. void GetMeterOrInch(MapUnit eMU, short& rnKomma, long& rnMul, long& rnDiv, FASTBOOL& rbMetr, FASTBOOL& rbInch)
  788. {
  789. rnMul=1; rnDiv=1;
  790. short nKomma=0;
  791. FASTBOOL bMetr=FALSE,bInch=FALSE;
  792. switch (eMU) {
  793. // Metrisch
  794. case MAP_100TH_MM : bMetr=TRUE; nKomma=5; break;
  795. case MAP_10TH_MM : bMetr=TRUE; nKomma=4; break;
  796. case MAP_MM : bMetr=TRUE; nKomma=3; break;
  797. case MAP_CM : bMetr=TRUE; nKomma=2; break;
  798. // Inch
  799. case MAP_1000TH_INCH: bInch=TRUE; nKomma=3; break;
  800. case MAP_100TH_INCH : bInch=TRUE; nKomma=2; break;
  801. case MAP_10TH_INCH : bInch=TRUE; nKomma=1; break;
  802. case MAP_INCH : bInch=TRUE; nKomma=0; break;
  803. case MAP_POINT : bInch=TRUE; rnDiv=72; break; // 1Pt = 1/72"
  804. case MAP_TWIP : bInch=TRUE; rnDiv=144; nKomma=1; break; // 1Twip = 1/1440"
  805. // Sonstiges
  806. case MAP_PIXEL : break;
  807. case MAP_SYSFONT : break;
  808. case MAP_APPFONT : break;
  809. case MAP_RELATIVE : break;
  810. default: break;
  811. } // switch
  812. rnKomma=nKomma;
  813. rbMetr=bMetr;
  814. rbInch=bInch;
  815. }
  816. void GetMeterOrInch(FieldUnit eFU, short& rnKomma, long& rnMul, long& rnDiv, FASTBOOL& rbMetr, FASTBOOL& rbInch)
  817. {
  818. rnMul=1; rnDiv=1;
  819. short nKomma=0;
  820. FASTBOOL bMetr=FALSE,bInch=FALSE;
  821. switch (eFU) {
  822. case FUNIT_NONE : break;
  823. // Metrisch
  824. case FUNIT_100TH_MM : bMetr=TRUE; nKomma=5; break;
  825. case FUNIT_MM : bMetr=TRUE; nKomma=3; break;
  826. case FUNIT_CM : bMetr=TRUE; nKomma=2; break;
  827. case FUNIT_M : bMetr=TRUE; nKomma=0; break;
  828. case FUNIT_KM : bMetr=TRUE; nKomma=-3; break;
  829. // Inch
  830. case FUNIT_TWIP : bInch=TRUE; rnDiv=144; nKomma=1; break; // 1Twip = 1/1440"
  831. case FUNIT_POINT : bInch=TRUE; rnDiv=72; break; // 1Pt = 1/72"
  832. case FUNIT_PICA : bInch=TRUE; rnDiv=6; break; // 1Pica = 1/6" ?
  833. case FUNIT_INCH : bInch=TRUE; break; // 1" = 1"
  834. case FUNIT_FOOT : bInch=TRUE; rnMul=12; break; // 1Ft = 12"
  835. case FUNIT_MILE : bInch=TRUE; rnMul=6336; nKomma=-1; break; // 1mile = 63360"
  836. // sonstiges
  837. case FUNIT_CUSTOM : break;
  838. case FUNIT_PERCENT : nKomma=2; break;
  839. } // switch
  840. rnKomma=nKomma;
  841. rbMetr=bMetr;
  842. rbInch=bInch;
  843. }
  844. void SdrFormatter::Undirty()
  845. {
  846. if (aScale.GetNumerator()==0 || aScale.GetDenominator()==0) aScale=Fraction(1,1);
  847. FASTBOOL bSrcMetr,bSrcInch,bDstMetr,bDstInch;
  848. long nMul1,nDiv1,nMul2,nDiv2;
  849. short nKomma1,nKomma2;
  850. // Zunaechst normalisieren auf m bzw. "
  851. if (!bSrcFU) {
  852. GetMeterOrInch(eSrcMU,nKomma1,nMul1,nDiv1,bSrcMetr,bSrcInch);
  853. } else {
  854. GetMeterOrInch(eSrcFU,nKomma1,nMul1,nDiv1,bSrcMetr,bSrcInch);
  855. }
  856. if (!bDstFU) {
  857. GetMeterOrInch(eDstMU,nKomma2,nMul2,nDiv2,bDstMetr,bDstInch);
  858. } else {
  859. GetMeterOrInch(eDstFU,nKomma2,nMul2,nDiv2,bDstMetr,bDstInch);
  860. }
  861. nMul1*=nDiv2;
  862. nDiv1*=nMul2;
  863. nKomma1=nKomma1-nKomma2;
  864. if (bSrcInch && bDstMetr) {
  865. nKomma1+=4;
  866. nMul1*=254;
  867. }
  868. if (bSrcMetr && bDstInch) {
  869. nKomma1-=4;
  870. nDiv1*=254;
  871. }
  872. // Temporaere Fraction zum Kuerzen
  873. Fraction aTempFract(nMul1,nDiv1);
  874. nMul1=aTempFract.GetNumerator();
  875. nDiv1=aTempFract.GetDenominator();
  876. nMul_=nMul1;
  877. nDiv_=nDiv1;
  878. nKomma_=nKomma1;
  879. bDirty=FALSE;
  880. }
  881. void SdrFormatter::TakeStr(long nVal, XubString& rStr) const
  882. {
  883. sal_Unicode aNullCode('0');
  884. if(!nVal)
  885. {
  886. rStr = UniString();
  887. rStr += aNullCode;
  888. return;
  889. }
  890. // Hier fallen trotzdem evtl. Nachkommastellen weg, wg. MulDiv statt Real
  891. BOOL bNeg(nVal < 0);
  892. SvtSysLocale aSysLoc;
  893. const LocaleDataWrapper& rLoc = aSysLoc.GetLocaleData();
  894. ForceUndirty();
  895. sal_Int16 nK(nKomma_);
  896. XubString aStr;
  897. if(bNeg)
  898. nVal = -nVal;
  899. while(nK <= -3)
  900. {
  901. nVal *= 1000;
  902. nK += 3;
  903. }
  904. while(nK <= -1)
  905. {
  906. nVal *= 10;
  907. nK++;
  908. }
  909. if(nMul_ != nDiv_)
  910. nVal = BigMulDiv(nVal, nMul_, nDiv_);
  911. aStr = UniString::CreateFromInt32(nVal);
  912. if(nK > 0 && aStr.Len() <= nK )
  913. {
  914. // Komma erforderlich
  915. sal_Int16 nAnz(nK - aStr.Len());
  916. if(nAnz >= 0 && rLoc.isNumLeadingZero())
  917. nAnz++;
  918. for(xub_StrLen i=0; i<nAnz; i++)
  919. aStr.Insert(aNullCode, 0);
  920. // zuviele Nachkommastellen abhacken
  921. xub_StrLen nNumDigits(rLoc.getNumDigits());
  922. xub_StrLen nWeg(nK - nNumDigits);
  923. if(nWeg > 0)
  924. {
  925. // hier muesste eigentlich noch gerundet werden!
  926. aStr.Erase(aStr.Len() - nWeg);
  927. nK = nNumDigits;
  928. }
  929. }
  930. // Vorkommastellen fuer spaeter merken
  931. xub_StrLen nVorKomma(aStr.Len() - nK);
  932. if(nK > 0)
  933. {
  934. // KommaChar einfuegen
  935. // erstmal trailing Zeros abhacken
  936. while(nK > 0 && aStr.GetChar(aStr.Len() - 1) == aNullCode)
  937. {
  938. aStr.Erase(aStr.Len() - 1);
  939. nK--;
  940. }
  941. if(nK > 0)
  942. {
  943. // na, noch Nachkommastellen da?
  944. sal_Unicode cDec(rLoc.getNumDecimalSep().GetChar(0));
  945. aStr.Insert(cDec, nVorKomma);
  946. }
  947. }
  948. // ggf. Trennpunkte bei jedem Tausender einfuegen
  949. if( nVorKomma > 3 )
  950. {
  951. String aThoSep( rLoc.getNumThousandSep() );
  952. if ( aThoSep.Len() > 0 )
  953. {
  954. sal_Unicode cTho( aThoSep.GetChar(0) );
  955. sal_Int32 i(nVorKomma - 3);
  956. while(i > 0)
  957. {
  958. rStr.Insert(cTho, (xub_StrLen)i);
  959. i -= 3;
  960. }
  961. }
  962. }
  963. if(!aStr.Len())
  964. aStr += aNullCode;
  965. if(bNeg && (aStr.Len() > 1 || aStr.GetChar(0) != aNullCode))
  966. {
  967. rStr.Insert(sal_Unicode('-'), 0);
  968. }
  969. rStr = aStr;
  970. }
  971. void SdrFormatter::TakeUnitStr(MapUnit eUnit, XubString& rStr)
  972. {
  973. switch(eUnit)
  974. {
  975. // Metrisch
  976. case MAP_100TH_MM :
  977. {
  978. sal_Char aText[] = "/100mm";
  979. rStr = UniString(aText, sizeof(aText-1));
  980. break;
  981. }
  982. case MAP_10TH_MM :
  983. {
  984. sal_Char aText[] = "/10mm";
  985. rStr = UniString(aText, sizeof(aText-1));
  986. break;
  987. }
  988. case MAP_MM :
  989. {
  990. sal_Char aText[] = "mm";
  991. rStr = UniString(aText, sizeof(aText-1));
  992. break;
  993. }
  994. case MAP_CM :
  995. {
  996. sal_Char aText[] = "cm";
  997. rStr = UniString(aText, sizeof(aText-1));
  998. break;
  999. }
  1000. // Inch
  1001. case MAP_1000TH_INCH:
  1002. {
  1003. sal_Char aText[] = "/1000\"";
  1004. rStr = UniString(aText, sizeof(aText-1));
  1005. break;
  1006. }
  1007. case MAP_100TH_INCH :
  1008. {
  1009. sal_Char aText[] = "/100\"";
  1010. rStr = UniString(aText, sizeof(aText-1));
  1011. break;
  1012. }
  1013. case MAP_10TH_INCH :
  1014. {
  1015. sal_Char aText[] = "/10\"";
  1016. rStr = UniString(aText, sizeof(aText-1));
  1017. break;
  1018. }
  1019. case MAP_INCH :
  1020. {
  1021. rStr = UniString();
  1022. rStr += sal_Unicode('"');
  1023. break;
  1024. }
  1025. case MAP_POINT :
  1026. {
  1027. sal_Char aText[] = "pt";
  1028. rStr = UniString(aText, sizeof(aText-1));
  1029. break;
  1030. }
  1031. case MAP_TWIP :
  1032. {
  1033. sal_Char aText[] = "twip";
  1034. rStr = UniString(aText, sizeof(aText-1));
  1035. break;
  1036. }
  1037. // Sonstiges
  1038. case MAP_PIXEL :
  1039. {
  1040. sal_Char aText[] = "pixel";
  1041. rStr = UniString(aText, sizeof(aText-1));
  1042. break;
  1043. }
  1044. case MAP_SYSFONT :
  1045. {
  1046. sal_Char aText[] = "sysfont";
  1047. rStr = UniString(aText, sizeof(aText-1));
  1048. break;
  1049. }
  1050. case MAP_APPFONT :
  1051. {
  1052. sal_Char aText[] = "appfont";
  1053. rStr = UniString(aText, sizeof(aText-1));
  1054. break;
  1055. }
  1056. case MAP_RELATIVE :
  1057. {
  1058. rStr = UniString();
  1059. rStr += sal_Unicode('%');
  1060. break;
  1061. }
  1062. default: break;
  1063. }
  1064. }
  1065. void SdrFormatter::TakeUnitStr(FieldUnit eUnit, XubString& rStr)
  1066. {
  1067. switch(eUnit)
  1068. {
  1069. default :
  1070. case FUNIT_NONE :
  1071. case FUNIT_CUSTOM :
  1072. {
  1073. rStr = UniString();
  1074. break;
  1075. }
  1076. // Metrisch
  1077. case FUNIT_100TH_MM:
  1078. {
  1079. sal_Char aText[] = "/100mm";
  1080. rStr = UniString(aText, sizeof(aText-1));
  1081. break;
  1082. }
  1083. case FUNIT_MM :
  1084. {
  1085. sal_Char aText[] = "mm";
  1086. rStr = UniString(aText, sizeof(aText-1));
  1087. break;
  1088. }
  1089. case FUNIT_CM :
  1090. {
  1091. sal_Char aText[] = "cm";
  1092. rStr = UniString(aText, sizeof(aText-1));
  1093. break;
  1094. }
  1095. case FUNIT_M :
  1096. {
  1097. rStr = UniString();
  1098. rStr += sal_Unicode('m');
  1099. break;
  1100. }
  1101. case FUNIT_KM :
  1102. {
  1103. sal_Char aText[] = "km";
  1104. rStr = UniString(aText, sizeof(aText-1));
  1105. break;
  1106. }
  1107. // Inch
  1108. case FUNIT_TWIP :
  1109. {
  1110. sal_Char aText[] = "twip";
  1111. rStr = UniString(aText, sizeof(aText-1));
  1112. break;
  1113. }
  1114. case FUNIT_POINT :
  1115. {
  1116. sal_Char aText[] = "pt";
  1117. rStr = UniString(aText, sizeof(aText-1));
  1118. break;
  1119. }
  1120. case FUNIT_PICA :
  1121. {
  1122. sal_Char aText[] = "pica";
  1123. rStr = UniString(aText, sizeof(aText-1));
  1124. break;
  1125. }
  1126. case FUNIT_INCH :
  1127. {
  1128. rStr = UniString();
  1129. rStr += sal_Unicode('"');
  1130. break;
  1131. }
  1132. case FUNIT_FOOT :
  1133. {
  1134. sal_Char aText[] = "ft";
  1135. rStr = UniString(aText, sizeof(aText-1));
  1136. break;
  1137. }
  1138. case FUNIT_MILE :
  1139. {
  1140. sal_Char aText[] = "mile(s)";
  1141. rStr = UniString(aText, sizeof(aText-1));
  1142. break;
  1143. }
  1144. // sonstiges
  1145. case FUNIT_PERCENT:
  1146. {
  1147. rStr = UniString();
  1148. rStr += sal_Unicode('%');
  1149. break;
  1150. }
  1151. }
  1152. }
  1153. ////////////////////////////////////////////////////////////////////////////////////////////////////