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

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_direct.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. #if defined(TARGET_WINCE)
  25. typedef struct direct
  26. {
  27. overlay Overlay;
  28. planes Planes;
  29. bool_t KernelMode;
  30. void* PhyFrameBuffer;
  31. } direct;
  32. static int Init(direct* p)
  33. {
  34. void* Ptr = NULL;
  35. video* Output = &p->Overlay.Output.Format.Video;
  36. video Desktop;
  37. memset(Output,0,sizeof(video));
  38. //set default values (for most of the models)
  39. Output->Width = 240;
  40. Output->Height = 320;
  41. Output->Pitch = 480;
  42. Output->Aspect = ASPECT_ONE;
  43. Output->Direction = 0;
  44. if (QueryPlatform(PLATFORM_CAPS) & CAPS_ONLY12BITRGB)
  45. DefaultRGB(&Output->Pixel,16,4,4,4,1,2,1);
  46. else
  47. DefaultRGB(&Output->Pixel,16,5,6,5,0,0,0);
  48. switch (QueryPlatform(PLATFORM_MODEL))
  49. {
  50. case MODEL_BSQUARE_ALCHEMY:
  51. Ptr = p->PhyFrameBuffer = PhyMemBegin(0x15000000,320*480,1);
  52. Output->Width = 240;
  53. Output->Height = 320;
  54. Output->Pitch = 480;
  55. break;
  56. case MODEL_IPAQ_H3600:
  57. case MODEL_IPAQ_H3700:
  58. Output->Direction = DIR_SWAPXY | DIR_MIRRORLEFTRIGHT;
  59. Ptr = (void*)0xAC050020;
  60. Output->Width = 320;
  61. Output->Height = 240;
  62. Output->Pitch = 640;
  63. break;
  64. case MODEL_IPAQ_H3800:
  65. Output->Direction = DIR_SWAPXY | DIR_MIRRORUPDOWN;
  66. Ptr = (void*)0xAC050020;
  67. Output->Width = 320;
  68. Output->Height = 240;
  69. Output->Pitch = 640;
  70. break;
  71. case MODEL_COMPAQ_AERO_1500:
  72. QueryDesktop(&Desktop);
  73. Ptr = (void*)0xAA000000;
  74. Output->Direction = DIR_SWAPXY | DIR_MIRRORLEFTRIGHT;
  75. Output->Width = 320;
  76. Output->Height = 240;
  77. Output->Pixel.Flags = PF_PALETTE|PF_INVERTED;
  78. Output->Pixel.BitCount = Desktop.Pixel.BitCount;
  79. Output->Pitch = (Output->Width * Output->Pixel.BitCount) >> 3;
  80. break;
  81. case MODEL_CASIO_BE300:
  82. case MODEL_CASIO_E105:
  83. case MODEL_CASIO_E115:
  84. Ptr = (void*)0xAA200000;
  85. Output->Pitch = 512;
  86. break;
  87. case MODEL_JORNADA_710:
  88. case MODEL_JORNADA_720:
  89. Ptr = p->PhyFrameBuffer = PhyMemBegin(0x48200000,240*1280,1);
  90. Output->Width = 640;
  91. Output->Height = 240;
  92. Output->Pitch = 1280;
  93. break;
  94. case MODEL_JORNADA_680:
  95. case MODEL_JORNADA_690: 
  96. Ptr = (void*)0xB2000000; //only japan???
  97. Output->Width = 640;
  98. Output->Height = 240;
  99. Output->Pitch = 1280;
  100. break;
  101. case MODEL_MOBILEGEAR2_550:
  102. case MODEL_MOBILEGEAR2_450:
  103. case MODEL_MOBILEGEAR2_530:
  104. case MODEL_MOBILEGEAR2_430:
  105. case MODEL_MOBILEPRO_780:
  106. case MODEL_MOBILEPRO_790:
  107. Ptr = (void*)0xAA180100;
  108. Output->Width = 640;
  109. Output->Height = 240;
  110. Output->Pitch = 1280;
  111. break;
  112. case MODEL_MOBILEPRO_770:
  113. Ptr = (void*)0xAA000000;
  114. Output->Width = 640;
  115. Output->Height = 240;
  116. Output->Pitch = 1600;
  117. break;
  118. case MODEL_JVC_C33:
  119. Ptr = (void*)0x445C0000;
  120. Output->Width = 1024;
  121. Output->Height = 600;
  122. Output->Pitch = 2048;
  123. break;
  124. case MODEL_SIGMARION:
  125. Ptr = (void*)0xAA000000;
  126. Output->Width = 640;
  127. Output->Height = 240;
  128. Output->Pitch = 1280;
  129. break;
  130. case MODEL_SIGMARION2:
  131. Ptr = (void*)0xB0800000;
  132. Output->Width = 640;
  133. Output->Height = 240;
  134. Output->Pitch = 1280;
  135. break;
  136. case MODEL_SIGMARION3:
  137. Ptr = p->PhyFrameBuffer = PhyMemBegin(0x14800000,480*1600,1);
  138. Output->Width = 800;
  139. Output->Height = 480;
  140. Output->Pitch = 1600;
  141. break;
  142. case MODEL_INTERMEC_6651:
  143. Ptr = p->PhyFrameBuffer = PhyMemBegin(0x6C000000,480*1600,1);
  144. Output->Width = 800;
  145. Output->Height = 480;
  146. Output->Pitch = 1600;
  147. break;
  148. }
  149. if (!Ptr)
  150. return ERR_NOT_SUPPORTED;
  151. if (((int)Ptr & 15)==0 && (Output->Pitch & 15)==0)
  152. Output->Pixel.Flags |= PF_16ALIGNED;
  153. p->Planes[0] = Ptr;
  154. AdjustOrientation(Output,0);
  155. p->Overlay.SetFX = BLITFX_AVOIDTEARING;
  156. return ERR_NONE;
  157. }
  158. static void Done(direct* p)
  159. {
  160. if (p->PhyFrameBuffer)
  161. {
  162. PhyMemEnd(p->PhyFrameBuffer);
  163. p->PhyFrameBuffer = NULL;
  164. }
  165. }
  166. static int Reset(direct* p)
  167. {
  168. Done(p);
  169. Init(p);
  170. return ERR_NONE;
  171. }
  172. static int Lock(direct* p, planes Planes, bool_t OnlyAligned)
  173. {
  174. p->KernelMode = KernelMode(1);
  175. Planes[0] = p->Planes[0];
  176. return ERR_NONE;
  177. }
  178. static int Unlock(direct* p)
  179. {
  180. KernelMode(p->KernelMode);
  181. return ERR_NONE;
  182. }
  183. static int Create(direct* p)
  184. {
  185. if (Init(p) != ERR_NONE) // check if supported
  186. return ERR_NOT_SUPPORTED;
  187. Done(p);
  188. p->Overlay.Init = (ovlfunc)Init;
  189. p->Overlay.Done = (ovldone)Done;
  190. p->Overlay.Reset = (ovlfunc)Reset;
  191. p->Overlay.Lock = (ovllock)Lock;
  192. p->Overlay.Unlock = (ovlfunc)Unlock;
  193. return ERR_NONE;
  194. }
  195. static const nodedef Direct = 
  196. {
  197. sizeof(direct)|CF_GLOBAL,
  198. DIRECT_ID,
  199. OVERLAY_CLASS,
  200. PRI_DEFAULT+90,
  201. (nodecreate)Create,
  202. };
  203. void OverlayDirect_Init()
  204. NodeRegisterClass(&Direct);
  205. }
  206. void OverlayDirect_Done()
  207. {
  208. NodeUnRegisterClass(DIRECT_ID);
  209. }
  210. #endif