Index: third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp |
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp b/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp |
index f6fe21abf3ca36728fc02bac027292f500861315..547c5539c240bfd4f347ef50fe033f9b1dfb6d9c 100644 |
--- a/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp |
+++ b/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp |
@@ -5,6 +5,7 @@ |
#include "core/css/cssom/CSSUnitValue.h" |
#include "bindings/core/v8/ExceptionState.h" |
+#include "core/css/CSSHelper.h" |
#include "platform/wtf/MathExtras.h" |
namespace blink { |
@@ -84,13 +85,125 @@ CSSUnitValue* CSSUnitValue::to(CSSPrimitiveValue::UnitType unit) const { |
if (unit_ == unit) |
return Create(value_, unit_); |
- // TODO(meade): Implement other types. |
+ // TODO(meade): Implement other types: time, frequency and resolution. |
+ if (CSSPrimitiveValue::IsLength(unit_) && CSSPrimitiveValue::IsLength(unit)) { |
+ // Only fixed lengths can be converted. |
+ if (CSSPrimitiveValue::IsRelativeUnit(unit_) || |
+ CSSPrimitiveValue::IsRelativeUnit(unit)) |
+ return nullptr; |
+ return Create(ConvertFixedLength(unit), unit); |
+ } |
if (CSSPrimitiveValue::IsAngle(unit_) && CSSPrimitiveValue::IsAngle(unit)) |
return Create(ConvertAngle(unit), unit); |
return nullptr; |
} |
+double CSSUnitValue::ConvertFixedLength( |
+ CSSPrimitiveValue::UnitType unit) const { |
+ switch (unit_) { |
+ case CSSPrimitiveValue::UnitType::kPixels: |
+ switch (unit) { |
+ case CSSPrimitiveValue::UnitType::kCentimeters: |
+ return value_ / kCssPixelsPerCentimeter; |
+ case CSSPrimitiveValue::UnitType::kMillimeters: |
+ return value_ / kCssPixelsPerMillimeter; |
+ case CSSPrimitiveValue::UnitType::kInches: |
+ return value_ / kCssPixelsPerInch; |
+ case CSSPrimitiveValue::UnitType::kPoints: |
+ return value_ / kCssPixelsPerPoint; |
+ case CSSPrimitiveValue::UnitType::kPicas: |
+ return value_ / kCssPixelsPerPica; |
+ default: |
+ NOTREACHED(); |
+ return 0; |
+ } |
+ case CSSPrimitiveValue::UnitType::kCentimeters: |
+ switch (unit) { |
+ case CSSPrimitiveValue::UnitType::kPixels: |
+ return value_ * kCssPixelsPerCentimeter; |
+ case CSSPrimitiveValue::UnitType::kMillimeters: |
+ return value_ * kMillimetersPerCentimeter; |
+ case CSSPrimitiveValue::UnitType::kInches: |
+ return value_ / kCentimetersPerInch; |
+ case CSSPrimitiveValue::UnitType::kPoints: |
+ return value_ * (kPointsPerInch / kCentimetersPerInch); |
+ case CSSPrimitiveValue::UnitType::kPicas: |
+ return value_ * (kPicasPerInch / kCentimetersPerInch); |
+ default: |
+ NOTREACHED(); |
+ return 0; |
+ } |
+ case CSSPrimitiveValue::UnitType::kMillimeters: |
+ switch (unit) { |
+ case CSSPrimitiveValue::UnitType::kPixels: |
+ return value_ * kCssPixelsPerMillimeter; |
+ case CSSPrimitiveValue::UnitType::kCentimeters: |
+ return value_ / kMillimetersPerCentimeter; |
+ case CSSPrimitiveValue::UnitType::kInches: |
+ return value_ / (kMillimetersPerCentimeter * kCentimetersPerInch); |
+ case CSSPrimitiveValue::UnitType::kPoints: |
+ return value_ * (kPointsPerInch / kMillimetersPerInch); |
+ case CSSPrimitiveValue::UnitType::kPicas: |
+ return value_ * (kPicasPerInch / kMillimetersPerInch); |
+ default: |
+ NOTREACHED(); |
+ return 0; |
+ } |
+ case CSSPrimitiveValue::UnitType::kInches: |
+ switch (unit) { |
+ case CSSPrimitiveValue::UnitType::kPixels: |
+ return value_ * kCssPixelsPerInch; |
+ case CSSPrimitiveValue::UnitType::kMillimeters: |
+ return value_ * kCentimetersPerInch * kMillimetersPerCentimeter; |
+ case CSSPrimitiveValue::UnitType::kCentimeters: |
+ return value_ * kCentimetersPerInch; |
+ case CSSPrimitiveValue::UnitType::kPoints: |
+ return value_ * kPointsPerInch; |
+ case CSSPrimitiveValue::UnitType::kPicas: |
+ return value_ * kPicasPerInch; |
+ default: |
+ NOTREACHED(); |
+ return 0; |
+ } |
+ case CSSPrimitiveValue::UnitType::kPoints: |
+ switch (unit) { |
+ case CSSPrimitiveValue::UnitType::kPixels: |
+ return value_ * kCssPixelsPerPoint; |
+ case CSSPrimitiveValue::UnitType::kMillimeters: |
+ return value_ * (kMillimetersPerInch / kPointsPerInch); |
+ case CSSPrimitiveValue::UnitType::kCentimeters: |
+ return value_ * (kCentimetersPerInch / kPointsPerInch); |
+ case CSSPrimitiveValue::UnitType::kInches: |
+ return value_ / kPointsPerInch; |
+ case CSSPrimitiveValue::UnitType::kPicas: |
+ return value_ * (kPicasPerInch / kPointsPerInch); |
+ default: |
+ NOTREACHED(); |
+ return 0; |
+ } |
+ case CSSPrimitiveValue::UnitType::kPicas: |
+ switch (unit) { |
+ case CSSPrimitiveValue::UnitType::kPixels: |
+ return value_ * kCssPixelsPerPica; |
+ case CSSPrimitiveValue::UnitType::kMillimeters: |
+ return value_ * (kMillimetersPerInch / kPicasPerInch); |
+ case CSSPrimitiveValue::UnitType::kCentimeters: |
+ return value_ * (kCentimetersPerInch / kPicasPerInch); |
+ case CSSPrimitiveValue::UnitType::kInches: |
+ return value_ / kPicasPerInch; |
+ case CSSPrimitiveValue::UnitType::kPoints: |
+ return value_ * (kPointsPerInch / kPicasPerInch); |
+ default: |
+ NOTREACHED(); |
+ return 0; |
+ } |
+ default: |
+ NOTREACHED(); |
+ return 0; |
+ } |
+} |
+ |
double CSSUnitValue::ConvertAngle(CSSPrimitiveValue::UnitType unit) const { |
switch (unit_) { |
case CSSPrimitiveValue::UnitType::kDegrees: |