[PATCH 02/27] edid-decode: print the chromaticities

Hans Verkuil hverkuil at xs4all.nl
Thu Aug 31 11:40:55 UTC 2017


From: Hans Verkuil <hans.verkuil at cisco.com>

Also warn if the sRGB bit is set but the chromaticities do not
match sRGB.

Signed-off-by: Hans Verkuil <hans.verkuil at cisco.com>
---
 edid-decode.c | 38 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 36 insertions(+), 2 deletions(-)

diff --git a/edid-decode.c b/edid-decode.c
index 47765801..4deceba4 100644
--- a/edid-decode.c
+++ b/edid-decode.c
@@ -68,6 +68,7 @@ static int seen_non_detailed_descriptor = 0;
 static int warning_excessive_dotclock_correction = 0;
 static int warning_zero_preferred_refresh = 0;
 static int nonconformant_hf_vsdb_position = 0;
+static int nonconformant_srgb_chromaticity = 0;
 
 static int conformant = 1;
 
@@ -1822,6 +1823,7 @@ int main(int argc, char **argv)
     time_t the_time;
     struct tm *ptm;
     int analog, i;
+    unsigned col_x, col_y;
 
     switch (argc) {
 	case 1:
@@ -2021,8 +2023,21 @@ int main(int argc, char **argv)
 	printf("\n");
     }
 
-    if (edid[0x18] & 0x04)
+    if (edid[0x18] & 0x04) {
+	/*
+	 * The sRGB chromaticities are (x, y):
+	 * red:   0.640,  0.330
+	 * green: 0.300,  0.600
+	 * blue:  0.150,  0.060
+	 * white: 0.3127, 0.3290
+	 */
+	static const unsigned char srgb_chromaticity[10] = {
+	    0xee, 0x91, 0xa3, 0x54, 0x4c, 0x99, 0x26, 0x0f, 0x50, 0x54
+	};
 	printf("Default (sRGB) color space is primary color space\n");
+	nonconformant_srgb_chromaticity =
+	    memcmp(edid + 0x19, srgb_chromaticity, sizeof(srgb_chromaticity));
+    }
     if (edid[0x18] & 0x02) {
 	printf("First detailed timing is preferred timing\n");
 	has_preferred_timing = 1;
@@ -2030,7 +2045,23 @@ int main(int argc, char **argv)
     if (edid[0x18] & 0x01)
 	printf("Supports GTF timings within operating range\n");
 
-    /* XXX color section */
+    printf("Display x,y Chromaticity:\n");
+    col_x = (edid[0x1b] << 2) | (edid[0x19] >> 6);
+    col_y = (edid[0x1c] << 2) | ((edid[0x19] >> 4) & 3);
+    printf("  Red:   0.%04u, 0.%04u\n",
+	   (col_x * 10000) / 1024, (col_y * 10000) / 1024);
+    col_x = (edid[0x1d] << 2) | ((edid[0x19] >> 2) & 3);
+    col_y = (edid[0x1e] << 2) | (edid[0x19] & 3);
+    printf("  Green: 0.%04u, 0.%04u\n",
+	   (col_x * 10000) / 1024, (col_y * 10000) / 1024);
+    col_x = (edid[0x1f] << 2) | (edid[0x1a] >> 6);
+    col_y = (edid[0x20] << 2) | ((edid[0x1a] >> 4) & 3);
+    printf("  Blue:  0.%04u, 0.%04u\n",
+	   (col_x * 10000) / 1024, (col_y * 10000) / 1024);
+    col_x = (edid[0x21] << 2) | ((edid[0x1a] >> 2) & 3);
+    col_y = (edid[0x22] << 2) | (edid[0x1a] & 3);
+    printf("  White: 0.%04u, 0.%04u\n",
+	   (col_x * 10000) / 1024, (col_y * 10000) / 1024);
 
     printf("Established timings supported:\n");
     for (i = 0; i < 17; i++) {
@@ -2097,6 +2128,7 @@ int main(int argc, char **argv)
     if (claims_one_point_three) {
 	if (nonconformant_digital_display ||
 	    nonconformant_hf_vsdb_position ||
+	    nonconformant_srgb_chromaticity ||
 	    !has_valid_string_termination ||
 	    !has_valid_descriptor_pad ||
 	    !has_name_descriptor ||
@@ -2106,6 +2138,8 @@ int main(int argc, char **argv)
 	    conformant = 0;
 	if (!conformant)
 	    printf("EDID block does NOT conform to EDID 1.3!\n");
+	if (nonconformant_srgb_chromaticity)
+	    printf("\tsRGB is signaled, but the chromaticities do not match\n");
 	if (nonconformant_digital_display)
 	    printf("\tDigital display field contains garbage: %x\n",
 		   nonconformant_digital_display);
-- 
2.14.1



More information about the xorg-devel mailing list