#Change log for wxEDID

NOTE: All data groups are now operating on local data buffers.
      Now Reparse() restores the loaded EDID state, reverting all the changes - unless
      AssembleEDID() or Save/Export is executed. From this point Reparse() restores the
      saved/assembled state.


TODO: add "invalid/unknown" block/field flag, display invalid data on red background.

TODO: VSD: dynamic data layout depends on IEEE-OUI code - currently only 00-0C-03 is supported.
      (partially fixed).

TODO: HDR Dynamic Metadata parser.

TODO: InfoFrame parser.

TODO: Constructors for changing block type: in particular, some DBC blocks require to change more
      than one value at once to get a valid block type of different kind.
      (partially done).

TODO: use global EDID wxString for getGrpName() -> save resources.


____ BUGS:
BUG: (CTA-861-D..G specifications) CEA-DBC:
     Extended Tag Code=3: VESA Video Timing Block Extension (VTB-EXT):
     The specification references VTB-EXT Standard, Release A, November 24, 2003.
     The VTB-EXT extension block is defined as a 128 byte structure, what exceeds the range allowed
     by the DBC Extended Tag header (30 bytes).
     None of the documents is addressing this issue.
     wxEDID will report error for Extended Tag Code=3, and the block will be interpreted as unknown.
BUG: (CTA-861-F..G specifications) CEA::VDB:
     The pseudo-code for VIC values decoding treats VIC range 193..253 as valid, while the max Video ID value
     in Table 3 (Video Formats) is 219.
     wxEDID will report VIC values in range 220..255 as reserved.
____


2022.05.22
   <released to v0.0.29>
   - Fixed: (BUG::regression) EDID_cl::getVidDesc(): missing space between aspect ratio and screen resolution:
            incorrect SVD description in text output mode (Save_As_Text).
   - Fixed: Using global strings where possible: cheaper, faster.
            xxx::getGrpName() -> global EDID_cl::gp_name
            wxEDID_Frame::SaveRep_SubGrps(), WriteField(), GetFullGroupName() -> wxEDID_Frame::sval
            EDID_cl::getStrUint() -> EDID_cl::tmps2
   - Change: BED: dynamic name: displays only MFC and product ID (removed prod. year and week)
   - Change: VDB::SVD: append "[Native]" if native resolution flag is set.

2022.05.21
   <released to v0.0.28>

2023.05.19
   - Fixed: STI: removed unused EF_FGR flag, removed useless code for setting NU flag.
   - Added: STI: use screen resolution as dynamic block name or set "not used" if both bytes are 0x1.
   - Added: BED: display MFC code, year, week, prod ID as dynamic block name.
   - Added: VID: display input type as dynamic block name.
   - Added: BDD: display image size as dynamic block name.
   - Fixed: EDID_cl::FldPadString(OP_READ): return string without padding bytes.
   - Added: MND: display monitor name as dynamic block name.

2023.05.18
   - Added: edi_grp_cl::getGrpName(): support for dynamic block names.
   - Added: BlkTreeSwitchDynamicNames(): update block names from evt_dyn_blk_names handler.
   - Added: config option: blk_dynamic_names.
   - Added: DTD and VDB::SVD: use screen resolution as dynamic block name.

2023.03.08
   - Cleanup: EDID_cl::getValUnitName(), getValTypeName(), getValFlagsAsString():
            removed useless error checking.
   - Update: rcd_autogen v2.9: Fixed: misuse of VMSG TLS pointer, race possible.
            No influence on wxEDID behaviour, just update.

2023.03.07
   - Added: Automatic selection of BED block after the EDID file is loaded/imported.

2022.12.20
    - Fixed: DTD panel: sct_vsoffs, sct_vswidth controls: value range should be 0..63, not 0..1023
    - Fixed: DTD panel: sct_pixclk control: value range should be 0..65535 (655.35MHz), not 0..655350
    - Fixed: wxWidgets v3.2 : wxEDID_App::CmdLineArgs() "wxPATH_NORM_ALL" is deprecated, now the fn uses:
             (wxPATH_NORM_DOTS|wxPATH_NORM_TILDE|wxPATH_NORM_ABSOLUTE).

2022.11.12
    - Change: Default colors for all controls: allows to work with different window themes:
              wxWidgets 3.0.x: not working for wxAUI windows, wxTreeCtrl and wxGrid
              wxWidgets 3.2.x: not working for wxGrid

2022.11.10
   - Update: rcd_autogen v2.7 :: fixed: malformed licensing info in generated header files

2022.04.02
   - Fixed: (BUG::regression::old) rcd_autoconf.m4: changing rcd_autogen run mode at configure time didn't work.

2022.02.20
   <released to v0.0.27>

