cm: fix primaries to proto scale (#11914)

This commit is contained in:
UjinT34 2025-10-03 22:50:57 +03:00 committed by GitHub
parent 3bcfa94ee4
commit f0b4164e2e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -8,6 +8,8 @@
using namespace NColorManagement; using namespace NColorManagement;
const auto PRIMARIES_SCALE = 1000000.0f;
CColorManager::CColorManager(SP<CWpColorManagerV1> resource) : m_resource(resource) { CColorManager::CColorManager(SP<CWpColorManagerV1> resource) : m_resource(resource) {
if UNLIKELY (!good()) if UNLIKELY (!good())
return; return;
@ -610,10 +612,10 @@ CColorManagementParametricCreator::CColorManagementParametricCreator(SP<CWpImage
return; return;
} }
m_settings.primariesNameSet = false; m_settings.primariesNameSet = false;
m_settings.primaries = SPCPRimaries{.red = {.x = r_x / 1000000.0f, .y = r_y / 1000000.0f}, m_settings.primaries = SPCPRimaries{.red = {.x = r_x / PRIMARIES_SCALE, .y = r_y / PRIMARIES_SCALE},
.green = {.x = g_x / 1000000.0f, .y = g_y / 1000000.0f}, .green = {.x = g_x / PRIMARIES_SCALE, .y = g_y / PRIMARIES_SCALE},
.blue = {.x = b_x / 1000000.0f, .y = b_y / 1000000.0f}, .blue = {.x = b_x / PRIMARIES_SCALE, .y = b_y / PRIMARIES_SCALE},
.white = {.x = w_x / 1000000.0f, .y = w_y / 1000000.0f}}; .white = {.x = w_x / PRIMARIES_SCALE, .y = w_y / PRIMARIES_SCALE}};
m_valuesSet |= PC_PRIMARIES; m_valuesSet |= PC_PRIMARIES;
}); });
m_resource->setSetLuminances([this](CWpImageDescriptionCreatorParamsV1* r, uint32_t min_lum, uint32_t max_lum, uint32_t reference_lum) { m_resource->setSetLuminances([this](CWpImageDescriptionCreatorParamsV1* r, uint32_t min_lum, uint32_t max_lum, uint32_t reference_lum) {
@ -641,10 +643,10 @@ CColorManagementParametricCreator::CColorManagementParametricCreator(SP<CWpImage
r->error(WP_COLOR_MANAGER_V1_ERROR_UNSUPPORTED_FEATURE, "Mastering primaries are not supported"); r->error(WP_COLOR_MANAGER_V1_ERROR_UNSUPPORTED_FEATURE, "Mastering primaries are not supported");
return; return;
} }
m_settings.masteringPrimaries = SPCPRimaries{.red = {.x = r_x / 1000000.0f, .y = r_y / 1000000.0f}, m_settings.masteringPrimaries = SPCPRimaries{.red = {.x = r_x / PRIMARIES_SCALE, .y = r_y / PRIMARIES_SCALE},
.green = {.x = g_x / 1000000.0f, .y = g_y / 1000000.0f}, .green = {.x = g_x / PRIMARIES_SCALE, .y = g_y / PRIMARIES_SCALE},
.blue = {.x = b_x / 1000000.0f, .y = b_y / 1000000.0f}, .blue = {.x = b_x / PRIMARIES_SCALE, .y = b_y / PRIMARIES_SCALE},
.white = {.x = w_x / 1000000.0f, .y = w_y / 1000000.0f}}; .white = {.x = w_x / PRIMARIES_SCALE, .y = w_y / PRIMARIES_SCALE}};
m_valuesSet |= PC_MASTERING_PRIMARIES; m_valuesSet |= PC_MASTERING_PRIMARIES;
// FIXME: // FIXME:
@ -744,7 +746,7 @@ CColorManagementImageDescriptionInfo::CColorManagementImageDescriptionInfo(SP<CW
m_client = m_resource->client(); m_client = m_resource->client();
const auto toProto = [](float value) { return sc<int32_t>(std::round(value * 10000)); }; const auto toProto = [](float value) { return sc<int32_t>(std::round(value * PRIMARIES_SCALE)); };
if (m_settings.icc.fd >= 0) if (m_settings.icc.fd >= 0)
m_resource->sendIccFile(m_settings.icc.fd, m_settings.icc.length); m_resource->sendIccFile(m_settings.icc.fd, m_settings.icc.length);