/* * 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) }