OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "SkTableColorFilter.h" | 8 #include "SkTableColorFilter.h" |
9 | 9 |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 fFlags |= kB_Flag; | 42 fFlags |= kB_Flag; |
43 } | 43 } |
44 } | 44 } |
45 | 45 |
46 virtual ~SkTable_ColorFilter() { delete fBitmap; } | 46 virtual ~SkTable_ColorFilter() { delete fBitmap; } |
47 | 47 |
48 bool asComponentTable(SkBitmap* table) const override; | 48 bool asComponentTable(SkBitmap* table) const override; |
49 sk_sp<SkColorFilter> makeComposed(sk_sp<SkColorFilter> inner) const override
; | 49 sk_sp<SkColorFilter> makeComposed(sk_sp<SkColorFilter> inner) const override
; |
50 | 50 |
51 #if SK_SUPPORT_GPU | 51 #if SK_SUPPORT_GPU |
52 const GrFragmentProcessor* asFragmentProcessor(GrContext*) const override; | 52 sk_sp<GrFragmentProcessor> asFragmentProcessor(GrContext*) const override; |
53 #endif | 53 #endif |
54 | 54 |
55 void filterSpan(const SkPMColor src[], int count, SkPMColor dst[]) const ove
rride; | 55 void filterSpan(const SkPMColor src[], int count, SkPMColor dst[]) const ove
rride; |
56 | 56 |
57 SK_TO_STRING_OVERRIDE() | 57 SK_TO_STRING_OVERRIDE() |
58 | 58 |
59 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkTable_ColorFilter) | 59 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkTable_ColorFilter) |
60 | 60 |
61 enum { | 61 enum { |
62 kA_Flag = 1 << 0, | 62 kA_Flag = 1 << 0, |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 #include "GrInvariantOutput.h" | 336 #include "GrInvariantOutput.h" |
337 #include "SkGr.h" | 337 #include "SkGr.h" |
338 #include "effects/GrTextureStripAtlas.h" | 338 #include "effects/GrTextureStripAtlas.h" |
339 #include "glsl/GrGLSLFragmentProcessor.h" | 339 #include "glsl/GrGLSLFragmentProcessor.h" |
340 #include "glsl/GrGLSLFragmentShaderBuilder.h" | 340 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
341 #include "glsl/GrGLSLProgramDataManager.h" | 341 #include "glsl/GrGLSLProgramDataManager.h" |
342 #include "glsl/GrGLSLUniformHandler.h" | 342 #include "glsl/GrGLSLUniformHandler.h" |
343 | 343 |
344 class ColorTableEffect : public GrFragmentProcessor { | 344 class ColorTableEffect : public GrFragmentProcessor { |
345 public: | 345 public: |
346 static const GrFragmentProcessor* Create(GrContext* context, SkBitmap bitmap
, unsigned flags); | 346 static sk_sp<GrFragmentProcessor> Make(GrContext* context, SkBitmap bitmap,
unsigned flags); |
347 | 347 |
348 virtual ~ColorTableEffect(); | 348 virtual ~ColorTableEffect(); |
349 | 349 |
350 const char* name() const override { return "ColorTable"; } | 350 const char* name() const override { return "ColorTable"; } |
351 | 351 |
352 const GrTextureStripAtlas* atlas() const { return fAtlas; } | 352 const GrTextureStripAtlas* atlas() const { return fAtlas; } |
353 int atlasRow() const { return fRow; } | 353 int atlasRow() const { return fRow; } |
354 | 354 |
355 private: | 355 private: |
356 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; | 356 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 | 452 |
453 fragBuilder->codeAppendf("\t\t%s.b = ", args.fOutputColor); | 453 fragBuilder->codeAppendf("\t\t%s.b = ", args.fOutputColor); |
454 coord.printf("vec2(coord.b, %s.b)", yoffsets); | 454 coord.printf("vec2(coord.b, %s.b)", yoffsets); |
455 fragBuilder->appendTextureLookup(args.fTexSamplers[0], coord.c_str()); | 455 fragBuilder->appendTextureLookup(args.fTexSamplers[0], coord.c_str()); |
456 fragBuilder->codeAppend(".a;\n"); | 456 fragBuilder->codeAppend(".a;\n"); |
457 | 457 |
458 fragBuilder->codeAppendf("\t\t%s.rgb *= %s.a;\n", args.fOutputColor, args.fO
utputColor); | 458 fragBuilder->codeAppendf("\t\t%s.rgb *= %s.a;\n", args.fOutputColor, args.fO
utputColor); |
459 } | 459 } |
460 | 460 |
461 /////////////////////////////////////////////////////////////////////////////// | 461 /////////////////////////////////////////////////////////////////////////////// |
462 const GrFragmentProcessor* ColorTableEffect::Create(GrContext* context, SkBitmap
bitmap, | 462 sk_sp<GrFragmentProcessor> ColorTableEffect::Make(GrContext* context, SkBitmap b
itmap, |
463 unsigned flags) { | 463 unsigned flags) { |
464 | 464 |
465 GrTextureStripAtlas::Desc desc; | 465 GrTextureStripAtlas::Desc desc; |
466 desc.fWidth = bitmap.width(); | 466 desc.fWidth = bitmap.width(); |
467 desc.fHeight = 128; | 467 desc.fHeight = 128; |
468 desc.fRowHeight = bitmap.height(); | 468 desc.fRowHeight = bitmap.height(); |
469 desc.fContext = context; | 469 desc.fContext = context; |
470 desc.fConfig = SkImageInfo2GrPixelConfig(bitmap.info(), *context->caps()); | 470 desc.fConfig = SkImageInfo2GrPixelConfig(bitmap.info(), *context->caps()); |
471 GrTextureStripAtlas* atlas = GrTextureStripAtlas::GetAtlas(desc); | 471 GrTextureStripAtlas* atlas = GrTextureStripAtlas::GetAtlas(desc); |
472 int row = atlas->lockRow(bitmap); | 472 int row = atlas->lockRow(bitmap); |
473 SkAutoTUnref<GrTexture> texture; | 473 SkAutoTUnref<GrTexture> texture; |
474 if (-1 == row) { | 474 if (-1 == row) { |
475 atlas = nullptr; | 475 atlas = nullptr; |
476 texture.reset(GrRefCachedBitmapTexture(context, bitmap, GrTextureParams:
:ClampNoFilter(), | 476 texture.reset(GrRefCachedBitmapTexture(context, bitmap, GrTextureParams:
:ClampNoFilter(), |
477 SkSourceGammaTreatment::kRespect)
); | 477 SkSourceGammaTreatment::kRespect)
); |
478 } else { | 478 } else { |
479 texture.reset(SkRef(atlas->getTexture())); | 479 texture.reset(SkRef(atlas->getTexture())); |
480 } | 480 } |
481 | 481 |
482 return new ColorTableEffect(texture, atlas, row, flags); | 482 return sk_sp<GrFragmentProcessor>(new ColorTableEffect(texture, atlas, row,
flags)); |
483 } | 483 } |
484 | 484 |
485 ColorTableEffect::ColorTableEffect(GrTexture* texture, GrTextureStripAtlas* atla
s, int row, | 485 ColorTableEffect::ColorTableEffect(GrTexture* texture, GrTextureStripAtlas* atla
s, int row, |
486 unsigned flags) | 486 unsigned flags) |
487 : fTextureAccess(texture) | 487 : fTextureAccess(texture) |
488 , fFlags(flags) | 488 , fFlags(flags) |
489 , fAtlas(atlas) | 489 , fAtlas(atlas) |
490 , fRow(row) { | 490 , fRow(row) { |
491 this->initClassID<ColorTableEffect>(); | 491 this->initClassID<ColorTableEffect>(); |
492 this->addTextureAccess(&fTextureAccess); | 492 this->addTextureAccess(&fTextureAccess); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 if (fFlags & SkTable_ColorFilter::kA_Flag) { | 533 if (fFlags & SkTable_ColorFilter::kA_Flag) { |
534 invalidateFlags |= kA_GrColorComponentFlag; | 534 invalidateFlags |= kA_GrColorComponentFlag; |
535 } | 535 } |
536 inout->invalidateComponents(invalidateFlags, GrInvariantOutput::kWill_ReadIn
put); | 536 inout->invalidateComponents(invalidateFlags, GrInvariantOutput::kWill_ReadIn
put); |
537 } | 537 } |
538 | 538 |
539 /////////////////////////////////////////////////////////////////////////////// | 539 /////////////////////////////////////////////////////////////////////////////// |
540 | 540 |
541 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(ColorTableEffect); | 541 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(ColorTableEffect); |
542 | 542 |
543 const GrFragmentProcessor* ColorTableEffect::TestCreate(GrProcessorTestData* d)
{ | 543 sk_sp<GrFragmentProcessor> ColorTableEffect::TestCreate(GrProcessorTestData* d)
{ |
544 int flags = 0; | 544 int flags = 0; |
545 uint8_t luts[256][4]; | 545 uint8_t luts[256][4]; |
546 do { | 546 do { |
547 for (int i = 0; i < 4; ++i) { | 547 for (int i = 0; i < 4; ++i) { |
548 flags |= d->fRandom->nextBool() ? (1 << i): 0; | 548 flags |= d->fRandom->nextBool() ? (1 << i): 0; |
549 } | 549 } |
550 } while (!flags); | 550 } while (!flags); |
551 for (int i = 0; i < 4; ++i) { | 551 for (int i = 0; i < 4; ++i) { |
552 if (flags & (1 << i)) { | 552 if (flags & (1 << i)) { |
553 for (int j = 0; j < 256; ++j) { | 553 for (int j = 0; j < 256; ++j) { |
554 luts[j][i] = SkToU8(d->fRandom->nextBits(8)); | 554 luts[j][i] = SkToU8(d->fRandom->nextBits(8)); |
555 } | 555 } |
556 } | 556 } |
557 } | 557 } |
558 auto filter(SkTableColorFilter::MakeARGB( | 558 auto filter(SkTableColorFilter::MakeARGB( |
559 (flags & (1 << 0)) ? luts[0] : nullptr, | 559 (flags & (1 << 0)) ? luts[0] : nullptr, |
560 (flags & (1 << 1)) ? luts[1] : nullptr, | 560 (flags & (1 << 1)) ? luts[1] : nullptr, |
561 (flags & (1 << 2)) ? luts[2] : nullptr, | 561 (flags & (1 << 2)) ? luts[2] : nullptr, |
562 (flags & (1 << 3)) ? luts[3] : nullptr | 562 (flags & (1 << 3)) ? luts[3] : nullptr |
563 )); | 563 )); |
564 | 564 |
565 const GrFragmentProcessor* fp = filter->asFragmentProcessor(d->fContext); | 565 sk_sp<GrFragmentProcessor> fp = filter->asFragmentProcessor(d->fContext); |
566 SkASSERT(fp); | 566 SkASSERT(fp); |
567 return fp; | 567 return fp; |
568 } | 568 } |
569 | 569 |
570 const GrFragmentProcessor* SkTable_ColorFilter::asFragmentProcessor(GrContext* c
ontext) const { | 570 sk_sp<GrFragmentProcessor> SkTable_ColorFilter::asFragmentProcessor(GrContext* c
ontext) const { |
571 SkBitmap bitmap; | 571 SkBitmap bitmap; |
572 this->asComponentTable(&bitmap); | 572 this->asComponentTable(&bitmap); |
573 | 573 |
574 return ColorTableEffect::Create(context, bitmap, fFlags); | 574 return ColorTableEffect::Make(context, bitmap, fFlags); |
575 } | 575 } |
576 | 576 |
577 #endif // SK_SUPPORT_GPU | 577 #endif // SK_SUPPORT_GPU |
578 | 578 |
579 /////////////////////////////////////////////////////////////////////////////// | 579 /////////////////////////////////////////////////////////////////////////////// |
580 | 580 |
581 #ifdef SK_CPU_BENDIAN | 581 #ifdef SK_CPU_BENDIAN |
582 #else | 582 #else |
583 #define SK_A32_INDEX (3 - (SK_A32_SHIFT >> 3)) | 583 #define SK_A32_INDEX (3 - (SK_A32_SHIFT >> 3)) |
584 #define SK_R32_INDEX (3 - (SK_R32_SHIFT >> 3)) | 584 #define SK_R32_INDEX (3 - (SK_R32_SHIFT >> 3)) |
(...skipping 10 matching lines...) Expand all Loading... |
595 sk_sp<SkColorFilter> SkTableColorFilter::MakeARGB(const uint8_t tableA[256], | 595 sk_sp<SkColorFilter> SkTableColorFilter::MakeARGB(const uint8_t tableA[256], |
596 const uint8_t tableR[256], | 596 const uint8_t tableR[256], |
597 const uint8_t tableG[256], | 597 const uint8_t tableG[256], |
598 const uint8_t tableB[256]) { | 598 const uint8_t tableB[256]) { |
599 return sk_make_sp<SkTable_ColorFilter>(tableA, tableR, tableG, tableB); | 599 return sk_make_sp<SkTable_ColorFilter>(tableA, tableR, tableG, tableB); |
600 } | 600 } |
601 | 601 |
602 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkTableColorFilter) | 602 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkTableColorFilter) |
603 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTable_ColorFilter) | 603 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTable_ColorFilter) |
604 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 604 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |