1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-07-05 22:50:23 +00:00
QB64-PE/internal/c/libqb/printer.cpp
2022-05-06 13:20:30 -04:00

105 lines
2.3 KiB
C++

#ifndef DEPENDENCY_PRINTER
// stubs
void sub__printimage(int32 i) { return; }
#else
void sub__printimage(int32 i) {
# ifdef QB64_WINDOWS
static LPSTR szPrinterName = NULL;
DWORD dwNameLen;
HDC dc;
DOCINFO di;
uint32 w, h;
int32 x, y;
int32 i2;
BITMAPFILEHEADER bmfHeader;
BITMAPINFOHEADER bi;
img_struct *s, *s2;
if (i >= 0) {
validatepage(i);
s = &img[page[i]];
} else {
x = -i;
if (x >= nextimg) {
error(258);
return;
}
s = &img[x];
if (!s->valid) {
error(258);
return;
}
}
if (!szPrinterName)
szPrinterName = (LPSTR)malloc(65536);
dwNameLen = 65536;
GetDefaultPrinter(szPrinterName, &dwNameLen);
if ((dc = CreateDC(TEXT("WINSPOOL"), szPrinterName, NULL, NULL)) == NULL)
goto failed;
ZeroMemory(&di, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = TEXT("Document");
if (StartDoc(dc, &di) <= 0) {
DeleteDC(dc);
goto failed;
}
if (StartPage(dc) <= 0) {
EndDoc(dc);
DeleteDC(dc);
goto failed;
}
w = GetDeviceCaps(dc, HORZRES);
h = GetDeviceCaps(dc, VERTRES);
i2 = func__newimage(w, h, 32, 1);
if (i2 == -1) {
EndDoc(dc);
DeleteDC(dc);
goto failed;
}
s2 = &img[-i2];
sub__dontblend(i2, 1);
sub__putimage(NULL, NULL, NULL, NULL, i, i2, NULL, NULL, NULL, NULL, 8 + 32);
ZeroMemory(&bi, sizeof(BITMAPINFOHEADER));
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = w;
bi.biHeight = h;
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
for (y = 0; y < h; y++) {
SetDIBitsToDevice(dc, 0, y, w, 1, 0, 0, 0, 1, s2->offset32 + (y * w), (BITMAPINFO *)&bi, DIB_RGB_COLORS);
}
sub__freeimage(i2, 1);
if (EndPage(dc) <= 0) {
EndDoc(dc);
DeleteDC(dc);
goto failed;
}
if (EndDoc(dc) <= 0) {
DeleteDC(dc);
goto failed;
}
DeleteDC(dc);
failed:;
# endif
}
#endif