summaryrefslogtreecommitdiff
path: root/thirdparty/basis_universal/encoder/pvpngreader.h
blob: 4f3fe46b82fe5039d0ca6e2dfa1f8f95fa731b9b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// pngreader.h - Public Domain - see unlicense at bottom of pvpngreader.cpp
#pragma once
#include <stdint.h>

namespace pv_png
{
	// PNG color types
	enum
	{
		PNG_COLOR_TYPE_GREYSCALE = 0,
		PNG_COLOR_TYPE_TRUECOLOR = 2,
		PNG_COLOR_TYPE_PALETTIZED = 3,
		PNG_COLOR_TYPE_GREYSCALE_ALPHA = 4,
		PNG_COLOR_TYPE_TRUECOLOR_ALPHA = 6
	};

	// PNG file description
	struct png_info
	{
		uint32_t m_width;
		uint32_t m_height;
				
		uint32_t m_num_chans;	// The number of channels, factoring in transparency. Ranges from [1-4].

		uint32_t m_bit_depth;	// PNG ihdr bit depth: 1, 2, 4, 8 or 16
		uint32_t m_color_type;	// PNG ihdr color type, PNG_COLOR_TYPE_GRAYSCALE etc.

		bool m_has_gamma;		// true if the PNG file had a GAMA chunk
		uint32_t m_gamma_value; // PNG GAMA chunk value, scaled by 100000

		bool m_has_trns;		// true if the PNG file used colorkey transparency
	};

	// Retrieved information about the PNG file.
	// Returns false on any errors.
	bool get_png_info(const void* pImage_buf, size_t buf_size, png_info& info);

	// Input parameters:
	// pImage_buf, buf_size - pointer to PNG image data
	// desired_chans - desired number of output channels. 0=auto, 1=grayscale, 2=grayscale alpha, 3=24bpp RGB, 4=32bpp RGBA
	//
	// Output parameters:
	// width, height - PNG image resolution
	// num_chans - actual number of channels in PNG, from [1,4] (factoring in transparency)
	//
	// Returns nullptr on any errors.
	void* load_png(const void* pImage_buf, size_t buf_size, uint32_t desired_chans, uint32_t &width, uint32_t &height, uint32_t& num_chans);
}