| OLD | NEW |
| 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 14 matching lines...) Expand all Loading... |
| 25 | 25 |
| 26 #include "config.h" | 26 #include "config.h" |
| 27 #include "core/css/CSSGradientValue.h" | 27 #include "core/css/CSSGradientValue.h" |
| 28 | 28 |
| 29 #include "core/CSSValueKeywords.h" | 29 #include "core/CSSValueKeywords.h" |
| 30 #include "core/css/CSSCalculationValue.h" | 30 #include "core/css/CSSCalculationValue.h" |
| 31 #include "core/css/CSSToLengthConversionData.h" | 31 #include "core/css/CSSToLengthConversionData.h" |
| 32 #include "core/css/Pair.h" | 32 #include "core/css/Pair.h" |
| 33 #include "core/dom/NodeRenderStyle.h" | 33 #include "core/dom/NodeRenderStyle.h" |
| 34 #include "core/dom/TextLinkColors.h" | 34 #include "core/dom/TextLinkColors.h" |
| 35 #include "core/rendering/RenderObject.h" | 35 #include "core/layout/LayoutObject.h" |
| 36 #include "platform/geometry/IntSize.h" | 36 #include "platform/geometry/IntSize.h" |
| 37 #include "platform/graphics/Gradient.h" | 37 #include "platform/graphics/Gradient.h" |
| 38 #include "platform/graphics/GradientGeneratedImage.h" | 38 #include "platform/graphics/GradientGeneratedImage.h" |
| 39 #include "platform/graphics/Image.h" | 39 #include "platform/graphics/Image.h" |
| 40 #include "platform/graphics/skia/SkiaUtils.h" | 40 #include "platform/graphics/skia/SkiaUtils.h" |
| 41 #include "wtf/text/StringBuilder.h" | 41 #include "wtf/text/StringBuilder.h" |
| 42 #include "wtf/text/WTFString.h" | 42 #include "wtf/text/WTFString.h" |
| 43 | 43 |
| 44 namespace blink { | 44 namespace blink { |
| 45 | 45 |
| 46 void CSSGradientColorStop::trace(Visitor* visitor) | 46 void CSSGradientColorStop::trace(Visitor* visitor) |
| 47 { | 47 { |
| 48 visitor->trace(m_position); | 48 visitor->trace(m_position); |
| 49 visitor->trace(m_color); | 49 visitor->trace(m_color); |
| 50 } | 50 } |
| 51 | 51 |
| 52 PassRefPtr<Image> CSSGradientValue::image(RenderObject* renderer, const IntSize&
size) | 52 PassRefPtr<Image> CSSGradientValue::image(LayoutObject* renderer, const IntSize&
size) |
| 53 { | 53 { |
| 54 if (size.isEmpty()) | 54 if (size.isEmpty()) |
| 55 return nullptr; | 55 return nullptr; |
| 56 | 56 |
| 57 bool cacheable = isCacheable(); | 57 bool cacheable = isCacheable(); |
| 58 if (cacheable) { | 58 if (cacheable) { |
| 59 if (!clients().contains(renderer)) | 59 if (!clients().contains(renderer)) |
| 60 return nullptr; | 60 return nullptr; |
| 61 | 61 |
| 62 // Need to look up our size. Create a string of width*height to use as
a hash key. | 62 // Need to look up our size. Create a string of width*height to use as
a hash key. |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 newStops[y].color = blend(leftColor, rightColor, weighting); | 195 newStops[y].color = blend(leftColor, rightColor, weighting); |
| 196 } | 196 } |
| 197 | 197 |
| 198 // Replace the color hint with the new color stops. | 198 // Replace the color hint with the new color stops. |
| 199 stops.remove(x); | 199 stops.remove(x); |
| 200 stops.insert(x, newStops, 9); | 200 stops.insert(x, newStops, 9); |
| 201 indexOffset += 8; | 201 indexOffset += 8; |
| 202 } | 202 } |
| 203 } | 203 } |
| 204 | 204 |
| 205 static Color resolveStopColor(CSSPrimitiveValue* stopColor, const RenderObject&
object) | 205 static Color resolveStopColor(CSSPrimitiveValue* stopColor, const LayoutObject&
object) |
| 206 { | 206 { |
| 207 return object.document().textLinkColors().colorFromPrimitiveValue(stopColor,
object.resolveColor(CSSPropertyColor)); | 207 return object.document().textLinkColors().colorFromPrimitiveValue(stopColor,
object.resolveColor(CSSPropertyColor)); |
| 208 } | 208 } |
| 209 | 209 |
| 210 void CSSGradientValue::addStops(Gradient* gradient, const CSSToLengthConversionD
ata& conversionData, float maxLengthForRepeat, const RenderObject& object) | 210 void CSSGradientValue::addStops(Gradient* gradient, const CSSToLengthConversionD
ata& conversionData, float maxLengthForRepeat, const LayoutObject& object) |
| 211 { | 211 { |
| 212 if (m_gradientType == CSSDeprecatedLinearGradient || m_gradientType == CSSDe
precatedRadialGradient) { | 212 if (m_gradientType == CSSDeprecatedLinearGradient || m_gradientType == CSSDe
precatedRadialGradient) { |
| 213 sortStopsIfNeeded(); | 213 sortStopsIfNeeded(); |
| 214 | 214 |
| 215 for (unsigned i = 0; i < m_stops.size(); i++) { | 215 for (unsigned i = 0; i < m_stops.size(); i++) { |
| 216 const CSSGradientColorStop& stop = m_stops[i]; | 216 const CSSGradientColorStop& stop = m_stops[i]; |
| 217 | 217 |
| 218 float offset; | 218 float offset; |
| 219 if (stop.m_position->isPercentage()) | 219 if (stop.m_position->isPercentage()) |
| 220 offset = stop.m_position->getFloatValue(CSSPrimitiveValue::CSS_P
ERCENTAGE) / 100; | 220 offset = stop.m_position->getFloatValue(CSSPrimitiveValue::CSS_P
ERCENTAGE) / 100; |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 541 if (!stop.m_position) | 541 if (!stop.m_position) |
| 542 continue; | 542 continue; |
| 543 | 543 |
| 544 if (stop.m_position->isFontRelativeLength()) | 544 if (stop.m_position->isFontRelativeLength()) |
| 545 return false; | 545 return false; |
| 546 } | 546 } |
| 547 | 547 |
| 548 return true; | 548 return true; |
| 549 } | 549 } |
| 550 | 550 |
| 551 bool CSSGradientValue::knownToBeOpaque(const RenderObject* object) const | 551 bool CSSGradientValue::knownToBeOpaque(const LayoutObject* object) const |
| 552 { | 552 { |
| 553 ASSERT(object); | 553 ASSERT(object); |
| 554 for (auto& stop : m_stops) { | 554 for (auto& stop : m_stops) { |
| 555 if (!stop.isHint() && resolveStopColor(stop.m_color.get(), *object).hasA
lpha()) | 555 if (!stop.isHint() && resolveStopColor(stop.m_color.get(), *object).hasA
lpha()) |
| 556 return false; | 556 return false; |
| 557 } | 557 } |
| 558 return true; | 558 return true; |
| 559 } | 559 } |
| 560 | 560 |
| 561 void CSSGradientValue::traceAfterDispatch(Visitor* visitor) | 561 void CSSGradientValue::traceAfterDispatch(Visitor* visitor) |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 718 float endX = c / (slope - perpendicularSlope); | 718 float endX = c / (slope - perpendicularSlope); |
| 719 float endY = perpendicularSlope * endX + c; | 719 float endY = perpendicularSlope * endX + c; |
| 720 | 720 |
| 721 // We computed the end point, so set the second point, | 721 // We computed the end point, so set the second point, |
| 722 // taking into account the moved origin and the fact that we're in drawing s
pace (+y = down). | 722 // taking into account the moved origin and the fact that we're in drawing s
pace (+y = down). |
| 723 secondPoint.set(halfWidth + endX, halfHeight - endY); | 723 secondPoint.set(halfWidth + endX, halfHeight - endY); |
| 724 // Reflect around the center for the start point. | 724 // Reflect around the center for the start point. |
| 725 firstPoint.set(halfWidth - endX, halfHeight + endY); | 725 firstPoint.set(halfWidth - endX, halfHeight + endY); |
| 726 } | 726 } |
| 727 | 727 |
| 728 PassRefPtr<Gradient> CSSLinearGradientValue::createGradient(const CSSToLengthCon
versionData& conversionData, const IntSize& size, const RenderObject& object) | 728 PassRefPtr<Gradient> CSSLinearGradientValue::createGradient(const CSSToLengthCon
versionData& conversionData, const IntSize& size, const LayoutObject& object) |
| 729 { | 729 { |
| 730 ASSERT(!size.isEmpty()); | 730 ASSERT(!size.isEmpty()); |
| 731 | 731 |
| 732 FloatPoint firstPoint; | 732 FloatPoint firstPoint; |
| 733 FloatPoint secondPoint; | 733 FloatPoint secondPoint; |
| 734 if (m_angle) { | 734 if (m_angle) { |
| 735 float angle = m_angle->getFloatValue(CSSPrimitiveValue::CSS_DEG); | 735 float angle = m_angle->getFloatValue(CSSPrimitiveValue::CSS_DEG); |
| 736 endPointsFromAngle(angle, size, firstPoint, secondPoint, m_gradientType)
; | 736 endPointsFromAngle(angle, size, firstPoint, secondPoint, m_gradientType)
; |
| 737 } else { | 737 } else { |
| 738 switch (m_gradientType) { | 738 switch (m_gradientType) { |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1066 // width/height given by aspectRatio. | 1066 // width/height given by aspectRatio. |
| 1067 static inline float horizontalEllipseRadius(const FloatSize& p, float aspectRati
o) | 1067 static inline float horizontalEllipseRadius(const FloatSize& p, float aspectRati
o) |
| 1068 { | 1068 { |
| 1069 // x^2/a^2 + y^2/b^2 = 1 | 1069 // x^2/a^2 + y^2/b^2 = 1 |
| 1070 // a/b = aspectRatio, b = a/aspectRatio | 1070 // a/b = aspectRatio, b = a/aspectRatio |
| 1071 // a = sqrt(x^2 + y^2/(1/r^2)) | 1071 // a = sqrt(x^2 + y^2/(1/r^2)) |
| 1072 return sqrtf(p.width() * p.width() + (p.height() * p.height()) / (1 / (aspec
tRatio * aspectRatio))); | 1072 return sqrtf(p.width() * p.width() + (p.height() * p.height()) / (1 / (aspec
tRatio * aspectRatio))); |
| 1073 } | 1073 } |
| 1074 | 1074 |
| 1075 // FIXME: share code with the linear version | 1075 // FIXME: share code with the linear version |
| 1076 PassRefPtr<Gradient> CSSRadialGradientValue::createGradient(const CSSToLengthCon
versionData& conversionData, const IntSize& size, const RenderObject& object) | 1076 PassRefPtr<Gradient> CSSRadialGradientValue::createGradient(const CSSToLengthCon
versionData& conversionData, const IntSize& size, const LayoutObject& object) |
| 1077 { | 1077 { |
| 1078 ASSERT(!size.isEmpty()); | 1078 ASSERT(!size.isEmpty()); |
| 1079 | 1079 |
| 1080 FloatPoint firstPoint = computeEndPoint(m_firstX.get(), m_firstY.get(), conv
ersionData, size); | 1080 FloatPoint firstPoint = computeEndPoint(m_firstX.get(), m_firstY.get(), conv
ersionData, size); |
| 1081 if (!m_firstX) | 1081 if (!m_firstX) |
| 1082 firstPoint.setX(size.width() / 2); | 1082 firstPoint.setX(size.width() / 2); |
| 1083 if (!m_firstY) | 1083 if (!m_firstY) |
| 1084 firstPoint.setY(size.height() / 2); | 1084 firstPoint.setY(size.height() / 2); |
| 1085 | 1085 |
| 1086 FloatPoint secondPoint = computeEndPoint(m_secondX.get(), m_secondY.get(), c
onversionData, size); | 1086 FloatPoint secondPoint = computeEndPoint(m_secondX.get(), m_secondY.get(), c
onversionData, size); |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1266 visitor->trace(m_firstRadius); | 1266 visitor->trace(m_firstRadius); |
| 1267 visitor->trace(m_secondRadius); | 1267 visitor->trace(m_secondRadius); |
| 1268 visitor->trace(m_shape); | 1268 visitor->trace(m_shape); |
| 1269 visitor->trace(m_sizingBehavior); | 1269 visitor->trace(m_sizingBehavior); |
| 1270 visitor->trace(m_endHorizontalSize); | 1270 visitor->trace(m_endHorizontalSize); |
| 1271 visitor->trace(m_endVerticalSize); | 1271 visitor->trace(m_endVerticalSize); |
| 1272 CSSGradientValue::traceAfterDispatch(visitor); | 1272 CSSGradientValue::traceAfterDispatch(visitor); |
| 1273 } | 1273 } |
| 1274 | 1274 |
| 1275 } // namespace blink | 1275 } // namespace blink |
| OLD | NEW |