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

📄 halsurf.cpp

📁 WinCE5.0BSP for Renesas SH7770
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
//  Copyright(C) Renesas Technology Corp. 1998-2004. All rights reserved.
//  Portions Copyright (c) 1997-1998 Microsoft Corporation.
//
//  NCG Display Driver for ITS-DS7
//
//  FILE      : halsurf.cpp
//  CREATED   : 2003.08.28
//  MODIFIED  : 2004.09.02
//  AUTHOR    : Renesas Technology Corp.
//  HARDWARE  : RENESAS ITS-DS7
//  HISTORY   : 
//              2003.08.28
//              - Created prototype code.
//                (based on Q2SD Display Driver for PFM-DS6C Ver.3.1.0)
//              2003.11.18
//              - Removed unused code.
//              2004.03.01
//              - Removed unused code.
//              2004.09.02
//              - Removed unused code.
//

#include "precomp.h"

DWORD WINAPI HalFlipToGDISurface( LPDDHAL_FLIPTOGDISURFACEDATA pd )
{
	DEBUGENTER( HalFlipToGDISurface );
	/*
	typedef struct _DDHAL_FLIPTOGDISURFACEDATA
	{
		LPDDRAWI_DIRECTDRAW_GBL    lpDD;             // driver struct
		DWORD                      dwToGDI;          // TRUE if flipping to the GDI surface, FALSE if flipping away
		DWORD                      dwReserved;       // reserved for future use
		HRESULT                    ddRVal;           // return value
		LPDDHAL_FLIPTOGDISURFACE   FlipToGDISurface; // PRIVATE: ptr to callback
	} DDHAL_FLIPTOGDISURFACEDATA;
	*/

	// Implementation
	pd->ddRVal = DD_OK;

	return DDHAL_DRIVER_HANDLED;
}


DWORD WINAPI HalCreateSurface( LPDDHAL_CREATESURFACEDATA pd )
{
	DEBUGENTER( HalCreateSurface );
	/*
	typedef struct _DDHAL_CREATESURFACEDATA
	{
	    LPDDRAWI_DIRECTDRAW_GBL     lpDD;           // driver struct
	    LPDDSURFACEDESC             lpDDSurfaceDesc;// description of surface being created
	    LPDDRAWI_DDRAWSURFACE_LCL   FAR *lplpSList; // list of created surface objects
	    DWORD                       dwSCnt;         // number of surfaces in SList
	    HRESULT                     ddRVal;         // return value
	    LPDDHAL_CREATESURFACE       CreateSurface;  // PRIVATE: ptr to callback
	} DDHAL_CREATESURFACEDATA;
	*/

    DWORD   dwFlags = pd->lpDDSurfaceDesc->dwFlags;
    DWORD   dwCaps = pd->lpDDSurfaceDesc->ddsCaps.dwCaps;
    LPDDPIXELFORMAT pddpf = (dwFlags & DDSD_PIXELFORMAT) ?
                        &(pd->lpDDSurfaceDesc->ddpfPixelFormat) : NULL;
    DWORD   dwBpp;

    if (pddpf != NULL) {
        if (pddpf->dwFlags & DDPF_RGB)
            dwBpp = pddpf->dwRGBBitCount;
        else
            dwBpp = 0;  // invalid bit depth
    }
    else
        dwBpp = NCGMode[0].gpeModeEx.modeInfo.Bpp;

    // Implementation

    if ((dwFlags & DDSD_CAPS) || (dwFlags & DDSD_ALL)) {
        DEBUGMSG(GPE_ZONE_CREATE,
            (TEXT("HalCreateSurface:dwCaps is 0x%08x.\r\n"), dwCaps));

        if (dwCaps & DDSCAPS_PRIMARYSURFACE) {
            if (pddpf != NULL && !(pddpf->dwFlags & DDPF_RGB)) {
                RETAILMSG(1,
                    (TEXT("HalCreateSurface: ")
                    TEXT("Unsupported non-linear primary surface.\r\n")));
                pd->ddRVal = DDERR_INVALIDPIXELFORMAT;
                return DDHAL_DRIVER_HANDLED;
            }
        }
        else if (dwCaps & DDSCAPS_OVERLAY) {
            RETAILMSG(1,
                (TEXT("HalCreateSurface: ")
                TEXT("Unsupported overlay surface.\r\n")));
            pd->ddRVal = DDERR_INVALIDCAPS;
            return DDHAL_DRIVER_HANDLED;
        }
    }
    else
        DEBUGMSG(GPE_ZONE_CREATE,
            (TEXT("HalCreateSurface: DDSCAPS is unused.\r\n")));

    // Other pixel format errors are checked in DetectPixelFormat.

	DDGPECreateSurface(pd);

	if (pd->ddRVal != DD_OK) {
		RETAILMSG(1, (TEXT("HalCreateSurface: DDGPECreateSurface failed.\r\n")));
		return DDHAL_DRIVER_HANDLED;
	}

	return DDHAL_DRIVER_HANDLED;
}


