| OLD | NEW |
| 1 /* | 1 /* |
| 2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) | 2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) |
| 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2012 Apple Inc. All rights reserv
ed. | 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2012 Apple Inc. All rights reserv
ed. |
| 4 * | 4 * |
| 5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
| 6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
| 7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
| 8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
| 9 * | 9 * |
| 10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
| (...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 551 case CSS_GRAD: | 551 case CSS_GRAD: |
| 552 return grad2deg(getDoubleValue()); | 552 return grad2deg(getDoubleValue()); |
| 553 case CSS_TURN: | 553 case CSS_TURN: |
| 554 return turn2deg(getDoubleValue()); | 554 return turn2deg(getDoubleValue()); |
| 555 default: | 555 default: |
| 556 ASSERT_NOT_REACHED(); | 556 ASSERT_NOT_REACHED(); |
| 557 return 0; | 557 return 0; |
| 558 } | 558 } |
| 559 } | 559 } |
| 560 | 560 |
| 561 template<> int CSSPrimitiveValue::computeLength(const CSSToLengthConversionData&
conversionData) | 561 template<> int CSSPrimitiveValue::computeLength(const CSSLengthData& lengthData) |
| 562 { | 562 { |
| 563 return roundForImpreciseConversion<int>(computeLengthDouble(conversionData))
; | 563 return roundForImpreciseConversion<int>(computeLengthDouble(&lengthData)); |
| 564 } | 564 } |
| 565 | 565 |
| 566 template<> unsigned CSSPrimitiveValue::computeLength(const CSSToLengthConversion
Data& conversionData) | 566 template<> unsigned CSSPrimitiveValue::computeLength(const CSSLengthData& length
Data) |
| 567 { | 567 { |
| 568 return roundForImpreciseConversion<unsigned>(computeLengthDouble(conversionD
ata)); | 568 return roundForImpreciseConversion<unsigned>(computeLengthDouble(&lengthData
)); |
| 569 } | 569 } |
| 570 | 570 |
| 571 template<> Length CSSPrimitiveValue::computeLength(const CSSToLengthConversionDa
ta& conversionData) | 571 template<> Length CSSPrimitiveValue::computeLength(const CSSLengthData& lengthDa
ta) |
| 572 { | 572 { |
| 573 return Length(clampTo<float>(computeLengthDouble(conversionData), minValueFo
rCssLength, maxValueForCssLength), Fixed); | 573 return Length(clampTo<float>(computeLengthDouble(&lengthData), minValueForCs
sLength, maxValueForCssLength), Fixed); |
| 574 } | 574 } |
| 575 | 575 |
| 576 template<> short CSSPrimitiveValue::computeLength(const CSSToLengthConversionDat
a& conversionData) | 576 template<> short CSSPrimitiveValue::computeLength(const CSSLengthData& lengthDat
a) |
| 577 { | 577 { |
| 578 return roundForImpreciseConversion<short>(computeLengthDouble(conversionData
)); | 578 return roundForImpreciseConversion<short>(computeLengthDouble(&lengthData)); |
| 579 } | 579 } |
| 580 | 580 |
| 581 template<> unsigned short CSSPrimitiveValue::computeLength(const CSSToLengthConv
ersionData& conversionData) | 581 template<> unsigned short CSSPrimitiveValue::computeLength(const CSSLengthData&
lengthData) |
| 582 { | 582 { |
| 583 return roundForImpreciseConversion<unsigned short>(computeLengthDouble(conve
rsionData)); | 583 return roundForImpreciseConversion<unsigned short>(computeLengthDouble(&leng
thData)); |
| 584 } | 584 } |
| 585 | 585 |
| 586 template<> float CSSPrimitiveValue::computeLength(const CSSToLengthConversionDat
a& conversionData) | 586 template<> float CSSPrimitiveValue::computeLength(const CSSLengthData& lengthDat
a) |
| 587 { | 587 { |
| 588 return static_cast<float>(computeLengthDouble(conversionData)); | 588 return static_cast<float>(computeLengthDouble(&lengthData)); |
| 589 } | 589 } |
| 590 | 590 |
| 591 template<> double CSSPrimitiveValue::computeLength(const CSSToLengthConversionDa
ta& conversionData) | 591 template<> double CSSPrimitiveValue::computeLength(const CSSLengthData& lengthDa
ta) |
| 592 { | 592 { |
| 593 return computeLengthDouble(conversionData); | 593 return computeLengthDouble(&lengthData); |
| 594 } | 594 } |
| 595 | 595 |
| 596 double CSSPrimitiveValue::computeLengthDouble(const CSSToLengthConversionData& c
onversionData) | 596 double CSSPrimitiveValue::computeLengthDouble(const CSSLengthData* lengthData) |
| 597 { | 597 { |
| 598 ASSERT(lengthData); |
| 598 if (m_primitiveUnitType == CSS_CALC) | 599 if (m_primitiveUnitType == CSS_CALC) |
| 599 return m_value.calc->computeLengthPx(conversionData); | 600 return m_value.calc->computeLengthPx(lengthData); |
| 600 | 601 |
| 601 const RenderStyle& style = conversionData.style(); | 602 bool computingFontSize = lengthData->computingFontSize(); |
| 602 const RenderStyle* rootStyle = conversionData.rootStyle(); | |
| 603 bool computingFontSize = conversionData.computingFontSize(); | |
| 604 | 603 |
| 605 double factor; | 604 double factor; |
| 606 | 605 |
| 607 switch (primitiveType()) { | 606 switch (primitiveType()) { |
| 608 case CSS_EMS: | 607 case CSS_EMS: |
| 609 factor = computingFontSize ? style.fontDescription().specifiedSize()
: style.fontDescription().computedSize(); | 608 factor = computingFontSize ? lengthData->fontSpecifiedSize() : lengt
hData->fontComputedSize(); |
| 610 break; | 609 break; |
| 611 case CSS_EXS: | 610 case CSS_EXS: |
| 612 // FIXME: We have a bug right now where the zoom will be applied twi
ce to EX units. | 611 // FIXME: We have a bug right now where the zoom will be applied twi
ce to EX units. |
| 613 // We really need to compute EX using fontMetrics for the original s
pecifiedSize and not use | 612 // We really need to compute EX using fontMetrics for the original s
pecifiedSize and not use |
| 614 // our actual constructed rendering font. | 613 // our actual constructed rendering font. |
| 615 if (style.fontMetrics().hasXHeight()) | 614 if (lengthData->hasXHeight()) |
| 616 factor = style.fontMetrics().xHeight(); | 615 factor = lengthData->xHeight(); |
| 617 else | 616 else |
| 618 factor = (computingFontSize ? style.fontDescription().specifiedS
ize() : style.fontDescription().computedSize()) / 2.0; | 617 factor = (computingFontSize ? lengthData->fontSpecifiedSize() :
lengthData->fontComputedSize()) / 2.0; |
| 619 break; | 618 break; |
| 620 case CSS_REMS: | 619 case CSS_REMS: |
| 621 if (rootStyle) | 620 if (lengthData->hasRoot()) |
| 622 factor = computingFontSize ? rootStyle->fontDescription().specif
iedSize() : rootStyle->fontDescription().computedSize(); | 621 factor = computingFontSize ? lengthData->rootFontSpecifiedSize()
: lengthData->rootFontComputedSize(); |
| 623 else | 622 else |
| 624 factor = 1.0; | 623 factor = 1.0; |
| 625 break; | 624 break; |
| 626 case CSS_CHS: | 625 case CSS_CHS: |
| 627 factor = style.fontMetrics().zeroWidth(); | 626 factor = lengthData->zeroWidth(); |
| 628 break; | 627 break; |
| 629 case CSS_PX: | 628 case CSS_PX: |
| 630 factor = 1.0; | 629 factor = 1.0; |
| 631 break; | 630 break; |
| 632 case CSS_CM: | 631 case CSS_CM: |
| 633 factor = cssPixelsPerCentimeter; | 632 factor = cssPixelsPerCentimeter; |
| 634 break; | 633 break; |
| 635 case CSS_MM: | 634 case CSS_MM: |
| 636 factor = cssPixelsPerMillimeter; | 635 factor = cssPixelsPerMillimeter; |
| 637 break; | 636 break; |
| 638 case CSS_IN: | 637 case CSS_IN: |
| 639 factor = cssPixelsPerInch; | 638 factor = cssPixelsPerInch; |
| 640 break; | 639 break; |
| 641 case CSS_PT: | 640 case CSS_PT: |
| 642 factor = cssPixelsPerPoint; | 641 factor = cssPixelsPerPoint; |
| 643 break; | 642 break; |
| 644 case CSS_PC: | 643 case CSS_PC: |
| 645 factor = cssPixelsPerPica; | 644 factor = cssPixelsPerPica; |
| 646 break; | 645 break; |
| 647 case CSS_VW: | 646 case CSS_VW: |
| 648 factor = conversionData.viewportWidthPercent(); | 647 factor = lengthData->viewportWidthPercent(); |
| 649 break; | 648 break; |
| 650 case CSS_VH: | 649 case CSS_VH: |
| 651 factor = conversionData.viewportHeightPercent(); | 650 factor = lengthData->viewportHeightPercent(); |
| 652 break; | 651 break; |
| 653 case CSS_VMIN: | 652 case CSS_VMIN: |
| 654 factor = conversionData.viewportMinPercent(); | 653 factor = lengthData->viewportMinPercent(); |
| 655 break; | 654 break; |
| 656 case CSS_VMAX: | 655 case CSS_VMAX: |
| 657 factor = conversionData.viewportMaxPercent(); | 656 factor = lengthData->viewportMaxPercent(); |
| 658 break; | 657 break; |
| 659 case CSS_CALC_PERCENTAGE_WITH_LENGTH: | 658 case CSS_CALC_PERCENTAGE_WITH_LENGTH: |
| 660 case CSS_CALC_PERCENTAGE_WITH_NUMBER: | 659 case CSS_CALC_PERCENTAGE_WITH_NUMBER: |
| 661 ASSERT_NOT_REACHED(); | 660 ASSERT_NOT_REACHED(); |
| 662 return -1.0; | 661 return -1.0; |
| 663 default: | 662 default: |
| 664 ASSERT_NOT_REACHED(); | 663 ASSERT_NOT_REACHED(); |
| 665 return -1.0; | 664 return -1.0; |
| 666 } | 665 } |
| 667 | 666 |
| 668 // We do not apply the zoom factor when we are computing the value of the fo
nt-size property. The zooming | 667 // We do not apply the zoom factor when we are computing the value of the fo
nt-size property. The zooming |
| 669 // for font sizes is much more complicated, since we have to worry about enf
orcing the minimum font size preference | 668 // for font sizes is much more complicated, since we have to worry about enf
orcing the minimum font size preference |
| 670 // as well as enforcing the implicit "smart minimum." | 669 // as well as enforcing the implicit "smart minimum." |
| 671 double result = getDoubleValue() * factor; | 670 double result = getDoubleValue() * factor; |
| 672 if (computingFontSize || isFontRelativeLength()) | 671 if (computingFontSize || isFontRelativeLength()) |
| 673 return result; | 672 return result; |
| 674 | 673 |
| 675 return result * conversionData.zoom(); | 674 return result * lengthData->zoom(); |
| 676 } | 675 } |
| 677 | 676 |
| 678 void CSSPrimitiveValue::setFloatValue(unsigned short, double, ExceptionState& ex
ceptionState) | 677 void CSSPrimitiveValue::setFloatValue(unsigned short, double, ExceptionState& ex
ceptionState) |
| 679 { | 678 { |
| 680 // Keeping values immutable makes optimizations easier and allows sharing of
the primitive value objects. | 679 // Keeping values immutable makes optimizations easier and allows sharing of
the primitive value objects. |
| 681 // No other engine supports mutating style through this API. Computed style
is always read-only anyway. | 680 // No other engine supports mutating style through this API. Computed style
is always read-only anyway. |
| 682 // Supporting setter would require making primitive value copy-on-write and
taking care of style invalidation. | 681 // Supporting setter would require making primitive value copy-on-write and
taking care of style invalidation. |
| 683 exceptionState.throwDOMException(NoModificationAllowedError, "CSSPrimitiveVa
lue objects are read-only."); | 682 exceptionState.throwDOMException(NoModificationAllowedError, "CSSPrimitiveVa
lue objects are read-only."); |
| 684 } | 683 } |
| 685 | 684 |
| (...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1317 case CSS_SHAPE: | 1316 case CSS_SHAPE: |
| 1318 visitor->trace(m_value.shape); | 1317 visitor->trace(m_value.shape); |
| 1319 break; | 1318 break; |
| 1320 default: | 1319 default: |
| 1321 break; | 1320 break; |
| 1322 } | 1321 } |
| 1323 CSSValue::traceAfterDispatch(visitor); | 1322 CSSValue::traceAfterDispatch(visitor); |
| 1324 } | 1323 } |
| 1325 | 1324 |
| 1326 } // namespace WebCore | 1325 } // namespace WebCore |
| OLD | NEW |