enable.c

来自「一个类似windows」· C语言 代码 · 共 607 行 · 第 1/2 页

C
607
字号
/*
 * entry.c
 *
 * $Revision: 1.5 $
 * $Author: audit $
 * $Date: 2006-03-08 18:23:57 -0500 (Wed, 08 Mar 2006) $
 *
 */

#include "../vgaddi.h"
#include "../vgavideo/vgavideo.h"
#define NDEBUG
#include <debug.h>

#define  DBG_PREFIX  "VGADDI: "

static BOOL VGAInitialized = FALSE;

DRVFN FuncList[] =
{
  /*  Required Display driver fuctions  */
  {INDEX_DrvAssertMode, (PFN) DrvAssertMode},
  {INDEX_DrvCompletePDEV, (PFN) DrvCompletePDEV},
  {INDEX_DrvCopyBits, (PFN) DrvCopyBits},
  {INDEX_DrvDisablePDEV, (PFN) DrvDisablePDEV},
  {INDEX_DrvDisableSurface, (PFN) DrvDisableSurface},
  {INDEX_DrvEnablePDEV, (PFN) DrvEnablePDEV},
  {INDEX_DrvEnableSurface, (PFN) DrvEnableSurface},
  {INDEX_DrvGetModes, (PFN) DrvGetModes},
  {INDEX_DrvLineTo, (PFN) DrvLineTo},
  {INDEX_DrvPaint, (PFN) DrvPaint},
  {INDEX_DrvBitBlt, (PFN) DrvBitBlt},
  {INDEX_DrvTransparentBlt, (PFN) DrvTransparentBlt},
  {INDEX_DrvMovePointer, (PFN) DrvMovePointer},
  {INDEX_DrvSetPointerShape, (PFN) DrvSetPointerShape},

#if 0
  /*  Optional Display driver functions  */
  {INDEX_, (PFN) },
  {INDEX_DescribePixelFormat, (PFN) VGADDIDescribePixelFormat},
  {INDEX_DrvDitherColor, (PFN) VGADDIDitherColor},
  {INDEX_DrvFillPath, (PFN) VGADDIFillPath},
  {INDEX_DrvGetTrueTypeFile, (PFN) VGADDIGetTrueTypeFile},
  {INDEX_DrvLoadFontFile, (PFN) VGADDILoadFontFile},
  {INDEX_DrvQueryFont, (PFN) VGADDIQueryFont},
  {INDEX_DrvQueryFontCaps, (PFN) VGADDIQueryFontCaps},
  {INDEX_DrvQueryFontData, (PFN) VGADDIQueryFontData},
  {INDEX_DrvQueryFontFile, (PFN) VGADDIQueryFontFile},
  {INDEX_DrvQueryFontTree, (PFN) VGADDIQueryFontTree},
  {INDEX_DrvQueryTrueTypeOutline, (PFN) VGADDIQueryTrueTypeOutline},
  {INDEX_DrvQueryTrueTypeTable, (PFN) VGADDIQueryTrueTypeTable},
  {INDEX_DrvRealizeBrush, (PFN) VGADDIRealizeBrush},
  {INDEX_DrvResetPDEV, (PFN) VGADDIResetPDEV},
  {INDEX_DrvSetPalette, (PFN) VGADDISetPalette},
  {INDEX_DrvSetPixelFormat, (PFN) VGADDISetPixelFormat},
  {INDEX_DrvStretchBlt, (PFN) VGADDIStretchBlt},
  {INDEX_DrvStrokePath, (PFN) VGADDIStrokePath},
  {INDEX_DrvSwapBuffers, (PFN) VGADDISwapBuffers},
  {INDEX_DrvTextOut, (PFN) VGADDITextOut},
  {INDEX_DrvUnloadFontFile, (PFN) VGADDIUnloadFontFile},
#endif
};

