123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- #ifndef _IPXE_PNG_H
- #define _IPXE_PNG_H
-
- /** @file
- *
- * Portable Network Graphics (PNG) format
- *
- */
-
- FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
-
- #include <stdint.h>
- #include <byteswap.h>
- #include <ipxe/image.h>
-
- /** A PNG file signature */
- struct png_signature {
- /** Signature bytes */
- uint8_t bytes[8];
- } __attribute__ (( packed ));
-
- /** PNG file signature */
- #define PNG_SIGNATURE { { 0x89, 'P', 'N', 'G', '\r', '\n', 0x1a, '\n' } }
-
- /** A PNG chunk header */
- struct png_chunk_header {
- /** Length of the chunk (excluding header and footer) */
- uint32_t len;
- /** Chunk type */
- uint32_t type;
- } __attribute__ (( packed ));
-
- /** A PNG chunk footer */
- struct png_chunk_footer {
- /** CRC */
- uint32_t crc;
- } __attribute__ (( packed ));
-
- /** PNG chunk type property bits */
- enum png_chunk_type_bits {
- /** Chunk is ancillary */
- PNG_CHUNK_ANCILLARY = 0x20000000UL,
- /** Chunk is private */
- PNG_CHUNK_PRIVATE = 0x00200000UL,
- /** Reserved */
- PNG_CHUNK_RESERVED = 0x00002000UL,
- /** Chunk is safe to copy */
- PNG_CHUNK_SAFE = 0x00000020UL,
- };
-
- /**
- * Canonicalise PNG chunk type
- *
- * @v type Raw chunk type
- * @ret type Canonicalised chunk type (excluding property bits)
- */
- static inline __attribute__ (( always_inline )) uint32_t
- png_canonical_type ( uint32_t type ) {
- return ( type & ~( htonl ( PNG_CHUNK_ANCILLARY | PNG_CHUNK_PRIVATE |
- PNG_CHUNK_RESERVED | PNG_CHUNK_SAFE ) ) );
- }
-
- /**
- * Define a canonical PNG chunk type
- *
- * @v first First letter (in upper case)
- * @v second Second letter (in upper case)
- * @v third Third letter (in upper case)
- * @v fourth Fourth letter (in upper case)
- * @ret type Canonical chunk type
- */
- #define PNG_TYPE( first, second, third, fourth ) \
- ( ( (first) << 24 ) | ( (second) << 16 ) | ( (third) << 8 ) | (fourth) )
-
- /** PNG image header chunk type */
- #define PNG_TYPE_IHDR PNG_TYPE ( 'I', 'H', 'D', 'R' )
-
- /** A PNG image header */
- struct png_image_header {
- /** Width */
- uint32_t width;
- /** Height */
- uint32_t height;
- /** Bit depth */
- uint8_t depth;
- /** Colour type */
- uint8_t colour_type;
- /** Compression method */
- uint8_t compression;
- /** Filter method */
- uint8_t filter;
- /** Interlace method */
- uint8_t interlace;
- } __attribute__ (( packed ));
-
- /** PNG colour type bits */
- enum png_colour_type {
- /** Palette is used */
- PNG_COLOUR_TYPE_PALETTE = 0x01,
- /** RGB colour is used */
- PNG_COLOUR_TYPE_RGB = 0x02,
- /** Alpha channel is used */
- PNG_COLOUR_TYPE_ALPHA = 0x04,
- };
-
- /** PNG colour type mask */
- #define PNG_COLOUR_TYPE_MASK 0x07
-
- /** PNG compression methods */
- enum png_compression_method {
- /** DEFLATE compression with 32kB sliding window */
- PNG_COMPRESSION_DEFLATE = 0x00,
- /** First unknown compression method */
- PNG_COMPRESSION_UNKNOWN = 0x01,
- };
-
- /** PNG filter methods */
- enum png_filter_method {
- /** Adaptive filtering with five basic types */
- PNG_FILTER_BASIC = 0x00,
- /** First unknown filter method */
- PNG_FILTER_UNKNOWN = 0x01,
- };
-
- /** PNG interlace methods */
- enum png_interlace_method {
- /** No interlacing */
- PNG_INTERLACE_NONE = 0x00,
- /** Adam7 interlacing */
- PNG_INTERLACE_ADAM7 = 0x01,
- /** First unknown interlace method */
- PNG_INTERLACE_UNKNOWN = 0x02,
- };
-
- /** PNG palette chunk type */
- #define PNG_TYPE_PLTE PNG_TYPE ( 'P', 'L', 'T', 'E' )
-
- /** A PNG palette entry */
- struct png_palette_entry {
- /** Red */
- uint8_t red;
- /** Green */
- uint8_t green;
- /** Blue */
- uint8_t blue;
- } __attribute__ (( packed ));
-
- /** A PNG palette chunk */
- struct png_palette {
- /** Palette entries */
- struct png_palette_entry entries[0];
- } __attribute__ (( packed ));
-
- /** Maximum number of PNG palette entries */
- #define PNG_PALETTE_COUNT 256
-
- /** PNG image data chunk type */
- #define PNG_TYPE_IDAT PNG_TYPE ( 'I', 'D', 'A', 'T' )
-
- /** PNG basic filter types */
- enum png_basic_filter_type {
- /** No filtering */
- PNG_FILTER_BASIC_NONE = 0,
- /** Left byte used as predictor */
- PNG_FILTER_BASIC_SUB = 1,
- /** Above byte used as predictor */
- PNG_FILTER_BASIC_UP = 2,
- /** Above and left bytes used as predictors */
- PNG_FILTER_BASIC_AVERAGE = 3,
- /** Paeth filter */
- PNG_FILTER_BASIC_PAETH = 4,
- };
-
- /** PNG image end chunk type */
- #define PNG_TYPE_IEND PNG_TYPE ( 'I', 'E', 'N', 'D' )
-
- extern struct image_type png_image_type __image_type ( PROBE_NORMAL );
-
- #endif /* _IPXE_PNG_H */
|