⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sa2video.cpp

📁 Intel PXA27X Display Driver Windows CE
💻 CPP
📖 第 1 页 / 共 4 页
字号:
            XllpLCD._DMA_CHANNEL_2_Y_FRAME_DESCRIPTOR_BASE_PHYSICAL = DMA_CHANNEL_2_Y_FRAME_DESCRIPTOR_BASE_PHYSICAL;
            XllpLCD._DMA_CHANNEL_3_Cb_FRAME_DESCRIPTOR_BASE_PHYSICAL = DMA_CHANNEL_3_Cb_FRAME_DESCRIPTOR_BASE_PHYSICAL;
            XllpLCD._DMA_CHANNEL_4_Cr_FRAME_DESCRIPTOR_BASE_PHYSICAL = DMA_CHANNEL_4_Cr_FRAME_DESCRIPTOR_BASE_PHYSICAL;

            if (frameDescriptorCh2_YCbCr_Y)
                VirtualFree((PVOID)frameDescriptorCh2_YCbCr_Y,0,MEM_RELEASE);

            frameDescriptorCh2_YCbCr_Y = (volatile LCD_FRAME_DESCRIPTOR *)VirtualAllocCopy(sizeof(LCD_FRAME_DESCRIPTOR), "DispDrvrInitialize : lcdFrameDescriptor", (PVOID)(DMA_CHANNEL_2_Y_FRAME_DESCRIPTOR_BASE_VIRTUAL));
            if (!frameDescriptorCh2_YCbCr_Y)
            {
                RetVal = 0;    
                break;
            }

            if (frameDescriptorCh3_YCbCr_Cb)
                VirtualFree((PVOID)frameDescriptorCh3_YCbCr_Cb,0,MEM_RELEASE);

            frameDescriptorCh3_YCbCr_Cb = (volatile LCD_FRAME_DESCRIPTOR *)VirtualAllocCopy(sizeof(LCD_FRAME_DESCRIPTOR), "DispDrvrInitialize : lcdFrameDescriptor", (PVOID)(DMA_CHANNEL_3_Cb_FRAME_DESCRIPTOR_BASE_VIRTUAL));
            if (!frameDescriptorCh3_YCbCr_Cb)
            {
                RetVal = 0;    
                break;
            }

            if (frameDescriptorCh4_YCbCr_Cr)
                VirtualFree((PVOID)frameDescriptorCh4_YCbCr_Cr,0,MEM_RELEASE);

            frameDescriptorCh4_YCbCr_Cr = (volatile LCD_FRAME_DESCRIPTOR *)VirtualAllocCopy(sizeof(LCD_FRAME_DESCRIPTOR), "DispDrvrInitialize : lcdFrameDescriptor", (PVOID)(DMA_CHANNEL_4_Cr_FRAME_DESCRIPTOR_BASE_VIRTUAL));
            if (!frameDescriptorCh4_YCbCr_Cr)
            {
                RetVal = 0;    
                break;
            }


            XllpLCD.frameDescriptorCh2_YCbCr_Y = frameDescriptorCh2_YCbCr_Y;
            XllpLCD.frameDescriptorCh3_YCbCr_Cb = frameDescriptorCh3_YCbCr_Cb; 
            XllpLCD.frameDescriptorCh4_YCbCr_Cr = frameDescriptorCh4_YCbCr_Cr;

            ((P_XLLP_OVERLAY_T)pvIn)->CH2_Y = OVERLAY2_VIRTUAL_BASE_ADDRESS;
            ((P_XLLP_OVERLAY_T)pvIn)->CH3_Cb = OVERLAY2_VIRTUAL_BASE_ADDRESS + ((P_XLLP_OVERLAY_T)pvIn)->ch2_size;
            ((P_XLLP_OVERLAY_T)pvIn)->CH4_Cr = OVERLAY2_VIRTUAL_BASE_ADDRESS + ((P_XLLP_OVERLAY_T)pvIn)->ch2_size + ((P_XLLP_OVERLAY_T)pvIn)->ch3_size;
            ((P_XLLP_OVERLAY_T)pvIn)->OverlayBPP = O_BPP_16;
            ((P_XLLP_OVERLAY_T)pvIn)->TmpBPP = XllpLCD.BPP;

            break;

        case DRVESC_GETSCREENROTATION:
            *(int *)pvOut = ((DMDO_0 | DMDO_90 | DMDO_180 | DMDO_270) << 8) | ((BYTE)m_iRotate);
            return DISP_CHANGE_SUCCESSFUL; 
            break;
    
        case DRVESC_SETSCREENROTATION:
            if ((cjIn == DMDO_0)    ||
                (cjIn == DMDO_90)    ||
                (cjIn == DMDO_180)    ||
                (cjIn == DMDO_270) )
                {
                    return DynRotate(cjIn);
                }

            return DISP_CHANGE_BADMODE;
            break;

        case GETGXINFO:
            // Fill out the GAPI data structure.  Assumes 16bpp or 8bpp, with RGB565 format.
            // Must change cBPP and ffFormat fields to accomodate other formats.
            // All of the button data that follows must be filled out to match the specific OEM device.
            // The data that is used to fill out the data structure here is copied from
            // the Microsoft example.  
            if ((cjOut >= sizeof(GXDeviceInfo)) && (pvOut != NULL) ) 
            {
                if (((GXDeviceInfo *) pvOut)->idVersion == kidVersion100) 
                {
                    pgxoi = (GXDeviceInfo *) pvOut;
                    pgxoi->idVersion = kidVersion100;
                    pgxoi->pvFrameBuffer = (void *) FRAME_BUFFER_0_BASE_VIRTUAL;
                    
                    // cbStride reflects the physical properties of the display regardless of orientation.
                    // Using a native portrait mode display, stride will always be 480.
                    // If using native landscape mode display, stride would be 640.
                    if (((DispDrvr_cxScreen == 240) && (DispDrvr_cyScreen == 320)) ||
                        ((DispDrvr_cxScreen == 320) && (DispDrvr_cyScreen == 240)) )
                    {
                        if (bpp == 16)
                        {
                            pgxoi->cbStride = 480;
                            pgxoi->cBPP = 16;
                        }
                        if (bpp == 8)
                        {
                            pgxoi->cbStride = 240;
                            pgxoi->cBPP = 16;
                        }
                    }

                    // Using a native landscape mode display, stride will always be 1280.
                    // If using native portrait mode display, stride would be 960.

                    if (((DispDrvr_cxScreen == 480) && (DispDrvr_cyScreen == 640)) ||
                        ((DispDrvr_cxScreen == 640) && (DispDrvr_cyScreen == 480)) )
                    {
                        if (bpp == 16)
                        {
                            pgxoi->cbStride = 1280;
                            pgxoi->cBPP = 16;
                        }
                        if (bpp == 8)
                        {
                            pgxoi->cbStride = 640;
                            pgxoi->cBPP = 16;
                        }
                    }

                    
                    pgxoi->cxWidth = DispDrvr_cxScreen;
                    pgxoi->cyHeight = DispDrvr_cyScreen;

                    // Set kfLandscape only if the display orientation is not in its native format
                    pgxoi->ffFormat= kfDirect565; 


                    pgxoi->vkButtonUpPortrait = VK_UP;
                    pgxoi->vkButtonUpLandscape = 0xC3;
                    pgxoi->ptButtonUp.x = -50;
                    pgxoi->ptButtonUp.y = 0;
                    pgxoi->vkButtonDownPortrait = VK_DOWN;
                    pgxoi->vkButtonDownLandscape = 0xC4;
                    pgxoi->ptButtonDown.x = -50;
                    pgxoi->ptButtonDown.y = 30;
                    pgxoi->vkButtonLeftPortrait = 0xC2;
                    pgxoi->vkButtonLeftLandscape = VK_DOWN;
                    pgxoi->ptButtonLeft.x = 25;
                    pgxoi->ptButtonLeft.y = 400;
                    pgxoi->vkButtonRightPortrait = 0xC3;
                    pgxoi->vkButtonRightLandscape = VK_UP;
                    pgxoi->ptButtonRight.x = 90;
                    pgxoi->ptButtonRight.y = 410;
                    pgxoi->vkButtonAPortrait = 0xC4;
                    pgxoi->vkButtonALandscape = 0xC2;
                    pgxoi->ptButtonA.x = 150;
                    pgxoi->ptButtonA.y = 410;
                    pgxoi->vkButtonBPortrait = 0xC5;
                    pgxoi->vkButtonBLandscape = 0xC5;
                    pgxoi->ptButtonB.x = 220;
                    pgxoi->ptButtonB.y = 400;
                    pgxoi->vkButtonCPortrait = VK_ESCAPE;
                    pgxoi->vkButtonCLandscape = VK_ESCAPE;
                    pgxoi->ptButtonC.x = -50;
                    pgxoi->ptButtonC.y = 100;
                    pgxoi->vkButtonStartPortrait = VK_F23;
                    pgxoi->vkButtonStartLandscape = VK_F23;
                    pgxoi->ptButtonStart.x = -50;
                    pgxoi->ptButtonStart.y = 15;
                    pgxoi->pvReserved1 = (void *) 0;
                    pgxoi->pvReserved2 = (void *) 0;
                    RetVal = 1;
                } else 
                {
                    SetLastError (ERROR_INVALID_PARAMETER);
                    RetVal = -1;
                }
            } else {
                SetLastError (ERROR_INVALID_PARAMETER);
                RetVal = -1;
            }
            break;

        default:
            RetVal = 0;
            break;
    }
    return RetVal;
}

