aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/evas/src/modules/engines/software_gdi/evas_gdi_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/evas/src/modules/engines/software_gdi/evas_gdi_main.c')
-rw-r--r--libraries/evas/src/modules/engines/software_gdi/evas_gdi_main.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/libraries/evas/src/modules/engines/software_gdi/evas_gdi_main.c b/libraries/evas/src/modules/engines/software_gdi/evas_gdi_main.c
new file mode 100644
index 0000000..4a63959
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_gdi/evas_gdi_main.c
@@ -0,0 +1,100 @@
1#include "evas_common.h"
2#include "evas_engine.h"
3
4
5int
6evas_software_gdi_init (HWND window,
7 int depth,
8 unsigned int borderless,
9 unsigned int fullscreen __UNUSED__,
10 unsigned int region,
11 Outbuf *buf)
12{
13 if (!window)
14 {
15 ERR("[Engine] [GDI] Window is NULL");
16 return 0;
17 }
18
19 buf->priv.gdi.window = window;
20 buf->priv.gdi.dc = GetDC(window);
21 buf->priv.gdi.borderless = borderless;
22 buf->priv.gdi.region = region;
23 if (!buf->priv.gdi.dc)
24 {
25 ERR("[Engine] [GDI] Can not get DC");
26 return 0;
27 }
28
29 /* FIXME: check depth */
30 if (depth != GetDeviceCaps(buf->priv.gdi.dc, BITSPIXEL))
31 {
32 ERR("[Engine] [GDI] no compatible depth");
33 ReleaseDC(window, buf->priv.gdi.dc);
34 return 0;
35 }
36 buf->priv.gdi.depth = depth;
37
38 /* FIXME: support fullscreen */
39
40 buf->priv.gdi.bitmap_info = (BITMAPINFO_GDI *)malloc(sizeof(BITMAPINFO_GDI));
41 if (!buf->priv.gdi.bitmap_info)
42 {
43 ERR("[Engine] [GDI] Can not allocate bitmap info");
44 ReleaseDC(window, buf->priv.gdi.dc);
45 return 0;
46 }
47
48 buf->priv.gdi.bitmap_info->bih.biSize = sizeof(BITMAPINFOHEADER);
49 buf->priv.gdi.bitmap_info->bih.biWidth = buf->width;
50 buf->priv.gdi.bitmap_info->bih.biHeight = -buf->height;
51 buf->priv.gdi.bitmap_info->bih.biPlanes = 1;
52 buf->priv.gdi.bitmap_info->bih.biSizeImage = (buf->priv.gdi.depth >> 3) * buf->width * buf->height;
53 buf->priv.gdi.bitmap_info->bih.biXPelsPerMeter = 0;
54 buf->priv.gdi.bitmap_info->bih.biYPelsPerMeter = 0;
55 buf->priv.gdi.bitmap_info->bih.biClrUsed = 0;
56 buf->priv.gdi.bitmap_info->bih.biClrImportant = 0;
57 buf->priv.gdi.bitmap_info->bih.biBitCount = buf->priv.gdi.depth;
58 buf->priv.gdi.bitmap_info->bih.biCompression = BI_BITFIELDS;
59
60 switch (depth)
61 {
62 case 16:
63 buf->priv.gdi.bitmap_info->masks[0] = 0x0000f800;
64 buf->priv.gdi.bitmap_info->masks[1] = 0x000007e0;
65 buf->priv.gdi.bitmap_info->masks[2] = 0x0000001f;
66 break;
67 case 32:
68 buf->priv.gdi.bitmap_info->masks[0] = 0x00ff0000;
69 buf->priv.gdi.bitmap_info->masks[1] = 0x0000ff00;
70 buf->priv.gdi.bitmap_info->masks[2] = 0x000000ff;
71 break;
72 default:
73 ERR("[Engine] [GDI] wrong depth");
74 free(buf->priv.gdi.bitmap_info);
75 ReleaseDC(window, buf->priv.gdi.dc);
76 return 0;
77 }
78
79 return 1;
80}
81
82void
83evas_software_gdi_shutdown(Outbuf *buf)
84{
85 if (!buf)
86 return;
87
88 free(buf->priv.gdi.bitmap_info);
89 ReleaseDC(buf->priv.gdi.window, buf->priv.gdi.dc);
90 if (buf->priv.gdi.regions)
91 DeleteObject(buf->priv.gdi.regions);
92}
93
94void
95evas_software_gdi_bitmap_resize(Outbuf *buf)
96{
97 buf->priv.gdi.bitmap_info->bih.biWidth = buf->width;
98 buf->priv.gdi.bitmap_info->bih.biHeight = -buf->height;
99 buf->priv.gdi.bitmap_info->bih.biSizeImage = (buf->priv.gdi.depth >> 3) * buf->width * buf->height;
100}