-
-
Notifications
You must be signed in to change notification settings - Fork 17
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
win32: save screenshots to .bmp file (#28)
- Loading branch information
1 parent
fd4086b
commit f0a37e7
Showing
6 changed files
with
281 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,6 +5,7 @@ bin/ | |
#ignore objects | ||
*.o | ||
#ignore other binaries created by make | ||
*.exe | ||
screenfetch-c | ||
x11test | ||
gltest | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,191 @@ | ||
/* bitmap.c | ||
** | ||
** Copyright (c) 2016 Microsoft | ||
** Source: https://msdn.microsoft.com/de-de/library/windows/desktop/dd145119(v=vs.85).aspx | ||
** | ||
** The bitmap saving functions used by screenfetch-c on Windows are implemented here. | ||
** | ||
** According to section 2b of the Microsoft Developer Services Agreement | ||
** this code is released under the Microsoft Limited Public License. | ||
** | ||
** Usage: | ||
** HBITMAP hBitmap; | ||
** HDC hdc; | ||
** PBITMAPINFO pBitmapInfo = createBitmapInfoStruct(hBitmap); | ||
** createBmpFile("picture.bmp"), pBitmapInfo, hBitmap, hdc); | ||
*/ | ||
|
||
#include <Windows.h> | ||
|
||
PBITMAPINFO createBitmapInfoStruct(HBITMAP hBmp) | ||
{ | ||
BITMAP bmp; | ||
PBITMAPINFO pbmi; | ||
WORD cClrBits; | ||
/* retrieve the bitmap color format, width, and height */ | ||
if (!GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp)) | ||
{ | ||
return NULL; | ||
} | ||
|
||
/* convert the color format to a count of bits */ | ||
cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel); | ||
if (cClrBits == 1) | ||
{ | ||
cClrBits = 1; | ||
} | ||
else if (cClrBits <= 4) | ||
{ | ||
cClrBits = 4; | ||
} | ||
else if (cClrBits <= 8) | ||
{ | ||
cClrBits = 8; | ||
} | ||
else if (cClrBits <= 16) | ||
{ | ||
cClrBits = 16; | ||
} | ||
else if (cClrBits <= 24) | ||
{ | ||
cClrBits = 24; | ||
} | ||
else | ||
{ | ||
cClrBits = 32; | ||
} | ||
|
||
/* Allocate memory for the BITMAPINFO structure. (This structure | ||
contains a BITMAPINFOHEADER structure and an array of RGBQUAD | ||
data structures.) | ||
*/ | ||
if (cClrBits != 24) | ||
{ | ||
pbmi = (PBITMAPINFO)LocalAlloc(LPTR, | ||
sizeof(BITMAPINFOHEADER) + | ||
sizeof(RGBQUAD) * (1 << cClrBits)); | ||
} | ||
else | ||
{ | ||
/* there is no RGBQUAD array for the 24-bit-per-pixel format */ | ||
pbmi = (PBITMAPINFO)LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER)); | ||
} | ||
|
||
/* initialize the fields in the BITMAPINFO structure */ | ||
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); | ||
pbmi->bmiHeader.biWidth = bmp.bmWidth; | ||
pbmi->bmiHeader.biHeight = bmp.bmHeight; | ||
pbmi->bmiHeader.biPlanes = bmp.bmPlanes; | ||
pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel; | ||
if (cClrBits < 24) | ||
{ | ||
pbmi->bmiHeader.biClrUsed = (1 << cClrBits); | ||
} | ||
|
||
/* if the bitmap is not compressed, set the BI_RGB flag */ | ||
pbmi->bmiHeader.biCompression = BI_RGB; | ||
|
||
/* Compute the number of bytes in the array of color | ||
indices and store the result in biSizeImage. | ||
For Windows NT, the width must be DWORD aligned unless | ||
the bitmap is RLE compressed. This example shows this. | ||
For Windows 95/98/Me, the width must be WORD aligned unless the | ||
bitmap is RLE compressed. | ||
*/ | ||
pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits + 31) & ~31) / 8 | ||
* pbmi->bmiHeader.biHeight; | ||
|
||
/* set biClrImportant to 0, indicating that all of the | ||
device colors are important | ||
*/ | ||
pbmi->bmiHeader.biClrImportant = 0; | ||
return pbmi; | ||
} | ||
|
||
int createBmpFile(LPTSTR pszFile, PBITMAPINFO pbi, HBITMAP hBMP, HDC hDC) | ||
{ | ||
HANDLE hf; /* file handle */ | ||
BITMAPFILEHEADER hdr; /* bitmap file-header */ | ||
PBITMAPINFOHEADER pbih; /* bitmap info-header */ | ||
LPBYTE lpBits; /* memory pointer */ | ||
DWORD cb; /* incremental count of bytes */ | ||
BYTE *hp; /* byte pointer */ | ||
DWORD dwTmp; | ||
|
||
pbih = (PBITMAPINFOHEADER)pbi; | ||
lpBits = (LPBYTE)GlobalAlloc(GMEM_FIXED, pbih->biSizeImage); | ||
|
||
if (!lpBits) | ||
{ | ||
return -1; | ||
} | ||
|
||
/* retrieve the color table (RGBQUAD array) and the bits | ||
(array of palette indices) from the DIB | ||
*/ | ||
if (!GetDIBits(hDC, hBMP, 0, (WORD)pbih->biHeight, lpBits, | ||
pbi, DIB_RGB_COLORS)) | ||
{ | ||
return -1; | ||
} | ||
|
||
/* create the .BMP file */ | ||
hf = CreateFile(pszFile, | ||
GENERIC_READ | GENERIC_WRITE, | ||
(DWORD)0, | ||
NULL, | ||
CREATE_ALWAYS, | ||
FILE_ATTRIBUTE_NORMAL, | ||
(HANDLE)NULL); | ||
if (hf == INVALID_HANDLE_VALUE) | ||
{ | ||
return -1; | ||
} | ||
hdr.bfType = 0x4d42; /* 0x42 = "B" 0x4d = "M" */ | ||
|
||
/* compute the size of the entire file */ | ||
hdr.bfSize = (DWORD)(sizeof(BITMAPFILEHEADER) + | ||
pbih->biSize + pbih->biClrUsed | ||
* sizeof(RGBQUAD) + pbih->biSizeImage); | ||
hdr.bfReserved1 = 0; | ||
hdr.bfReserved2 = 0; | ||
|
||
/* compute the offset to the array of color indices */ | ||
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + | ||
pbih->biSize + pbih->biClrUsed | ||
* sizeof(RGBQUAD); | ||
|
||
/* copy the BITMAPFILEHEADER into the .BMP file */ | ||
if (!WriteFile(hf, (LPVOID)&hdr, sizeof(BITMAPFILEHEADER), | ||
(LPDWORD)&dwTmp, NULL)) | ||
{ | ||
return -1; | ||
} | ||
|
||
/* copy the BITMAPINFOHEADER and RGBQUAD array into the file */ | ||
if (!WriteFile(hf, (LPVOID)pbih, sizeof(BITMAPINFOHEADER) | ||
+ pbih->biClrUsed * sizeof(RGBQUAD), | ||
(LPDWORD)&dwTmp, (NULL))) | ||
{ | ||
return -1; | ||
} | ||
|
||
/* copy the array of color indices into the .BMP file */ | ||
cb = pbih->biSizeImage; | ||
hp = lpBits; | ||
if (!WriteFile(hf, (LPSTR)hp, (int)cb, (LPDWORD)&dwTmp, NULL)) | ||
{ | ||
return -1; | ||
} | ||
|
||
/* close the .BMP file */ | ||
if (!CloseHandle(hf)) | ||
{ | ||
return -1; | ||
} | ||
|
||
/* free memory */ | ||
GlobalFree((HGLOBAL)lpBits); | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
/* bitmap.h | ||
** | ||
** Copyright (c) 2016 Microsoft | ||
** Source: https://msdn.microsoft.com/de-de/library/windows/desktop/dd145119(v=vs.85).aspx | ||
** | ||
** Function prototypes for bitmap.c. | ||
** | ||
** According to section 2b of the Microsoft Developer Services Agreement | ||
** this code is released under the Microsoft Limited Public License. | ||
*/ | ||
|
||
#ifndef SCREENFETCH_C_BITMAP_H | ||
#define SCREENFETCH_C_BITMAP_H | ||
|
||
#include <Windows.h> | ||
|
||
PBITMAPINFO createBitmapInfoStruct(HBITMAP hBmp); | ||
int createBmpFile(LPTSTR pszFile, PBITMAPINFO pbi, HBITMAP hBMP, HDC hDC); | ||
|
||
#endif /* SCREENFETCH_C_BITMAP_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters