Home | History | Annotate | Download | only in effects
      1 /*
      2  * Copyright 2018 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 enum class InputMode {
      9     kIgnore,
     10     kModulateRGBA,
     11     kModulateA,
     12 
     13     kLast = kModulateA
     14 };
     15 
     16 layout(ctype=SkPMColor4f, tracked) in uniform half4 color;
     17 layout(key) in InputMode mode;
     18 
     19 @optimizationFlags {
     20     OptFlags(color, mode)
     21 }
     22 
     23 void main() {
     24     @switch (mode) {
     25         case InputMode::kIgnore:
     26             sk_OutColor = color;
     27             break;
     28         case InputMode::kModulateRGBA:
     29             sk_OutColor = sk_InColor * color;
     30             break;
     31         case InputMode::kModulateA:
     32             sk_OutColor = sk_InColor.a * color;
     33             break;
     34     }
     35 }
     36 
     37 @class {
     38     static const int kInputModeCnt = (int) InputMode::kLast + 1;
     39 
     40     static OptimizationFlags OptFlags(const SkPMColor4f& color, InputMode mode) {
     41         OptimizationFlags flags = kConstantOutputForConstantInput_OptimizationFlag;
     42         if (mode != InputMode::kIgnore) {
     43             flags |= kCompatibleWithCoverageAsAlpha_OptimizationFlag;
     44         }
     45         if (color.isOpaque()) {
     46             flags |= kPreservesOpaqueInput_OptimizationFlag;
     47         }
     48         return flags;
     49     }
     50 
     51     SkPMColor4f constantOutputForConstantInput(const SkPMColor4f& input) const override {
     52         switch (fMode) {
     53             case InputMode::kIgnore:
     54                 return fColor;
     55             case InputMode::kModulateA:
     56                 return fColor * input.fA;
     57             case InputMode::kModulateRGBA:
     58                 return fColor * input;
     59         }
     60         SK_ABORT("Unexpected mode");
     61         return SK_PMColor4fTRANSPARENT;
     62     }
     63 }
     64 
     65 @test(d) {
     66     SkPMColor4f color;
     67     int colorPicker = d->fRandom->nextULessThan(3);
     68     switch (colorPicker) {
     69         case 0: {
     70             uint32_t a = d->fRandom->nextULessThan(0x100);
     71             uint32_t r = d->fRandom->nextULessThan(a+1);
     72             uint32_t g = d->fRandom->nextULessThan(a+1);
     73             uint32_t b = d->fRandom->nextULessThan(a+1);
     74             color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(r, g, b, a));
     75             break;
     76         }
     77         case 1:
     78             color = SK_PMColor4fTRANSPARENT;
     79             break;
     80         case 2:
     81             uint32_t c = d->fRandom->nextULessThan(0x100);
     82             color = SkPMColor4f::FromBytes_RGBA(c | (c << 8) | (c << 16) | (c << 24));
     83             break;
     84     }
     85     InputMode mode = static_cast<InputMode>(d->fRandom->nextULessThan(kInputModeCnt));
     86     return GrConstColorProcessor::Make(color, mode);
     87 }
     88