113 switch (m_spreadMethod) {
114 case SpreadMethodRepeat:
115 case SpreadMethodReflect: {
116 FloatPoint gradientVectorNorm = data.point1 + -data.point0;
117 gradientVectorNorm.normalize();
118 CGFloat angle = acos(gradientVectorNorm.dot(FloatPoint(1, 0)));
119
120 CGAffineTransform transform = CGAffineTransformMakeRotation(-angle);
121 FloatPoint point0 = CGPointApplyAffineTransform(data.point0, transform);
122 FloatPoint point1 = CGPointApplyAffineTransform(data.point1, transform);
123
124 CGContextSaveGState(platformContext);
125 CGContextRotateCTM(platformContext, angle);
126
127 CGRect boundingBox = CGContextGetClipBoundingBox(platformContext);
128 CGFloat width = point1.x() - point0.x();
129 CGFloat pixelSize = abs(CGContextConvertSizeToUserSpace(platformContext, CGSizeMake(1, 1)).width);
130
131 if (width > 0) {
132 if (width < pixelSize)
133 width = pixelSize;
134
135 bool flip = m_spreadMethod == SpreadMethodReflect;
136 for (CGFloat end = point0.x(); end >= boundingBox.origin.x; end -= width) {
137 CGContextDrawLinearGradient(platformContext, gradient, CGPointMake(flip? end : end - width, 0), CGPointMake(flip? end - width : end, 0), 0);
138 if (m_spreadMethod == SpreadMethodReflect)
139 flip = !flip;
140 }
141 flip = false;
142 for (CGFloat start = point0.x(); start <= boundingBox.origin.x + boundingBox.size.width; start += width) {
143 CGContextDrawLinearGradient(platformContext, gradient, CGPointMake(flip? start + width : start, 0), CGPointMake(flip? start : start + width, 0), 0);
144 if (m_spreadMethod == SpreadMethodReflect)
145 flip = !flip;
146 }
147
148 CGContextRestoreGState(platformContext);
149 break;
150 }
151
152 CGContextRestoreGState(platformContext);
153 U_FALLTHROUGH;
154 }
155 case SpreadMethodPad:
156 CGContextDrawLinearGradient(platformContext, gradient, data.point0, data.point1, extendOptions);
157 }