diff --git a/src/arch/os2/os2driver.c b/src/arch/os2/os2driver.c index ed50198..f4aa1d0 100644 --- a/src/arch/os2/os2driver.c +++ b/src/arch/os2/os2driver.c @@ -59,7 +59,7 @@ int g_win_capslock_down = 0; extern int g_border_sides_refresh_needed; extern int g_border_special_refresh_needed; extern int g_status_refresh_needed; - +extern int g_needfullrefreshfornextframe; extern int g_lores_colors[]; extern int g_cur_a2_stat; @@ -73,8 +73,14 @@ extern word32 g_a2_screen_buffer_changed; BITMAPINFO2 *g_bmapinfo_ptr = 0; volatile BITMAPINFOHEADER2 *g_bmaphdr_ptr = 0; -HDC g_hdc; -HPS g_hps; +HDC g_hdc_screen, g_hdc_memory; +HPS g_hps_screen, g_hps_memory; + +extern word32 g_palette_8to1624[256]; +extern word32 g_a2palette_8to1624[256]; +extern char *g_status_ptrs[MAX_STATUS_LINES]; + +VOID DispErrorMessage(); int win_nonblock_read_stdin(int fd, char *bufptr, int len) @@ -98,6 +104,7 @@ x_show_alert(int is_fatal, const char *str) int main(int argc, char **argv) { +DEVOPENSTRUC pszData; ULONG flCreate; /* Window creation control flags*/ int height; SIZEL sizel; @@ -117,7 +124,7 @@ SIZEL sizel; )) os2_abort(g_hwnd_frame, g_hwnd_client); /* Terminate the application */ - height = X_A2_WINDOW_HEIGHT + (MAX_STATUS_LINES*16) + 32; + height = X_A2_WINDOW_HEIGHT + (MAX_STATUS_LINES*16); g_main_height = height; flCreate = FCF_STANDARD & /* Set frame control flags to */ @@ -135,7 +142,7 @@ SIZEL sizel; ID_WINDOW, /* Frame window identifier */ &g_hwnd_client /* Client window handle */ )) == 0L) - os2_abort(HWND_DESKTOP, HWND_DESKTOP); /* Terminate the application */ + os2_abort(HWND_DESKTOP, HWND_DESKTOP); /* Terminate the application */ WinSetWindowText(g_hwnd_frame, "GSport"); @@ -144,15 +151,19 @@ SIZEL sizel; 100, 100, X_A2_WINDOW_WIDTH, height, /* and size 200, 200. */ SWP_SIZE | SWP_MOVE | SWP_ACTIVATE | SWP_SHOW )) - os2_abort(g_hwnd_frame, g_hwnd_client); /* Terminate the application */ + os2_abort(g_hwnd_frame, g_hwnd_client); /* Terminate the application */ - g_hdc = WinOpenWindowDC(g_hwnd_frame); + g_hdc_screen = WinOpenWindowDC(g_hwnd_client); sizel.cx = X_A2_WINDOW_WIDTH; sizel.cy = height; - g_hps = GpiCreatePS(g_hab,g_hdc, &sizel, PU_ARBITRARY | GPIT_MICRO | GPIA_ASSOC); + g_hps_screen = GpiCreatePS(g_hab,g_hdc_screen, &sizel, PU_PELS | GPIF_LONG | GPIA_ASSOC); + + g_hdc_memory = DevOpenDC(g_hab, OD_MEMORY, "*", 4, (PDEVOPENDATA)&pszData, NULL); + g_hps_memory = GpiCreatePS(g_hab,g_hdc_memory, &sizel, PU_ARBITRARY | GPIT_MICRO | GPIA_ASSOC); // Call gsportmain return gsportmain(argc, argv); + } @@ -168,6 +179,9 @@ SIZEL sizel; *************************************************************************/ MRESULT EXPENTRY MyWindowProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 ) { +HPS hps; +RECTL rcl; + switch( msg ) { case WM_CREATE: @@ -209,27 +223,16 @@ MRESULT EXPENTRY MyWindowProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 ) /* * Window contents are drawn here in WM_PAINT processing. */ - { - HPS hps; /* Presentation Space handle */ - RECTL rc; /* Rectangle coordinates */ - POINTL pt; /* String screen coordinates */ - /* Create a presentation space */ - hps = WinBeginPaint( hwnd, 0L, &rc ); - WinFillRect( hps, &rc, SYSCLR_WINDOW); - pt.x = 50; pt.y = 50; /* Set the text coordinates, */ - GpiSetColor( hps, CLR_NEUTRAL ); /* colour of the text, */ - GpiSetBackColor( hps, CLR_BACKGROUND ); /* its background and */ - GpiSetBackMix( hps, BM_OVERPAINT ); /* how it mixes, */ - /* and draw the string...*/ - //GpiCharStringAt( hps, &pt, (LONG)strlen( szString ), szString ); - WinEndPaint( hps ); /* Drawing is complete */ + hps = WinBeginPaint(hwnd, NULLHANDLE, &rcl); + WinEndPaint(hps); + g_needfullrefreshfornextframe = 1; break; - } case WM_CLOSE: /* * This is the place to put your termination routines */ - WinPostMsg( hwnd, WM_QUIT, (MPARAM)0,(MPARAM)0 );/* Cause termination*/ + WinPostMsg( hwnd, WM_QUIT, (MPARAM)0,(MPARAM)0 ); /* Cause termination*/ + exit(0); break; default: /* @@ -239,6 +242,7 @@ MRESULT EXPENTRY MyWindowProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 ) return WinDefWindowProc( hwnd, msg, mp1, mp2 ); } + return (MRESULT)FALSE; } /* End of MyWindowProc */ @@ -251,25 +255,15 @@ check_input_events() * until WinGetMsg returns FALSE, indicating a WM_QUIT message. */ - /* Need to peek messages, i.e. - - while(PeekMessage(&msg, g_hwnd_main, 0, 0, PM_NOREMOVE)) { - if(GetMessage(&msg, g_hwnd_main, 0, 0) > 0) { - TranslateMessage(&msg); - DispatchMessage(&msg); + while(WinPeekMsg(g_hab, &qmsg, g_hwnd_frame, 0, 0, PM_NOREMOVE)) { + if(WinGetMsg(g_hab, &qmsg, 0L, 0, 0) > 0) { + //TranslateMessage(&qmsg); + WinDispatchMsg(g_hab, &qmsg); } else { printf("GetMessage returned <= 0\n"); my_exit(2); } } - */ - - while( WinGetMsg( g_hab, &qmsg, 0L, 0, 0 ) ) - WinDispatchMsg( g_hab, &qmsg ); - WinDestroyWindow(g_hwnd_frame); /* Tidy up... */ - WinDestroyMsgQueue( g_hmq ); /* Tidy up... */ - WinTerminate( g_hab ); /* Terminate the application */ - } @@ -315,10 +309,11 @@ x_get_kimage(Kimage *kimage_ptr) if(depth == g_screen_depth) { /* Use g_bmapinfo_ptr, adjusting width, height */ g_bmaphdr_ptr->cx = width; - g_bmaphdr_ptr->cy = -height; + g_bmaphdr_ptr->cy = height; kimage_ptr->dev_handle = GpiCreateBitmap( - (HPS)g_hps, (PBITMAPINFOHEADER2)g_bmaphdr_ptr, + + (HPS)g_hps_memory, (PBITMAPINFOHEADER2)g_bmaphdr_ptr, 0L, (PBYTE)kimage_ptr->data_ptr, (PBITMAPINFO2)g_bmapinfo_ptr); @@ -356,6 +351,9 @@ x_get_kimage(Kimage *kimage_ptr) void dev_video_init() { + int lores_col; + int i; + printf("Preparing graphics system\n"); g_screen_depth = 24; @@ -365,7 +363,7 @@ dev_video_init() g_bmaphdr_ptr = (BITMAPINFOHEADER2 *)g_bmapinfo_ptr; g_bmaphdr_ptr->cbFix = sizeof(BITMAPINFOHEADER2); g_bmaphdr_ptr->cx = A2_WINDOW_WIDTH; - g_bmaphdr_ptr->cy = -A2_WINDOW_HEIGHT; + g_bmaphdr_ptr->cy = A2_WINDOW_HEIGHT; g_bmaphdr_ptr->cPlanes = 1; g_bmaphdr_ptr->cBitCount = g_screen_mdepth; g_bmaphdr_ptr->ulCompression = BCA_UNCOMP; @@ -379,6 +377,12 @@ dev_video_init() g_screen_mdepth); } + for(i = 0; i < 256; i++) { + lores_col = g_lores_colors[i & 0xf]; + video_update_color_raw(i, lores_col); + g_a2palette_8to1624[i] = g_palette_8to1624[i]; + } + g_installed_full_superhires_colormap = 1; printf("Done with dev_video_init\n"); @@ -388,6 +392,33 @@ dev_video_init() void x_redraw_status_lines() { + + int line,len,height; + POINTL pt; + char *buf; + + printf("x_redraw_status_lines() called\n"); +/* + if (g_status_ptrs[0] != NULL) + { + height = 16; + pt.x = 5; pt.y = 0; + GpiSetColor( g_hps_screen, CLR_NEUTRAL ); + GpiSetBackColor( g_hps_screen, CLR_BACKGROUND ); + GpiSetBackMix( g_hps_screen, BM_OVERPAINT ); + + for (line = 0; line < MAX_STATUS_LINES; line++) + { + buf = g_status_ptrs[line]; + if (buf != 0) + { + pt.y = height * (line+1); + len = strlen(buf); + GpiCharStringAt( g_hps_screen, &pt, (LONG)strlen( buf ), buf ); + } + } + } +*/ } @@ -395,6 +426,39 @@ void x_push_kimage(Kimage *kimage_ptr, int destx, int desty, int srcx, int srcy, int width, int height) { + RECTL rc; + POINTL pt[4]; + HBITMAP hbmOld; + + char *szString = "Hello, world!\0"; + + printf("x_push_kimage() called: Src: (%d,%d) Dest: (%d,%d) Width: %d Height: %d\n",srcx,srcy,destx,desty,width,height); + pt[0].x = destx; /* Target X1 */ + pt[0].y = desty+(MAX_STATUS_LINES*16); /* Target Y1 */ + pt[1].x = destx+width; /* Target X2 */ + pt[1].y = desty+height+(MAX_STATUS_LINES*16); /* Target Y2: Translate up, make room for status border */ + pt[2].x = srcx; /* Source X */ + pt[2].y = srcy; /* Source Y */ + pt[3].x = srcx+width; + pt[3].y = srcy+height; + + hbmOld = GpiSetBitmap(g_hps_memory, (HBITMAP)kimage_ptr->dev_handle); + GpiBitBlt(g_hps_screen,g_hps_memory,4L,pt,ROP_SRCCOPY, BBO_IGNORE); + GpiSetBitmap(g_hps_memory, hbmOld); + +} + +// OG Adding release +void x_release_kimage(Kimage* kimage_ptr) +{ + if (kimage_ptr->dev_handle == (void*)-1) + { + free(kimage_ptr->data_ptr); + kimage_ptr->data_ptr = NULL; + } + else + { + } } void @@ -423,25 +487,45 @@ x_full_screen(int do_full) return; } - -// OG Adding release -void x_release_kimage(Kimage* kimage_ptr) +int x_calc_ratio(float ratiox,float ratioy) { - if (kimage_ptr->dev_handle == (void*)-1) - { - free(kimage_ptr->data_ptr); - kimage_ptr->data_ptr = NULL; - } + return 0; // not stretched } -// OG Addding ratio -int x_calc_ratio(float x,float y) +/**************************************************************************/ +/* DispErrorMsg -- report an error returned from an API service. */ +/* */ +/* The error message is displayed using a message box */ +/* */ +/**************************************************************************/ +VOID DispErrorMessage() { - return 1; + PERRINFO pErrInfoBlk; + PSZ pszOffSet, pszErrMsg; + ERRORID ErrorId; + PCH ErrorStr; + + ErrorId = WinGetLastError(g_hab); + + if ((pErrInfoBlk = WinGetErrorInfo(g_hab)) != (PERRINFO)NULL) + { + pszOffSet = ((PSZ)pErrInfoBlk) + pErrInfoBlk->offaoffszMsg; + pszErrMsg = ((PSZ)pErrInfoBlk) + *((PULONG)pszOffSet); + + WinMessageBox(HWND_DESKTOP, /* Parent window is desk top */ + g_hwnd_frame, /* Owner window is our frame */ + pszErrMsg, /* PMWIN Error message */ + "Error", /* Title bar message */ + 0, /* Message identifier */ + MB_MOVEABLE | MB_CANCEL ); /* Flags */ + + WinFreeErrorInfo(pErrInfoBlk); + } } void os2_abort(HWND g_hwnd_frame, HWND g_hwnd_client) { exit(-1); -} \ No newline at end of file +} +