BinaryFormat.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright (c) 2023, Nico Weber <thakis@chromium.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Endian.h>
  8. #include <LibGfx/ICC/DistinctFourCC.h>
  9. #include <LibGfx/ICC/Profile.h>
  10. #include <LibGfx/ICC/TagTypes.h>
  11. namespace Gfx::ICC {
  12. // ICC V4, 4.2 dateTimeNumber
  13. // "All the dateTimeNumber values in a profile shall be in Coordinated Universal Time [...]."
  14. struct DateTimeNumber {
  15. BigEndian<u16> year;
  16. BigEndian<u16> month;
  17. BigEndian<u16> day;
  18. BigEndian<u16> hours;
  19. BigEndian<u16> minutes;
  20. BigEndian<u16> seconds;
  21. };
  22. // ICC V4, 4.6 s15Fixed16Number
  23. using s15Fixed16Number = i32;
  24. // ICC V4, 4.7 u16Fixed16Number
  25. using u16Fixed16Number = u32;
  26. // ICC V4, 4.14 XYZNumber
  27. struct XYZNumber {
  28. BigEndian<s15Fixed16Number> x;
  29. BigEndian<s15Fixed16Number> y;
  30. BigEndian<s15Fixed16Number> z;
  31. operator XYZ() const
  32. {
  33. return XYZ { x / (double)0x1'0000, y / (double)0x1'0000, z / (double)0x1'0000 };
  34. }
  35. };
  36. // ICC V4, 7.2 Profile header
  37. struct ICCHeader {
  38. BigEndian<u32> profile_size;
  39. BigEndian<PreferredCMMType> preferred_cmm_type;
  40. u8 profile_version_major;
  41. u8 profile_version_minor_bugfix;
  42. BigEndian<u16> profile_version_zero;
  43. BigEndian<DeviceClass> profile_device_class;
  44. BigEndian<ColorSpace> data_color_space;
  45. BigEndian<ColorSpace> profile_connection_space; // "PCS" in the spec.
  46. DateTimeNumber profile_creation_time;
  47. BigEndian<u32> profile_file_signature;
  48. BigEndian<PrimaryPlatform> primary_platform;
  49. BigEndian<u32> profile_flags;
  50. BigEndian<DeviceManufacturer> device_manufacturer;
  51. BigEndian<DeviceModel> device_model;
  52. BigEndian<u64> device_attributes;
  53. BigEndian<u32> rendering_intent;
  54. XYZNumber pcs_illuminant;
  55. BigEndian<Creator> profile_creator;
  56. u8 profile_id[16];
  57. u8 reserved[28];
  58. };
  59. static_assert(AssertSize<ICCHeader, 128>());
  60. // Common bits of ICC v4, Table 40 — lut16Type encoding and Table 44 — lut8Type encoding
  61. struct LUTHeader {
  62. u8 number_of_input_channels;
  63. u8 number_of_output_channels;
  64. u8 number_of_clut_grid_points;
  65. u8 reserved_for_padding;
  66. BigEndian<s15Fixed16Number> e_parameters[9];
  67. };
  68. static_assert(AssertSize<LUTHeader, 40>());
  69. // Common bits of ICC v4, Table 45 — lutAToBType encoding and Table 47 — lutBToAType encoding
  70. struct AdvancedLUTHeader {
  71. u8 number_of_input_channels;
  72. u8 number_of_output_channels;
  73. BigEndian<u16> reserved_for_padding;
  74. BigEndian<u32> offset_to_b_curves;
  75. BigEndian<u32> offset_to_matrix;
  76. BigEndian<u32> offset_to_m_curves;
  77. BigEndian<u32> offset_to_clut;
  78. BigEndian<u32> offset_to_a_curves;
  79. };
  80. static_assert(AssertSize<AdvancedLUTHeader, 24>());
  81. // ICC v4, Table 46 — lutAToBType CLUT encoding
  82. // ICC v4, Table 48 — lutBToAType CLUT encoding
  83. // (They're identical.)
  84. struct CLUTHeader {
  85. u8 number_of_grid_points_in_dimension[16];
  86. u8 precision_of_data_elements; // 1 for u8 entries, 2 for u16 entries.
  87. u8 reserved_for_padding[3];
  88. };
  89. static_assert(AssertSize<CLUTHeader, 20>());
  90. }