]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.sbin/bhyve/bhyvegc.c
Update to bmake 20170413
[FreeBSD/FreeBSD.git] / usr.sbin / bhyve / bhyvegc.c
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 }