overlay_raw.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: overlay_raw.c 543 2006-01-07 22:06:24Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../common.h"
  24. #ifdef TARGET_WINCE
  25. #define WIN32_LEAN_AND_MEAN
  26. #ifndef STRICT
  27. #define STRICT
  28. #endif
  29. #include <windows.h>
  30. typedef struct raw
  31. {
  32. overlay Overlay;
  33. void* Ptr;
  34. RawFrameBufferInfo Info;
  35. } raw;
  36. static const datatable Params[] = 
  37. {
  38. { RAW_WIDTH, TYPE_INT, DF_SETUP | DF_RDONLY | DF_HIDDEN },
  39. { RAW_HEIGHT, TYPE_INT, DF_SETUP | DF_RDONLY | DF_HIDDEN },
  40. { RAW_PITCHX, TYPE_INT, DF_SETUP | DF_RDONLY | DF_HIDDEN },
  41. { RAW_PITCHY, TYPE_INT, DF_SETUP | DF_RDONLY | DF_HIDDEN },
  42. { RAW_BPP, TYPE_INT, DF_SETUP | DF_RDONLY | DF_HIDDEN },
  43. { RAW_FORMAT, TYPE_INT, DF_SETUP | DF_RDONLY | DF_HIDDEN },
  44. { RAW_POINTER, TYPE_INT, DF_SETUP | DF_RDONLY | DF_HEX | DF_HIDDEN },
  45. DATATABLE_END(RAW_ID),
  46. };
  47. static bool_t GetRawFrameBuffer(RawFrameBufferInfo* Info)
  48. {
  49. HDC DC = GetDC(NULL);
  50. memset(Info,0,sizeof(RawFrameBufferInfo));
  51. ExtEscape(DC, GETRAWFRAMEBUFFER, 0, NULL, sizeof(RawFrameBufferInfo), (char*)Info);
  52. if (!Info->pFramePointer && QueryPlatform(PLATFORM_VER) >= 421)
  53. {
  54. //try gxinfo
  55. DWORD Code = GETGXINFO;
  56. if (ExtEscape(DC, ESC_QUERYESCSUPPORT, sizeof(DWORD), (char*)&Code, 0, NULL) > 0)
  57. {
  58. DWORD DCWidth = GetDeviceCaps(DC,HORZRES);
  59. DWORD DCHeight = GetDeviceCaps(DC,VERTRES);
  60. GXDeviceInfo GXInfo;
  61. memset(&GXInfo,0,sizeof(GXInfo));
  62. GXInfo.Version = 100;
  63. ExtEscape(DC, GETGXINFO, 0, NULL, sizeof(GXInfo), (char*)&GXInfo);
  64. // avoid VGA devices (or QVGA smartphones emulating 176x220)
  65. if (GXInfo.cbStride>0 && !(GXInfo.ffFormat & kfLandscape) &&
  66. ((DCWidth == GXInfo.cxWidth && DCHeight == GXInfo.cyHeight) ||
  67.  (DCWidth == GXInfo.cyHeight && DCHeight == GXInfo.cxWidth)))
  68. {
  69. bool_t Detect = 0;
  70. TRY_BEGIN
  71. {
  72. int* p = (int*)GXInfo.pvFrameBuffer;
  73. COLORREF Old = GetPixel(DC,0,0);
  74. *p ^= -1;
  75. Detect = GetPixel(DC,0,0) != Old;
  76. *p ^= -1;
  77. }
  78. TRY_END
  79. if (Detect)
  80. {
  81. Info->pFramePointer = GXInfo.pvFrameBuffer;
  82. Info->cxPixels = GXInfo.cxWidth;
  83. Info->cyPixels = GXInfo.cyHeight;
  84. Info->cxStride = GXInfo.cBPP/8;
  85. Info->cyStride = GXInfo.cbStride;
  86. Info->wBPP = (WORD)GXInfo.cBPP;
  87. Info->wFormat = (WORD)GXInfo.ffFormat;
  88. }
  89. }
  90. }
  91. }
  92. ReleaseDC(NULL,DC);
  93. return Info->pFramePointer != NULL;
  94. }
  95. static int Enum(raw* p, int* No, datadef* Param)
  96. {
  97. if (OverlayEnum(&p->Overlay,No,Param)==ERR_NONE)
  98. return ERR_NONE;
  99. return NodeEnumTable(No,Param,Params);
  100. }
  101. static int Get(raw* p,int No,void* Data,int Size)
  102. {
  103. int Result = OverlayGet(&p->Overlay,No,Data,Size);
  104. switch (No)
  105. {
  106. case RAW_WIDTH: GETVALUE(p->Info.cxPixels,int); break;
  107. case RAW_HEIGHT: GETVALUE(p->Info.cyPixels,int); break;
  108. case RAW_PITCHX: GETVALUE(p->Info.cxStride,int); break;
  109. case RAW_PITCHY: GETVALUE(p->Info.cyStride,int); break;
  110. case RAW_BPP: GETVALUE(p->Info.wBPP,int); break;
  111. case RAW_FORMAT: GETVALUE(p->Info.wFormat,int); break;
  112. case RAW_POINTER: GETVALUE((int)p->Info.pFramePointer,int); break;
  113. }
  114. return Result;
  115. }
  116. static int Init(raw* p)
  117. {
  118. RawFrameBufferInfo Info;
  119. if (!GetRawFrameBuffer(&p->Info))
  120. return ERR_DEVICE_ERROR;
  121. memcpy(&Info,&p->Info,sizeof(Info));
  122. if (abs(Info.cyStride) < abs(Info.cxStride))
  123. {
  124. if (abs(Info.cxStride)*8 < Info.cyPixels*Info.wBPP &&
  125. abs(Info.cxStride)*8 >= Info.cxPixels*Info.wBPP) //swapped resolution
  126. SwapInt(&Info.cxPixels,&Info.cyPixels);
  127. }
  128. else
  129. {
  130. if (abs(Info.cyStride)*8 < Info.cxPixels*Info.wBPP &&
  131. abs(Info.cyStride)*8 >= Info.cyPixels*Info.wBPP) //swapped resolution
  132. SwapInt(&Info.cxPixels,&Info.cyPixels);
  133. }
  134. memset(&p->Overlay.Output.Format.Video,0,sizeof(video));
  135. p->Overlay.Output.Format.Video.Width = Info.cxPixels;
  136. p->Overlay.Output.Format.Video.Height = Info.cyPixels;
  137. p->Overlay.Output.Format.Video.Direction = 0;
  138. p->Overlay.Output.Format.Video.Aspect = ASPECT_ONE;
  139. switch (Info.wFormat)
  140. {
  141. case kfDirect555:
  142. case kfDirect|kfDirect555:
  143. case kfDirect|kfDirect555|kfLandscape:
  144. case FORMAT_555:
  145. DefaultRGB(&p->Overlay.Output.Format.Video.Pixel,Info.wBPP,5,5,5,0,0,0);
  146. break;
  147. case kfDirect565:
  148. case kfDirect|kfDirect565:
  149. case kfDirect|kfDirect565|kfLandscape:
  150. case FORMAT_565:
  151. DefaultRGB(&p->Overlay.Output.Format.Video.Pixel,Info.wBPP,5,6,5,0,0,0);
  152. break;
  153. default:
  154. return ERR_DEVICE_ERROR;
  155. }
  156. // we need the physical start of the framebuffer
  157. if (Info.cxStride<0) 
  158. Info.pFramePointer += (Info.cxStride * (Info.cxPixels-1));
  159. if (Info.cyStride<0) 
  160. Info.pFramePointer += (Info.cyStride * (Info.cyPixels-1));
  161. if (abs(Info.cyStride) < abs(Info.cxStride))
  162. {
  163. p->Overlay.Output.Format.Video.Direction |= DIR_SWAPXY;
  164. p->Overlay.Output.Format.Video.Pitch = abs(Info.cxStride);
  165. SwapInt(&p->Overlay.Output.Format.Video.Width,&p->Overlay.Output.Format.Video.Height);
  166. if (Info.cxStride<0) 
  167. p->Overlay.Output.Format.Video.Direction |= DIR_MIRRORUPDOWN;
  168. if (Info.cyStride<0) 
  169. p->Overlay.Output.Format.Video.Direction |= DIR_MIRRORLEFTRIGHT;
  170. }
  171. else
  172. {
  173. p->Overlay.Output.Format.Video.Pitch = abs(Info.cyStride);
  174. if (Info.cxStride<0) 
  175. p->Overlay.Output.Format.Video.Direction |= DIR_MIRRORLEFTRIGHT;
  176. if (Info.cyStride<0) 
  177. p->Overlay.Output.Format.Video.Direction |= DIR_MIRRORUPDOWN;
  178. }
  179. if (((int)Info.pFramePointer & 15)==0 && (p->Overlay.Output.Format.Video.Pitch & 15)==0)
  180. p->Overlay.Output.Format.Video.Pixel.Flags |= PF_16ALIGNED;
  181. p->Ptr = Info.pFramePointer;
  182. if (p->Overlay.Output.Format.Video.Direction & DIR_SWAPXY)
  183. p->Overlay.SetFX |= BLITFX_VMEMROTATED;
  184. p->Overlay.SetFX = BLITFX_AVOIDTEARING;
  185. AdjustOrientation(&p->Overlay.Output.Format.Video,1);
  186. return ERR_NONE;
  187. }
  188. static void Done(raw* p)
  189. {
  190. }
  191. static int Reset(raw* p)
  192. {
  193. Done(p);
  194. Init(p);
  195. return ERR_NONE;
  196. }
  197. static int Lock(raw* p, planes Planes, bool_t OnlyAligned)
  198. {
  199. Planes[0] = p->Ptr;
  200. return ERR_NONE;
  201. }
  202. static int Unlock(raw* p)
  203. {
  204. return ERR_NONE;
  205. }
  206. static int Create(raw* p)
  207. {
  208. // skip when GAPI is already available (but not for QVGA smartphones)
  209. if (NodeEnumObject(NULL,GAPI_ID) &&  
  210. GetSystemMetrics(SM_CXSCREEN)*GetSystemMetrics(SM_CYSCREEN) < 320*240)
  211. return ERR_NOT_SUPPORTED;
  212. p->Overlay.Node.Enum = Enum;
  213. p->Overlay.Node.Get = Get;
  214. p->Overlay.Init = Init;
  215. p->Overlay.Done = Done;
  216. p->Overlay.Reset = Reset;
  217. p->Overlay.Lock = Lock;
  218. p->Overlay.Unlock = Unlock;
  219. if (Init(p) != ERR_NONE) // check if supported
  220. return ERR_NOT_SUPPORTED;
  221. Done(p);
  222. return ERR_NONE;
  223. }
  224. static const nodedef RAW =
  225. {
  226. sizeof(raw)|CF_GLOBAL, //no setup
  227. RAW_ID,
  228. OVERLAY_CLASS,
  229. PRI_DEFAULT+95,
  230. (nodecreate)Create,
  231. };
  232. void OverlayRAW_Init() 
  233. NodeRegisterClass(&RAW); 
  234. }
  235. void OverlayRAW_Done()
  236. {
  237. NodeUnRegisterClass(RAW_ID);
  238. }
  239. #endif