ddutil.cpp
上传用户:cydong117
上传日期:2009-11-10
资源大小:638k
文件大小:17k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------------
  2. // File: ddutil.cpp
  3. //
  4. // Desc: Routines for loading bitmap and palettes from resources
  5. //
  6. //
  7. // Copyright (c) 1995-1999 Microsoft Corporation. All rights reserved.
  8. //-----------------------------------------------------------------------------
  9. #ifndef WIN32_LEAN_AND_MEAN
  10. #define WIN32_LEAN_AND_MEAN
  11. #endif
  12. //-----------------------------------------------------------------------------
  13. // Include files
  14. //-----------------------------------------------------------------------------
  15. #include "stdafx.h"
  16. #include <windows.h>
  17. #include <windowsx.h>
  18. #include <ddraw.h>
  19. #include <io.h>
  20. #include "ddutil.h"
  21. //-----------------------------------------------------------------------------
  22. // Name: DDLoadBitmap()
  23. // Desc: Create a DirectDrawSurface from a bitmap resource.
  24. //-----------------------------------------------------------------------------
  25. extern "C" IDirectDrawSurface7 *
  26. DDLoadBitmap(IDirectDraw7 * pdd, LPCSTR szBitmap, int dx, int dy)
  27. {
  28.     HBITMAP                 hbm;
  29.     BITMAP                  bm;
  30.     DDSURFACEDESC2          ddsd;
  31.     IDirectDrawSurface7    *pdds;
  32.     //
  33.     //  Try to load the bitmap as a resource, if that fails, try it as a file
  34.     //
  35.     hbm = (HBITMAP) LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, dx,
  36.                               dy, LR_CREATEDIBSECTION);
  37.     if (hbm == NULL)
  38.         hbm = (HBITMAP) LoadImage(NULL, szBitmap, IMAGE_BITMAP, dx, dy,
  39.                                   LR_LOADFROMFILE | LR_CREATEDIBSECTION);
  40.     if (hbm == NULL)
  41.         return NULL;
  42.     //
  43.     // Get size of the bitmap
  44.     //
  45.     GetObject(hbm, sizeof(bm), &bm);
  46.     //
  47.     // Create a DirectDrawSurface for this bitmap
  48.     //
  49.     ZeroMemory(&ddsd, sizeof(ddsd));
  50.     ddsd.dwSize = sizeof(ddsd);
  51.     ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
  52.     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
  53.     ddsd.dwWidth = bm.bmWidth;
  54.     ddsd.dwHeight = bm.bmHeight;
  55.     if (pdd->CreateSurface(&ddsd, &pdds, NULL) != DD_OK)
  56.         return NULL;
  57.     DDCopyBitmap(pdds, hbm, 0, 0, 0, 0);
  58.     DeleteObject(hbm);
  59.     return pdds;
  60. }
  61. //-----------------------------------------------------------------------------
  62. // Name: DDReLoadBitmap()
  63. // Desc: Load a bitmap from a file or resource into a directdraw surface.
  64. //       normaly used to re-load a surface after a restore.
  65. //-----------------------------------------------------------------------------
  66. HRESULT
  67. DDReLoadBitmap(IDirectDrawSurface7 * pdds, LPCSTR szBitmap)
  68. {
  69.     HBITMAP                 hbm;
  70.     HRESULT                 hr;
  71.     //
  72.     //  Try to load the bitmap as a resource, if that fails, try it as a file
  73.     //
  74.     hbm = (HBITMAP) LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, 0,
  75.                               0, LR_CREATEDIBSECTION);
  76.     if (hbm == NULL)
  77.         hbm = (HBITMAP) LoadImage(NULL, szBitmap, IMAGE_BITMAP, 0, 0,
  78.                                   LR_LOADFROMFILE | LR_CREATEDIBSECTION);
  79.     if (hbm == NULL)
  80.     {
  81.         OutputDebugString("handle is nulln");
  82.         return E_FAIL;
  83.     }
  84.     hr = DDCopyBitmap(pdds, hbm, 0, 0, 0, 0);
  85.     if (hr != DD_OK)
  86.     {
  87.         OutputDebugString("ddcopybitmap failedn");
  88.     }
  89.     DeleteObject(hbm);
  90.     return hr;
  91. }
  92. //-----------------------------------------------------------------------------
  93. // Name: DDCopyBitmap()
  94. // Desc: Draw a bitmap into a DirectDrawSurface
  95. //-----------------------------------------------------------------------------
  96. extern "C" HRESULT
  97. DDCopyBitmap(IDirectDrawSurface7 * pdds, HBITMAP hbm, int x, int y,
  98.              int dx, int dy)
  99. {
  100.     HDC                     hdcImage;
  101.     HDC                     hdc;
  102.     BITMAP                  bm;
  103.     DDSURFACEDESC2          ddsd;
  104.     HRESULT                 hr;
  105.     if (hbm == NULL || pdds == NULL)
  106.         return E_FAIL;
  107.     //
  108.     // Make sure this surface is restored.
  109.     //
  110.     pdds->Restore();
  111.     //
  112.     // Select bitmap into a memoryDC so we can use it.
  113.     //
  114.     hdcImage = CreateCompatibleDC(NULL);
  115.     if (!hdcImage)
  116.         OutputDebugString("createcompatible dc failedn");
  117.     SelectObject(hdcImage, hbm);
  118.     //
  119.     // Get size of the bitmap
  120.     //
  121.     GetObject(hbm, sizeof(bm), &bm);
  122.     dx = dx == 0 ? bm.bmWidth : dx;     // Use the passed size, unless zero
  123.     dy = dy == 0 ? bm.bmHeight : dy;
  124.     //
  125.     // Get size of surface.
  126.     //
  127.     ddsd.dwSize = sizeof(ddsd);
  128.     ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
  129.     pdds->GetSurfaceDesc(&ddsd);
  130.     
  131.     if ((hr = pdds->GetDC(&hdc)) == DD_OK)
  132.     {
  133.         StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y,
  134.                    dx, dy, SRCCOPY);
  135.         pdds->ReleaseDC(hdc);
  136.     }
  137.     DeleteDC(hdcImage);
  138.     return hr;
  139. }
  140. //-----------------------------------------------------------------------------
  141. // Name: DDLoadPalette()
  142. // Desc: Create a DirectDraw palette object from a bitmap resource
  143. //       if the resource does not exist or NULL is passed create a
  144. //       default 332 palette.
  145. //-----------------------------------------------------------------------------
  146. extern "C" IDirectDrawPalette *
  147. DDLoadPalette(IDirectDraw7 * pdd, LPCSTR szBitmap)
  148. {
  149.     IDirectDrawPalette     *ddpal;
  150.     int                     i;
  151.     int                     n;
  152.     int                     fh;
  153.     HRSRC                   h;
  154.     LPBITMAPINFOHEADER      lpbi;
  155.     PALETTEENTRY            ape[256];
  156.     RGBQUAD                *prgb;
  157.     //
  158.     // Build a 3:3:2 palette as the default.
  159.     //
  160.     for (i = 0; i < 256; i++)
  161.     {
  162.         ape[i].peRed = (BYTE) (((i >> 5) & 0x07) * 255 / 7);
  163.         ape[i].peGreen = (BYTE) (((i >> 2) & 0x07) * 255 / 7);
  164.         ape[i].peBlue = (BYTE) (((i >> 0) & 0x03) * 255 / 3);
  165.         ape[i].peFlags = (BYTE) 0;
  166.     }
  167.     //
  168.     // Get a pointer to the bitmap resource.
  169.     //
  170.     if (szBitmap && (h = FindResource(NULL, szBitmap, RT_BITMAP)))
  171.     {
  172.         lpbi = (LPBITMAPINFOHEADER) LockResource(LoadResource(NULL, h));
  173.         if (!lpbi)
  174.             OutputDebugString("lock resource failedn");
  175.         prgb = (RGBQUAD *) ((BYTE *) lpbi + lpbi->biSize);
  176.         if (lpbi == NULL || lpbi->biSize < sizeof(BITMAPINFOHEADER))
  177.             n = 0;
  178.         else if (lpbi->biBitCount > 8)
  179.             n = 0;
  180.         else if (lpbi->biClrUsed == 0)
  181.             n = 1 << lpbi->biBitCount;
  182.         else
  183.             n = lpbi->biClrUsed;
  184.         //
  185.         //  A DIB color table has its colors stored BGR not RGB
  186.         //  so flip them around.
  187.         //
  188.         for (i = 0; i < n; i++)
  189.         {
  190.             ape[i].peRed = prgb[i].rgbRed;
  191.             ape[i].peGreen = prgb[i].rgbGreen;
  192.             ape[i].peBlue = prgb[i].rgbBlue;
  193.             ape[i].peFlags = 0;
  194.         }
  195.     }
  196.     else if (szBitmap && (fh = _lopen(szBitmap, OF_READ)) != -1)
  197.     {
  198.         BITMAPFILEHEADER        bf;
  199.         BITMAPINFOHEADER        bi;
  200.         _lread(fh, &bf, sizeof(bf));
  201.         _lread(fh, &bi, sizeof(bi));
  202.         _lread(fh, ape, sizeof(ape));
  203.         _lclose(fh);
  204.         if (bi.biSize != sizeof(BITMAPINFOHEADER))
  205.             n = 0;
  206.         else if (bi.biBitCount > 8)
  207.             n = 0;
  208.         else if (bi.biClrUsed == 0)
  209.             n = 1 << bi.biBitCount;
  210.         else
  211.             n = bi.biClrUsed;
  212.         //
  213.         //  A DIB color table has its colors stored BGR not RGB
  214.         //  so flip them around.
  215.         //
  216.         for (i = 0; i < n; i++)
  217.         {
  218.             BYTE        r = ape[i].peRed;
  219.             ape[i].peRed = ape[i].peBlue;
  220.             ape[i].peBlue = r;
  221.         }
  222.     }
  223.     pdd->CreatePalette(DDPCAPS_8BIT, ape, &ddpal, NULL);
  224.     return ddpal;
  225. }
  226. //-----------------------------------------------------------------------------
  227. // Name: DDColorMatch()
  228. // Desc: Convert a RGB color to a pysical color.
  229. //       We do this by leting GDI SetPixel() do the color matching
  230. //       then we lock the memory and see what it got mapped to.
  231. //-----------------------------------------------------------------------------
  232. extern "C" DWORD
  233. DDColorMatch(IDirectDrawSurface7 * pdds, COLORREF rgb)
  234. {
  235.     COLORREF                rgbT;
  236.     HDC                     hdc;
  237.     DWORD                   dw = CLR_INVALID;
  238.     DDSURFACEDESC2          ddsd;
  239.     HRESULT                 hres;
  240.     //
  241.     //  Use GDI SetPixel to color match for us
  242.     //
  243.     if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK)
  244.     {
  245.         rgbT = GetPixel(hdc, 0, 0);     // Save current pixel value
  246.         SetPixel(hdc, 0, 0, rgb);       // Set our value
  247.         pdds->ReleaseDC(hdc);
  248.     }
  249.     //
  250.     // Now lock the surface so we can read back the converted color
  251.     //
  252.     ddsd.dwSize = sizeof(ddsd);
  253.     while ((hres = pdds->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING);
  254.     if (hres == DD_OK)
  255.     {
  256.         dw = *(DWORD *) ddsd.lpSurface;                 // Get DWORD
  257.         if (ddsd.ddpfPixelFormat.dwRGBBitCount < 32)
  258.             dw &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount) - 1;  // Mask it to bpp
  259.         pdds->Unlock(NULL);
  260.     }
  261.     //
  262.     //  Now put the color that was there back.
  263.     //
  264.     if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK)
  265.     {
  266.         SetPixel(hdc, 0, 0, rgbT);
  267.         pdds->ReleaseDC(hdc);
  268.     }
  269.     return dw;
  270. }
  271. //-----------------------------------------------------------------------------
  272. // Name: DDSetColorKey()
  273. // Desc: Set a color key for a surface, given a RGB.
  274. //       If you pass CLR_INVALID as the color key, the pixel
  275. //       in the upper-left corner will be used.
  276. //-----------------------------------------------------------------------------
  277. extern "C" HRESULT
  278. DDSetColorKey(IDirectDrawSurface7 * pdds, COLORREF rgb)
  279. {
  280.     DDCOLORKEY              ddck;
  281.     ddck.dwColorSpaceLowValue = RGB(0, 0, 0);//DDColorMatch(pdds, rgb);
  282.     ddck.dwColorSpaceHighValue = RGB(1, 1, 1);//ddck.dwColorSpaceLowValue;
  283.     return pdds->SetColorKey(DDCKEY_SRCBLT, &ddck);
  284. }
  285. VOID SurfaceDataToFile(CHAR* szSaveFileName, LPDIRECTDRAWSURFACE7 lpdds)
  286. {
  287.     DDSURFACEDESC2 ddsd;
  288.     ddsd.dwSize = sizeof(ddsd);
  289.     ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
  290.     lpdds->Lock(NULL, &ddsd, 0, NULL);
  291. BYTE* pb;
  292. pb = new BYTE[ddsd.dwWidth*ddsd.dwHeight];
  293. ZeroMemory(pb, ddsd.dwWidth*ddsd.dwHeight);
  294. memcpy(pb, ddsd.lpSurface, ddsd.dwWidth*ddsd.dwHeight);
  295. WORD wWidth = (WORD)ddsd.dwWidth;
  296. WORD wHeight = (WORD)ddsd.dwHeight;
  297.     lpdds->Unlock(NULL);
  298. HANDLE hFile;
  299. hFile = CreateFile( szSaveFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS,
  300. FILE_ATTRIBUTE_NORMAL, NULL );
  301. if ( hFile != INVALID_HANDLE_VALUE )
  302. {
  303. DWORD dwReadLen;
  304. SetFilePointer(hFile, 0, 0, FILE_BEGIN);
  305. WriteFile(hFile, &wWidth, sizeof(WORD), &dwReadLen, NULL);
  306. WriteFile(hFile, &wHeight, sizeof(WORD), &dwReadLen, NULL);
  307. WriteFile(hFile, pb, ddsd.dwWidth*ddsd.dwHeight, &dwReadLen, NULL);
  308. CloseHandle(hFile);
  309. }
  310. free(pb);
  311. }
  312. LPDIRECTDRAWSURFACE7 FileToSurfaceData(LPDIRECTDRAW7 lpdd, CHAR* szFileName)
  313. {
  314. HANDLE hFile;
  315. hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS,
  316.    FILE_ATTRIBUTE_NORMAL, NULL );
  317. WORD wWidth, wHeight;
  318. LPDIRECTDRAWSURFACE7 lpdds;
  319.     DDSURFACEDESC2 ddsd;
  320. ZeroMemory(&ddsd, sizeof(DDSURFACEDESC2));
  321.     ddsd.dwSize = sizeof(ddsd);
  322. if ( hFile != INVALID_HANDLE_VALUE )
  323. {
  324. DWORD dwReadLen;
  325. ReadFile(hFile, &wWidth, sizeof(WORD), &dwReadLen, NULL);
  326. ReadFile(hFile, &wHeight, sizeof(WORD), &dwReadLen, NULL);
  327. ddsd.dwFlags        = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
  328. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;// | DDSCAPS_SYSTEMMEMORY;
  329. ddsd.dwWidth    = wWidth;
  330. ddsd.dwHeight   = wHeight;
  331. lpdd->CreateSurface(&ddsd, &lpdds, NULL);
  332. lpdds->Lock(NULL, &ddsd, 0, NULL);
  333. ReadFile(hFile, (BYTE*)ddsd.lpSurface, wWidth*wHeight, &dwReadLen, NULL);
  334. lpdds->Unlock(NULL);
  335. CloseHandle(hFile);
  336. return lpdds;
  337. }
  338. return NULL;
  339. }
  340. LPDIRECTDRAWSURFACE7 LoadBitmap8BitsInSurface(LPDIRECTDRAW7 lpdd, LPCTSTR pszFileName)
  341. {
  342. BITMAPFILEHEADER stFileHeader;
  343. LPBITMAPINFO pstBmpInfo;
  344. LPBITMAPINFOHEADER pstInfoHeader;
  345. DWORD dwReadSize = 0;
  346. HANDLE hFile = ::CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
  347. FILE_ATTRIBUTE_NORMAL, NULL);
  348. // 厚飘甘 庆歹沥焊.(鉴辑措肺 扁废等促.)
  349. //BITMAPFILEHEADER
  350. //BITMAPINFO(BITMAPINFOHEADER, RGBQUAD)
  351. //捞固瘤单捞磐
  352. if ( hFile )
  353. {
  354. ZeroMemory(&stFileHeader, sizeof(stFileHeader));
  355. // 颇老庆歹佬扁.
  356. ReadFile(hFile, &stFileHeader, sizeof(stFileHeader), &dwReadSize, NULL);
  357. // BMP牢瘤甫 犬牢茄促.
  358. if ( HIBYTE(stFileHeader.bfType) == 'M' && LOBYTE(stFileHeader.bfType) == 'B' )
  359. {
  360. pstBmpInfo = (LPBITMAPINFO) malloc(sizeof(BITMAPINFO) + sizeof(RGBQUAD)*256);
  361. // 牢器庆歹父怒父 老窜 佬绰促.
  362. ReadFile(hFile, pstBmpInfo, sizeof(BITMAPINFO)-sizeof(RGBQUAD), &dwReadSize, NULL);
  363. pstInfoHeader = &(pstBmpInfo->bmiHeader);
  364. // 8厚飘烙阑 犬牢茄促.
  365. if( pstInfoHeader->biBitCount == 8 && pstInfoHeader->biCompression == BI_RGB)
  366. {
  367. DWORD dwColorTableSize = 256 * sizeof(RGBQUAD);
  368. ReadFile(hFile, pstBmpInfo->bmiColors, dwColorTableSize, &dwReadSize, NULL);
  369. BYTE* pbDataBit = NULL;
  370. // BYTE* pbDataBit = (BYTE*)malloc(pstBmpInfo->bmiHeader.biSizeImage);
  371. if ( pstBmpInfo->bmiHeader.biSizeImage )
  372. {
  373. pbDataBit = (BYTE*)malloc(pstBmpInfo->bmiHeader.biSizeImage);
  374. ReadFile(hFile, pbDataBit, pstBmpInfo->bmiHeader.biSizeImage, &dwReadSize, NULL);
  375. }
  376. else
  377. {
  378. pbDataBit = (BYTE*)malloc(pstBmpInfo->bmiHeader.biWidth*pstBmpInfo->bmiHeader.biHeight);
  379. ReadFile(hFile, pbDataBit, pstBmpInfo->bmiHeader.biWidth*pstBmpInfo->bmiHeader.biHeight, &dwReadSize, NULL);
  380. }
  381. // 角力掘篮单捞鸥甫 辑乔胶俊 持绰促.
  382. LPDIRECTDRAWSURFACE7 lpdds;
  383. DDSURFACEDESC2 ddsd;
  384. ZeroMemory(&ddsd, sizeof(DDSURFACEDESC2));
  385. ddsd.dwSize = sizeof(ddsd);
  386. ddsd.dwFlags        = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;/*| DDSD_PIXELFORMAT;
  387. ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
  388. ddsd.ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB;
  389. ddsd.ddpfPixelFormat.dwRGBBitCount = 8;*/
  390. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
  391. ddsd.dwWidth = pstBmpInfo->bmiHeader.biWidth;
  392. ddsd.dwHeight = pstBmpInfo->bmiHeader.biHeight;
  393. lpdd->CreateSurface(&ddsd, &lpdds, NULL);
  394. lpdds->Lock(NULL, &ddsd, 0, NULL);
  395. //扼牢喊 单捞鸥绰 鞍瘤父 扼牢捞 困何磐 第官差菌扁锭巩俊 促矫 倒妨霖促.
  396. /* INT nLineCnt = 0;
  397. for ( INT nY=(ddsd.dwHeight-1); nY>=0; nY-- )
  398. {
  399. memcpy((BYTE*)ddsd.lpSurface+(nLineCnt*ddsd.lPitch), pbDataBit+(nY*ddsd.lPitch), ddsd.lPitch);
  400. nLineCnt++;
  401. }
  402. */
  403. for ( UINT nY=0; nY<(ddsd.dwHeight-1); nY++ )
  404. {
  405. memcpy((BYTE*)ddsd.lpSurface+(nY*ddsd.lPitch), pbDataBit+((ddsd.dwHeight-nY-1)*ddsd.dwWidth), ddsd.dwWidth);
  406. }
  407. // memcpy((BYTE*)ddsd.lpSurface, pbDataBit, ddsd.dwWidth*ddsd.dwHeight);
  408. lpdds->Unlock(NULL);
  409. free(pbDataBit);
  410. return lpdds;
  411. }
  412. }
  413. CloseHandle(hFile);
  414. }
  415. return NULL;
  416. }
  417. LPDIRECTDRAWSURFACE7 LoadWilIntoSurface(LPDIRECTDRAW7 lpdd, CHAR* szWilFile)
  418. {
  419. HANDLE hFile;
  420. hFile = CreateFile(szWilFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS,
  421.    FILE_ATTRIBUTE_NORMAL, NULL );
  422. if ( hFile != INVALID_HANDLE_VALUE )
  423. {
  424. DWORD dwReadLen;
  425. CHAR szTitle[44];
  426. INT nImageCount;
  427. INT nColorCount;
  428. INT nPaletteSize;
  429. SHORT shWidth;
  430. SHORT shHeight;
  431. SHORT shPX;
  432. SHORT shPY;
  433. RGBQUAD rgbQuad[256];
  434. BYTE* pbData;
  435. ReadFile(hFile, szTitle, 44, &dwReadLen, NULL);
  436. ReadFile(hFile, &nImageCount, sizeof(INT), &dwReadLen, NULL);
  437. ReadFile(hFile, &nColorCount, sizeof(INT), &dwReadLen, NULL);
  438. ReadFile(hFile, &nPaletteSize, sizeof(INT), &dwReadLen, NULL);
  439. ReadFile(hFile, rgbQuad, sizeof(RGBQUAD)*256, &dwReadLen, NULL);
  440. ReadFile(hFile, &shWidth, sizeof(SHORT), &dwReadLen, NULL);
  441. ReadFile(hFile, &shHeight, sizeof(SHORT), &dwReadLen, NULL);
  442. ReadFile(hFile, &shPX, sizeof(SHORT), &dwReadLen, NULL);
  443. ReadFile(hFile, &shPY, sizeof(SHORT), &dwReadLen, NULL);
  444. pbData = new BYTE[shWidth*shHeight];
  445. ReadFile(hFile, pbData, shWidth*shHeight, &dwReadLen, NULL);
  446. CloseHandle(hFile);
  447. // 角力掘篮单捞鸥甫 辑乔胶俊 持绰促.
  448. LPDIRECTDRAWSURFACE7 lpdds;
  449. DDSURFACEDESC2 ddsd;
  450. ZeroMemory(&ddsd, sizeof(DDSURFACEDESC2));
  451. ddsd.dwSize = sizeof(ddsd);
  452. ddsd.dwFlags        = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;/*| DDSD_PIXELFORMAT;
  453. ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
  454. ddsd.ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB;
  455. ddsd.ddpfPixelFormat.dwRGBBitCount = 8;*/
  456. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
  457. ddsd.dwWidth = shWidth;
  458. ddsd.dwHeight = shHeight;
  459. lpdd->CreateSurface(&ddsd, &lpdds, NULL);
  460. lpdds->Lock(NULL, &ddsd, 0, NULL);
  461. //扼牢喊 单捞鸥绰 鞍瘤父 扼牢捞 困何磐 第官差菌扁锭巩俊 促矫 倒妨霖促.
  462. /* INT nLineCnt = 0;
  463. for ( INT nY=(ddsd.dwHeight-1); nY>=0; nY-- )
  464. {
  465. memcpy((BYTE*)ddsd.lpSurface+(nLineCnt*ddsd.lPitch), pbDataBit+(nY*ddsd.lPitch), ddsd.lPitch);
  466. nLineCnt++;
  467. }
  468. */
  469. for ( UINT nY=0; nY<(ddsd.dwHeight-1); nY++ )
  470. {
  471. memcpy((BYTE*)ddsd.lpSurface+(nY*ddsd.lPitch), pbData+((ddsd.dwHeight-nY-1)*ddsd.dwWidth), ddsd.dwWidth);
  472. }
  473. // memcpy((BYTE*)ddsd.lpSurface, pbDataBit, ddsd.dwWidth*ddsd.dwHeight);
  474. lpdds->Unlock(NULL);
  475. free(pbData);
  476. CloseHandle(hFile);
  477. return lpdds;
  478. }
  479. return NULL;
  480. }