#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 resolution;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  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_5, thread float4* const tint_symbol_6) {
  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_5);
  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_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 1.0f);
  }
  return;
}

fragment tint_symbol_2 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;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_15, &(tint_symbol_7), &(tint_symbol_8));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