int
SA2Video::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;
}

void
SA2Video::SetRotateParams()
{
    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
SA2Video::DynRotate(
    int angle
    )
{
    GPESurfRotate *pSurf = (GPESurfRotate *)m_pPrimarySurface;

    if (m_InDDraw)
    {
        return DISP_CHANGE_BADMODE;
    }

    if (angle == m_iRotate)
    {
        return DISP_CHANGE_SUCCESSFUL;
    }

    CursorOff();

    m_iRotate = angle;

    switch(m_iRotate)
    {
    case DMDO_0:
    case DMDO_180:
        m_nScreenHeight = m_nScreenHeightSave;
        m_nScreenWidth  = m_nScreenWidthSave;
        break;

    case DMDO_90:
    case DMDO_270:
        m_nScreenHeight = m_nScreenWidthSave;
        m_nScreenWidth  = m_nScreenHeightSave;
        break;
    }

    m_pMode->width  = m_nScreenWidth;
    m_pMode->height = m_nScreenHeight;
    pSurf->SetRotation(m_nScreenWidth, m_nScreenHeight, angle);

    CursorOn();

    return DISP_CHANGE_SUCCESSFUL;
}

void
SA2Video::CursorOn()
{
    USHORT * ptrScreen = (USHORT *)m_pPrimarySurface->Buffer();
    USHORT * ptrLine;
    USHORT * cbsLine;

    if (!m_CursorForcedOff && !m_CursorDisabled && !m_CursorVisible)
    {
        RECTL cursorRectSave = m_CursorRect;
        int   iRotate;

        RotateRectl(&m_CursorRect);
        for (int y = m_CursorRect.top; y < m_CursorRect.bottom; y++)
        {
            if (y < 0)
            {
                continue;
            }
            if (y >= m_nScreenHeightSave)
            {
                break;
            }

            ptrLine = &ptrScreen[y * m_pPrimarySurface->Stride() / 2];
            cbsLine = &m_CursorBackingStore[(y - m_CursorRect.top) * m_CursorSize.x];

            for (int x = m_CursorRect.left; x < m_CursorRect.right; x++)
            {
                if (x < 0)
                {
                    continue;
                }
                if (x >= m_nScreenWidthSave)
                {
                    break;
                }

                // x' = x - m_CursorRect.left; y' = y - m_CursorRect.top;
                // Width = m_CursorSize.x;   Height = m_CursorSize.y;
                switch (m_iRotate)
                {
                    case DMDO_0:
                        iRotate = (y - m_CursorRect.top)*m_CursorSize.x + x - m_CursorRect.left;
                        break;
                    case DMDO_90:
                        iRotate = (x - m_CursorRect.left)*m_CursorSize.x + m_CursorSize.y - 1 - (y - m_CursorRect.top);
                        break;
                    case DMDO_180:
                        iRotate = (m_CursorSize.y - 1 - (y - m_CursorRect.top))*m_CursorSize.x + m_CursorSize.x - 1 - (x - m_CursorRect.left);
                        break;
                    case DMDO_270:
                        iRotate = (m_CursorSize.x -1 - (x - m_CursorRect.left))*m_CursorSize.x + y - m_CursorRect.top;
                        break;
                    default:
                        iRotate = (y - m_CursorRect.top)*m_CursorSize.x + x - m_CursorRect.left;
                        break;
                }

                cbsLine[x - m_CursorRect.left] = ptrLine[x];
                ptrLine[x] &= gCursorMask[iRotate];
                ptrLine[x] ^= gCursorData[iRotate];
            }
        }

        m_CursorRect    = cursorRectSave;
        m_CursorVisible = TRUE;
    }
}

void
SA2Video::CursorOff()
{
    USHORT * ptrScreen = (USHORT*)m_pPrimarySurface->Buffer();
    USHORT * ptrLine;
    USHORT * cbsLine;

    if (!m_CursorForcedOff && !m_CursorDisabled && m_CursorVisible)
    {
        RECTL rSave = m_CursorRect;
        RotateRectl(&m_CursorRect);

        for (int y = m_CursorRect.top; y < m_CursorRect.bottom; y++)
        {
            // clip to displayable screen area (top/bottom)
            if (y < 0)
            {
                continue;
            }
            if (y >= m_nScreenHeightSave)
            {
                break;
            }

            ptrLine = &ptrScreen[y * m_pPrimarySurface->Stride() / 2];
            cbsLine = &m_CursorBackingStore[(y - m_CursorRect.top) * m_CursorSize.x];

            for (int x = m_CursorRect.left; x < m_CursorRect.right; x++)
            {
                // clip to displayable screen area (left/right)
                if (x < 0)
                {
                    continue;
                }
                if (x >= (int)m_nScreenWidthSave)
                {
                    break;
                }

                ptrLine[x] = cbsLine[x - m_CursorRect.left];
            }
        }

        m_CursorRect = rSave;
        m_CursorVisible = FALSE;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -