Hey, do you want some specific tests about the patch ? > 2011/4/1 Mike Blumenkrantz<m...@zentific.com>: >> On Fri, 1 Apr 2011 22:19:19 +0200 >> Leif Middelschulte<leif.middelschu...@gmail.com> wrote: >> >>> Hello everyone, >>> >>> find attached a patch for EDID data extraction. My display's >>> manufacturer didn't comply with the standard too much, so I can't test >>> it entirely. But it should work. >>> >>> Review, comments and commit are welcome ;-) >>> >>> BR, >>> >>> Leif >>> >> Thanks for sending! I'll review it immediately! >> >> April fool's, it'll languish on the mailing list for months! :D > Oh, > > I forgot.... it's not april 1st anymore in .kr :-/ > > So then.. here you go > >> -- >> Mike Blumenkrantz >> Zentific: NULL pointer dereferences now 50% off! >> >> >> 0001-Added-data-extraction-for-raw-EDID-version-1.3.patch >> >> >> From a866c1f84c0ef44e85fc7c10abf7deff23e1fa08 Mon Sep 17 00:00:00 2001 >> From: Leif Middelschulte<leif.middelschu...@gmail.com> >> Date: Fri, 1 Apr 2011 02:40:09 +0200 >> Subject: [PATCH] Added data extraction for raw EDID version>= 1.3 >> >> --- >> trunk/ecore/ChangeLog | 4 + >> trunk/ecore/src/lib/ecore_x/Ecore_X.h | 204 ++++++++ >> trunk/ecore/src/lib/ecore_x/xlib/Makefile.am | 1 + >> .../src/lib/ecore_x/xlib/ecore_x_randr_12_edid.c | 486 >> ++++++++++++++++++++ >> 4 files changed, 695 insertions(+), 0 deletions(-) >> create mode 100644 trunk/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12_edid.c >> >> diff --git a/trunk/ecore/ChangeLog b/trunk/ecore/ChangeLog >> index 31f5fe1..03479f3 100644 >> --- a/trunk/ecore/ChangeLog >> +++ b/trunk/ecore/ChangeLog >> @@ -113,3 +113,7 @@ >> >> * Add ecore_con_url_pipeline_set and ecore_con_url_pipeline_get for >> HTTP 1.1 >> pipelining support. >> + >> +2011-04-01 Leif Middelschulte >> + >> + * Add ecore_x_randr_edid_* data extraction and validation functions for >> EDID structures. >> diff --git a/trunk/ecore/src/lib/ecore_x/Ecore_X.h >> b/trunk/ecore/src/lib/ecore_x/Ecore_X.h >> index 0e21770..a9232fc 100644 >> --- a/trunk/ecore/src/lib/ecore_x/Ecore_X.h >> +++ b/trunk/ecore/src/lib/ecore_x/Ecore_X.h >> @@ -207,6 +207,35 @@ typedef enum _Ecore_X_Render_Subpixel_Order { >> ECORE_X_RENDER_SUBPIXEL_ORDER_NONE = 5 >> } Ecore_X_Render_Subpixel_Order; >> >> +typedef enum _Ecore_X_Randr_Edid_Display_Interface_Type { >> + ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_UNDEFINED, >> + ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_DVI, >> + ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_HDMI_A, >> + ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_HDMI_B, >> + ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_MDDI, >> + ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_DISPLAY_PORT >> +} Ecore_X_Randr_Edid_Display_Interface_Type; >> + >> +typedef enum _Ecore_X_Randr_Edid_Display_Colorscheme { >> + ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_MONOCHROME_GRAYSCALE = 0x00, >> + ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB = 0x08, >> + ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_NON_RGB = 0x10, >> + ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_UNDEFINED = 0x18, >> + ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_4_4_4 = 0x444000, >> + ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_YCRCB_4_4_4 = 0x444, >> + ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_YCRCB_4_2_2 = 0x422 >> +} Ecore_X_Randr_Edid_Display_Colorscheme; >> + >> +typedef enum _Ecore_X_Randr_Edid_Aspect_Ratio { >> + ECORE_X_RANDR_EDID_ASPECT_RATIO_4_3 = 0x0, >> + ECORE_X_RANDR_EDID_ASPECT_RATIO_16_9 = 0x1, >> + ECORE_X_RANDR_EDID_ASPECT_RATIO_16_10 = 0x2, >> + ECORE_X_RANDR_EDID_ASPECT_RATIO_5_4 = 0x4, >> + ECORE_X_RANDR_EDID_ASPECT_RATIO_15_9 = 0x8 >> +} Ecore_X_Randr_Edid_Aspect_Ratio; >> + >> +#define ECORE_X_RANDR_EDID_UNKNOWN_VALUE -1 >> + >> #define ECORE_X_SELECTION_TARGET_TARGETS "TARGETS" >> #define ECORE_X_SELECTION_TARGET_TEXT "TEXT" >> #define ECORE_X_SELECTION_TARGET_COMPOUND_TEXT "COMPOUND_TEXT" >> @@ -2668,6 +2697,181 @@ ecore_x_randr_output_crtc_set(Ecore_X_Window root, >> Ecore_X_Randr_Output output, >> const Ecore_X_Randr_Crtc crtc); >> >> +/* ecore_x_randr_12_edid.c */ >> + >> +/* >> + * @brief Validates the header from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return EINA_TRUE, if the header is valid. Else EINA_FALSE. >> + */ >> +EAPI Eina_Bool ecore_x_randr_edid_valid_header(unsigned char *edid, >> unsigned long edid_length); >> + >> +/* >> + * @brief Checks whether a display's EDID has a valid checksum. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return EINA_TRUE, if the checksum is valid. Else EINA_FALSE. >> + */ >> +EAPI Eina_Bool ecore_x_randr_edid_info_has_valid_checksum(unsigned char >> *edid, long edid_length); >> + >> +/* >> + * @brief Get the encoded version from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return The encoded major and minor version encasuplated a single short. >> + */ >> +EAPI short ecore_x_randr_edid_version_get(unsigned char *edid, unsigned >> long edid_length); >> + >> +/* >> + * @brief Get the encoded manufacturer from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return The encoded manufacturer identifier. >> + */ >> +EAPI const char *ecore_x_randr_edid_manufacturer_name_get(unsigned char >> *edid, unsigned long edid_length); >> + >> +/* >> + * @brief Get the encoded name from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return The encoded manufacturer identifier. >> + */ >> +EAPI const char *ecore_x_randr_edid_display_name_get(unsigned char *edid, >> long edid_length); >> + >> +/* >> + * @brief Get the encoded ASCII from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return The encoded ASCII display identifier. >> + */ >> +EAPI const char *ecore_x_randr_edid_display_ascii_get(unsigned char *edid, >> long edid_length); >> + >> +/* >> + * @brief Get the encoded serial identifier from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return The encoded serial identifier. >> + */ >> +EAPI const char *ecore_x_randr_edid_display_serial_get(unsigned char *edid, >> long edid_length); >> + >> +/* >> + * @brief Get the encoded model number from raw EDID data. >> + * >> + * The manufacturer ID table is necessary for a useful description. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return The encoded model number. >> + */ >> +EAPI short ecore_x_randr_edid_model_get(unsigned char *edid, unsigned long >> edid_length); >> + >> +/* >> + * @brief Get the manufacturer serial number from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return The encoded serial manufacturer serial number. >> + */ >> +EAPI int ecore_x_randr_edid_manufacturer_serial_number_get(unsigned char >> *edid, unsigned long edid_length); >> + >> +/* >> + * @brief Get the manufacturer model number from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return The manufacturer's model number. >> + */ >> +EAPI short ecore_x_randr_edid_manufacturer_model_get(unsigned char *edid, >> unsigned long edid_length); >> + >> +/* >> + * @brief Looks up the DPMS support from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return EINA_TRUE, if DPMS is supported in some way. Else EINA_FALSE. >> + */ >> +EAPI Eina_Bool ecore_x_randr_edid_dpms_available_get(unsigned char *edid, >> unsigned long edid_length); >> + >> +/* >> + * @brief Looks up the DPMS Standby support from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return EINA_TRUE, if DPMS Standby is supported. Else EINA_FALSE. >> + */ >> +EAPI Eina_Bool ecore_x_randr_edid_dpms_standby_available_get(unsigned char >> *edid, unsigned long edid_length); >> + >> +/* >> + * @brief Looks up the DPMS Suspend support from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return EINA_TRUE, if DPMS Suspend is supported. Else EINA_FALSE. >> + */ >> +EAPI Eina_Bool ecore_x_randr_edid_dpms_suspend_available_get(unsigned char >> *edid, unsigned long edid_length); >> + >> +/* >> + * @brief Looks up the DPMS Off support from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return EINA_TRUE, if DPMS Off is supported. Else EINA_FALSE. >> + */ >> +EAPI Eina_Bool ecore_x_randr_edid_dpms_off_available_get(unsigned char >> *edid, unsigned long edid_length); >> + >> +/* >> + * @brief Get the preferred aspect ratio from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return The preferred aspect ratio. >> + */ >> +EAPI Ecore_X_Randr_Edid_Aspect_Ratio_Preferred >> ecore_x_randr_edid_display_aspect_ratio_preferred_get(unsigned char *edid, >> long edid_length); >> + >> +/* >> + * @brief Get the supported aspect ratios from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return The supported aspect ratios. >> + */ >> +EAPI Ecore_X_Randr_Edid_Aspect_Ratio >> ecore_x_randr_edid_display_aspect_ratios_get(unsigned char *edid, long >> edid_length); >> + >> +/* >> + * @brief Get the supported colorschemes from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return The supported colorschemes. >> + */ >> +EAPI Ecore_X_Randr_Edid_Display_Colorscheme >> ecore_x_randr_edid_display_colorscheme_get(unsigned char *edid, unsigned >> long edid_length); >> + >> +/* >> + * @brief Get the display type from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return EINA_TRUE, if the display is a digital one. Else EINA_FALSE. >> + */ >> +EAPI Eina_Bool ecore_x_randr_edid_display_type_digital_get(unsigned char >> *edid, unsigned long edid_length); >> + >> +/* >> + * @brief Get the display interface type from raw EDID data. >> + * >> + * @param edid the edid structure >> + * @param edid_length length of the edid structure >> + * @return The interface type. >> + */ >> +EAPI Ecore_X_Randr_Edid_Display_Interface_Type >> ecore_x_randr_edid_display_interface_type_get(unsigned char *edid, unsigned >> long edid_length); >> + >> /* ecore_x_randr_13.c */ >> EAPI void >> ecore_x_randr_screen_backlight_level_set(Ecore_X_Window root, double >> level); >> diff --git a/trunk/ecore/src/lib/ecore_x/xlib/Makefile.am >> b/trunk/ecore/src/lib/ecore_x/xlib/Makefile.am >> index c75f4a5..71990ec 100644 >> --- a/trunk/ecore/src/lib/ecore_x/xlib/Makefile.am >> +++ b/trunk/ecore/src/lib/ecore_x/xlib/Makefile.am >> @@ -36,6 +36,7 @@ ecore_x_sync.c \ >> ecore_x_randr.c \ >> ecore_x_randr_11.c \ >> ecore_x_randr_12.c \ >> +ecore_x_randr_12_edid.c \ >> ecore_x_randr_13.c \ >> ecore_x_fixes.c \ >> ecore_x_damage.c \ >> diff --git a/trunk/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12_edid.c >> b/trunk/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12_edid.c >> new file mode 100644 >> index 0000000..85582dd >> --- /dev/null >> +++ b/trunk/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12_edid.c >> @@ -0,0 +1,486 @@ >> +/* >> + * Copyright 2006-2009 Red Hat, Inc. >> + * >> + * Permission is hereby granted, free of charge, to any person obtaining a >> + * copy of this software and associated documentation files (the >> "Software"), >> + * to deal in the Software without restriction, including without limitation >> + * on the rights to use, copy, modify, merge, publish, distribute, sub >> + * license, and/or sell copies of the Software, and to permit persons to >> whom >> + * the Software is furnished to do so, subject to the following conditions: >> + * >> + * The above copyright notice and this permission notice (including the next >> + * paragraph) shall be included in all copies or substantial portions of the >> + * Software. >> + * >> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS >> OR >> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, >> + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL >> + * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER >> + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN >> + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE >> SOFTWARE. >> + */ >> +/* Original Author: Adam Jackson<a...@nwnk.net> */ >> +/* Heavily modified by: Leif Middelschulte<leif.middelschu...@gmail.com> */ >> + >> +#include "Ecore_X.h" >> + >> +/* TODO: >> + * - see other TODO's within this file. >> + */ >> + >> +#define ECORE_X_RANDR_EDID_VERSION_10 ((1<< 8) | 0) >> +#define ECORE_X_RANDR_EDID_VERSION_11 ((1<< 8) | 1) >> +#define ECORE_X_RANDR_EDID_VERSION_12 ((1<< 8) | 2) >> +#define ECORE_X_RANDR_EDID_VERSION_13 ((1<< 8) | 3) >> +#define ECORE_X_RANDR_EDID_VERSION_14 ((1<< 8) | 4) >> + >> +#define _ECORE_X_RANDR_EDID_OFFSET_MANUFACTURER 0x08 >> +#define _ECORE_X_RANDR_EDID_OFFSET_TYPE 0x14 >> +#define _ECORE_X_RANDR_EDID_OFFSET_VERSION_MAJOR 0x12 >> +#define _ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR 0x13 >> +#define _ECORE_X_RANDR_EDID_OFFSET_DPMS 0x18 >> +#define _ECORE_X_RANDR_EDID_OFFSET_COLORSPACE 0x18 >> +#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK 0x36 >> +#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE 3 >> +#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT 5 >> +#define _ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO_PREFERRED 15 >> +#define _ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO 14 >> + >> +#define _ECORE_X_RANDR_EDID_MASK_DIGITAL 0x80 >> +#define _ECORE_X_RANDR_EDID_MASK_DIGITAL_INTERFACE 0x0f >> +#define _ECORE_X_RANDR_EDID_MASK_DIGITAL_TMDS_DFP_10 0x01 >> +#define _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_ANALOGOUS 0x18 >> +#define _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_444 0x10 >> +#define _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_422 0x08 >> +#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_PREFERRED 0xe0 >> +#define _ECORE_X_RANDR_EDID_MASK_DPMS 0xE0 >> +#define _ECORE_X_RANDR_EDID_MASK_DPMS_STANDBY 0x80 >> +#define _ECORE_X_RANDR_EDID_MASK_DPMS_SUSPEND 0x40 >> +#define _ECORE_X_RANDR_EDID_MASK_DPMS_OFF 0x20 >> +#define _ECORE_X_RANDR_EDID_MASK_INTERFACE_TYPE 0x0f >> +#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_4_3 0x80 >> +#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_9 0x40 >> +#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_10 0x20 >> +#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_5_4 0x10 >> +#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_15_9 0x08 >> + >> +#define _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX 13 >> + >> +typedef enum _Ecore_X_Randr_Edid_Aspect_Ratio_Preferred { >> + ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_4_3 = 0x00, >> + ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_9 = 0x01, >> + ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_10 = 0x02, >> + ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_5_4 = 0x03, >> + ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_15_9 = 0x04 >> +} Ecore_X_Randr_Edid_Aspect_Ratio_Preferred; >> + >> +/* Some convenience loops */ >> +#define _ECORE_X_RANDR_EDID_FOR_EACH_EXTENSION_BLOCK(edid, edid_length, >> extension_block_iter) \ >> + for (extension_block_iter = edid; extension_block_iter< (edid + >> edid_length); extension_block_iter += 128) >> + >> +#define _ECORE_X_RANDR_EDID_FOR_EACH_CEA_BLOCK(edid, edid_length, >> cea_block_iter) \ >> + _ECORE_X_RANDR_EDID_FOR_EACH_EXTENSION_BLOCK(edid, edid_length, >> cea_block_iter) \ >> +if (cea_block_iter[0] == 0x02) >> + >> +/* The following macro is to be used with caution as it inherits another >> loop. >> + * Therefore using a 'break;' statement will lead to continuation in the >> + * inherent 'Extension block'-loop. >> + */ >> +#define _ECORE_X_RANDR_EDID_FOR_EACH_CEA_DETAILED_BLOCK(edid, edid_length, >> cea_block_iter, detailed_block_iter) \ >> + _ECORE_X_RANDR_EDID_FOR_EACH_CEA_BLOCK(edid, edid_length, >> cea_block_iter) \ >> +for (detailed_block_iter = cea_block_iter + cea_block_iter[2]; >> detailed_block_iter + 18< cea_block_iter + 127; detailed_block_iter += 18) \ >> +if (detailed_block_iter[0]) >> + >> +#define _ECORE_X_RANDR_EDID_FOR_EACH_DESCRIPTOR_BLOCK(edid, block) \ >> + for (block = edid + _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK; block<= >> (edid + _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK + (3*18)); block += 18) >> + >> +#define _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, >> block) \ >> + _ECORE_X_RANDR_EDID_FOR_EACH_DESCRIPTOR_BLOCK(edid, block) \ >> +if ((block[0] == 0)&& (block[1] == 0)) >> + >> + EAPI Eina_Bool >> +ecore_x_randr_edid_has_valid_header(unsigned char *edid, unsigned long >> edid_length) >> +{ >> + Eina_Bool is_valid = EINA_FALSE; >> + >> + if (!edid) return EINA_FALSE; >> + >> + if (!memcmp(edid, "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00", 8)) >> + { >> + is_valid = EINA_TRUE; >> + } >> + >> + return is_valid; >> +} >> + >> + EAPI short >> +ecore_x_randr_edid_version_get(unsigned char *edid, unsigned long >> edid_length) >> +{ >> + short version; >> + version = ECORE_X_RANDR_EDID_UNKNOWN_VALUE; >> + >> + if (edid&& ecore_x_randr_edid_has_valid_header(edid, edid_length)) >> + version = (edid[_ECORE_X_RANDR_EDID_OFFSET_VERSION_MAJOR]<< 8) | >> edid[_ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR]; >> + >> + return version; >> +} >> + >> + EAPI short >> +ecore_x_randr_edid_manufacturer_model_get(unsigned char *edid, unsigned >> long edid_length) >> +{ >> + short model = ECORE_X_RANDR_EDID_UNKNOWN_VALUE; >> + >> + if (edid&& ecore_x_randr_edid_has_valid_header(edid, edid_length)) >> + model = (short)(edid[0x0A] + (edid[0x0B]<< 8)); >> + >> + return model; >> +} >> + >> + EAPI int >> +ecore_x_randr_edid_manufacturer_serial_number_get(unsigned char *edid, >> unsigned long edid_length) >> +{ >> + int serial_number = ECORE_X_RANDR_EDID_UNKNOWN_VALUE; >> + >> + if (edid&& ecore_x_randr_edid_has_valid_header(edid, edid_length)) >> + serial_number = (int)(edid[0x0C] + (edid[0x0D]<< 8) + (edid[0x0E]<< >> 16) + (edid[0x0F]<< 24)); >> + >> + return serial_number; >> +} >> + >> + EAPI const char >> +*ecore_x_randr_edid_manufacturer_name_get(unsigned char *edid, unsigned >> long edid_length) >> +{ >> + unsigned char *x; >> + char *name = NULL; >> + >> + if (edid&& ecore_x_randr_edid_has_valid_header(edid, edid_length)) >> + { >> + x = (edid + _ECORE_X_RANDR_EDID_OFFSET_MANUFACTURER); >> + >> + name = malloc(sizeof(char) * 4); >> + >> + name[0] = ((x[0]& 0x7C)>> 2) + '@'; >> + name[1] = ((x[0]& 0x03)<< 3) + ((x[1]& 0xE0)>> 5) + '@'; >> + name[2] = (x[1]& 0x1F) + '@'; >> + name[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] = '\0'; >> + >> + /* >> + * if (isupper(name[0])&& isupper(name[1])&& isupper(name[2])) >> + * info->manufacturer_name_well_formed = EINA_TRUE; >> + */ >> + } >> + >> + return name; >> +} >> + >> + EAPI const char >> +*ecore_x_randr_edid_display_name_get(unsigned char *edid, long edid_length) >> +{ >> + unsigned char *block = NULL; >> + char *name = NULL; >> + const char *edid_name; >> + static short version; >> + >> + version = ecore_x_randr_edid_version_get(edid, edid_length); >> + >> + if (version< ECORE_X_RANDR_EDID_VERSION_13) return NULL; >> + >> + _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block) >> + { >> + if (block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == >> 0xFC) { >> + edid_name = (const char*)block + >> _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT; >> + name = malloc(sizeof(*name) * >> _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX); >> + strncpy(name, edid_name, >> (_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX - 1)); >> + return name; >> + } >> + } >> + return name; >> +} >> + >> + EAPI Ecore_X_Randr_Edid_Aspect_Ratio >> +ecore_x_randr_edid_display_aspect_ratio_preferred_get(unsigned char *edid, >> long edid_length) >> +{ >> + Ecore_X_Randr_Edid_Aspect_Ratio ret = ECORE_X_RANDR_EDID_UNKNOWN_VALUE; >> + Ecore_X_Randr_Edid_Aspect_Ratio_Preferred preferred_ratio; >> + unsigned char *block = NULL; >> + static short version; >> + >> + version = ecore_x_randr_edid_version_get(edid, edid_length); >> + >> + if (version< ECORE_X_RANDR_EDID_VERSION_13) return ret; >> + >> + _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block) >> + { >> + if ((block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == >> 0xFD)&& (block[10] == 0x04)) >> + { >> + preferred_ratio = >> (Ecore_X_Randr_Edid_Aspect_Ratio_Preferred)((block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO_PREFERRED]& >> _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_PREFERRED)>> 5); >> + switch (preferred_ratio) >> + { >> + case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_4_3: >> + ret = ECORE_X_RANDR_EDID_ASPECT_RATIO_4_3; >> + break; >> + case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_9: >> + ret = ECORE_X_RANDR_EDID_ASPECT_RATIO_16_9; >> + break; >> + case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_10: >> + ret = ECORE_X_RANDR_EDID_ASPECT_RATIO_16_10; >> + break; >> + case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_5_4: >> + ret = ECORE_X_RANDR_EDID_ASPECT_RATIO_5_4; >> + break; >> + case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_15_9: >> + ret = ECORE_X_RANDR_EDID_ASPECT_RATIO_15_9; >> + break; >> + default: >> + ret = ECORE_X_RANDR_EDID_UNKNOWN_VALUE; >> + } >> + } >> + return ret; >> + } >> + >> + return ret; >> +} >> + >> + EAPI Ecore_X_Randr_Edid_Aspect_Ratio >> +ecore_x_randr_edid_display_aspect_ratios_get(unsigned char *edid, long >> edid_length) >> +{ >> + Ecore_X_Randr_Edid_Aspect_Ratio ret = ECORE_X_RANDR_EDID_UNKNOWN_VALUE; >> + unsigned char *block = NULL; >> + static short version; >> + >> + version = ecore_x_randr_edid_version_get(edid, edid_length); >> + >> + if (version< ECORE_X_RANDR_EDID_VERSION_13) return ret; >> + >> + _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block) >> + { >> + if ((block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == >> 0xFD)&& (block[10] == 0x04)) >> + { >> + if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO]& >> _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_4_3) >> + ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_4_3; >> + if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO]& >> _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_9) >> + ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_16_9; >> + if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO]& >> _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_10) >> + ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_16_10; >> + if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO]& >> _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_5_4) >> + ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_5_4; >> + if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO]& >> _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_15_9) >> + ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_15_9; >> + } >> + } >> + >> + return ret; >> +} >> + >> + EAPI const char >> +*ecore_x_randr_edid_display_ascii_get(unsigned char *edid, long edid_length) >> +{ >> + unsigned char *block = NULL; >> + char *ascii = NULL; >> + const char *edid_ascii; >> + static short version; >> + >> + version = ecore_x_randr_edid_version_get(edid, edid_length); >> + >> + if (version< ECORE_X_RANDR_EDID_VERSION_13) return ascii; >> + >> + _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block) >> + { >> + if (block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xFE) >> + { >> + edid_ascii = (const char*)block + >> _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT; >> + /* >> + * TODO: Two of these in a row, in the third and fouth slots, >> + * seems to be specified by SPWG: http://www.spwg.org/ >> + */ >> + ascii = malloc(sizeof(*ascii) * >> _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX); >> + strncpy(ascii, edid_ascii, >> (_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX - 1)); >> + return ascii; >> + } >> + } >> + >> + return ascii; >> +} >> + >> + EAPI const char >> +*ecore_x_randr_edid_display_serial_get(unsigned char *edid, long >> edid_length) >> +{ >> + unsigned char *block = NULL; >> + char *serial = NULL; >> + const char *edid_serial; >> + static short version; >> + >> + version = ecore_x_randr_edid_version_get(edid, edid_length); >> + >> + if (version< ECORE_X_RANDR_EDID_VERSION_13) return serial; >> + >> + _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block) >> + { >> + if (block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xFF) >> + { >> + edid_serial = (const char*)block + >> _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT; >> + /* >> + * TODO: Two of these in a row, in the third and fouth slots, >> + * seems to be specified by SPWG: http://www.spwg.org/ >> + */ >> + serial = malloc(sizeof(*serial) * >> _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX); >> + strncpy(serial, edid_serial, >> (_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX - 1)); >> + } >> + } >> + >> + return serial; >> +} >> + >> + EAPI Eina_Bool >> +ecore_x_randr_edid_info_has_valid_checksum(unsigned char *edid, long >> edid_length) >> +{ >> + unsigned char *cea_block_iter = NULL; >> + char sum; >> + int i; >> + static short version; >> + >> + version = ecore_x_randr_edid_version_get(edid, edid_length); >> + >> + if (version< ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE; >> + >> + /* Check the EDID block itself */ >> + for (i = 0, sum = 0; i< 128; i++) >> + sum += edid[i]; >> + if (sum) return EINA_FALSE; >> + >> + /* Check the cea extension blocks */ >> + _ECORE_X_RANDR_EDID_FOR_EACH_CEA_BLOCK(edid, edid_length, cea_block_iter) >> + { >> + for (i = 0, sum = 0; i< 128; i++) >> + sum += cea_block_iter[i]; >> + /* >> + * printf("Checksum: 0x%hx", x[0x7f]); >> + * printf(" (should be 0x%hx)\n", (char)(x[0x7f] - sum)); >> + */ >> + } >> + >> + if (sum) >> + return EINA_FALSE; >> + else >> + return EINA_TRUE; >> +} >> + >> + EAPI Eina_Bool >> +ecore_x_randr_edid_dpms_available_get(unsigned char *edid, unsigned long >> edid_length) >> +{ >> + Eina_Bool ret = EINA_FALSE; >> + static short version; >> + >> + version = ecore_x_randr_edid_version_get(edid, edid_length); >> + >> + if (version< ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE; >> + >> + ret = (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS]& >> _ECORE_X_RANDR_EDID_MASK_DPMS); >> + >> + return ret; >> +} >> + >> + EAPI Eina_Bool >> +ecore_x_randr_edid_dpms_standby_available_get(unsigned char *edid, unsigned >> long edid_length) >> +{ >> + Eina_Bool ret = EINA_FALSE; >> + static short version; >> + >> + version = ecore_x_randr_edid_version_get(edid, edid_length); >> + >> + if (version< ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE; >> + >> + if (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS]& >> _ECORE_X_RANDR_EDID_MASK_DPMS) >> + ret = (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS]& >> _ECORE_X_RANDR_EDID_MASK_DPMS_STANDBY); >> + >> + return ret; >> +} >> + >> + EAPI Eina_Bool >> +ecore_x_randr_edid_dpms_suspend_available_get(unsigned char *edid, unsigned >> long edid_length) >> +{ >> + Eina_Bool ret = EINA_FALSE; >> + static short version; >> + >> + version = ecore_x_randr_edid_version_get(edid, edid_length); >> + >> + if (version< ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE; >> + >> + if (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS]& >> _ECORE_X_RANDR_EDID_MASK_DPMS) >> + ret = (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS]& >> _ECORE_X_RANDR_EDID_MASK_DPMS_SUSPEND); >> + >> + return ret; >> +} >> + >> + EAPI Eina_Bool >> +ecore_x_randr_edid_dpms_off_available_get(unsigned char *edid, unsigned >> long edid_length) >> +{ >> + Eina_Bool ret = EINA_FALSE; >> + static short version; >> + >> + version = ecore_x_randr_edid_version_get(edid, edid_length); >> + >> + if (version< ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE; >> + >> + if (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS]& >> _ECORE_X_RANDR_EDID_MASK_DPMS) >> + ret = (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS]& >> _ECORE_X_RANDR_EDID_MASK_DPMS_OFF); >> + >> + return ret; >> +} >> + >> + EAPI Eina_Bool >> +ecore_x_randr_edid_display_type_digital_get(unsigned char *edid, unsigned >> long edid_length) >> +{ >> + Eina_Bool ret = EINA_FALSE; >> + static short version; >> + >> + version = ecore_x_randr_edid_version_get(edid, edid_length); >> + if (version< ECORE_X_RANDR_EDID_VERSION_13) return ret; >> + >> + ret = (edid[_ECORE_X_RANDR_EDID_OFFSET_TYPE]& >> _ECORE_X_RANDR_EDID_MASK_DIGITAL); >> + >> + return ret; >> +} >> + >> + EAPI Ecore_X_Randr_Edid_Display_Colorscheme >> +ecore_x_randr_edid_display_colorscheme_get(unsigned char *edid, unsigned >> long edid_length) >> +{ >> + Ecore_X_Randr_Edid_Display_Colorscheme colorscheme = >> ECORE_X_RANDR_EDID_UNKNOWN_VALUE; >> + static short version; >> + >> + version = ecore_x_randr_edid_version_get(edid, edid_length); >> + if (version< ECORE_X_RANDR_EDID_VERSION_13) return colorscheme; >> + >> + if (ecore_x_randr_edid_display_type_digital_get(edid, edid_length)) >> + { >> + colorscheme = >> ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_4_4_4; >> + if (edid[_ECORE_X_RANDR_EDID_OFFSET_COLORSPACE]& >> _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_444) >> + colorscheme |= >> ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_YCRCB_4_4_4; >> + if (edid[_ECORE_X_RANDR_EDID_OFFSET_COLORSPACE]& >> _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_422) >> + colorscheme |= >> ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_YCRCB_4_2_2; >> + } >> + else >> + { >> + colorscheme = edid[_ECORE_X_RANDR_EDID_OFFSET_COLORSPACE]& >> _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_ANALOGOUS; >> + } >> + >> + return colorscheme; >> +} >> + >> + EAPI Ecore_X_Randr_Edid_Display_Interface_Type >> +ecore_x_randr_edid_display_interface_type_get(unsigned char *edid, unsigned >> long edid_length) >> +{ >> + Ecore_X_Randr_Edid_Display_Interface_Type type = >> ECORE_X_RANDR_EDID_UNKNOWN_VALUE; >> + static short version; >> + >> + version = ecore_x_randr_edid_version_get(edid, edid_length); >> + >> + if (version< ECORE_X_RANDR_EDID_VERSION_13) return type; >> + >> + type = edid[_ECORE_X_RANDR_EDID_OFFSET_TYPE]& >> _ECORE_X_RANDR_EDID_MASK_INTERFACE_TYPE; >> + >> + if ((type< ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_UNDEFINED) || (type> >> ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_DISPLAY_PORT)) >> + type = ECORE_X_RANDR_EDID_UNKNOWN_VALUE; >> + >> + return type; >> +} >> >> >> ------------------------------------------------------------------------------ >> Create and publish websites with WebMatrix >> Use the most popular FREE web apps or write code yourself; >> WebMatrix provides all the features you need to develop and >> publish your website. http://p.sf.net/sfu/ms-webmatrix-sf >> >> >> _______________________________________________ >> enlightenment-devel mailing list >> enlightenment-devel@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
------------------------------------------------------------------------------ Create and publish websites with WebMatrix Use the most popular FREE web apps or write code yourself; WebMatrix provides all the features you need to develop and publish your website. http://p.sf.net/sfu/ms-webmatrix-sf _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel