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

📄 dxdisp.cpp

📁 DGen源码最后版本
💻 CPP
字号:
#include <stdio.h>
#include <windows.h>
#include <ddraw.h>
#include "d.h"

// MD DirectX Display stuff

dxdisp::dxdisp(HWND iwnd,int ifullscreen)
{
  dd=NULL; prim=buf=NULL; clipper=NULL;
  wnd=iwnd; bm.data=NULL; fullscreen=ifullscreen;
  directdraw_init();
}

dxdisp::~dxdisp()
{
  directdraw_exit();
  wnd=0; bm.data=NULL;
}

// Main MD Screen Window

// This gets called until DirectDraw calls are completed
// clipper isn't vital
#define DIRECTDRAW_READY (dd&&prim&&buf)
int dxdisp::directdraw_init()
{
  int ret=0;
  dprintf ("directdraw_init()\n");

  if (dd==NULL)
  {
    ret = DirectDrawCreate( NULL, &dd, NULL );
    if (ret!=DD_OK)
    {
      dprintf ("DirectDrawCreate returned %x\n",ret);
      return 1;
    }
  }
  if (dd!=NULL)
  {
    if (fullscreen)
    {
      ret=dd->SetCooperativeLevel(wnd, DDSCL_ALLOWREBOOT | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX);
      if (ret!=DD_OK)
      {
        dprintf ("SetCooperativeLevel(EXCLUSIVE) returned %x\n",ret);
        fullscreen=0;
      }
    }

    if (!fullscreen)
    {
      ret=dd->SetCooperativeLevel(wnd, DDSCL_NORMAL);
      if (ret!=DD_OK)
      {
        dprintf ("SetCooperativeLevel returned %x\n",ret);
        return 1;
      }
    }

    if (fullscreen)
    {
      ret = dd->SetDisplayMode(320,240,16);
      if (ret!=DD_OK)
        dprintf ("SetDisplayMode() return value was %x (%+-d)\n",
          ret,ret-MAKE_DDHRESULT(0));
    }

    if (prim==NULL) prim=create_primary_surface(dd);
    if (prim==NULL) return 1;

    if (buf==NULL)  buf=create_surface(dd,320+16,224+16);
    if (buf==NULL)  return 1;

    if (!fullscreen)
      if (prim!=NULL)
        if (clipper==NULL) clipper=attach_clipper(dd,wnd,prim);
  }
  return 0;
}

int dxdisp::directdraw_exit()
{
  dprintf ("directdraw_exit()\n");
  // Release DirectDraw when we are destroyed
  if (clipper  !=NULL) clipper->Release(); clipper=NULL;
  if (buf      !=NULL) buf    ->Release(); buf    =NULL;
  if (prim     !=NULL) prim   ->Release(); prim   =NULL;
  if (dd       !=NULL) dd     ->Release(); dd     =NULL;
  return 0;
}

int dxdisp::paint()
{
  if (!DIRECTDRAW_READY)
  {
    if (directdraw_init()!=0) directdraw_exit();
      // maybe have another go later when problem has cleared
  }

  if (!DIRECTDRAW_READY) return 1;

  if (fullscreen)
  {
    DDBLTFX bltfx;
    RECT destrect={0,0,320,240};
    // clear screen
    memset(&bltfx, 0,sizeof(bltfx)); // Sets dwFillColor to 0 as well
    bltfx.dwSize = sizeof(bltfx);
    prim->Blt(&destrect,NULL,NULL,/*DDBLT_WAIT|*/DDBLT_COLORFILL,&bltfx);
  }

  update();

  return 0;
}

int dxdisp::update()
{
  RECT src,dest; int ret=0;
  if (!DIRECTDRAW_READY)
  {
    if (directdraw_init()!=0) directdraw_exit();
      // maybe have another go later when problem has cleared
  }

  if (!DIRECTDRAW_READY) return 1;

  src.left=8; src.top=8;
  src.right=8+320; src.bottom=8+224;

  if (fullscreen)
  {
    int s;
    src.left=8; src.top=8;
    src.right=8+320; src.bottom=8+224;
    ret=prim->BltFast(0,8,buf,&src,0);
  }
  else
  {
    GetWindowRect(wnd,&dest);
    dest.top+=22; dest.left+=4;
    dest.right=dest.left+320*2;
    dest.bottom=dest.top+224*2;
    ret=prim->Blt(&dest,buf,&src,/*DDBLT_WAIT*/0,NULL);
  }

  return 0;
}

struct bmap dxdisp::lock()
{
  if (!DIRECTDRAW_READY)
  {
    if (directdraw_init()!=0)  directdraw_exit();
      // maybe have another go later when problem has cleared
  }
  if (!DIRECTDRAW_READY) { bm.data=NULL; return bm; }
  if (lock_surface_to_bm(&bm,buf)!=0) { bm.data=NULL; return bm; }
  return bm;
}

int dxdisp::unlock()
{
  if (bm.data) buf->Unlock(bm.data); bm.data=NULL;
  return 0;
}

⌨️ 快捷键说明

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