/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
precision mediump float;
uniform sampler2D u_Texture;
uniform vec2 u_Scale;
varying vec2 v_TexCoordinate;
void main() {
  float weights[11];
  weights[0] = 0.047748641153356156;
  weights[1] = 0.05979670798364139;
  weights[2] = 0.07123260215138659;
  weights[3] = 0.08071711293576822;
  weights[4] = 0.08700369673862933;
  weights[5] = 0.08920620580763855;
  weights[6] = 0.08700369673862933;
  weights[7] = 0.08071711293576822;
  weights[8] = 0.07123260215138659;
  weights[9] = 0.05979670798364139;
  weights[10] = 0.047748641153356156;
  vec4 color = vec4(0.0, 0.0, 0.0, 0.0);
  for (int i = 0; i < 11; i++) {
    vec2 coords = v_TexCoordinate.xy + ((float(i) - 5.0) * u_Scale);
    color += texture2D(u_Texture, coords) * weights[i];
  }
  gl_FragColor = color;
}