Upstream version 6.35.121.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / platform / graphics / GraphicsContextState.cpp
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.
4
5 #include "config.h"
6 #include "platform/graphics/GraphicsContextState.h"
7
8 namespace WebCore {
9
10 GraphicsContextState::GraphicsContextState()
11     : m_fillColor(Color::black)
12     , m_fillRule(RULE_NONZERO)
13     , m_textDrawingMode(TextModeFill)
14     , m_alpha(256)
15     , m_xferMode(nullptr)
16     , m_compositeOperator(CompositeSourceOver)
17     , m_blendMode(blink::WebBlendModeNormal)
18     , m_interpolationQuality(InterpolationDefault)
19     , m_saveCount(0)
20     , m_shouldAntialias(true)
21     , m_shouldSmoothFonts(true)
22     , m_shouldClampToSourceRect(true)
23 {
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);
35 }
36
37 void GraphicsContextState::copy(GraphicsContextState* source)
38 {
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;
54     m_saveCount = 0;
55     m_shouldAntialias = source->m_shouldAntialias;
56     m_shouldSmoothFonts = source->m_shouldSmoothFonts;
57     m_shouldClampToSourceRect = source->m_shouldClampToSourceRect;
58 }
59
60 const SkPaint& GraphicsContextState::strokePaint(int strokedPathLength) const
61 {
62     if (m_strokeData.gradient() && m_strokeData.gradient()->shaderChanged())
63         m_strokePaint.setShader(m_strokeData.gradient()->shader());
64     m_strokeData.setupPaintDashPathEffect(&m_strokePaint, strokedPathLength);
65     return m_strokePaint;
66 }
67
68 const SkPaint& GraphicsContextState::fillPaint() const
69 {
70     if (m_fillGradient && m_fillGradient->shaderChanged())
71         m_fillPaint.setShader(m_fillGradient->shader());
72     return m_fillPaint;
73 }
74
75 void GraphicsContextState::setStrokeStyle(StrokeStyle style)
76 {
77     m_strokeData.setStyle(style);
78 }
79
80 void GraphicsContextState::setStrokeThickness(float thickness)
81 {
82     m_strokeData.setThickness(thickness);
83     m_strokePaint.setStrokeWidth(SkFloatToScalar(thickness));
84 }
85
86 void GraphicsContextState::setStrokeColor(const Color& color)
87 {
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);
93 }
94
95 void GraphicsContextState::setStrokeGradient(const PassRefPtr<Gradient> gradient)
96 {
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());
102 }
103
104 void GraphicsContextState::clearStrokeGradient()
105 {
106     m_strokeData.clearGradient();
107     ASSERT(!m_strokeData.pattern());
108     m_strokePaint.setColor(applyAlpha(m_strokeData.color().rgb()));
109 }
110
111 void GraphicsContextState::setStrokePattern(const PassRefPtr<Pattern> pattern)
112 {
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());
118 }
119
120 void GraphicsContextState::clearStrokePattern()
121 {
122     m_strokeData.clearPattern();
123     ASSERT(!m_strokeData.gradient());
124     m_strokePaint.setColor(applyAlpha(m_strokeData.color().rgb()));
125 }
126
127 void GraphicsContextState::setLineCap(LineCap cap)
128 {
129     m_strokeData.setLineCap(cap);
130     m_strokePaint.setStrokeCap((SkPaint::Cap)cap);
131 }
132
133 void GraphicsContextState::setLineJoin(LineJoin join)
134 {
135     m_strokeData.setLineJoin(join);
136     m_strokePaint.setStrokeJoin((SkPaint::Join)join);
137 }
138
139 void GraphicsContextState::setMiterLimit(float miterLimit)
140 {
141     m_strokeData.setMiterLimit(miterLimit);
142     m_strokePaint.setStrokeMiter(SkFloatToScalar(miterLimit));
143 }
144
145 void GraphicsContextState::setFillColor(const Color& color)
146 {
147     m_fillColor = color;
148     m_fillGradient.clear();
149     m_fillPattern.clear();
150     m_fillPaint.setColor(applyAlpha(color.rgb()));
151     m_fillPaint.setShader(0);
152 }
153
154 void GraphicsContextState::setFillGradient(const PassRefPtr<Gradient> gradient)
155 {
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());
161 }
162
163 void GraphicsContextState::clearFillGradient()
164 {
165     m_fillGradient.clear();
166     ASSERT(!m_fillPattern);
167     m_fillPaint.setColor(applyAlpha(m_fillColor.rgb()));
168 }
169
170 void GraphicsContextState::setFillPattern(const PassRefPtr<Pattern> pattern)
171 {
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());
177 }
178
179 void GraphicsContextState::clearFillPattern()
180 {
181     m_fillPattern.clear();
182     ASSERT(!m_fillGradient);
183     m_fillPaint.setColor(applyAlpha(m_fillColor.rgb()));
184 }
185
186 // Shadow. (This will need tweaking if we use draw loopers for other things.)
187 void GraphicsContextState::setDrawLooper(PassRefPtr<SkDrawLooper> drawLooper)
188 {
189     m_looper = drawLooper;
190     m_strokePaint.setLooper(m_looper.get());
191     m_fillPaint.setLooper(m_looper.get());
192 }
193
194 void GraphicsContextState::clearDrawLooper()
195 {
196     m_looper.clear();
197     m_strokePaint.setLooper(0);
198     m_fillPaint.setLooper(0);
199 }
200
201 void GraphicsContextState::setAlphaAsFloat(float alpha)
202 {
203     if (alpha < 0) {
204         m_alpha = 0;
205     } else {
206         m_alpha = roundf(alpha * 256);
207         if (m_alpha > 256)
208             m_alpha = 256;
209     }
210     m_strokePaint.setColor(applyAlpha(m_strokeData.color().rgb()));
211     m_fillPaint.setColor(applyAlpha(m_fillColor.rgb()));
212 }
213
214 void GraphicsContextState::setLineDash(const DashArray& dashes, float dashOffset)
215 {
216     m_strokeData.setLineDash(dashes, dashOffset);
217 }
218
219 void GraphicsContextState::setColorFilter(PassRefPtr<SkColorFilter> colorFilter)
220 {
221     m_colorFilter = colorFilter;
222     m_strokePaint.setColorFilter(m_colorFilter.get());
223     m_fillPaint.setColorFilter(m_colorFilter.get());
224 }
225
226 void GraphicsContextState::setCompositeOperation(CompositeOperator compositeOperation, blink::WebBlendMode blendMode)
227 {
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());
233 }
234
235 void GraphicsContextState::setInterpolationQuality(InterpolationQuality quality)
236 {
237     m_interpolationQuality = quality;
238     m_strokePaint.setFilterBitmap(quality != InterpolationNone);
239     m_fillPaint.setFilterBitmap(quality != InterpolationNone);
240 }
241
242 void GraphicsContextState::setShouldAntialias(bool shouldAntialias)
243 {
244     m_shouldAntialias = shouldAntialias;
245     m_strokePaint.setAntiAlias(shouldAntialias);
246     m_fillPaint.setAntiAlias(shouldAntialias);
247 }
248
249
250 } // namespace WebCore