- Update the Win32 layer.

This commit is contained in:
dgis 2019-04-23 23:30:48 +02:00
parent f511c7238e
commit 7679d2d460
4 changed files with 523 additions and 195 deletions

View file

@ -46,6 +46,7 @@ Version 1.4 (2019-04-xx)
- Fix the authentic speed issue at the first start.
- Fix the non working Restore/Delete backup.
- Update the Win32 layer.
Version 1.3 (2019-04-04)

View file

@ -299,12 +299,16 @@ JNIEXPORT void JNICALL Java_org_emulator_forty_eight_NativeLib_start(JNIEnv *env
_tcscpy(szRomDirectory, "assets/calculators/");
_tcscpy(szPort2Filename, "");
hWindowDC = CreateCompatibleDC(NULL);
// initialization
QueryPerformanceFrequency(&lFreq); // init high resolution counter
QueryPerformanceCounter(&lAppStart);
hWnd = CreateWindow();
//hWindowDC = CreateCompatibleDC(NULL);
hWindowDC = GetDC(hWnd);
szCurrentKml[0] = 0; // no KML file selected
SetSpeed(bRealSpeed); // set speed
//MruInit(4); // init MRU entries
@ -337,8 +341,11 @@ JNIEXPORT void JNICALL Java_org_emulator_forty_eight_NativeLib_start(JNIEnv *env
JNIEXPORT void JNICALL Java_org_emulator_forty_eight_NativeLib_stop(JNIEnv *env, jobject thisz) {
if (hThread) SwitchToState(SM_RETURN); // exit emulation thread
//ReleaseDC(hWnd, hWindowDC);
if (hThread)
SwitchToState(SM_RETURN); // exit emulation thread
ReleaseDC(hWnd, hWindowDC);
DestroyWindow(hWnd);
hWindowDC = NULL; // hWindowDC isn't valid any more
hWnd = NULL;
@ -476,6 +483,10 @@ JNIEXPORT jint JNICALL Java_org_emulator_forty_eight_NativeLib_onFileNew(JNIEnv
chooseCurrentKmlMode = ChooseKmlMode_UNKNOWN;
if(result) {
if(hLcdDC && hLcdDC->selectedBitmap) {
hLcdDC->selectedBitmap->bitmapInfoHeader->biHeight = -abs(hLcdDC->selectedBitmap->bitmapInfoHeader->biHeight);
}
mainViewResizeCallback(nBackgroundW, nBackgroundH);
draw();
@ -499,8 +510,13 @@ JNIEXPORT jint JNICALL Java_org_emulator_forty_eight_NativeLib_onFileOpen(JNIEnv
chooseCurrentKmlMode = ChooseKmlMode_FILE_OPEN;
lastKMLFilename[0] = '\0';
BOOL result = OpenDocument(szBufferFilename);
if (result)
if (result) {
if(hLcdDC && hLcdDC->selectedBitmap) {
hLcdDC->selectedBitmap->bitmapInfoHeader->biHeight = -abs(hLcdDC->selectedBitmap->bitmapInfoHeader->biHeight);
}
MruAdd(szBufferFilename);
}
chooseCurrentKmlMode = ChooseKmlMode_UNKNOWN;
mainViewResizeCallback(nBackgroundW, nBackgroundH);
if(result) {
@ -852,7 +868,12 @@ JNIEXPORT int JNICALL Java_org_emulator_forty_eight_NativeLib_onViewScript(JNIEn
if (bSucc)
{
if(hLcdDC && hLcdDC->selectedBitmap) {
hLcdDC->selectedBitmap->bitmapInfoHeader->biHeight = -abs(hLcdDC->selectedBitmap->bitmapInfoHeader->biHeight);
}
mainViewResizeCallback(nBackgroundW, nBackgroundH);
draw();
if (Chipset.wRomCrc != wRomCrc) // ROM changed
{
CpuReset();
@ -868,7 +889,7 @@ JNIEXPORT int JNICALL Java_org_emulator_forty_eight_NativeLib_onViewScript(JNIEn
SetWindowTitle(NULL);
}
// mainViewResizeCallback(nBackgroundW, nBackgroundH);
draw();
//draw(); //TODO CRASH
return result;
}

View file

@ -52,6 +52,11 @@ void win32Init() {
contentSchemeLength = _tcslen(contentScheme);
}
int abs (int i) {
return i < 0 ? -i : i;
}
VOID OutputDebugString(LPCSTR lpOutputString) {
LOGD("%s", lpOutputString);
}
@ -89,12 +94,12 @@ HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
{
FILE_LOGD("CreateFile(lpFileName: \"%s\", dwDesiredAccess: 0x%08x)", lpFileName, dwShareMode);
BOOL forceNormalFile = FALSE;
if(_tcscmp(lpFileName, szPort2Filename) == 0) {
// Special case for Port2 filename
forceNormalFile = TRUE;
if(!settingsPort2wr && (dwDesiredAccess & GENERIC_WRITE))
return (HANDLE) INVALID_HANDLE_VALUE;
}
// if(_tcscmp(lpFileName, szPort2Filename) == 0) {
// // Special case for Port2 filename
// forceNormalFile = TRUE;
// if(!settingsPort2wr && (dwDesiredAccess & GENERIC_WRITE))
// return (HANDLE) INVALID_HANDLE_VALUE;
// }
TCHAR * foundDocumentScheme = _tcsstr(lpFileName, documentScheme);
@ -112,7 +117,7 @@ HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
if(filename) {
*filename = _T('\0');
}
_tcscpy(szRomDirectory, szEmuDirectory);
//_tcscpy(szRomDirectory, szEmuDirectory);
SetCurrentDirectory(szEmuDirectory);
} else if(foundDocumentScheme) {
// With a recorded "document:" scheme, extract the folder URL with content:// scheme
@ -121,11 +126,11 @@ HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
if(filename) {
*filename = _T('\0');
}
_tcscpy(szRomDirectory, szEmuDirectory);
//_tcscpy(szRomDirectory, szEmuDirectory);
SetCurrentDirectory(szEmuDirectory);
} else {
_tcscpy(szEmuDirectory, "assets/calculators/");
_tcscpy(szRomDirectory, "assets/calculators/");
//_tcscpy(szRomDirectory, "assets/calculators/");
SetCurrentDirectory(szEmuDirectory);
}
}
@ -1287,9 +1292,18 @@ BOOL PostThreadMessage(DWORD idThread, UINT Msg, WPARAM wParam, LPARAM lParam) {
#endif
}
HWND CreateWindow() {
HANDLE handle = malloc(sizeof(struct _HANDLE));
memset(handle, 0, sizeof(struct _HANDLE));
handle->handleType = HANDLE_TYPE_WINDOW;
handle->windowDC = CreateCompatibleDC(NULL);
return handle;
}
BOOL DestroyWindow(HWND hWnd) {
//TODO
return 0;
memset(hWnd, 0, sizeof(struct _HANDLE));
free(hWnd);
return TRUE;
}
BOOL GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT *lpwndpl) {
@ -1302,6 +1316,7 @@ BOOL GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT *lpwndpl) {
BOOL SetWindowPlacement(HWND hWnd, CONST WINDOWPLACEMENT *lpwndpl) { return 0; }
extern void draw();
BOOL InvalidateRect(HWND hWnd, CONST RECT *lpRect, BOOL bErase) {
// Update when switch the screen off
draw(); //TODO Need a true WM_PAINT event!
return 0;
}
@ -1319,11 +1334,11 @@ BOOL SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy,
BOOL IsRectEmpty(CONST RECT *lprc) { return 0; }
BOOL WINAPI SetWindowOrgEx(HDC hdc, int x, int y, LPPOINT lppt) {
if(lppt) {
lppt->x = hdc->windowOrigineX;
lppt->y = hdc->windowOrigineY;
lppt->x = hdc->windowOriginX;
lppt->y = hdc->windowOriginY;
}
hdc->windowOrigineX = x;
hdc->windowOrigineY = y;
hdc->windowOriginX = x;
hdc->windowOriginY = y;
return TRUE;
}
@ -1333,8 +1348,11 @@ HGDIOBJ SelectObject(HDC hdc, HGDIOBJ h) {
switch (h->handleType) {
case HGDIOBJ_TYPE_PEN:
break;
case HGDIOBJ_TYPE_BRUSH:
break;
case HGDIOBJ_TYPE_BRUSH: {
HBRUSH oldSelectedBrushColor = hdc->selectedBrushColor;
hdc->selectedBrushColor = h;
return oldSelectedBrushColor; //h;
}
case HGDIOBJ_TYPE_FONT:
break;
case HGDIOBJ_TYPE_BITMAP: {
@ -1392,11 +1410,11 @@ HGDIOBJ GetCurrentObject(HDC hdc, UINT type) {
return NULL;
}
BOOL DeleteObject(HGDIOBJ ho) {
PAINT_LOGD("Emu48-PAINT DeleteObject(ho: %p)", ho);
PAINT_LOGD("PAINT DeleteObject(ho: %p)", ho);
if(ho) {
switch(ho->handleType) {
case HGDIOBJ_TYPE_PALETTE: {
PAINT_LOGD("Emu48-PAINT DeleteObject() HGDIOBJ_TYPE_PALETTE");
PAINT_LOGD("PAINT DeleteObject() HGDIOBJ_TYPE_PALETTE");
ho->handleType = HGDIOBJ_TYPE_INVALID;
if(ho->paletteLog)
free(ho->paletteLog);
@ -1405,7 +1423,7 @@ BOOL DeleteObject(HGDIOBJ ho) {
return TRUE;
}
case HGDIOBJ_TYPE_BITMAP: {
PAINT_LOGD("Emu48-PAINT DeleteObject() HGDIOBJ_TYPE_BITMAP");
PAINT_LOGD("PAINT DeleteObject() HGDIOBJ_TYPE_BITMAP");
ho->handleType = HGDIOBJ_TYPE_INVALID;
if(ho->bitmapInfo)
free((void *) ho->bitmapInfo);
@ -1456,6 +1474,13 @@ UINT RealizePalette(HDC hdc) {
return 0;
}
COLORREF SetBkColor(HDC hdc, COLORREF color) {
COLORREF backgroundColorBackup = hdc->backgroundColor;
hdc->backgroundColor = color;
hdc->isBackgroundColorSet = TRUE;
return backgroundColorBackup;
}
// DC
HDC CreateCompatibleDC(HDC hdc) {
@ -1465,11 +1490,28 @@ HDC CreateCompatibleDC(HDC hdc) {
handle->hdcCompatible = hdc;
return handle;
}
HDC GetDC(HWND hWnd) {
return hWnd->windowDC;
}
int ReleaseDC(HWND hWnd, HDC hDC) {
hWnd->windowDC = NULL; //?
return TRUE;
}
BOOL DeleteDC(HDC hdc) {
memset(hdc, 0, sizeof(struct _HDC));
free(hdc);
return TRUE;
}
HBRUSH WINAPI CreateSolidBrush(COLORREF color) {
HGDIOBJ handle = (HGDIOBJ)malloc(sizeof(_HGDIOBJ));
memset(handle, 0, sizeof(_HGDIOBJ));
handle->handleType = HGDIOBJ_TYPE_BRUSH;
handle->brushColor = color;
return handle;
}
BOOL MoveToEx(HDC hdc, int x, int y, LPPOINT lppt) {
//TODO
return 0;
@ -1479,14 +1521,13 @@ BOOL LineTo(HDC hdc, int x, int y) {
return 0;
}
BOOL PatBlt(HDC hdcDest, int x, int y, int w, int h, DWORD rop) {
PAINT_LOGD("Emu48-PAINT PatBlt(hdcDest: %p, x: %d, y: %d, w: %d, h: %d, rop: 0x%08x)", hdcDest, x, y, w, h, rop);
PAINT_LOGD("PAINT PatBlt(hdcDest: %p, x: %d, y: %d, w: %d, h: %d, rop: 0x%08x)", hdcDest, x, y, w, h, rop);
if((hdcDest->selectedBitmap || hdcDest->hdcCompatible == NULL) && w && h) {
HBITMAP hBitmapDestination = NULL;
void * pixelsDestination = NULL;
int destinationWidth = 0;
int destinationHeight = 0;
int destinationBytes = 0;
float destinationStride = 0;
JNIEnv * jniEnv = NULL;
@ -1508,7 +1549,6 @@ BOOL PatBlt(HDC hdcDest, int x, int y, int w, int h, DWORD rop) {
destinationWidth = androidBitmapInfo.width;
destinationHeight = androidBitmapInfo.height;
destinationBytes = 4;
destinationStride = androidBitmapInfo.stride;
if ((ret = AndroidBitmap_lockPixels(jniEnv, bitmapMainScreen, &pixelsDestination)) < 0) {
@ -1522,7 +1562,6 @@ BOOL PatBlt(HDC hdcDest, int x, int y, int w, int h, DWORD rop) {
destinationWidth = hBitmapDestination->bitmapInfoHeader->biWidth;
destinationHeight = abs(hBitmapDestination->bitmapInfoHeader->biHeight);
destinationBytes = hBitmapDestination->bitmapInfoHeader->biBitCount >> 3;
destinationStride = (float)(4 * ((destinationWidth * hBitmapDestination->bitmapInfoHeader->biBitCount + 31) / 32));
}
@ -1532,6 +1571,11 @@ BOOL PatBlt(HDC hdcDest, int x, int y, int w, int h, DWORD rop) {
PALETTEENTRY * palPalEntry = palette && palette->paletteLog && palette->paletteLog->palPalEntry ?
palette->paletteLog->palPalEntry : NULL;
COLORREF brushColor = 0xFF000000; // 0xAABBGGRR
if(hdcDest->selectedBrushColor) {
brushColor = hdcDest->selectedBrushColor->brushColor;
}
for (int currentY = y; currentY < y + h; currentY++) {
for (int currentX = x; currentX < x + w; currentX++) {
BYTE * destinationPixel = pixelsDestination + (int)(destinationStride * currentY + 4.0 * currentX);
@ -1550,6 +1594,10 @@ BOOL PatBlt(HDC hdcDest, int x, int y, int w, int h, DWORD rop) {
destinationPixel[2] = palPalEntry[0].peBlue;
destinationPixel[3] = 255;
break;
case PATCOPY:
// 0xAABBGGRR
*((UINT *)destinationPixel) = brushColor;
break;
default:
break;
}
@ -1561,6 +1609,8 @@ BOOL PatBlt(HDC hdcDest, int x, int y, int w, int h, DWORD rop) {
}
return 0;
}
#define ROP_PSDPxax 0x00B8074A // ternary ROP
#define ROP_PDSPxax 0x00D80745
BOOL BitBlt(HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, DWORD rop) {
if(hdcSrc && hdcSrc->selectedBitmap) {
HBITMAP hBitmap = hdcSrc->selectedBitmap;
@ -1576,7 +1626,7 @@ int SetStretchBltMode(HDC hdc, int mode) {
}
BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop) {
PAINT_LOGD("Emu48-PAINT StretchBlt(hdcDest: %p, xDest: %d, yDest: %d, wDest: %d, hDest: %d, hdcSrc: %p, xSrc: %d, ySrc: %d, wSrc: %d, hSrc: %d, rop: 0x%08x)",
PAINT_LOGD("PAINT StretchBlt(hdcDest: %p, xDest: %d, yDest: %d, wDest: %d, hDest: %d, hdcSrc: %p, xSrc: %d, ySrc: %d, wSrc: %d, hSrc: %d, rop: 0x%08x)",
hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop);
if(hdcDest && hdcSrc
@ -1588,6 +1638,7 @@ BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdc
HBITMAP hBitmapDestination = NULL;
void * pixelsDestination = NULL;
int destinationBitCount = 8;
BOOL reverseHeight = hBitmapSource->bitmapInfoHeader->biHeight < 0;
@ -1596,10 +1647,8 @@ BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdc
int destinationWidth = 0;
int destinationHeight = 0;
int sourceBitCount = hBitmapSource->bitmapInfoHeader->biBitCount;
int sourceBytes = sourceBitCount >> 3;
UINT sourceBitCount = hBitmapSource->bitmapInfoHeader->biBitCount;
int sourceStride = 4 * ((sourceWidth * hBitmapSource->bitmapInfoHeader->biBitCount + 31) / 32);
int destinationBytes = 0;
int destinationStride = 0;
JNIEnv * jniEnv = NULL;
@ -1620,8 +1669,7 @@ BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdc
destinationWidth = androidBitmapInfo.width;
destinationHeight = androidBitmapInfo.height;
destinationBytes = 4;
destinationBitCount = 32;
destinationStride = androidBitmapInfo.stride;
if ((ret = AndroidBitmap_lockPixels(jniEnv, bitmapMainScreen, &pixelsDestination)) < 0) {
@ -1634,79 +1682,183 @@ BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdc
destinationWidth = hBitmapDestination->bitmapInfoHeader->biWidth;
destinationHeight = abs(hBitmapDestination->bitmapInfoHeader->biHeight);
destinationBytes = (hBitmapDestination->bitmapInfoHeader->biBitCount >> 3);
destinationStride = destinationBytes * ((destinationWidth * hBitmapDestination->bitmapInfoHeader->biBitCount + 31) / 32);
destinationBitCount = hBitmapDestination->bitmapInfoHeader->biBitCount;
destinationStride = 4 * ((destinationWidth * hBitmapDestination->bitmapInfoHeader->biBitCount + 31) / 32);
}
xDest -= hdcDest->windowOrigineX;
yDest -= hdcDest->windowOrigineY;
xDest -= hdcDest->windowOriginX;
yDest -= hdcDest->windowOriginY;
//LOGD("StretchBlt(%p, x:%d, y:%d, w:%d, h:%d, %08x, x:%d, y:%d, w:%d, h:%d) -> sourceBitCount: %d", hdcDest->hdcCompatible, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, sourceBitCount);
//LOGD("StretchBlt(%p, x:%d, y:%d, w:%d, h:%d, %08x, x:%d, y:%d, w:%d, h:%d) -> sourceBytes: %d", hdcDest->hdcCompatible, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, sourceBytesWithDecimal);
HPALETTE palette = hdcSrc->realizedPalette;
if(!palette)
palette = hdcSrc->selectedPalette;
PALETTEENTRY * palPalEntry = palette && palette->paletteLog && palette->paletteLog->palPalEntry ?
palette->paletteLog->palPalEntry : NULL;
if(!palPalEntry && sourceBitCount <= 8 && hBitmapSource->bitmapInfoHeader->biClrUsed > 0) {
palPalEntry = (PALETTEENTRY *)hBitmapSource->bitmapInfo->bmiColors;
}
COLORREF brushColor = 0xFF000000; // 0xAABBGGRR
if(hdcDest->selectedBrushColor) {
brushColor = hdcDest->selectedBrushColor->brushColor;
}
COLORREF backgroundColor = 0xFF000000; // 0xAABBGGRR
if(hdcDest->isBackgroundColorSet) {
brushColor = hdcDest->backgroundColor;
}
int dst_maxx = xDest + wDest;
int dst_maxy = yDest + hDest;
if(xDest < 0) {
wDest += xDest;
xDest = 0;
}
if(yDest < 0) {
hDest += yDest;
yDest = 0;
}
if(dst_maxx > destinationWidth)
dst_maxx = destinationWidth;
if(dst_maxy > destinationHeight)
dst_maxy = destinationHeight;
for (int y = yDest; y < dst_maxy; y++) {
int src_cury = ySrc + (y - yDest) * hSrc / hDest;
if(!reverseHeight)
src_cury = sourceHeight - 1 - src_cury;
if (src_cury < 0 || src_cury >= sourceHeight)
continue;
BYTE parity = (BYTE) xSrc;
for (int x = xDest; x < dst_maxx; x++, parity++) {
int src_curx = xSrc + (x - xDest) * wSrc / wDest;
if (src_curx < 0 || src_cury < 0 || src_curx >= sourceWidth || src_cury >= sourceHeight)
if (src_curx < 0 || src_curx >= sourceWidth)
continue;
int currentXBytes = ((sourceBitCount >> 2) * src_curx) >> 1;
BYTE * sourcePixel = pixelsSource + sourceStride * src_cury + currentXBytes;
BYTE * destinationPixel = pixelsDestination + destinationStride * y + 4 * x;
BYTE * sourcePixelBase = pixelsSource + sourceStride * src_cury;
BYTE * destinationPixelBase = pixelsDestination + destinationStride * y;
COLORREF sourceColor = 0xFF000000;
BYTE * sourceColorPointer = (BYTE *) &sourceColor;
// -> ARGB_8888
switch (sourceBitCount) {
case 4: {
BYTE colorIndex = (parity & 0x1 ? sourcePixel[0] & (BYTE)0x0F : sourcePixel[0] >> 4);
//BYTE colorIndex = (parity & 0x1 ? sourcePixel[0] >> 4 : sourcePixel[0] & (BYTE)0x0F);
if (palPalEntry) {
destinationPixel[0] = palPalEntry[colorIndex].peBlue;
destinationPixel[1] = palPalEntry[colorIndex].peGreen;
destinationPixel[2] = palPalEntry[colorIndex].peRed;
destinationPixel[3] = 255;
case 1: {
//TODO https://devblogs.microsoft.com/oldnewthing/?p=29013
// When blitting from a monochrome DC to a color DC,
// the color black in the source turns into the destinations text color,
// and the color white in the source turns into the destinations background
// color.
BYTE * sourcePixel = sourcePixelBase + ((UINT)src_curx >> (UINT)3);
UINT bitNumber = (UINT) (src_curx % 8);
if(*sourcePixel & ((UINT)1 << bitNumber)) {
sourceColorPointer[0] = 0;
sourceColorPointer[1] = 0;
sourceColorPointer[2] = 0;
} else {
destinationPixel[0] = colorIndex;
destinationPixel[1] = colorIndex;
destinationPixel[2] = colorIndex;
destinationPixel[3] = 255;
sourceColorPointer[0] = 255;
sourceColorPointer[1] = 255;
sourceColorPointer[2] = 255;
}
sourceColorPointer[3] = 255;
break;
}
case 4: {
int currentXBytes = ((sourceBitCount >> (UINT)2) * src_curx) >> (UINT)1;
BYTE * sourcePixel = sourcePixelBase + currentXBytes;
BYTE colorIndex = (parity & (BYTE)0x1 ? sourcePixel[0] & (BYTE)0x0F : sourcePixel[0] >> (UINT)4);
if (palPalEntry) {
sourceColorPointer[0] = palPalEntry[colorIndex].peBlue;
sourceColorPointer[1] = palPalEntry[colorIndex].peGreen;
sourceColorPointer[2] = palPalEntry[colorIndex].peRed;
sourceColorPointer[3] = 255;
} else {
sourceColorPointer[0] = colorIndex;
sourceColorPointer[1] = colorIndex;
sourceColorPointer[2] = colorIndex;
sourceColorPointer[3] = 255;
}
break;
}
case 8: {
BYTE * sourcePixel = sourcePixelBase + src_curx;
BYTE colorIndex = sourcePixel[0];
if (palPalEntry) {
destinationPixel[0] = palPalEntry[colorIndex].peBlue;
destinationPixel[1] = palPalEntry[colorIndex].peGreen;
destinationPixel[2] = palPalEntry[colorIndex].peRed;
destinationPixel[3] = 255;
sourceColorPointer[0] = palPalEntry[colorIndex].peBlue;
sourceColorPointer[1] = palPalEntry[colorIndex].peGreen;
sourceColorPointer[2] = palPalEntry[colorIndex].peRed;
sourceColorPointer[3] = 255;
} else {
destinationPixel[0] = sourcePixel[0];
destinationPixel[1] = sourcePixel[0];
destinationPixel[2] = sourcePixel[0];
destinationPixel[3] = 255;
sourceColorPointer[0] = colorIndex;
sourceColorPointer[1] = colorIndex;
sourceColorPointer[2] = colorIndex;
sourceColorPointer[3] = 255;
}
break;
}
case 24:
destinationPixel[0] = sourcePixel[2];
destinationPixel[1] = sourcePixel[1];
destinationPixel[2] = sourcePixel[0];
destinationPixel[3] = 255;
case 24: {
BYTE * sourcePixel = sourcePixelBase + 3 * src_curx;
sourceColorPointer[0] = sourcePixel[2];
sourceColorPointer[1] = sourcePixel[1];
sourceColorPointer[2] = sourcePixel[0];
sourceColorPointer[3] = 255;
break;
case 32:
memcpy(destinationPixel, sourcePixel, (size_t) sourceBytes);
}
case 32: {
BYTE *sourcePixel = sourcePixelBase + 4 * src_curx;
memcpy(sourceColorPointer, sourcePixel, 4);
break;
}
default:
break;
}
switch (destinationBitCount) {
case 1: {
//TODO https://devblogs.microsoft.com/oldnewthing/?p=29013
// If you blit from a color DC to a monochrome DC,
// then all pixels in the source that are equal to the background color
// will turn white, and all other pixels will turn black.
// In other words, GDI considers a monochrome bitmap to be
// black pixels on a white background.
BYTE * destinationPixel = destinationPixelBase + (x >> 3);
UINT bitNumber = x % 8;
if(brushColor == sourceColor) {
*destinationPixel |= (1 << bitNumber);
} else {
*destinationPixel &= ~(1 << bitNumber);
}
break;
}
case 4: {
//TODO
break;
}
case 8: {
//TODO
break;
}
case 24: {
BYTE * destinationPixel = destinationPixelBase + 3 * x;
destinationPixel[0] = sourceColorPointer[0];
destinationPixel[1] = sourceColorPointer[1];
destinationPixel[2] = sourceColorPointer[2];
break;
}
case 32: {
BYTE * destinationPixel = destinationPixelBase + 4 * x;
// https://docs.microsoft.com/en-us/windows/desktop/gdi/ternary-raster-operations
// http://www.qnx.com/developers/docs/6.4.1/gf/dev_guide/api/gf_context_set_rop.html
if (rop == ROP_PDSPxax) { // P ^ (D & (S ^ P))
UINT destination = *((UINT *) destinationPixel);
*((UINT *)destinationPixel) = (brushColor ^ (destination & (sourceColor ^ brushColor))) | 0xFF000000;
} else if (rop == ROP_PSDPxax) { // P ^ (S & (D ^ P))
UINT destination = *((UINT *) destinationPixel);
*((UINT *)destinationPixel) = (brushColor ^ (sourceColor & (destination ^ brushColor))) | 0xFF000000;
} else
*((UINT *)destinationPixel) = sourceColor;
break;
}
default:
break;
}
@ -1736,8 +1888,34 @@ UINT SetDIBColorTable(HDC hdc, UINT iStart, UINT cEntries, CONST RGBQUAD *prgbq
}
return 0;
}
HBITMAP CreateBitmap( int nWidth, int nHeight, UINT nPlanes, UINT nBitCount, CONST VOID *lpBits) {
PAINT_LOGD("PAINT CreateBitmap()");
HGDIOBJ newHBITMAP = (HGDIOBJ)malloc(sizeof(_HGDIOBJ));
memset(newHBITMAP, 0, sizeof(_HGDIOBJ));
newHBITMAP->handleType = HGDIOBJ_TYPE_BITMAP;
BITMAPINFO * newBitmapInfo = malloc(sizeof(BITMAPINFO));
memset(newBitmapInfo, 0, sizeof(BITMAPINFO));
//newBitmapInfo->bmiHeader.biBitCount = 32; //TODO should be nBitCount
newBitmapInfo->bmiHeader.biBitCount = nBitCount; //TODO should be nBitCount
newBitmapInfo->bmiHeader.biClrUsed = 0;
newBitmapInfo->bmiHeader.biWidth = nWidth;
newBitmapInfo->bmiHeader.biHeight = -nHeight;
newBitmapInfo->bmiHeader.biPlanes = (WORD) nPlanes;
newHBITMAP->bitmapInfo = newBitmapInfo;
newHBITMAP->bitmapInfoHeader = (BITMAPINFOHEADER *)newBitmapInfo;
size_t stride = (size_t)(4 * ((newBitmapInfo->bmiHeader.biWidth * newBitmapInfo->bmiHeader.biBitCount + 31) / 32));
size_t size = abs(newBitmapInfo->bmiHeader.biHeight) * stride;
newBitmapInfo->bmiHeader.biSizeImage = (DWORD) size;
VOID * bitmapBits = malloc(size);
memset(bitmapBits, 0, size);
newHBITMAP->bitmapBits = bitmapBits;
return newHBITMAP;
}
HBITMAP CreateDIBitmap( HDC hdc, CONST BITMAPINFOHEADER *pbmih, DWORD flInit, CONST VOID *pjBits, CONST BITMAPINFO *pbmi, UINT iUsage) {
PAINT_LOGD("Emu48-PAINT CreateDIBitmap()");
PAINT_LOGD("PAINT CreateDIBitmap()");
HGDIOBJ newHBITMAP = (HGDIOBJ)malloc(sizeof(_HGDIOBJ));
memset(newHBITMAP, 0, sizeof(_HGDIOBJ));
@ -1751,14 +1929,14 @@ HBITMAP CreateDIBitmap( HDC hdc, CONST BITMAPINFOHEADER *pbmih, DWORD flInit, CO
size_t stride = (size_t)(4 * ((newBitmapInfo->bmiHeader.biWidth * newBitmapInfo->bmiHeader.biBitCount + 31) / 32));
size_t size = newBitmapInfo->bmiHeader.biSizeImage ?
newBitmapInfo->bmiHeader.biSizeImage :
newBitmapInfo->bmiHeader.biHeight * stride;
abs(newBitmapInfo->bmiHeader.biHeight) * stride;
VOID * bitmapBits = malloc(size);
memcpy(bitmapBits, pjBits, size);
newHBITMAP->bitmapBits = bitmapBits;
return newHBITMAP;
}
HBITMAP CreateDIBSection(HDC hdc, CONST BITMAPINFO *pbmi, UINT usage, VOID **ppvBits, HANDLE hSection, DWORD offset) {
PAINT_LOGD("Emu48-PAINT CreateDIBitmap()");
PAINT_LOGD("PAINT CreateDIBitmap()");
HGDIOBJ newHBITMAP = (HGDIOBJ)malloc(sizeof(_HGDIOBJ));
memset(newHBITMAP, 0, sizeof(_HGDIOBJ));
@ -1781,7 +1959,7 @@ HBITMAP CreateDIBSection(HDC hdc, CONST BITMAPINFO *pbmi, UINT usage, VOID **ppv
return newHBITMAP;
}
HBITMAP CreateCompatibleBitmap( HDC hdc, int cx, int cy) {
PAINT_LOGD("Emu48-PAINT CreateDIBitmap()");
PAINT_LOGD("PAINT CreateDIBitmap()");
HGDIOBJ newHBITMAP = (HGDIOBJ)malloc(sizeof(_HGDIOBJ));
memset(newHBITMAP, 0, sizeof(_HGDIOBJ));
@ -1798,7 +1976,7 @@ HBITMAP CreateCompatibleBitmap( HDC hdc, int cx, int cy) {
newBitmapInfo->bmiHeader.biBitCount = 32;
size_t stride = (size_t)(4 * ((newBitmapInfo->bmiHeader.biWidth * newBitmapInfo->bmiHeader.biBitCount + 31) / 32));
size_t size = newBitmapInfo->bmiHeader.biHeight * stride;
size_t size = abs(newBitmapInfo->bmiHeader.biHeight) * stride;
newBitmapInfo->bmiHeader.biSizeImage = (DWORD) size;
newHBITMAP->bitmapBits = malloc(size);
memset((void *) newHBITMAP->bitmapBits, 0, size);
@ -1808,10 +1986,91 @@ int GetDIBits(HDC hdc, HBITMAP hbm, UINT start, UINT cLines, LPVOID lpvBits, LPB
//TODO
return 0;
}
COLORREF GetPixel(HDC hdc, int x ,int y) {
HBITMAP hBitmapSource = hdc->selectedBitmap;
void * pixelsSource = (void *) hBitmapSource->bitmapBits;
BOOL reverseHeight = hBitmapSource->bitmapInfoHeader->biHeight < 0;
int sourceWidth = hBitmapSource->bitmapInfoHeader->biWidth;
int sourceHeight = abs(hBitmapSource->bitmapInfoHeader->biHeight); // Can be < 0
int sourceBitCount = hBitmapSource->bitmapInfoHeader->biBitCount;
int sourceStride = 4 * ((sourceWidth * hBitmapSource->bitmapInfoHeader->biBitCount + 31) / 32);
jint ret;
x -= hdc->windowOriginX;
y -= hdc->windowOriginY;
HPALETTE palette = hdc->realizedPalette;
if(!palette)
palette = hdc->selectedPalette;
PALETTEENTRY * palPalEntry = palette && palette->paletteLog && palette->paletteLog->palPalEntry ?
palette->paletteLog->palPalEntry : NULL;
if(!palPalEntry && sourceBitCount <= 8 && hBitmapSource->bitmapInfoHeader->biClrUsed > 0) {
palPalEntry = (PALETTEENTRY *)hBitmapSource->bitmapInfo->bmiColors;
}
COLORREF brushColor = 0xFF000000; // 0xAABBGGRR
if(hdc->selectedBrushColor) {
brushColor = hdc->selectedBrushColor->brushColor;
}
COLORREF resultColor = CLR_INVALID; // 0xAABBGGRR
if(x >= 0 && y >= 0 && x < sourceWidth && y < sourceHeight) {
BYTE * sourcePixel = pixelsSource + sourceStride * y + 4 * x;
// -> ARGB_8888
switch (sourceBitCount) {
case 1:
//TODO
break;
case 4: {
BYTE colorIndex = (x & 0x1 ? sourcePixel[0] & (BYTE)0x0F : sourcePixel[0] >> 4);
if (palPalEntry) {
resultColor = 0xFF000000 | RGB(palPalEntry[colorIndex].peRed, palPalEntry[colorIndex].peGreen, palPalEntry[colorIndex].peBlue);
} else {
resultColor = 0xFF000000 | RGB(colorIndex, colorIndex, colorIndex);
}
break;
}
case 8: {
BYTE colorIndex = sourcePixel[0];
if (palPalEntry) {
resultColor = 0xFF000000 | RGB(palPalEntry[colorIndex].peRed, palPalEntry[colorIndex].peGreen, palPalEntry[colorIndex].peBlue);
} else {
resultColor = 0xFF000000 | RGB(sourcePixel[0], sourcePixel[0], sourcePixel[0]);
}
break;
}
case 24:
resultColor = 0xFF000000 | RGB(sourcePixel[2], sourcePixel[1], sourcePixel[0]);
break;
case 32:
resultColor = 0xFF000000 | RGB(sourcePixel[2], sourcePixel[1], sourcePixel[0]);
break;
default:
break;
}
}
return resultColor;
}
BOOL SetRect(LPRECT lprc, int xLeft, int yTop, int xRight, int yBottom) {
//TODO
return 0;
}
BOOL SetRectEmpty(LPRECT lprc) {
if(lprc) {
lprc->top = 0;
lprc->bottom = 0;
lprc->left = 0;
lprc->right = 0;
return TRUE;
}
return FALSE;
}
int SetWindowRgn(HWND hWnd, HRGN hRgn, BOOL bRedraw) {
//TODO
return 0;
@ -1828,14 +2087,16 @@ HDC BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint) {
if(lpPaint) {
memset(lpPaint, 0, sizeof(PAINTSTRUCT));
lpPaint->fErase = TRUE;
lpPaint->hdc = hWindowDC;
lpPaint->hdc = CreateCompatibleDC(NULL); //hWnd->windowDC);
lpPaint->rcPaint.right = (short) nBackgroundW;
lpPaint->rcPaint.bottom = (short) nBackgroundH;
return lpPaint->hdc;
}
return hWindowDC;
return NULL;
}
BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint) {
mainViewUpdateCallback();
//mainViewUpdateCallback(); //TODO May be not needed
DeleteDC(lpPaint->hdc);
return 0;
}

View file

@ -57,6 +57,13 @@
#define FAR
#define NEAR
#define __forceinline __attribute__((always_inline))
#undef abs
extern int abs(int i);
typedef int BOOL;
typedef unsigned long ULONG;
typedef short SHORT;
@ -360,6 +367,132 @@ enum {
#define FillMemory(p,n,v) memset(p,v,n*sizeof(*(p)))
#define CopyMemory(d,src,s) memcpy(d,src,s)
// GDI
typedef struct __attribute__((packed)) tagBITMAP
{
LONG bmType;
LONG bmWidth;
LONG bmHeight;
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits;
} BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;
/* constants for the biCompression field */
#define BI_RGB 0L
#define BI_RLE8 1L
#define BI_RLE4 2L
#define BI_BITFIELDS 3L
#define BI_JPEG 4L
#define BI_PNG 5L
typedef struct __attribute__((packed)) tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
typedef struct __attribute__((packed)) tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
typedef struct __attribute__((packed)) tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;
typedef struct __attribute__((packed)) tagPALETTEENTRY {
BYTE peRed;
BYTE peGreen;
BYTE peBlue;
BYTE peFlags;
} PALETTEENTRY, *PPALETTEENTRY, FAR *LPPALETTEENTRY;
typedef struct __attribute__((packed)) tagLOGPALETTE {
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[1];
} LOGPALETTE, *PLOGPALETTE, NEAR *NPLOGPALETTE, FAR *LPLOGPALETTE;
typedef DWORD COLORREF;
enum HGDIOBJ_TYPE {
HGDIOBJ_TYPE_INVALID = 0,
HGDIOBJ_TYPE_PEN,
HGDIOBJ_TYPE_BRUSH,
HGDIOBJ_TYPE_FONT,
HGDIOBJ_TYPE_BITMAP,
HGDIOBJ_TYPE_REGION,
HGDIOBJ_TYPE_PALETTE
};
typedef struct {
enum HGDIOBJ_TYPE handleType;
// HGDIOBJ_TYPE_PALETTE
PLOGPALETTE paletteLog;
// HGDIOBJ_TYPE_BITMAP
CONST BITMAPINFO *bitmapInfo;
/*CONST*/ BITMAPINFOHEADER * bitmapInfoHeader;
CONST VOID *bitmapBits;
// HGDIOBJ_TYPE_BRUSH
COLORREF brushColor;
} _HGDIOBJ;
typedef _HGDIOBJ * HGDIOBJ;
//typedef void * HGDIOBJ;
typedef HGDIOBJ HPALETTE;
typedef HGDIOBJ HBITMAP;
typedef HGDIOBJ HFONT;
typedef HGDIOBJ HBRUSH;
extern int GetObject(HGDIOBJ h, int c, LPVOID pv);
extern BOOL DeleteObject(HGDIOBJ ho);
#define OBJ_BITMAP 7
#define WHITE_PEN 6
#define BLACK_PEN 7
extern HGDIOBJ GetStockObject(int i);
extern HPALETTE CreatePalette(CONST LOGPALETTE * plpal);
// DC
enum DC_TYPE {
DC_TYPE_INVALID = 0,
DC_TYPE_MEMORY,
DC_TYPE_DISPLAY
};
enum HDC_TYPE {
HDC_TYPE_INVALID = 0,
HDC_TYPE_DC
};
struct _HDC;
typedef struct _HDC * HDC;
struct _HDC {
enum HDC_TYPE handleType;
HDC hdcCompatible;
enum DC_TYPE dcType;
HBITMAP selectedBitmap;
HPALETTE selectedPalette;
HPALETTE realizedPalette;
HBRUSH selectedBrushColor;
BOOL isBackgroundColorSet;
COLORREF backgroundColor;
int windowOriginX;
int windowOriginY;
};
// Handle
struct _HANDLE;
typedef struct _HANDLE * HWND;
@ -390,7 +523,8 @@ enum HANDLE_TYPE {
HANDLE_TYPE_FILE_MAPPING_CONTENT,
HANDLE_TYPE_FILE_MAPPING_ASSET,
HANDLE_TYPE_EVENT,
HANDLE_TYPE_THREAD,
HANDLE_TYPE_THREAD,
HANDLE_TYPE_WINDOW,
};
struct _HANDLE {
enum HANDLE_TYPE handleType;
@ -416,6 +550,8 @@ struct _HANDLE {
pthread_mutex_t eventMutex;
BOOL eventAutoReset;
BOOL eventState;
HDC windowDC;
};
typedef struct _HANDLE * HANDLE;
@ -423,6 +559,7 @@ typedef HANDLE HMENU;
typedef HANDLE HINSTANCE;
//typedef HANDLE HWND;
typedef HANDLE HCURSOR;
typedef HANDLE HLOCAL; //TODO
typedef struct _OVERLAPPED {
@ -532,6 +669,13 @@ extern HANDLE LoadImage(HINSTANCE hInst, LPCSTR name, UINT type, int cx, int cy,
#define TBM_SETRANGE (WM_USER+6)
#define TBM_SETTICFREQ (WM_USER+20)
#define BST_CHECKED 0x0001
#define LB_ADDSTRING 0x0180
#define LB_GETCOUNT 0x018B
#define LB_GETSEL 0x0187
#define LB_GETSELCOUNT 0x0190
#define LB_GETITEMDATA 0x0199
#define LB_SETITEMDATA 0x019A
extern LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
extern BOOL PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
extern int MessageBox(HANDLE, LPCTSTR szMessage, LPCTSTR szTitle, int flags);
@ -571,130 +715,24 @@ extern void EnterCriticalSection(CRITICAL_SECTION *);
extern void LeaveCriticalSection(CRITICAL_SECTION *);
extern void DeleteCriticalSection(CRITICAL_SECTION * lpCriticalSection);
// GDI
typedef struct __attribute__((packed)) tagBITMAP
{
LONG bmType;
LONG bmWidth;
LONG bmHeight;
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits;
} BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;
/* constants for the biCompression field */
#define BI_RGB 0L
#define BI_RLE8 1L
#define BI_RLE4 2L
#define BI_BITFIELDS 3L
#define BI_JPEG 4L
#define BI_PNG 5L
typedef struct __attribute__((packed)) tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
typedef struct __attribute__((packed)) tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
typedef struct __attribute__((packed)) tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;
typedef struct __attribute__((packed)) tagPALETTEENTRY {
BYTE peRed;
BYTE peGreen;
BYTE peBlue;
BYTE peFlags;
} PALETTEENTRY, *PPALETTEENTRY, FAR *LPPALETTEENTRY;
typedef struct __attribute__((packed)) tagLOGPALETTE {
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[1];
} LOGPALETTE, *PLOGPALETTE, NEAR *NPLOGPALETTE, FAR *LPLOGPALETTE;
enum HGDIOBJ_TYPE {
HGDIOBJ_TYPE_INVALID = 0,
HGDIOBJ_TYPE_PEN,
HGDIOBJ_TYPE_BRUSH,
HGDIOBJ_TYPE_FONT,
HGDIOBJ_TYPE_BITMAP,
HGDIOBJ_TYPE_REGION,
HGDIOBJ_TYPE_PALETTE
};
typedef struct {
enum HGDIOBJ_TYPE handleType;
// HGDIOBJ_TYPE_PALETTE
PLOGPALETTE paletteLog;
// HGDIOBJ_TYPE_BITMAP
CONST BITMAPINFO *bitmapInfo;
CONST BITMAPINFOHEADER * bitmapInfoHeader;
CONST VOID *bitmapBits;
} _HGDIOBJ;
typedef _HGDIOBJ * HGDIOBJ;
//typedef void * HGDIOBJ;
typedef HGDIOBJ HPALETTE;
typedef HGDIOBJ HBITMAP;
typedef HGDIOBJ HFONT;
extern int GetObject(HGDIOBJ h, int c, LPVOID pv);
extern BOOL DeleteObject(HGDIOBJ ho);
#define OBJ_BITMAP 7
#define WHITE_PEN 6
#define BLACK_PEN 7
extern HGDIOBJ GetStockObject(int i);
extern HPALETTE CreatePalette(CONST LOGPALETTE * plpal);
// DC
enum DC_TYPE {
DC_TYPE_INVALID = 0,
DC_TYPE_MEMORY,
DC_TYPE_DISPLAY
};
enum HDC_TYPE {
HDC_TYPE_INVALID = 0,
HDC_TYPE_DC
};
struct _HDC;
typedef struct _HDC * HDC;
struct _HDC{
enum HDC_TYPE handleType;
HDC hdcCompatible;
enum DC_TYPE dcType;
HBITMAP selectedBitmap;
HPALETTE selectedPalette;
HPALETTE realizedPalette;
int windowOrigineX;
int windowOrigineY;
};
//typedef HANDLE HDC;
extern HDC CreateCompatibleDC(HDC hdc);
extern HDC GetDC(HWND hWnd);
extern int ReleaseDC(HWND hWnd, HDC hDC);
extern BOOL DeleteDC(HDC hdc);
extern HGDIOBJ SelectObject(HDC hdc, HGDIOBJ h);
extern HGDIOBJ GetCurrentObject(HDC hdc, UINT type);
HBRUSH CreateSolidBrush(COLORREF color);
extern BOOL MoveToEx(HDC hdc, int x, int y, LPPOINT lppt);
extern BOOL LineTo(HDC hdc, int x, int y);
#define SRCCOPY (DWORD)0x00CC0020 /* dest = source */
#define PATCOPY (DWORD)0x00F00021 /* dest = pattern */
#define DSTINVERT (DWORD)0x00550009 /* dest = (NOT dest) */
#define BLACKNESS (DWORD)0x00000042 /* dest = BLACK */
#define WHITENESS (DWORD)0x00FF0062 /* dest = WHITE */
extern BOOL PatBlt(HDC hdc, int x, int y, int w, int h, DWORD rop);
extern BOOL BitBlt(HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, DWORD rop);
#define HALFTONE 4
@ -706,6 +744,7 @@ extern UINT SetDIBColorTable(HDC hdc, UINT iStart, UINT cEntries, CONST RGBQUAD
/* DIB color table identifiers */
#define DIB_RGB_COLORS 0 /* color table in RGBs */
#define DIB_PAL_COLORS 1 /* color table in palette indices */
extern HBITMAP CreateBitmap( int nWidth, int nHeight, UINT nPlanes, UINT nBitCount, CONST VOID *lpBits);
extern HBITMAP CreateDIBitmap( HDC hdc, CONST BITMAPINFOHEADER *pbmih, DWORD flInit, CONST VOID *pjBits, CONST BITMAPINFO *pbmi, UINT iUsage);
extern HBITMAP CreateDIBSection(HDC hdc, CONST BITMAPINFO *pbmi, UINT usage, VOID **ppvBits, HANDLE hSection, DWORD offset);
extern HBITMAP CreateCompatibleBitmap( HDC hdc, int cx, int cy);
@ -721,11 +760,14 @@ typedef struct _RGNDATA {
char Buffer[1];
} RGNDATA, *PRGNDATA, NEAR *NPRGNDATA, FAR *LPRGNDATA;
extern int GetDIBits(HDC hdc, HBITMAP hbm, UINT start, UINT cLines, LPVOID lpvBits, LPBITMAPINFO lpbmi, UINT usage);
extern COLORREF GetPixel(HDC hdc, int x ,int y);
extern HPALETTE SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd);
extern UINT RealizePalette(HDC hdc);
extern COLORREF SetBkColor(HDC hdc, COLORREF color);
/* GetRegionData/ExtCreateRegion */
#define RDH_RECTANGLES 1
extern BOOL SetRect(LPRECT lprc, int xLeft, int yTop, int xRight, int yBottom);
extern BOOL SetRectEmpty(LPRECT lprc);
struct HRGN__ { int unused; };
typedef struct HRGN__ *HRGN;
@ -877,6 +919,7 @@ typedef struct tagWINDOWPLACEMENT {
} WINDOWPLACEMENT;
typedef WINDOWPLACEMENT *PWINDOWPLACEMENT, *LPWINDOWPLACEMENT;
extern HWND CreateWindow();
extern BOOL DestroyWindow(HWND hWnd);
extern BOOL GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT *lpwndpl);
extern BOOL SetWindowPlacement(HWND hWnd, CONST WINDOWPLACEMENT *lpwndpl);
@ -925,6 +968,8 @@ extern BOOL GetClientRect(HWND hWnd, LPRECT lpRect);
typedef char *PSZ;
typedef DWORD COLORREF;
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
#define CLR_INVALID 0xFFFFFFFF
extern BOOL MessageBeep(UINT uType);