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

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

Issue 767343003: Make currentColor keyword in linear-gradient work (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Resolve gradient colors later Created 6 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 * Copyright (C) 2008 Apple Inc. All rights reserved. 2 * Copyright (C) 2008 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 if (result) 64 if (result)
65 return result; 65 return result;
66 } 66 }
67 67
68 // We need to create an image. 68 // We need to create an image.
69 RefPtr<Gradient> gradient; 69 RefPtr<Gradient> gradient;
70 70
71 RenderStyle* rootStyle = renderer->document().documentElement()->renderStyle (); 71 RenderStyle* rootStyle = renderer->document().documentElement()->renderStyle ();
72 CSSToLengthConversionData conversionData(renderer->style(), rootStyle, rende rer->view(), renderer->style()->effectiveZoom()); 72 CSSToLengthConversionData conversionData(renderer->style(), rootStyle, rende rer->view(), renderer->style()->effectiveZoom());
73 if (isLinearGradientValue()) 73 if (isLinearGradientValue())
74 gradient = toCSSLinearGradientValue(this)->createGradient(conversionData , size); 74 gradient = toCSSLinearGradientValue(this)->createGradient(conversionData , size, *renderer);
75 else 75 else
76 gradient = toCSSRadialGradientValue(this)->createGradient(conversionData , size); 76 gradient = toCSSRadialGradientValue(this)->createGradient(conversionData , size, *renderer);
77 77
78 RefPtr<Image> newImage = GradientGeneratedImage::create(gradient, size); 78 RefPtr<Image> newImage = GradientGeneratedImage::create(gradient, size);
79 if (cacheable) 79 if (cacheable)
80 putImage(size, newImage); 80 putImage(size, newImage);
81 81
82 return newImage.release(); 82 return newImage.release();
83 } 83 }
84 84
85 // Should only ever be called for deprecated gradients. 85 // Should only ever be called for deprecated gradients.
86 static inline bool compareStops(const CSSGradientColorStop& a, const CSSGradient ColorStop& b) 86 static inline bool compareStops(const CSSGradientColorStop& a, const CSSGradient ColorStop& b)
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 newStops[y].color = blend(leftColor, rightColor, weighting); 226 newStops[y].color = blend(leftColor, rightColor, weighting);
227 } 227 }
228 228
229 // Replace the color hint with the new color stops. 229 // Replace the color hint with the new color stops.
230 stops.remove(x); 230 stops.remove(x);
231 stops.insert(x, newStops, 9); 231 stops.insert(x, newStops, 9);
232 indexOffset += 8; 232 indexOffset += 8;
233 } 233 }
234 } 234 }
235 235
236 void CSSGradientValue::addStops(Gradient* gradient, const CSSToLengthConversionD ata& conversionData, float maxLengthForRepeat) 236 void CSSGradientValue::addStops(Gradient* gradient, const CSSToLengthConversionD ata& conversionData, float maxLengthForRepeat, const RenderObject& object)
237 { 237 {
238 if (m_gradientType == CSSDeprecatedLinearGradient || m_gradientType == CSSDe precatedRadialGradient) { 238 if (m_gradientType == CSSDeprecatedLinearGradient || m_gradientType == CSSDe precatedRadialGradient) {
239 sortStopsIfNeeded(); 239 sortStopsIfNeeded();
240 240
241 for (unsigned i = 0; i < m_stops.size(); i++) { 241 for (unsigned i = 0; i < m_stops.size(); i++) {
242 const CSSGradientColorStop& stop = m_stops[i]; 242 const CSSGradientColorStop& stop = m_stops[i];
243 243
244 float offset; 244 float offset;
245 if (stop.m_position->isPercentage()) 245 if (stop.m_position->isPercentage())
246 offset = stop.m_position->getFloatValue(CSSPrimitiveValue::CSS_P ERCENTAGE) / 100; 246 offset = stop.m_position->getFloatValue(CSSPrimitiveValue::CSS_P ERCENTAGE) / 100;
(...skipping 21 matching lines...) Expand all
268 gradientEnd = gradient->p1(); 268 gradientEnd = gradient->p1();
269 else if (isRadialGradientValue()) 269 else if (isRadialGradientValue())
270 gradientEnd = gradientStart + FloatSize(gradient->endRadius(), 0); 270 gradientEnd = gradientStart + FloatSize(gradient->endRadius(), 0);
271 271
272 for (size_t i = 0; i < numStops; ++i) { 272 for (size_t i = 0; i < numStops; ++i) {
273 const CSSGradientColorStop& stop = m_stops[i]; 273 const CSSGradientColorStop& stop = m_stops[i];
274 274
275 if (stop.isHint()) 275 if (stop.isHint())
276 hasHints = true; 276 hasHints = true;
277 else 277 else
278 stops[i].color = stop.m_resolvedColor; 278 stops[i].color = object.document().textLinkColors().colorFromPrimiti veValue(stop.m_color.get(), object.style()->visitedDependentColor(CSSPropertyCol or));
279 279
280 if (stop.m_position) { 280 if (stop.m_position) {
281 if (stop.m_position->isPercentage()) 281 if (stop.m_position->isPercentage())
282 stops[i].offset = stop.m_position->getFloatValue(CSSPrimitiveVal ue::CSS_PERCENTAGE) / 100; 282 stops[i].offset = stop.m_position->getFloatValue(CSSPrimitiveVal ue::CSS_PERCENTAGE) / 100;
283 else if (stop.m_position->isLength() || stop.m_position->isCalculate dPercentageWithLength()) { 283 else if (stop.m_position->isLength() || stop.m_position->isCalculate dPercentageWithLength()) {
284 if (!computedGradientLength) { 284 if (!computedGradientLength) {
285 FloatSize gradientSize(gradientStart - gradientEnd); 285 FloatSize gradientSize(gradientStart - gradientEnd);
286 gradientLength = gradientSize.diagonalLength(); 286 gradientLength = gradientSize.diagonalLength();
287 } 287 }
288 float length; 288 float length;
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
760 float endX = c / (slope - perpendicularSlope); 760 float endX = c / (slope - perpendicularSlope);
761 float endY = perpendicularSlope * endX + c; 761 float endY = perpendicularSlope * endX + c;
762 762
763 // We computed the end point, so set the second point, 763 // We computed the end point, so set the second point,
764 // taking into account the moved origin and the fact that we're in drawing s pace (+y = down). 764 // taking into account the moved origin and the fact that we're in drawing s pace (+y = down).
765 secondPoint.set(halfWidth + endX, halfHeight - endY); 765 secondPoint.set(halfWidth + endX, halfHeight - endY);
766 // Reflect around the center for the start point. 766 // Reflect around the center for the start point.
767 firstPoint.set(halfWidth - endX, halfHeight + endY); 767 firstPoint.set(halfWidth - endX, halfHeight + endY);
768 } 768 }
769 769
770 PassRefPtr<Gradient> CSSLinearGradientValue::createGradient(const CSSToLengthCon versionData& conversionData, const IntSize& size) 770 PassRefPtr<Gradient> CSSLinearGradientValue::createGradient(const CSSToLengthCon versionData& conversionData, const IntSize& size, const RenderObject& object)
771 { 771 {
772 ASSERT(!size.isEmpty()); 772 ASSERT(!size.isEmpty());
773 773
774 FloatPoint firstPoint; 774 FloatPoint firstPoint;
775 FloatPoint secondPoint; 775 FloatPoint secondPoint;
776 if (m_angle) { 776 if (m_angle) {
777 float angle = m_angle->getFloatValue(CSSPrimitiveValue::CSS_DEG); 777 float angle = m_angle->getFloatValue(CSSPrimitiveValue::CSS_DEG);
778 endPointsFromAngle(angle, size, firstPoint, secondPoint, m_gradientType) ; 778 endPointsFromAngle(angle, size, firstPoint, secondPoint, m_gradientType) ;
779 } else { 779 } else {
780 switch (m_gradientType) { 780 switch (m_gradientType) {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 ASSERT_NOT_REACHED(); 821 ASSERT_NOT_REACHED();
822 } 822 }
823 823
824 } 824 }
825 825
826 RefPtr<Gradient> gradient = Gradient::create(firstPoint, secondPoint); 826 RefPtr<Gradient> gradient = Gradient::create(firstPoint, secondPoint);
827 827
828 gradient->setDrawsInPMColorSpace(true); 828 gradient->setDrawsInPMColorSpace(true);
829 829
830 // Now add the stops. 830 // Now add the stops.
831 addStops(gradient.get(), conversionData, 1); 831 addStops(gradient.get(), conversionData, 1, object);
832 832
833 return gradient.release(); 833 return gradient.release();
834 } 834 }
835 835
836 bool CSSLinearGradientValue::equals(const CSSLinearGradientValue& other) const 836 bool CSSLinearGradientValue::equals(const CSSLinearGradientValue& other) const
837 { 837 {
838 if (m_gradientType == CSSDeprecatedLinearGradient) 838 if (m_gradientType == CSSDeprecatedLinearGradient)
839 return other.m_gradientType == m_gradientType 839 return other.m_gradientType == m_gradientType
840 && compareCSSValuePtr(m_firstX, other.m_firstX) 840 && compareCSSValuePtr(m_firstX, other.m_firstX)
841 && compareCSSValuePtr(m_firstY, other.m_firstY) 841 && compareCSSValuePtr(m_firstY, other.m_firstY)
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
1105 // width/height given by aspectRatio. 1105 // width/height given by aspectRatio.
1106 static inline float horizontalEllipseRadius(const FloatSize& p, float aspectRati o) 1106 static inline float horizontalEllipseRadius(const FloatSize& p, float aspectRati o)
1107 { 1107 {
1108 // x^2/a^2 + y^2/b^2 = 1 1108 // x^2/a^2 + y^2/b^2 = 1
1109 // a/b = aspectRatio, b = a/aspectRatio 1109 // a/b = aspectRatio, b = a/aspectRatio
1110 // a = sqrt(x^2 + y^2/(1/r^2)) 1110 // a = sqrt(x^2 + y^2/(1/r^2))
1111 return sqrtf(p.width() * p.width() + (p.height() * p.height()) / (1 / (aspec tRatio * aspectRatio))); 1111 return sqrtf(p.width() * p.width() + (p.height() * p.height()) / (1 / (aspec tRatio * aspectRatio)));
1112 } 1112 }
1113 1113
1114 // FIXME: share code with the linear version 1114 // FIXME: share code with the linear version
1115 PassRefPtr<Gradient> CSSRadialGradientValue::createGradient(const CSSToLengthCon versionData& conversionData, const IntSize& size) 1115 PassRefPtr<Gradient> CSSRadialGradientValue::createGradient(const CSSToLengthCon versionData& conversionData, const IntSize& size, const RenderObject& object)
1116 { 1116 {
1117 ASSERT(!size.isEmpty()); 1117 ASSERT(!size.isEmpty());
1118 1118
1119 FloatPoint firstPoint = computeEndPoint(m_firstX.get(), m_firstY.get(), conv ersionData, size); 1119 FloatPoint firstPoint = computeEndPoint(m_firstX.get(), m_firstY.get(), conv ersionData, size);
1120 if (!m_firstX) 1120 if (!m_firstX)
1121 firstPoint.setX(size.width() / 2); 1121 firstPoint.setX(size.width() / 2);
1122 if (!m_firstY) 1122 if (!m_firstY)
1123 firstPoint.setY(size.height() / 2); 1123 firstPoint.setY(size.height() / 2);
1124 1124
1125 FloatPoint secondPoint = computeEndPoint(m_secondX.get(), m_secondY.get(), c onversionData, size); 1125 FloatPoint secondPoint = computeEndPoint(m_secondX.get(), m_secondY.get(), c onversionData, size);
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
1242 gradient->setDrawsInPMColorSpace(true); 1242 gradient->setDrawsInPMColorSpace(true);
1243 1243
1244 // addStops() only uses maxExtent for repeating gradients. 1244 // addStops() only uses maxExtent for repeating gradients.
1245 float maxExtent = 0; 1245 float maxExtent = 0;
1246 if (m_repeating) { 1246 if (m_repeating) {
1247 FloatPoint corner; 1247 FloatPoint corner;
1248 maxExtent = distanceToFarthestCorner(secondPoint, size, corner); 1248 maxExtent = distanceToFarthestCorner(secondPoint, size, corner);
1249 } 1249 }
1250 1250
1251 // Now add the stops. 1251 // Now add the stops.
1252 addStops(gradient.get(), conversionData, maxExtent); 1252 addStops(gradient.get(), conversionData, maxExtent, object);
1253 1253
1254 return gradient.release(); 1254 return gradient.release();
1255 } 1255 }
1256 1256
1257 bool CSSRadialGradientValue::equals(const CSSRadialGradientValue& other) const 1257 bool CSSRadialGradientValue::equals(const CSSRadialGradientValue& other) const
1258 { 1258 {
1259 if (m_gradientType == CSSDeprecatedRadialGradient) 1259 if (m_gradientType == CSSDeprecatedRadialGradient)
1260 return other.m_gradientType == m_gradientType 1260 return other.m_gradientType == m_gradientType
1261 && compareCSSValuePtr(m_firstX, other.m_firstX) 1261 && compareCSSValuePtr(m_firstX, other.m_firstX)
1262 && compareCSSValuePtr(m_firstY, other.m_firstY) 1262 && compareCSSValuePtr(m_firstY, other.m_firstY)
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1305 visitor->trace(m_firstRadius); 1305 visitor->trace(m_firstRadius);
1306 visitor->trace(m_secondRadius); 1306 visitor->trace(m_secondRadius);
1307 visitor->trace(m_shape); 1307 visitor->trace(m_shape);
1308 visitor->trace(m_sizingBehavior); 1308 visitor->trace(m_sizingBehavior);
1309 visitor->trace(m_endHorizontalSize); 1309 visitor->trace(m_endHorizontalSize);
1310 visitor->trace(m_endVerticalSize); 1310 visitor->trace(m_endVerticalSize);
1311 CSSGradientValue::traceAfterDispatch(visitor); 1311 CSSGradientValue::traceAfterDispatch(visitor);
1312 } 1312 }
1313 1313
1314 } // namespace blink 1314 } // namespace blink
OLDNEW
« Source/core/css/CSSGradientValue.h ('K') | « Source/core/css/CSSGradientValue.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698