PNGShared.h 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /*
  2. * Copyright (c) 2022, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Array.h>
  8. #include <AK/SIMD.h>
  9. namespace Gfx::PNG {
  10. // https://www.w3.org/TR/PNG/#5PNG-file-signature
  11. static constexpr Array<u8, 8> header = { 0x89, 'P', 'N', 'G', 13, 10, 26, 10 };
  12. // https://www.w3.org/TR/PNG/#6Colour-values
  13. enum class ColorType : u8 {
  14. Greyscale = 0,
  15. Truecolor = 2, // RGB
  16. IndexedColor = 3,
  17. GreyscaleWithAlpha = 4,
  18. TruecolorWithAlpha = 6,
  19. };
  20. // https://www.w3.org/TR/PNG/#9Filter-types
  21. enum class FilterType : u8 {
  22. None,
  23. Sub,
  24. Up,
  25. Average,
  26. Paeth,
  27. };
  28. // https://www.w3.org/TR/PNG/#9Filter-type-4-Paeth
  29. ALWAYS_INLINE u8 paeth_predictor(u8 a, u8 b, u8 c)
  30. {
  31. int p = a + b - c;
  32. int pa = AK::abs(p - a);
  33. int pb = AK::abs(p - b);
  34. int pc = AK::abs(p - c);
  35. if (pa <= pb && pa <= pc)
  36. return a;
  37. if (pb <= pc)
  38. return b;
  39. return c;
  40. }
  41. ALWAYS_INLINE AK::SIMD::u8x4 paeth_predictor(AK::SIMD::u8x4 a, AK::SIMD::u8x4 b, AK::SIMD::u8x4 c)
  42. {
  43. return AK::SIMD::u8x4 {
  44. paeth_predictor(a[0], b[0], c[0]),
  45. paeth_predictor(a[1], b[1], c[1]),
  46. paeth_predictor(a[2], b[2], c[2]),
  47. paeth_predictor(a[3], b[3], c[3]),
  48. };
  49. }
  50. };