#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_7, texture2d<float, access::sample> tint_symbol_8, const constant Uniforms* const tint_symbol_9, device OutputBuf* const tint_symbol_10) {
  int2 const srcSize = int2(tint_symbol_7.get_width(), tint_symbol_7.get_height());
  int2 const dstSize = int2(tint_symbol_8.get_width(), tint_symbol_8.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_9)).dstCopyOrigin[0]) || (dstTexCoord[1] < (*(tint_symbol_9)).dstCopyOrigin[1])) || (dstTexCoord[0] >= ((*(tint_symbol_9)).dstCopyOrigin[0] + (*(tint_symbol_9)).copySize[0]))) || (dstTexCoord[1] >= ((*(tint_symbol_9)).dstCopyOrigin[1] + (*(tint_symbol_9)).copySize[1])))) {
    success = (success && all((tint_symbol_8.read(uint2(int2(dstTexCoord)), 0) == nonCoveredColor)));
  } else {
    uint2 srcTexCoord = ((dstTexCoord - (*(tint_symbol_9)).dstCopyOrigin) + (*(tint_symbol_9)).srcCopyOrigin);
    if (((*(tint_symbol_9)).dstTextureFlipY == 1u)) {
      srcTexCoord[1] = ((uint(srcSize[1]) - srcTexCoord[1]) - 1u);
    }
    float4 const srcColor = tint_symbol_7.read(uint2(int2(srcTexCoord)), 0);
    float4 const dstColor = tint_symbol_8.read(uint2(int2(dstTexCoord)), 0);
    if (((*(tint_symbol_9)).channelCount == 2u)) {
      bool tint_symbol_2 = success;
      if (tint_symbol_2) {
        tint_symbol_2 = aboutEqual(dstColor[0], srcColor[0]);
      }
      bool tint_symbol_1 = tint_symbol_2;
      if (tint_symbol_1) {
        tint_symbol_1 = aboutEqual(dstColor[1], srcColor[1]);
      }
      success = tint_symbol_1;
    } else {
      bool tint_symbol_6 = success;
      if (tint_symbol_6) {
        tint_symbol_6 = aboutEqual(dstColor[0], srcColor[0]);
      }
      bool tint_symbol_5 = tint_symbol_6;
      if (tint_symbol_5) {
        tint_symbol_5 = aboutEqual(dstColor[1], srcColor[1]);
      }
      bool tint_symbol_4 = tint_symbol_5;
      if (tint_symbol_4) {
        tint_symbol_4 = aboutEqual(dstColor[2], srcColor[2]);
      }
      bool tint_symbol_3 = tint_symbol_4;
      if (tint_symbol_3) {
        tint_symbol_3 = aboutEqual(dstColor[3], srcColor[3]);
      }
      success = tint_symbol_3;
    }
  }
  uint const outputIndex = ((GlobalInvocationID[1] * uint(dstSize[0])) + GlobalInvocationID[0]);
  if (success) {
    (*(tint_symbol_10)).result[outputIndex] = 1u;
  } else {
    (*(tint_symbol_10)).result[outputIndex] = 0u;
  }
}

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

