HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
png.hpp
1
2
3#pragma once
4
5#include "TTauri/Foundation/required.hpp"
6#include "TTauri/Foundation/PixelMap.hpp"
7#include "TTauri/Foundation/R16G16B16A16SFloat.hpp"
8#include "TTauri/Foundation/mat.hpp"
9#include "TTauri/Foundation/vec.hpp"
10#include "TTauri/Foundation/ivec.hpp"
11#include "TTauri/Foundation/URL.hpp"
12#include "TTauri/Foundation/ResourceView.hpp"
13#include "TTauri/Foundation/byte_string.hpp"
14#include <nonstd/span>
15#include <vector>
16#include <cstddef>
17#include <cstdint>
18
19namespace tt {
20
21class png {
25 mat color_to_sRGB = mat::I();
26
29 std::vector<float> transfer_function;
30
31 int width = 0;
32 int height = 0;
33 int bit_depth = 0;
34 int color_type = 0;
35 int compression_method = 0;
36 int filter_method = 0;
37 int interlace_method = 0;
38
39 bool has_alpha;
40 bool is_palletted;
41 bool is_color;
42 int samples_per_pixel = 0;
43 int bits_per_pixel = 0;
44 int bytes_per_pixel = 0;
45 int bytes_per_line = 0;
46 int stride = 0;
47
51
55public:
56
57 png(nonstd::span<std::byte const> bytes);
58
60
61 png(URL const &url) :
62 png(url.loadView()) {}
63
64 ivec extent() const noexcept {
65 return ivec{width, height};
66 }
67
68 void decode_image(PixelMap<R16G16B16A16SFloat> &image) const;
69
70 static PixelMap<R16G16B16A16SFloat> load(URL const &url);
71
72private:
73 void read_header(nonstd::span<std::byte const> bytes, ssize_t &offset);
74 void read_chunks(nonstd::span<std::byte const> bytes, ssize_t &offset);
75 void read_IHDR(nonstd::span<std::byte const> bytes);
76 void read_cHRM(nonstd::span<std::byte const> bytes);
77 void read_gAMA(nonstd::span<std::byte const> bytes);
78 void read_iBIT(nonstd::span<std::byte const> bytes);
79 void read_iCCP(nonstd::span<std::byte const> bytes);
80 void read_sRGB(nonstd::span<std::byte const> bytes);
81 void generate_sRGB_transfer_function() noexcept;
82 void generate_Rec2100_transfer_function() noexcept;
83 void generate_gamma_transfer_function(float gamma) noexcept;
84 bstring decompress_IDATs(ssize_t image_data_size) const;
85 void unfilter_lines(bstring &image_data) const;
86 void unfilter_line(nonstd::span<uint8_t> line, nonstd::span<uint8_t const> prev_line) const;
87 void unfilter_line_sub(nonstd::span<uint8_t> line, nonstd::span<uint8_t const> prev_line) const noexcept;
88 void unfilter_line_up(nonstd::span<uint8_t> line, nonstd::span<uint8_t const> prev_line) const noexcept;
89 void unfilter_line_average(nonstd::span<uint8_t> line, nonstd::span<uint8_t const> prev_line) const noexcept;
90 void unfilter_line_paeth(nonstd::span<uint8_t> line, nonstd::span<uint8_t const> prev_line) const noexcept;
91 void data_to_image(bstring bytes, PixelMap<R16G16B16A16SFloat> &image) const noexcept;
92 void data_to_image_line(nonstd::span<std::byte const> bytes, PixelRow<R16G16B16A16SFloat> &row) const noexcept;
93 ivec extract_pixel_from_line(nonstd::span<std::byte const> bytes, int x) const noexcept;
94
95};
96
97}
A 4D vector.
Definition ivec.hpp:37
A 4x4 matrix.
Definition mat.hpp:18
static mat I() noexcept
Create an identity matrix.
Definition mat.hpp:482
A 2D canvas of pixels.
Definition PixelMap.hpp:83
A row of pixels.
Definition PixelMap.hpp:18
Definition png.hpp:21
Definition URL.hpp:45
std::unique_ptr< ResourceView > loadView() const
Load a resource.