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

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

Issue 1226123008: CSSValue Immediates: Replace CSSPrimitiveValue usage with const references (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@cssvalue_patch_4_attempt_2
Patch Set: Rebase Created 5 years, 4 months 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
« no previous file with comments | « Source/core/css/CSSCrossfadeValue.cpp ('k') | Source/core/css/CSSMatrix.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2008 Apple Inc. All rights reserved. 2 * Copyright (C) 2008 Apple Inc. All rights reserved.
3 * Copyright (C) 2015 Google Inc. All rights reserved. 3 * Copyright (C) 2015 Google Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 RefPtr<Image> newImage = GradientGeneratedImage::create(gradient, size); 80 RefPtr<Image> newImage = GradientGeneratedImage::create(gradient, size);
81 if (cacheable) 81 if (cacheable)
82 putImage(size, newImage); 82 putImage(size, newImage);
83 83
84 return newImage.release(); 84 return newImage.release();
85 } 85 }
86 86
87 // Should only ever be called for deprecated gradients. 87 // Should only ever be called for deprecated gradients.
88 static inline bool compareStops(const CSSGradientColorStop& a, const CSSGradient ColorStop& b) 88 static inline bool compareStops(const CSSGradientColorStop& a, const CSSGradient ColorStop& b)
89 { 89 {
90 double aVal = toCSSPrimitiveValue(*a.m_position).getDoubleValue(); 90 double aVal = toCSSPrimitiveValue(a.m_position).getDoubleValue();
91 double bVal = toCSSPrimitiveValue(*b.m_position).getDoubleValue(); 91 double bVal = toCSSPrimitiveValue(b.m_position).getDoubleValue();
92 92
93 return aVal < bVal; 93 return aVal < bVal;
94 } 94 }
95 95
96 struct GradientStop { 96 struct GradientStop {
97 Color color; 97 Color color;
98 float offset; 98 float offset;
99 bool specified; 99 bool specified;
100 100
101 GradientStop() 101 GradientStop()
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 ASSERT(m_gradientType == CSSDeprecatedLinearGradient || m_gradientType == CS SDeprecatedRadialGradient); 202 ASSERT(m_gradientType == CSSDeprecatedLinearGradient || m_gradientType == CS SDeprecatedRadialGradient);
203 203
204 if (!m_stopsSorted) { 204 if (!m_stopsSorted) {
205 if (m_stops.size()) 205 if (m_stops.size())
206 std::stable_sort(m_stops.begin(), m_stops.end(), compareStops); 206 std::stable_sort(m_stops.begin(), m_stops.end(), compareStops);
207 m_stopsSorted = true; 207 m_stopsSorted = true;
208 } 208 }
209 209
210 for (const auto& stop : m_stops) { 210 for (const auto& stop : m_stops) {
211 float offset; 211 float offset;
212 if (toCSSPrimitiveValue(*stop.m_position).isPercentage()) 212 if (toCSSPrimitiveValue(stop.m_position).isPercentage())
213 offset = toCSSPrimitiveValue(*stop.m_position).getFloatValue() / 100 ; 213 offset = toCSSPrimitiveValue(stop.m_position).getFloatValue() / 100;
214 else 214 else
215 offset = toCSSPrimitiveValue(*stop.m_position).getFloatValue(); 215 offset = toCSSPrimitiveValue(stop.m_position).getFloatValue();
216 216
217 gradient->addColorStop(offset, resolveStopColor(toCSSPrimitiveValue(*sto p.m_color), object)); 217 gradient->addColorStop(offset, resolveStopColor(toCSSPrimitiveValue(stop .m_color), object));
218 } 218 }
219 } 219 }
220 220
221 static bool requiresStopsNormalization(const Vector<GradientStop>& stops, const Gradient* gradient) 221 static bool requiresStopsNormalization(const Vector<GradientStop>& stops, const Gradient* gradient)
222 { 222 {
223 // We need at least two stops to normalize 223 // We need at least two stops to normalize
224 if (stops.size() < 2) 224 if (stops.size() < 2)
225 return false; 225 return false;
226 226
227 // Repeating gradients are implemented using a normalized stop offset range 227 // Repeating gradients are implemented using a normalized stop offset range
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 else if (isRadialGradientValue()) 369 else if (isRadialGradientValue())
370 gradientEnd = gradientStart + FloatSize(gradient->endRadius(), 0); 370 gradientEnd = gradientStart + FloatSize(gradient->endRadius(), 0);
371 float gradientLength = FloatSize(gradientStart - gradientEnd).diagonalLength (); 371 float gradientLength = FloatSize(gradientStart - gradientEnd).diagonalLength ();
372 372
373 for (size_t i = 0; i < numStops; ++i) { 373 for (size_t i = 0; i < numStops; ++i) {
374 const CSSGradientColorStop& stop = m_stops[i]; 374 const CSSGradientColorStop& stop = m_stops[i];
375 375
376 if (stop.isHint()) 376 if (stop.isHint())
377 hasHints = true; 377 hasHints = true;
378 else 378 else
379 stops[i].color = resolveStopColor(toCSSPrimitiveValue(*stop.m_color) , object); 379 stops[i].color = resolveStopColor(toCSSPrimitiveValue(stop.m_color), object);
380 380
381 if (stop.m_position) { 381 if (stop.m_position) {
382 CSSPrimitiveValue stopPosition = toCSSPrimitiveValue(*stop.m_positio n); 382 const CSSPrimitiveValue& stopPosition = toCSSPrimitiveValue(stop.m_p osition);
383 if (stopPosition.isPercentage()) { 383 if (stopPosition.isPercentage()) {
384 stops[i].offset = toCSSPrimitiveValue(*stop.m_position).getFloat Value() / 100; 384 stops[i].offset = toCSSPrimitiveValue(stop.m_position).getFloatV alue() / 100;
385 } else if (stopPosition.isLength() || stopPosition.isCalculatedPerce ntageWithLength()) { 385 } else if (stopPosition.isLength() || stopPosition.isCalculatedPerce ntageWithLength()) {
386 float length; 386 float length;
387 if (stopPosition.isLength()) 387 if (stopPosition.isLength())
388 length = stopPosition.computeLength<float>(conversionData); 388 length = stopPosition.computeLength<float>(conversionData);
389 else 389 else
390 length = stopPosition.cssCalcValue()->toCalcValue(conversion Data)->evaluate(gradientLength); 390 length = stopPosition.cssCalcValue()->toCalcValue(conversion Data)->evaluate(gradientLength);
391 stops[i].offset = (gradientLength > 0) ? length / gradientLength : 0; 391 stops[i].offset = (gradientLength > 0) ? length / gradientLength : 0;
392 } else { 392 } else {
393 ASSERT_NOT_REACHED(); 393 ASSERT_NOT_REACHED();
394 stops[i].offset = 0; 394 stops[i].offset = 0;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 483
484 static float positionFromValue(CSSPrimitiveValue value, const CSSToLengthConvers ionData& conversionData, const IntSize& size, bool isHorizontal) 484 static float positionFromValue(CSSPrimitiveValue value, const CSSToLengthConvers ionData& conversionData, const IntSize& size, bool isHorizontal)
485 { 485 {
486 int origin = 0; 486 int origin = 0;
487 int sign = 1; 487 int sign = 1;
488 int edgeDistance = isHorizontal ? size.width() : size.height(); 488 int edgeDistance = isHorizontal ? size.width() : size.height();
489 489
490 // In this case the center of the gradient is given relative to an edge in t he form of: 490 // In this case the center of the gradient is given relative to an edge in t he form of:
491 // [ top | bottom | right | left ] [ <percentage> | <length> ]. 491 // [ top | bottom | right | left ] [ <percentage> | <length> ].
492 if (Pair* pair = value.getPairValue()) { 492 if (Pair* pair = value.getPairValue()) {
493 CSSValueID originID = toCSSPrimitiveValue(*pair->first()).getValueID(); 493 CSSValueID originID = pair->first().getValueID();
494 value = toCSSPrimitiveValue(*pair->second()); 494 value = pair->second();
495 495
496 if (originID == CSSValueRight || originID == CSSValueBottom) { 496 if (originID == CSSValueRight || originID == CSSValueBottom) {
497 // For right/bottom, the offset is relative to the far edge. 497 // For right/bottom, the offset is relative to the far edge.
498 origin = edgeDistance; 498 origin = edgeDistance;
499 sign = -1; 499 sign = -1;
500 } 500 }
501 } 501 }
502 502
503 if (value.isNumber()) 503 if (value.isNumber())
504 return origin + sign * value.getFloatValue() * conversionData.zoom(); 504 return origin + sign * value.getFloatValue() * conversionData.zoom();
(...skipping 22 matching lines...) Expand all
527 } 527 }
528 528
529 return origin + sign * value.computeLength<float>(conversionData); 529 return origin + sign * value.computeLength<float>(conversionData);
530 } 530 }
531 531
532 FloatPoint CSSGradientValue::computeEndPoint(NullableCSSValue horizontal, Nullab leCSSValue vertical, const CSSToLengthConversionData& conversionData, const IntS ize& size) 532 FloatPoint CSSGradientValue::computeEndPoint(NullableCSSValue horizontal, Nullab leCSSValue vertical, const CSSToLengthConversionData& conversionData, const IntS ize& size)
533 { 533 {
534 FloatPoint result; 534 FloatPoint result;
535 535
536 if (horizontal) 536 if (horizontal)
537 result.setX(positionFromValue(toCSSPrimitiveValue(*horizontal), conversi onData, size, true)); 537 result.setX(positionFromValue(toCSSPrimitiveValue(horizontal), conversio nData, size, true));
538 538
539 if (vertical) 539 if (vertical)
540 result.setY(positionFromValue(toCSSPrimitiveValue(*vertical), conversion Data, size, false)); 540 result.setY(positionFromValue(toCSSPrimitiveValue(vertical), conversionD ata, size, false));
541 541
542 return result; 542 return result;
543 } 543 }
544 544
545 bool CSSGradientValue::isCacheable() const 545 bool CSSGradientValue::isCacheable() const
546 { 546 {
547 for (size_t i = 0; i < m_stops.size(); ++i) { 547 for (size_t i = 0; i < m_stops.size(); ++i) {
548 const CSSGradientColorStop& stop = m_stops[i]; 548 const CSSGradientColorStop& stop = m_stops[i];
549 549
550 if (!stop.isHint() && toCSSPrimitiveValue(*stop.m_color).colorIsDerivedF romElement()) 550 if (!stop.isHint() && toCSSPrimitiveValue(stop.m_color).colorIsDerivedFr omElement())
551 return false; 551 return false;
552 552
553 if (!stop.m_position) 553 if (!stop.m_position)
554 continue; 554 continue;
555 555
556 if (toCSSPrimitiveValue(*stop.m_position).isFontRelativeLength()) 556 if (toCSSPrimitiveValue(stop.m_position).isFontRelativeLength())
557 return false; 557 return false;
558 } 558 }
559 559
560 return true; 560 return true;
561 } 561 }
562 562
563 bool CSSGradientValue::knownToBeOpaque(const LayoutObject* object) const 563 bool CSSGradientValue::knownToBeOpaque(const LayoutObject* object) const
564 { 564 {
565 ASSERT(object); 565 ASSERT(object);
566 for (auto& stop : m_stops) { 566 for (auto& stop : m_stops) {
567 if (!stop.isHint() && resolveStopColor(toCSSPrimitiveValue(*stop.m_color ), *object).hasAlpha()) 567 if (!stop.isHint() && resolveStopColor(toCSSPrimitiveValue(stop.m_color) , *object).hasAlpha())
568 return false; 568 return false;
569 } 569 }
570 return true; 570 return true;
571 } 571 }
572 572
573 DEFINE_TRACE_AFTER_DISPATCH(CSSGradientValue) 573 DEFINE_TRACE_AFTER_DISPATCH(CSSGradientValue)
574 { 574 {
575 #if ENABLE(OILPAN) 575 #if ENABLE(OILPAN)
576 visitor->trace(m_firstX); 576 visitor->trace(m_firstX);
577 visitor->trace(m_firstY); 577 visitor->trace(m_firstY);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 } 627 }
628 } 628 }
629 } else { 629 } else {
630 if (m_repeating) 630 if (m_repeating)
631 result.appendLiteral("repeating-linear-gradient("); 631 result.appendLiteral("repeating-linear-gradient(");
632 else 632 else
633 result.appendLiteral("linear-gradient("); 633 result.appendLiteral("linear-gradient(");
634 634
635 bool wroteSomething = false; 635 bool wroteSomething = false;
636 636
637 if (m_angle && toCSSPrimitiveValue(*m_angle).computeDegrees() != 180) { 637 if (m_angle && toCSSPrimitiveValue(m_angle).computeDegrees() != 180) {
638 result.append(m_angle->cssText()); 638 result.append(m_angle->cssText());
639 wroteSomething = true; 639 wroteSomething = true;
640 } else if ((m_firstX || m_firstY) && !(!m_firstX && m_firstY && toCSSPri mitiveValue(*m_firstY).getValueID() == CSSValueBottom)) { 640 } else if ((m_firstX || m_firstY) && !(!m_firstX && m_firstY && toCSSPri mitiveValue(m_firstY).getValueID() == CSSValueBottom)) {
641 result.appendLiteral("to "); 641 result.appendLiteral("to ");
642 if (m_firstX && m_firstY) { 642 if (m_firstX && m_firstY) {
643 result.append(m_firstX->cssText()); 643 result.append(m_firstX->cssText());
644 result.append(' '); 644 result.append(' ');
645 result.append(m_firstY->cssText()); 645 result.append(m_firstY->cssText());
646 } else if (m_firstX) 646 } else if (m_firstX)
647 result.append(m_firstX->cssText()); 647 result.append(m_firstX->cssText());
648 else 648 else
649 result.append(m_firstY->cssText()); 649 result.append(m_firstY->cssText());
650 wroteSomething = true; 650 wroteSomething = true;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 firstPoint.set(halfWidth - endX, halfHeight + endY); 739 firstPoint.set(halfWidth - endX, halfHeight + endY);
740 } 740 }
741 741
742 PassRefPtr<Gradient> CSSLinearGradientValue::createGradient(const CSSToLengthCon versionData& conversionData, const IntSize& size, const LayoutObject& object) 742 PassRefPtr<Gradient> CSSLinearGradientValue::createGradient(const CSSToLengthCon versionData& conversionData, const IntSize& size, const LayoutObject& object)
743 { 743 {
744 ASSERT(!size.isEmpty()); 744 ASSERT(!size.isEmpty());
745 745
746 FloatPoint firstPoint; 746 FloatPoint firstPoint;
747 FloatPoint secondPoint; 747 FloatPoint secondPoint;
748 if (m_angle) { 748 if (m_angle) {
749 float angle = toCSSPrimitiveValue(*m_angle).computeDegrees(); 749 float angle = toCSSPrimitiveValue(m_angle).computeDegrees();
750 endPointsFromAngle(angle, size, firstPoint, secondPoint, m_gradientType) ; 750 endPointsFromAngle(angle, size, firstPoint, secondPoint, m_gradientType) ;
751 } else { 751 } else {
752 switch (m_gradientType) { 752 switch (m_gradientType) {
753 case CSSDeprecatedLinearGradient: 753 case CSSDeprecatedLinearGradient:
754 firstPoint = computeEndPoint(m_firstX, m_firstY, conversionData, siz e); 754 firstPoint = computeEndPoint(m_firstX, m_firstY, conversionData, siz e);
755 if (m_secondX || m_secondY) 755 if (m_secondX || m_secondY)
756 secondPoint = computeEndPoint(m_secondX, m_secondY, conversionDa ta, size); 756 secondPoint = computeEndPoint(m_secondX, m_secondY, conversionDa ta, size);
757 else { 757 else {
758 if (m_firstX) 758 if (m_firstX)
759 secondPoint.setX(size.width() - firstPoint.x()); 759 secondPoint.setX(size.width() - firstPoint.x());
760 if (m_firstY) 760 if (m_firstY)
761 secondPoint.setY(size.height() - firstPoint.y()); 761 secondPoint.setY(size.height() - firstPoint.y());
762 } 762 }
763 break; 763 break;
764 case CSSPrefixedLinearGradient: 764 case CSSPrefixedLinearGradient:
765 firstPoint = computeEndPoint(m_firstX, m_firstY, conversionData, siz e); 765 firstPoint = computeEndPoint(m_firstX, m_firstY, conversionData, siz e);
766 if (m_firstX) 766 if (m_firstX)
767 secondPoint.setX(size.width() - firstPoint.x()); 767 secondPoint.setX(size.width() - firstPoint.x());
768 if (m_firstY) 768 if (m_firstY)
769 secondPoint.setY(size.height() - firstPoint.y()); 769 secondPoint.setY(size.height() - firstPoint.y());
770 break; 770 break;
771 case CSSLinearGradient: 771 case CSSLinearGradient:
772 if (m_firstX && m_firstY) { 772 if (m_firstX && m_firstY) {
773 // "Magic" corners, so the 50% line touches two corners. 773 // "Magic" corners, so the 50% line touches two corners.
774 float rise = size.width(); 774 float rise = size.width();
775 float run = size.height(); 775 float run = size.height();
776 if (m_firstX && toCSSPrimitiveValue(*m_firstX).getValueID() == C SSValueLeft) 776 if (m_firstX && toCSSPrimitiveValue(m_firstX).getValueID() == CS SValueLeft)
777 run *= -1; 777 run *= -1;
778 if (m_firstY && toCSSPrimitiveValue(*m_firstY).getValueID() == C SSValueBottom) 778 if (m_firstY && toCSSPrimitiveValue(m_firstY).getValueID() == CS SValueBottom)
779 rise *= -1; 779 rise *= -1;
780 // Compute angle, and flip it back to "bearing angle" degrees. 780 // Compute angle, and flip it back to "bearing angle" degrees.
781 float angle = 90 - rad2deg(atan2(rise, run)); 781 float angle = 90 - rad2deg(atan2(rise, run));
782 endPointsFromAngle(angle, size, firstPoint, secondPoint, m_gradi entType); 782 endPointsFromAngle(angle, size, firstPoint, secondPoint, m_gradi entType);
783 } else if (m_firstX || m_firstY) { 783 } else if (m_firstX || m_firstY) {
784 secondPoint = computeEndPoint(m_firstX, m_firstY, conversionData , size); 784 secondPoint = computeEndPoint(m_firstX, m_firstY, conversionData , size);
785 if (m_firstX) 785 if (m_firstX)
786 firstPoint.setX(size.width() - secondPoint.x()); 786 firstPoint.setX(size.width() - secondPoint.x());
787 if (m_firstY) 787 if (m_firstY)
788 firstPoint.setY(size.height() - secondPoint.y()); 788 firstPoint.setY(size.height() - secondPoint.y());
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
842 { 842 {
843 visitor->trace(m_angle); 843 visitor->trace(m_angle);
844 CSSGradientValue::traceAfterDispatch(visitor); 844 CSSGradientValue::traceAfterDispatch(visitor);
845 } 845 }
846 846
847 inline void CSSGradientValue::appendCSSTextForDeprecatedColorStops(StringBuilder & result) const 847 inline void CSSGradientValue::appendCSSTextForDeprecatedColorStops(StringBuilder & result) const
848 { 848 {
849 for (unsigned i = 0; i < m_stops.size(); i++) { 849 for (unsigned i = 0; i < m_stops.size(); i++) {
850 const CSSGradientColorStop& stop = m_stops[i]; 850 const CSSGradientColorStop& stop = m_stops[i];
851 result.appendLiteral(", "); 851 result.appendLiteral(", ");
852 double stopValue = toCSSPrimitiveValue(*stop.m_position).getDoubleValue( ); 852 double stopValue = toCSSPrimitiveValue(stop.m_position).getDoubleValue() ;
853 if (stopValue == 0) { 853 if (stopValue == 0) {
854 result.appendLiteral("from("); 854 result.appendLiteral("from(");
855 result.append(stop.m_color->cssText()); 855 result.append(stop.m_color->cssText());
856 result.append(')'); 856 result.append(')');
857 } else if (stopValue == 1) { 857 } else if (stopValue == 1) {
858 result.appendLiteral("to("); 858 result.appendLiteral("to(");
859 result.append(stop.m_color->cssText()); 859 result.append(stop.m_color->cssText());
860 result.append(')'); 860 result.append(')');
861 } else { 861 } else {
862 result.appendLiteral("color-stop("); 862 result.appendLiteral("color-stop(");
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 } else { 935 } else {
936 if (m_repeating) 936 if (m_repeating)
937 result.appendLiteral("repeating-radial-gradient("); 937 result.appendLiteral("repeating-radial-gradient(");
938 else 938 else
939 result.appendLiteral("radial-gradient("); 939 result.appendLiteral("radial-gradient(");
940 940
941 bool wroteSomething = false; 941 bool wroteSomething = false;
942 942
943 // The only ambiguous case that needs an explicit shape to be provided 943 // The only ambiguous case that needs an explicit shape to be provided
944 // is when a sizing keyword is used (or all sizing is omitted). 944 // is when a sizing keyword is used (or all sizing is omitted).
945 if (m_shape && toCSSPrimitiveValue(*m_shape).getValueID() != CSSValueEll ipse && (m_sizingBehavior || (!m_sizingBehavior && !m_endHorizontalSize))) { 945 if (m_shape && toCSSPrimitiveValue(m_shape).getValueID() != CSSValueElli pse && (m_sizingBehavior || (!m_sizingBehavior && !m_endHorizontalSize))) {
946 result.appendLiteral("circle"); 946 result.appendLiteral("circle");
947 wroteSomething = true; 947 wroteSomething = true;
948 } 948 }
949 949
950 if (m_sizingBehavior && toCSSPrimitiveValue(*m_sizingBehavior).getValueI D() != CSSValueFarthestCorner) { 950 if (m_sizingBehavior && toCSSPrimitiveValue(m_sizingBehavior).getValueID () != CSSValueFarthestCorner) {
951 if (wroteSomething) 951 if (wroteSomething)
952 result.append(' '); 952 result.append(' ');
953 result.append(m_sizingBehavior->cssText()); 953 result.append(m_sizingBehavior->cssText());
954 wroteSomething = true; 954 wroteSomething = true;
955 } else if (m_endHorizontalSize) { 955 } else if (m_endHorizontalSize) {
956 if (wroteSomething) 956 if (wroteSomething)
957 result.append(' '); 957 result.append(' ');
958 result.append(m_endHorizontalSize->cssText()); 958 result.append(m_endHorizontalSize->cssText());
959 if (m_endVerticalSize) { 959 if (m_endVerticalSize) {
960 result.append(' '); 960 result.append(' ');
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1095 firstPoint.setY(size.height() / 2); 1095 firstPoint.setY(size.height() / 2);
1096 1096
1097 FloatPoint secondPoint = computeEndPoint(m_secondX.get(), m_secondY.get(), c onversionData, size); 1097 FloatPoint secondPoint = computeEndPoint(m_secondX.get(), m_secondY.get(), c onversionData, size);
1098 if (!m_secondX) 1098 if (!m_secondX)
1099 secondPoint.setX(size.width() / 2); 1099 secondPoint.setX(size.width() / 2);
1100 if (!m_secondY) 1100 if (!m_secondY)
1101 secondPoint.setY(size.height() / 2); 1101 secondPoint.setY(size.height() / 2);
1102 1102
1103 float firstRadius = 0; 1103 float firstRadius = 0;
1104 if (m_firstRadius) 1104 if (m_firstRadius)
1105 firstRadius = resolveRadius(toCSSPrimitiveValue(*m_firstRadius), convers ionData); 1105 firstRadius = resolveRadius(toCSSPrimitiveValue(m_firstRadius), conversi onData);
1106 1106
1107 FloatSize secondRadius(0, 0); 1107 FloatSize secondRadius(0, 0);
1108 if (m_secondRadius) { 1108 if (m_secondRadius) {
1109 secondRadius.setWidth(resolveRadius(toCSSPrimitiveValue(*m_secondRadius) , conversionData)); 1109 secondRadius.setWidth(resolveRadius(toCSSPrimitiveValue(m_secondRadius), conversionData));
1110 secondRadius.setHeight(secondRadius.width()); 1110 secondRadius.setHeight(secondRadius.width());
1111 } else if (m_endHorizontalSize) { 1111 } else if (m_endHorizontalSize) {
1112 float width = size.width(); 1112 float width = size.width();
1113 float height = size.height(); 1113 float height = size.height();
1114 secondRadius.setWidth(resolveRadius(toCSSPrimitiveValue(*m_endHorizontal Size), conversionData, &width)); 1114 secondRadius.setWidth(resolveRadius(toCSSPrimitiveValue(m_endHorizontalS ize), conversionData, &width));
1115 secondRadius.setHeight(m_endVerticalSize 1115 secondRadius.setHeight(m_endVerticalSize
1116 ? resolveRadius(toCSSPrimitiveValue(*m_endVerticalSize), conversionD ata, &height) 1116 ? resolveRadius(toCSSPrimitiveValue(m_endVerticalSize), conversionDa ta, &height)
1117 : secondRadius.width()); 1117 : secondRadius.width());
1118 } else { 1118 } else {
1119 EndShapeType shape = (m_shape && toCSSPrimitiveValue(*m_shape).getValueI D() == CSSValueCircle) 1119 EndShapeType shape = (m_shape && toCSSPrimitiveValue(m_shape).getValueID () == CSSValueCircle)
1120 || (!m_shape && !m_sizingBehavior && m_endHorizontalSize && !m_endVe rticalSize) 1120 || (!m_shape && !m_sizingBehavior && m_endHorizontalSize && !m_endVe rticalSize)
1121 ? CircleEndShape 1121 ? CircleEndShape
1122 : EllipseEndShape; 1122 : EllipseEndShape;
1123 1123
1124 switch (m_sizingBehavior ? toCSSPrimitiveValue(*m_sizingBehavior).getVal ueID() : 0) { 1124 switch (m_sizingBehavior ? toCSSPrimitiveValue(m_sizingBehavior).getValu eID() : 0) {
1125 case CSSValueContain: 1125 case CSSValueContain:
1126 case CSSValueClosestSide: 1126 case CSSValueClosestSide:
1127 secondRadius = radiusToSide(secondPoint, size, shape, 1127 secondRadius = radiusToSide(secondPoint, size, shape,
1128 [] (float a, float b) { return a < b; }); 1128 [] (float a, float b) { return a < b; });
1129 break; 1129 break;
1130 case CSSValueFarthestSide: 1130 case CSSValueFarthestSide:
1131 secondRadius = radiusToSide(secondPoint, size, shape, 1131 secondRadius = radiusToSide(secondPoint, size, shape,
1132 [] (float a, float b) { return a > b; }); 1132 [] (float a, float b) { return a > b; });
1133 break; 1133 break;
1134 case CSSValueClosestCorner: 1134 case CSSValueClosestCorner:
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1206 visitor->trace(m_firstRadius); 1206 visitor->trace(m_firstRadius);
1207 visitor->trace(m_secondRadius); 1207 visitor->trace(m_secondRadius);
1208 visitor->trace(m_shape); 1208 visitor->trace(m_shape);
1209 visitor->trace(m_sizingBehavior); 1209 visitor->trace(m_sizingBehavior);
1210 visitor->trace(m_endHorizontalSize); 1210 visitor->trace(m_endHorizontalSize);
1211 visitor->trace(m_endVerticalSize); 1211 visitor->trace(m_endVerticalSize);
1212 CSSGradientValue::traceAfterDispatch(visitor); 1212 CSSGradientValue::traceAfterDispatch(visitor);
1213 } 1213 }
1214 1214
1215 } // namespace blink 1215 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/css/CSSCrossfadeValue.cpp ('k') | Source/core/css/CSSMatrix.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698