//////////////////////////// DDHAL_DDEXEBUFCALLBACKS ////////////////////////////

DWORD WINAPI HalCanCreateSurface( LPDDHAL_CANCREATESURFACEDATA pd )
{
	DEBUGENTER( HalCanCreateSurface );
	/*
	typedef struct _DDHAL_CANCREATESURFACEDATA
	{
	    LPDDRAWI_DIRECTDRAW_GBL	lpDD;				// driver struct
	    LPDDSURFACEDESC			lpDDSurfaceDesc;	// description of surface being created
	    DWORD					bIsDifferentPixelFormat;
	    											// pixel format differs from primary surface
	    HRESULT					ddRVal;				// return value
	    LPDDHAL_CANCREATESURFACE	CanCreateSurface;
	    											// PRIVATE: ptr to callback
	} DDHAL_CANCREATESURFACEDATA;
	*/

	// Implementation

    DWORD   dwFlags = pd->lpDDSurfaceDesc->dwFlags;
    DWORD   dwCaps = pd->lpDDSurfaceDesc->ddsCaps.dwCaps;

    LPDDPIXELFORMAT pddpf = (dwFlags & DDSD_PIXELFORMAT) ?
                        &(pd->lpDDSurfaceDesc->ddpfPixelFormat) : NULL;
    DWORD   dwBpp;

    if (pddpf != NULL) {
        if (pddpf->dwFlags & DDPF_RGB)
            dwBpp = pddpf->dwRGBBitCount;
        else if (pddpf->dwFlags & DDPF_FOURCC)
            dwBpp = pddpf->dwRGBBitCount;
        else
            dwBpp = 0;  // invalid bit depth
    }
    else
        dwBpp = NCGMode[0].gpeModeEx.modeInfo.Bpp;

    // check dwHeight and dwWidth for avoiding restriction of DirectDraw
    if (((dwFlags & DDSD_HEIGHT) && (pd->lpDDSurfaceDesc->dwHeight >= 0x00010000)) ||
        ((dwFlags & DDSD_WIDTH ) && (pd->lpDDSurfaceDesc->dwWidth  >= 0x00010000))) {
        pd->ddRVal = DDERR_INVALIDPARAMS;
        goto CannotCreate;
    }

    // primary surface
    if (dwCaps & DDSCAPS_PRIMARYSURFACE) {
        // pixel format
        if (pddpf != NULL) {
            if (pddpf->dwFlags & (
                DDPF_FOURCC |
                DDPF_ALPHA | DDPF_ALPHAPIXELS | DDPF_ALPHAPREMULT |
                DDPF_BUMPLUMINANCE | DDPF_BUMPDUDV |
                DDPF_LUMINANCE | DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2 |
                DDPF_PALETTEINDEXED4 | DDPF_RGBTOYUV | DDPF_STENCILBUFFER |
                DDPF_YUV | DDPF_ZBUFFER | DDPF_ZPIXELS)) {
                RETAILMSG(1,
                    (TEXT("HalCanCreateSurface: ")
                    TEXT("Unsupported pixel format for primary surface.\r\n")));
                pd->ddRVal = DDERR_INVALIDPIXELFORMAT;
                goto CannotCreate;
            }
        }

        if (dwBpp == 16)
            goto CanCreate;
        else {
            RETAILMSG(1,
                (TEXT("HalCanCreateSurface: ")
                TEXT("%dbpp not supported for primary surface.\r\n"),
                pddpf->dwRGBBitCount));
            pd->ddRVal = DDERR_INVALIDPIXELFORMAT;
            goto CannotCreate;
        }
    }

    // overlay surface
    else if (dwCaps & DDSCAPS_OVERLAY) {
        RETAILMSG(1,
            (TEXT("HalCanCreateSurface: ")
            TEXT("Unsupported overlay surface.\r\n")));
        pd->ddRVal = DDERR_INVALIDCAPS;
    }

    // offscreen surface
    else {
        // pixel format
        if (pddpf == NULL)
            goto CanCreate; // pixel format not specified
        else if (pddpf->dwFlags & (
            DDPF_ALPHA | DDPF_ALPHAPIXELS | DDPF_ALPHAPREMULT |
            DDPF_BUMPLUMINANCE | DDPF_BUMPDUDV |
            DDPF_LUMINANCE | DDPF_PALETTEINDEXED2 |
            DDPF_PALETTEINDEXED4 | DDPF_RGBTOYUV | DDPF_STENCILBUFFER |
            DDPF_YUV | DDPF_ZBUFFER | DDPF_ZPIXELS)) {
            RETAILMSG(1,
                (TEXT("HalCanCreateSurface: Unsupported pixel format for offscreen surface.\r\n")));
            pd->ddRVal = DDERR_INVALIDPIXELFORMAT;
            goto CannotCreate;
        }

        // other case, DirectDraw-compatible linearmapped offscreen
        if (dwBpp == 1 || dwBpp == 8 || dwBpp == 16)
            goto CanCreate;
        else {
            RETAILMSG(1,
                (TEXT("HalCanCreateSurface: %dbpp not supported for offscreen surface.\r\n"),
                dwBpp));
            pd->ddRVal = DDERR_INVALIDPIXELFORMAT;
            goto CannotCreate;
        }
    }

CanCreate:
    DEBUGMSG(GPE_ZONE_CREATE,
        (TEXT("HalCanCreateSurface: Accepted.\r\n")));
	pd->ddRVal = DD_OK;
	return DDHAL_DRIVER_HANDLED;

CannotCreate:
    DEBUGMSG(GPE_ZONE_CREATE,
        (TEXT("HalCanCreateSurface: Rejected.\r\n")));
    return DDHAL_DRIVER_HANDLED;
}


