#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float2 resolution;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

float cross2d_vf2_vf2_(thread float2* const a, thread float2* const b) {
  float const x_85 = (*(a)).x;
  float const x_87 = (*(b)).y;
  float const x_90 = (*(b)).x;
  float const x_92 = (*(a)).y;
  return ((x_85 * x_87) - (x_90 * x_92));
}

int pointInTriangle_vf2_vf2_vf2_vf2_(constant buf0& x_15, thread float2* const p, thread float2* const a_1, thread float2* const b_1, thread float2* const c) {
  float var_y = 0.0f;
  float x_96 = 0.0f;
  float x_97 = 0.0f;
  float clamp_y = 0.0f;
  float pab = 0.0f;
  float2 param = 0.0f;
  float2 param_1 = 0.0f;
  float pbc = 0.0f;
  float2 param_2 = 0.0f;
  float2 param_3 = 0.0f;
  float pca = 0.0f;
  float2 param_4 = 0.0f;
  float2 param_5 = 0.0f;
  bool x_173 = false;
  bool x_205 = false;
  bool x_174_phi = false;
  bool x_206_phi = false;
  float const x_99 = x_15.resolution.x;
  float const x_101 = x_15.resolution.y;
  if ((x_99 == x_101)) {
    float const x_107 = (*(c)).y;
    float2 const x_108 = float2(0.0f, x_107);
    if (true) {
      float const x_112 = (*(c)).y;
      x_97 = x_112;
    } else {
      x_97 = 1.0f;
    }
    float const x_113 = x_97;
    float const x_114 = (*(c)).y;
    float2 const x_116 = float2(1.0f, fmax(x_113, x_114));
    float2 const x_117 = float2(x_108.x, x_108.y);
    x_96 = x_107;
  } else {
    x_96 = -1.0f;
  }
  float const x_118 = x_96;
  var_y = x_118;
  float const x_120 = (*(c)).y;
  float const x_121 = (*(c)).y;
  float const x_122 = var_y;
  clamp_y = clamp(x_120, x_121, x_122);
  float const x_125 = (*(p)).x;
  float const x_127 = (*(a_1)).x;
  float const x_130 = (*(p)).y;
  float const x_132 = (*(a_1)).y;
  float const x_136 = (*(b_1)).x;
  float const x_137 = (*(a_1)).x;
  float const x_140 = (*(b_1)).y;
  float const x_141 = (*(a_1)).y;
  param = float2((x_125 - x_127), (x_130 - x_132));
  param_1 = float2((x_136 - x_137), (x_140 - x_141));
  float const x_144 = cross2d_vf2_vf2_(&(param), &(param_1));
  pab = x_144;
  float const x_145 = (*(p)).x;
  float const x_146 = (*(b_1)).x;
  float const x_148 = (*(p)).y;
  float const x_149 = (*(b_1)).y;
  float const x_153 = (*(c)).x;
  float const x_154 = (*(b_1)).x;
  float const x_156 = clamp_y;
  float const x_157 = (*(b_1)).y;
  param_2 = float2((x_145 - x_146), (x_148 - x_149));
  param_3 = float2((x_153 - x_154), (x_156 - x_157));
  float const x_160 = cross2d_vf2_vf2_(&(param_2), &(param_3));
  pbc = x_160;
  float const x_161 = pab;
  float const x_163 = pbc;
  bool const x_165 = ((x_161 < 0.0f) & (x_163 < 0.0f));
  x_174_phi = x_165;
  if (!(x_165)) {
    float const x_169 = pab;
    float const x_171 = pbc;
    x_173 = ((x_169 >= 0.0f) & (x_171 >= 0.0f));
    x_174_phi = x_173;
  }
  bool const x_174 = x_174_phi;
  if (!(x_174)) {
    return 0;
  }
  float const x_178 = (*(p)).x;
  float const x_179 = (*(c)).x;
  float const x_181 = (*(p)).y;
  float const x_182 = (*(c)).y;
  float const x_185 = (*(a_1)).x;
  float const x_186 = (*(c)).x;
  float const x_188 = (*(a_1)).y;
  float const x_189 = (*(c)).y;
  param_4 = float2((x_178 - x_179), (x_181 - x_182));
  param_5 = float2((x_185 - x_186), (x_188 - x_189));
  float const x_192 = cross2d_vf2_vf2_(&(param_4), &(param_5));
  pca = x_192;
  float const x_193 = pab;
  float const x_195 = pca;
  bool const x_197 = ((x_193 < 0.0f) & (x_195 < 0.0f));
  x_206_phi = x_197;
  if (!(x_197)) {
    float const x_201 = pab;
    float const x_203 = pca;
    x_205 = ((x_201 >= 0.0f) & (x_203 >= 0.0f));
    x_206_phi = x_205;
  }
  bool const x_206 = x_206_phi;
  if (!(x_206)) {
    return 0;
  }
  return 1;
}

void main_1(constant buf0& x_15, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  float2 pos = 0.0f;
  float2 param_6 = 0.0f;
  float2 param_7 = 0.0f;
  float2 param_8 = 0.0f;
  float2 param_9 = 0.0f;
  float4 const x_72 = *(tint_symbol_3);
  float2 const x_75 = x_15.resolution;
  pos = (float2(x_72.x, x_72.y) / x_75);
  float2 const x_77 = pos;
  param_6 = x_77;
  param_7 = float2(0.699999988f, 0.300000012f);
  param_8 = float2(0.5f, 0.899999976f);
  param_9 = float2(0.100000001f, 0.400000006f);
  int const x_78 = pointInTriangle_vf2_vf2_vf2_vf2_(x_15, &(param_6), &(param_7), &(param_8), &(param_9));
  if ((x_78 == 1)) {
    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 1.0f);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_15, float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(x_15, tint_symbol_5, tint_symbol_6);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_15 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_15, gl_FragCoord_param, &(tint_symbol_7), &(tint_symbol_8));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