2022.02.19
   - Cleanup: Removed most of calls to wxT macro - except those generated by wxSmith.
   - Change: ExportEDID_hex(): do not append wxEDID version and the source file name at the end of output file:
            this causes errors when the file needs to be imported back (unless ignoring errors is enabled).

2022.02.14
   - Change: VFPD: Video Format Preference Data Block is now root group for array of SVRs
   - Change: CEA-EXT::VFPD:SVR: added vmap: CEA_vidm_map, same as for SVD: this allows to show meaning of SVR values
            when the EDID structure is saved as text.
   - Added: wxEDID_Frame::SaveRep_SubGrps(): decoding of VFPD:SVR values.

2022.02.13
   - Fixed: The checksum values shown in BlockData grid for EDID.BASE.BED or EDID.CEA.CHD were not refreshed after
            AssembleEDID/Save/Export.
            To refresh those cells, it was necessary to Reparse() the EDID buffer. Now the checksums are automatically
            updated in wxEDID_Frame::AssembleEDID_main(), invoked from wxEDID_Frame::SaveEDID(), ExportEDID_hex(),
            SaveReport() and evt_assemble_edid().
   - Change: wxEDID_Frame::OpenEDID(), ImportEDID_hex(): always try to Reparse() faulty EDID structure when
            "Ignore EDID errors" is enabled.
            wxEDID_Frame::Reparse() is now returning fault even when ignoring errors is enabled.
   - Fixed: (BUG::leak) wxEDID_Frame::ImportEDID_hex(): memory leak possible when the hex->bin conversion fails.

2022.02.09
   - Fixed: (BUG::wxWidgets3.x ::wxAUI) AUI managed panel gets refreshed even when it's invisible, what can cause
            horrible flickering during window resizing.
            wxEDID_Frame::evt_ntbook_page(): disable the EvtHandler in AUI Manager when the panel is invisible.

2022.02.06
   - Fixed: (BUG: Regression in v0.0.23)
            The functions EDID_cl::MfcId(), ProdSN(), ProdWk(), ProdYr() were not updated to work with local data buffers:
            the respective fields in EDID.BASE.BED could not be changed.

2022.02.05
   - Fixed: wxEDID_Frame::SaveRep_SubGrps(): Video Data Block: VIC values were not really decoded,
            so for SVD values > 127 the descriptions were incorrect.
   - Fixed: (BUG::old::mislooked) wxEDID_Frame::SaveRep_SubGrps() uses value descriptions from vmap_t->vname_map_t, but
            reserved values were not included in some cases -> incorrect (shifted) descriptions in the output file.
            Now all the reserved values are included with value description set to NULL.
            edi_grp_cl::create_selector() ignores values with NULL name ptr.
            wxEDID_Frame::SaveRep_SubGrps() prints "<reserved>" for NULL name ptr.

2021.10.04
   < released v0.0.26 >

2021.09.30
   - Cleanup: dtd_screen_cl: removed unused code for background erase event.
   - Fixed: GCC v10.x :: -Wextra can generate tons of warnings, mostly false-positives: disabled in debug builds.
   - Change: wxEDID_Frame::evt_blktree_key():: use keycodes instead of Unicodes to identify character keys.

2021.09.29
   - Fixed: (BUG) CEA::VSD incorrect bit offset for DVI_Dual field.
   - Fixed: (BUG) reparsing of CEA-header group should not be possible (returned uninitialized rcode).
   - Update: rcd_autogen v2.6 :: size of array of units in now fixed, type declaration is variable.

2021.03.27
   < released v0.0.25 >
   - Change: default size for all spin controls on DTD_Constructor panel.
            Looks ugly, but works with wxWidgets compiled against GTK3.

2021.03.26
   - Fixed: Build fails with Clang: unlike GCC, Clang does not support static initialization of flexible
            arrays in C++ mode: removed flex arrays from all field groups descriptors.

   - Update: rcd_autogen v2.4 :: removed flexible array of units in rcd_scope_t.

2021.03.24
   - Fixed: <various functions> :: in case of error, always return error message, not just the rcode.
            Some function were returning the message only if "Ignore Errors" mode was enabled.

2021.03.21
   < released v0.0.24 >

2021.03.18
   - Fixed: Menu "Options": "Reparse EDID buffer" and "AssembleEDID" options are disabled until
            EDID data is loaded/imported.
   - Fixed: (BUG::regression) wxEDID_Frame::CreateBlockTree(): the BlockTree was not expanded automatically
            when opened file contains only the base EDID block (no extensions).
   - Added: wxEDID_Frame::ImportEDID_hex(): report source file byte offset if conversion fails.

2021.03.17
   - Fixed: wxEDID_Frame::UpdateDataGrid(): missing auto-resizing of row labels width:
            BlkDataGrid->SetRowLabelSize(wxGRID_AUTOSIZE).
   - Fixed: (old mislooked BUG): STI: Standard Timing Information: NU flag was not set for unused fields.
   - Fixed: (BUG::regression): edi_grp_cl::init_fields(): a call to FieldsAr.Empty() is necessary for
            ForcedGroupRefresh() functions.
   - Added: VID: Video Input Descriptor: support for field definitions introduced in EDID v1.4

