PageRenderTime 43ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/Samples/Chap15/Apollo11/DibFile.d

http://github.com/AndrejMitrovic/DWinProgramming
D | 136 lines | 105 code | 27 blank | 4 comment | 16 complexity | 99432d535b6833caccb5be9a826d0e0b MD5 | raw file
  1. /+
  2. + Copyright (c) Charles Petzold, 1998.
  3. + Ported to the D Programming Language by Andrej Mitrovic, 2011.
  4. +/
  5. module DibFile;
  6. import core.memory;
  7. import std.utf;
  8. auto toUTF16z(S)(S s)
  9. {
  10. return toUTFz!(const(wchar)*)(s);
  11. }
  12. pragma(lib, "comdlg32.lib");
  13. import core.sys.windows.windef;
  14. import core.sys.windows.winuser;
  15. import core.sys.windows.wingdi;
  16. import core.sys.windows.winbase;
  17. import core.sys.windows.commdlg;
  18. static OPENFILENAME ofn;
  19. void DibFileInitialize(HWND hwnd)
  20. {
  21. enum szFilter = "Bitmap Files (*.BMP)\0*.bmp\0All Files (*.*)\0*.*\0\0";
  22. ofn.lStructSize = (OPENFILENAME.sizeof);
  23. ofn.hwndOwner = hwnd;
  24. ofn.hInstance = NULL;
  25. ofn.lpstrFilter = szFilter;
  26. ofn.lpstrCustomFilter = NULL;
  27. ofn.nMaxCustFilter = 0;
  28. ofn.nFilterIndex = 0;
  29. ofn.lpstrFile = NULL; // Set in Open and Close functions
  30. ofn.nMaxFile = MAX_PATH;
  31. ofn.lpstrFileTitle = NULL; // Set in Open and Close functions
  32. ofn.nMaxFileTitle = MAX_PATH;
  33. ofn.lpstrInitialDir = NULL;
  34. ofn.lpstrTitle = NULL;
  35. ofn.Flags = 0; // Set in Open and Close functions
  36. ofn.nFileOffset = 0;
  37. ofn.nFileExtension = 0;
  38. ofn.lpstrDefExt = "bmp";
  39. ofn.lCustData = 0;
  40. ofn.lpfnHook = NULL;
  41. ofn.lpTemplateName = NULL;
  42. }
  43. BOOL DibFileOpenDlg(HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
  44. {
  45. ofn.hwndOwner = hwnd;
  46. ofn.lpstrFile = pstrFileName;
  47. ofn.lpstrFileTitle = pstrTitleName;
  48. ofn.Flags = 0;
  49. return GetOpenFileName(&ofn);
  50. }
  51. BOOL DibFileSaveDlg(HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
  52. {
  53. ofn.hwndOwner = hwnd;
  54. ofn.lpstrFile = pstrFileName;
  55. ofn.lpstrFileTitle = pstrTitleName;
  56. ofn.Flags = OFN_OVERWRITEPROMPT;
  57. return GetSaveFileName(&ofn);
  58. }
  59. BITMAPFILEHEADER* DibLoadImage(string pstrFileName)
  60. {
  61. BOOL bSuccess;
  62. DWORD dwFileSize, dwHighSize, dwBytesRead;
  63. HANDLE hFile;
  64. BITMAPFILEHEADER* pbmfh;
  65. hFile = CreateFile(pstrFileName.toUTF16z, GENERIC_READ, FILE_SHARE_READ, NULL,
  66. OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  67. if (hFile == INVALID_HANDLE_VALUE)
  68. return NULL;
  69. dwFileSize = GetFileSize(hFile, &dwHighSize);
  70. if (dwHighSize)
  71. {
  72. CloseHandle(hFile);
  73. return NULL;
  74. }
  75. pbmfh = cast(typeof(pbmfh))GC.malloc(dwFileSize);
  76. if (!pbmfh)
  77. {
  78. CloseHandle(hFile);
  79. return NULL;
  80. }
  81. bSuccess = ReadFile(hFile, pbmfh, dwFileSize, &dwBytesRead, NULL);
  82. CloseHandle(hFile);
  83. if (!bSuccess || (dwBytesRead != dwFileSize)
  84. || (pbmfh.bfType != *cast(WORD*)"BM")
  85. || (pbmfh.bfSize != dwFileSize))
  86. {
  87. GC.free(pbmfh);
  88. return NULL;
  89. }
  90. return pbmfh;
  91. }
  92. BOOL DibSaveImage(PTSTR pstrFileName, BITMAPFILEHEADER* pbmfh)
  93. {
  94. BOOL bSuccess;
  95. DWORD dwBytesWritten;
  96. HANDLE hFile;
  97. hFile = CreateFile(pstrFileName, GENERIC_WRITE, 0, NULL,
  98. CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  99. if (hFile == INVALID_HANDLE_VALUE)
  100. return FALSE;
  101. bSuccess = WriteFile(hFile, pbmfh, pbmfh.bfSize, &dwBytesWritten, NULL);
  102. CloseHandle(hFile);
  103. if (!bSuccess || (dwBytesWritten != pbmfh.bfSize))
  104. {
  105. DeleteFile(pstrFileName);
  106. return FALSE;
  107. }
  108. return TRUE;
  109. }