GDIINFO gaulCap = {
  GDI_DRIVER_VERSION,
  DT_RASDISPLAY,         // ulTechnology
  0,                     // ulHorzSize
  0,                     // ulVertSize
  0,                     // ulHorzRes (filled in at initialization)
  0,                     // ulVertRes (filled in at initialization)
  4,                     // cBitsPixel
  1,                     // cPlanes
  16,                    // ulNumColors
  0,                     // flRaster (DDI reserved field)

  96,                    // ulLogPixelsX (must be set to 96 according to MSDN)
  96,                    // ulLogPixelsY (must be set to 96 according to MSDN)

  TC_RA_ABLE | TC_SCROLLBLT,  // flTextCaps

  6,                     // ulDACRed
  6,                     // ulDACGree
  6,                     // ulDACBlue

  0x0024,                // ulAspectX  (one-to-one aspect ratio)
  0x0024,                // ulAspectY
  0x0033,                // ulAspectXY

  1,                     // xStyleStep
  1,                     // yStyleSte;
  3,                     // denStyleStep

  { 0, 0 },              // ptlPhysOffset
  { 0, 0 },              // szlPhysSize

  0,                     // ulNumPalReg (win3.1 16 color drivers say 0 too)

// These fields are for halftone initialization.

  {                                         // ciDevice, ColorInfo
    { 6700, 3300, 0 },                      // Red
    { 2100, 7100, 0 },                      // Green
    { 1400,  800, 0 },                      // Blue
    { 1750, 3950, 0 },                      // Cyan
    { 4050, 2050, 0 },                      // Magenta
    { 4400, 5200, 0 },                      // Yellow
    { 3127, 3290, 0 },                      // AlignmentWhite
    20000,                                  // RedGamma
    20000,                                  // GreenGamma
    20000,                                  // BlueGamma
    0, 0, 0, 0, 0, 0
  },

  0,                                         // ulDevicePelsDPI
  PRIMARY_ORDER_CBA,                         // ulPrimaryOrder
  HT_PATSIZE_4x4_M,                          // ulHTPatternSize
  HT_FORMAT_4BPP_IRGB,                       // ulHTOutputFormat
  HT_FLAG_ADDITIVE_PRIMS,                    // flHTFlags

  0,                                         // ulVRefresh
  8,                                         // ulBltAlignment
  0,                                         // ulPanningHorzRes
  0,                                         // ulPanningVertRes
};

// Palette for VGA

typedef struct _VGALOGPALETTE
{
   USHORT ident;
   USHORT NumEntries;
   PALETTEENTRY PaletteEntry[16];
} VGALOGPALETTE;

const VGALOGPALETTE VGApalette =
{

0x400,  // driver version
16,     // num entries
{
  { 0x00, 0x00, 0x00, 0x00 }, // 0
  { 0x80, 0x00, 0x00, 0x00 }, // 1
  { 0x00, 0x80, 0x00, 0x00 }, // 2
  { 0x80, 0x80, 0x00, 0x00 }, // 3
  { 0x00, 0x00, 0x80, 0x00 }, // 4
  { 0x80, 0x00, 0x80, 0x00 }, // 5
  { 0x00, 0x80, 0x80, 0x00 }, // 6
  { 0x80, 0x80, 0x80, 0x00 }, // 7
  { 0xc0, 0xc0, 0xc0, 0x00 }, // 8
  { 0xff, 0x00, 0x00, 0x00 }, // 9
  { 0x00, 0xff, 0x00, 0x00 }, // 10
  { 0xff, 0xff, 0x00, 0x00 }, // 11
  { 0x00, 0x00, 0xff, 0x00 }, // 12
  { 0xff, 0x00, 0xff, 0x00 }, // 13
  { 0x00, 0xff, 0xff, 0x00 }, // 14
  { 0xff, 0xff, 0xff, 0x00 } // 15
}
};

// Devinfo structure passed back to the engine in DrvEnablePDEV

#define SYSTM_LOGFONT {16,7,0,0,700,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH | FF_DONTCARE, L"System"}
#define HELVE_LOGFONT {12,9,0,0,400,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_STROKE_PRECIS,PROOF_QUALITY,VARIABLE_PITCH | FF_DONTCARE, L"MS Sans Serif"}
#define COURI_LOGFONT {12,9,0,0,400,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_STROKE_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_DONTCARE, L"Courier"}

DEVINFO devinfoVGA =
{
  (GCAPS_OPAQUERECT | GCAPS_HORIZSTRIKE | GCAPS_ALTERNATEFILL | GCAPS_MONO_DITHER | GCAPS_COLOR_DITHER |
   GCAPS_WINDINGFILL | GCAPS_DITHERONREALIZE
   ),       // Graphics capabilities

  SYSTM_LOGFONT,  // Default font description
  HELVE_LOGFONT,  // ANSI variable font description
  COURI_LOGFONT,  // ANSI fixed font description
  0,              // Count of device fonts
  BMF_4BPP,       // preferred DIB format
  8,              // Width of color dither
  8,              // Height of color dither
  0               // Default palette to use for this device
};


