summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brown2013-11-27 02:13:18 +0100
committerMichael Brown2013-11-27 12:27:50 +0100
commit09f31e9fc4fd728f7c51b092a1ea158abe20f864 (patch)
tree6b2b477131e4d3eca6d4e926b994b40bdf0a1abd /src
parent[image] Allow for non-executable image formats (diff)
downloadipxe-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.c26
-rw-r--r--src/include/ipxe/image.h17
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