Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(92)

Side by Side Diff: third_party/WebKit/Source/platform/graphics/Gradient.cpp

Issue 1779833002: Switch Blink SkShader clients to sk_sp (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase after MakePictureShader constness change Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved.
3 * Copyright (C) 2007 Alp Toker <alp@atoker.com> 3 * Copyright (C) 2007 Alp Toker <alp@atoker.com>
4 * Copyright (C) 2013 Google Inc. All rights reserved. 4 * Copyright (C) 2013 Google Inc. All rights reserved.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 77
78 void Gradient::addColorStop(const Gradient::ColorStop& stop) 78 void Gradient::addColorStop(const Gradient::ColorStop& stop)
79 { 79 {
80 if (m_stops.isEmpty()) { 80 if (m_stops.isEmpty()) {
81 m_stopsSorted = true; 81 m_stopsSorted = true;
82 } else { 82 } else {
83 m_stopsSorted = m_stopsSorted && compareStops(m_stops.last(), stop); 83 m_stopsSorted = m_stopsSorted && compareStops(m_stops.last(), stop);
84 } 84 }
85 85
86 m_stops.append(stop); 86 m_stops.append(stop);
87 m_gradient.clear(); 87 m_gradient.reset();
88 } 88 }
89 89
90 void Gradient::sortStopsIfNecessary() 90 void Gradient::sortStopsIfNecessary()
91 { 91 {
92 if (m_stopsSorted) 92 if (m_stopsSorted)
93 return; 93 return;
94 94
95 m_stopsSorted = true; 95 m_stopsSorted = true;
96 96
97 if (!m_stops.size()) 97 if (!m_stops.size())
(...skipping 12 matching lines...) Expand all
110 110
111 m_spreadMethod = spreadMethod; 111 m_spreadMethod = spreadMethod;
112 } 112 }
113 113
114 void Gradient::setDrawsInPMColorSpace(bool drawInPMColorSpace) 114 void Gradient::setDrawsInPMColorSpace(bool drawInPMColorSpace)
115 { 115 {
116 if (drawInPMColorSpace == m_drawInPMColorSpace) 116 if (drawInPMColorSpace == m_drawInPMColorSpace)
117 return; 117 return;
118 118
119 m_drawInPMColorSpace = drawInPMColorSpace; 119 m_drawInPMColorSpace = drawInPMColorSpace;
120 m_gradient.clear(); 120 m_gradient.reset();
121 } 121 }
122 122
123 void Gradient::setGradientSpaceTransform(const AffineTransform& gradientSpaceTra nsformation) 123 void Gradient::setGradientSpaceTransform(const AffineTransform& gradientSpaceTra nsformation)
124 { 124 {
125 if (m_gradientSpaceTransformation == gradientSpaceTransformation) 125 if (m_gradientSpaceTransformation == gradientSpaceTransformation)
126 return; 126 return;
127 127
128 m_gradientSpaceTransformation = gradientSpaceTransformation; 128 m_gradientSpaceTransformation = gradientSpaceTransformation;
129 m_gradient.clear(); 129 m_gradient.reset();
130 } 130 }
131 131
132 // Determine the total number of stops needed, including pseudo-stops at the 132 // Determine the total number of stops needed, including pseudo-stops at the
133 // ends as necessary. 133 // ends as necessary.
134 static size_t totalStopsNeeded(const Gradient::ColorStop* stopData, size_t count ) 134 static size_t totalStopsNeeded(const Gradient::ColorStop* stopData, size_t count )
135 { 135 {
136 // N.B.: The tests in this function should kept in sync with the ones in 136 // N.B.: The tests in this function should kept in sync with the ones in
137 // fillStops(), or badness happens. 137 // fillStops(), or badness happens.
138 const Gradient::ColorStop* stop = stopData; 138 const Gradient::ColorStop* stop = stopData;
139 size_t countUsed = count; 139 size_t countUsed = count;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 } 182 }
183 183
184 // Copy the last stop to 1.0 if needed. See comment above about this float 184 // Copy the last stop to 1.0 if needed. See comment above about this float
185 // comparison. 185 // comparison.
186 if (count < 1 || (--stop)->stop < 1.0) { 186 if (count < 1 || (--stop)->stop < 1.0) {
187 pos[start + count] = WebCoreFloatToSkScalar(1.0); 187 pos[start + count] = WebCoreFloatToSkScalar(1.0);
188 colors[start + count] = colors[start + count - 1]; 188 colors[start + count] = colors[start + count - 1];
189 } 189 }
190 } 190 }
191 191
192 SkShader* Gradient::shader() 192 sk_sp<SkShader> Gradient::shader()
193 { 193 {
194 if (m_gradient) 194 if (m_gradient)
195 return m_gradient.get(); 195 return m_gradient;
196 196
197 sortStopsIfNecessary(); 197 sortStopsIfNecessary();
198 ASSERT(m_stopsSorted); 198 ASSERT(m_stopsSorted);
199 199
200 size_t countUsed = totalStopsNeeded(m_stops.data(), m_stops.size()); 200 size_t countUsed = totalStopsNeeded(m_stops.data(), m_stops.size());
201 ASSERT(countUsed >= 2); 201 ASSERT(countUsed >= 2);
202 ASSERT(countUsed >= m_stops.size()); 202 ASSERT(countUsed >= m_stops.size());
203 203
204 ColorStopOffsetVector pos(countUsed); 204 ColorStopOffsetVector pos(countUsed);
205 ColorStopColorVector colors(countUsed); 205 ColorStopColorVector colors(countUsed);
(...skipping 20 matching lines...) Expand all
226 m_gradientSpaceTransformation.translate(m_p0.x(), m_p0.y()); 226 m_gradientSpaceTransformation.translate(m_p0.x(), m_p0.y());
227 m_gradientSpaceTransformation.scale(1, 1 / aspectRatio()); 227 m_gradientSpaceTransformation.scale(1, 1 / aspectRatio());
228 m_gradientSpaceTransformation.translate(-m_p0.x(), -m_p0.y()); 228 m_gradientSpaceTransformation.translate(-m_p0.x(), -m_p0.y());
229 ASSERT(m_p0 == m_p1); 229 ASSERT(m_p0 == m_p1);
230 } 230 }
231 SkMatrix localMatrix = affineTransformToSkMatrix(m_gradientSpaceTransfor mation); 231 SkMatrix localMatrix = affineTransformToSkMatrix(m_gradientSpaceTransfor mation);
232 232
233 // Since the two-point radial gradient is slower than the plain radial, 233 // Since the two-point radial gradient is slower than the plain radial,
234 // only use it if we have to. 234 // only use it if we have to.
235 if (m_p0 == m_p1 && m_r0 <= 0.0f) { 235 if (m_p0 == m_p1 && m_r0 <= 0.0f) {
236 m_gradient = adoptRef(SkGradientShader::CreateRadial(m_p1.data(), m_ r1, colors.data(), pos.data(), static_cast<int>(countUsed), tile, shouldDrawInPM ColorSpace, &localMatrix)); 236 m_gradient = SkGradientShader::MakeRadial(m_p1.data(), m_r1, colors. data(), pos.data(), static_cast<int>(countUsed), tile, shouldDrawInPMColorSpace, &localMatrix);
237 } else { 237 } else {
238 // The radii we give to Skia must be positive. If we're given a 238 // The radii we give to Skia must be positive. If we're given a
239 // negative radius, ask for zero instead. 239 // negative radius, ask for zero instead.
240 SkScalar radius0 = m_r0 >= 0.0f ? WebCoreFloatToSkScalar(m_r0) : 0; 240 SkScalar radius0 = m_r0 >= 0.0f ? WebCoreFloatToSkScalar(m_r0) : 0;
241 SkScalar radius1 = m_r1 >= 0.0f ? WebCoreFloatToSkScalar(m_r1) : 0; 241 SkScalar radius1 = m_r1 >= 0.0f ? WebCoreFloatToSkScalar(m_r1) : 0;
242 m_gradient = adoptRef(SkGradientShader::CreateTwoPointConical(m_p0.d ata(), radius0, m_p1.data(), radius1, colors.data(), pos.data(), static_cast<int >(countUsed), tile, shouldDrawInPMColorSpace, &localMatrix)); 242 m_gradient = SkGradientShader::MakeTwoPointConical(m_p0.data(), radi us0, m_p1.data(), radius1, colors.data(), pos.data(), static_cast<int>(countUsed ), tile, shouldDrawInPMColorSpace, &localMatrix);
243 } 243 }
244 } else { 244 } else {
245 SkPoint pts[2] = { m_p0.data(), m_p1.data() }; 245 SkPoint pts[2] = { m_p0.data(), m_p1.data() };
246 SkMatrix localMatrix = affineTransformToSkMatrix(m_gradientSpaceTransfor mation); 246 SkMatrix localMatrix = affineTransformToSkMatrix(m_gradientSpaceTransfor mation);
247 m_gradient = adoptRef(SkGradientShader::CreateLinear(pts, colors.data(), pos.data(), static_cast<int>(countUsed), tile, shouldDrawInPMColorSpace, &local Matrix)); 247 m_gradient = SkGradientShader::MakeLinear(pts, colors.data(), pos.data() , static_cast<int>(countUsed), tile, shouldDrawInPMColorSpace, &localMatrix);
248 } 248 }
249 249
250 if (!m_gradient) { 250 if (!m_gradient) {
251 // use last color, since our "geometry" was degenerate (e.g. radius==0) 251 // use last color, since our "geometry" was degenerate (e.g. radius==0)
252 m_gradient = adoptRef(SkShader::CreateColorShader(colors[countUsed - 1]) ); 252 m_gradient = SkShader::MakeColorShader(colors[countUsed - 1]);
253 } 253 }
254 return m_gradient.get(); 254 return m_gradient;
255 } 255 }
256 256
257 void Gradient::applyToPaint(SkPaint& paint) 257 void Gradient::applyToPaint(SkPaint& paint)
258 { 258 {
259 paint.setShader(shader()); 259 paint.setShader(shader());
260 260
261 // Legacy behavior: gradients are always dithered. 261 // Legacy behavior: gradients are always dithered.
262 paint.setDither(true); 262 paint.setDither(true);
263 } 263 }
264 } // namespace blink 264 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698