add gdi backend to the win ce engine. Not working yet
authorcaro <caro@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 19 Nov 2008 07:08:18 +0000 (07:08 +0000)
committercaro <caro@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 19 Nov 2008 07:08:18 +0000 (07:08 +0000)
but some other people can help me now with that code in svn

 * expedite is working but sometimes crashes. Maybe a big mem leak ?
 * maybe moving the creation of the bitmap in
   evas_software_wince_gdi_output_buffer_paste()
   to
   evas_software_wince_gdi_output_buffer_new()
   so that the memcpy is not necessary anymore

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@37709 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/modules/engines/software_16_wince/Evas_Engine_Software_16_WinCE.h
src/modules/engines/software_16_wince/Makefile.am
src/modules/engines/software_16_wince/evas_engine.c
src/modules/engines/software_16_wince/evas_engine.h
src/modules/engines/software_16_wince/evas_wince_gdi_buffer.c [new file with mode: 0644]

index 1624607..b782d1b 100644 (file)
@@ -17,7 +17,7 @@ struct _Evas_Engine_Info_Software_16_WinCE
       HWND  window;
       int   width;
       int   height;
-      int   backend; /* 0: auto, 1: raw, 2: gapi, 3: ddraw */
+      int   backend; /* 0: auto, 1: raw, 2: gapi, 3: ddraw, 4: gdi */
       int   rotation;
    } info;
    /* engine specific function calls to query stuff about messages */
index 48b2dab..f4ad012 100644 (file)
@@ -22,9 +22,10 @@ pkg_LTLIBRARIES      = module.la
 module_la_SOURCES = \
 evas_engine.h \
 evas_engine.c \
+evas_wince_ddraw_buffer.cpp \
 evas_wince_fb_buffer.c \
 evas_wince_gapi_buffer.c \
-evas_wince_ddraw_buffer.cpp \
+evas_wince_gdi_buffer.c \
 evas_wince_gapi.rc
 
 module_la_CFLAGS = @WIN32_CFLAGS@
index 0ca6b0b..b8a5ad4 100644 (file)
@@ -9,7 +9,8 @@ typedef enum
 {
   EVAS_ENGINE_WINCE_FB,
   EVAS_ENGINE_WINCE_GAPI,
-  EVAS_ENGINE_WINCE_DDRAW
+  EVAS_ENGINE_WINCE_DDRAW,
+  EVAS_ENGINE_WINCE_GDI
 } Evas_Engine_WinCE_Backend;
 
 
