1 // Copyright (c) 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "platform/graphics/GraphicsContextState.h"
10 GraphicsContextState::GraphicsContextState()
11 : m_fillColor(Color::black)
12 , m_fillRule(RULE_NONZERO)
13 , m_textDrawingMode(TextModeFill)
16 , m_compositeOperator(CompositeSourceOver)
17 , m_blendMode(blink::WebBlendModeNormal)
18 , m_interpolationQuality(InterpolationDefault)
20 , m_shouldAntialias(true)
21 , m_shouldSmoothFonts(true)
22 , m_shouldClampToSourceRect(true)
24 m_strokePaint.setStyle(SkPaint::kStroke_Style);
25 m_strokePaint.setStrokeWidth(SkFloatToScalar(m_strokeData.thickness()));
26 m_strokePaint.setColor(applyAlpha(m_strokeData.color().rgb()));
27 m_strokePaint.setStrokeCap(SkPaint::kDefault_Cap);
28 m_strokePaint.setStrokeJoin(SkPaint::kDefault_Join);
29 m_strokePaint.setStrokeMiter(SkFloatToScalar(m_strokeData.miterLimit()));
30 m_strokePaint.setFilterBitmap(m_interpolationQuality != InterpolationNone);
31 m_strokePaint.setAntiAlias(m_shouldAntialias);
32 m_fillPaint.setColor(applyAlpha(m_fillColor.rgb()));
33 m_fillPaint.setFilterBitmap(m_interpolationQuality != InterpolationNone);
34 m_fillPaint.setAntiAlias(m_shouldAntialias);
37 void GraphicsContextState::copy(GraphicsContextState* source)
39 m_strokePaint = source->m_strokePaint;
40 m_fillPaint = source->m_fillPaint;
41 m_strokeData = source->m_strokeData;
42 m_fillColor = source->m_fillColor;
43 m_fillRule = source->m_fillRule;
44 m_fillGradient = source->m_fillGradient;
45 m_fillPattern = source->m_fillPattern;
46 m_looper = source->m_looper;
47 m_textDrawingMode = source->m_textDrawingMode;
48 m_alpha = source->m_alpha;
49 m_xferMode = source->m_xferMode;
50 m_colorFilter = source->m_colorFilter;
51 m_compositeOperator = source->m_compositeOperator;
52 m_blendMode = source->m_blendMode;
53 m_interpolationQuality = source->m_interpolationQuality;
55 m_shouldAntialias = source->m_shouldAntialias;
56 m_shouldSmoothFonts = source->m_shouldSmoothFonts;
57 m_shouldClampToSourceRect = source->m_shouldClampToSourceRect;
60 const SkPaint& GraphicsContextState::strokePaint(int strokedPathLength) const
62 if (m_strokeData.gradient() && m_strokeData.gradient()->shaderChanged())
63 m_strokePaint.setShader(m_strokeData.gradient()->shader());
64 m_strokeData.setupPaintDashPathEffect(&m_strokePaint, strokedPathLength);
68 const SkPaint& GraphicsContextState::fillPaint() const
70 if (m_fillGradient && m_fillGradient->shaderChanged())
71 m_fillPaint.setShader(m_fillGradient->shader());
75 void GraphicsContextState::setStrokeStyle(StrokeStyle style)
77 m_strokeData.setStyle(style);
80 void GraphicsContextState::setStrokeThickness(float thickness)
82 m_strokeData.setThickness(thickness);
83 m_strokePaint.setStrokeWidth(SkFloatToScalar(thickness));
86 void GraphicsContextState::setStrokeColor(const Color& color)
88 m_strokeData.clearGradient();
89 m_strokeData.clearPattern();
90 m_strokeData.setColor(color);
91 m_strokePaint.setColor(applyAlpha(color.rgb()));
92 m_strokePaint.setShader(0);
95 void GraphicsContextState::setStrokeGradient(const PassRefPtr<Gradient> gradient)
97 m_strokeData.setColor(Color::black);
98 m_strokeData.clearPattern();
99 m_strokeData.setGradient(gradient);
100 m_strokePaint.setColor(applyAlpha(SK_ColorBLACK));
101 m_strokePaint.setShader(m_strokeData.gradient()->shader());
104 void GraphicsContextState::clearStrokeGradient()
106 m_strokeData.clearGradient();
107 ASSERT(!m_strokeData.pattern());
108 m_strokePaint.setColor(applyAlpha(m_strokeData.color().rgb()));
111 void GraphicsContextState::setStrokePattern(const PassRefPtr<Pattern> pattern)
113 m_strokeData.setColor(Color::black);
114 m_strokeData.clearGradient();
115 m_strokeData.setPattern(pattern);
116 m_strokePaint.setColor(applyAlpha(SK_ColorBLACK));
117 m_strokePaint.setShader(m_strokeData.pattern()->shader());
120 void GraphicsContextState::clearStrokePattern()
122 m_strokeData.clearPattern();
123 ASSERT(!m_strokeData.gradient());
124 m_strokePaint.setColor(applyAlpha(m_strokeData.color().rgb()));
127 void GraphicsContextState::setLineCap(LineCap cap)
129 m_strokeData.setLineCap(cap);
130 m_strokePaint.setStrokeCap((SkPaint::Cap)cap);
133 void GraphicsContextState::setLineJoin(LineJoin join)
135 m_strokeData.setLineJoin(join);
136 m_strokePaint.setStrokeJoin((SkPaint::Join)join);
139 void GraphicsContextState::setMiterLimit(float miterLimit)
141 m_strokeData.setMiterLimit(miterLimit);
142 m_strokePaint.setStrokeMiter(SkFloatToScalar(miterLimit));
145 void GraphicsContextState::setFillColor(const Color& color)
148 m_fillGradient.clear();
149 m_fillPattern.clear();
150 m_fillPaint.setColor(applyAlpha(color.rgb()));
151 m_fillPaint.setShader(0);
154 void GraphicsContextState::setFillGradient(const PassRefPtr<Gradient> gradient)
156 m_fillColor = Color::black;
157 m_fillPattern.clear();
158 m_fillGradient = gradient;
159 m_fillPaint.setColor(applyAlpha(SK_ColorBLACK));
160 m_fillPaint.setShader(m_fillGradient->shader());
163 void GraphicsContextState::clearFillGradient()
165 m_fillGradient.clear();
166 ASSERT(!m_fillPattern);
167 m_fillPaint.setColor(applyAlpha(m_fillColor.rgb()));
170 void GraphicsContextState::setFillPattern(const PassRefPtr<Pattern> pattern)
172 m_fillColor = Color::black;
173 m_fillGradient.clear();
174 m_fillPattern = pattern;
175 m_fillPaint.setColor(applyAlpha(SK_ColorBLACK));
176 m_fillPaint.setShader(m_fillPattern->shader());
179 void GraphicsContextState::clearFillPattern()
181 m_fillPattern.clear();
182 ASSERT(!m_fillGradient);
183 m_fillPaint.setColor(applyAlpha(m_fillColor.rgb()));
186 // Shadow. (This will need tweaking if we use draw loopers for other things.)
187 void GraphicsContextState::setDrawLooper(PassRefPtr<SkDrawLooper> drawLooper)
189 m_looper = drawLooper;
190 m_strokePaint.setLooper(m_looper.get());
191 m_fillPaint.setLooper(m_looper.get());
194 void GraphicsContextState::clearDrawLooper()
197 m_strokePaint.setLooper(0);
198 m_fillPaint.setLooper(0);
201 void GraphicsContextState::setAlphaAsFloat(float alpha)
206 m_alpha = roundf(alpha * 256);
210 m_strokePaint.setColor(applyAlpha(m_strokeData.color().rgb()));
211 m_fillPaint.setColor(applyAlpha(m_fillColor.rgb()));
214 void GraphicsContextState::setLineDash(const DashArray& dashes, float dashOffset)
216 m_strokeData.setLineDash(dashes, dashOffset);
219 void GraphicsContextState::setColorFilter(PassRefPtr<SkColorFilter> colorFilter)
221 m_colorFilter = colorFilter;
222 m_strokePaint.setColorFilter(m_colorFilter.get());
223 m_fillPaint.setColorFilter(m_colorFilter.get());
226 void GraphicsContextState::setCompositeOperation(CompositeOperator compositeOperation, blink::WebBlendMode blendMode)
228 m_compositeOperator = compositeOperation;
229 m_blendMode = blendMode;
230 m_xferMode = WebCoreCompositeToSkiaComposite(compositeOperation, blendMode);
231 m_strokePaint.setXfermode(m_xferMode.get());
232 m_fillPaint.setXfermode(m_xferMode.get());
235 void GraphicsContextState::setInterpolationQuality(InterpolationQuality quality)
237 m_interpolationQuality = quality;
238 m_strokePaint.setFilterBitmap(quality != InterpolationNone);
239 m_fillPaint.setFilterBitmap(quality != InterpolationNone);
242 void GraphicsContextState::setShouldAntialias(bool shouldAntialias)
244 m_shouldAntialias = shouldAntialias;
245 m_strokePaint.setAntiAlias(shouldAntialias);
246 m_fillPaint.setAntiAlias(shouldAntialias);
250 } // namespace WebCore