Index: Source/core/css/CSSPrimitiveValue.h |
diff --git a/Source/core/css/CSSPrimitiveValue.h b/Source/core/css/CSSPrimitiveValue.h |
index 1820b226d24c511e3c90c80db830cb3cfecda590..c589c4f9b3d50b9345a8e45c77244ccbe54c4ee0 100644 |
--- a/Source/core/css/CSSPrimitiveValue.h |
+++ b/Source/core/css/CSSPrimitiveValue.h |
@@ -181,20 +181,22 @@ public: |
bool isAngle() const |
{ |
- return type() == CSS_DEG |
- || type() == CSS_RAD |
- || type() == CSS_GRAD |
- || type() == CSS_TURN; |
+ UnitType unitType = type(); |
+ return unitType == CSS_DEG |
+ || unitType == CSS_RAD |
+ || unitType == CSS_GRAD |
+ || unitType == CSS_TURN; |
} |
bool isAttr() const { return type() == CSS_ATTR; } |
bool isCounter() const { return type() == CSS_COUNTER; } |
bool isCustomIdent() const { return type() == CSS_CUSTOM_IDENT; } |
bool isFontRelativeLength() const |
{ |
- return type() == CSS_EMS |
- || type() == CSS_EXS |
- || type() == CSS_REMS |
- || type() == CSS_CHS; |
+ UnitType unitType = type(); |
+ return unitType == CSS_EMS |
+ || unitType == CSS_EXS |
+ || unitType == CSS_REMS |
+ || unitType == CSS_CHS; |
} |
bool isViewportPercentageLength() const { return isViewportPercentageLength(type()); } |
static bool isViewportPercentageLength(UnitType type) { return type >= CSS_VW && type <= CSS_VMAX; } |
@@ -210,7 +212,7 @@ public: |
bool isRGBColor() const { return type() == CSS_RGBCOLOR; } |
bool isShape() const { return type() == CSS_SHAPE; } |
bool isString() const { return type() == CSS_STRING; } |
- bool isTime() const { return type() == CSS_S || type() == CSS_MS; } |
+ bool isTime() const { UnitType unitType = type(); return unitType == CSS_S || unitType == CSS_MS; } |
bool isURI() const { return type() == CSS_URI; } |
bool isCalculated() const { return type() == CSS_CALC; } |
bool isCalculatedPercentageWithNumber() const { return primitiveType() == CSS_CALC_PERCENTAGE_WITH_NUMBER; } |
@@ -323,9 +325,11 @@ public: |
double getDoubleValue() const |
{ |
- if (type() == CSS_CALC) |
+ if (isTaggedPtr()) |
+ return numTaggedValue(); |
+ if (m_primitiveUnitType == CSS_CALC) |
return getCalcDoubleValue(); |
- return value().num; |
+ return m_value.num; |
} |
double getCalcDoubleValue() const; |
@@ -336,22 +340,38 @@ public: |
String getStringValue() const; |
- Counter* getCounterValue() const { return type() != CSS_COUNTER ? 0 : value().counter; } |
+ Counter* getCounterValue() const { return type() != CSS_COUNTER ? 0 : m_value.counter; } |
- Rect* getRectValue() const { return type() != CSS_RECT ? 0 : value().rect; } |
+ Rect* getRectValue() const { return type() != CSS_RECT ? 0 : m_value.rect; } |
- Quad* getQuadValue() const { return type() != CSS_QUAD ? 0 : value().quad; } |
+ Quad* getQuadValue() const { return type() != CSS_QUAD ? 0 : m_value.quad; } |
- RGBA32 getRGBA32Value() const { return type() != CSS_RGBCOLOR ? 0 : value().rgbcolor; } |
+ RGBA32 getRGBA32Value() const |
+ { |
+ if (isTaggedPtr()) |
+ return taggedType() != CSS_RGBCOLOR ? 0 : rgbcolorTaggedValue(); |
+ return m_primitiveUnitType != CSS_RGBCOLOR ? 0 : m_value.rgbcolor; |
+ } |
- Pair* getPairValue() const { return type() != CSS_PAIR ? 0 : value().pair; } |
+ Pair* getPairValue() const { return type() != CSS_PAIR ? 0 : m_value.pair; } |
- CSSBasicShape* getShapeValue() const { return type() != CSS_SHAPE ? 0 : value().shape; } |
+ CSSBasicShape* getShapeValue() const { return type() != CSS_SHAPE ? 0 : m_value.shape; } |
- CSSCalcValue* cssCalcValue() const { return type() != CSS_CALC ? 0 : value().calc; } |
+ CSSCalcValue* cssCalcValue() const { return type() != CSS_CALC ? 0 : m_value.calc; } |
- CSSPropertyID getPropertyID() const { return type() == CSS_PROPERTY_ID ? value().propertyID : CSSPropertyInvalid; } |
- CSSValueID getValueID() const { return type() == CSS_VALUE_ID ? value().valueID : CSSValueInvalid; } |
+ CSSPropertyID getPropertyID() const |
+ { |
+ if (isTaggedPtr()) |
+ return taggedType() == CSS_PROPERTY_ID ? propertyIDTaggedValue() : CSSPropertyInvalid; |
+ return m_primitiveUnitType == CSS_PROPERTY_ID ? m_value.propertyID : CSSPropertyInvalid; |
+ } |
+ |
+ CSSValueID getValueID() const |
+ { |
+ if (isTaggedPtr()) |
+ return taggedType() == CSS_VALUE_ID ? valueIDTaggedValue() : CSSValueInvalid; |
+ return m_primitiveUnitType == CSS_VALUE_ID ? m_value.valueID : CSSValueInvalid; |
+ } |
template<typename T> inline operator T() const; // Defined in CSSPrimitiveValueMappings.h |
@@ -458,40 +478,77 @@ private: |
return static_cast<UnitType>(toTaggedPtr().type); |
} |
- inline CSSPrimitiveValueData value() const |
+ inline double taggedType() const |
{ |
- if (!isTaggedPtr()) |
- return m_value; |
- |
- CSSPrimitiveValueData data; |
- switch (type()) { |
- case CSSPrimitiveValue::CSS_PROPERTY_ID: |
- data.propertyID = static_cast<CSSPropertyID>(toTaggedPtr().value); |
- break; |
- case CSSPrimitiveValue::CSS_VALUE_ID: |
- data.valueID = static_cast<CSSValueID>(toTaggedPtr().value); |
- break; |
- case CSSPrimitiveValue::CSS_RGBCOLOR: { |
- uintptr_t valueRawVar = toTaggedPtr().value; |
- packedColor color = *reinterpret_cast<packedColor*>(&valueRawVar); |
- unsigned alpha; |
+ ASSERT(isTaggedPtr()); |
+ return static_cast<UnitType>(toTaggedPtr().type); |
+ } |
+ |
+ inline CSSPropertyID propertyIDValue() const |
+ { |
+ if (isTaggedPtr()) |
+ return propertyIDTaggedValue(); |
+ return m_value.propertyID; |
+ } |
+ |
+ inline CSSValueID valueIDValue() const |
+ { |
+ if (isTaggedPtr()) |
+ return valueIDTaggedValue(); |
+ return m_value.valueID; |
+ } |
+ |
+ |
+ inline double numValue() const |
+ { |
+ if (isTaggedPtr()) |
+ return numTaggedValue(); |
+ return m_value.num; |
+ } |
+ |
+ |
+ inline RGBA32 rgbcolorValue() const |
+ { |
+ if (isTaggedPtr()) |
+ return rgbcolorTaggedValue(); |
+ return m_value.rgbcolor; |
+ } |
+ |
+ inline CSSPropertyID propertyIDTaggedValue() const |
+ { |
+ ASSERT(isTaggedPtr()); |
+ return static_cast<CSSPropertyID>(toTaggedPtr().value); |
+ } |
+ |
+ inline CSSValueID valueIDTaggedValue() const |
+ { |
+ ASSERT(isTaggedPtr()); |
+ return static_cast<CSSValueID>(toTaggedPtr().value); |
+ } |
+ |
+ inline double numTaggedValue() const |
+ { |
+ ASSERT(isTaggedPtr()); |
+ uint64_t shiftedValue = toTaggedPtr().value; |
+ shiftedValue = shiftedValue << doubleShiftAmount; |
+ return *reinterpret_cast<double*>(&shiftedValue); |
+ } |
+ |
+ inline RGBA32 rgbcolorTaggedValue() const |
+ { |
+ ASSERT(isTaggedPtr()); |
+ uintptr_t valueRawVar = toTaggedPtr().value; |
+ packedColor color = *reinterpret_cast<packedColor*>(&valueRawVar); |
+ unsigned alpha; |
#if CPU(32BIT) |
- alpha = color.alpha == 1 ? 255 : 0; |
+ alpha = color.alpha == 1 ? 255 : 0; |
#elif CPU(64BIT) |
- alpha = color.alpha; |
+ alpha = color.alpha; |
#endif |
- data.rgbcolor = makeRGBA(color.red, color.green, color.blue, alpha); |
- break; |
- } |
- default: |
- uint64_t shiftedValue = toTaggedPtr().value; |
- shiftedValue = shiftedValue << doubleShiftAmount; |
- data.num = *reinterpret_cast<double*>(&shiftedValue); |
- break; |
- } |
- return data; |
+ return makeRGBA(color.red, color.green, color.blue, alpha); |
} |
+ |
CSSPrimitiveValueData m_value; |
}; |