s3c2440disp.cpp
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:27k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. /*++
  2. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3. ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5. PARTICULAR PURPOSE.
  6. Copyright (c) 2001. Samsung Electronics, co. ltd  All rights reserved.
  7. Module Name:  
  8. Abstract:
  9. This file implements the S3C2440 LCD function
  10. rev:
  11. 2002.4.4 : First S3C2410 version (kwangyoon LEE, kwangyoon@samsung.com)
  12. 2002.1.31 : CE.NET port (kwangyoon LEE, kwangyoon@samsung.com)
  13. Notes: 
  14. --*/
  15. #include "precomp.h"
  16. #ifdef CLEARTYPE
  17. #include <ctblt.h>
  18. #endif
  19. #include <aablt.h>
  20. DWORD gdwLCDVirtualFrameBase;
  21. INSTANTIATE_GPE_ZONES(0x3,"MGDI Driver","unused1","unused2") // Start with errors and warnings
  22. static GPE *gGPE = (GPE*)NULL;
  23. static ulong gBitMasks[] = { 0xF800, 0x07E0, 0x001F }; // 565 MODE
  24. static TCHAR gszBaseInstance[256] = _T("Drivers\Display\S3C2440\CONFIG");
  25. #define dim(x)                                  (sizeof(x) / sizeof(x[0]))
  26. // This prototype avoids problems exporting from .lib
  27. BOOL APIENTRY GPEEnableDriver(ULONG engineVersion, ULONG cj, DRVENABLEDATA *data,
  28.   PENGCALLBACKS  engineCallbacks);
  29. // GWES will invoke this routine once prior to making any other calls into the driver.
  30. // This routine needs to save its instance path information and return TRUE.  If it
  31. // returns FALSE, GWES will abort the display initialization.
  32. BOOL APIENTRY
  33. DisplayInit(LPCTSTR pszInstance, DWORD dwNumMonitors)
  34. {
  35. DWORD dwStatus;
  36. HKEY hkDisplay;
  37. BOOL fOk = FALSE;
  38.     RETAILMSG(0, (_T("SALCD2: display instance '%s', num monitors %drn"),
  39.      pszInstance != NULL ? pszInstance : _T("<NULL>"), dwNumMonitors));
  40.     if(pszInstance != NULL) {
  41.         _tcsncpy(gszBaseInstance, pszInstance, dim(gszBaseInstance));
  42.     }
  43. // sanity check the path by making sure it exists
  44. dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, gszBaseInstance, 0, 0, &hkDisplay);
  45. if(dwStatus == ERROR_SUCCESS) {
  46. RegCloseKey(hkDisplay);
  47. fOk = TRUE;
  48. } else {
  49. RETAILMSG(0, (_T("SALCD2: DisplayInit: can't open '%s'rn"), gszBaseInstance));
  50. }
  51.     return fOk;
  52. }
  53. BOOL APIENTRY DrvEnableDriver(ULONG engineVersion, ULONG cj, DRVENABLEDATA *data,
  54.   PENGCALLBACKS  engineCallbacks)
  55. {
  56. BOOL fOk = FALSE;
  57. // make sure we know where our registry configuration is
  58. if(gszBaseInstance[0] != 0) {
  59. fOk = GPEEnableDriver(engineVersion, cj, data, engineCallbacks);
  60. }
  61. return fOk;
  62. }
  63. //
  64. // Main entry point for a GPE-compliant driver
  65. //
  66. GPE *GetGPE(void)
  67. {
  68. if (!gGPE)
  69. {
  70. gGPE = new S3C2440DISP();
  71. }
  72. return gGPE;
  73. }
  74. #if (LCD_TYPE == TFT640_480)
  75. WORD TempBuffer[641][480];
  76. #elif (LCD_TYPE == TFT240_320)
  77. WORD TempBuffer[241][320];
  78. #endif
  79. S3C2440DISP::S3C2440DISP (void)
  80. {
  81. RETAILMSG(0, (TEXT("++S3C2440DISP::S3C2440DISPrn")));
  82. // setup up display mode related constants
  83. #if (LCD_TYPE == TFT640_480)
  84. m_nScreenWidth  = 640;
  85. m_nScreenHeight = 480;
  86. #elif (LCD_TYPE == TFT240_320)
  87. m_nScreenWidth  = 240;
  88. m_nScreenHeight = 320;
  89. #endif
  90. m_colorDepth = 16;
  91. m_cbScanLineLength = m_nScreenWidth * 2;
  92. m_FrameBufferSize = m_nScreenHeight * m_cbScanLineLength;
  93. // memory map register access window, frame buffer, and program LCD controller
  94. InitializeHardware();
  95. #ifdef ROTATE
  96. m_iRotate = 0;
  97. SetRotateParms();
  98. #endif //ROTATE
  99. // setup ModeInfo structure
  100. m_ModeInfo.modeId = 0;
  101. m_ModeInfo.width = m_nScreenWidth;
  102. m_ModeInfo.height = m_nScreenHeight;
  103. m_ModeInfo.Bpp = m_colorDepth;
  104. m_ModeInfo.format = gpe16Bpp;
  105. m_ModeInfo.frequency = 60; // ?
  106. m_pMode = &m_ModeInfo;
  107. // allocate primary display surface
  108. #ifdef  ROTATE
  109. m_pPrimarySurface = new GPESurfRotate(m_nScreenWidthSave, m_nScreenHeightSave, (void*)(m_VirtualFrameBuffer), m_cbScanLineLength, m_ModeInfo.format);
  110. #else
  111. m_pPrimarySurface = new GPESurf(m_nScreenWidth, m_nScreenHeight, (void*)(m_VirtualFrameBuffer), m_cbScanLineLength, m_ModeInfo.format);
  112. #endif //!ROTATE
  113. memset ((void*)m_pPrimarySurface->Buffer(), 0x0, m_FrameBufferSize);
  114. // init cursor related vars
  115. m_CursorVisible = FALSE;
  116. m_CursorDisabled = TRUE;
  117. m_CursorForcedOff = FALSE;
  118. memset (&m_CursorRect, 0x0, sizeof(m_CursorRect));
  119. m_CursorBackingStore = NULL;
  120. m_CursorXorShape = NULL;
  121. m_CursorAndShape = NULL;
  122. #ifdef CLEARTYPE
  123. HKEY  hKey;
  124. DWORD dwValue;
  125. ULONG ulGamma = DEFAULT_CT_GAMMA;
  126. if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE,szGamma,0, NULL,0,0,0,&hKey,&dwValue))
  127. {
  128.     if (dwValue == REG_OPENED_EXISTING_KEY)
  129.     {
  130. DWORD dwType = REG_DWORD;
  131. DWORD dwSize = sizeof(LONG);
  132. if (ERROR_SUCCESS == RegQueryValueEx(hKey,szGammaValue,0,&dwType,(BYTE *)&dwValue,&dwSize))
  133. {
  134.     ulGamma = dwValue;
  135. }
  136.     } 
  137.     else if (dwValue == REG_CREATED_NEW_KEY )
  138.     {
  139. RegSetValueEx(hKey,szGammaValue,0,REG_DWORD,(BYTE *)&ulGamma,sizeof(DWORD));
  140.     }
  141.     RegCloseKey(hKey);
  142. }
  143. SetClearTypeBltGamma(ulGamma);
  144. SetClearTypeBltMasks(gBitMasks[0], gBitMasks[1], gBitMasks[2]);
  145. #endif //CLEARTYPE
  146. RETAILMSG(0, (TEXT("--S3C2440DISP::S3C2440DISPrn")));
  147. }
  148. void S3C2440DISP::InitializeHardware (void)
  149. {
  150. WORD *ptr;
  151. DWORD index;
  152. HKEY hkDisplay = NULL;
  153. DWORD dwLCDPhysicalFrameBase;
  154. DWORD dwStatus, dwType, dwSize;
  155. RETAILMSG(0, (_T("++S3C2440DISP::InitializeHardwarern")));
  156. // open the registry key and read our configuration
  157. dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, gszBaseInstance, 0, 0, &hkDisplay);
  158. dwType = REG_DWORD;
  159. if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD) {
  160. dwSize = sizeof(DWORD);
  161. dwStatus = RegQueryValueEx(hkDisplay, _T("LCDVirtualFrameBase"), NULL, &dwType, 
  162. (LPBYTE) &gdwLCDVirtualFrameBase, &dwSize);
  163. }
  164. if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD) {
  165. dwSize = sizeof(DWORD);
  166. dwStatus = RegQueryValueEx(hkDisplay, _T("LCDPhysicalFrameBase"), NULL, &dwType, 
  167. (LPBYTE) &dwLCDPhysicalFrameBase, &dwSize);
  168. }
  169. // close the registry key
  170. if(hkDisplay != NULL) {
  171. RegCloseKey(hkDisplay);
  172. }
  173. // did we get everything?
  174. if(dwStatus != ERROR_SUCCESS) {
  175. RETAILMSG(0, (_T("SALCD2: InitializeHardware: couldn't get registry configurationrn")));
  176. return;
  177. }
  178. // map frame buffer into process space memory
  179. #if (LCD_TYPE == TFT640_480)
  180. m_VirtualFrameBuffer = (DWORD)VirtualAlloc(0, (0xA0000), MEM_RESERVE, PAGE_NOACCESS);
  181. if (m_VirtualFrameBuffer == NULL) 
  182. {
  183.     RETAILMSG(0,(TEXT("m_VirtualFrameBuffer is not allocatednr")));
  184. return;
  185. }
  186. else if (!VirtualCopy((PVOID)m_VirtualFrameBuffer, (PVOID)gdwLCDVirtualFrameBase, (0xA0000), PAGE_READWRITE | PAGE_NOCACHE))
  187. {
  188.     RETAILMSG(0, (TEXT("m_VirtualFrameBuffer is not mappednr")));
  189.      VirtualFree((PVOID)m_VirtualFrameBuffer, 0, MEM_RELEASE);
  190.      return;
  191. }
  192. #elif (LCD_TYPE == TFT240_320)
  193. m_VirtualFrameBuffer = (DWORD)VirtualAlloc(0, (0x30000), MEM_RESERVE, PAGE_NOACCESS);
  194. if (m_VirtualFrameBuffer == NULL) 
  195. {
  196.     RETAILMSG(0,(TEXT("m_VirtualFrameBuffer is not allocatednr")));
  197. return;
  198. }
  199. else if (!VirtualCopy((PVOID)m_VirtualFrameBuffer, (PVOID)gdwLCDVirtualFrameBase, (0x30000), PAGE_READWRITE | PAGE_NOCACHE))
  200. {
  201.     RETAILMSG(0, (TEXT("m_VirtualFrameBuffer is not mappednr")));
  202.      VirtualFree((PVOID)m_VirtualFrameBuffer, 0, MEM_RELEASE);
  203.      return;
  204. }
  205. #endif
  206. RETAILMSG(0, (TEXT("m_VirtualFrameBuffer is mapped at %x(PHY : %x)nr"), m_VirtualFrameBuffer, gdwLCDVirtualFrameBase));
  207. RETAILMSG(0, (TEXT("Clearing frame buffer !!!nr")));
  208. ptr = (WORD *)m_VirtualFrameBuffer;
  209. // clear rest of frame buffer out
  210. #if (LCD_TYPE == TFT640_480)
  211. for (index = 0; index < 640*480; index++)
  212. {
  213. if(index < 640*120)
  214. {
  215. ptr[index] = 0xf800;
  216. }
  217. else if(index < 640*120*2)
  218. {
  219. ptr[index] = 0x07e0;
  220. }
  221. else if(index < 640*120*3)
  222. {
  223. ptr[index] = 0x001f;
  224. }
  225. else
  226. {
  227. ptr[index] = 0xffff;
  228. }
  229. }
  230. #elif (LCD_TYPE == TFT240_320)
  231. for (index = 0; index < 320*240; index++)
  232. {
  233. if(index < 3200)
  234. {
  235. ptr[index] = 0xf800;
  236. }
  237. else if(index < 6400)
  238. {
  239. ptr[index] = 0x07e0;
  240. }
  241. else if(index < 9600)
  242. {
  243. ptr[index] = 0x001f;
  244. }
  245. else
  246. {
  247. ptr[index] = 0xffff;
  248. }
  249. }
  250. #endif
  251. RETAILMSG(1, (_T("--S3C2440DISP::InitializeHardwarern")));
  252. }
  253. SCODE S3C2440DISP::SetMode (INT modeId, HPALETTE *palette)
  254. {
  255. RETAILMSG(0, (TEXT("++S3C2440DISP::SetModern")));
  256. if (modeId != 0)
  257. {
  258. RETAILMSG(0, (TEXT("S3C2440DISP::SetMode Want mode %d, only have mode 0rn"),modeId));
  259. return E_INVALIDARG;
  260. }
  261. if (palette)
  262. {
  263. *palette = EngCreatePalette (PAL_BITFIELDS, 0, NULL, gBitMasks[0], gBitMasks[1], gBitMasks[2]);
  264. }
  265. RETAILMSG(0, (TEXT("--S3C2440DISP::SetModern")));
  266. return S_OK;
  267. }
  268. SCODE S3C2440DISP::GetModeInfo(GPEMode *mode, INT modeNumber)
  269. {
  270. RETAILMSG(0, (TEXT("++S3C2440DISP::GetModeInforn")));
  271. if (modeNumber != 0)
  272. {
  273. return E_INVALIDARG;
  274. }
  275. *mode = m_ModeInfo;
  276. RETAILMSG(0, (TEXT("--S3C2440DISP::GetModeInforn")));
  277. return S_OK;
  278. }
  279. int S3C2440DISP::NumModes()
  280. {
  281. RETAILMSG(0, (TEXT("++S3C2440DISP::NumModesrn")));
  282. RETAILMSG(0, (TEXT("--S3C2440DISP::NumModesrn")));
  283. return 1;
  284. }
  285. void S3C2440DISP::CursorOn (void)
  286. {
  287. UCHAR *ptrScreen = (UCHAR*)m_pPrimarySurface->Buffer();
  288. UCHAR *ptrLine;
  289. UCHAR *cbsLine;
  290. #ifndef ROTATE
  291. UCHAR *xorLine;
  292. UCHAR *andLine;
  293. #endif //!ROTATE
  294. int x, y;
  295. if (!m_CursorForcedOff && !m_CursorDisabled && !m_CursorVisible)
  296. {
  297. #ifdef ROTATE
  298. RECTL rSave;
  299. int   iRotate;
  300. #endif //ROTATE
  301. if (!m_CursorBackingStore)
  302. {
  303. RETAILMSG(0, (TEXT("S3C2440DISP::CursorOn - No backing store availablern")));
  304. return;
  305. }
  306. #ifdef ROTATE
  307. rSave = m_CursorRect;
  308. RotateRectl(&m_CursorRect);
  309. #endif //ROTATE
  310. for (y = m_CursorRect.top; y < m_CursorRect.bottom; y++)
  311. {
  312. if (y < 0)
  313. {
  314. continue;
  315. }
  316. #ifdef ROTATE
  317. if (y >= m_nScreenHeightSave)
  318. #else
  319. if (y >= m_nScreenHeight)
  320. #endif //ROTATE
  321. {
  322. break;
  323. }
  324. ptrLine = &ptrScreen[y * m_pPrimarySurface->Stride()];
  325. cbsLine = &m_CursorBackingStore[(y - m_CursorRect.top) * (m_CursorSize.x * (m_colorDepth >> 3))];
  326. #ifndef ROTATE
  327. xorLine = &m_CursorXorShape[(y - m_CursorRect.top) * m_CursorSize.x];
  328. andLine = &m_CursorAndShape[(y - m_CursorRect.top) * m_CursorSize.x];
  329. #endif //!ROTATE
  330. for (x = m_CursorRect.left; x < m_CursorRect.right; x++)
  331. {
  332. if (x < 0)
  333. {
  334. continue;
  335. }
  336. #ifdef ROTATE
  337. if (x >= m_nScreenWidthSave)
  338. #else
  339. if (x >= m_nScreenWidth)
  340. #endif //!ROTATE
  341. {
  342. break;
  343. }
  344. #ifdef ROTATE
  345. switch (m_iRotate)
  346. {
  347. case DMDO_0:
  348. iRotate = (y - m_CursorRect.top)*m_CursorSize.x + x - m_CursorRect.left;
  349. break;
  350. case DMDO_90:
  351. iRotate = (x - m_CursorRect.left)*m_CursorSize.x + m_CursorSize.y - 1 - (y - m_CursorRect.top);   
  352. break;
  353. case DMDO_180:
  354. iRotate = (m_CursorSize.y - 1 - (y - m_CursorRect.top))*m_CursorSize.x + m_CursorSize.x - 1 - (x - m_CursorRect.left);
  355. break;
  356. case DMDO_270:
  357. iRotate = (m_CursorSize.x -1 - (x - m_CursorRect.left))*m_CursorSize.x + y - m_CursorRect.top;
  358. break;
  359. default:
  360.     iRotate = (y - m_CursorRect.top)*m_CursorSize.x + x - m_CursorRect.left;
  361. break;
  362. }
  363. #endif //ROTATE
  364. cbsLine[(x - m_CursorRect.left) * (m_colorDepth >> 3)] = ptrLine[x * (m_colorDepth >> 3)];
  365. #ifdef ROTATE
  366. ptrLine[x * (m_colorDepth >> 3)] &= m_CursorAndShape[iRotate];
  367. ptrLine[x * (m_colorDepth >> 3)] ^= m_CursorXorShape[iRotate];
  368. #else 
  369. ptrLine[x * (m_colorDepth >> 3)] &= andLine[x - m_CursorRect.left];
  370. ptrLine[x * (m_colorDepth >> 3)] ^= xorLine[x - m_CursorRect.left];
  371. #endif //ROTATE
  372. if (m_colorDepth > 8)
  373. {
  374. cbsLine[(x - m_CursorRect.left) * (m_colorDepth >> 3) + 1] = ptrLine[x * (m_colorDepth >> 3) + 1];
  375. #ifdef ROTATE
  376.                 ptrLine[x * (m_colorDepth >> 3) + 1] &= m_CursorAndShape[iRotate];
  377. ptrLine[x * (m_colorDepth >> 3) + 1] ^= m_CursorXorShape[iRotate];
  378. #else
  379. ptrLine[x * (m_colorDepth >> 3) + 1] &= andLine[x - m_CursorRect.left];
  380. ptrLine[x * (m_colorDepth >> 3) + 1] ^= xorLine[x - m_CursorRect.left];
  381. #endif //ROTATE
  382. if (m_colorDepth > 16)
  383. {
  384. cbsLine[(x - m_CursorRect.left) * (m_colorDepth >> 3) + 2] = ptrLine[x * (m_colorDepth >> 3) + 2];
  385. #ifdef ROTATE
  386. ptrLine[x * (m_colorDepth >> 3) + 2] &= m_CursorAndShape[iRotate];
  387. ptrLine[x * (m_colorDepth >> 3) + 2] ^= m_CursorXorShape[iRotate];
  388. #else
  389. ptrLine[x * (m_colorDepth >> 3) + 2] &= andLine[x - m_CursorRect.left];
  390. ptrLine[x * (m_colorDepth >> 3) + 2] ^= xorLine[x - m_CursorRect.left];
  391. #endif //ROTATE
  392. }
  393. }
  394. }
  395. }
  396. #ifdef ROTATE
  397. m_CursorRect = rSave;
  398. #endif 
  399. m_CursorVisible = TRUE;
  400. }
  401. }
  402. void S3C2440DISP::CursorOff (void)
  403. {
  404. UCHAR *ptrScreen = (UCHAR*)m_pPrimarySurface->Buffer();
  405. UCHAR *ptrLine;
  406. UCHAR *cbsLine;
  407. int x, y;
  408. if (!m_CursorForcedOff && !m_CursorDisabled && m_CursorVisible)
  409. {
  410. #ifdef ROTATE
  411. RECTL rSave;
  412. #endif //ROTATE
  413. if (!m_CursorBackingStore)
  414. {
  415. RETAILMSG(0, (TEXT("S3C2440DISP::CursorOff - No backing store availablern")));
  416. return;
  417. }
  418. #ifdef ROTATE
  419. rSave = m_CursorRect;
  420. RotateRectl(&m_CursorRect);
  421. #endif //ROTATE
  422. for (y = m_CursorRect.top; y < m_CursorRect.bottom; y++)
  423. {
  424. // clip to displayable screen area (top/bottom)
  425. if (y < 0)
  426. {
  427. continue;
  428. }
  429. #ifndef ROTATE
  430. if (y >= m_nScreenHeight)
  431. #else 
  432. if (y >= m_nScreenHeightSave)
  433. #endif //!ROTATE
  434. {
  435. break;
  436. }
  437. ptrLine = &ptrScreen[y * m_pPrimarySurface->Stride()];
  438. cbsLine = &m_CursorBackingStore[(y - m_CursorRect.top) * (m_CursorSize.x * (m_colorDepth >> 3))];
  439. for (x = m_CursorRect.left; x < m_CursorRect.right; x++)
  440. {
  441. // clip to displayable screen area (left/right)
  442. if (x < 0)
  443. {
  444. continue;
  445. }
  446. #ifndef ROTATE
  447. if (x >= m_nScreenWidth)
  448. #else
  449. if (x>= m_nScreenWidthSave)
  450. #endif //!ROTATE
  451. {
  452. break;
  453. }
  454. ptrLine[x * (m_colorDepth >> 3)] = cbsLine[(x - m_CursorRect.left) * (m_colorDepth >> 3)];
  455. if (m_colorDepth > 8)
  456. {
  457. ptrLine[x * (m_colorDepth >> 3) + 1] = cbsLine[(x - m_CursorRect.left) * (m_colorDepth >> 3) + 1];
  458. if (m_colorDepth > 16)
  459. {
  460. ptrLine[x * (m_colorDepth >> 3) + 2] = cbsLine[(x - m_CursorRect.left) * (m_colorDepth >> 3) + 2];
  461. }
  462. }
  463. }
  464. }
  465. #ifdef ROTATE
  466. m_CursorRect = rSave;
  467. #endif //ROTATE
  468. m_CursorVisible = FALSE;
  469. }
  470. }
  471. SCODE S3C2440DISP::SetPointerShape(GPESurf *pMask, GPESurf *pColorSurf, INT xHot, INT yHot, INT cX, INT cY)
  472. {
  473. UCHAR *andPtr; // input pointer
  474. UCHAR *xorPtr; // input pointer
  475. UCHAR *andLine; // output pointer
  476. UCHAR *xorLine; // output pointer
  477. char bAnd;
  478. char bXor;
  479. int row;
  480. int col;
  481. int i;
  482. int bitMask;
  483. RETAILMSG(0, (TEXT("S3C2440DISP::SetPointerShape(0x%X, 0x%X, %d, %d, %d, %d)rn"),pMask, pColorSurf, xHot, yHot, cX, cY));
  484. // turn current cursor off
  485. CursorOff();
  486. // release memory associated with old cursor
  487. if (m_CursorBackingStore)
  488. {
  489. delete (void*)m_CursorBackingStore;
  490. m_CursorBackingStore = NULL;
  491. }
  492. if (m_CursorXorShape)
  493. {
  494. delete (void*)m_CursorXorShape;
  495.         m_CursorXorShape = NULL;
  496. }
  497. if (m_CursorAndShape)
  498. {
  499. delete (void*)m_CursorAndShape;
  500.         m_CursorAndShape = NULL;
  501. }
  502. if (!pMask) // do we have a new cursor shape
  503. {
  504. m_CursorDisabled = TRUE; // no, so tag as disabled
  505. }
  506. else
  507. {
  508. m_CursorDisabled = FALSE; // yes, so tag as not disabled
  509. // allocate memory based on new cursor size
  510.         m_CursorBackingStore = new UCHAR[(cX * (m_colorDepth >> 3)) * cY];
  511.         m_CursorXorShape = new UCHAR[cX * cY];
  512.         m_CursorAndShape = new UCHAR[cX * cY];
  513. // store size and hotspot for new cursor
  514. m_CursorSize.x = cX;
  515. m_CursorSize.y = cY;
  516. m_CursorHotspot.x = xHot;
  517. m_CursorHotspot.y = yHot;
  518. andPtr = (UCHAR*)pMask->Buffer();
  519. xorPtr = (UCHAR*)pMask->Buffer() + (cY * pMask->Stride());
  520. // store OR and AND mask for new cursor
  521. for (row = 0; row < cY; row++)
  522. {
  523. andLine = &m_CursorAndShape[cX * row];
  524. xorLine = &m_CursorXorShape[cX * row];
  525. for (col = 0; col < cX / 8; col++)
  526. {
  527. bAnd = andPtr[row * pMask->Stride() + col];
  528. bXor = xorPtr[row * pMask->Stride() + col];
  529. for (bitMask = 0x0080, i = 0; i < 8; bitMask >>= 1, i++)
  530. {
  531. andLine[(col * 8) + i] = bAnd & bitMask ? 0xFF : 0x00;
  532. xorLine[(col * 8) + i] = bXor & bitMask ? 0xFF : 0x00;
  533. }
  534. }
  535. }
  536. }
  537. return S_OK;
  538. }
  539. SCODE S3C2440DISP::MovePointer(INT xPosition, INT yPosition)
  540. {
  541. RETAILMSG(0, (TEXT("S3C2440DISP::MovePointer(%d, %d)rn"), xPosition, yPosition));
  542. CursorOff();
  543. if (xPosition != -1 || yPosition != -1)
  544. {
  545. // compute new cursor rect
  546. m_CursorRect.left = xPosition - m_CursorHotspot.x;
  547. m_CursorRect.right = m_CursorRect.left + m_CursorSize.x;
  548. m_CursorRect.top = yPosition - m_CursorHotspot.y;
  549. m_CursorRect.bottom = m_CursorRect.top + m_CursorSize.y;
  550. CursorOn();
  551. }
  552. return S_OK;
  553. }
  554. void S3C2440DISP::WaitForNotBusy(void)
  555. {
  556. RETAILMSG(0, (TEXT("S3C2440DISP::WaitForNotBusyrn")));
  557. return;
  558. }
  559. int S3C2440DISP::IsBusy(void)
  560. {
  561. RETAILMSG(0, (TEXT("S3C2440DISP::IsBusyrn")));
  562. return 0;
  563. }
  564. void S3C2440DISP::GetPhysicalVideoMemory(unsigned long *physicalMemoryBase, unsigned long *videoMemorySize)
  565. {
  566. RETAILMSG(0, (TEXT("S3C2440DISP::GetPhysicalVideoMemoryrn")));
  567. *physicalMemoryBase = gdwLCDVirtualFrameBase;
  568. *videoMemorySize = m_cbScanLineLength * m_nScreenHeight;
  569. }
  570. SCODE S3C2440DISP::AllocSurface(GPESurf **surface, INT width, INT height, EGPEFormat format, INT surfaceFlags)
  571. {
  572. RETAILMSG(0, (TEXT("S3C2440DISP::AllocSurfacern")));
  573. if (surfaceFlags & GPE_REQUIRE_VIDEO_MEMORY)
  574. {
  575. return E_OUTOFMEMORY;
  576. }
  577. // Allocate from system memory
  578. *surface = new GPESurf(width, height, format);
  579. if (*surface != NULL)
  580. {
  581. // Check that the bits were allocated succesfully
  582. if (((*surface)->Buffer()) == NULL)
  583. {
  584. delete *surface; // Clean up
  585. }
  586. else
  587. {
  588. return S_OK;
  589. }
  590. }
  591. return E_OUTOFMEMORY;
  592. }
  593. SCODE S3C2440DISP::WrappedEmulatedLine (GPELineParms *lineParameters)
  594. {
  595. SCODE retval;
  596. RECT bounds;
  597. int N_plus_1; // Minor length of bounding rect + 1
  598. // calculate the bounding-rect to determine overlap with cursor
  599. if (lineParameters->dN) // The line has a diagonal component (we'll refresh the bounding rect)
  600. {
  601. N_plus_1 = 2 + ((lineParameters->cPels * lineParameters->dN) / lineParameters->dM);
  602. }
  603. else
  604. {
  605. N_plus_1 = 1;
  606. }
  607. switch(lineParameters->iDir)
  608. {
  609. case 0:
  610. bounds.left = lineParameters->xStart;
  611. bounds.top = lineParameters->yStart;
  612. bounds.right = lineParameters->xStart + lineParameters->cPels + 1;
  613. bounds.bottom = bounds.top + N_plus_1;
  614. break;
  615. case 1:
  616. bounds.left = lineParameters->xStart;
  617. bounds.top = lineParameters->yStart;
  618. bounds.bottom = lineParameters->yStart + lineParameters->cPels + 1;
  619. bounds.right = bounds.left + N_plus_1;
  620. break;
  621. case 2:
  622. bounds.right = lineParameters->xStart + 1;
  623. bounds.top = lineParameters->yStart;
  624. bounds.bottom = lineParameters->yStart + lineParameters->cPels + 1;
  625. bounds.left = bounds.right - N_plus_1;
  626. break;
  627. case 3:
  628. bounds.right = lineParameters->xStart + 1;
  629. bounds.top = lineParameters->yStart;
  630. bounds.left = lineParameters->xStart - lineParameters->cPels;
  631. bounds.bottom = bounds.top + N_plus_1;
  632. break;
  633. case 4:
  634. bounds.right = lineParameters->xStart + 1;
  635. bounds.bottom = lineParameters->yStart + 1;
  636. bounds.left = lineParameters->xStart - lineParameters->cPels;
  637. bounds.top = bounds.bottom - N_plus_1;
  638. break;
  639. case 5:
  640. bounds.right = lineParameters->xStart + 1;
  641. bounds.bottom = lineParameters->yStart + 1;
  642. bounds.top = lineParameters->yStart - lineParameters->cPels;
  643. bounds.left = bounds.right - N_plus_1;
  644. break;
  645. case 6:
  646. bounds.left = lineParameters->xStart;
  647. bounds.bottom = lineParameters->yStart + 1;
  648. bounds.top = lineParameters->yStart - lineParameters->cPels;
  649. bounds.right = bounds.left + N_plus_1;
  650. break;
  651. case 7:
  652. bounds.left = lineParameters->xStart;
  653. bounds.bottom = lineParameters->yStart + 1;
  654. bounds.right = lineParameters->xStart + lineParameters->cPels + 1;
  655. bounds.top = bounds.bottom - N_plus_1;
  656. break;
  657. default:
  658. RETAILMSG(0, (TEXT("Invalid direction: %drn"), lineParameters->iDir));
  659. return E_INVALIDARG;
  660. }
  661. // check for line overlap with cursor and turn off cursor if overlaps
  662. if (m_CursorVisible && !m_CursorDisabled &&
  663. m_CursorRect.top < bounds.bottom && m_CursorRect.bottom > bounds.top &&
  664. m_CursorRect.left < bounds.right && m_CursorRect.right > bounds.left)
  665. {
  666. CursorOff();
  667. m_CursorForcedOff = TRUE;
  668. }
  669. // do emulated line
  670. retval = EmulatedLine (lineParameters);
  671. // se if cursor was forced off because of overlap with line bouneds and turn back on
  672. if (m_CursorForcedOff)
  673. {
  674. m_CursorForcedOff = FALSE;
  675. CursorOn();
  676. }
  677. return retval;
  678. }
  679. SCODE S3C2440DISP::Line(GPELineParms *lineParameters, EGPEPhase phase)
  680. {
  681. RETAILMSG(0, (TEXT("S3C2440DISP::Linern")));
  682. if (phase == gpeSingle || phase == gpePrepare)
  683. {
  684. if ((lineParameters->pDst != m_pPrimarySurface))
  685. {
  686. lineParameters->pLine = EmulatedLine;
  687. }
  688. else
  689. {
  690. lineParameters->pLine = (SCODE (GPE::*)(struct GPELineParms *)) WrappedEmulatedLine;
  691. }
  692. }
  693. return S_OK;
  694. }
  695. SCODE S3C2440DISP::BltPrepare(GPEBltParms *blitParameters)
  696. {
  697. RECTL rectl;
  698. RETAILMSG(0, (TEXT("S3C2440DISP::BltPreparern")));
  699. // default to base EmulatedBlt routine
  700. blitParameters->pBlt = EmulatedBlt;
  701. // see if we need to deal with cursor
  702. if (m_CursorVisible && !m_CursorDisabled)
  703. {
  704. // check for destination overlap with cursor and turn off cursor if overlaps
  705. if (blitParameters->pDst == m_pPrimarySurface) // only care if dest is main display surface
  706. {
  707. if (blitParameters->prclDst != NULL) // make sure there is a valid prclDst
  708. {
  709. rectl = *blitParameters->prclDst; // if so, use it
  710. }
  711. else
  712. {
  713. rectl = m_CursorRect; // if not, use the Cursor rect - this forces the cursor to be turned off in this case
  714. }
  715. if (m_CursorRect.top < rectl.bottom && m_CursorRect.bottom > rectl.top &&
  716. m_CursorRect.left < rectl.right && m_CursorRect.right > rectl.left)
  717. {
  718. CursorOff();
  719. m_CursorForcedOff = TRUE;
  720. }
  721. }
  722. // check for source overlap with cursor and turn off cursor if overlaps
  723. if (blitParameters->pSrc == m_pPrimarySurface) // only care if source is main display surface
  724. {
  725. if (blitParameters->prclSrc != NULL) // make sure there is a valid prclSrc
  726. {
  727. rectl = *blitParameters->prclSrc; // if so, use it
  728. }
  729. else
  730. {
  731. rectl = m_CursorRect; // if not, use the CUrsor rect - this forces the cursor to be turned off in this case
  732. }
  733. if (m_CursorRect.top < rectl.bottom && m_CursorRect.bottom > rectl.top &&
  734. m_CursorRect.left < rectl.right && m_CursorRect.right > rectl.left)
  735. {
  736. CursorOff();
  737. m_CursorForcedOff = TRUE;
  738. }
  739. }
  740. }
  741. #ifdef ROTATE
  742.     if (m_iRotate && (blitParameters->pDst == m_pPrimarySurface || blitParameters->pSrc == m_pPrimarySurface))
  743.     {
  744.         blitParameters->pBlt = (SCODE (GPE::*)(GPEBltParms *))EmulatedBltRotate;
  745.     }
  746. #endif //ROTATE
  747. #ifdef CLEARTYPE
  748. if (((blitParameters->rop4 & 0xffff) == 0xaaf0 ) && (blitParameters->pMask->Format() == gpe8Bpp))
  749. {
  750.     switch (m_colorDepth)
  751.     {
  752.     case 16:
  753.   blitParameters->pBlt = (SCODE (GPE::*)(struct GPEBltParms *)) ClearTypeBlt::ClearTypeBltDst16;
  754. return S_OK;
  755.     case 24:
  756. blitParameters->pBlt = (SCODE (GPE::*)(struct GPEBltParms *)) ClearTypeBlt::ClearTypeBltDst24;
  757. return S_OK;
  758.     case 32:
  759. blitParameters->pBlt = (SCODE (GPE::*)(struct GPEBltParms *)) ClearTypeBlt::ClearTypeBltDst32;
  760. return S_OK;
  761.     default:
  762. break;
  763.     }
  764. }
  765. #endif //CLEARTYPE
  766. // see if there are any optimized software blits available
  767. EmulatedBltSelect02(blitParameters);
  768. EmulatedBltSelect08(blitParameters);
  769. EmulatedBltSelect16(blitParameters);
  770. return S_OK;
  771. }
  772. SCODE S3C2440DISP::BltComplete(GPEBltParms *blitParameters)
  773. {
  774. RETAILMSG(0, (TEXT("S3C2440DISP::BltCompletern")));
  775. // see if cursor was forced off because of overlap with source or destination and turn back on
  776. if (m_CursorForcedOff)
  777. {
  778. m_CursorForcedOff = FALSE;
  779. CursorOn();
  780. }
  781. return S_OK;
  782. }
  783. INT S3C2440DISP::InVBlank(void)
  784. {
  785. RETAILMSG(0, (TEXT("S3C2440DISP::InVBlankrn")));
  786. return 0;
  787. }
  788. SCODE S3C2440DISP::SetPalette(const PALETTEENTRY *source, USHORT firstEntry, USHORT numEntries)
  789. {
  790. RETAILMSG(0, (TEXT("S3C2440DISP::SetPalettern")));
  791. if (firstEntry < 0 || firstEntry + numEntries > 256 || source == NULL)
  792. {
  793. return E_INVALIDARG;
  794. }
  795. return S_OK;
  796. }
  797. ULONG S3C2440DISP::GetGraphicsCaps()
  798. {
  799.     
  800. #ifdef  CLEARTYPE
  801. return GCAPS_GRAY16 | GCAPS_CLEARTYPE;
  802. #else
  803. return  GCAPS_GRAY16;
  804. #endif 
  805. }
  806. void RegisterDDHALAPI(void)
  807. {
  808. return; // no DDHAL support
  809. }
  810. #if defined(CLEARTYPE) || defined(ROTATE)
  811. //extern GetGammaValue(ULONG * pGamma);
  812. //extern SetGammaValue(ULONG ulGamma, BOOL bUpdateReg);
  813. ULONG  S3C2440DISP::DrvEscape(
  814.                         SURFOBJ *pso,
  815.                         ULONG    iEsc,
  816.                         ULONG    cjIn,
  817.                         PVOID    pvIn,
  818.                         ULONG    cjOut,
  819.                         PVOID    pvOut)
  820. {
  821. /*
  822.     if (iEsc == DRVESC_GETGAMMAVALUE)
  823.     {
  824. return GetGammaValue((ULONG *)pvOut);
  825.     }
  826.     else if (iEsc == DRVESC_SETGAMMAVALUE)
  827.     {
  828. return SetGammaValue(cjIn, *(BOOL *)pvIn);
  829.     }
  830. */
  831. #ifdef ROTATE
  832.     if (iEsc == DRVESC_GETSCREENROTATION)
  833.     {
  834.         *(int *)pvOut = ((DMDO_0 | DMDO_90 | DMDO_180 | DMDO_270) << 8) | ((BYTE)m_iRotate);
  835.         return DISP_CHANGE_SUCCESSFUL; 
  836.     }
  837.     else if (iEsc == DRVESC_SETSCREENROTATION)
  838.     {
  839.         if ((cjIn == DMDO_0) ||
  840.            (cjIn == DMDO_90) ||
  841.            (cjIn == DMDO_180) ||
  842.            (cjIn == DMDO_270) )
  843.            {
  844.                return DynRotate(cjIn);
  845.            }
  846.         return DISP_CHANGE_BADMODE;
  847.     }
  848. #endif //ROTATE & ROTATE
  849.     
  850.     return 0;
  851. }
  852. #endif //CLEARTYPE
  853. ULONG *APIENTRY DrvGetMasks(DHPDEV dhpdev)
  854. {
  855. return gBitMasks;
  856. }
  857. #ifdef ROTATE
  858. void S3C2440DISP::SetRotateParms()
  859. {
  860.     int iswap;
  861.     switch(m_iRotate)
  862.     {
  863.     case DMDO_0:
  864. m_nScreenHeightSave = m_nScreenHeight;
  865. m_nScreenWidthSave = m_nScreenWidth;
  866. break;
  867.     case DMDO_180:
  868. m_nScreenHeightSave = m_nScreenHeight;
  869. m_nScreenWidthSave = m_nScreenWidth;
  870. break;
  871. case DMDO_90:
  872. case DMDO_270:
  873. iswap = m_nScreenHeight;
  874. m_nScreenHeight = m_nScreenWidth;
  875. m_nScreenWidth = iswap;
  876.     m_nScreenHeightSave = m_nScreenWidth;
  877.     m_nScreenWidthSave = m_nScreenHeight;
  878. break;
  879. default:
  880.    m_nScreenHeightSave = m_nScreenHeight;
  881. m_nScreenWidthSave = m_nScreenWidth;
  882. break;
  883.     }
  884. return;
  885. }
  886. LONG S3C2440DISP::DynRotate(int angle)
  887. {
  888.     GPESurfRotate *pSurf = (GPESurfRotate *)m_pPrimarySurface;
  889. if (angle == m_iRotate)
  890. return DISP_CHANGE_SUCCESSFUL;
  891. m_iRotate = angle;
  892. switch(m_iRotate)
  893.     {
  894.     case DMDO_0:
  895.     case DMDO_180:
  896. m_nScreenHeight = m_nScreenHeightSave;
  897. m_nScreenWidth = m_nScreenWidthSave;
  898. break;
  899. case DMDO_90:
  900. case DMDO_270:
  901. m_nScreenHeight = m_nScreenWidthSave;
  902. m_nScreenWidth = m_nScreenHeightSave;
  903. break;
  904.     }
  905. m_pMode->width = m_nScreenWidth;
  906. m_pMode->height = m_nScreenHeight;
  907. pSurf->SetRotation(m_nScreenWidth, m_nScreenHeight, angle);
  908. return DISP_CHANGE_SUCCESSFUL;
  909. }
  910. #endif //ROTATE