24#include "../../SDL_internal.h"
39 return (
in & (1 << bit)) >> bit;
45 int mask = (1 << (
end - begin + 1)) - 1;
47 return (
in >> begin) &
mask;
53 if (memcmp (edid,
"\x00\xff\xff\xff\xff\xff\xff\x00", 8) == 0)
79 edid[0x0c] | edid[0x0d] << 8 | edid[0x0e] << 16 | edid[0x0f] << 24;
82 is_model_year =
FALSE;
132 static const int bit_depth[8] =
134 -1, 6, 8, 10, 12, 14, 16, -1
156 static const double levels[][3] =
159 { 0.714, 0.286, 1.0 },
178 if (edid[0x15] == 0 && edid[0x16] == 0)
184 else if (edid[0x16] == 0)
190 else if (edid[0x15] == 0)
204 if (edid[0x17] == 0xFF)
207 info->
gamma = (edid[0x17] + 100.0) / 100.0;
249 high = (high << 2) | low;
251 for (
i = 0;
i < 10; ++
i)
275 static const Timing established[][8] =
312 for (
i = 0;
i < 3; ++
i)
314 for (
j = 0;
j < 8; ++
j)
316 int byte = edid[0x23 +
i];
318 if (
get_bit (
byte,
j) && established[
i][
j].frequency != 0)
330 for (
i = 0;
i < 8;
i++)
332 int first = edid[0x26 + 2 *
i];
333 int second = edid[0x27 + 2 *
i];
335 if (
first != 0x01 && second != 0x01)
342 case 0x00:
h = (
w / 16) * 10;
break;
343 case 0x01:
h = (
w / 4) * 3;
break;
344 case 0x02:
h = (
w / 5) * 4;
break;
345 case 0x03:
h = (
w / 16) * 9;
break;
361 for (
i = 0;
i < n_chars; ++
i)
368 else if (
s[
i] == 0x00)
430 detailed->
pixel_clock = (timing[0x00] | timing[0x01] << 8) * 10000;
431 detailed->
h_addr = timing[0x02] | ((timing[0x04] & 0xf0) << 4);
432 detailed->
h_blank = timing[0x03] | ((timing[0x04] & 0x0f) << 8);
433 detailed->
v_addr = timing[0x05] | ((timing[0x07] & 0xf0) << 4);
434 detailed->
v_blank = timing[0x06] | ((timing[0x07] & 0x0f) << 8);
436 detailed->
h_sync = timing[0x09] |
get_bits (timing[0x0b], 4, 5) << 8;
489 for (
i = 0;
i < 4; ++
i)
491 int index = 0x36 +
i * 18;
493 if (edid[
index + 0] == 0x00 && edid[
index + 1] == 0x00)
516 for (
i = 0;
i < 128; ++
i)
547 return v?
"yes" :
"no";
555 printf (
"Checksum: %d (%s)\n",
564 printf (
"Production Week: unspecified\n");
569 printf (
"Production Year: unspecified\n");
572 printf (
"Model Year: %d\n", info->
model_year);
574 printf (
"Model Year: unspecified\n");
578 printf (
"Display is %s\n", info->
is_digital?
"digital" :
"analog");
581 const char *interface;
585 printf (
"Bits Per Primary: undefined\n");
589 case DVI:
interface = "
DVI";
break;
590 case HDMI_A:
interface = "HDMI-
a";
break;
591 case HDMI_B:
interface = "HDMI-
b";
break;
592 case MDDI:
interface = "
MDDI";
break;
594 case UNDEFINED:
interface = "undefined";
break;
595 default:
interface = "unknown";
break;
597 printf (
"Interface: %s\n", interface);
610 printf (
"Blank to Black: %s\n",
612 printf (
"Separate HV Sync: %s\n",
614 printf (
"Composite Sync on H: %s\n",
616 printf (
"Serration on VSync: %s\n",
623 case RGB:
s =
"rgb";
break;
625 default:
s =
"unknown";
break;
628 printf (
"Color: %s\n",
s);
632 printf (
"Width: undefined\n");
634 printf (
"Width: %d mm\n", info->
width_mm);
637 printf (
"Height: undefined\n");
639 printf (
"Height: %d mm\n", info->
height_mm);
644 printf (
"Aspect Ratio: undefined\n");
646 if (info->
gamma >= 0)
647 printf (
"Gamma: %f\n", info->
gamma);
649 printf (
"Gamma: undefined\n");
656 printf (
"Preferred Timing Includes Native: %s\n",
660 printf (
"Red X: %f\n", info->
red_x);
661 printf (
"Red Y: %f\n", info->
red_y);
662 printf (
"Green X: %f\n", info->
green_x);
663 printf (
"Green Y: %f\n", info->
green_y);
664 printf (
"Blue X: %f\n", info->
blue_x);
665 printf (
"Blue Y: %f\n", info->
blue_y);
666 printf (
"White X: %f\n", info->
white_x);
667 printf (
"White Y: %f\n", info->
white_y);
669 printf (
"Established Timings:\n");
671 for (
i = 0;
i < 24; ++
i)
678 printf (
" %d x %d @ %d Hz\n",
683 printf (
"Standard Timings:\n");
684 for (
i = 0;
i < 8; ++
i)
691 printf (
" %d x %d @ %d Hz\n",
700 printf (
"Timing%s: \n",
702 " (Preferred)" :
"");
703 printf (
" Pixel Clock: %d\n", timing->
pixel_clock);
704 printf (
" H Addressable: %d\n", timing->
h_addr);
705 printf (
" H Blank: %d\n", timing->
h_blank);
707 printf (
" H Sync: %d\n", timing->
h_sync);
708 printf (
" V Addressable: %d\n", timing->
v_addr);
709 printf (
" V Blank: %d\n", timing->
v_blank);
711 printf (
" V Sync: %d\n", timing->
v_sync);
712 printf (
" Width: %d mm\n", timing->
width_mm);
713 printf (
" Height: %d mm\n", timing->
height_mm);
715 printf (
" Top Border: %d\n", timing->
top_border);
720 case FIELD_RIGHT:
s =
"Field Sequential, Right on Sync";
break;
721 case FIELD_LEFT:
s =
"Field Sequential, Left on Sync";
break;
727 printf (
" Stereo: %s\n",
s);
731 printf (
" Digital Sync:\n");
734 printf (
" negative vsync: %s\n",
736 printf (
" negative hsync: %s\n",
741 printf (
" Analog Sync:\n");
744 printf (
" sync on green: %s\n",
yesno (
749 printf (
"Detailed Product information:\n");
752 printf (
" Unspecified String: %s\n", info->
dsc_string);
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
GLfloat GLfloat GLfloat GLfloat h
GLubyte GLubyte GLubyte GLubyte w
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int int in j)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
static void decode_lf_string(const uchar *s, int n_chars, char *result)
static int get_bits(int in, int begin, int end)
static void decode_check_sum(const uchar *edid, MonitorInfo *info)
static int decode_edid_version(const uchar *edid, MonitorInfo *info)
static void decode_display_descriptor(const uchar *desc, MonitorInfo *info)
static int decode_display_parameters(const uchar *edid, MonitorInfo *info)
static int decode_vendor_and_product_identification(const uchar *edid, MonitorInfo *info)
static int decode_color_characteristics(const uchar *edid, MonitorInfo *info)
static const char * yesno(int v)
static double decode_fraction(int high, int low)
static int decode_descriptors(const uchar *edid, MonitorInfo *info)
static int decode_header(const uchar *edid)
void dump_monitor_info(MonitorInfo *info)
static int decode_standard_timings(const uchar *edid, MonitorInfo *info)
static int decode_established_timings(const uchar *edid, MonitorInfo *info)
static int get_bit(int in, int bit)
static void decode_detailed_timing(const uchar *timing, DetailedTiming *detailed)
MonitorInfo * decode_edid(const uchar *edid)
struct DetailedTiming::@274::@275 analog
struct DetailedTiming::@274::@276 digital
union DetailedTiming::@274 ad
char manufacturer_code[4]
struct MonitorInfo::@277::@279 analog
char dsc_product_name[14]
struct MonitorInfo::@277::@278 digital
union MonitorInfo::@277 ad
char dsc_serial_number[14]
int composite_sync_on_green
double total_signal_level
unsigned int serial_number
DetailedTiming detailed_timings[4]
int preferred_timing_includes_native
double video_signal_level