How calculate Kr and Kb from colour primaries - tonykwok/made-mistakes-again GitHub Wiki

primaries p = get_colour_primaries(primaries_idx);

float zr = 1 - (p.redX + p.redY);
float zg = 1 - (p.greenX + p.greenY);
float zb = 1 - (p.blueX + p.blueY);
float zw = 1 - (p.whiteX + p.whiteY);

float denom = p.whiteY * (p.redX * (p.greenY * zb - p.blueY * zg)
            + p.greenX * (p.blueY * zr - p.redY * zb)
            + p.blueX * (p.redY * zg - p.greenY * zr));

if (denom == 0.0f) {
    return result;
}

result.Kr = (p.redY * (p.whiteX * (p.greenY * zb - p.blueY * zg) + p.whiteY * (p.blueX * zg - p.greenX * zb) +
                           zw * (p.greenX * p.blueY - p.blueX * p.greenY))) / denom;
result.Kb = (p.blueY * (p.whiteX * (p.redY * zg - p.greenY * zr) + p.whiteY * (p.greenX * zr - p.redX * zg) +
                            zw * (p.redX * p.greenY - p.greenX * p.redY))) / denom;

https://github.com/strukturag/libheif/blob/37c5ae0d6d4b90011f2e4b25a06e93b4e29ff4b0/libheif/nclx.cc#L137