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 11 CXFA_Measurement::CXFA_Measurement(const CFX_WideStringC& wsMeasure) { 12 Set(wsMeasure); 13 } 14 15 CXFA_Measurement::CXFA_Measurement() { 16 Set(-1, XFA_UNIT_Unknown); 17 } 18 19 CXFA_Measurement::CXFA_Measurement(FX_FLOAT fValue, XFA_UNIT eUnit) { 20 Set(fValue, eUnit); 21 } 22 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 37 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 69 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 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