Vector<Gradient::ColorStop> SVGGradientElement::buildStops() { Vector<Gradient::ColorStop> stops; float previousOffset = 0.0f; for (Node* n = firstChild(); n; n = n->nextSibling()) { SVGElement* element = n->isSVGElement() ? static_cast<SVGElement*>(n) : 0; if (!element || !element->isGradientStop()) continue; SVGStopElement* stop = static_cast<SVGStopElement*>(element); Color color = stop->stopColorIncludingOpacity(); // Figure out right monotonic offset float offset = stop->offset(); offset = std::min(std::max(previousOffset, offset), 1.0f); previousOffset = offset; // Extract individual channel values // FIXME: Why doesn't ColorStop take a Color and an offset?? float r, g, b, a; color.getRGBA(r, g, b, a); stops.append(Gradient::ColorStop(offset, r, g, b, a)); } return stops; }
void writeSVGGradientStop(TextStream& ts, const RenderSVGGradientStop& stop, int indent) { writeStandardPrefix(ts, stop, indent); SVGStopElement* stopElement = toSVGStopElement(toSVGElement(stop.element())); ASSERT(stopElement); ts << " [offset=" << stopElement->offset() << "] [color=" << stopElement->stopColorIncludingOpacity() << "]\n"; }
void writeSVGGradientStop(TextStream& ts, const RenderSVGGradientStop& stop, int indent) { writeStandardPrefix(ts, stop, indent); SVGStopElement* stopElement = toSVGStopElement(stop.node()); ASSERT(stopElement); RenderStyle* style = stop.style(); if (!style) return; ts << " [offset=" << stopElement->offsetCurrentValue() << "] [color=" << stopElement->stopColorIncludingOpacity() << "]\n"; }
void writeSVGGradientStop(TextStream& ts, const LayoutSVGGradientStop& stop, int indent) { writeStandardPrefix(ts, stop, indent); SVGStopElement* stopElement = toSVGStopElement(stop.node()); ASSERT(stopElement); ASSERT(stop.style()); ts << " [offset=" << stopElement->offset()->currentValue()->value() << "] [color=" << stopElement->stopColorIncludingOpacity() << "]\n"; }