Index: xfa/fxfa/parser/cxfa_measurement.cpp |
diff --git a/xfa/fxfa/parser/cxfa_measurement.cpp b/xfa/fxfa/parser/cxfa_measurement.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7c6db2ec26c253e5c356996b0e56258042cdeb3d |
--- /dev/null |
+++ b/xfa/fxfa/parser/cxfa_measurement.cpp |
@@ -0,0 +1,139 @@ |
+// Copyright 2016 PDFium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
+ |
+#include "xfa/fxfa/parser/cxfa_measurement.h" |
+ |
+#include "xfa/fgas/crt/fgas_system.h" |
+ |
+CXFA_Measurement::CXFA_Measurement(const CFX_WideStringC& wsMeasure) { |
+ Set(wsMeasure); |
+} |
+ |
+CXFA_Measurement::CXFA_Measurement() { |
+ Set(-1, XFA_UNIT_Unknown); |
+} |
+ |
+CXFA_Measurement::CXFA_Measurement(FX_FLOAT fValue, XFA_UNIT eUnit) { |
+ Set(fValue, eUnit); |
+} |
+ |
+void CXFA_Measurement::Set(const CFX_WideStringC& wsMeasure) { |
+ if (wsMeasure.IsEmpty()) { |
+ m_fValue = 0; |
+ m_eUnit = XFA_UNIT_Unknown; |
+ return; |
+ } |
+ int32_t iUsedLen = 0; |
+ int32_t iOffset = (wsMeasure.GetAt(0) == L'=') ? 1 : 0; |
+ FX_FLOAT fValue = FX_wcstof(wsMeasure.c_str() + iOffset, |
+ wsMeasure.GetLength() - iOffset, &iUsedLen); |
+ XFA_UNIT eUnit = GetUnit(wsMeasure.Mid(iOffset + iUsedLen)); |
+ Set(fValue, eUnit); |
+} |
+ |
+FX_BOOL CXFA_Measurement::ToString(CFX_WideString& wsMeasure) const { |
+ switch (GetUnit()) { |
+ case XFA_UNIT_Mm: |
+ wsMeasure.Format(L"%.8gmm", GetValue()); |
+ return TRUE; |
+ case XFA_UNIT_Pt: |
+ wsMeasure.Format(L"%.8gpt", GetValue()); |
+ return TRUE; |
+ case XFA_UNIT_In: |
+ wsMeasure.Format(L"%.8gin", GetValue()); |
+ return TRUE; |
+ case XFA_UNIT_Cm: |
+ wsMeasure.Format(L"%.8gcm", GetValue()); |
+ return TRUE; |
+ case XFA_UNIT_Mp: |
+ wsMeasure.Format(L"%.8gmp", GetValue()); |
+ return TRUE; |
+ case XFA_UNIT_Pc: |
+ wsMeasure.Format(L"%.8gpc", GetValue()); |
+ return TRUE; |
+ case XFA_UNIT_Em: |
+ wsMeasure.Format(L"%.8gem", GetValue()); |
+ return TRUE; |
+ case XFA_UNIT_Percent: |
+ wsMeasure.Format(L"%.8g%%", GetValue()); |
+ return TRUE; |
+ default: |
+ wsMeasure.Format(L"%.8g", GetValue()); |
+ return FALSE; |
+ } |
+} |
+ |
+FX_BOOL CXFA_Measurement::ToUnit(XFA_UNIT eUnit, FX_FLOAT& fValue) const { |
+ fValue = GetValue(); |
+ XFA_UNIT eFrom = GetUnit(); |
+ if (eFrom == eUnit) |
+ return TRUE; |
+ |
+ switch (eFrom) { |
+ case XFA_UNIT_Pt: |
+ break; |
+ case XFA_UNIT_Mm: |
+ fValue *= 72 / 2.54f / 10; |
+ break; |
+ case XFA_UNIT_In: |
+ fValue *= 72; |
+ break; |
+ case XFA_UNIT_Cm: |
+ fValue *= 72 / 2.54f; |
+ break; |
+ case XFA_UNIT_Mp: |
+ fValue *= 0.001f; |
+ break; |
+ case XFA_UNIT_Pc: |
+ fValue *= 12.0f; |
+ break; |
+ default: |
+ fValue = 0; |
+ return FALSE; |
+ } |
+ switch (eUnit) { |
+ case XFA_UNIT_Pt: |
+ return TRUE; |
+ case XFA_UNIT_Mm: |
+ fValue /= 72 / 2.54f / 10; |
+ return TRUE; |
+ case XFA_UNIT_In: |
+ fValue /= 72; |
+ return TRUE; |
+ case XFA_UNIT_Cm: |
+ fValue /= 72 / 2.54f; |
+ return TRUE; |
+ case XFA_UNIT_Mp: |
+ fValue /= 0.001f; |
+ return TRUE; |
+ case XFA_UNIT_Pc: |
+ fValue /= 12.0f; |
+ return TRUE; |
+ default: |
+ fValue = 0; |
+ return FALSE; |
+ } |
+} |
+ |
+XFA_UNIT CXFA_Measurement::GetUnit(const CFX_WideStringC& wsUnit) { |
+ if (wsUnit == FX_WSTRC(L"mm")) |
+ return XFA_UNIT_Mm; |
+ if (wsUnit == FX_WSTRC(L"pt")) |
+ return XFA_UNIT_Pt; |
+ if (wsUnit == FX_WSTRC(L"in")) |
+ return XFA_UNIT_In; |
+ if (wsUnit == FX_WSTRC(L"cm")) |
+ return XFA_UNIT_Cm; |
+ if (wsUnit == FX_WSTRC(L"pc")) |
+ return XFA_UNIT_Pc; |
+ if (wsUnit == FX_WSTRC(L"mp")) |
+ return XFA_UNIT_Mp; |
+ if (wsUnit == FX_WSTRC(L"em")) |
+ return XFA_UNIT_Em; |
+ if (wsUnit == FX_WSTRC(L"%")) |
+ return XFA_UNIT_Percent; |
+ return XFA_UNIT_Unknown; |
+} |