ImageFormat.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /*
  2. * Copyright (c) 2021, Stephan Unverwerth <s.unverwerth@serenityos.org>
  3. * Copyright (c) 2022, Jelle Raaijmakers <jelle@gmta.nl>
  4. * Copyright (c) 2022, the SerenityOS developers.
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #pragma once
  9. #include <AK/Array.h>
  10. namespace GPU {
  11. // The pixel data's representation
  12. enum class PixelFormat {
  13. Alpha,
  14. BGR,
  15. BGRA,
  16. Blue,
  17. ColorIndex,
  18. DepthComponent,
  19. Green,
  20. Intensity,
  21. Luminance,
  22. LuminanceAlpha,
  23. Red,
  24. RGB,
  25. RGBA,
  26. StencilIndex,
  27. };
  28. // Bit width assigned to individual components within a single pixel's value
  29. enum class PixelComponentBits {
  30. AllBits,
  31. B1_5_5_5,
  32. B2_3_3,
  33. B2_10_10_10,
  34. B3_3_2,
  35. B4_4_4_4,
  36. B5_5_5_1,
  37. B5_6_5,
  38. B8_8_8_8,
  39. B10_10_10_2,
  40. };
  41. // The base data type used as pixel storage
  42. enum class PixelDataType {
  43. Bitmap,
  44. Byte,
  45. Float,
  46. HalfFloat,
  47. Int,
  48. Short,
  49. UnsignedByte,
  50. UnsignedInt,
  51. UnsignedShort,
  52. };
  53. // Order of components within a single pixel
  54. enum class ComponentsOrder {
  55. Normal,
  56. Reversed,
  57. };
  58. struct PixelType final {
  59. PixelFormat format;
  60. PixelComponentBits bits;
  61. PixelDataType data_type;
  62. ComponentsOrder components_order { ComponentsOrder::Normal };
  63. };
  64. static constexpr int number_of_components(PixelFormat format)
  65. {
  66. switch (format) {
  67. case PixelFormat::Alpha:
  68. case PixelFormat::Blue:
  69. case PixelFormat::ColorIndex:
  70. case PixelFormat::DepthComponent:
  71. case PixelFormat::Green:
  72. case PixelFormat::Intensity:
  73. case PixelFormat::Luminance:
  74. case PixelFormat::Red:
  75. case PixelFormat::StencilIndex:
  76. return 1;
  77. case PixelFormat::LuminanceAlpha:
  78. return 2;
  79. case PixelFormat::BGR:
  80. case PixelFormat::RGB:
  81. return 3;
  82. case PixelFormat::BGRA:
  83. case PixelFormat::RGBA:
  84. return 4;
  85. }
  86. VERIFY_NOT_REACHED();
  87. }
  88. static constexpr int number_of_components(PixelComponentBits bits)
  89. {
  90. switch (bits) {
  91. case PixelComponentBits::AllBits:
  92. return 1;
  93. case PixelComponentBits::B2_3_3:
  94. case PixelComponentBits::B3_3_2:
  95. case PixelComponentBits::B5_6_5:
  96. return 3;
  97. case PixelComponentBits::B1_5_5_5:
  98. case PixelComponentBits::B2_10_10_10:
  99. case PixelComponentBits::B4_4_4_4:
  100. case PixelComponentBits::B5_5_5_1:
  101. case PixelComponentBits::B8_8_8_8:
  102. case PixelComponentBits::B10_10_10_2:
  103. return 4;
  104. }
  105. VERIFY_NOT_REACHED();
  106. }
  107. static constexpr Array<u8, 4> pixel_component_bitfield_lengths(PixelComponentBits bits)
  108. {
  109. switch (bits) {
  110. case PixelComponentBits::AllBits:
  111. VERIFY_NOT_REACHED();
  112. case PixelComponentBits::B1_5_5_5:
  113. return { 1, 5, 5, 5 };
  114. case PixelComponentBits::B2_3_3:
  115. return { 2, 3, 3 };
  116. case PixelComponentBits::B2_10_10_10:
  117. return { 2, 10, 10, 10 };
  118. case PixelComponentBits::B3_3_2:
  119. return { 3, 3, 2 };
  120. case PixelComponentBits::B4_4_4_4:
  121. return { 4, 4, 4, 4 };
  122. case PixelComponentBits::B5_5_5_1:
  123. return { 5, 5, 5, 1 };
  124. case PixelComponentBits::B5_6_5:
  125. return { 5, 6, 5 };
  126. case PixelComponentBits::B8_8_8_8:
  127. return { 8, 8, 8, 8 };
  128. case PixelComponentBits::B10_10_10_2:
  129. return { 10, 10, 10, 2 };
  130. }
  131. VERIFY_NOT_REACHED();
  132. }
  133. static constexpr size_t pixel_data_type_size_in_bytes(PixelDataType data_type)
  134. {
  135. switch (data_type) {
  136. case PixelDataType::Bitmap:
  137. return sizeof(u8);
  138. case PixelDataType::Byte:
  139. return sizeof(u8);
  140. case PixelDataType::Float:
  141. return sizeof(float);
  142. case PixelDataType::HalfFloat:
  143. return sizeof(float) / 2;
  144. case PixelDataType::Int:
  145. return sizeof(i32);
  146. case PixelDataType::Short:
  147. return sizeof(i16);
  148. case PixelDataType::UnsignedByte:
  149. return sizeof(u8);
  150. case PixelDataType::UnsignedInt:
  151. return sizeof(u32);
  152. case PixelDataType::UnsignedShort:
  153. return sizeof(u16);
  154. }
  155. VERIFY_NOT_REACHED();
  156. }
  157. static constexpr u8 pixel_size_in_bytes(PixelType pixel_type)
  158. {
  159. auto component_size_in_bytes = pixel_data_type_size_in_bytes(pixel_type.data_type);
  160. if (pixel_type.bits == PixelComponentBits::AllBits)
  161. return component_size_in_bytes * number_of_components(pixel_type.format);
  162. return component_size_in_bytes;
  163. }
  164. }