@@ -21,7 +22,7 @@ typedef struct _Render_Engine Render_Engine;
 
 struct _Render_Engine
 {
-   Evas_Engine_WinCE_Backend backend; /* 1: raw, 2: gapi, 3: ddraw */
+   Evas_Engine_WinCE_Backend backend; /* 1: raw, 2: gapi, 3: ddraw, 4: GDI */
    void               *backend_priv;
    void              (*backend_shutdown)(void *priv);
    FB_Output_Buffer *(*backend_output_buffer_new)(void *priv,
@@ -217,6 +218,20 @@ eng_setup(Evas *e, void *in)
               re->backend_output_buffer_paste = evas_software_wince_ddraw_output_buffer_paste;
               re->backend_surface_resize = evas_software_wince_ddraw_surface_resize;
               break;
+           case 4: /* GDI */
+              re->backend = EVAS_ENGINE_WINCE_GDI;
+              re->backend_priv = evas_software_wince_gdi_init(info->info.window, info->info.width, info->info.height);
+              if (!re->backend_priv)
+                {
+                   free(re);
+                   return;
+                }
+              re->backend_shutdown = evas_software_wince_gdi_shutdown;
+              re->backend_output_buffer_new = evas_software_wince_gdi_output_buffer_new;
+              re->backend_output_buffer_free = evas_software_wince_gdi_output_buffer_free;
+              re->backend_output_buffer_paste = evas_software_wince_gdi_output_buffer_paste;
+              re->backend_surface_resize = evas_software_wince_gdi_surface_resize;
+              break;
            default:
               free(re);
               return;
@@ -278,6 +293,20 @@ eng_setup(Evas *e, void *in)
               re->backend_output_buffer_paste = evas_software_wince_ddraw_output_buffer_paste;
               re->backend_surface_resize = evas_software_wince_ddraw_surface_resize;
               break;
+           case 4: /* GDI */
+              re->backend = EVAS_ENGINE_WINCE_GDI;
+              re->backend_priv = evas_software_wince_gdi_init(info->info.window, info->info.width, info->info.height);
+              if (!re->backend_priv)
+                {
+                   free(re);
+                   return;
+                }
+              re->backend_shutdown = evas_software_wince_gdi_shutdown;
+              re->backend_output_buffer_new = evas_software_wince_gdi_output_buffer_new;
+              re->backend_output_buffer_free = evas_software_wince_gdi_output_buffer_free;
+              re->backend_output_buffer_paste = evas_software_wince_gdi_output_buffer_paste;
+              re->backend_surface_resize = evas_software_wince_gdi_surface_resize;
+              break;
            default:
               free(re);
               return;
index da762c4..20febdf 100644 (file)
@@ -77,4 +77,19 @@ void              evas_software_wince_ddraw_surface_resize(FB_Output_Buffer *fbo
 #endif
 
 
+/* GDI */
+
+void             *evas_software_wince_gdi_init (HWND window,
+                                                int  width,
+                                                int  height);
+FB_Output_Buffer *evas_software_wince_gdi_output_buffer_new (void *priv,
+                                                             int   width,
+                                                             int   height);
+void              evas_software_wince_gdi_shutdown(void *priv);
+void              evas_software_wince_gdi_output_buffer_free (FB_Output_Buffer *fbob);
+void              evas_software_wince_gdi_output_buffer_paste (FB_Output_Buffer *fbob);
+
+void              evas_software_wince_gdi_surface_resize(FB_Output_Buffer *fbob);
+
+
 #endif /* __EVAS_ENGINE_H__ */
diff --git a/src/modules/engines/software_16_wince/evas_wince_gdi_buffer.c b/src/modules/engines/software_16_wince/evas_wince_gdi_buffer.c
new file mode 100644 (file)
index 0000000..d6d49e8
--- /dev/null
@@ -0,0 +1,166 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+
+typedef struct BITMAPINFO_16bpp BITMAPINFO_16bpp;
+typedef struct Evas_Engine_WinCE_GDI_Priv Evas_Engine_WinCE_GDI_Priv;
+
+struct BITMAPINFO_16bpp
+{
+   BITMAPINFOHEADER bih;
+   DWORD            masks[3];
+};
+
+struct Evas_Engine_WinCE_GDI_Priv
+{
+   BITMAPINFO_16bpp *bitmap_info;
+   HWND              window;
+   HDC               dc;
+   int               width;
+   int               height;
+};
+
+void *
+evas_software_wince_gdi_init(HWND window,
+                             int  width,
+                             int  height)
+{
+   Evas_Engine_WinCE_GDI_Priv *priv;
+
+   priv = (Evas_Engine_WinCE_GDI_Priv *)malloc(sizeof(Evas_Engine_WinCE_GDI_Priv));
+   if (!priv)
+     return NULL;
+
+   priv->window = window;
+   priv->dc = GetDC(window);
+   if (!priv->dc)
+     {
+        fprintf (stderr, "[Evas] [Engine] [WinCE GDI] Can not get DC\n");
+        free(priv);
+        return NULL;
+     }
+
+  priv->width = GetSystemMetrics(SM_CXSCREEN);
+  priv->height = GetSystemMetrics(SM_CYSCREEN);
+
+  if ((priv->width != width) ||
+      (priv->height != height))
+    {
+       fprintf (stderr, "[Evas] [Engine] [WinCE GDI] Size mismatch\n");
+       fprintf (stderr, "[Evas] [Engine] [WinCE GDI] asked: %dx%d\n", width, height);
+       fprintf (stderr, "[Evas] [Engine] [WinCE GDI] got  : %dx%d\n", priv->width, priv->height);
+       ReleaseDC(window, priv->dc);
+       free(priv);
+       return NULL;
+    }
+
+  priv->bitmap_info = (BITMAPINFO_16bpp *)malloc(sizeof(BITMAPINFO_16bpp));
+  if (!priv->bitmap_info)
+    {
+       ReleaseDC(window, priv->dc);
+       free(priv);
+       return NULL;
+    }
+
+  priv->bitmap_info->bih.biSize = sizeof(BITMAPINFOHEADER);
+  priv->bitmap_info->bih.biWidth = priv->width;
+  priv->bitmap_info->bih.biHeight = priv->height; /* -h for topdown bitmap ? */
+  priv->bitmap_info->bih.biPlanes = 1;
+  priv->bitmap_info->bih.biSizeImage = 2 * priv->width * priv->height;
+  priv->bitmap_info->bih.biXPelsPerMeter = 0;
+  priv->bitmap_info->bih.biYPelsPerMeter = 0;
+  priv->bitmap_info->bih.biClrUsed = 0;
+  priv->bitmap_info->bih.biClrImportant = 0;
+  priv->bitmap_info->bih.biBitCount = 16;
+  priv->bitmap_info->bih.biCompression = BI_BITFIELDS;
+  priv->bitmap_info->masks[0] = 0x0000f800;
+  priv->bitmap_info->masks[1] = 0x000007e0;
+  priv->bitmap_info->masks[2] = 0x0000001f;
+
+  return priv;
+}
+
+void
+evas_software_wince_gdi_shutdown(void *priv)
+{
+   free(((Evas_Engine_WinCE_GDI_Priv *)priv)->bitmap_info);
+   ReleaseDC(((Evas_Engine_WinCE_GDI_Priv *)priv)->window, ((Evas_Engine_WinCE_GDI_Priv *)priv)->dc);
+   free(priv);
+}
+
+
+FB_Output_Buffer *
+evas_software_wince_gdi_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_gdi_output_buffer_free(FB_Output_Buffer *fbob)
+{
+   free(fbob->im->pixels);
+   free(fbob);
+}
+
+void
+evas_software_wince_gdi_output_buffer_paste(FB_Output_Buffer *fbob)
+{
+   Evas_Engine_WinCE_GDI_Priv *priv;
+
+   priv = (Evas_Engine_WinCE_GDI_Priv *)fbob->priv;
+
+   if ((fbob->im->cache_entry.w == priv->width) &&
+       (fbob->im->cache_entry.h == priv->height))
+     {
+        HDC     dc;
+        HDC     dc2;
+        HBITMAP bitmap;
+        void   *bits;
+
+        dc2 = GetDC(priv->window);
+        bitmap = CreateDIBSection(priv->dc,
+                                  (const BITMAPINFO *)priv->bitmap_info,
+                                  DIB_RGB_COLORS,
+                                  (void **)(&bits),
+                                  NULL,
+                                  0);
+        dc = CreateCompatibleDC(priv->dc);
+        SelectObject(dc, bitmap);
+        memcpy(bits, fbob->im->pixels, priv->width * priv->height * 2);
+        BitBlt(priv->dc,
+               0, 0,
+               priv->width, priv->height,
+               dc,
+               0, 0,
+               SRCCOPY);
+        DeleteDC(dc);
+        ReleaseDC(priv->window, dc2);
+
+     }
+}
+
+void
+evas_software_wince_gdi_surface_resize(FB_Output_Buffer *fbob)
+{
+}