xref: /freebsd/usr.sbin/bhyve/bhyvegc.c (revision 273c26a3c3bea87a241d6879abd4f991db180bf0)
1 #include <sys/cdefs.h>
2 
3 #include <sys/types.h>
4 
5 #include <stdlib.h>
6 #include <stdio.h>
7 #include <string.h>
8 
9 #include "bhyvegc.h"
10 
11 struct bhyvegc {
12 	struct bhyvegc_image	*gc_image;
13 	int raw;
14 };
15 
16 struct bhyvegc *
17 bhyvegc_init(int width, int height, void *fbaddr)
18 {
19 	struct bhyvegc *gc;
20 	struct bhyvegc_image *gc_image;
21 
22 	gc = calloc(1, sizeof (struct bhyvegc));
23 
24 	gc_image = calloc(1, sizeof(struct bhyvegc_image));
25 	gc_image->width = width;
26 	gc_image->height = height;
27 	if (fbaddr) {
28 		gc_image->data = fbaddr;
29 		gc->raw = 1;
30 	} else {
31 		gc_image->data = calloc(width * height, sizeof (uint32_t));
32 		gc->raw = 0;
33 	}
34 
35 	gc->gc_image = gc_image;
36 
37 	return (gc);
38 }
39 
40 void
41 bhyvegc_set_fbaddr(struct bhyvegc *gc, void *fbaddr)
42 {
43 	gc->raw = 1;
44 	if (gc->gc_image->data && gc->gc_image->data != fbaddr)
45 		free(gc->gc_image->data);
46 	gc->gc_image->data = fbaddr;
47 }
48 
49 void
50 bhyvegc_resize(struct bhyvegc *gc, int width, int height)
51 {
52 	struct bhyvegc_image *gc_image;
53 
54 	gc_image = gc->gc_image;
55 
56 	gc_image->width = width;
57 	gc_image->height = height;
58 	if (!gc->raw) {
59 		gc_image->data = realloc(gc_image->data,
60 		    sizeof (uint32_t) * width * height);
61 		memset(gc_image->data, 0, width * height * sizeof (uint32_t));
62 	}
63 }
64 
65 struct bhyvegc_image *
66 bhyvegc_get_image(struct bhyvegc *gc)
67 {
68 	if (gc == NULL)
69 		return (NULL);
70 
71 	return (gc->gc_image);
72 }
73