mirror of https://github.com/ipxe/ipxe.git
[png] Add support for PNG images
Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/18/head
parent
f4d2342e5a
commit
c6c8078964
|
@ -200,6 +200,9 @@ REQUIRE_OBJECT ( sdi );
|
||||||
#ifdef IMAGE_PNM
|
#ifdef IMAGE_PNM
|
||||||
REQUIRE_OBJECT ( pnm );
|
REQUIRE_OBJECT ( pnm );
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef IMAGE_PNG
|
||||||
|
REQUIRE_OBJECT ( png );
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Drag in all requested commands
|
* Drag in all requested commands
|
||||||
|
|
|
@ -104,6 +104,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
//#define IMAGE_EFI /* EFI image support */
|
//#define IMAGE_EFI /* EFI image support */
|
||||||
//#define IMAGE_SDI /* SDI image support */
|
//#define IMAGE_SDI /* SDI image support */
|
||||||
//#define IMAGE_PNM /* PNM image support */
|
//#define IMAGE_PNM /* PNM image support */
|
||||||
|
//#define IMAGE_PNG /* PNG image support */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Command-line commands to include
|
* Command-line commands to include
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -231,6 +231,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
#define ERRFILE_efi_image ( ERRFILE_IMAGE | 0x00040000 )
|
#define ERRFILE_efi_image ( ERRFILE_IMAGE | 0x00040000 )
|
||||||
#define ERRFILE_embedded ( ERRFILE_IMAGE | 0x00050000 )
|
#define ERRFILE_embedded ( ERRFILE_IMAGE | 0x00050000 )
|
||||||
#define ERRFILE_pnm ( ERRFILE_IMAGE | 0x00060000 )
|
#define ERRFILE_pnm ( ERRFILE_IMAGE | 0x00060000 )
|
||||||
|
#define ERRFILE_png ( ERRFILE_IMAGE | 0x00070000 )
|
||||||
|
|
||||||
#define ERRFILE_asn1 ( ERRFILE_OTHER | 0x00000000 )
|
#define ERRFILE_asn1 ( ERRFILE_OTHER | 0x00000000 )
|
||||||
#define ERRFILE_chap ( ERRFILE_OTHER | 0x00010000 )
|
#define ERRFILE_chap ( ERRFILE_OTHER | 0x00010000 )
|
||||||
|
|
|
@ -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 */
|
File diff suppressed because it is too large
Load Diff
|
@ -51,3 +51,4 @@ REQUIRE_OBJECT ( ocsp_test );
|
||||||
REQUIRE_OBJECT ( cms_test );
|
REQUIRE_OBJECT ( cms_test );
|
||||||
REQUIRE_OBJECT ( pnm_test );
|
REQUIRE_OBJECT ( pnm_test );
|
||||||
REQUIRE_OBJECT ( deflate_test );
|
REQUIRE_OBJECT ( deflate_test );
|
||||||
|
REQUIRE_OBJECT ( png_test );
|
||||||
|
|
Loading…
Reference in New Issue