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

Side by Side Diff: src/effects/gradients/Sk4fGradientBase.cpp

Issue 1808963005: 4f linear gradient shader blitters (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: rename trunc_from_255 to quiet confused msvc 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
« no previous file with comments | « src/effects/gradients/Sk4fGradientBase.h ('k') | src/effects/gradients/Sk4fGradientPriv.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "Sk4fGradientBase.h" 8 #include "Sk4fGradientBase.h"
9 #include "Sk4fGradientPriv.h"
10 9
11 #include <functional> 10 #include <functional>
12 11
13 namespace { 12 namespace {
14 13
15 SkPMColor pack_color(SkColor c, bool premul) { 14 SkPMColor pack_color(SkColor c, bool premul) {
16 return premul 15 return premul
17 ? SkPreMultiplyColor(c) 16 ? SkPreMultiplyColor(c)
18 : SkPackARGB32NoCheck(SkColorGetA(c), SkColorGetR(c), SkColorGetG(c), Sk ColorGetB(c)); 17 : SkPackARGB32NoCheck(SkColorGetA(c), SkColorGetR(c), SkColorGetG(c), Sk ColorGetB(c));
19 } 18 }
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 2 - p0, 269 2 - p0,
271 pack_color(c1, fColorsArePremul), 270 pack_color(c1, fColorsArePremul),
272 2 - p1, 271 2 - p1,
273 componentScale); 272 componentScale);
274 }); 273 });
275 } 274 }
276 275
277 void SkGradientShaderBase:: 276 void SkGradientShaderBase::
278 GradientShaderBase4fContext::shadeSpan(int x, int y, SkPMColor dst[], int count) { 277 GradientShaderBase4fContext::shadeSpan(int x, int y, SkPMColor dst[], int count) {
279 if (fColorsArePremul) { 278 if (fColorsArePremul) {
280 this->shadePremulSpan<SkPMColor, false>(x, y, dst, count); 279 this->shadePremulSpan<SkPMColor, ApplyPremul::False>(x, y, dst, count);
281 } else { 280 } else {
282 this->shadePremulSpan<SkPMColor, true>(x, y, dst, count); 281 this->shadePremulSpan<SkPMColor, ApplyPremul::True>(x, y, dst, count);
283 } 282 }
284 } 283 }
285 284
286 void SkGradientShaderBase:: 285 void SkGradientShaderBase::
287 GradientShaderBase4fContext::shadeSpan4f(int x, int y, SkPM4f dst[], int count) { 286 GradientShaderBase4fContext::shadeSpan4f(int x, int y, SkPM4f dst[], int count) {
288 if (fColorsArePremul) { 287 if (fColorsArePremul) {
289 this->shadePremulSpan<SkPM4f, false>(x, y, dst, count); 288 this->shadePremulSpan<SkPM4f, ApplyPremul::False>(x, y, dst, count);
290 } else { 289 } else {
291 this->shadePremulSpan<SkPM4f, true>(x, y, dst, count); 290 this->shadePremulSpan<SkPM4f, ApplyPremul::True>(x, y, dst, count);
292 } 291 }
293 } 292 }
294 293
295 template<typename DstType, bool do_premul> 294 template<typename DstType, ApplyPremul premul>
296 void SkGradientShaderBase:: 295 void SkGradientShaderBase::
297 GradientShaderBase4fContext::shadePremulSpan(int x, int y, 296 GradientShaderBase4fContext::shadePremulSpan(int x, int y,
298 DstType dst[], 297 DstType dst[],
299 int count) const { 298 int count) const {
300 const SkGradientShaderBase& shader = 299 const SkGradientShaderBase& shader =
301 static_cast<const SkGradientShaderBase&>(fShader); 300 static_cast<const SkGradientShaderBase&>(fShader);
302 301
303 switch (shader.fTileMode) { 302 switch (shader.fTileMode) {
304 case kClamp_TileMode: 303 case kClamp_TileMode:
305 this->shadeSpanInternal<DstType, 304 this->shadeSpanInternal<DstType,
306 do_premul, 305 premul,
307 kClamp_TileMode>(x, y, dst, count); 306 kClamp_TileMode>(x, y, dst, count);
308 break; 307 break;
309 case kRepeat_TileMode: 308 case kRepeat_TileMode:
310 this->shadeSpanInternal<DstType, 309 this->shadeSpanInternal<DstType,
311 do_premul, 310 premul,
312 kRepeat_TileMode>(x, y, dst, count); 311 kRepeat_TileMode>(x, y, dst, count);
313 break; 312 break;
314 case kMirror_TileMode: 313 case kMirror_TileMode:
315 this->shadeSpanInternal<DstType, 314 this->shadeSpanInternal<DstType,
316 do_premul, 315 premul,
317 kMirror_TileMode>(x, y, dst, count); 316 kMirror_TileMode>(x, y, dst, count);
318 break; 317 break;
319 } 318 }
320 } 319 }
321 320
322 template<typename DstType, bool do_premul, SkShader::TileMode tileMode> 321 template<typename DstType, ApplyPremul premul, SkShader::TileMode tileMode>
323 void SkGradientShaderBase:: 322 void SkGradientShaderBase::
324 GradientShaderBase4fContext::shadeSpanInternal(int x, int y, 323 GradientShaderBase4fContext::shadeSpanInternal(int x, int y,
325 DstType dst[], 324 DstType dst[],
326 int count) const { 325 int count) const {
327 static const int kBufSize = 128; 326 static const int kBufSize = 128;
328 SkScalar ts[kBufSize]; 327 SkScalar ts[kBufSize];
329 TSampler<DstType, tileMode> sampler(*this); 328 TSampler<DstType, tileMode> sampler(*this);
330 329
331 SkASSERT(count > 0); 330 SkASSERT(count > 0);
332 do { 331 do {
333 const int n = SkTMin(kBufSize, count); 332 const int n = SkTMin(kBufSize, count);
334 this->mapTs(x, y, ts, n); 333 this->mapTs(x, y, ts, n);
335 for (int i = 0; i < n; ++i) { 334 for (int i = 0; i < n; ++i) {
336 const Sk4f c = sampler.sample(ts[i]); 335 const Sk4f c = sampler.sample(ts[i]);
337 store<DstType, do_premul>(c, dst++); 336 store<DstType, kLinear_SkColorProfileType, premul>(c, dst++);
338 } 337 }
339 x += n; 338 x += n;
340 count -= n; 339 count -= n;
341 } while (count > 0); 340 } while (count > 0);
342 } 341 }
343 342
344 template<typename DstType, SkShader::TileMode tileMode> 343 template<typename DstType, SkShader::TileMode tileMode>
345 class SkGradientShaderBase::GradientShaderBase4fContext::TSampler { 344 class SkGradientShaderBase::GradientShaderBase4fContext::TSampler {
346 public: 345 public:
347 TSampler(const GradientShaderBase4fContext& ctx) 346 TSampler(const GradientShaderBase4fContext& ctx)
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 if (i < fFirstInterval) { 416 if (i < fFirstInterval) {
418 i = fLastInterval; 417 i = fLastInterval;
419 } 418 }
420 } while (tiled_t < i->fP0 || tiled_t >= i->fP1); 419 } while (tiled_t < i->fP0 || tiled_t >= i->fP1);
421 } 420 }
422 421
423 return i; 422 return i;
424 } 423 }
425 424
426 void loadIntervalData(const Interval* i) { 425 void loadIntervalData(const Interval* i) {
427 fCc = dst_swizzle<DstType>(i->fC0) * dst_component_scale<DstType>(); 426 fCc = scale_for_dest<DstType, kLinear_SkColorProfileType>(dst_swizzle<Ds tType>(i->fC0));
428 fDc = dst_swizzle<DstType>(i->fDc) * dst_component_scale<DstType>(); 427 fDc = scale_for_dest<DstType, kLinear_SkColorProfileType>(dst_swizzle<Ds tType>(i->fDc));
429 } 428 }
430 429
431 const Interval* fFirstInterval; 430 const Interval* fFirstInterval;
432 const Interval* fLastInterval; 431 const Interval* fLastInterval;
433 const Interval* fInterval; 432 const Interval* fInterval;
434 SkScalar fPrevT; 433 SkScalar fPrevT;
435 Sk4f fCc; 434 Sk4f fCc;
436 Sk4f fDc; 435 Sk4f fDc;
437 }; 436 };
OLDNEW
« no previous file with comments | « src/effects/gradients/Sk4fGradientBase.h ('k') | src/effects/gradients/Sk4fGradientPriv.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698