2021.03.16
   - Change: EDID base block: UNK: Unknown Descriptor, unk_cl::init(): insert unknown byte fields instead of
             single byte string (easier to view and edit).

2021.03.14
   - Change: EDID_class.h: CEA-specific classes moved to dedicated headers: CEA_class.h, CEA_EXT_class.h
   - Change: EDID_class.h: shared declarations moved to EDID_shared.h

2021.03.13
   < released v0.0.23 >
   - Update: manpage: added new cmd line options.
   - Fixed: BlkDataGrid: don't use fixed Row/Column sizes: problems on HDPI (thanks to Jat).

2021.03.12
   - Added: wxEDID_App::CmdLineArgs() new cmd line switches: -e --ignore-errors, -w --all-writeable.
   - Change: wxEDID_App::CmdLineArgs(): now uses wxCmdLineParser.
   - Added: wxEDID_Frame::BlkTreeUpdateGrp() try to restore sub-group selection.
   - Added: BlockTree context menu: "Reparse Group": reparse single group (root groups only).
            This allows to re-interpret the group f.e. after manual editing of "unknown" bytes.
   - Added: cea_sad_cl::byte2_afc2_8: EDID_cl::SAD_BitRate(): handling values of bitrate in 8kHz units.
   - Added: Data Grid: option for showing field details: base offset, shift and size.
            Added: menu "Options"->"Block Data: show field details"
            Added: config.b_dta_grid_details
   - Cleanup: wxEDID_Frame::evt_About(): removed build date and time.
   - Fixed: (BUG in GCC v8.3.0): broken array bounds checking with optimizations enabled, f.e:
            "src/CEA_EXT_class.cpp:1512:13: warning: ‘void* memcpy(void*, const void*, size_t)’
             forming offset [49, 560] is out of the bounds [0, 48] of object ‘slocd_cl::SLOCD_subg’
             with type ‘const subgrp_dsc_t’ {aka ‘const subgrp_dsc_s’} [-Warray-bounds]"
            Disabled diagnostic for [-Warray-bounds] in CEA_EXT_class.cpp

2021.03.11
   - Fixed: (BUG) IFDB::VSIFD: incorrect offset for ieee_id field.
   - Added: IFDB: edi_grp_cl::IFDB_Init_SubGrp(): shared init function for sub-groups.

2021.03.10
   - Fixed: Y24C: incorrect total data length: missing DBC header
   - Fixed: (BUG::LEAK): GroupAr_cl: Delete()/Paste(): call Detach() then delete the object: RemoveAt() only removes
            the pointer.
   - Cleanup: All data group classes: removed dummy ctors & dtors.

2021.03.09
   - Fixed: removed ForceRefresh (EF_FGR) flag from unknown byte.
   - Fixed: HDRD: fixed field descriptions, fixed min/max values for mtd_ver and resvd47.
   - Added: Support for manual editing of DBC block length and Tag Codes:
            SLDB, VDDD, IFDB, HDRD (+ metadata length)

2021.03.07
   - Change: wxEDID_Frame::DTD_Ctor_WriteInt() and WriteField(): log old field values.
   - Added: New field flag: EF_INIT: forced re-initialization of the group.
            Flag name is "FR", same as for Forced Group Refresh.

2021.03.06
   - Added: Support for manual editing of DBC block length and Tag Codes:
            SAB, VDTC, VSD, UNK-TC, VCDB, HDRS, CLDB, VSVD, VSAD, VFPD,
            Editing group trees:
            ADB, VDB, RMCD
   - Change: Y42C: removed cea_y42c_cl::gen_data_layout(): no longer needed.
   - Added: Y42C, SLOCD: support for handling invalid block lengths.
   - Fixed: (BUG) SLOCD fields: incorrect offset for channel index byte.

2021.03.04
   - Fixed: (BUG) RMCD: several bugs in field offsets, incorrect max values.
   - Change: CEA_BlkHdr_fields[]: removed EF_FGR flags: dedicated handlers are used.
   - Cleanup: All group classes: removed redundant definitions of ForcedGroupRefresh().
   - Added: edi_grp_cl::base_DBC_Init_FlatGrp(): update field offsets if TG_FLEX_OFFS flag is set in group descriptor.

2021.03.03
   - Change: edi_grp_cl::base_clone() return also the rcode for reporting errors.
            Non-critical errors can be now ignored.

2021.02.28
   - Added: Auto-reparse DBC group on Tag Code/Extended Tag Code change.
   - Added: CEA-DBC header: (Extended) Tag Code selector menus.
   - Fixed: (BUG) SAB: Speaker Allocation Block: used ID_VSD as typeID, instead of (missing) ID_SAB.

