in src/common/surface.c [729:803]
static int __guac_common_surface_transfer_int(guac_transfer_function op, uint32_t* src, uint32_t* dst) {
uint32_t orig = *dst;
switch (op) {
case GUAC_TRANSFER_BINARY_BLACK:
*dst = 0xFF000000;
break;
case GUAC_TRANSFER_BINARY_WHITE:
*dst = 0xFFFFFFFF;
break;
case GUAC_TRANSFER_BINARY_SRC:
*dst = *src;
break;
case GUAC_TRANSFER_BINARY_DEST:
/* NOP */
break;
case GUAC_TRANSFER_BINARY_NSRC:
*dst = *src ^ 0x00FFFFFF;
break;
case GUAC_TRANSFER_BINARY_NDEST:
*dst = *dst ^ 0x00FFFFFF;
break;
case GUAC_TRANSFER_BINARY_AND:
*dst = ((*dst) & (0xFF000000 | *src));
break;
case GUAC_TRANSFER_BINARY_NAND:
*dst = ((*dst) & (0xFF000000 | *src)) ^ 0x00FFFFFF;
break;
case GUAC_TRANSFER_BINARY_OR:
*dst = ((*dst) | (0x00FFFFFF & *src));
break;
case GUAC_TRANSFER_BINARY_NOR:
*dst = ((*dst) | (0x00FFFFFF & *src)) ^ 0x00FFFFFF;
break;
case GUAC_TRANSFER_BINARY_XOR:
*dst = ((*dst) ^ (0x00FFFFFF & *src));
break;
case GUAC_TRANSFER_BINARY_XNOR:
*dst = ((*dst) ^ (0x00FFFFFF & *src)) ^ 0x00FFFFFF;
break;
case GUAC_TRANSFER_BINARY_NSRC_AND:
*dst = ((*dst) & (0xFF000000 | (*src ^ 0x00FFFFFF)));
break;
case GUAC_TRANSFER_BINARY_NSRC_NAND:
*dst = ((*dst) & (0xFF000000 | (*src ^ 0x00FFFFFF))) ^ 0x00FFFFFF;
break;
case GUAC_TRANSFER_BINARY_NSRC_OR:
*dst = ((*dst) | (0x00FFFFFF & (*src ^ 0x00FFFFFF)));
break;
case GUAC_TRANSFER_BINARY_NSRC_NOR:
*dst = ((*dst) | (0x00FFFFFF & (*src ^ 0x00FFFFFF))) ^ 0x00FFFFFF;
break;
}
return *dst != orig;
}