diff options
Diffstat (limited to 'third_party/qcms/src/qcms_util.c')
-rw-r--r-- | third_party/qcms/src/qcms_util.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/third_party/qcms/src/qcms_util.c b/third_party/qcms/src/qcms_util.c new file mode 100644 index 0000000000..9b2d9fa744 --- /dev/null +++ b/third_party/qcms/src/qcms_util.c @@ -0,0 +1,69 @@ +// 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 <math.h> + +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); +} + + |