Просмотр исходного кода

[pixbuf] Add generic concept of a pixel buffer

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 11 лет назад
Родитель
Сommit
95851d1305
2 измененных файлов: 130 добавлений и 0 удалений
  1. 75
    0
      src/core/pixbuf.c
  2. 55
    0
      src/include/ipxe/pixbuf.h

+ 75
- 0
src/core/pixbuf.c Просмотреть файл

@@ -0,0 +1,75 @@
1
+/*
2
+ * Copyright (C) 2013 Michael Brown <mbrown@fensystems.co.uk>.
3
+ *
4
+ * This program is free software; you can redistribute it and/or
5
+ * modify it under the terms of the GNU General Public License as
6
+ * published by the Free Software Foundation; either version 2 of the
7
+ * License, or any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful, but
10
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12
+ * General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU General Public License
15
+ * along with this program; if not, write to the Free Software
16
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17
+ * 02110-1301, USA.
18
+ */
19
+
20
+FILE_LICENCE ( GPL2_OR_LATER );
21
+
22
+/** @file
23
+ *
24
+ * Pixel buffer
25
+ *
26
+ */
27
+
28
+#include <stdlib.h>
29
+#include <ipxe/umalloc.h>
30
+#include <ipxe/pixbuf.h>
31
+
32
+/**
33
+ * Free pixel buffer
34
+ *
35
+ * @v refcnt		Reference count
36
+ */
37
+static void free_pixbuf ( struct refcnt *refcnt ) {
38
+	struct pixel_buffer *pixbuf =
39
+		container_of ( refcnt, struct pixel_buffer, refcnt );
40
+
41
+	ufree ( pixbuf->data );
42
+	free ( pixbuf );
43
+}
44
+
45
+/**
46
+ * Allocate pixel buffer
47
+ *
48
+ * @v width		Width
49
+ * @h height		Height
50
+ * @ret pixbuf		Pixel buffer, or NULL on failure
51
+ */
52
+struct pixel_buffer * alloc_pixbuf ( unsigned int width, unsigned int height ) {
53
+	struct pixel_buffer *pixbuf;
54
+
55
+	/* Allocate and initialise structure */
56
+	pixbuf = zalloc ( sizeof ( *pixbuf ) );
57
+	if ( ! pixbuf )
58
+		goto err_alloc_pixbuf;
59
+	ref_init ( &pixbuf->refcnt, free_pixbuf );
60
+	pixbuf->width = width;
61
+	pixbuf->height = height;
62
+	pixbuf->len = ( width * height * sizeof ( uint32_t ) );
63
+
64
+	/* Allocate pixel data buffer */
65
+	pixbuf->data = umalloc ( pixbuf->len );
66
+	if ( ! pixbuf->data )
67
+		goto err_alloc_data;
68
+
69
+	return pixbuf;
70
+
71
+ err_alloc_data:
72
+	pixbuf_put ( pixbuf );
73
+ err_alloc_pixbuf:
74
+	return NULL;
75
+}

+ 55
- 0
src/include/ipxe/pixbuf.h Просмотреть файл

@@ -0,0 +1,55 @@
1
+#ifndef _IPXE_PIXBUF_H
2
+#define _IPXE_PIXBUF_H
3
+
4
+/** @file
5
+ *
6
+ * Pixel buffer
7
+ *
8
+ */
9
+
10
+FILE_LICENCE ( GPL2_OR_LATER );
11
+
12
+#include <stddef.h>
13
+#include <ipxe/refcnt.h>
14
+#include <ipxe/uaccess.h>
15
+
16
+/** A pixel buffer */
17
+struct pixel_buffer {
18
+	/** Reference count */
19
+	struct refcnt refcnt;
20
+	/** Width */
21
+	unsigned int width;
22
+	/** Height */
23
+	unsigned int height;
24
+	/** 32-bit (8:8:8:8) xRGB pixel data, in host-endian order */
25
+	userptr_t data;
26
+	/** Total length */
27
+	size_t len;
28
+};
29
+
30
+/**
31
+ * Get reference to pixel buffer
32
+ *
33
+ * @v pixbuf		Pixel buffer
34
+ * @ret pixbuf		Pixel buffer
35
+ */
36
+static inline __attribute__ (( always_inline )) struct pixel_buffer *
37
+pixbuf_get ( struct pixel_buffer *pixbuf ) {
38
+	ref_get ( &pixbuf->refcnt );
39
+	return pixbuf;
40
+}
41
+
42
+/**
43
+ * Drop reference to pixel buffer
44
+ *
45
+ * @v pixbuf		Pixel buffer
46
+ */
47
+static inline __attribute__ (( always_inline )) void
48
+pixbuf_put ( struct pixel_buffer *pixbuf ) {
49
+	ref_put ( &pixbuf->refcnt );
50
+}
51
+
52
+extern struct pixel_buffer * alloc_pixbuf ( unsigned int width,
53
+					    unsigned int height );
54
+
55
+#endif /* _IPXE_PIXBUF_H */

Загрузка…
Отмена
Сохранить