diff options
| author | Michael Brown | 2013-11-27 02:13:18 +0100 |
|---|---|---|
| committer | Michael Brown | 2013-11-27 12:27:50 +0100 |
| commit | 09f31e9fc4fd728f7c51b092a1ea158abe20f864 (patch) | |
| tree | 6b2b477131e4d3eca6d4e926b994b40bdf0a1abd /src | |
| parent | [image] Allow for non-executable image formats (diff) | |
| download | ipxe-09f31e9fc4fd728f7c51b092a1ea158abe20f864.tar.gz ipxe-09f31e9fc4fd728f7c51b092a1ea158abe20f864.tar.xz ipxe-09f31e9fc4fd728f7c51b092a1ea158abe20f864.zip | |
[image] Add image_pixbuf() to create pixel buffer from image
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/image.c | 26 | ||||
| -rw-r--r-- | src/include/ipxe/image.h | 17 |
2 files changed, 40 insertions, 3 deletions
diff --git a/src/core/image.c b/src/core/image.c index d9d91013..ec448023 100644 --- a/src/core/image.c +++ b/src/core/image.c @@ -456,3 +456,29 @@ int image_set_trust ( int require_trusted, int permanent ) { return 0; } + +/** + * Create pixel buffer from image + * + * @v image Image + * @v pixbuf Pixel buffer to fill in + * @ret rc Return status code + */ +int image_pixbuf ( struct image *image, struct pixel_buffer **pixbuf ) { + int rc; + + /* Check that this image can be used to create a pixel buffer */ + if ( ( rc = image_probe ( image ) ) != 0 ) + return rc; + if ( ! image->type->pixbuf ) + return -ENOTSUP; + + /* Try creating pixel buffer */ + if ( ( rc = image->type->pixbuf ( image, pixbuf ) ) != 0 ) { + DBGC ( image, "IMAGE %s could not create pixel buffer: %s\n", + image->name, strerror ( rc ) ); + return rc; + } + + return 0; +} diff --git a/src/include/ipxe/image.h b/src/include/ipxe/image.h index 6022dce6..5d7080a7 100644 --- a/src/include/ipxe/image.h +++ b/src/include/ipxe/image.h @@ -16,6 +16,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include <ipxe/refcnt.h> struct uri; +struct pixel_buffer; struct image_type; /** An executable image */ @@ -74,9 +75,10 @@ struct image { struct image_type { /** Name of this image type */ char *name; - /** Probe image + /** + * Probe image * - * @v image Executable image + * @v image Image * @ret rc Return status code * * Return success if the image is of this image type. @@ -85,10 +87,18 @@ struct image_type { /** * Execute image * - * @v image Executable image + * @v image Image * @ret rc Return status code */ int ( * exec ) ( struct image *image ); + /** + * Create pixel buffer from image + * + * @v image Image + * @v pixbuf Pixel buffer to fill in + * @ret rc Return status code + */ + int ( * pixbuf ) ( struct image *image, struct pixel_buffer **pixbuf ); }; /** @@ -159,6 +169,7 @@ extern int image_replace ( struct image *replacement ); extern int image_select ( struct image *image ); extern struct image * image_find_selected ( void ); extern int image_set_trust ( int require_trusted, int permanent ); +extern int image_pixbuf ( struct image *image, struct pixel_buffer **pixbuf ); /** * Increment reference count on an image |
