Changeset 107030 in webkit


Ignore:
Timestamp:
Feb 7, 2012 7:40:33 PM (12 years ago)
Author:
mikelawther@chromium.org
Message:

CSS3 calc() - simple parse time evaluation
https://bugs.webkit.org/show_bug.cgi?id=77960

Source/WebCore:

Adds simple number/percent expression evaluation. rgb() and hsl() functions now
allow simple calc() expressions.

Reviewed by Ojan Vafai.

  • css/CSSCalculationValue.cpp:

(WebCore):
(WebCore::CSSCalcValue::doubleValue):
(WebCore::CSSCalcPrimitiveValue::doubleValue):
(WebCore::CSSCalcBinaryOperation::doubleValue):
(CSSCalcBinaryOperation):
(WebCore::CSSCalcBinaryOperation::evaluate):

  • css/CSSCalculationValue.h:

(CSSCalcExpressionNode):
(WebCore::CSSCalcValue::isInt):
(CSSCalcValue):

  • css/CSSParser.cpp:

(WebCore::CSSParser::parsedDouble):

LayoutTests:

Reviewed by Ojan Vafai.

  • css3/calc/color-hsl-expected.txt:
  • css3/calc/color-rgb-expected.txt:
Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r107023 r107030  
     12012-02-07  Mike Lawther  <mikelawther@chromium.org>
     2
     3        CSS3 calc() - simple parse time evaluation
     4        https://bugs.webkit.org/show_bug.cgi?id=77960
     5
     6        Reviewed by Ojan Vafai.
     7
     8        * css3/calc/color-hsl-expected.txt:
     9        * css3/calc/color-rgb-expected.txt:
     10
    1112012-02-07  Chris Palmer  <palmer@google.com>
    212
  • trunk/LayoutTests/css3/calc/color-hsl-expected.txt

    r104432 r107030  
    33These two sentences should be the same color (alpha)
    44These two sentences should be the same color (alpha)
    5 FAIL
     5PASS
  • trunk/LayoutTests/css3/calc/color-rgb-expected.txt

    r104432 r107030  
    77These two sentences should be the same color (percent alpha)
    88These two sentences should be the same color (percent alpha)
    9 FAIL
     9PASS
  • trunk/Source/WebCore/ChangeLog

    r107029 r107030  
     12012-02-07  Mike Lawther  <mikelawther@chromium.org>
     2
     3        CSS3 calc() - simple parse time evaluation
     4        https://bugs.webkit.org/show_bug.cgi?id=77960
     5
     6        Adds simple number/percent expression evaluation. rgb() and hsl() functions now
     7        allow simple calc() expressions.
     8
     9        Reviewed by Ojan Vafai.
     10
     11        * css/CSSCalculationValue.cpp:
     12        (WebCore):
     13        (WebCore::CSSCalcValue::doubleValue):
     14        (WebCore::CSSCalcPrimitiveValue::doubleValue):
     15        (WebCore::CSSCalcBinaryOperation::doubleValue):
     16        (CSSCalcBinaryOperation):
     17        (WebCore::CSSCalcBinaryOperation::evaluate):
     18        * css/CSSCalculationValue.h:
     19        (CSSCalcExpressionNode):
     20        (WebCore::CSSCalcValue::isInt):
     21        (CSSCalcValue):
     22        * css/CSSParser.cpp:
     23        (WebCore::CSSParser::parsedDouble):
     24
    1252012-02-07  Andreas Kling  <awesomekling@apple.com>
    226
  • trunk/Source/WebCore/css/CSSCalculationValue.cpp

    r106166 r107030  
    7777    return "";
    7878}
     79
     80double CSSCalcValue::doubleValue() const
     81{
     82    return m_expression->doubleValue();
     83}
    7984   
    8085CSSCalcExpressionNode::~CSSCalcExpressionNode()
     
    95100    }
    96101
    97    
     102    virtual double doubleValue() const
     103    {
     104        switch (m_category) {
     105        case CalcNumber:
     106        case CalcPercent:               
     107            return m_value->getDoubleValue();
     108        case CalcLength:
     109        case CalcPercentLength:
     110        case CalcPercentNumber:
     111        case CalcOther:
     112            ASSERT_NOT_REACHED();
     113            break;
     114        }
     115        return 0;
     116    }   
    98117private:
    99118    explicit CSSCalcPrimitiveValue(CSSPrimitiveValue* value, bool isInteger)
     
    153172    }
    154173   
     174    virtual double doubleValue() const
     175    {
     176        return evaluate(m_leftSide->doubleValue(), m_rightSide->doubleValue());
     177    }
     178
    155179private:
    156180    CSSCalcBinaryOperation(PassRefPtr<CSSCalcExpressionNode> leftSide, PassRefPtr<CSSCalcExpressionNode> rightSide, CalcOperator op, CalculationCategory category)
     
    160184        , m_operator(op)
    161185    {
     186    }
     187   
     188    double evaluate(double leftValue, double rightValue) const
     189    {
     190        switch (m_operator) {
     191        case CalcAdd:
     192            return leftValue + rightValue;
     193        case CalcSubtract:
     194            return leftValue - rightValue;
     195        case CalcMultiply:
     196            return leftValue * rightValue;
     197        case CalcDivide:
     198            if (rightValue)
     199                return leftValue / rightValue;
     200            return std::numeric_limits<double>::quiet_NaN();
     201        case CalcMod:
     202            // FIXME calc() : mod has been removed from the spec, need to remove
     203            // this enum value
     204            return 0;
     205        }
     206        return 0;
    162207    }
    163208   
  • trunk/Source/WebCore/css/CSSCalculationValue.h

    r106166 r107030  
    5959public:
    6060   
    61     virtual ~CSSCalcExpressionNode() = 0;   
     61    virtual ~CSSCalcExpressionNode() = 0; 
     62    virtual double doubleValue() const = 0; 
    6263   
    6364    CalculationCategory category() const { return m_category; }   
     
    8182
    8283    CalculationCategory category() const { return m_expression->category(); }
    83     bool isInt() const { return m_expression->isInteger(); }
     84    bool isInt() const { return m_expression->isInteger(); }   
     85    double doubleValue() const;
    8486       
    8587    String customCssText() const;
  • trunk/Source/WebCore/css/CSSParser.cpp

    r106756 r107030  
    49504950inline double CSSParser::parsedDouble(CSSParserValue *v, ReleaseParsedCalcValueCondition releaseCalc)
    49514951{
    4952     // FIXME calc (http://webkit.org/b/16662): evaluate calc here, eg
    4953     // const double result = m_parsedCalculation ? m_parsedCalculation->doubleValue() : v->fValue;
    4954     const double result = m_parsedCalculation ? 0 : v->fValue;
     4952    const double result = m_parsedCalculation ? m_parsedCalculation->doubleValue() : v->fValue;
    49554953    if (releaseCalc == ReleaseParsedCalcValue)
    49564954        m_parsedCalculation.release();
Note: See TracChangeset for help on using the changeset viewer.