Annotation of uae/src/od-win32/win32gfx.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * UAE - The Un*x Amiga Emulator
                      3:  *
                      4:  * Win32 Drawing and DirectX interface
                      5:  *
                      6:  * Copyright 1997-1998 Mathias Ortmann
                      7:  * Copyright 1997-2000 Brian King
                      8:  */
                      9: 
                     10: #include "config.h"
                     11: #include "sysconfig.h"
                     12: 
                     13: #include <stdlib.h>
                     14: #include <stdarg.h>
                     15: 
                     16: #include <signal.h>
                     17: #include <io.h>
                     18: 
                     19: #include <windows.h>
                     20: #include <commctrl.h>
                     21: #include <stdio.h>
                     22: 
                     23: #include "sysdeps.h"
                     24: #include "options.h"
                     25: #include "gensound.h"
                     26: #include "uae.h"
                     27: #include "memory.h"
                     28: #include "custom.h"
                     29: #include "events.h"
                     30: #include "xwin.h"
                     31: #include "keyboard.h"
                     32: #include "drawing.h"
                     33: #include "picasso96.h"
                     34: #include "osdep/win32.h"
                     35: #include "osdep/win32gui.h"
                     36: #include "osdep/win32gfx.h"
                     37: #include "sounddep/sound.h"
                     38: 
                     39: /* Local globals */
                     40: static uae_u32 current_width, current_height, current_depth;
                     41: static int fullscreen = 0; /* fullscreen mode */
                     42: static int window_width = 900, window_height = 720, window_depth; /* target resolution */
                     43: static int usedirect = 0; /* direct to dx surface (fullscreen or overlay) */
                     44: static int overlay = 0; /* use overlay surface */
                     45: static int needs_direct; /* is overlay or fullscreen mode required */
                     46: static int display_change_requested = 0;
                     47: static int mapping_is_mainscreen = 0;
                     48: static BOOL bInitDone = FALSE; //?????JGI
                     49: 
                     50: int screen_is_picasso = 0;
                     51: 
                     52: static BOOL bJustClosedWithActiveMouse = FALSE;
                     53: 
                     54: int WIN32GFX_IsPicassoScreen( void )
                     55: {
                     56:     return screen_is_picasso;
                     57: }
                     58: 
                     59: void WIN32GFX_DisablePicasso( void )
                     60: {
                     61:     picasso_requested_on = 0;
                     62:     picasso_on = 0;
                     63: }
                     64: 
                     65: void WIN32GFX_EnablePicasso( void )
                     66: {
                     67:     picasso_requested_on = 1;
                     68: }
                     69: 
                     70: void WIN32GFX_DisplayChangeRequested( void )
                     71: {
                     72:     display_change_requested = 1;
                     73: }
                     74: 
                     75: int WIN32GFX_IsFullScreen( void )
                     76: {
                     77:     return fullscreen;
                     78: }
                     79: 
                     80: int WIN32GFX_GetWidth( void )
                     81: {
                     82:     return current_width;
                     83: }
                     84: 
                     85: int WIN32GFX_GetHeight( void )
                     86: {
                     87:     return current_height;
                     88: }
                     89: 
                     90: #ifdef _WIN32_WCE
                     91: int nr_joysticks = 1;
                     92: 
                     93: void init_joystick( void )
                     94: {
                     95: }
                     96: 
                     97: void read_joystick (int nr, unsigned int *dir, int *button)
                     98: {
                     99:     *dir = *button = 0;
                    100: 
                    101:     if( nr < nr_joysticks )
                    102:     {
                    103: 
                    104:     }
                    105: }
                    106: 
                    107: void close_joystick( void )
                    108: {
                    109: }
                    110: 
                    111: int check_prefs_changed_gfx (void)
                    112: {
                    113:     return 0;
                    114: }
                    115: 
                    116: int graphics_init( void )
                    117: {
                    118:     return 1;
                    119: }
                    120: 
                    121: int graphics_setup( void )
                    122: {
                    123:     return 1;
                    124: }
                    125: 
                    126: void graphics_leave( void )
                    127: {
                    128: }
                    129: 
                    130: void unlockscr( void )
                    131: {
                    132: }
                    133: 
                    134: int lockscr( void )
                    135: {
                    136:     return 0;
                    137: }
                    138: 
                    139: void flush_screen( int a, int b )
                    140: {
                    141: }
                    142: 
                    143: void flush_block( int a, int b )
                    144: {
                    145: }
                    146: 
                    147: void flush_line( int a )
                    148: {
                    149: }
                    150: 
                    151: void WIN32GFX_PaletteChange( void )
                    152: {
                    153: }
                    154: 
                    155: #else
                    156: #include "osdep/dxwrap.h"
                    157: 
                    158: #ifdef __GNUC__
                    159: int __cdecl _fcloseall( void );
                    160: #endif
                    161: 
                    162: /* Local Globals */
                    163: static UINT current_pixbytes;
                    164: static LPPALETTEENTRY current_palette = NULL;
                    165: 
                    166: static BOOL doInit (void);
                    167: static void close_windows (void);
                    168: 
                    169: uae_u32 default_freq = 0;
                    170: 
                    171: HWND hStatusWnd = NULL;
                    172: HINSTANCE hDDraw = NULL;
                    173: 
                    174: /* For the DX_Invalidate() and gfx_unlock_picasso() functions */
                    175: static int p96_double_buffer_first, p96_double_buffer_last, p96_double_buffer_needs_flushing = 0;
                    176: 
                    177: static char scrlinebuf[4096];  /* this is too large, but let's rather play on the safe side here */
                    178: 
                    179: static int rgbformat_bits (RGBFTYPE t)
                    180: {
                    181:     unsigned long f = 1 << t;
                    182:     return ((f & RGBMASK_8BIT) != 0 ? 8
                    183:            : (f & RGBMASK_15BIT) != 0 ? 15
                    184:            : (f & RGBMASK_16BIT) != 0 ? 16
                    185:            : (f & RGBMASK_24BIT) != 0 ? 24
                    186:            : (f & RGBMASK_32BIT) != 0 ? 32
                    187:            : 0);
                    188: }
                    189: 
                    190: static int set_ddraw (int width, int height, int wantfull, int wantoverlay, int bits, LPPALETTEENTRY pal)
                    191: {
                    192:     HRESULT ddrval;
                    193: 
                    194:     bits = (bits + 7) & ~7;
                    195:     
                    196:     ddrval = DirectDraw_SetCooperativeLevel( hAmigaWnd, wantfull );
                    197:     if (ddrval != DD_OK)
                    198:        goto oops;
                    199: 
                    200:     if (wantfull) 
                    201:     {
                    202:         write_log( "set_ddraw: Trying %dx%d, %d bits\n", width, height, bits );
                    203:         ddrval = DirectDraw_SetDisplayMode( width, height, bits, 0 );
                    204:         if (ddrval != DD_OK)
                    205:         {
                    206:             write_log( "set_ddraw: Couldn't SetDisplayMode()\n" );
                    207:            goto oops;
                    208:         }
                    209: 
                    210:        ddrval = DirectDraw_GetDisplayMode();
                    211:        if (ddrval != DD_OK)
                    212:         {
                    213:             write_log( "set_ddraw: Couldn't GetDisplayMode()\n" );
                    214:            goto oops;
                    215:         }
                    216:     }
                    217: 
                    218:     ddrval = DirectDraw_CreateClipper();
                    219:     if (ddrval != DD_OK)
                    220:     {
                    221:         write_log( "set_ddraw: No clipping support\n" );
                    222:         goto oops;
                    223:     }
                    224: 
                    225:     ddrval = DirectDraw_CreateSurface( width, height );
                    226:     if( ddrval != DD_OK )
                    227:     {
                    228:         write_log( "set_ddraw: Couldn't CreateSurface() for primary because %s.\n", DirectDraw_ErrorString( ddrval ) );
                    229:        goto oops;
                    230:     }
                    231: 
                    232:     DirectDraw_ClearSurfaces();
                    233: 
                    234:     if( !DirectDraw_DetermineLocking( wantfull ) )
                    235:     {
                    236:        write_log( "set_ddraw: Couldn't determine locking.\n" );
                    237:        goto oops;
                    238:     }
                    239: 
                    240:     ddrval = DirectDraw_SetClipper( hAmigaWnd );
                    241: 
                    242:     if (ddrval != DD_OK)
                    243:     {
                    244:         write_log( "set_ddraw: Couldn't SetHWnd()\n" );
                    245:            goto oops;
                    246:     }
                    247: 
                    248:     current_pixbytes = DirectDraw_GetBytesPerPixel();
                    249: 
                    250:     write_log( "set_ddraw() called, and is %dx%d@%d-bytes\n", width, height, current_pixbytes );
                    251: 
                    252:     if (current_pixbytes == 1) {
                    253:         current_palette = pal;
                    254:         ddrval = DirectDraw_CreatePalette( pal );
                    255:        if (ddrval != DD_OK)
                    256:         {
                    257:             write_log( "set_ddraw: Couldn't CreatePalette()\n" );
                    258:                goto oops;
                    259:         }
                    260:     }
                    261: 
                    262:     return 1;
                    263: 
                    264:   oops:
                    265:     if( wantfull )
                    266:         DirectDraw_SetCooperativeLevel( hAmigaWnd, 0 ); /* No full-screen, so that people can see our gui_message() */
                    267:     gui_message("set_ddraw(): DirectDraw initialization failed with %s/%d\n", DirectDraw_ErrorString( ddrval ), ddrval);
                    268:     return 0;
                    269: }
                    270: 
                    271: struct win32_displaymode *win32_displaymode_list;
                    272: 
                    273: HRESULT CALLBACK modesCallback( LPDDSURFACEDESC2 modeDesc, LPVOID context )
                    274: {
                    275:     struct win32_displaymode **dmpp;
                    276:     RGBFTYPE colortype;
                    277: 
                    278:     colortype = DirectDraw_GetSurfacePixelFormat( modeDesc );
                    279:     if (colortype == RGBFB_NONE || colortype == RGBFB_R8G8B8 || colortype == RGBFB_B8G8R8 )
                    280:        return DDENUMRET_OK;
                    281: 
                    282:     dmpp = &win32_displaymode_list;
                    283:     while (*dmpp != 0) {
                    284:        if ((*dmpp)->width == modeDesc->dwWidth
                    285:            && (*dmpp)->height == modeDesc->dwHeight
                    286:            && (*dmpp)->refreshrate == modeDesc->dwRefreshRate)
                    287:            break;
                    288:        dmpp = &(*dmpp)->next;
                    289:     }
                    290: 
                    291:     if (*dmpp == 0) {
                    292:        *dmpp = (struct win32_displaymode *)xmalloc (sizeof **dmpp);
                    293:        (*dmpp)->next = 0;
                    294:        (*dmpp)->width = modeDesc->dwWidth;
                    295:        (*dmpp)->height = modeDesc->dwHeight;
                    296:        (*dmpp)->refreshrate = modeDesc->dwRefreshRate;
                    297:        (*dmpp)->colormodes = 0;
                    298:     }
                    299:     (*dmpp)->colormodes |= 1 << colortype;
                    300:     return DDENUMRET_OK;
                    301: }
                    302: 
                    303: static void cleanup_modes( void )
                    304: {
                    305:     struct win32_displaymode *temp = NULL, *dmpp = win32_displaymode_list;
                    306: 
                    307:     while( dmpp )
                    308:     {
                    309:        temp = dmpp;
                    310:        dmpp = dmpp->next;
                    311:        free( temp );
                    312:     }
                    313: }
                    314: 
                    315: static int our_possible_depths[] = { 8, 15, 16, 24, 32 };
                    316: 
                    317: RGBFTYPE WIN32GFX_FigurePixelFormats( RGBFTYPE colortype )
                    318: {
                    319:     HRESULT ddrval;
                    320:     struct win32_displaymode *dm;
                    321:     int got_16bit_mode = 0;
                    322:     int window_created = 0;
                    323: 
                    324:     if( colortype == 0 ) /* Need to query a 16-bit display mode for its pixel-format.  Do this by opening such a screen */
                    325:     {
                    326:         hAmigaWnd = CreateWindowEx (WS_EX_TOPMOST,
                    327:                               "AmigaPowah", VersionStr,
                    328:                               WS_VISIBLE | WS_POPUP,
                    329:                               CW_USEDEFAULT, CW_USEDEFAULT,
                    330:                               1,//GetSystemMetrics (SM_CXSCREEN),
                    331:                               1,//GetSystemMetrics (SM_CYSCREEN),
                    332:                               0, NULL, 0, NULL);
                    333:         if( hAmigaWnd )
                    334:         {
                    335:             window_created = 1;
                    336:             ddrval = DirectDraw_SetCooperativeLevel( hAmigaWnd, TRUE ); /* TRUE indicates full-screen */
                    337:             if( ddrval != DD_OK )
                    338:             {
                    339:                write_log( "WIN32GFX_FigurePixelFormats: ERROR -  %s\n", DirectDraw_ErrorString(ddrval) );
                    340:                gui_message( "WIN32GFX_FigurePixelFormats: ERROR - %s\n", DirectDraw_ErrorString(ddrval) );
                    341:                goto out;
                    342:             }
                    343:         }
                    344:         else
                    345:         {
                    346:            write_log( "WIN32GFX_FigurePixelFormats: ERROR - test-window could not be created.\n" );
                    347:             gui_message( "WIN32GFX_FigurePixelFormats: ERROR - test-window could not be created.\n" );
                    348:         }
                    349:     }
                    350:     else
                    351:     {
                    352:         got_16bit_mode = 1;
                    353:     }
                    354: 
                    355:     for (dm = win32_displaymode_list; dm != 0; dm = dm->next) 
                    356:     {
                    357:         if (!got_16bit_mode)
                    358:         {
                    359:            write_log ("figure_pixel_formats: Attempting %dx%d: ", dm->width, dm->height);
                    360: 
                    361:             ddrval = DirectDraw_SetDisplayMode( dm->width, dm->height, 16, 0 ); /* 0 for default freq */
                    362:            if (ddrval != DD_OK)
                    363:                continue;
                    364: 
                    365:            ddrval = DirectDraw_GetDisplayMode();
                    366:            if (ddrval != DD_OK)
                    367:                continue;
                    368: 
                    369:            colortype = DirectDraw_GetPixelFormat();
                    370:            if (colortype != RGBFB_NONE) 
                    371:             {
                    372:                 write_log ("%d ", our_possible_depths[2]);
                    373:             
                    374:                 /* Clear the 16-bit information, and get the real stuff! */
                    375:                 dm->colormodes &= ~(RGBFF_R5G6B5PC|RGBFF_R5G5B5PC|RGBFF_R5G6B5|RGBFF_R5G5B5|RGBFF_B5G6R5PC|RGBFF_B5G5R5PC);
                    376:                 dm->colormodes |= 1 << colortype;
                    377:                 got_16bit_mode = 1;
                    378:                 write_log( "Got real 16-bit colour-depth information: 0x%x\n", colortype );
                    379:             }
                    380:         }
                    381:         else if (dm->colormodes & (RGBFF_R5G6B5PC|RGBFF_R5G5B5PC|RGBFF_R5G6B5|RGBFF_R5G5B5|RGBFF_B5G6R5PC|RGBFF_B5G5R5PC) ) 
                    382:         {
                    383:             /* Clear the 16-bit information, and set the real stuff! */
                    384:             dm->colormodes &= ~(RGBFF_R5G6B5PC|RGBFF_R5G5B5PC|RGBFF_R5G6B5|RGBFF_R5G5B5|RGBFF_B5G6R5PC|RGBFF_B5G5R5PC);
                    385:             dm->colormodes |= 1 << colortype;
                    386:         }
                    387:     }
                    388:     out:
                    389:     if( window_created )
                    390:     {
                    391:         Sleep( 2000 );
                    392:         DestroyWindow( hAmigaWnd );
                    393:        hAmigaWnd = NULL;
                    394:     }
                    395:     return colortype;
                    396: }
                    397: 
                    398: /* DirectX will fail with "Mode not supported" if we try to switch to a full
                    399:  * screen mode that doesn't match one of the dimensions we got during enumeration.
                    400:  * So try to find a best match for the given resolution in our list.  */
                    401: int WIN32GFX_AdjustScreenmode( uae_u32 *pwidth, uae_u32 *pheight, uae_u32 *ppixbits )
                    402: {
                    403:     struct win32_displaymode *best;
                    404:     uae_u32 selected_mask = (*ppixbits == 8 ? RGBMASK_8BIT
                    405:                             : *ppixbits == 15 ? RGBMASK_15BIT
                    406:                             : *ppixbits == 16 ? RGBMASK_16BIT
                    407:                             : *ppixbits == 24 ? RGBMASK_24BIT
                    408:                             : RGBMASK_32BIT);
                    409:     int pass, i = 0, index = 0;
                    410:     
                    411:     for (pass = 0; pass < 2; pass++) 
                    412:     {
                    413:            struct win32_displaymode *dm;
                    414:            uae_u32 mask = (pass == 0
                    415:                            ? selected_mask
                    416:                            : RGBMASK_8BIT | RGBMASK_15BIT | RGBMASK_16BIT | RGBMASK_24BIT | RGBMASK_32BIT); /* %%% - BERND, were you missing 15-bit here??? */
                    417:         i = 0;
                    418:         index = 0;
                    419: 
                    420:            best = win32_displaymode_list;
                    421:            dm = best->next;
                    422: 
                    423:            while (dm != 0) 
                    424:         {
                    425:                if ((dm->colormodes & mask) != 0) 
                    426:             {
                    427:                        if (dm->width <= best->width && dm->height <= best->height
                    428:                            && dm->width >= *pwidth && dm->height >= *pheight)
                    429:                 {
                    430:                            best = dm;
                    431:                     index = i;
                    432:                 }
                    433:                        if (dm->width >= best->width && dm->height >= best->height
                    434:                            && dm->width <= *pwidth && dm->height <= *pheight)
                    435:                 {
                    436:                            best = dm;
                    437:                     index = i;
                    438:                 }
                    439:                }
                    440:                dm = dm->next;
                    441:             i++;
                    442:            }
                    443:            if (best->width == *pwidth && best->height == *pheight)
                    444:         {
                    445:             selected_mask = mask; /* %%% - BERND, I added this - does it make sense?  Otherwise, I'd specify a 16-bit display-mode for my
                    446:                                            Workbench (using -H 2, but SHOULD have been -H 1), and end up with an 8-bit mode instead*/
                    447:                break;
                    448:         }
                    449:     }
                    450:     *pwidth = best->width;
                    451:     *pheight = best->height;
                    452:     if( best->colormodes & selected_mask )
                    453:        return index;
                    454: 
                    455:     /* Ordering here is done such that 16-bit is preferred, followed by 15-bit, 8-bit, 32-bit and 24-bit */
                    456:     if (best->colormodes & RGBMASK_16BIT)
                    457:        *ppixbits = 16;
                    458:     else if (best->colormodes & RGBMASK_15BIT) /* %%% - BERND, this possibility was missing? */
                    459:     *ppixbits = 15;
                    460:     else if (best->colormodes & RGBMASK_8BIT)
                    461:        *ppixbits = 8;
                    462:     else if (best->colormodes & RGBMASK_32BIT)
                    463:        *ppixbits = 32;
                    464:     else if (best->colormodes & RGBMASK_24BIT)
                    465:        *ppixbits = 24;
                    466:     else
                    467:         index = -1;
                    468: 
                    469:     return index;
                    470: }
                    471: 
                    472: void flush_line( int lineno )
                    473: {
                    474: 
                    475: }
                    476: 
                    477: void flush_block (int a, int b)
                    478: {
                    479: 
                    480: }
                    481: 
                    482: void flush_screen (int a, int b)
                    483: {
                    484:     if( DirectDraw_GetLockableType() == secondary_surface )
                    485:     {
                    486:        if( fullscreen )
                    487:        {
                    488:            if( DX_Flip() == 0 )
                    489:            {
                    490:                DX_Blit( 0, a, 0, a, current_width, b - a + 1, BLIT_SRC );
                    491:            }
                    492:        }
                    493:        else
                    494:        {
                    495:            DX_Blit( 0, a, 0, a, current_width, b - a + 1, BLIT_SRC );
                    496:        }
                    497:     }
                    498: }
                    499: 
                    500: static uae_u8 *dolock (void)
                    501: {
                    502:     char *surface = NULL, *oldsurface;
                    503: 
                    504:     if( !DirectDraw_SurfaceLock( lockable_surface ) )
                    505:        return 0;
                    506: 
                    507:     surface = DirectDraw_GetSurfacePointer();
                    508:     oldsurface = gfxvidinfo.bufmem;
                    509:     gfxvidinfo.bufmem = surface;
                    510:     if (surface != oldsurface && ! screen_is_picasso) 
                    511:     {
                    512:        write_log ("Need to init_row_map\n");
                    513:        init_row_map ();
                    514:     }
                    515: 
                    516:     clear_inhibit_frame (IHF_WINDOWHIDDEN);
                    517:     return surface;
                    518: }
                    519: 
                    520: int lockscr( void )
                    521: {
                    522:     return dolock() != 0;
                    523: }
                    524: 
                    525: uae_u8 *gfx_lock_picasso (void)
                    526: {
                    527:     return dolock ();
                    528: }
                    529: 
                    530: void gfx_unlock_picasso (void)
                    531: {
                    532:     DirectDraw_SurfaceUnlock();
                    533:     if( p96_double_buffer_needs_flushing )
                    534:     {
                    535:        /* Here, our flush_block() will deal with a offscreen-plain (back-buffer) to visible-surface (front-buffer) */
                    536:         if( DirectDraw_GetLockableType() == secondary_surface )
                    537:        {
                    538:            BOOL relock = FALSE;
                    539:            if( DirectDraw_IsLocked() )
                    540:            {
                    541:                relock = TRUE;
                    542:                unlockscr();
                    543:            }
                    544:            DX_Blit( 0, p96_double_buffer_first, 
                    545:                     0, p96_double_buffer_first, 
                    546:                     current_width, p96_double_buffer_last - p96_double_buffer_first + 1, 
                    547:                     BLIT_SRC );
                    548:            if( relock )
                    549:            {
                    550:                lockscr();
                    551:            }
                    552:        }
                    553:         p96_double_buffer_needs_flushing = 0;
                    554:     }
                    555: }
                    556: 
                    557: static void close_hwnds( void )
                    558: {
                    559:     if (hStatusWnd)
                    560:     {
                    561:         ShowWindow( hStatusWnd, SW_HIDE );
                    562:        DestroyWindow (hStatusWnd);
                    563:     }
                    564:     if (hAmigaWnd)
                    565:     {
                    566:         ShowWindow( hAmigaWnd, SW_HIDE );
                    567:        DestroyWindow (hAmigaWnd);
                    568:     }
                    569:     if (hMainWnd)
                    570:     {
                    571:         ShowWindow( hMainWnd, SW_HIDE );
                    572:        DestroyWindow (hMainWnd);
                    573:     }
                    574: 
                    575:     hMainWnd = 0;
                    576:     hStatusWnd = 0;
                    577:     hAmigaWnd = 0;
                    578: }
                    579: 
                    580: static int open_windows (void)
                    581: {
                    582:     static BOOL bFirstTime = TRUE;
                    583:     char tmpstr[300];
                    584: 
                    585:     char *fs_warning = 0;
                    586:     RGBFTYPE colortype;
                    587: 
                    588:     current_pixbytes = 0;
                    589: 
                    590:     in_sizemove = 0;
                    591:     fixup_prefs_dimensions (&currprefs);
                    592: 
                    593:     if( !DirectDraw_Start() )
                    594:        return 0;
                    595:     if( DirectDraw_GetDisplayMode() != DD_OK )
                    596:        return 0;
                    597:     colortype = DirectDraw_GetPixelFormat();
                    598:     write_log ("Ct: %08lx, picasso_vidinfo.selected_rgbformat %08lx\n", (unsigned long)colortype,
                    599:            picasso_vidinfo.selected_rgbformat);
                    600: 
                    601:     if (screen_is_picasso) {
                    602:        fullscreen = currprefs.gfx_pfullscreen;
                    603:        window_width = current_width = picasso_vidinfo.width;
                    604:        window_height = current_height = picasso_vidinfo.height;
                    605:        window_depth = current_depth = rgbformat_bits (picasso_vidinfo.selected_rgbformat);
                    606:     } else {
                    607:        fullscreen = currprefs.gfx_afullscreen;
                    608:        window_width = current_width = currprefs.gfx_width;
                    609:        window_height = current_height = currprefs.gfx_height;
                    610:        window_depth = current_depth = (currprefs.color_mode == 0 ? 8
                    611:                         : currprefs.color_mode == 1 ? 15
                    612:                         : currprefs.color_mode == 2 ? 16
                    613:                         : currprefs.color_mode == 3 ? 8
                    614:                         : currprefs.color_mode == 4 ? 8 : 32);
                    615:     }
                    616: 
                    617:     //If screen depth is equal to the desired window_depth then no overlay is needed.
                    618:     if( DirectDraw_GetSurfaceBitCount() == window_depth )
                    619:         overlay = 0;
                    620: 
                    621:     if (overlay) {
                    622:        needs_direct = 1;
                    623:     } else {
                    624:        needs_direct = 0;
                    625:     }
                    626: 
                    627:     if (colortype == RGBFB_NONE && !overlay) {
                    628:        needs_direct = 1;
                    629:        fs_warning = "the desktop is running in an unknown color mode.";
                    630:     } else if (colortype == RGBFB_CLUT && !overlay) {
                    631:        needs_direct = 1;
                    632:        fs_warning = "the desktop is running in 8 bit color depth, which UAE can't use in windowed mode.";
                    633:     } else if ( !fullscreen && ( current_width >= DirectDraw_CurrentWidth() || current_height >= DirectDraw_CurrentHeight() ) ) {
                    634:        needs_direct = 1;
                    635:        fs_warning = "the desktop is too small for the specified window size.";
                    636:        overlay = 0; // we're going to go full-screen
                    637:     } else if (screen_is_picasso && !fullscreen &&
                    638:              ( picasso_vidinfo.selected_rgbformat != RGBFB_CHUNKY ) &&
                    639:              ( picasso_vidinfo.selected_rgbformat != colortype ) &&
                    640:                overlay )
                    641:     {
                    642:        needs_direct = 1;
                    643:        fs_warning = "you selected a Picasso display with a color depth different from that of the desktop and an overlay was unavailable.";
                    644:        if( !doInit() )
                    645:        {
                    646:            overlay = 0; // we're going to go full-screen
                    647:            // doInit in windowed-mode modifies the width/height params, so 
                    648:            // restore our mucked-up width and height values for full-screen.
                    649:            window_width = current_width = picasso_vidinfo.width;
                    650:            window_height = current_height = picasso_vidinfo.height;
                    651:        }
                    652:        DirectDraw_Release();
                    653:        close_hwnds();
                    654:        if( !DirectDraw_Start() )
                    655:            return 0;
                    656:     }
                    657: 
                    658:     if( needs_direct && ! usedirect ) 
                    659:        usedirect = needs_direct;
                    660: 
                    661:     if( fs_warning && !overlay )
                    662:     {
                    663:        // Temporarily drop the DirectDraw stuff
                    664:        DirectDraw_Release();
                    665:        sprintf (tmpstr, "The selected screen mode can't be displayed in a window, because %s\n"
                    666:                 "Switching to full-screen display.", fs_warning);
                    667:        MessageBox (0, tmpstr, "WinUAE", MB_ICONEXCLAMATION | MB_OK);
                    668:        DirectDraw_Start();
                    669:        fullscreen = 1;
                    670:     }
                    671:     
                    672:     if (! usedirect)
                    673:        window_depth = rgbformat_bits (colortype);
                    674: 
                    675:     if( current_depth == 24 )
                    676:     {
                    677:        if( screen_is_picasso )
                    678:            fs_warning = "you've selected a Picasso display with a 24-bit depth, which WinUAE no longer supports.";
                    679:        else
                    680:            fs_warning = "the desktop is running in 24-bit color depth, which WinUAE no longer supports.";
                    681:        /* Temporarily drop the DirectDraw stuff.  This is necessary, otherwise
                    682:         * WinNT will just return 1 for the message box without ever displaying 
                    683:         * it on the screen.  */
                    684:        DirectDraw_Release();
                    685:        sprintf (tmpstr, "WinUAE cannot run because %s", fs_warning);
                    686:        MessageBox (0, tmpstr, "WinUAE", MB_ICONEXCLAMATION | MB_OK);
                    687:        return 0;
                    688:     }
                    689:     
                    690:     if (! doInit ())
                    691:        return 0;
                    692: 
                    693:     if(!WIN32GFX_IsFullScreen() && ( bFirstTime || bJustClosedWithActiveMouse ) )
                    694:     {
                    695:        bFirstTime = FALSE;
                    696:        bJustClosedWithActiveMouse = FALSE;
                    697:        setmouseactive (1);
                    698:     }
                    699: 
                    700:     return 1;
                    701: }
                    702: 
                    703: int check_prefs_changed_gfx (void)
                    704: {
                    705:     if (display_change_requested || 
                    706:         ( currprefs.gfx_afullscreen != changed_prefs.gfx_afullscreen ) ||
                    707:         ( currprefs.gfx_pfullscreen != changed_prefs.gfx_pfullscreen ) )
                    708:     {
                    709:        display_change_requested = 0;
                    710:         currprefs.gfx_afullscreen = changed_prefs.gfx_afullscreen;
                    711:         currprefs.gfx_pfullscreen = changed_prefs.gfx_pfullscreen;
                    712:         close_windows ();
                    713:        open_windows ();
                    714:        return 1;
                    715:     }
                    716:     return 0;
                    717: }
                    718: 
                    719: /* Color management */
                    720: 
                    721: static xcolnr xcol8[4096];
                    722: static PALETTEENTRY colors256[256];
                    723: static int ncols256 = 0;
                    724: 
                    725: static int red_bits, green_bits, blue_bits;
                    726: static int red_shift, green_shift, blue_shift;
                    727: 
                    728: static int get_color (int r, int g, int b, xcolnr * cnp)
                    729: {
                    730:     if (ncols256 == 256)
                    731:        return 0;
                    732:     colors256[ncols256].peRed = r * 0x11;
                    733:     colors256[ncols256].peGreen = g * 0x11;
                    734:     colors256[ncols256].peBlue = b * 0x11;
                    735:     colors256[ncols256].peFlags = 0;
                    736:     *cnp = ncols256;
                    737:     ncols256++;
                    738:     return 1;
                    739: }
                    740: 
                    741: static void init_colors (void)
                    742: {
                    743:     int i;
                    744:     HRESULT ddrval;
                    745: 
                    746:     if (ncols256 == 0) {
                    747:        alloc_colors256 (get_color);
                    748:        memcpy (xcol8, xcolors, sizeof xcol8);
                    749:     }
                    750: 
                    751:     /* init colors */
                    752: 
                    753:     switch( current_pixbytes )
                    754:     {
                    755:         case 1:
                    756:            memcpy (xcolors, xcol8, sizeof xcolors);
                    757:            ddrval = DirectDraw_SetPaletteEntries( 0, 256, colors256 );
                    758:            if (ddrval != DD_OK)
                    759:                gui_message ("DX_SetPalette() failed with %s/%d\n", DirectDraw_ErrorString (ddrval), ddrval);
                    760:        break;
                    761: 
                    762:         case 2:
                    763:         case 3:
                    764:         case 4:
                    765:            red_bits = bits_in_mask( DirectDraw_GetPixelFormatBitMask( red_mask ) );
                    766:            green_bits = bits_in_mask( DirectDraw_GetPixelFormatBitMask( green_mask ) );
                    767:            blue_bits = bits_in_mask( DirectDraw_GetPixelFormatBitMask( blue_mask ) );
                    768:            red_shift = mask_shift( DirectDraw_GetPixelFormatBitMask( red_mask ) );
                    769:            green_shift = mask_shift( DirectDraw_GetPixelFormatBitMask( green_mask ) );
                    770:            blue_shift = mask_shift( DirectDraw_GetPixelFormatBitMask( blue_mask ) );
                    771: 
                    772:            alloc_colors64k (red_bits, green_bits, blue_bits, red_shift,
                    773:                             green_shift, blue_shift);
                    774:        break;
                    775:     }
                    776:     switch (gfxvidinfo.pixbytes) 
                    777:     {
                    778:      case 2:
                    779:        for (i = 0; i < 4096; i++)
                    780:            xcolors[i] = xcolors[i] * 0x00010001;
                    781:        gfxvidinfo.can_double = 1;
                    782:        break;
                    783:      case 1:
                    784:        for (i = 0; i < 4096; i++)
                    785:            xcolors[i] = xcolors[i] * 0x01010101;
                    786:        gfxvidinfo.can_double = 1;
                    787:        break;
                    788:      default:
                    789:        gfxvidinfo.can_double = 0;
                    790:        break;
                    791:     }
                    792: }
                    793: 
                    794: int DX_FillResolutions (uae_u16 * ppixel_format)
                    795: {
                    796:     struct win32_displaymode *dm;
                    797:     int count = 0;
                    798: 
                    799:     *ppixel_format = 0;
                    800:     for (dm = win32_displaymode_list; dm != 0; dm = dm->next) {
                    801:        *ppixel_format |= dm->colormodes;
                    802:        if (dm->colormodes & RGBMASK_8BIT) {
                    803:            DisplayModes[count].res.width = dm->width;
                    804:            DisplayModes[count].res.height = dm->height;
                    805:            DisplayModes[count].refresh = default_freq;
                    806:            DisplayModes[count].depth = 1;
                    807:            count++;
                    808:        }
                    809:        if (count >= MAX_PICASSO_MODES)
                    810:            break;
                    811:        if (dm->colormodes & (RGBMASK_16BIT | RGBMASK_15BIT)) {
                    812:            DisplayModes[count].res.width = dm->width;
                    813:            DisplayModes[count].res.height = dm->height;
                    814:            DisplayModes[count].refresh = default_freq;
                    815:            DisplayModes[count].depth = 2;
                    816:            count++;
                    817:        }
                    818:        if (count >= MAX_PICASSO_MODES)
                    819:            break;
                    820:        if (dm->colormodes & RGBMASK_24BIT) {
                    821:            DisplayModes[count].res.width = dm->width;
                    822:            DisplayModes[count].res.height = dm->height;
                    823:            DisplayModes[count].refresh = default_freq;
                    824:            DisplayModes[count].depth = 3;
                    825:            count++;
                    826:        }
                    827:        if (count >= MAX_PICASSO_MODES)
                    828:            break;
                    829:        if (dm->colormodes & RGBMASK_32BIT) {
                    830:            DisplayModes[count].res.width = dm->width;
                    831:            DisplayModes[count].res.height = dm->height;
                    832:            DisplayModes[count].refresh = default_freq;
                    833:            DisplayModes[count].depth = 4;
                    834:            count++;
                    835:        }
                    836:        if (count >= MAX_PICASSO_MODES)
                    837:            break;
                    838:     }
                    839:     return count;
                    840: }
                    841: 
                    842: void DX_SetPalette (int start, int count)
                    843: {
                    844:     HRESULT ddrval;
                    845: 
                    846:     if( !screen_is_picasso )
                    847:         return;
                    848: 
                    849:     if( picasso96_state.RGBFormat != RGBFB_CHUNKY )
                    850:     {
                    851:         /* notice_screen_contents_lost(); */
                    852:         return;
                    853:     }
                    854: 
                    855:     if (picasso_vidinfo.pixbytes != 1) 
                    856:     {
                    857:        /* write_log ("DX Setpalette emulation\n"); */
                    858:        /* This is the case when we're emulating a 256 color display.  */
                    859:        while (count-- > 0) 
                    860:         {
                    861:            int r = picasso96_state.CLUT[start].Red;
                    862:            int g = picasso96_state.CLUT[start].Green;
                    863:            int b = picasso96_state.CLUT[start].Blue;
                    864:            picasso_vidinfo.clut[start++] = (doMask256 (r, red_bits, red_shift)
                    865:                | doMask256 (g, green_bits, green_shift)
                    866:                | doMask256 (b, blue_bits, blue_shift));
                    867:        }
                    868:        notice_screen_contents_lost();
                    869:        return;
                    870:     }
                    871: 
                    872:     /* Set our DirectX palette here */
                    873:     if( current_pixbytes == 1 )
                    874:     {
                    875:            ddrval = DirectDraw_SetPaletteEntries( start, count, (LPPALETTEENTRY)&(picasso96_state.CLUT[start] ) );
                    876:            if (ddrval != DD_OK)
                    877:                gui_message("DX_SetPalette() failed with %s/%d\n", DirectDraw_ErrorString (ddrval), ddrval);
                    878:     }
                    879:     else
                    880:     {
                    881:            write_log ("ERROR - DX_SetPalette() pixbytes %d\n", current_pixbytes );
                    882:     }
                    883: }
                    884: 
                    885: void DX_Invalidate (int first, int last)
                    886: {
                    887:     p96_double_buffer_first = first;
                    888:     if( (unsigned)last >= picasso_vidinfo.height )
                    889:        last = picasso_vidinfo.height - 1;
                    890:     p96_double_buffer_last  = last;
                    891:     p96_double_buffer_needs_flushing = 1;
                    892: }
                    893: 
                    894: int DX_BitsPerCannon (void)
                    895: {
                    896:     return 8;
                    897: }
                    898: 
                    899: static COLORREF BuildColorRef( int color, RGBFTYPE pixelformat )
                    900: {
                    901:     COLORREF result;
                    902: 
                    903:     /* Do special case first */
                    904:     if( pixelformat == RGBFB_CHUNKY )
                    905:         result = color;
                    906:     else
                    907:         result = do_get_mem_long( &color );
                    908:     return result;
                    909: #if 0
                    910:     int r,g,b;
                    911:     write_log( "DX_Blit() called to fill with color of 0x%x, rgbtype of 0x%x\n", color, pixelformat );
                    912: 
                    913:     switch( pixelformat )
                    914:     {
                    915:         case RGBFB_R5G6B5PC:
                    916:             r = color & 0xF800 >> 11;
                    917:             g = color & 0x07E0 >> 5;
                    918:             b = color & 0x001F;
                    919:         break;
                    920:         case RGBFB_R5G5B5PC:
                    921:             r = color & 0x7C00 >> 10;
                    922:             g = color & 0x03E0 >> 5;
                    923:             b = color & 0x001F;
                    924:         break;
                    925:         case RGBFB_B5G6R5PC:
                    926:             r = color & 0x001F;
                    927:             g = color & 0x07E0 >> 5;
                    928:             b = color & 0xF800 >> 11;
                    929:         break;
                    930:         case RGBFB_B5G5R5PC:
                    931:             r = color & 0x001F;
                    932:             g = color & 0x03E0 >> 5;
                    933:             b = color & 0x7C00 >> 10;
                    934:         break;
                    935:         case RGBFB_B8G8R8:
                    936:             r = color & 0x00FF0000 >> 16;
                    937:             g = color & 0x0000FF00 >> 8;
                    938:             b = color & 0x000000FF;
                    939:         break;
                    940:         case RGBFB_A8B8G8R8:
                    941:             r = color & 0xFF000000 >> 24;
                    942:             g = color & 0x00FF0000 >> 16;
                    943:             b = color & 0x0000FF00 >> 8;
                    944:         break;
                    945:         case RGBFB_R8G8B8:
                    946:             r = color & 0x000000FF;
                    947:             g = color & 0x0000FF00 >> 8;
                    948:             b = color & 0x00FF0000 >> 16;
                    949:         break;
                    950:         case RGBFB_A8R8G8B8:
                    951:             r = color & 0x0000FF00 >> 8;
                    952:             g = color & 0x00FF0000 >> 16;
                    953:             b = color & 0xFF000000 >> 24;
                    954:         break;
                    955:         default:
                    956:             write_log( "Uknown 0x%x pixel-format\n", pixelformat );
                    957:         break;
                    958:     }
                    959:     result = RGB(r,g,b);
                    960:     write_log( "R = 0x%02x, G = 0x%02x, B = 0x%02x - result = 0x%08x\n", r, g, b, result );
                    961:     return result;
                    962: #endif
                    963: }
                    964: 
                    965: /* This is a general purpose DirectDrawSurface filling routine.  It can fill within primary surface.
                    966:  * Definitions:
                    967:  * - primary is the displayed (visible) surface in VRAM, which may have an associated offscreen surface (or back-buffer)
                    968:  */
                    969: int DX_Fill( int dstx, int dsty, int width, int height, uae_u32 color, RGBFTYPE rgbtype )
                    970: {
                    971:     int result = 0;
                    972:     RECT dstrect;
                    973:     RECT srcrect;
                    974:     DDBLTFX ddbltfx;
                    975:     memset( &ddbltfx, 0, sizeof( ddbltfx ) );
                    976:     ddbltfx.dwFillColor = BuildColorRef( color, rgbtype );
                    977:     ddbltfx.dwSize = sizeof( ddbltfx );
                    978: 
                    979:     /* Set up our source rectangle.  This NEVER needs to be adjusted for windowed display, since the
                    980:      * source is ALWAYS in an offscreen buffer, or we're in full-screen mode. */
                    981:     SetRect( &srcrect, dstx, dsty, dstx+width, dsty+height );
                    982: 
                    983:     /* Set up our destination rectangle, and adjust for blit to windowed display (if necessary ) */
                    984:     SetRect( &dstrect, dstx, dsty, dstx+width, dsty+height );
                    985:     if( !fullscreen && !overlay )
                    986:        OffsetRect( &dstrect, amigawin_rect.left, amigawin_rect.top );
                    987: 
                    988:     /* Render our fill to the visible (primary) surface */
                    989:     if( ( result = DirectDraw_Blt( primary_surface, &dstrect, invalid_surface, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddbltfx ) ) )
                    990:     {
                    991:        if( DirectDraw_GetLockableType() == secondary_surface )
                    992:        {
                    993:            /* We've colour-filled the visible, but still need to colour-fill the offscreen */
                    994:            result = DirectDraw_Blt( secondary_surface, &srcrect, invalid_surface, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddbltfx );
                    995:        }
                    996:     }
                    997:     return result;
                    998: }
                    999: 
                   1000: /* This is a general purpose DirectDrawSurface blitting routine.  It can blit within primary surface
                   1001:  * Definitions:
                   1002:  * - primary is the displayed (visible) surface in VRAM, which may have an associated offscreen surface (or back-buffer)
                   1003:  */
                   1004: 
                   1005: DDBLTFX fx = { sizeof( DDBLTFX ) };
                   1006: 
                   1007: DWORD BLIT_OPCODE_TRANSLATION[ BLIT_LAST ] =
                   1008: {
                   1009:     BLACKNESS,  /* BLIT_FALSE */
                   1010:     NOTSRCERASE,/* BLIT_NOR */
                   1011:     -1,         /* BLIT_ONLYDST NOT SUPPORTED */
                   1012:     NOTSRCCOPY, /* BLIT_NOTSRC */
                   1013:     SRCERASE,   /* BLIT_ONLYSRC */
                   1014:     DSTINVERT,  /* BLIT_NOTDST */
                   1015:     SRCINVERT,  /* BLIT_EOR */
                   1016:     -1,         /* BLIT_NAND NOT SUPPORTED */
                   1017:     SRCAND,     /* BLIT_AND */
                   1018:     -1,         /* BLIT_NEOR NOT SUPPORTED */
                   1019:     -1,         /* NO-OP */
                   1020:     MERGEPAINT, /* BLIT_NOTONLYSRC */
                   1021:     SRCCOPY,    /* BLIT_SRC */
                   1022:     -1,         /* BLIT_NOTONLYDST NOT SUPPORTED */
                   1023:     SRCPAINT,   /* BLIT_OR */
                   1024:     WHITENESS   /* BLIT_TRUE */
                   1025: };
                   1026: 
                   1027: // This function is only called for full-screen Amiga screen-modes, and simply flips
                   1028: // the front and back buffers.  Additionally, because the emulation is not always drawing
                   1029: // complete frames, we also need to update the back-buffer with the new contents we just
                   1030: // flipped to.  Thus, after our flip, we blit.
                   1031: int DX_Flip( void )
                   1032: {
                   1033:     int result = 0;
                   1034: 
                   1035:     result = DirectDraw_Flip();
                   1036:     if( result )
                   1037:     {
                   1038:        result = DirectDraw_BltFast( secondary_surface, 0, 0, primary_surface, NULL );
                   1039:     }
                   1040:     return result;
                   1041: }
                   1042: 
                   1043: int DX_Blit( int srcx, int srcy, int dstx, int dsty, int width, int height, BLIT_OPCODE opcode )
                   1044: {
                   1045:     int result = 0;
                   1046:     RECT dstrect;
                   1047:     RECT srcrect;
                   1048:     DWORD dwROP = BLIT_OPCODE_TRANSLATION[ opcode ];
                   1049: 
                   1050:     /* Set up our source rectangle.  This NEVER needs to be adjusted for windowed display, since the
                   1051:      * source is ALWAYS in an offscreen buffer, or we're in full-screen mode. */
                   1052:     SetRect( &srcrect, srcx, srcy, srcx+width, srcy+height );
                   1053: 
                   1054:     /* Set up our destination rectangle, and adjust for blit to windowed display (if necessary ) */
                   1055:     SetRect( &dstrect, dstx, dsty, dstx+width, dsty+height );
                   1056:     
                   1057:     if( !fullscreen && !overlay )
                   1058:         OffsetRect( &dstrect, amigawin_rect.left, amigawin_rect.top );
                   1059: 
                   1060:     if( dwROP == -1 )
                   1061:     {
                   1062:        /* Unsupported blit opcode! */
                   1063:        return 0;
                   1064:     }
                   1065:     else
                   1066:     {
                   1067:        fx.dwROP = dwROP;
                   1068:     }
                   1069: 
                   1070:     /* Render our blit within the primary surface */
                   1071:     result = DirectDraw_Blt( primary_surface, &dstrect, DirectDraw_GetLockableType(), &srcrect, DDBLT_WAIT | DDBLT_ROP, &fx );
                   1072: 
                   1073:     if( !result )
                   1074:     {
                   1075:        BLIT_OPCODE_TRANSLATION[ opcode ] = -1;
                   1076:     }
                   1077:     else if( DirectDraw_GetLockableType() == secondary_surface )
                   1078:     {
                   1079:        /* We've just blitted from the offscreen to the visible, but still need to blit from offscreen to offscreen
                   1080:         * NOTE: reset our destination rectangle again if its been modified above... */
                   1081:        if( ( srcx != dstx ) || ( srcy != dsty ) )
                   1082:        {
                   1083:            if( !fullscreen )
                   1084:                SetRect( &dstrect, dstx, dsty, dstx+width, dsty+height );
                   1085:             result = DirectDraw_Blt( secondary_surface, &dstrect, secondary_surface, &srcrect, DDBLT_WAIT | DDBLT_ROP, &fx );
                   1086:        }
                   1087:     }
                   1088: 
                   1089:     return result;
                   1090: }
                   1091: 
                   1092: void DX_WaitVerticalSync( void )
                   1093: {
                   1094:     DirectDraw_WaitForVerticalBlank( DDWAITVB_BLOCKBEGIN );
                   1095: }
                   1096: 
                   1097: uae_u32 DX_ShowCursor( uae_u32 activate )
                   1098: {
                   1099:     uae_u32 result = 0;
                   1100:     if( ShowCursor( activate ) > 0 )
                   1101:        result = 1;
                   1102:     return result;
                   1103: }
                   1104: 
                   1105: uae_u32 DX_MoveCursor( uae_u32 x, uae_u32 y )
                   1106: {
                   1107:     uae_u32 result = 0;
                   1108: 
                   1109:     // We may need to adjust the x,y values for our window-offset
                   1110:     if( !fullscreen )
                   1111:     {
                   1112:        RECT rect;
                   1113:        if( GetWindowRect( hAmigaWnd, &rect ) )
                   1114:        {
                   1115:            x = rect.left + x;
                   1116:            y = rect.top + y;
                   1117:        }
                   1118:     }
                   1119:     if( SetCursorPos( x, y ) )
                   1120:        result = 1;
                   1121:     return result;
                   1122: }
                   1123: 
                   1124: static void open_screen( void )
                   1125: {
                   1126:     close_windows ();
                   1127:     if( open_windows() )
                   1128:        DX_SetPalette (0, 256);
                   1129:     else
                   1130:        abort();
                   1131: }
                   1132: 
                   1133: void gfx_set_picasso_state( int on )
                   1134: {
                   1135:     if (screen_is_picasso == on)
                   1136:        return;
                   1137: 
                   1138:     screen_is_picasso = on;
                   1139:     open_screen();
                   1140: }
                   1141: 
                   1142: void gfx_set_picasso_modeinfo( int w, int h, int depth, int rgbfmt )
                   1143: {
                   1144:     depth >>= 3;
                   1145:     if( ( picasso_vidinfo.width == w ) &&
                   1146:            ( picasso_vidinfo.height == h ) &&
                   1147:            ( picasso_vidinfo.depth == depth ) &&
                   1148:            ( picasso_vidinfo.selected_rgbformat == rgbfmt) )
                   1149:        return;
                   1150: 
                   1151:     picasso_vidinfo.selected_rgbformat = rgbfmt;
                   1152:     picasso_vidinfo.width = w;
                   1153:     picasso_vidinfo.height = h;
                   1154:     picasso_vidinfo.depth = depth;
                   1155:     picasso_vidinfo.extra_mem = 1;
                   1156: 
                   1157:     if( screen_is_picasso ) 
                   1158:     {
                   1159:        open_screen();
                   1160:     }
                   1161: }
                   1162: 
                   1163: int graphics_init (void)
                   1164: {
                   1165:     return open_windows ();
                   1166: }
                   1167: 
                   1168: int graphics_setup (void)
                   1169: {
                   1170:     if( !DirectDraw_Start() )
                   1171:        return 0;
                   1172: 
                   1173:     DirectDraw_Release();
                   1174: 
                   1175:     InitPicasso96();
                   1176:     
                   1177:     return 1;
                   1178: }
                   1179: 
                   1180: void graphics_leave (void)
                   1181: {
                   1182:     close_windows ();
                   1183:     dumpcustom ();
                   1184:     cleanup_modes ();
                   1185: }
                   1186: 
                   1187: uae_u32 OSDEP_minimize_uae( void )
                   1188: {
                   1189:     return ShowWindow( hAmigaWnd, SW_MINIMIZE );
                   1190: }
                   1191: 
                   1192: static void close_windows (void)
                   1193: {
                   1194:     gfxvidinfo.bufmem = 0;
                   1195: 
                   1196:     releasecapture ();
                   1197:     setmouseactive (0);
                   1198:     ClipCursor (NULL);
                   1199:     DirectDraw_Release();
                   1200:     close_hwnds();
                   1201:     if( mouseactive )
                   1202:        bJustClosedWithActiveMouse = TRUE;
                   1203:     { 
                   1204:        int i;
                   1205:        for( i=0;i<AK_CTRL+1;i++)my_kbd_handler (0,i,0);
                   1206:        for( i=0;i<AK_CTRL+1;i++)my_kbd_handler (i,0,0);
                   1207:        buttonstate[0] = 0;
                   1208:        buttonstate[1] = 0;
                   1209:        buttonstate[2] = 0;
                   1210:     }
                   1211:     bInitDone = FALSE; //?????JGI
                   1212: }
                   1213: 
                   1214: void WIN32GFX_ToggleFullScreen( void )
                   1215: {
                   1216:     if (needs_direct && !overlay)
                   1217:        return;
                   1218: 
                   1219:     display_change_requested = 1;
                   1220:     if (screen_is_picasso)
                   1221:        currprefs.gfx_pfullscreen ^= 1;
                   1222:     else
                   1223:        currprefs.gfx_afullscreen ^= 1;    
                   1224: }
                   1225: 
                   1226: static int create_windows (void)
                   1227: {
                   1228:     if (!fullscreen) 
                   1229:     {
                   1230:         RECT rc;
                   1231:         LONG stored_x = 1, stored_y = GetSystemMetrics( SM_CYMENU ) + GetSystemMetrics( SM_CYBORDER );
                   1232:         DWORD regkeytype;
                   1233:         DWORD regkeysize = sizeof(LONG);
                   1234:         HLOCAL hloc;
                   1235:            LPINT lpParts;
                   1236: 
                   1237:         RegQueryValueEx( hWinUAEKey, "xPos", 0, &regkeytype, (LPBYTE)&stored_x, &regkeysize );
                   1238:         RegQueryValueEx( hWinUAEKey, "yPos", 0, &regkeytype, (LPBYTE)&stored_y, &regkeysize );
                   1239:         if( stored_x < 1 )
                   1240:             stored_x = 1;
                   1241:         if( stored_y < ( GetSystemMetrics( SM_CYMENU ) + GetSystemMetrics( SM_CYBORDER ) ) )
                   1242:             stored_y = GetSystemMetrics( SM_CYMENU ) + GetSystemMetrics( SM_CYBORDER );
                   1243: 
                   1244:         if( stored_x > GetSystemMetrics( SM_CXFULLSCREEN ) )
                   1245:             rc.left = 1;
                   1246:         else
                   1247:             rc.left = stored_x;
                   1248:         
                   1249:         if( stored_y > GetSystemMetrics( SM_CYFULLSCREEN ) )
                   1250:             rc.top = 1;
                   1251:         else
                   1252:             rc.top = stored_y;
                   1253: 
                   1254:         rc.right = rc.left + current_width;
                   1255:         rc.bottom = rc.top + current_height + GetSystemMetrics( SM_CYMENU ) + GetSystemMetrics( SM_CYBORDER )*3;
                   1256: 
                   1257:        AdjustWindowRect (&rc, NORMAL_WINDOW_STYLE, FALSE);
                   1258: 
                   1259:         hMainWnd = CreateWindowEx( picasso_on ? WS_EX_ACCEPTFILES : WS_EX_ACCEPTFILES | WS_EX_APPWINDOW, "PCsuxRox", "WinUAE",
                   1260:                                       NORMAL_WINDOW_STYLE, rc.left, rc.top,
                   1261:                                       rc.right - rc.left, rc.bottom - rc.top,
                   1262:                                       NULL, NULL, 0, NULL);
                   1263: 
                   1264:        if (! hMainWnd)
                   1265:            return 0;
                   1266:        hStatusWnd = CreateStatusWindow (WS_CHILD | WS_VISIBLE, "", hMainWnd, 1);
                   1267:        if (hStatusWnd) 
                   1268:         {
                   1269:            GetClientRect (hMainWnd, &rc);
                   1270:            /* Allocate an array for holding the right edge coordinates. */
                   1271:            hloc = LocalAlloc (LHND, sizeof (int) * NUM_PARTS);
                   1272:            if (hloc) 
                   1273:             {
                   1274:                lpParts = LocalLock (hloc);
                   1275: 
                   1276:                /* Calculate the right edge coordinate for each part, and copy the coords
                   1277:                 * to the array.  */
                   1278:                lpParts[0] = rc.right - (DRIVE_WIDTH * 4) - LED_WIDTH - FPS_WIDTH - 2;
                   1279:                 lpParts[1] = lpParts[0] + FPS_WIDTH;
                   1280:                lpParts[2] = lpParts[1] + LED_WIDTH;
                   1281:                lpParts[3] = lpParts[2] + DRIVE_WIDTH;
                   1282:                lpParts[4] = lpParts[3] + DRIVE_WIDTH;
                   1283:                lpParts[5] = lpParts[4] + DRIVE_WIDTH;
                   1284:                lpParts[6] = lpParts[5] + DRIVE_WIDTH;
                   1285: 
                   1286:                /* Create the seven parts */
                   1287:                SendMessage (hStatusWnd, SB_SETPARTS, (WPARAM) NUM_PARTS, (LPARAM) lpParts);
                   1288: 
                   1289:                LocalUnlock (hloc);
                   1290:                LocalFree (hloc);
                   1291:            }
                   1292:        }
                   1293:     }
                   1294:     else
                   1295:        hMainWnd = NULL;
                   1296: 
                   1297:     hAmigaWnd = CreateWindowEx (fullscreen ? WS_EX_TOPMOST : WS_EX_ACCEPTFILES | WS_EX_APPWINDOW,
                   1298:                                "AmigaPowah", "WinUAE",
                   1299:                                hMainWnd ? WS_VISIBLE | WS_CHILD : WS_VISIBLE | WS_POPUP,
                   1300:                                hMainWnd ? 0 : CW_USEDEFAULT, hMainWnd ? 0 : CW_USEDEFAULT,
                   1301:                                fullscreen ? GetSystemMetrics (SM_CXSCREEN) : current_width,
                   1302:                                fullscreen ? GetSystemMetrics (SM_CYSCREEN) : current_height,
                   1303:                                hMainWnd, NULL, 0, NULL);
                   1304:     
                   1305:     if (! hAmigaWnd) 
                   1306:     {
                   1307:         close_hwnds();
                   1308:        return 0;
                   1309:     }
                   1310: 
                   1311: 
                   1312:     if (hMainWnd)
                   1313:         UpdateWindow( hMainWnd );
                   1314:     if (hAmigaWnd)
                   1315:        UpdateWindow (hAmigaWnd);
                   1316: 
                   1317:     return 1;
                   1318: }
                   1319: 
                   1320: static void setoverlay(void)
                   1321: {
                   1322:     RECT sr, dr, statusr;
                   1323:     POINT p = {0,0};
                   1324:     int maxwidth, maxheight;
                   1325: 
                   1326:     GetClientRect(hMainWnd, &dr);
                   1327:     // adjust the dest-rect to avoid the status-bar
                   1328:     if( hStatusWnd )
                   1329:     {
                   1330:        if( GetWindowRect( hStatusWnd, &statusr ) )
                   1331:            dr.bottom = dr.bottom - ( statusr.bottom - statusr.top );
                   1332:     }
                   1333: 
                   1334:     ClientToScreen( hMainWnd, &p );
                   1335:     dr.left = p.x;
                   1336:     dr.top = p.y;
                   1337:     dr.right += p.x;
                   1338:     dr.bottom += p.y;    
                   1339: 
                   1340:     sr.left = 0; sr.top = 0;
                   1341:     sr.right = current_width; sr.bottom = current_height;
                   1342: 
                   1343:     // Adjust our dst-rect to match the dimensions of our src-rect
                   1344:     if( dr.right - dr.left > sr.right - sr.left )
                   1345:     {
                   1346:        dr.right = dr.left + sr.right - sr.left;
                   1347:     }
                   1348:     if( dr.bottom - dr.top > sr.bottom - sr.top )
                   1349:     {
                   1350:        dr.bottom = dr.top + sr.bottom - sr.top;
                   1351:     }
                   1352: 
                   1353:     maxwidth = GetSystemMetrics(SM_CXSCREEN);
                   1354:     if (dr.right > maxwidth) {
                   1355:        sr.right = current_width - (dr.right - maxwidth);
                   1356:        dr.right = maxwidth;
                   1357:     }
                   1358:     maxheight = GetSystemMetrics(SM_CYSCREEN);
                   1359:     if (dr.bottom > maxheight) {
                   1360:        sr.bottom = current_height - (dr.bottom - maxheight);
                   1361:        dr.bottom = maxheight;
                   1362:     }
                   1363:     if (dr.left < 0) {
                   1364:        sr.left = -dr.left;
                   1365:        dr.left = 0;
                   1366:     }
                   1367:     if (dr.top < 0) {
                   1368:        sr.top = -dr.top;
                   1369:        dr.top = 0;
                   1370:     }
                   1371:     DirectDraw_UpdateOverlay(sr, dr);
                   1372: }
                   1373: 
                   1374: static BOOL doInit (void)
                   1375: {
                   1376:     if (! create_windows ())
                   1377:        goto oops;
                   1378: 
                   1379:     if( screen_is_picasso ) 
                   1380:     {
                   1381:        if (! set_ddraw (current_width, current_height, fullscreen, overlay, window_depth,
                   1382:                        (LPPALETTEENTRY) & picasso96_state.CLUT))
                   1383:            goto oops;
                   1384:         picasso_vidinfo.rowbytes = DirectDraw_GetSurfacePitch();
                   1385:        picasso_vidinfo.pixbytes = DirectDraw_GetBytesPerPixel();
                   1386:        picasso_vidinfo.rgbformat = DirectDraw_GetPixelFormat();
                   1387:     }
                   1388:     else
                   1389:     {
                   1390:        if (fullscreen)
                   1391:         {
                   1392: #if 0
                   1393:             write_log( "Calling adjust_screenmode with %d,%d,%d\n", window_width, window_height, window_depth );
                   1394:            if( WIN32GFX_AdjustScreenmode( &window_width, &window_height, &window_depth ) < 0 )
                   1395:                abort ();
                   1396:             write_log( "Finished adjust_screenmode with %d,%d,%d\n", window_width, window_height, window_depth );
                   1397: #endif
                   1398:         }
                   1399:        if (! set_ddraw (current_width, current_height, fullscreen, overlay, window_depth, colors256))
                   1400:            goto oops;
                   1401:        gfxvidinfo.bufmem = 0;
                   1402:        gfxvidinfo.linemem = 0;
                   1403:        gfxvidinfo.emergmem = scrlinebuf; // memcpy from system-memory to video-memory
                   1404:        gfxvidinfo.pixbytes = current_pixbytes;
                   1405:        gfxvidinfo.width = current_width;
                   1406:        gfxvidinfo.height = current_height;
                   1407:         gfxvidinfo.maxblocklines = 0; // flush_screen actually does everything
                   1408:        gfxvidinfo.rowbytes = DirectDraw_GetSurfacePitch();
                   1409:     }
                   1410: 
                   1411:     if( fullscreen ) 
                   1412:     {
                   1413:         WIN32_MouseDefaults();
                   1414:     }
                   1415:     if( !DirectDraw_SurfaceLock( lockable_surface ) )
                   1416:        goto oops;
                   1417:     DirectDraw_SurfaceUnlock();
                   1418: 
                   1419:     if( ( DirectDraw_GetPixelFormatFlags() & (DDPF_RGB | DDPF_PALETTEINDEXED8 | DDPF_RGBTOYUV ) ) ) 
                   1420:     {
                   1421:         write_log( "%s mode (bits: %d, pixbytes: %d)\n", fullscreen ? "Full screen" : "Window",
                   1422:                   DirectDraw_GetSurfaceBitCount(), current_pixbytes );
                   1423:     }
                   1424:     else
                   1425:     {
                   1426:        char szMessage[ MAX_PATH ];
                   1427:        WIN32GUI_LoadUIString( IDS_UNSUPPORTEDPIXELFORMAT, szMessage, MAX_PATH );
                   1428:        gui_message( szMessage);
                   1429:        goto oops;
                   1430:     }
                   1431: 
                   1432:     write_log ("init_colors\n");
                   1433:     init_colors ();
                   1434:     write_log ("ok\n");
                   1435: 
                   1436:     if (overlay)
                   1437:        setoverlay ();
                   1438: 
                   1439:     write_log ("done_setoverlay\n");
                   1440: #if 0 // This crashes WinXP, because that last param should be an LPWINDOWPOS...
                   1441:     if (! fullscreen)
                   1442:         SendMessage( hMainWnd, WM_WINDOWPOSCHANGED, 0, 0);
                   1443: #endif
                   1444:     write_log ("init done\n");
                   1445: 
                   1446:     bInitDone = TRUE;
                   1447:     return 1;
                   1448: 
                   1449: oops:
                   1450:     DirectDraw_Release();
                   1451:     close_hwnds();
                   1452:     write_log ("closed_hwnds\n");
                   1453: 
                   1454:     return 0;
                   1455: }
                   1456: 
                   1457: 
                   1458: void WIN32GFX_PaletteChange( void )
                   1459: {
                   1460:     DirectDraw_SetPalette( 1 ); /* Remove current palette */
                   1461:     DirectDraw_SetPalette( 0 ); /* Set our real palette */
                   1462: }
                   1463: 
                   1464: void WIN32GFX_ClearPalette( void )
                   1465: {
                   1466:     DirectDraw_SetPalette( 1 ); /* Remove palette */
                   1467: }
                   1468: 
                   1469: void WIN32GFX_SetPalette( void )
                   1470: {
                   1471:     DirectDraw_SetPalette( 0 ); /* Set palette */
                   1472: }
                   1473: #endif
                   1474: void WIN32GFX_WindowMove ( void )
                   1475: {
                   1476:     if (overlay && hMainWnd && bInitDone) setoverlay();
                   1477: }
                   1478: 
                   1479: void WIN32GFX_WindowSize ( void )
                   1480: {
                   1481:     RECT r;
                   1482: 
                   1483:     //?????JGI (to delete): if (!overlay) return;
                   1484:     if (!hMainWnd) return;
                   1485:     if(!GetClientRect (hMainWnd, &r)) return;
                   1486:     window_width = r.right - r.left;
                   1487:     window_height = r.bottom - r.top;
                   1488:     if (overlay && bInitDone) setoverlay();//????? JGI
                   1489: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.