2021.02.27
   - Added: Dynamic data layout support for groups: ADB, VDB, VSD, SAB.
   - Added: Checking free space after manual editing of DBC block length.
   - Fixed: BlockTree menu: show group free space if no subgroups are present.
   - Fixed: BlockTree menu: show info about free space even if there's no source block available.
   - Fixed: (partially): VSD: dynamic data layout, depending on block length (currently only 00-0C-03 ID is supported)

2021.02.26
   - Added: New data group cea_unkdat_cl: UNK-DAT Unknown Data bytes, used as a subgroup for representing
            undefined bytes.
   - Change: CreateBlockTree(): only main EDID blocks are automatically expanded (data sub-groups are not).

2021.02.25
   - Fixed: VID: Video Input Descriptor fields were referencing EDID buffer instead local instance data.

2021.02.24
   - Added: Saving/restoring AUI layout, window position and size.
            NOTE: changed token delimiters, old cfg files have to be re-created.
   - Cleanup: EDID_cl:: all field handlers: removed redundant checking for NULL instance ptr, which is
            checked by the callers: wxEDID_Frame:: WriteField(), UpdateDataGridRow().

2021.02.23
   - Added: BlockTree context menu: display additional details in a sub-menu:
            abs/relative offsets and block/group free space.
   - Change: DTD panel: increased H-size of pix_clk and V-refresh controls - big values didn't fit.
             txc_hfreq: reduced fractional part accuracy to 2 digits, to fit the control size.

2021.02.21
   - Added: EDID_cl::AssembleEDID(): update block length in DBC headers.
            This means that manual changes to the block length are ignored ->
            only insert/delete/cut operations can change the block size.
   - Fixed: InsertInto() could insert 32th DBC byte: blk_len overflow.
            CanInsInto(): missing checking of sub-group free space

2021.02.19
   - Added: BlockTree context menu: "Insert Into": insert subgroup @idx == 0.
   - Change: BlockTree: blocked auto-repeating of all keys except up/down arrows.

2021.02.16
   - Added: BlockTree key bindings for Copy/Paste/Cut/Move(Up/Down)
   - Added: Log operations: Copy/Paste/Delete/Cut/Insert(Up/Down)/Move(Up/Down)

2021.02.15
   - Change: All T_EDID_FIXED data groups are now operating on local data buffers.
            Reparse() restores the loaded EDID state, reverting all the changes - unless
            AssembleEDID() or Save/Export is executed. From this point Reparse() restores the
            saved/assembled state.
   - Change: Menu Options->"Recalc Checksum" changed to "Assemble EDID"

2021.02.12
   - Added: CanPaste/CanInsert: checking parent block free space.
   - Added: wxEDID_Frame::ClearAll(): clear edigrp_src ptr and change mnu_BlkTree info item to miInfoNOK.
   - Change: wxEDID_Frame::ClearAll(): clear BlockTree, so if Re-OpenEDID() fails, the tree stays empty.
   - Fixed: Calc. relative offsets of top level data groups (relative to the begin of EDID blocks)
   - Fixed: groups which have subgroups must call subgroups.CalcDataSZ() on init().
   - Change: EDID_cl::ParseEDID_CEA(): search DTDs after DBC end, not at declared DTD offset

2021.02.10
   - Added: DBC_GrpAr_cl: paste/insert/move methods specialized for DBC.
   - Added: EDID_cl::AssembleEDID()->CEA_Set_DTD_Offset(): check & update DTD offset in CEA block.
   - Added: edi_grp_cl::CodeName: code name is now separated from GroupName.

2021.02.05
   - Added: DBC_GrpAr_cl: array of DBC sub-groups.

2021.02.04
   - Cleanup: edi_grp_cl::init(): removed redundant checks for null instance ptr in derived classes.
   - Added: edi_grp_cl::parent_grp: parent group pointer: needed to update group data size after inserting/deleting
            of sub-groups.

2021.02.03
   - Fixed: (BUG) EDID_cl::ParseEDID_CEA(): checking of padding bytes after last DTD did not allow to ignore
            errors (bad rcode on exit).
   - Added: GroupAr_cl: specialized derived classes: EDID_GrpAr_cl and CEA_GrpAr_cl: block-specific
            implementations of paste/insert/move methods.

2021.02.02
   - Added: Basic copy/paste functionality for blocks of the same type.

2021.02.01
   - Added: Subgroups have the same type ID as parent groups + T_DBC_SUBGRP flag.
   - Change: Remapped group IDs, so subgroups IDs can be individually masked.

2021.01.31
   - Added: New array class for holding EDID groups: GroupAr_cl: implements the copy/paste/move operations.

2021.01.28
   - Added: Clone() method for all data classes which can be copied.

