1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "xfa/fxfa/parser/cxfa_measurement.h"
8
9 #include "core/fxcrt/fx_ext.h"
10
CXFA_Measurement(const CFX_WideStringC & wsMeasure)11 CXFA_Measurement::CXFA_Measurement(const CFX_WideStringC& wsMeasure) {
12 Set(wsMeasure);
13 }
14
CXFA_Measurement()15 CXFA_Measurement::CXFA_Measurement() {
16 Set(-1, XFA_UNIT_Unknown);
17 }
18
CXFA_Measurement(FX_FLOAT fValue,XFA_UNIT eUnit)19 CXFA_Measurement::CXFA_Measurement(FX_FLOAT fValue, XFA_UNIT eUnit) {
20 Set(fValue, eUnit);
21 }
22
Set(const CFX_WideStringC & wsMeasure)23 void CXFA_Measurement::Set(const CFX_WideStringC& wsMeasure) {
24 if (wsMeasure.IsEmpty()) {
25 m_fValue = 0;
26 m_eUnit = XFA_UNIT_Unknown;
27 return;
28 }
29 int32_t iUsedLen = 0;
30 int32_t iOffset = (wsMeasure.GetAt(0) == L'=') ? 1 : 0;
31 FX_FLOAT fValue = FXSYS_wcstof(wsMeasure.c_str() + iOffset,
32 wsMeasure.GetLength() - iOffset, &iUsedLen);
33 XFA_UNIT eUnit = GetUnit(wsMeasure.Mid(iOffset + iUsedLen));
34 Set(fValue, eUnit);
35 }
36
ToString(CFX_WideString & wsMeasure) const37 bool CXFA_Measurement::ToString(CFX_WideString& wsMeasure) const {
38 switch (GetUnit()) {
39 case XFA_UNIT_Mm:
40 wsMeasure.Format(L"%.8gmm", GetValue());
41 return true;
42 case XFA_UNIT_Pt:
43 wsMeasure.Format(L"%.8gpt", GetValue());
44 return true;
45 case XFA_UNIT_In:
46 wsMeasure.Format(L"%.8gin", GetValue());
47 return true;
48 case XFA_UNIT_Cm:
49 wsMeasure.Format(L"%.8gcm", GetValue());
50 return true;
51 case XFA_UNIT_Mp:
52 wsMeasure.Format(L"%.8gmp", GetValue());
53 return true;
54 case XFA_UNIT_Pc:
55 wsMeasure.Format(L"%.8gpc", GetValue());
56 return true;
57 case XFA_UNIT_Em:
58 wsMeasure.Format(L"%.8gem", GetValue());
59 return true;
60 case XFA_UNIT_Percent:
61 wsMeasure.Format(L"%.8g%%", GetValue());
62 return true;
63 default:
64 wsMeasure.Format(L"%.8g", GetValue());
65 return false;
66 }
67 }
68
ToUnit(XFA_UNIT eUnit,FX_FLOAT & fValue) const69 bool CXFA_Measurement::ToUnit(XFA_UNIT eUnit, FX_FLOAT& fValue) const {
70 fValue = GetValue();
71 XFA_UNIT eFrom = GetUnit();
72 if (eFrom == eUnit)
73 return true;
74
75 switch (eFrom) {
76 case XFA_UNIT_Pt:
77 break;
78 case XFA_UNIT_Mm:
79 fValue *= 72 / 2.54f / 10;
80 break;
81 case XFA_UNIT_In:
82 fValue *= 72;
83 break;
84 case XFA_UNIT_Cm:
85 fValue *= 72 / 2.54f;
86 break;
87 case XFA_UNIT_Mp:
88 fValue *= 0.001f;
89 break;
90 case XFA_UNIT_Pc:
91 fValue *= 12.0f;
92 break;
93 default:
94 fValue = 0;
95 return false;
96 }
97 switch (eUnit) {
98 case XFA_UNIT_Pt:
99 return true;
100 case XFA_UNIT_Mm:
101 fValue /= 72 / 2.54f / 10;
102 return true;
103 case XFA_UNIT_In:
104 fValue /= 72;
105 return true;
106 case XFA_UNIT_Cm:
107 fValue /= 72 / 2.54f;
108 return true;
109 case XFA_UNIT_Mp:
110 fValue /= 0.001f;
111 return true;
112 case XFA_UNIT_Pc:
113 fValue /= 12.0f;
114 return true;
115 default:
116 fValue = 0;
117 return false;
118 }
119 }
120
GetUnit(const CFX_WideStringC & wsUnit)121 XFA_UNIT CXFA_Measurement::GetUnit(const CFX_WideStringC& wsUnit) {
122 if (wsUnit == L"mm")
123 return XFA_UNIT_Mm;
124 if (wsUnit == L"pt")
125 return XFA_UNIT_Pt;
126 if (wsUnit == L"in")
127 return XFA_UNIT_In;
128 if (wsUnit == L"cm")
129 return XFA_UNIT_Cm;
130 if (wsUnit == L"pc")
131 return XFA_UNIT_Pc;
132 if (wsUnit == L"mp")
133 return XFA_UNIT_Mp;
134 if (wsUnit == L"em")
135 return XFA_UNIT_Em;
136 if (wsUnit == L"%")
137 return XFA_UNIT_Percent;
138 return XFA_UNIT_Unknown;
139 }
140