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