2021.01.26
   - Added: wxEDID_Frame::evt_blktree_rmb(): handler for RMB actions.
   - Added: wxEDID_Frame::mnu_BlkTree: RMB menu for selecting block actions.

2021.01.25
   - Fixed: (BUG) VSD: Vendor Specific Data Block: cea_vsd_cl::init() display unspecified payload data
            as unknown bytes (previously ignored).
   - Added: EDID_cl::AssembleEDID(): copy local data from movable blocks back to the main EDID buffer.

2021.01.22
   - Fixed: (BUG::typo) HDRD: HDR Dynamic Metadata Data Block: incorrect pointer used to read HDRD metadata
            lenght: base DBC pointer (inst) used instead of p_mtd.
   - Update: rcd_autogen v2.3
   - Change: CEA_class.cpp: all blocks (excluding the CEA_header) are now using edi_grp_cl::CopyInstData()
            to create local data instances.
   - Added: Sub-group type ID: T_DBC_FIXED: fixed within DBC, instance data held in local buffer.

2021.01.21
   - Fixed: CEA header: corrected description of dtd_offs field.
   - Added: Block type ID: T_EDID_FIXED: fixed, single instance block. Instance data held in EDID buffer.
            Blocks without the flag set will keep instance data in local buffers.
   - Change: Base EDID block: movable blocks are now using edi_grp_cl::CopyInstData() to create local
            data instances.

2021.01.07
   < released v0.0.22 >
   - Fixed: (BUG) (Thanks to Matthew Evanson): EDID_cl::ParseEDID_CEA(): the number of included DTDs
            can be greater than the number of mandatory *native* DTDs specified in cea_hdr_t.info_blk.num_dtd.
            Those additional DTDs were silently ignored in previous wxEDID versions.
            Additionally, the padding area after last DTD is now checked (all bytes have to be zeroed).

2021.01.06
   - Fixed: Desription of cea_hdr_t.info_blk.num_dtd field: it should be explicitly stated,
            that this is a number of *native* DTDs, and not the total number of DTDs in the CEA block.

2020.12.01
   - Fixed: manpage: corrected description of the [-t|--text] option.
   - Fixed: wxEDID_App::CmdLineArgs(): using  wxLogStderr for printing messages to stderr.
   - Fixed: EDID_cl::ParseDetDtor(): error msg needs EDID block number, passed by the caller.
   - Change: wxEDID_Frame::SaveRep_SubGrps(): export offset values in both decimal and hex format.

2020.11.30
   - Update: rcode.h v1.1.0, rcd_autogen v2.1
   - Fixed: all references to GPLv3 replaced with GPLv3+ , to match the declarations in COPYING.
   - Change: single top-level makefile.am
   - Fixed: makefile.am: strict control of what goes to the 'dist' target.
   - Fixed: don't distribute src/config.h -> this requires a workaround in wxEDID_Main.h, i.e. defining
            dummy VERSION symbol when rcd_autogen is running.

2020.11.25
   - Added: man/wxedid.1 manpage written by Felix Lechner.

2020.11.22
   - Fixed: (BUG) EDID_cl::VSD_ltncy(): unsupported IEEE-OUI codes: don't overflow
            if the latency value is zero: mark the field as unused.
            Added EF_FGR flags: editing the latency value removes "unused" flag.
   - Fixed: (BUG) cea_vsd_cl::fields[] max latency value is 500ms, not 251=(500/2)+1.
   - Change: cea_vsd_cl::fields[]: Latency: Added info about 2ms granularity of values.
   - Change: cea_vsd_cl: Updated group description (new IEEE-OUI codes).

2020.11.20
   - Update: rcode v1.0.4

2020.09.06
   - Update: rcd_autogen updated to v1.4

2020.07.12
   < released v0.0.21 >

2020.07.10
   - Fixed: (BUG): BlockTree: root node was not showing EDID file name if the file path was provided
            as a cmd line argument (both binary and --text).

2020.06.12
   - Fixed: (BUG) cea_hdrs_cl::init(): Incorrect min size for "HDR Static Metadata Data Block"
            (TagCode=7, ExtTagCode=6): the min. block size is 3, not 6 bytes.
            Fields for bytes 4..6 are marked as unused, depending on the block size.
   - Fixed: (BUG) cea_hdrs_cl: incorrect bitfield definitions for reserved fields: "ET6-7" & "SM1-7"
   - Fixed: Wrong evt ID for importing HEX-text EDID from cmd line arg: should be id_mnu_imphex, not id_mnu_exphex.

2020.06.05
   - Fixed: (Regression) if config file doen't exist, the config.b_dtd_keep_aspect is set to OFF,
            but by default it should be set to ON.

2020.06.04
   < released v0.0.20 >
   - Added: Loading/Importing EDID files from path passed as cmd line argument.
   - Added: Save settings: last used directory + last opened file, dtd_keep_aspect_ratio

