211 lines
4.8 KiB
C
211 lines
4.8 KiB
C
#include "evas_common.h"
|
|
#include "evas_engine.h"
|
|
|
|
|
|
#define GETGXINFO 0x00020000
|
|
|
|
typedef struct GXDeviceInfo
|
|
{
|
|
long Version; //00 (should filled with 100 before calling ExtEscape)
|
|
void *pvFrameBuffer; //04
|
|
unsigned long cbStride; //08
|
|
unsigned long cxWidth; //0c
|
|
unsigned long cyHeight; //10
|
|
unsigned long cBPP; //14
|
|
unsigned long ffFormat; //18
|
|
char Unused[0x84 - 7 * 4];
|
|
} GXDeviceInfo;
|
|
|
|
|
|
#define GETRAWFRAMEBUFFER 0x00020001
|
|
|
|
typedef struct _RawFrameBufferInfo
|
|
{
|
|
WORD wFormat;
|
|
WORD wBPP;
|
|
VOID *pFramePointer;
|
|
int cxStride;
|
|
int cyStride;
|
|
int cxPixels;
|
|
int cyPixels;
|
|
} RawFrameBufferInfo;
|
|
|
|
|
|
typedef struct Evas_Engine_WinCE_FB_Priv Evas_Engine_WinCE_FB_Priv;
|
|
|
|
struct Evas_Engine_WinCE_FB_Priv
|
|
{
|
|
int width;
|
|
int height;
|
|
void *buffer;
|
|
};
|
|
|
|
static int
|
|
_evas_software_wince_gxinfo_init(HDC dc, int *width, int *height, void **buffer)
|
|
{
|
|
GXDeviceInfo gxInfo = { 0 };
|
|
int result;
|
|
|
|
gxInfo.Version = 100;
|
|
result = ExtEscape(dc, GETGXINFO, 0, NULL, sizeof(gxInfo),
|
|
(char *) &gxInfo);
|
|
if (result <= 0)
|
|
{
|
|
ERR("ExtEscape() with GETGXINFO failed");
|
|
return 0;
|
|
}
|
|
|
|
*width = gxInfo.cyHeight;
|
|
*height = gxInfo.cxWidth;
|
|
*buffer = gxInfo.pvFrameBuffer;
|
|
|
|
return 1;
|
|
}
|
|
|
|
void *
|
|
evas_software_wince_fb_init(HWND window,
|
|
int width,
|
|
int height)
|
|
{
|
|
WCHAR oemstr[100];
|
|
RawFrameBufferInfo rfbi;
|
|
HDC dc;
|
|
Evas_Engine_WinCE_FB_Priv *priv;
|
|
|
|
priv = (Evas_Engine_WinCE_FB_Priv *)malloc(sizeof(Evas_Engine_WinCE_FB_Priv));
|
|
if (!priv)
|
|
return NULL;
|
|
|
|
dc = GetDC (window);
|
|
if (!dc)
|
|
{
|
|
ERR("Can not get DC");
|
|
free(priv);
|
|
return NULL;
|
|
}
|
|
|
|
SystemParametersInfo (SPI_GETOEMINFO, sizeof (oemstr), oemstr, 0);
|
|
if (((oemstr[12] == 'H') &&
|
|
(oemstr[13] == '3') &&
|
|
(oemstr[14] == '8')) ||
|
|
((oemstr[12] == 'H') &&
|
|
(oemstr[13] == '3') &&
|
|
(oemstr[14] == '9')))
|
|
{
|
|
if (!_evas_software_wince_gxinfo_init(dc, &priv->width, &priv->height, &priv->buffer))
|
|
{
|
|
ReleaseDC(window, dc);
|
|
free(priv);
|
|
return NULL;
|
|
}
|
|
|
|
if ((priv->width != width) ||
|
|
(priv->height != height))
|
|
{
|
|
ERR("Size mismatch: asked: %dx%d, got: %dx%d",
|
|
width, height, priv->width, priv->height);
|
|
ReleaseDC(window, dc);
|
|
free(priv);
|
|
return NULL;
|
|
}
|
|
|
|
ReleaseDC(window, dc);
|
|
|
|
return priv;
|
|
}
|
|
|
|
if (!ExtEscape(dc, GETRAWFRAMEBUFFER, 0, 0, sizeof(rfbi), (char *) &rfbi)||
|
|
(rfbi.wBPP != 16) ||
|
|
(rfbi.wFormat != 1))
|
|
{
|
|
ERR("ExtEscape() with GETRAWFRAMEBUFFER failed. "
|
|
"Trying ExtEscape() with GETGXINFO");
|
|
if (!_evas_software_wince_gxinfo_init(dc, &priv->width, &priv->height, &priv->buffer))
|
|
{
|
|
ReleaseDC(window, dc);
|
|
free(priv);
|
|
return NULL;
|
|
}
|
|
|
|
ReleaseDC(window, dc);
|
|
return priv;
|
|
}
|
|
|
|
priv->width = rfbi.cxPixels;
|
|
priv->height = rfbi.cyPixels;
|
|
priv->buffer = rfbi.pFramePointer;
|
|
|
|
if ((priv->width != width) ||
|
|
(priv->height != height))
|
|
{
|
|
ERR("Size mismatch: asked: %dx%d, got: %dx%d",
|
|
width, height, priv->width, priv->height);
|
|
ReleaseDC(window, dc);
|
|
free(priv);
|
|
return NULL;
|
|
}
|
|
|
|
ReleaseDC(window, dc);
|
|
|
|
return priv;
|
|
}
|
|
|
|
void
|
|
evas_software_wince_fb_shutdown(void *priv)
|
|
{
|
|
free(priv);
|
|
}
|
|
|
|
|
|
FB_Output_Buffer *
|
|
evas_software_wince_fb_output_buffer_new(void *priv,
|
|
int width,
|
|
int height)
|
|
{
|
|
FB_Output_Buffer *fbob;
|
|
void *buffer;
|
|
|
|
fbob = calloc(1, sizeof(FB_Output_Buffer));
|
|
if (!fbob) return NULL;
|
|
|
|
buffer = malloc (width * height * 2); /* we are sure to have 16bpp */
|
|
if (!buffer)
|
|
{
|
|
free(fbob);
|
|
return NULL;
|
|
}
|
|
|
|
fbob->priv = priv;
|
|
|
|
fbob->im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), width, height, (DATA32 *)buffer, 0, EVAS_COLORSPACE_RGB565_A5P);
|
|
if (fbob->im)
|
|
fbob->im->stride = width;
|
|
|
|
return fbob;
|
|
}
|
|
|
|
void
|
|
evas_software_wince_fb_output_buffer_free(FB_Output_Buffer *fbob)
|
|
{
|
|
free(fbob->im->pixels);
|
|
free(fbob);
|
|
}
|
|
|
|
void
|
|
evas_software_wince_fb_output_buffer_paste(FB_Output_Buffer *fbob)
|
|
{
|
|
Evas_Engine_WinCE_FB_Priv *priv;
|
|
|
|
priv = (Evas_Engine_WinCE_FB_Priv *)fbob->priv;
|
|
|
|
if ((fbob->im->cache_entry.w == priv->width) &&
|
|
(fbob->im->cache_entry.h == priv->height))
|
|
memcpy(priv->buffer, fbob->im->pixels,
|
|
priv->width * priv->height * 2);
|
|
}
|
|
|
|
void
|
|
evas_software_wince_fb_surface_resize(FB_Output_Buffer *fbob)
|
|
{
|
|
}
|