// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the Chromium LICENSE file. #include "qcmsint.h" #include typedef struct _qcms_coords { float x; float y; } qcms_coords; typedef struct _qcms_triangle { qcms_coords verticies[3]; } qcms_triangle; #define NTSC_1953_GAMUT_SIZE 0.1582 static qcms_triangle get_profile_triangle(qcms_profile *profile) { float sumRed = s15Fixed16Number_to_float(profile->redColorant.X) + s15Fixed16Number_to_float(profile->redColorant.Y) + s15Fixed16Number_to_float(profile->redColorant.Z); float xRed = s15Fixed16Number_to_float(profile->redColorant.X) / sumRed; float yRed = s15Fixed16Number_to_float(profile->redColorant.Y) / sumRed; float sumGreen = s15Fixed16Number_to_float(profile->greenColorant.X) + s15Fixed16Number_to_float(profile->greenColorant.Y) + s15Fixed16Number_to_float(profile->greenColorant.Z); float xGreen = s15Fixed16Number_to_float(profile->greenColorant.X) / sumGreen; float yGreen = s15Fixed16Number_to_float(profile->greenColorant.Y) / sumGreen; float sumBlue = s15Fixed16Number_to_float(profile->blueColorant.X) + s15Fixed16Number_to_float(profile->blueColorant.Y) + s15Fixed16Number_to_float(profile->blueColorant.Z); float xBlue = s15Fixed16Number_to_float(profile->blueColorant.X) / sumBlue; float yBlue = s15Fixed16Number_to_float(profile->blueColorant.Y) / sumBlue; qcms_triangle triangle = {{{xRed, yRed}, {xGreen, yGreen}, {xBlue, yBlue}}}; return triangle; } static float get_triangle_area(const qcms_triangle candidate) { float xRed = candidate.verticies[0].x; float yRed = candidate.verticies[0].y; float xGreen = candidate.verticies[1].x; float yGreen = candidate.verticies[1].y; float xBlue = candidate.verticies[2].x; float yBlue = candidate.verticies[2].y; float area = fabs((xRed - xBlue) * (yGreen - yBlue) - (xGreen - xBlue) * (yRed - yBlue)) / 2; return area; } static float get_ntsc_gamut_metric_area(const qcms_triangle candidate) { float area = get_triangle_area(candidate); return area * 100 / NTSC_1953_GAMUT_SIZE; } float qcms_profile_ntsc_relative_gamut_size(qcms_profile *profile) { qcms_triangle triangle = get_profile_triangle(profile); return get_ntsc_gamut_metric_area(triangle); }