blob: 47280649ddfb2eca22adfc0b7b0183eca441263e [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <impeller/color.glsl>
#include <impeller/texture.glsl>
// A color filter that transforms colors through a 4x5 color matrix.
//
// This filter can be used to change the saturation of pixels, convert from YUV to RGB, etc.
//
// 4x5 matrix for transforming the color and alpha components of a Bitmap.
// The matrix can be passed as single array, and is treated as follows:
//
// [ a, b, c, d, e,
// f, g, h, i, j,
// k, l, m, n, o,
// p, q, r, s, t ]
//
// When applied to a color [R, G, B, A], the resulting color is computed as:
//
// R’ = a*R + b*G + c*B + d*A + e;
// G’ = f*R + g*G + h*B + i*A + j;
// B’ = k*R + l*G + m*B + n*A + o;
// A’ = p*R + q*G + r*B + s*A + t;
//
// That resulting color [R’, G’, B’, A’] then has each channel clamped to the 0 to 255 range.
uniform FragInfo {
mat4 color_m;
vec4 color_v;
float texture_sampler_y_coord_scale;
} frag_info;
uniform sampler2D input_texture;
in vec2 v_position;
out vec4 frag_color;
void main() {
vec4 input_color = IPSample(input_texture, v_position,
frag_info.texture_sampler_y_coord_scale);
// unpremultiply first, as filter inputs are premultiplied.
vec4 color = IPUnpremultiply(input_color);
color = frag_info.color_m * color + frag_info.color_v;
// premultiply the outputs
frag_color = vec4(color.rgb * color.a, color.a);
}