📄 s3c2410x_lcd.cpp
字号:
SCODE S3C2410DISP::Line(GPELineParms *lineParameters, EGPEPhase phase)
{
RETAILMSG(0, (TEXT("S3C2410DISP::Line\r\n")));
if (phase == gpeSingle || phase == gpePrepare)
{
if ((lineParameters->pDst != m_pPrimarySurface))
{
lineParameters->pLine = EmulatedLine;
}
else
{
lineParameters->pLine = (SCODE (GPE::*)(struct GPELineParms *)) WrappedEmulatedLine;
}
}
return S_OK;
}
SCODE S3C2410DISP::BltPrepare(GPEBltParms *blitParameters)
{
RECTL rectl;
RETAILMSG(0, (TEXT("S3C2410DISP::BltPrepare\r\n")));
// default to base EmulatedBlt routine
blitParameters->pBlt = EmulatedBlt;
// see if we need to deal with cursor
if (m_CursorVisible && !m_CursorDisabled)
{
// check for destination overlap with cursor and turn off cursor if overlaps
if (blitParameters->pDst == m_pPrimarySurface) // only care if dest is main display surface
{
if (blitParameters->prclDst != NULL) // make sure there is a valid prclDst
{
rectl = *blitParameters->prclDst; // if so, use it
}
else
{
rectl = m_CursorRect; // if not, use the Cursor rect - this forces the cursor to be turned off in this case
}
if (m_CursorRect.top < rectl.bottom && m_CursorRect.bottom > rectl.top &&
m_CursorRect.left < rectl.right && m_CursorRect.right > rectl.left)
{
CursorOff();
m_CursorForcedOff = TRUE;
}
}
// check for source overlap with cursor and turn off cursor if overlaps
if (blitParameters->pSrc == m_pPrimarySurface) // only care if source is main display surface
{
if (blitParameters->prclSrc != NULL) // make sure there is a valid prclSrc
{
rectl = *blitParameters->prclSrc; // if so, use it
}
else
{
rectl = m_CursorRect; // if not, use the CUrsor rect - this forces the cursor to be turned off in this case
}
if (m_CursorRect.top < rectl.bottom && m_CursorRect.bottom > rectl.top &&
m_CursorRect.left < rectl.right && m_CursorRect.right > rectl.left)
{
CursorOff();
m_CursorForcedOff = TRUE;
}
}
}
return S_OK;
}
SCODE S3C2410DISP::BltComplete(GPEBltParms *blitParameters)
{
RETAILMSG(0, (TEXT("S3C2410DISP::BltComplete\r\n")));
// see if cursor was forced off because of overlap with source or destination and turn back on
if (m_CursorForcedOff)
{
m_CursorForcedOff = FALSE;
CursorOn();
}
return S_OK;
}
INT S3C2410DISP::InVBlank(void)
{
RETAILMSG(0, (TEXT("S3C2410DISP::InVBlank\r\n")));
return 0;
}
SCODE S3C2410DISP::SetPalette(const PALETTEENTRY *source, USHORT firstEntry, USHORT numEntries)
{
RETAILMSG(0, (TEXT("S3C2410DISP::SetPalette\r\n")));
if (firstEntry < 0 || firstEntry + numEntries > 256 || source == NULL)
{
return E_INVALIDARG;
}
return S_OK;
}
ULONG S3C2410DISP::GetGraphicsCaps()
{
#ifdef CLEARTYPE
return GCAPS_GRAY16 | GCAPS_CLEARTYPE;
#else
return GCAPS_GRAY16;
#endif
}
#if defined(CLEARTYPE) || defined(ROTATE)
ULONG S3C2410DISP::DrvEscape(
SURFOBJ *pso,
ULONG iEsc,
ULONG cjIn,
PVOID pvIn,
ULONG cjOut,
PVOID pvOut)
{
if (iEsc == QUERYESCSUPPORT )
{
if (cjIn == sizeof(DWORD))
{
DWORD SupportChk = *(DWORD *)pvIn;
if ((SupportChk == GETRAWFRAMEBUFFER) ||
(SupportChk == GETGXINFO) )
return 1;
else
return 0;
}
else
{
SetLastError (ERROR_INVALID_PARAMETER);
return -1;
}
}
else if (iEsc == GETRAWFRAMEBUFFER )
{
if ((cjOut >= sizeof(RawFrameBufferInfo)) && (pvOut != NULL))
{
RawFrameBufferInfo *pRFBI = (RawFrameBufferInfo *)pvOut;
pRFBI->wBPP = m_pMode->Bpp;
pRFBI->wFormat= FORMAT_565;
pRFBI->cxStride = sizeof(WORD);
pRFBI->cyStride = m_pPrimarySurface->Stride();
pRFBI->cxPixels = m_pPrimarySurface->Width();
pRFBI->cyPixels = m_pPrimarySurface->Height();
pRFBI->pFramePointer = (PVOID)m_pPrimarySurface->Buffer();
return 1;
}
else
{
SetLastError (ERROR_INVALID_PARAMETER);
return -1;
}
}
else if (iEsc == GETGXINFO)
{
if((cjOut >= sizeof(GXDeviceInfo)) && (pvOut != NULL) &&
(m_pMode->Bpp == 8 || m_pMode->Bpp == 16 || m_pMode->Bpp == 24 || m_pMode->Bpp == 32))
{
if(((GXDeviceInfo*)pvOut)->idVersion == kidVersion100)
{
GXDeviceInfo* pgxoi = (GXDeviceInfo*)pvOut;
pgxoi->idVersion = kidVersion100;
if( m_DPI == HIGH_DPI_VALUE || m_DPI == HIGH_DPI_VALUE_TPC )
{
pgxoi->pvFrameBuffer = (void *)m_pvDRAMBuffer;
if( m_DPI == HIGH_DPI_VALUE )
{
pgxoi->cbStride = DISP_CY_STRIDE;
pgxoi->cxWidth = DISP_CX_SCREEN;
pgxoi->cyHeight = DISP_CY_SCREEN;
}
else
{
pgxoi->cbStride = DISP_CY_STRIDE_TPC;
pgxoi->cxWidth = DISP_CX_SCREEN_TPC;
pgxoi->cyHeight = DISP_CY_SCREEN_TPC;
}
pgxoi->cBPP = 16;
pgxoi->ffFormat = kfDirect | kfDirect565;
RETAILMSG(TRUE, (TEXT("m_pvDRAMBuffer is %x \r\n"), m_pvDRAMBuffer ));
}
else
{
pgxoi->pvFrameBuffer = (void *)m_pPrimarySurface->Buffer();
pgxoi->cbStride = m_pPrimarySurface->Stride();
pgxoi->cxWidth = m_pPrimarySurface->Width();
pgxoi->cyHeight = m_pPrimarySurface->Height();
switch(m_pMode->Bpp)
{
case 8:
pgxoi->cBPP = 8;
pgxoi->ffFormat = kfPalette;
break;
case 16:
pgxoi->cBPP = 16;
pgxoi->ffFormat = kfDirect | kfDirect565;
break;
case 24:
pgxoi->cBPP = 24;
pgxoi->ffFormat = kfDirect | kfDirect888;
break;
case 32:
pgxoi->cBPP = 32;
pgxoi->ffFormat = kfDirect | kfDirect888;
break;
}
}
#ifdef ROTATE
if (m_iRotate == DMDO_90 || m_iRotate == DMDO_270 )
pgxoi->ffFormat |= kfLandscape; // Rotated
#endif //ROTATE & ROTATE
pgxoi->vkButtonUpPortrait = VK_UP;
pgxoi->vkButtonUpLandscape = VK_LEFT;
pgxoi->ptButtonUp.x = 88;
pgxoi->ptButtonUp.y = 250;
pgxoi->vkButtonDownPortrait = VK_DOWN;
pgxoi->vkButtonDownLandscape = VK_RIGHT;
pgxoi->ptButtonDown.x = 88;
pgxoi->ptButtonDown.y = 270;
pgxoi->vkButtonLeftPortrait = VK_LEFT;
pgxoi->vkButtonLeftLandscape = VK_DOWN;
pgxoi->ptButtonLeft.x = 78;
pgxoi->ptButtonLeft.y = 260;
pgxoi->vkButtonRightPortrait = VK_RIGHT;
pgxoi->vkButtonRightLandscape = VK_UP;
pgxoi->ptButtonRight.x = 98;
pgxoi->ptButtonRight.y = 260;
pgxoi->vkButtonAPortrait = VK_F1; // Softkey 1
pgxoi->vkButtonALandscape = VK_F1;
pgxoi->ptButtonA.x = 10;
pgxoi->ptButtonA.y = 240;
pgxoi->vkButtonBPortrait = VK_F2; // Softkey 2
pgxoi->vkButtonBLandscape = VK_F2;
pgxoi->ptButtonB.x = 166;
pgxoi->ptButtonB.y = 240;
pgxoi->vkButtonCPortrait = VK_F8; // Asterisk on keypad
pgxoi->vkButtonCLandscape = VK_F8;
pgxoi->ptButtonC.x = 10;
pgxoi->ptButtonC.y = 320;
pgxoi->vkButtonStartPortrait = '\r';
pgxoi->vkButtonStartLandscape = '\r';
pgxoi->ptButtonStart.x = 88;
pgxoi->ptButtonStart.y = 260;
pgxoi->pvReserved1 = (void *) 0;
pgxoi->pvReserved2 = (void *) 0;
return 1;
}
}
return -1;
}
#ifdef ROTATE
if (iEsc == DRVESC_GETSCREENROTATION)
{
*(int *)pvOut = ((DMDO_0 | DMDO_90 | DMDO_180 | DMDO_270) << 8) | ((BYTE)m_iRotate);
return DISP_CHANGE_SUCCESSFUL;
}
else if (iEsc == DRVESC_SETSCREENROTATION)
{
if ((cjIn == DMDO_0) ||
(cjIn == DMDO_90) ||
(cjIn == DMDO_180) ||
(cjIn == DMDO_270) )
{
return DynRotate(cjIn);
}
return DISP_CHANGE_BADMODE;
}
#endif //ROTATE & ROTATE
return 0;
}
#endif //CLEARTYPE
ULONG *APIENTRY DrvGetMasks(DHPDEV dhpdev)
{
return gBitMasks;
}
#ifdef ROTATE
void S3C2410DISP::SetRotateParms()
{
int iswap;
switch(m_iRotate)
{
case DMDO_0:
m_nScreenHeightSave = m_nScreenHeight;
m_nScreenWidthSave = m_nScreenWidth;
break;
case DMDO_180:
m_nScreenHeightSave = m_nScreenHeight;
m_nScreenWidthSave = m_nScreenWidth;
break;
case DMDO_90:
case DMDO_270:
iswap = m_nScreenHeight;
m_nScreenHeight = m_nScreenWidth;
m_nScreenWidth = iswap;
m_nScreenHeightSave = m_nScreenWidth;
m_nScreenWidthSave = m_nScreenHeight;
break;
default:
m_nScreenHeightSave = m_nScreenHeight;
m_nScreenWidthSave = m_nScreenWidth;
break;
}
return;
}
LONG S3C2410DISP::DynRotate(int angle)
{
unsigned __int32 EmulatorAngle;
volatile S3C2410X_LCD_REG *s2410LCD;
GPESurfRotate *pSurf = (GPESurfRotate *)m_pPrimarySurface;
if (angle == m_iRotate)
return DISP_CHANGE_SUCCESSFUL;
m_iRotate = angle;
switch(m_iRotate)
{
case DMDO_0:
m_nScreenHeight = m_nScreenHeightSave;
m_nScreenWidth = m_nScreenWidthSave;
EmulatorAngle = 0;
break;
case DMDO_90:
m_nScreenHeight = m_nScreenWidthSave;
m_nScreenWidth = m_nScreenHeightSave;
EmulatorAngle = 1;
break;
case DMDO_180:
m_nScreenHeight = m_nScreenHeightSave;
m_nScreenWidth = m_nScreenWidthSave;
EmulatorAngle = 2;
break;
case DMDO_270:
m_nScreenHeight = m_nScreenWidthSave;
m_nScreenWidth = m_nScreenHeightSave;
EmulatorAngle = 3;
break;
}
// Inform the DeviceEmulator of the change in rotation
s2410LCD = (S3C2410X_LCD_REG *)VirtualAlloc(NULL, sizeof(*s2410LCD), MEM_RESERVE, PAGE_NOACCESS);
if (s2410LCD) {
if (VirtualCopy((PVOID)s2410LCD, (LPVOID)(S3C2410X_BASE_REG_PA_LCD>>8), sizeof(*s2410LCD), PAGE_READWRITE|PAGE_PHYSICAL|PAGE_NOCACHE)) {
s2410LCD->PAD[0] = EmulatorAngle;
}
VirtualFree((LPVOID)s2410LCD, 0, MEM_RELEASE);
}
m_pMode->width = m_nScreenWidth;
m_pMode->height = m_nScreenHeight;
pSurf->SetRotation(m_nScreenWidth, m_nScreenHeight, angle);
return DISP_CHANGE_SUCCESSFUL;
}
int
S3C2410DISP::GetRotateModeFromReg()
{
HKEY hKey;
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\GDI\\ROTATION"), 0, 0, &hKey))
{
DWORD dwSize, dwAngle, dwType = REG_DWORD;
dwSize = sizeof(DWORD);
if (ERROR_SUCCESS == RegQueryValueEx(hKey,
TEXT("ANGLE"),
NULL,
&dwType,
(LPBYTE)&dwAngle,
&dwSize))
{
switch (dwAngle)
{
case 0:
return DMDO_0;
case 90:
return DMDO_90;
case 180:
return DMDO_180;
case 270:
return DMDO_270;
default:
return DMDO_0;
}
}
RegCloseKey(hKey);
}
return DMDO_0;
}
#endif //ROTATE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -