#include <metal_stdlib>

using namespace metal;
struct Uniforms {
  /* 0x0000 */ uint dstTextureFlipY;
  /* 0x0004 */ uint channelCount;
  /* 0x0008 */ uint2 srcCopyOrigin;
  /* 0x0010 */ uint2 dstCopyOrigin;
  /* 0x0018 */ uint2 copySize;
};
struct OutputBuf {
  /* 0x0000 */ uint result[1];
};

bool aboutEqual(float value, float expect) {
  return (fabs((value - expect)) < 0.001f);
}

void tint_symbol_inner(uint3 GlobalInvocationID, texture2d<float, access::sample> tint_symbol_1, texture2d<float, access::sample> tint_symbol_2, const constant Uniforms* const tint_symbol_3, device OutputBuf* const tint_symbol_4) {
  int2 const srcSize = int2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
  int2 const dstSize = int2(tint_symbol_2.get_width(), tint_symbol_2.get_height());
  uint2 const dstTexCoord = uint2(uint3(GlobalInvocationID).xy);
  float4 const nonCoveredColor = float4(0.0f, 1.0f, 0.0f, 1.0f);
  bool success = true;
  if (((((dstTexCoord[0] < (*(tint_symbol_3)).dstCopyOrigin[0]) || (dstTexCoord[1] < (*(tint_symbol_3)).dstCopyOrigin[1])) || (dstTexCoord[0] >= ((*(tint_symbol_3)).dstCopyOrigin[0] + (*(tint_symbol_3)).copySize[0]))) || (dstTexCoord[1] >= ((*(tint_symbol_3)).dstCopyOrigin[1] + (*(tint_symbol_3)).copySize[1])))) {
    success = (success && all((tint_symbol_2.read(uint2(int2(dstTexCoord)), 0) == nonCoveredColor)));
  } else {
    uint2 srcTexCoord = ((dstTexCoord - (*(tint_symbol_3)).dstCopyOrigin) + (*(tint_symbol_3)).srcCopyOrigin);
    if (((*(tint_symbol_3)).dstTextureFlipY == 1u)) {
      srcTexCoord[1] = ((uint(srcSize[1]) - srcTexCoord[1]) - 1u);
    }
    float4 const srcColor = tint_symbol_1.read(uint2(int2(srcTexCoord)), 0);
    float4 const dstColor = tint_symbol_2.read(uint2(int2(dstTexCoord)), 0);
    if (((*(tint_symbol_3)).channelCount == 2u)) {
      success = ((success && aboutEqual(dstColor[0], srcColor[0])) && aboutEqual(dstColor[1], srcColor[1]));
    } else {
      success = ((((success && aboutEqual(dstColor[0], srcColor[0])) && aboutEqual(dstColor[1], srcColor[1])) && aboutEqual(dstColor[2], srcColor[2])) && aboutEqual(dstColor[3], srcColor[3]));
    }
  }
  uint const outputIndex = ((GlobalInvocationID[1] * uint(dstSize[0])) + GlobalInvocationID[0]);
  if (success) {
    (*(tint_symbol_4)).result[outputIndex] = 1u;
  } else {
    (*(tint_symbol_4)).result[outputIndex] = 0u;
  }
}

kernel void tint_symbol(texture2d<float, access::sample> tint_symbol_5 [[texture(0)]], texture2d<float, access::sample> tint_symbol_6 [[texture(1)]], const constant Uniforms* tint_symbol_7 [[buffer(0)]], device OutputBuf* tint_symbol_8 [[buffer(1)]], uint3 GlobalInvocationID [[thread_position_in_grid]]) {
  tint_symbol_inner(GlobalInvocationID, tint_symbol_5, tint_symbol_6, tint_symbol_7, tint_symbol_8);
  return;
}