DWORD WINAPI HalCreateExecuteBuffer( LPDDHAL_CREATESURFACEDATA pd )
{
	DEBUGENTER( HalCreateExecuteBuffer );
	/*
	typedef struct _DDHAL_CREATESURFACEDATA
	{
	    LPDDRAWI_DIRECTDRAW_GBL     lpDD;           // driver struct
	    LPDDSURFACEDESC             lpDDSurfaceDesc;// description of surface being created
	    LPDDRAWI_DDRAWSURFACE_LCL   FAR *lplpSList; // list of created surface objects
	    DWORD                       dwSCnt;         // number of surfaces in SList
	    HRESULT                     ddRVal;         // return value
	    LPDDHAL_CREATESURFACE       CreateSurface;  // PRIVATE: ptr to callback
	} DDHAL_CREATESURFACEDATA;
	*/

	// Implementation
	pd->ddRVal = DD_OK;

	return DDHAL_DRIVER_HANDLED;
}


DWORD WINAPI HalDestroyExecuteBuffer( LPDDHAL_DESTROYSURFACEDATA pd )
{
	DEBUGENTER( HalDestroyExecutebuffer );
	/*
	typedef struct _DDHAL_DESTROYSURFACEDATA
	{
	    LPDDRAWI_DIRECTDRAW_GBL     lpDD;           // driver struct
	    LPDDRAWI_DDRAWSURFACE_LCL   lpDDSurface;    // surface struct
	    HRESULT                     ddRVal;         // return value
	    LPDDHALSURFCB_DESTROYSURFACE DestroySurface;// PRIVATE: ptr to callback
		BOOL						fDestroyGlobal;
	} DDHAL_DESTROYSURFACEDATA;
	*/

	// Implementation
	pd->ddRVal = DD_OK;

	return DDHAL_DRIVER_HANDLED;
}


DWORD WINAPI HalLock( LPDDHAL_LOCKDATA pd )
{
	DEBUGENTER( HalLock );
	/*
	typedef struct _DDHAL_LOCKDATA
	{
	    LPDDRAWI_DIRECTDRAW_GBL     lpDD;           // driver struct
	    LPDDRAWI_DDRAWSURFACE_LCL   lpDDSurface;    // surface struct
	    DWORD                       bHasRect;       // rArea is valid
	    RECTL                       rArea;          // area being locked
	    LPVOID                      lpSurfData;     // pointer to screen memory (return value)
	    HRESULT                     ddRVal;         // return value
	    LPDDHALSURFCB_LOCK          Lock;           // PRIVATE: ptr to callback
	} DDHAL_LOCKDATA;
	*/

⌨️ 快捷键说明

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