2020.06.03
   - Fixed: (BUG) cea_y42c_cl::gen_data_layout() never tested: buggy code, memory corruption.
            Program crash if EDID data contains "YCBCR 4:2:0 Capability Map Data Block"
            (TagCode=7, ExtTagCode=15)
   - Change: lower-case name for the final executable: wxEDID -> wxedid.

2020.01.02
   < released v0.0.19 >
   - Fixed: (BUG::old) evt_blktree_sel(): the cell editor must be closed before switching to newly selected
            data block. Otherwise the cell editor can be "orphaned" and its window stays opened until
            another cell editor is activated. This problem was visible only when the cell editor was activated
            from Value Selector Menu event and if evt_blktree_sel() was invoked with opened cell editor.
   - Fixed: (BUG::regression) EDID_cl::ProdWk(): wxString::operator<<() requires type casting to <int>
            when appending a byte -> otherwise <u8_t> is interpreted as <char>
   - Fixed: (BUG::regression) menu Options::"Ignore EDID errors" must be always enabled, because
            otherwise the option will be unavailable until a valid EDID structure is loaded.
   - Added: Menu Help::Flags & Types: info about flags displayed in the block data grid.

2019.12.30
   - Update: rcode v1.0.3, added support for rcd_autogen v1.3.
            Updated build scripts and codeblocks project.
   - Fixed: (BUG) SLDB: Speaker Location Data Block must handle multiple Speaker Location Descriptors (SLOCD)
                  instances - but only 1st SLOCD was processed.
   - Added: CEA-DBC: basic checks of data block lengths.

2019.12.29
   - Fixed: Menu Options::"Ignore EDID Errors": now most of the errors can be ignored, including
            errors in CEA/CTA-861 extension block
   - Added: (CEA) UNK-ET: Unknown Data Block (Extended Tag Code)
   - Added: (CEA) UNK-TC: Unknown Data Block (Tag Code)
   - Added: flags: EF_BYTE, EF_DM (decimeters unit for RMCD: Room Configuration Data Block).
            Updated all field descriptors.
   - Change: All EDID data classes: .Name and .Desc fields: changed type from wxString to char[].

2019.12.28
   - Added: IFDB: InfoFrame Data Block

2019.12.23
   - Fixed: removed unused function EDID_cl::del_groups()

2019.12.22
   - Added: CEA-SLDB: Speaker Location Data Block
   - Added: CEA-RMCD: Room Configuration Data Block
   - Added: CEA-Y42C: YCBCR 4:2:0 Capability Map Data Block
   - Added: CEA-Y42V: YCBCR 4:2:0 Video Data Block
   - Added: CEA-VFPD: Video Format Preference Data Block

2019.12.21
   - Added: CEA-HDRD: HDR Dynamic Metadata Data Block
   - Added: CEA-HDRS: HDR Static Metadata Data Block
   - Added: CEA-CLDB: Colorimetry Data Block

2019.12.20
   - Change: CEA-VDDD: VESA Display Device Data Block: split into 5 subgroups.

2019.12.19
   - Added: CEA-VDDD: VESA Display Device Data Block (VESA DDDB Standard, Version 1; September 25, 2006).

2019.12.18
   - Added: CEA-VSAD: Vendor-Specific Audio Data Block.
   - Added: CEA-VSVD: Vendor-Specific Video Data Block.
   - Added: CEA-VCDB: Video Capability Data Block.
   - Added: Support for CEA-DBC Extended Tag Codes.
   - Added: CEA-VDTC: VESA Display Transfer Characteristic data block (gamma).
            The data format is the same as in EDID block 0, byte 23.

2019.12.17
   - Fixed: VID: analog input: vsync field (bit) description. (should be analog, not digital).
   - Added: VID: variable data layout and a value selector menu for analog/digital input type.
   - Added: SVD: Video ID Codes (VICs) 64..219 added to the value selector menu.
   - Added: SVD: support for 8-bit VIC mode (no native bit).
   - Added: SAB: updated/added speaker presence bit definitions for (formerly reserved) bytes 2 & 3 (offset 1 & 2).

2019.12.16
   - Fixed: (BUG::regression::unknown_date) value selector menu is not triggering EVT_GRID_CELL_CHANGED.
   - Fixed: EDID_cl::BitVal(), BitF8Val(), ByteVal(): strict checking of write opcode value (return error if incorrect)
   - Added: cea_sad_cl::gen_data_layout(): support for variable data layouts in ADB::SAD.
            The Block Data grid is automatically updated when a value with EF_FGR flag set is changed
            (forced group refresh).
   - Change: Added def_types.h: short definitions of common int types.

2019.12.14
   - Added: SAD: variable data layout: full support for CEA/CTA-861-G
   - Fixed: #include <wx/arrimpl.cpp> before each WX_DEFINE_OBJARRAY.
            Not really needed, but recommended in wxWidgets docs.

