Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / ipxe / src / include / ipxe / png.h
diff --git a/qemu/roms/ipxe/src/include/ipxe/png.h b/qemu/roms/ipxe/src/include/ipxe/png.h
new file mode 100644 (file)
index 0000000..f51d1e6
--- /dev/null
@@ -0,0 +1,179 @@
+#ifndef _IPXE_PNG_H
+#define _IPXE_PNG_H
+
+/** @file
+ *
+ * Portable Network Graphics (PNG) format
+ *
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+#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 */