| /* |
| * Copyright 2018 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| // Provides tiling for the repeat or mirror modes. |
| |
| in fragmentProcessor colorizer; |
| in fragmentProcessor gradLayout; |
| |
| layout(key) in bool mirror; |
| layout(key) in bool makePremul; |
| // Trust the creator that this matches the color spec of the gradient |
| in bool colorsAreOpaque; |
| |
| void main() { |
| half4 t = sample(gradLayout); |
| |
| if (!gradLayout.preservesOpaqueInput && t.y < 0) { |
| // layout has rejected this fragment (rely on sksl to remove this branch if the layout FP |
| // preserves opacity is false) |
| sk_OutColor = half4(0); |
| } else { |
| @if(mirror) { |
| half t_1 = t.x - 1; |
| half tiled_t = t_1 - 2 * floor(t_1 * 0.5) - 1; |
| if (sk_Caps.mustDoOpBetweenFloorAndAbs) { |
| // At this point the expected value of tiled_t should between -1 and 1, so this |
| // clamp has no effect other than to break up the floor and abs calls and make sure |
| // the compiler doesn't merge them back together. |
| tiled_t = clamp(tiled_t, -1, 1); |
| } |
| t.x = abs(tiled_t); |
| } else { |
| // Simple repeat mode |
| t.x = fract(t.x); |
| } |
| |
| // t.x has been tiled (repeat or mirrored), but pass through remaining 3 components |
| // unmodified. |
| sk_OutColor = sample(colorizer, t); |
| } |
| |
| @if (makePremul) { |
| sk_OutColor.xyz *= sk_OutColor.w; |
| } |
| } |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| // If the layout does not preserve opacity, remove the opaque optimization, |
| // but otherwise respect the provided color opacity state. |
| @optimizationFlags { |
| kCompatibleWithCoverageAsAlpha_OptimizationFlag | |
| (colorsAreOpaque && gradLayout->preservesOpaqueInput() ? kPreservesOpaqueInput_OptimizationFlag |
| : kNone_OptimizationFlags) |
| } |