1300829Sgrehan#include <sys/cdefs.h>
2300829Sgrehan
3300829Sgrehan#include <sys/types.h>
4300829Sgrehan
5300829Sgrehan#include <stdlib.h>
6300829Sgrehan#include <stdio.h>
7300829Sgrehan#include <string.h>
8300829Sgrehan
9300829Sgrehan#include "bhyvegc.h"
10300829Sgrehan
11300829Sgrehanstruct bhyvegc {
12300829Sgrehan	struct bhyvegc_image	*gc_image;
13300829Sgrehan	int raw;
14300829Sgrehan};
15300829Sgrehan
16300829Sgrehanstruct bhyvegc *
17300829Sgrehanbhyvegc_init(int width, int height, void *fbaddr)
18300829Sgrehan{
19300829Sgrehan	struct bhyvegc *gc;
20300829Sgrehan	struct bhyvegc_image *gc_image;
21300829Sgrehan
22300829Sgrehan	gc = calloc(1, sizeof (struct bhyvegc));
23300829Sgrehan
24300829Sgrehan	gc_image = calloc(1, sizeof(struct bhyvegc_image));
25300829Sgrehan	gc_image->width = width;
26300829Sgrehan	gc_image->height = height;
27300829Sgrehan	if (fbaddr) {
28300829Sgrehan		gc_image->data = fbaddr;
29300829Sgrehan		gc->raw = 1;
30300829Sgrehan	} else {
31300829Sgrehan		gc_image->data = calloc(width * height, sizeof (uint32_t));
32300829Sgrehan		gc->raw = 0;
33300829Sgrehan	}
34300829Sgrehan
35300829Sgrehan	gc->gc_image = gc_image;
36300829Sgrehan
37300829Sgrehan	return (gc);
38300829Sgrehan}
39300829Sgrehan
40300829Sgrehanvoid
41300829Sgrehanbhyvegc_set_fbaddr(struct bhyvegc *gc, void *fbaddr)
42300829Sgrehan{
43300829Sgrehan	gc->raw = 1;
44300829Sgrehan	if (gc->gc_image->data && gc->gc_image->data != fbaddr)
45300829Sgrehan		free(gc->gc_image->data);
46300829Sgrehan	gc->gc_image->data = fbaddr;
47300829Sgrehan}
48300829Sgrehan
49300829Sgrehanvoid
50300829Sgrehanbhyvegc_resize(struct bhyvegc *gc, int width, int height)
51300829Sgrehan{
52300829Sgrehan	struct bhyvegc_image *gc_image;
53300829Sgrehan
54300829Sgrehan	gc_image = gc->gc_image;
55300829Sgrehan
56300829Sgrehan	gc_image->width = width;
57300829Sgrehan	gc_image->height = height;
58300829Sgrehan	if (!gc->raw) {
59300829Sgrehan		gc_image->data = realloc(gc_image->data,
60300829Sgrehan		    sizeof (uint32_t) * width * height);
61300829Sgrehan		memset(gc_image->data, 0, width * height * sizeof (uint32_t));
62300829Sgrehan	}
63300829Sgrehan}
64300829Sgrehan
65300829Sgrehanstruct bhyvegc_image *
66300829Sgrehanbhyvegc_get_image(struct bhyvegc *gc)
67300829Sgrehan{
68300829Sgrehan	if (gc == NULL)
69300829Sgrehan		return (NULL);
70300829Sgrehan
71300829Sgrehan	return (gc->gc_image);
72300829Sgrehan}
73