aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/evas/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/evas/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c')
-rw-r--r--libraries/evas/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c341
1 files changed, 341 insertions, 0 deletions
diff --git a/libraries/evas/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c b/libraries/evas/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c
new file mode 100644
index 0000000..c23c863
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c
@@ -0,0 +1,341 @@
1#include "evas_common.h"
2#include "evas_engine.h"
3
4
5typedef int (*evas_engine_wince_close_display)();
6
7typedef struct Evas_Engine_WinCE_GAPI_Priv Evas_Engine_WinCE_GAPI_Priv;
8
9
10#define GETGXINFO 0x00020000
11
12typedef struct
13{
14 long Version; //00 (should filled with 100 before calling ExtEscape)
15 void *pvFrameBuffer; //04
16 unsigned long cbStride; //08
17 unsigned long cxWidth; //0c
18 unsigned long cyHeight; //10
19 unsigned long cBPP; //14
20 unsigned long ffFormat; //18
21 char Unused[0x84 - 7 * 4];
22} _GXDeviceInfo;
23
24
25#define LINK(type,name,import) \
26 name = (gapi_##type)GetProcAddress (gapi_lib, import)
27
28#define GX_FULLSCREEN 0x01
29#define GX_NORMALKEYS 0x02
30
31#define kfDirect555 0x40
32#define kfDirect565 0x80
33
34
35typedef struct
36{
37 DWORD cxWidth;
38 DWORD cyHeight;
39 LONG cbxPitch;
40 LONG cbyPitch;
41 LONG cBPP;
42 DWORD ffFormat;
43} _GAPI_Display_Properties;
44
45typedef int (*gapi_display_open)(HWND hWnd, DWORD dwFlags);
46typedef int (*gapi_display_close)();
47typedef _GAPI_Display_Properties (*gapi_display_properties_get)(void);
48typedef void* (*gapi_draw_begin)(void);
49typedef int (*gapi_draw_end)(void);
50typedef int (*gapi_suspend)(void);
51typedef int (*gapi_resume)(void);
52
53gapi_suspend suspend = NULL;
54gapi_resume resume = NULL;
55
56int
57evas_software_wince_gapi_suspend(void)
58{
59 if (suspend)
60 return suspend();
61 else
62 return 0;
63}
64
65int
66evas_software_wince_gapi_resume(void)
67{
68 if (resume)
69 return resume();
70 else
71 return 0;
72}
73
74
75struct Evas_Engine_WinCE_GAPI_Priv
76{
77 HMODULE lib;
78 gapi_display_close close_display;
79 gapi_draw_begin draw_begin;
80 gapi_draw_end draw_end;
81 void *buffer;
82 int width;
83 int height;
84 int stride;
85};
86
87void *
88evas_software_wince_gapi_init(HWND window,
89 int width,
90 int height)
91{
92 WCHAR oemstr[100];
93 _GAPI_Display_Properties prop;
94 HMODULE gapi_lib;
95 Evas_Engine_WinCE_GAPI_Priv *priv;
96
97 gapi_display_open display_open = NULL;
98 gapi_display_close display_close = NULL;
99 gapi_display_properties_get display_properties_get = NULL;
100 gapi_draw_begin draw_begin = NULL;
101 gapi_draw_end draw_end = NULL;
102
103 priv = (Evas_Engine_WinCE_GAPI_Priv *)malloc(sizeof(Evas_Engine_WinCE_GAPI_Priv));
104 if (!priv)
105 return NULL;
106
107 gapi_lib = LoadLibrary(L"\\Windows\\gx.dll");
108 if (!gapi_lib)
109 {
110 gapi_lib = LoadLibrary(L"gx.dll");
111 if (!gapi_lib)
112 {
113 ERR("[Engine] [WinCE GAPI] Can not load gx.dll");
114 goto free_priv;
115 }
116 }
117
118 LINK(display_open, display_open, L"?GXOpenDisplay@@YAHPAUHWND__@@K@Z");
119 LINK(display_close, display_close, L"?GXCloseDisplay@@YAHXZ");
120 LINK(display_properties_get, display_properties_get, L"?GXGetDisplayProperties@@YA?AUGXDisplayProperties@@XZ");
121 LINK(draw_begin, draw_begin, L"?GXBeginDraw@@YAPAXXZ");
122 LINK(draw_end, draw_end, L"?GXEndDraw@@YAHXZ");
123 LINK(suspend, suspend, L"?GXSuspend@@YAHXZ" );
124 LINK(resume, resume, L"?GXResume@@YAHXZ" );
125
126 if (!display_open ||
127 !display_close ||
128 !display_properties_get ||
129 !draw_begin ||
130 !draw_end ||
131 !suspend ||
132 !resume)
133 {
134 ERR("[Engine] [WinCE GAPI] Can not find valid symbols");
135 goto free_lib;
136 }
137
138 if (!display_open(window, GX_FULLSCREEN))
139 {
140 ERR("[Engine] [WinCE GAPI] Can not open display");
141 goto free_lib;
142 }
143
144 prop = display_properties_get();
145
146 // verify pixel format
147 if(!(prop.ffFormat & kfDirect565) || (prop.cBPP != 16))
148 {
149 ERR("display format mismatch");
150 goto close_display;
151 }
152
153 // verify we have a vga device
154 if ((GetSystemMetrics(SM_CXSCREEN) != (int)prop.cxWidth) ||
155 (GetSystemMetrics(SM_CYSCREEN) != (int)prop.cyHeight))
156 {
157 ERR("display size mismatch");
158 goto close_display;
159 }
160
161 priv->lib = gapi_lib;
162 priv->close_display = display_close;
163 priv->draw_begin = draw_begin;
164 priv->draw_end = draw_end;
165
166 /* GAPI on Ipaq H38** and H39** is completely buggy */
167 /* They are detected as portrait device (width = 240 and height = 320) */
168 /* but the framebuffer is managed like a landscape device : */
169 /*
170 240
171 +---------+
172 | |
173 | |
174 | |
175 | |
176 | | 320
177 | ^^^ |
178 | ||| |
179 | ||| |
180 | ||| |
181 +---------+
182 ---->
183
184 */
185 /* So these devices are considered as landscape devices */
186 /* and width and height are switched. */
187 /* Other devices are managed normally : */
188 /*
189 240
190 +---------+
191| |---> |
192| |---> |
193| |---> |
194v | |
195 | | 320
196 | |
197 | |
198 | |
199 | |
200 +---------+
201
202 */
203
204 SystemParametersInfo (SPI_GETOEMINFO, sizeof (oemstr), oemstr, 0);
205
206 if (((oemstr[12] == 'H') &&
207 (oemstr[13] == '3') &&
208 (oemstr[14] == '8')) ||
209 ((oemstr[12] == 'H') &&
210 (oemstr[13] == '3') &&
211 (oemstr[14] == '9')))
212 {
213 _GXDeviceInfo gxInfo = { 0 };
214 HDC dc;
215 int result;
216
217 priv->width = prop.cyHeight;
218 priv->height = prop.cxWidth;
219 priv->stride = prop.cbxPitch;
220
221 dc = GetDC (window);
222 if (!dc)
223 {
224 ERR("Can not get device");
225 goto close_display;
226 }
227
228 gxInfo.Version = 100;
229 result = ExtEscape(dc, GETGXINFO, 0, NULL, sizeof(gxInfo),
230 (char *) &gxInfo);
231 if (result <= 0)
232 {
233 ERR("ExtEscape failed");
234 ReleaseDC(window, dc);
235 goto close_display;
236 }
237
238 priv->buffer = gxInfo.pvFrameBuffer;
239 ReleaseDC(window, dc);
240 }
241 else
242 {
243 priv->width = prop.cxWidth;
244 priv->height = prop.cyHeight;
245 priv->stride = prop.cbyPitch;
246 priv->buffer = NULL;
247 }
248
249 if ((priv->width != width) ||
250 (priv->height != height))
251 {
252 ERR("Size mismatch: asked: %dx%d, got: %dx%d",
253 width, height, priv->width, priv->height);
254 goto close_display;
255 }
256
257 return priv;
258
259 close_display:
260 display_close();
261 free_lib:
262 FreeLibrary(gapi_lib);
263 free_priv:
264 free(priv);
265 return NULL;
266}
267
268void
269evas_software_wince_gapi_shutdown(void *priv)
270{
271 Evas_Engine_WinCE_GAPI_Priv *p;
272
273 p = (Evas_Engine_WinCE_GAPI_Priv *)priv;
274 p->close_display();
275 suspend = NULL;
276 resume = NULL;
277 FreeLibrary(p->lib);
278 free(p);
279}
280
281
282FB_Output_Buffer *
283evas_software_wince_gapi_output_buffer_new(void *priv,
284 int width,
285 int height)
286{
287 FB_Output_Buffer *fbob;
288 void *buffer;
289
290 fbob = calloc(1, sizeof(FB_Output_Buffer));
291 if (!fbob) return NULL;
292
293 buffer = malloc (width * height * 2); /* we are sure to have 16bpp */
294 if (!buffer)
295 {
296 free(fbob);
297 return NULL;
298 }
299
300 fbob->priv = priv;
301
302 fbob->im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), width, height, (DATA32 *)buffer, 0, EVAS_COLORSPACE_RGB565_A5P);
303 if (fbob->im)
304 fbob->im->stride = ((Evas_Engine_WinCE_GAPI_Priv *)priv)->stride >> 1;
305
306 return fbob;
307}
308
309void
310evas_software_wince_gapi_output_buffer_free(FB_Output_Buffer *fbob)
311{
312 free(fbob->im->pixels);
313 free(fbob);
314}
315
316void
317evas_software_wince_gapi_output_buffer_paste(FB_Output_Buffer *fbob)
318{
319 Evas_Engine_WinCE_GAPI_Priv *priv;
320 void *buffer;
321
322 priv = (Evas_Engine_WinCE_GAPI_Priv *)fbob->priv;
323
324 buffer = priv->draw_begin();
325 if (!buffer)
326 return;
327
328 if (priv->buffer) buffer = priv->buffer;
329
330 if ((fbob->im->cache_entry.w == priv->width) &&
331 (fbob->im->cache_entry.h == priv->height))
332 memcpy(buffer, fbob->im->pixels,
333 priv->width * priv->height * 2);
334
335 priv->draw_end();
336}
337
338void
339evas_software_wince_gapi_surface_resize(FB_Output_Buffer *fbob)
340{
341}