2019.07.23
   - Fixed: DTD_Constructor: txc_vtotal: (gtk2) BG color should be greyed, not white (not editable).
   - Fixed: dtd_screen_cl: removed unused wxRect rcDC, introduced in v0.0.18

2019.07.22
   < released v0.0.18 >
   - Fixed: gcc v8.x:
            wxEvtHandler::Connect()/Disconnect(): Warning of type mismatch for event handler functions casted using
            "wxObjectEventFunction" {aka ‘void (wxEvtHandler::*)(wxEvent&)’}, due to argument type mismatch.
            Warnings silenced by disabling GCC diagnostic "-Wcast-function-type".
   - Fixed: Removed unused "Hex View" menu item.
   - Added: Menu Options: "DTD preview: keep aspect ratio": keep aspect ratio of the DTD preview screen.
   - Added: DTD_Constructor: active screen area size is now displayed on the DTD screen preview.
            H/V borders are excluded from active area.
   - Fixed: (BUG) configure script: symbols stripping in release build didn't work.

2019.07.21
   - Cleanup: All the constructs {RCD_SET_FAULT(); return <rcode>;} replaced with RCD_RETURN_FAULT().
   - Cleanup: All the constructs {RCD_SET_OK(); return <rcode>;} replaced with RCD_RETURN_OK().
   - Cleanup: dtd_screen_cl::calc_coords use single precision float type for calculations.

2019.07.20
   - Fixed: fixed few help texts for Info Panel: VSD, SAB, SAD.num_ch,

2018.12.22
   < released v0.0.17 >
   - Fixed: (BUG::wxSmith) Menu "Quit" and "About" handlers were connected dynamically in the frame
            constructor, even though they were already present in the static event table.
   - Change: Increased default Log Window size from 400x300 to 500x400.

2018.12.20
   - Fixed: Options menu: all menu items except "Log window" should stay disabled until edid data
            is loaded/imported.
   - Change: UpdateEDItree() renamed to CreateBlockTree()
   - Change: All panels & controls are now using default system font instead of fixed one.

2018.12.19
   - Update: new versions of event table macros:
            wxDECLARE_EVENT_TABLE, wxBEGIN_EVENT_TABLE, wxEND_EVENT_TABLE.

2018.12.01
   < released v0.0.16 >
   - Change: Info about packages required to compile the project moved to file INSTALL,
            README file removed.
   - Change: Code::Blocks project files are now included in the dist package.
   - Fixed: DTD panel: dtd_screen: background was erased twice on resize event-> now the refreshing
            is performed in a single call to the paint event.

2018.11.30
   - Change: DTD panel: all the controls are now configured to use default min sizes - this is rather
             a disadvantage, because f.e. the default controls in gtk3 are ridiculously big.
             However, the minimal App frame size is now re-calculated dynamically, basing on the
             min. size reported by the DTD sizer - so this is a more flexible solution.

2018.11.29
   - Added: support for wxWidgets v3.1.x : *experimental*
   - Change: Dropped support for old wxWidgets versions (<3.0.0).
   - Change: Changed proportins of AUI panes.
   - Fixed: wxWidgets v3.1.x wxGrid::SetCellValue(wxString&, int, int) is deprecated, new
            version is wxGrid::SetCellValue(int, int, wxString&)
   - Fixed: wxWidgets v3.1.x: wxEVT_GRID_CELL_CHANGE is no longer supported -> renamed to
            wxEVT_GRID_CELL_CHANGED
   - Fixed: wxEDID_Frame::evt_frame_size() missing call to sizer->Layout() -> quick resizing
            of the frame could cause incorrect placement of child windows on the DTD panel.
   - Update: returncode.h v0.8.11.

2018.11.28
   - Fixed: (BUG::old): DTD_Ctor_WriteInt(): value change event log: missing field names.
            only the first letter of field name was printed due to missing conversion from
            ASCII to wxString.
   - Fixed: (BUG::old): EDID_class.cpp: wxString AltDesc wasn't really initializing the alternative
            descriptors' "Desc" fields. Now the AltDesc is just a char string, and the "Desc" fields
            are properly initialized by calling wxString::FromUTF8(AltDesc).
   - Fixed: DTD_Ctor_WriteInt(), WriteField(): value change event log: print the whole message string
            in a single call to guilog::DoLog() - eliminates printing of multiple timestamps per event.
   - Fixed: Corrected few textual descriptions of EDID fields.
   - Cleanup: removed line continuation marks, as they are not really needed for any modern compiler.

2018.01.07
   - Update: returncode.h v0.8.9.

2017.11.27
   < released v0.0.15 >
   - Fixed: (BUG) RCD_RETURN_FALSE() returns RCD_TRUE! (unknown origin of regression!)
            No influence on the behaviour of the program code - just an update.