BOOL STDCALL
DrvEnableDriver(IN ULONG EngineVersion,
		IN ULONG SizeOfDED,
		OUT PDRVENABLEDATA DriveEnableData)
{
/*  EngDebugPrint("VGADDI", "DrvEnableDriver called...\n", 0); */

  vgaPreCalc();

  VGADDI_InitializeOffScreenMem((640 * 480) >> 3, 65536 - ((640 * 480) >> 3));

  DriveEnableData->pdrvfn = FuncList;
  DriveEnableData->c = sizeof(FuncList) / sizeof(DRVFN);
  DriveEnableData->iDriverVersion = DDI_DRIVER_VERSION_NT4;

  return  TRUE;
}

//    DrvDisableDriver
//  DESCRIPTION:
//    This function is called by the KMGDI at exit.  It should cleanup.
//  ARGUMENTS:
//    NONE
//  RETURNS:
//    NONE

VOID STDCALL
DrvDisableDriver(VOID)
{
  return;
}

//  -----------------------------------------------  Driver Implementation


//    DrvEnablePDEV
//  DESCRIPTION:
//    This function is called after DrvEnableDriver to get information
//    about the mode that is to be used.  This function just returns
//    information, and should not yet initialize the mode.
//  ARGUMENTS:
//    IN DEVMODEW *  DM            Describes the mode requested
//    IN LPWSTR      LogAddress
//    IN ULONG       PatternCount  number of patterns expected
//    OUT HSURF *    SurfPatterns  array to contain pattern handles
//    IN ULONG       GDIInfoSize   the size of the GDIInfo object passed in
//    OUT ULONG *    GDIInfo       GDI Info object
//    IN ULONG       DevInfoSize   the size of the DevInfo object passed in
//    OUT ULONG *    DevInfo       Device Info object
//    IN LPWSTR      DevDataFile   ignore
//    IN LPWSTR      DeviceName    Device name
//    IN HANDLE      Driver        handle to KM driver
//  RETURNS:
//    DHPDEV  a handle to a DPev object

DHPDEV STDCALL
DrvEnablePDEV(IN DEVMODEW *DM,
	      IN LPWSTR LogAddress,
	      IN ULONG PatternCount,
	      OUT HSURF *SurfPatterns,
	      IN ULONG GDIInfoSize,
	      OUT ULONG *GDIInfo,
	      IN ULONG DevInfoSize,
	      OUT DEVINFO *DevInfo,
	      IN HDEV Dev,
	      IN LPWSTR DeviceName,
	      IN HANDLE Driver)
{
  PPDEV  PDev;

  PDev = EngAllocMem(FL_ZERO_MEMORY, sizeof(PDEV), ALLOC_TAG);
  if (PDev == NULL)
    {
      EngDebugPrint(DBG_PREFIX, "EngAllocMem failed for PDEV\n", 0);
      return(NULL);
    }
  PDev->KMDriver = Driver;
  DPRINT( "PDev: %x, Driver: %x\n", PDev, PDev->KMDriver );

  gaulCap.ulHorzRes = 640;
  gaulCap.ulVertRes = 480;
  if (sizeof(GDIINFO) < GDIInfoSize)
    {
    GDIInfoSize = sizeof(GDIINFO);
    }
  memcpy(GDIInfo, &gaulCap, GDIInfoSize);
  DM->dmBitsPerPel = gaulCap.cBitsPixel * gaulCap.cPlanes;
  DM->dmPelsWidth = gaulCap.ulHorzRes;
  DM->dmPelsHeight = gaulCap.ulVertRes;

  devinfoVGA.hpalDefault = EngCreatePalette(PAL_INDEXED, 16, (ULONG *) VGApalette.PaletteEntry, 0, 0, 0);
  if (sizeof(DEVINFO) < DevInfoSize)
    {
    DevInfoSize = sizeof(DEVINFO);
    }
  memcpy(DevInfo, &devinfoVGA, DevInfoSize);

  return (DHPDEV) PDev;
}


//    DrvCompletePDEV
//  DESCRIPTION
//    Called after initialization of PDEV is complete.  Supplies
//    a reference to the GDI handle for the PDEV.

VOID STDCALL
DrvCompletePDEV(IN DHPDEV PDev,
		IN HDEV Dev)
{
  ((PPDEV) PDev)->GDIDevHandle = Dev; // Handle to the DC
}


BOOL STDCALL
DrvAssertMode(IN DHPDEV DPev,
	      IN BOOL Enable)
{
  PPDEV ppdev = (PPDEV)DPev;
  ULONG returnedDataLength;

  if(Enable==TRUE)

⌨️ 快捷键说明

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