ge2demu.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:8k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: ge2demu.c 343 2005-11-16 20:11:07Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  * Big thanks to Mobile Stream (http://www.mobile-stream.com)
  23.  * for reverse enginerring the GE2D interface
  24.  *
  25.  ****************************************************************************/
  26. #define WIN32_LEAN_AND_MEAN
  27. #ifndef STRICT
  28. #define STRICT
  29. #endif
  30. #include <windows.h>
  31. #include "../common/overlay/ddraw.h"
  32. HMODULE Module = NULL;
  33. LPDIRECTDRAW DD = NULL;
  34. HANDLE Thread = NULL;
  35. bool_t ThreadRun = 0;
  36. RECT DDSrc;
  37. RECT DDDst;
  38. int DDLeft,DDTop;
  39. LPDIRECTDRAWSURFACE DDPrimary;
  40. LPDIRECTDRAWSURFACE DDBuffer;
  41. Err GE2DLibOpen()
  42. {
  43. DDSURFACEDESC Desc;
  44. HRESULT (WINAPI* DirectDrawCreate)( void*, LPDIRECTDRAW*, void* );
  45. Module = LoadLibrary(T("DDRAW.DLL"));
  46. *(FARPROC*)&DirectDrawCreate = GetProcAddress(Module,"DirectDrawCreate");
  47. if (!DirectDrawCreate)
  48. return 1;
  49. if (DirectDrawCreate(NULL,&DD,NULL)!=DD_OK)
  50. return 1;
  51. IDirectDraw_SetCooperativeLevel(DD, NULL, DDSCL_NORMAL);
  52. // get primary surface
  53. memset(&Desc,0,sizeof(DDSURFACEDESC));
  54. Desc.dwSize = sizeof(DDSURFACEDESC);
  55. Desc.dwFlags = DDSD_CAPS;
  56. Desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
  57. if (IDirectDraw_CreateSurface(DD,&Desc,&DDPrimary,NULL) != DD_OK)
  58. return 1;
  59. return errNone;
  60. }
  61. Err GE2DLibClose()
  62. {
  63. if (DDPrimary) 
  64. IDirectDrawSurface_Release(DDPrimary); 
  65. DDPrimary = NULL;
  66. }
  67. if (DD)
  68. {
  69. IDirectDraw_Release(DD);
  70. DD = NULL;
  71. }
  72. if (Module)
  73. FreeLibrary(Module);
  74. return errNone;
  75. }
  76. Err GE2DScaleBitmap(GE2DBitmapType *dstBmpP, GE2DBitmapType *srcBmpP)
  77. {
  78. int x,y,sn,dn;
  79. uint8_t *d,*s;
  80. int dx = (1024 * srcBmpP->width) / dstBmpP->width; 
  81. int dy = (1024 * srcBmpP->height) / dstBmpP->height; 
  82. if (dstBmpP->format != sonyGE2DFormatYCbCr420Planar)
  83. return 1;
  84. if (srcBmpP->format != sonyGE2DFormatYCbCr420Planar)
  85. return 1;
  86. sn = srcBmpP->width * srcBmpP->height;
  87. dn = dstBmpP->width * dstBmpP->height;
  88. for (y=0;y<dstBmpP->height;++y)
  89. {
  90. d = (uint8_t*)dstBmpP->plane1P + y*dstBmpP->pitch;
  91. s = (uint8_t*)srcBmpP->plane1P + ((y*dy)/1024)*srcBmpP->pitch;
  92. for (x=0;x<dstBmpP->width;++x,++d)
  93. *d = s[(x*dx)/1024];
  94. }
  95. for (y=0;y<dstBmpP->height/2;++y)
  96. {
  97. d = (uint8_t*)dstBmpP->plane2P + y*dstBmpP->chromaPitch;
  98. s = (uint8_t*)srcBmpP->plane2P + ((y*dy)/1024)*srcBmpP->chromaPitch;
  99. for (x=0;x<dstBmpP->width/2;++x,++d)
  100. *d = s[(x*dx)/1024];
  101. }
  102. for (y=0;y<dstBmpP->height/2;++y)
  103. {
  104. d = (uint8_t*)dstBmpP->plane3P + y*dstBmpP->chromaPitch;
  105. s = (uint8_t*)srcBmpP->plane3P + ((y*dy)/1024)*srcBmpP->chromaPitch;
  106. for (x=0;x<dstBmpP->width/2;++x,++d)
  107. *d = s[(x*dx)/1024];
  108. }
  109. return 0;
  110. }
  111. Err GE2DHideOverlay()
  112. {
  113. if (Thread)
  114. {
  115. ThreadRun = 0;
  116. if (Thread && WaitForSingleObject(Thread,5000) == WAIT_TIMEOUT)
  117. TerminateThread(Thread,0);
  118. Thread = NULL;
  119. }
  120. if (DDBuffer)
  121. {
  122. IDirectDrawSurface_UpdateOverlay(DDBuffer,&DDSrc,DDPrimary,&DDDst,DDOVER_HIDE,NULL);
  123. IDirectDrawSurface_Release(DDBuffer); 
  124. DDBuffer = NULL;
  125. }
  126. return 0;
  127. }
  128. static void DDUpdate(GE2DBitmapType *p)
  129. {
  130. HWND Wnd = FindWindow("PalmOSEmulatorDisplay",NULL);
  131. POINT Origin = {0,0};
  132. if (Wnd)
  133. ClientToScreen(Wnd,&Origin);
  134. DDSrc.left = 0;
  135. DDSrc.top = 0;
  136. DDSrc.right = p->width;
  137. DDSrc.bottom = p->height;
  138.  
  139. if (DDDst.left != DDLeft + Origin.x ||
  140. DDDst.top != DDTop + Origin.y)
  141. {
  142. DDDst.left = DDLeft + Origin.x;
  143. DDDst.top = DDTop + Origin.y;
  144. DDDst.right = DDDst.left + p->width;
  145. DDDst.bottom = DDDst.top + p->height;
  146. IDirectDrawSurface_UpdateOverlay(DDBuffer,&DDSrc,DDPrimary,&DDDst,DDOVER_SHOW,NULL);
  147. }
  148. }
  149. static Err GE2DBlitBitmap(void *dstP, Coord left, Coord top,
  150. UInt16 dstWidth, UInt16 dstHeight, GE2DBitmapType* p)
  151. {
  152. video Src;
  153. video Dst;
  154. planes SrcPlanes;
  155. planes DstPlanes;
  156. memset(&Src,0,sizeof(Src));
  157. Src.Pixel.Flags = PF_YUV420;
  158. Src.Width = p->width;
  159. Src.Height = p->height;
  160. Src.Pitch = p->pitch;
  161. SrcPlanes[0] = p->plane1P;
  162. SrcPlanes[1] = p->plane3P;
  163. SrcPlanes[2] = p->plane2P;
  164. memset(&Dst,0,sizeof(Dst));
  165. DefaultRGB(&Dst.Pixel,16,5,6,5,0,0,0);
  166. Dst.Width = p->width;
  167. Dst.Height = p->height;
  168. Dst.Pitch = dstWidth*2;
  169. DstPlanes[0] = (char*)dstP + top * Dst.Pitch + left * 2;
  170. SurfaceCopy(&Src,&Dst,SrcPlanes,DstPlanes,NULL);
  171. return 0;
  172. }
  173. static void DDCopy(GE2DBitmapType *p)
  174. {
  175. DDSURFACEDESC Desc;
  176. memset(&Desc,0,sizeof(DDSURFACEDESC));
  177. Desc.dwSize = sizeof(DDSURFACEDESC);
  178. if (IDirectDrawSurface_Lock(DDBuffer,NULL,&Desc,DDLOCK_WAIT,NULL) == DD_OK)
  179. {
  180. int y,n;
  181. uint8_t* i = (uint8_t*)Desc.lpSurface;
  182. n = Desc.lPitch*p->height;
  183. for (y=0;y<p->height;++y)
  184. memcpy(i+y*Desc.lPitch,(char*)p->plane1P+p->pitch*y,p->width);
  185. for (y=0;y<(p->height/2);++y)
  186. {
  187. memcpy(i+n+y*(Desc.lPitch/2),(char*)p->plane2P+p->chromaPitch*y,p->width/2);
  188. memcpy(i+n+n/4+y*(Desc.lPitch/2),(char*)p->plane3P+p->chromaPitch*y,p->width/2);
  189. }
  190. IDirectDrawSurface_Unlock(DDBuffer,NULL);
  191. }
  192. }
  193. static int ThreadCopy(void* p)
  194. {
  195. while (ThreadRun)
  196. {
  197. Sleep(100);
  198. if (!ThreadRun)
  199. break;
  200. DDCopy((GE2DBitmapType*)p);
  201. DDUpdate((GE2DBitmapType*)p);
  202. }
  203. return 0;
  204. }
  205. Err GE2DShowOverlay(Coord left, Coord top, GE2DBitmapType *p)
  206. {
  207. DWORD Id;
  208. DDSURFACEDESC Desc;
  209. if (p->format != sonyGE2DFormatYCbCr420Planar)
  210. return 1;
  211. GE2DHideOverlay();
  212. memset(&Desc,0,sizeof(DDSURFACEDESC));
  213. Desc.dwSize = sizeof(DDSURFACEDESC);
  214. Desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT;
  215. Desc.dwWidth = p->width;
  216. Desc.dwHeight = p->height;
  217. Desc.ddpfPixelFormat.dwSize = sizeof(Desc.ddpfPixelFormat);
  218. Desc.ddpfPixelFormat.dwFlags = DDPF_FOURCC;
  219. Desc.ddpfPixelFormat.dwFourCC = FOURCC_YV12;
  220. Desc.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_OVERLAY;
  221. if (IDirectDraw_CreateSurface(DD,&Desc,&DDBuffer,NULL) != DD_OK)
  222. return 1;
  223. memset(&DDDst,-1,sizeof(DDDst));
  224. DDTop = top;
  225. DDLeft = left;
  226. DDCopy(p);
  227. DDUpdate(p);
  228. ThreadRun = 1;
  229. Thread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadCopy,p,0,&Id);
  230. return 0;
  231. }
  232. Err GE2DProgramBlitBitmap(GE2DInsnType *programP,void *dstP, Coord left, Coord top,
  233. UInt16 dstWidth, UInt16 dstHeight, GE2DBitmapType *bmpP)
  234. {
  235. programP[0] = (GE2DInsnType)dstP;
  236. programP[1] = left;
  237. programP[2] = top;
  238. programP[3] = dstWidth;
  239. programP[4] = dstHeight;
  240. programP[5] = (GE2DInsnType)bmpP;
  241. return 0;
  242. }
  243. Err GE2DRunProgram(const GE2DInsnType *programP)
  244. {
  245. return GE2DBlitBitmap((void*)programP[0],(Coord)programP[1],(Coord)programP[2],
  246. (UInt16)programP[3],(UInt16)programP[4],(GE2DBitmapType*)programP[5]);
  247. }
  248. static GE2DLibAPIType API = 
  249. {
  250. GE2DLibOpen,
  251. GE2DLibClose,
  252. NULL,
  253. NULL,
  254. NULL,
  255. NULL,
  256. GE2DBlitBitmap,
  257. NULL,
  258. NULL,
  259. GE2DProgramBlitBitmap,
  260. GE2DScaleBitmap,
  261. GE2DShowOverlay,
  262. GE2DHideOverlay,
  263. GE2DRunProgram,
  264. GE2DRunProgram,
  265. };