void SVGLinearGradientElement::calculateStartEndPoints(const LinearGradientAttributes& attributes, FloatPoint& startPoint, FloatPoint& endPoint) { // Determine gradient start/end points if (attributes.boundingBoxMode()) { startPoint = FloatPoint(attributes.x1().valueAsPercentage(), attributes.y1().valueAsPercentage()); endPoint = FloatPoint(attributes.x2().valueAsPercentage(), attributes.y2().valueAsPercentage()); } else { startPoint = FloatPoint(attributes.x1().value(this), attributes.y1().value(this)); endPoint = FloatPoint(attributes.x2().value(this), attributes.y2().value(this)); } }
void SVGLinearGradientElement::buildGradient() const { LinearGradientAttributes attributes = collectGradientProperties(); RefPtr<SVGPaintServerLinearGradient> linearGradient = WTF::static_pointer_cast<SVGPaintServerLinearGradient>(m_resource); FloatPoint startPoint; FloatPoint endPoint; if (attributes.boundingBoxMode()) { startPoint = FloatPoint(attributes.x1().valueAsPercentage(), attributes.y1().valueAsPercentage()); endPoint = FloatPoint(attributes.x2().valueAsPercentage(), attributes.y2().valueAsPercentage()); } else { startPoint = FloatPoint(attributes.x1().value(this), attributes.y1().value(this)); endPoint = FloatPoint(attributes.x2().value(this), attributes.y2().value(this)); } RefPtr<Gradient> gradient = Gradient::create(startPoint, endPoint); gradient->setSpreadMethod(attributes.spreadMethod()); Vector<SVGGradientStop> m_stops = attributes.stops(); float previousOffset = 0.0f; for (unsigned i = 0; i < m_stops.size(); ++i) { float offset = std::min(std::max(previousOffset, m_stops[i].first), 1.0f); previousOffset = offset; gradient->addColorStop(offset, m_stops[i].second); } linearGradient->setGradient(gradient); if (attributes.stops().isEmpty()) return; // This code should go away. PaintServers should go away too. // Only this code should care about bounding boxes linearGradient->setBoundingBoxMode(attributes.boundingBoxMode()); linearGradient->setGradientStops(attributes.stops()); // These should possibly be supported on Gradient linearGradient->setGradientTransform(attributes.gradientTransform()); linearGradient->setGradientStart(startPoint); linearGradient->setGradientEnd(endPoint); }
void SVGLinearGradientElement::buildGradient() const { LinearGradientAttributes attributes = collectGradientProperties(); // If we didn't find any gradient containing stop elements, ignore the request. if (attributes.stops().isEmpty()) return; RefPtr<SVGPaintServerLinearGradient> linearGradient = WTF::static_pointer_cast<SVGPaintServerLinearGradient>(m_resource); linearGradient->setGradientStops(attributes.stops()); linearGradient->setBoundingBoxMode(attributes.boundingBoxMode()); linearGradient->setGradientSpreadMethod(attributes.spreadMethod()); linearGradient->setGradientTransform(attributes.gradientTransform()); linearGradient->setGradientStart(FloatPoint::narrowPrecision(attributes.x1(), attributes.y1())); linearGradient->setGradientEnd(FloatPoint::narrowPrecision(attributes.x2(), attributes.y2())); }
FloatPoint LayoutSVGResourceLinearGradient::startPoint(const LinearGradientAttributes& attributes) const { return SVGLengthContext::resolvePoint(element(), attributes.gradientUnits(), *attributes.x1(), *attributes.y1()); }