//
// Copyright 2012 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

sampler2D tex : s0;

uniform float4 mult : c0;
uniform float4 add  : c1;

// Passthrough Pixel Shader
// Outputs texture 0 sampled at texcoord 0.
float4 passthroughps(float4 texcoord : TEXCOORD0) : COLOR
{
    return tex2D(tex, texcoord.xy);
};

// Luminance Conversion Pixel Shader
// Performs a mad operation using the LA data from the texture with mult.xw and add.xw.
// Returns data in the form of llla
float4 luminanceps(float4 texcoord : TEXCOORD0) : COLOR
{
    return (tex2D(tex, texcoord.xy).xw * mult.xw + add.xw).xxxy;
};

float4 luminancepremultps(float4 texcoord : TEXCOORD0) : COLOR
{
    float4 luma = tex2D(tex, texcoord.xy).xxxw;
    luma.rgb *= luma.a;
    return luma * mult + add;
};

float4 luminanceunmultps(float4 texcoord : TEXCOORD0) : COLOR
{
    float4 luma = tex2D(tex, texcoord.xy).xxxw;
    if (luma.a > 0.0f)
    {
        luma.rgb /= luma.a;
    }
    return luma * mult + add;
};

// RGB/A Component Mask Pixel Shader
// Performs a mad operation using the texture's RGBA data with mult.xyzw and add.xyzw.
// Returns data in the form of rgba
float4 componentmaskps(float4 texcoord : TEXCOORD0) : COLOR
{
    return tex2D(tex, texcoord.xy) * mult + add;
};

float4 componentmaskpremultps(float4 texcoord : TEXCOORD0) : COLOR
{
    float4 color = tex2D(tex, texcoord.xy);
    color.rgb *= color.a;
    return color * mult + add;
};

float4 componentmaskunmultps(float4 texcoord : TEXCOORD0) : COLOR
{
    float4 color =  tex2D(tex, texcoord.xy);
    if (color.a > 0.0f)
    {
        color.rgb /= color.a;
    }
    return color * mult + add;
};
