Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(585)

Side by Side Diff: Source/core/css/CSSPrimitiveValue.cpp

Issue 64293008: Wrap CSS length conversion arguments in an object (Closed) Base URL: https://chromium.googlesource.com/chromium/blink@master
Patch Set: bool for useEffectiveZoom instead of -1 magic number Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 10 matching lines...) Expand all
21 #include "config.h" 21 #include "config.h"
22 #include "core/css/CSSPrimitiveValue.h" 22 #include "core/css/CSSPrimitiveValue.h"
23 23
24 #include "CSSPropertyNames.h" 24 #include "CSSPropertyNames.h"
25 #include "CSSValueKeywords.h" 25 #include "CSSValueKeywords.h"
26 #include "bindings/v8/ExceptionState.h" 26 #include "bindings/v8/ExceptionState.h"
27 #include "core/css/CSSBasicShapes.h" 27 #include "core/css/CSSBasicShapes.h"
28 #include "core/css/CSSCalculationValue.h" 28 #include "core/css/CSSCalculationValue.h"
29 #include "core/css/CSSHelper.h" 29 #include "core/css/CSSHelper.h"
30 #include "core/css/CSSParser.h" 30 #include "core/css/CSSParser.h"
31 #include "core/css/CSSToLengthConversionData.h"
31 #include "core/css/Counter.h" 32 #include "core/css/Counter.h"
32 #include "core/css/Pair.h" 33 #include "core/css/Pair.h"
33 #include "core/css/RGBColor.h" 34 #include "core/css/RGBColor.h"
34 #include "core/css/Rect.h" 35 #include "core/css/Rect.h"
35 #include "core/css/StyleSheetContents.h" 36 #include "core/css/StyleSheetContents.h"
36 #include "core/dom/ExceptionCode.h" 37 #include "core/dom/ExceptionCode.h"
37 #include "core/dom/Node.h" 38 #include "core/dom/Node.h"
38 #include "core/rendering/style/RenderStyle.h" 39 #include "core/rendering/style/RenderStyle.h"
39 #include "platform/LayoutUnit.h" 40 #include "platform/LayoutUnit.h"
40 #include "platform/graphics/Color.h" 41 #include "platform/graphics/Color.h"
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 case CSS_GRAD: 513 case CSS_GRAD:
513 return grad2deg(getDoubleValue()); 514 return grad2deg(getDoubleValue());
514 case CSS_TURN: 515 case CSS_TURN:
515 return turn2deg(getDoubleValue()); 516 return turn2deg(getDoubleValue());
516 default: 517 default:
517 ASSERT_NOT_REACHED(); 518 ASSERT_NOT_REACHED();
518 return 0; 519 return 0;
519 } 520 }
520 } 521 }
521 522
522 template<> int CSSPrimitiveValue::computeLength(const RenderStyle* style, const RenderStyle* rootStyle, float multiplier, bool computingFontSize) 523 template<> int CSSPrimitiveValue::computeLength(const CSSToLengthConversionData& conversionData)
523 { 524 {
524 return roundForImpreciseConversion<int>(computeLengthDouble(style, rootStyle , multiplier, computingFontSize)); 525 return roundForImpreciseConversion<int>(computeLengthDouble(conversionData)) ;
525 } 526 }
526 527
527 template<> unsigned CSSPrimitiveValue::computeLength(const RenderStyle* style, c onst RenderStyle* rootStyle, float multiplier, bool computingFontSize) 528 template<> unsigned CSSPrimitiveValue::computeLength(const CSSToLengthConversion Data& conversionData)
528 { 529 {
529 return roundForImpreciseConversion<unsigned>(computeLengthDouble(style, root Style, multiplier, computingFontSize)); 530 return roundForImpreciseConversion<unsigned>(computeLengthDouble(conversionD ata));
530 } 531 }
531 532
532 template<> Length CSSPrimitiveValue::computeLength(const RenderStyle* style, con st RenderStyle* rootStyle, float multiplier, bool computingFontSize) 533 template<> Length CSSPrimitiveValue::computeLength(const CSSToLengthConversionDa ta& conversionData)
533 { 534 {
534 return Length(clampTo<float>(computeLengthDouble(style, rootStyle, multiplie r, computingFontSize), minValueForCssLength, maxValueForCssLength), Fixed); 535 return Length(clampTo<float>(computeLengthDouble(conversionData), minValueFo rCssLength, maxValueForCssLength), Fixed);
535 } 536 }
536 537
537 template<> short CSSPrimitiveValue::computeLength(const RenderStyle* style, cons t RenderStyle* rootStyle, float multiplier, bool computingFontSize) 538 template<> short CSSPrimitiveValue::computeLength(const CSSToLengthConversionDat a& conversionData)
538 { 539 {
539 return roundForImpreciseConversion<short>(computeLengthDouble(style, rootSty le, multiplier, computingFontSize)); 540 return roundForImpreciseConversion<short>(computeLengthDouble(conversionData ));
540 } 541 }
541 542
542 template<> unsigned short CSSPrimitiveValue::computeLength(const RenderStyle* st yle, const RenderStyle* rootStyle, float multiplier, bool computingFontSize) 543 template<> unsigned short CSSPrimitiveValue::computeLength(const CSSToLengthConv ersionData& conversionData)
543 { 544 {
544 return roundForImpreciseConversion<unsigned short>(computeLengthDouble(style , rootStyle, multiplier, computingFontSize)); 545 return roundForImpreciseConversion<unsigned short>(computeLengthDouble(conve rsionData));
545 } 546 }
546 547
547 template<> float CSSPrimitiveValue::computeLength(const RenderStyle* style, cons t RenderStyle* rootStyle, float multiplier, bool computingFontSize) 548 template<> float CSSPrimitiveValue::computeLength(const CSSToLengthConversionDat a& conversionData)
548 { 549 {
549 return static_cast<float>(computeLengthDouble(style, rootStyle, multiplier, computingFontSize)); 550 return static_cast<float>(computeLengthDouble(conversionData));
550 } 551 }
551 552
552 template<> double CSSPrimitiveValue::computeLength(const RenderStyle* style, con st RenderStyle* rootStyle, float multiplier, bool computingFontSize) 553 template<> double CSSPrimitiveValue::computeLength(const CSSToLengthConversionDa ta& conversionData)
553 { 554 {
554 return computeLengthDouble(style, rootStyle, multiplier, computingFontSize); 555 return computeLengthDouble(conversionData);
555 } 556 }
556 557
557 double CSSPrimitiveValue::computeLengthDouble(const RenderStyle* style, const Re nderStyle* rootStyle, float multiplier, bool computingFontSize) 558 double CSSPrimitiveValue::computeLengthDouble(const CSSToLengthConversionData& c onversionData)
558 { 559 {
559 if (m_primitiveUnitType == CSS_CALC) 560 if (m_primitiveUnitType == CSS_CALC)
560 // The multiplier and factor is applied to each value in the calc expres sion individually 561 return m_value.calc->computeLengthPx(conversionData);
561 return m_value.calc->computeLengthPx(style, rootStyle, multiplier, compu tingFontSize); 562
563 const RenderStyle& style = conversionData.style();
564 const RenderStyle& rootStyle = conversionData.rootStyle();
565 bool computingFontSize = conversionData.computingFontSize();
562 566
563 double factor; 567 double factor;
564 568
565 switch (primitiveType()) { 569 switch (primitiveType()) {
566 case CSS_EMS: 570 case CSS_EMS:
567 factor = computingFontSize ? style->fontDescription().specifiedSize( ) : style->fontDescription().computedSize(); 571 factor = computingFontSize ? style.fontDescription().specifiedSize() : style.fontDescription().computedSize();
568 break; 572 break;
569 case CSS_EXS: 573 case CSS_EXS:
570 // FIXME: We have a bug right now where the zoom will be applied twi ce to EX units. 574 // FIXME: We have a bug right now where the zoom will be applied twi ce to EX units.
571 // We really need to compute EX using fontMetrics for the original s pecifiedSize and not use 575 // We really need to compute EX using fontMetrics for the original s pecifiedSize and not use
572 // our actual constructed rendering font. 576 // our actual constructed rendering font.
573 if (style->fontMetrics().hasXHeight()) 577 if (style.fontMetrics().hasXHeight())
574 factor = style->fontMetrics().xHeight(); 578 factor = style.fontMetrics().xHeight();
575 else 579 else
576 factor = (computingFontSize ? style->fontDescription().specified Size() : style->fontDescription().computedSize()) / 2.0; 580 factor = (computingFontSize ? style.fontDescription().specifiedS ize() : style.fontDescription().computedSize()) / 2.0;
577 break; 581 break;
578 case CSS_REMS: 582 case CSS_REMS:
579 if (rootStyle) 583 factor = computingFontSize ? rootStyle.fontDescription().specifiedSi ze() : rootStyle.fontDescription().computedSize();
580 factor = computingFontSize ? rootStyle->fontDescription().specif iedSize() : rootStyle->fontDescription().computedSize();
581 else
582 factor = 1.0;
583 break; 584 break;
584 case CSS_CHS: 585 case CSS_CHS:
585 factor = style->fontMetrics().zeroWidth(); 586 factor = style.fontMetrics().zeroWidth();
586 break; 587 break;
587 case CSS_PX: 588 case CSS_PX:
588 factor = 1.0; 589 factor = 1.0;
589 break; 590 break;
590 case CSS_CM: 591 case CSS_CM:
591 factor = cssPixelsPerCentimeter; 592 factor = cssPixelsPerCentimeter;
592 break; 593 break;
593 case CSS_MM: 594 case CSS_MM:
594 factor = cssPixelsPerMillimeter; 595 factor = cssPixelsPerMillimeter;
595 break; 596 break;
(...skipping 15 matching lines...) Expand all
611 return -1.0; 612 return -1.0;
612 } 613 }
613 614
614 // We do not apply the zoom factor when we are computing the value of the fo nt-size property. The zooming 615 // We do not apply the zoom factor when we are computing the value of the fo nt-size property. The zooming
615 // for font sizes is much more complicated, since we have to worry about enf orcing the minimum font size preference 616 // for font sizes is much more complicated, since we have to worry about enf orcing the minimum font size preference
616 // as well as enforcing the implicit "smart minimum." 617 // as well as enforcing the implicit "smart minimum."
617 double result = getDoubleValue() * factor; 618 double result = getDoubleValue() * factor;
618 if (computingFontSize || isFontRelativeLength()) 619 if (computingFontSize || isFontRelativeLength())
619 return result; 620 return result;
620 621
621 return result * multiplier; 622 return result * conversionData.zoom();
622 } 623 }
623 624
624 void CSSPrimitiveValue::setFloatValue(unsigned short, double, ExceptionState& ex ceptionState) 625 void CSSPrimitiveValue::setFloatValue(unsigned short, double, ExceptionState& ex ceptionState)
625 { 626 {
626 // Keeping values immutable makes optimizations easier and allows sharing of the primitive value objects. 627 // Keeping values immutable makes optimizations easier and allows sharing of the primitive value objects.
627 // No other engine supports mutating style through this API. Computed style is always read-only anyway. 628 // No other engine supports mutating style through this API. Computed style is always read-only anyway.
628 // Supporting setter would require making primitive value copy-on-write and taking care of style invalidation. 629 // Supporting setter would require making primitive value copy-on-write and taking care of style invalidation.
629 exceptionState.throwUninformativeAndGenericDOMException(NoModificationAllowe dError); 630 exceptionState.throwUninformativeAndGenericDOMException(NoModificationAllowe dError);
630 } 631 }
631 632
(...skipping 698 matching lines...) Expand 10 before | Expand all | Expand 10 after
1330 return m_value.parserOperator == other.m_value.parserOperator; 1331 return m_value.parserOperator == other.m_value.parserOperator;
1331 case CSS_CALC: 1332 case CSS_CALC:
1332 return m_value.calc && other.m_value.calc && m_value.calc->equals(*other .m_value.calc); 1333 return m_value.calc && other.m_value.calc && m_value.calc->equals(*other .m_value.calc);
1333 case CSS_SHAPE: 1334 case CSS_SHAPE:
1334 return m_value.shape && other.m_value.shape && m_value.shape->equals(*ot her.m_value.shape); 1335 return m_value.shape && other.m_value.shape && m_value.shape->equals(*ot her.m_value.shape);
1335 } 1336 }
1336 return false; 1337 return false;
1337 } 1338 }
1338 1339
1339 } // namespace WebCore 1340 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698