2017.10.30
   < released v0.0.14 >
   - Update: guilog.h v0.2
   - Fixed: Info panel: BG & FG colors were theme-dependent, what could make the panel look
            "ugly" or even completely unreadable. Now the FG is forced to black and the BG is
            white.
   - Added: README: info about packages required to compile the project (Debian-based distros)

2017.09.18
   - Update: returncode.h v0.8.6

2017.09.10
   - Fixed: Info string: incorrect value for VBOX descriptor type: should be 0x10, not 0x0A.

2017.09.08
   - Update: returncode.h v0.8.5

2017.09.05
   < released v0.0.13 >
   - Fixed: (GCC 6.x): silenced some warnings (false-positives) regarding "possibly
            uninitialized variables" in EDID_class.cpp
   - Fixed: (GCC 6.x, C11 mode): wxEDID_Main.h: C11 requires a space between literal
            and string macro [-Wliteral-suffix].
   - Update: returncode.h v0.8.3

2016.06.17
   < released v0.0.12 >
   - Change: Entire wxEDID GUI switched to wxAUI.
   - Change: all menu events are now statically compiled-in.
   - Update: (wxWidgets 3.x) new version of wxwin.m4: wxAUI needs updated macros
             for linking.

2016.06.11
   < released v0.0.11 >
   - TEST:  compilation against wxWidgets 3.x: works (wxWidgets 3.0.2)
   - Update: returncode.h v0.8.0
   - Fixed: Constant font size for all windows.
   - Fixed: (BUG): uninitialized rcode returned in DTD_Ctor_read_all() in case when
            DTD_Ctor_read_field() fails.
   - Fixed: (wxWidgets 3.x): assertion failure: wxFlexGridSizer fgs_dtd_bottom:
            incorrect number of rows.

2015.09.09
   < released v0.0.10 >
   - Update: ancient returncode.h (v0.3.5) updated to v0.6.9.
   - Fixed: v0.0.9 version was still displaying v0.0.8 in GUI::About
   - Fixed: added -fno-exceptions to default build flags: the project is not using
            exceptions: waste of resources.
   - Fixed: build script was improperly setting the build flags.

2015.05.07
   < released v0.0.9 >
   - Fixed: (BUG) (thanks to *gilles-b*):
            EDID_class.cpp:EDID_cl::MfcId -> clearing of reserved bit after swapping
            mfc_id damages the mfc id string.

2014.06.12
   < released v0.0.8 >
   - Fixed: cea_adb_cl::init() all SAD instances are referencing data from SAD instance 0:
            missing data pointer incrementation.
   - Fixed: DTD_Ctor_Recalc() returns uninitialized rcode.
   - Fixed: Reparse(): force number of valid edid blocks if "Ignore EDID Errors" is enabled.
            This allows to export faulty blocks, which are otherwise dropped.

2014.06.11
   < released v0.0.7 >
   - Added: CEA-861 support (as first extension block)
   - Added: Value selector menu: some CEA-861 fields contains indexes, not actual values.
   - Fixed: import/export/load/save functions are now aware of extensions.
   - Added: Menu Options: Ignore EDID Errors -> allows to ignore minor EDID erros and to view the
            data anyway.
   - Added: Menu Options: Recalc Checksum
   - Fixed: DTD "virtual" screen is resized on Frame size change.
   - Cleanup: some field handlers replaced with generic functions.

2014.04.23
   < released v0.0.6:
   - Added: X11 ModeLine viewer on DTD constructor panel (quick patch)

2014.04.19
   < released v0.0.5 >
   - Added: DTD constructor panel.
   - Change: field handlers can now use uint var as alternative i/o value.
   - Fixed: Disable save/export/save_as menu items until EDID buffer is loaded.
   - Fixed: ParseGroups() didn't checked group init() rcode.
   - Fixed: Bad conversion of mfc_id to PNP_ID (on write, misuse of temporary pointer)
   - Fixed: EDID checksum field handler replaced with generic ByteVal(), which is more type-safe
   - Fixed: EDID prod_id field handler: require "0x" prefix for EF_HEX type field.
   - Fixed: descriptions and order of some fields: some descrptions were still buggy and fields
            order was not necessarily readable.
   - Cleanup: removed unused fn rdUByte() and wrUByte()

2014.04.09
   < released v0.0.4 >
   - Fixed: memory leak in edi_grp_cl - missing destructor, edi_dynfld_t fields
            were not deleted on exit/reparse;
   - Fixed: some fields descriptions were inaccurate or buggy.
   - Added: AST: Additional Standard Timings Descriptor support (it was missing by mistake)

2014.04.08
   - Initial release v0.0.3. Code still needs cleanups and
     there are many features left to implement, but the base
     editor is tested and working.

2014.03.18
   - Project started: GUI code & layout, EDID definitions
