efl/legacy/evas/src/modules/engines/software_16_wince/evas_wince_fb_buffer.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)
{
}