| Index: Source/core/css/CSSPrimitiveValue.h
|
| diff --git a/Source/core/css/CSSPrimitiveValue.h b/Source/core/css/CSSPrimitiveValue.h
|
| index 9f84a36b9bf1b567c16b5a5a641ccb56570fc337..30f7f6d940c0a77be6de96a4abd6ffc3c1acba49 100644
|
| --- a/Source/core/css/CSSPrimitiveValue.h
|
| +++ b/Source/core/css/CSSPrimitiveValue.h
|
| @@ -190,30 +190,89 @@ public:
|
| #endif
|
| } packedColor;
|
|
|
| -
|
| // Returns true if value can be stored in the value field of the tagged pointer
|
| // without losing information.
|
| - inline static bool fitsWithoutDataLoss(double value)
|
| + inline static bool canFitWithoutDataLoss(CSSPrimitiveValueData data, UnitType type)
|
| {
|
| - union {
|
| - double asDouble;
|
| - uint64_t asBits;
|
| - } interpretableValue;
|
| - interpretableValue.asDouble = value;
|
| - return (interpretableValue.asBits & mantissaTruncationMask) == 0;
|
| + switch (type) {
|
| + case CSS_PROPERTY_ID:
|
| + return true;
|
| + case CSS_VALUE_ID:
|
| + return true;
|
| + case CSS_RGBCOLOR:
|
| +#if CPU(32BIT)
|
| + if (alphaChannel(data.rgbcolor) != 0 && alphaChannel(data.rgbcolor) != 255)
|
| + return false;
|
| +#endif
|
| + return true;
|
| + default:
|
| + union {
|
| + double asDouble;
|
| + uint64_t asBits;
|
| + } interpretableValue;
|
| + interpretableValue.asDouble = data.num;
|
| + if ((interpretableValue.asBits & mantissaTruncationMask) != 0)
|
| + return false;
|
| + return true;
|
| + }
|
| }
|
|
|
| - inline static bool fitsWithoutDataLoss(RGBA32 color)
|
| + inline void setValue(CSSPrimitiveValueData data, UnitType type)
|
| {
|
| + this->flag = 1;
|
| + this->type = static_cast<uintptr_t>(type);
|
| + switch (type) {
|
| + case CSS_PROPERTY_ID:
|
| + valueRaw = static_cast<uintptr_t>(data.propertyID);
|
| + return;
|
| + case CSS_VALUE_ID:
|
| + valueRaw = static_cast<uintptr_t>(data.valueID);
|
| + return;
|
| + case CSS_RGBCOLOR:
|
| + packedColor color;
|
| + color.red = static_cast<uintptr_t>(redChannel(data.rgbcolor));
|
| + color.green = static_cast<uintptr_t>(greenChannel(data.rgbcolor));
|
| + color.blue = static_cast<uintptr_t>(blueChannel(data.rgbcolor));
|
| #if CPU(32BIT)
|
| - return alphaChannel(color) == 0 || alphaChannel(color) == 255;
|
| + color.alpha = static_cast<uintptr_t>(alphaChannel(data.rgbcolor) == 255 ? 1 : 0);
|
| #elif CPU(64BIT)
|
| - return true;
|
| + color.alpha = static_cast<uintptr_t>(alphaChannel(data.rgbcolor));
|
| #endif
|
| + valueRaw = *reinterpret_cast<uintptr_t*>(&color);
|
| + return;
|
| + default:
|
| + union {
|
| + double asDouble;
|
| + uint64_t asBits;
|
| + } interpretableValue;
|
| + interpretableValue.asDouble = data.num;
|
| + valueRaw = interpretableValue.asBits >> doubleShiftAmount;
|
| + return;
|
| + }
|
| + }
|
| +
|
| + inline CSSPrimitiveValueData getValue() const
|
| + {
|
| + CSSPrimitiveValueData data;
|
| + switch (type) {
|
| + case CSS_PROPERTY_ID:
|
| + data.propertyID = getPropertyIDValue();
|
| + break;
|
| + case CSS_VALUE_ID:
|
| + data.valueID = getValueIDValue();
|
| + break;
|
| + case CSS_RGBCOLOR:
|
| + data.rgbcolor = getColorValue();
|
| + break;
|
| + default:
|
| + data.num = getDoubleValue();
|
| + break;
|
| + }
|
| + return data;
|
| }
|
|
|
| // Convenience methods for getting/setting the value field, which is truncated.
|
| - inline double getValue() const
|
| + inline double getDoubleValue() const
|
| {
|
| uint64_t shiftedValue = valueRaw;
|
| shiftedValue = shiftedValue << doubleShiftAmount;
|
| @@ -432,40 +491,40 @@ public:
|
|
|
| static CSSPrimitiveValue createIdentifier(CSSValueID valueID)
|
| {
|
| - CSSTaggedPtrValue taggedPointer;
|
| - taggedPointer.flag = 1;
|
| - taggedPointer.type = CSS_VALUE_ID;
|
| - taggedPointer.setValue(valueID);
|
| - return CSSPrimitiveValue(taggedPointer);
|
| + CSSPrimitiveValueData data;
|
| + data.valueID = valueID;
|
| + CSSTaggedPtrValue taggedPtr;
|
| + taggedPtr.setValue(data, CSS_VALUE_ID);
|
| + return CSSPrimitiveValue(taggedPtr);
|
| }
|
|
|
| static CSSPrimitiveValue createIdentifier(CSSPropertyID propertyID)
|
| {
|
| - CSSTaggedPtrValue taggedPointer;
|
| - taggedPointer.flag = 1;
|
| - taggedPointer.type = CSS_PROPERTY_ID;
|
| - taggedPointer.setValue(propertyID);
|
| - return CSSPrimitiveValue(taggedPointer);
|
| + CSSPrimitiveValueData data;
|
| + data.propertyID = propertyID;
|
| + CSSTaggedPtrValue taggedPtr;
|
| + taggedPtr.setValue(data, CSS_PROPERTY_ID);
|
| + return CSSPrimitiveValue(taggedPtr);
|
| }
|
| static CSSPrimitiveValue createColor(RGBA32 rgbValue)
|
| {
|
| - if (CSSTaggedPtrValue::fitsWithoutDataLoss(rgbValue)) {
|
| - CSSTaggedPtrValue taggedPointer;
|
| - taggedPointer.flag = 1;
|
| - taggedPointer.type = CSS_RGBCOLOR;
|
| - taggedPointer.setValue(rgbValue);
|
| - return CSSPrimitiveValue(taggedPointer);
|
| + CSSPrimitiveValueData data;
|
| + data.rgbcolor = rgbValue;
|
| + if (CSSTaggedPtrValue::canFitWithoutDataLoss(data, CSS_RGBCOLOR)) {
|
| + CSSTaggedPtrValue taggedPtr;
|
| + taggedPtr.setValue(data, CSS_RGBCOLOR);
|
| + return CSSPrimitiveValue(taggedPtr);
|
| }
|
| return CSSPrimitiveValue(adoptRefWillBeNoop(new CSSLargePrimitiveValue(rgbValue)));
|
| }
|
| static CSSPrimitiveValue create(double value, UnitType type)
|
| {
|
| - if (CSSTaggedPtrValue::fitsWithoutDataLoss(value)) {
|
| - CSSTaggedPtrValue taggedPointer;
|
| - taggedPointer.flag = 1;
|
| - taggedPointer.type = type;
|
| - taggedPointer.setValue(value);
|
| - return CSSPrimitiveValue(taggedPointer);
|
| + CSSPrimitiveValueData data;
|
| + data.num = value;
|
| + if (CSSTaggedPtrValue::canFitWithoutDataLoss(data, type)) {
|
| + CSSTaggedPtrValue taggedPtr;
|
| + taggedPtr.setValue(data, type);
|
| + return CSSPrimitiveValue(taggedPtr);
|
| }
|
| return CSSPrimitiveValue(adoptRefWillBeNoop(new CSSLargePrimitiveValue(value, type)));
|
| }
|
| @@ -498,13 +557,13 @@ public:
|
| UnitType primitiveType() const;
|
|
|
| double computeDegrees() const;
|
| - double computeSeconds();
|
| + double computeSeconds() const;
|
|
|
| // Computes a length in pixels, resolving relative lengths
|
| - template<typename T> T computeLength(const CSSToLengthConversionData&);
|
| + template<typename T> T computeLength(const CSSToLengthConversionData&) const;
|
|
|
| // Converts to a Length (Fixed, Percent or Calculated)
|
| - Length convertToLength(const CSSToLengthConversionData&);
|
| + Length convertToLength(const CSSToLengthConversionData&) const;
|
|
|
| double getDoubleValue() const;
|
| float getFloatValue() const { return getValue<float>(); }
|
| @@ -579,7 +638,7 @@ private:
|
| static void create(unsigned); // compile-time guard
|
| template<typename T> operator T*(); // compile-time guard
|
|
|
| - double computeLengthDouble(const CSSToLengthConversionData&);
|
| + double computeLengthDouble(const CSSToLengthConversionData&) const;
|
|
|
| union CSSPrimitivePointerValue {
|
| CSSTaggedPtrValue asTaggedPtr;
|
| @@ -609,16 +668,8 @@ private:
|
| if (isObject())
|
| return m_rawValue.asPtr->m_value;
|
|
|
| - CSSPrimitiveValueData result;
|
| - if (m_rawValue.asTaggedPtr.type == CSS_RGBCOLOR)
|
| - result.rgbcolor = m_rawValue.asTaggedPtr.getColorValue();
|
| - else if (m_rawValue.asTaggedPtr.type == CSS_PROPERTY_ID)
|
| - result.propertyID = m_rawValue.asTaggedPtr.getPropertyIDValue();
|
| - else if (m_rawValue.asTaggedPtr.type == CSS_VALUE_ID)
|
| - result.valueID = m_rawValue.asTaggedPtr.getValueIDValue();
|
| - else
|
| - result.num = m_rawValue.asTaggedPtr.getValue();
|
| - return result;
|
| +
|
| + return m_rawValue.asTaggedPtr.getValue();
|
| }
|
|
|
| UnitType type() const
|
|
|