| Index: third_party/WebKit/Source/core/css/CSSGradientValue.cpp
|
| diff --git a/third_party/WebKit/Source/core/css/CSSGradientValue.cpp b/third_party/WebKit/Source/core/css/CSSGradientValue.cpp
|
| index 6f839cf9ea53f12207985d88f224222e399c004f..1803ec9c717255ae42c9efba22dac904c0fcfafd 100644
|
| --- a/third_party/WebKit/Source/core/css/CSSGradientValue.cpp
|
| +++ b/third_party/WebKit/Source/core/css/CSSGradientValue.cpp
|
| @@ -78,7 +78,8 @@ PassRefPtr<Image> CSSGradientValue::image(const LayoutObject& layoutObject,
|
| if (!clients().contains(&layoutObject))
|
| return nullptr;
|
|
|
| - // Need to look up our size. Create a string of width*height to use as a hash key.
|
| + // Need to look up our size. Create a string of width*height to use as a
|
| + // hash key.
|
| Image* result = getImage(&layoutObject, size);
|
| if (result)
|
| return result;
|
| @@ -130,14 +131,16 @@ static void replaceColorHintsWithColorStops(
|
| // color stops. The color values for the new color stops will be calculated
|
| // using the color weighting formula defined in the spec. The new color
|
| // stops will be positioned in such a way that all the pixels between the two
|
| - // user defined color stops have color values close to the interpolation curve.
|
| + // user defined color stops have color values close to the interpolation
|
| + // curve.
|
| // If the hint is closer to the left color stop, add 2 stops to the left and
|
| // 6 to the right, else add 6 stops to the left and 2 to the right.
|
| // The color stops on the side with more space start midway because
|
| // the curve approximates a line in that region.
|
| // Using this aproximation, it is possible to discern the color steps when
|
| // the gradient is large. If this becomes an issue, we can consider improving
|
| - // the algorithm, or adding support for color interpolation hints to skia shaders.
|
| + // the algorithm, or adding support for color interpolation hints to skia
|
| + // shaders.
|
|
|
| int indexOffset = 0;
|
|
|
| @@ -197,7 +200,8 @@ static void replaceColorHintsWithColorStops(
|
| }
|
|
|
| // calculate colors for the new color hints.
|
| - // The color weighting for the new color stops will be pointRelativeOffset^(ln(0.5)/ln(hintRelativeOffset)).
|
| + // The color weighting for the new color stops will be
|
| + // pointRelativeOffset^(ln(0.5)/ln(hintRelativeOffset)).
|
| float hintRelativeOffset = leftDist / totalDist;
|
| for (size_t y = 0; y < 9; ++y) {
|
| float pointRelativeOffset = (newStops[y].offset - offsetLeft) / totalDist;
|
| @@ -259,7 +263,8 @@ static bool requiresStopsNormalization(const Vector<GradientStop>& stops,
|
| return false;
|
| }
|
|
|
| -// Redistribute the stops such that they fully cover [0 , 1] and add them to the gradient.
|
| +// Redistribute the stops such that they fully cover [0 , 1] and add them to the
|
| +// gradient.
|
| static bool normalizeAndAddStops(const Vector<GradientStop>& stops,
|
| Gradient* gradient) {
|
| ASSERT(stops.size() > 1);
|
| @@ -272,10 +277,10 @@ static bool normalizeAndAddStops(const Vector<GradientStop>& stops,
|
| // All stops are coincident -> use a single clamped offset value.
|
| const float clampedOffset = std::min(std::max(firstOffset, 0.f), 1.f);
|
|
|
| - // For repeating gradients, a coincident stop set defines a solid-color image with the color
|
| - // of the last color-stop in the rule.
|
| - // For non-repeating gradients, both the first color and the last color can be significant
|
| - // (padding on both sides of the offset).
|
| + // For repeating gradients, a coincident stop set defines a solid-color
|
| + // image with the color of the last color-stop in the rule.
|
| + // For non-repeating gradients, both the first color and the last color can
|
| + // be significant (padding on both sides of the offset).
|
| if (gradient->spreadMethod() != SpreadMethodRepeat)
|
| gradient->addColorStop(clampedOffset, stops.first().color);
|
| gradient->addColorStop(clampedOffset, stops.last().color);
|
| @@ -299,7 +304,8 @@ static bool normalizeAndAddStops(const Vector<GradientStop>& stops,
|
| return true;
|
| }
|
|
|
| -// Collapse all negative-offset stops to 0 and compute an interpolated color value for that point.
|
| +// Collapse all negative-offset stops to 0 and compute an interpolated color
|
| +// value for that point.
|
| static void clampNegativeOffsets(Vector<GradientStop>& stops) {
|
| float lastNegativeOffset = 0;
|
|
|
| @@ -307,8 +313,8 @@ static void clampNegativeOffsets(Vector<GradientStop>& stops) {
|
| const float currentOffset = stops[i].offset;
|
| if (currentOffset >= 0) {
|
| if (i > 0) {
|
| - // We found the negative -> positive offset transition: compute an interpolated
|
| - // color value for 0 and use it with the last clamped stop.
|
| + // We found the negative -> positive offset transition: compute an
|
| + // interpolated color value for 0 and use it with the last clamped stop.
|
| ASSERT(lastNegativeOffset < 0);
|
| float lerpRatio =
|
| -lastNegativeOffset / (currentOffset - lastNegativeOffset);
|
| @@ -356,13 +362,14 @@ static void adjustGradientRadiiForOffsetRange(Gradient* gradient,
|
| // Unlike linear gradients (where we can adjust the points arbitrarily),
|
| // we cannot let our radii turn negative here.
|
| if (adjustedR0 < 0) {
|
| - // For the non-repeat case, this can never happen: clampNegativeOffsets() ensures we don't
|
| - // have to deal with negative offsets at this point.
|
| + // For the non-repeat case, this can never happen: clampNegativeOffsets()
|
| + // ensures we don't have to deal with negative offsets at this point.
|
| ASSERT(gradient->spreadMethod() == SpreadMethodRepeat);
|
|
|
| - // When in repeat mode, we deal with it by repositioning both radii in the positive domain -
|
| - // shifting them by a multiple of the radius span (which is the period of our repeating
|
| - // gradient -> hence no visible side effects).
|
| + // When in repeat mode, we deal with it by repositioning both radii in the
|
| + // positive domain - shifting them by a multiple of the radius span (which
|
| + // is the period of our repeating gradient -> hence no visible side
|
| + // effects).
|
| const float radiusSpan = adjustedR1 - adjustedR0;
|
| const float shiftToPositive = radiusSpan * ceilf(-adjustedR0 / radiusSpan);
|
| adjustedR0 += shiftToPositive;
|
| @@ -426,8 +433,9 @@ void CSSGradientValue::addStops(Gradient* gradient,
|
| }
|
| stops[i].specified = true;
|
| } else {
|
| - // If the first color-stop does not have a position, its position defaults to 0%.
|
| - // If the last color-stop does not have a position, its position defaults to 100%.
|
| + // If the first color-stop does not have a position, its position defaults
|
| + // to 0%. If the last color-stop does not have a position, its position
|
| + // defaults to 100%.
|
| if (!i) {
|
| stops[i].offset = 0;
|
| stops[i].specified = true;
|
| @@ -437,9 +445,9 @@ void CSSGradientValue::addStops(Gradient* gradient,
|
| }
|
| }
|
|
|
| - // If a color-stop has a position that is less than the specified position of any
|
| - // color-stop before it in the list, its position is changed to be equal to the
|
| - // largest specified position of any color-stop before it.
|
| + // If a color-stop has a position that is less than the specified position
|
| + // of any color-stop before it in the list, its position is changed to be
|
| + // equal to the largest specified position of any color-stop before it.
|
| if (stops[i].specified && i > 0) {
|
| size_t prevSpecifiedIndex;
|
| for (prevSpecifiedIndex = i - 1; prevSpecifiedIndex;
|
| @@ -455,9 +463,10 @@ void CSSGradientValue::addStops(Gradient* gradient,
|
|
|
| ASSERT(stops.first().specified && stops.last().specified);
|
|
|
| - // If any color-stop still does not have a position, then, for each run of adjacent
|
| - // color-stops without positions, set their positions so that they are evenly spaced
|
| - // between the preceding and following color-stops with positions.
|
| + // If any color-stop still does not have a position, then, for each run of
|
| + // adjacent color-stops without positions, set their positions so that they
|
| + // are evenly spaced between the preceding and following color-stops with
|
| + // positions.
|
| if (numStops > 2) {
|
| size_t unspecifiedRunStart = 0;
|
| bool inUnspecifiedRun = false;
|
| @@ -490,12 +499,12 @@ void CSSGradientValue::addStops(Gradient* gradient,
|
| replaceColorHintsWithColorStops(stops, m_stops);
|
| }
|
|
|
| - // At this point we have a fully resolved set of stops. Time to perform adjustments for
|
| - // repeat gradients and degenerate values if needed.
|
| + // At this point we have a fully resolved set of stops. Time to perform
|
| + // adjustments for repeat gradients and degenerate values if needed.
|
| if (requiresStopsNormalization(stops, gradient)) {
|
| - // Negative offsets are only an issue for non-repeating radial gradients: linear gradient
|
| - // points can be repositioned arbitrarily, and for repeating radial gradients we shift
|
| - // the radii into equivalent positive values.
|
| + // Negative offsets are only an issue for non-repeating radial gradients:
|
| + // linear gradient points can be repositioned arbitrarily, and for repeating
|
| + // radial gradients we shift the radii into equivalent positive values.
|
| if (isRadialGradientValue() && !m_repeating)
|
| clampNegativeOffsets(stops);
|
|
|
| @@ -525,8 +534,8 @@ static float positionFromValue(const CSSValue* value,
|
| int sign = 1;
|
| int edgeDistance = isHorizontal ? size.width() : size.height();
|
|
|
| - // In this case the center of the gradient is given relative to an edge in the form of:
|
| - // [ top | bottom | right | left ] [ <percentage> | <length> ].
|
| + // In this case the center of the gradient is given relative to an edge in the
|
| + // form of: [ top | bottom | right | left ] [ <percentage> | <length> ].
|
| if (value->isValuePair()) {
|
| const CSSValuePair& pair = toCSSValuePair(*value);
|
| CSSValueID originID = toCSSIdentifierValue(pair.first()).getValueID();
|
| @@ -730,13 +739,15 @@ String CSSLinearGradientValue::customCSSText() const {
|
| return result.toString();
|
| }
|
|
|
| -// Compute the endpoints so that a gradient of the given angle covers a box of the given size.
|
| +// Compute the endpoints so that a gradient of the given angle covers a box of
|
| +// the given size.
|
| static void endPointsFromAngle(float angleDeg,
|
| const IntSize& size,
|
| FloatPoint& firstPoint,
|
| FloatPoint& secondPoint,
|
| CSSGradientType type) {
|
| - // Prefixed gradients use "polar coordinate" angles, rather than "bearing" angles.
|
| + // Prefixed gradients use "polar coordinate" angles, rather than "bearing"
|
| + // angles.
|
| if (type == CSSPrefixedLinearGradient)
|
| angleDeg = 90 - angleDeg;
|
|
|
| @@ -772,8 +783,8 @@ static void endPointsFromAngle(float angleDeg,
|
| // but tan expects 0deg = E, 90deg = N.
|
| float slope = tan(deg2rad(90 - angleDeg));
|
|
|
| - // We find the endpoint by computing the intersection of the line formed by the slope,
|
| - // and a line perpendicular to it that intersects the corner.
|
| + // We find the endpoint by computing the intersection of the line formed by
|
| + // the slope, and a line perpendicular to it that intersects the corner.
|
| float perpendicularSlope = -1 / slope;
|
|
|
| // Compute start corner relative to center, in Cartesian space (+y = up).
|
| @@ -794,8 +805,8 @@ static void endPointsFromAngle(float angleDeg,
|
| float endX = c / (slope - perpendicularSlope);
|
| float endY = perpendicularSlope * endX + c;
|
|
|
| - // We computed the end point, so set the second point,
|
| - // taking into account the moved origin and the fact that we're in drawing space (+y = down).
|
| + // We computed the end point, so set the second point, taking into account the
|
| + // moved origin and the fact that we're in drawing space (+y = down).
|
| secondPoint.set(halfWidth + endX, halfHeight - endY);
|
| // Reflect around the center for the start point.
|
| firstPoint.set(halfWidth - endX, halfHeight + endY);
|
| @@ -1092,7 +1103,8 @@ namespace {
|
|
|
| enum EndShapeType { CircleEndShape, EllipseEndShape };
|
|
|
| -// Compute the radius to the closest/farthest side (depending on the compare functor).
|
| +// Compute the radius to the closest/farthest side (depending on the compare
|
| +// functor).
|
| FloatSize radiusToSide(const FloatPoint& point,
|
| const FloatSize& size,
|
| EndShapeType shape,
|
| @@ -1112,8 +1124,8 @@ FloatSize radiusToSide(const FloatPoint& point,
|
| return FloatSize(dx, dy);
|
| }
|
|
|
| -// Compute the radius of an ellipse with center at 0,0 which passes through p, and has
|
| -// width/height given by aspectRatio.
|
| +// Compute the radius of an ellipse with center at 0,0 which passes through p,
|
| +// and has width/height given by aspectRatio.
|
| inline FloatSize ellipseRadius(const FloatPoint& p, float aspectRatio) {
|
| // If the aspectRatio is 0 or infinite, the ellipse is completely flat.
|
| // TODO(sashab): Implement Degenerate Radial Gradients, see crbug.com/635727.
|
| @@ -1127,7 +1139,8 @@ inline FloatSize ellipseRadius(const FloatPoint& p, float aspectRatio) {
|
| return FloatSize(clampTo<float>(a), clampTo<float>(a / aspectRatio));
|
| }
|
|
|
| -// Compute the radius to the closest/farthest corner (depending on the compare functor).
|
| +// Compute the radius to the closest/farthest corner (depending on the compare
|
| +// functor).
|
| FloatSize radiusToCorner(const FloatPoint& point,
|
| const FloatSize& size,
|
| EndShapeType shape,
|
| @@ -1150,8 +1163,9 @@ FloatSize radiusToCorner(const FloatPoint& point,
|
| return FloatSize(distance, distance);
|
|
|
| ASSERT(shape == EllipseEndShape);
|
| - // If the end shape is an ellipse, the gradient-shape has the same ratio of width to height
|
| - // that it would if closest-side or farthest-side were specified, as appropriate.
|
| + // If the end shape is an ellipse, the gradient-shape has the same ratio of
|
| + // width to height that it would if closest-side or farthest-side were
|
| + // specified, as appropriate.
|
| const FloatSize sideRadius =
|
| radiusToSide(point, size, EllipseEndShape, compare);
|
|
|
|
|