Annotation of quake2/win32/rw_dib.c, revision 1.1

1.1     ! root        1: /*
        !             2: ** RW_DIB.C
        !             3: **
        !             4: ** This handles DIB section management under Windows.
        !             5: **
        !             6: */
        !             7: #include "..\ref_soft\r_local.h"
        !             8: #include "rw_win.h"
        !             9: 
        !            10: #ifndef _WIN32
        !            11: #  error You should not be trying to compile this file on this platform
        !            12: #endif
        !            13: 
        !            14: static qboolean s_systemcolors_saved;
        !            15: 
        !            16: static HGDIOBJ previously_selected_GDI_obj;
        !            17: 
        !            18: static int s_syspalindices[] = 
        !            19: {
        !            20:   COLOR_ACTIVEBORDER,
        !            21:   COLOR_ACTIVECAPTION,
        !            22:   COLOR_APPWORKSPACE,
        !            23:   COLOR_BACKGROUND,
        !            24:   COLOR_BTNFACE,
        !            25:   COLOR_BTNSHADOW,
        !            26:   COLOR_BTNTEXT,
        !            27:   COLOR_CAPTIONTEXT,
        !            28:   COLOR_GRAYTEXT,
        !            29:   COLOR_HIGHLIGHT,
        !            30:   COLOR_HIGHLIGHTTEXT,
        !            31:   COLOR_INACTIVEBORDER,
        !            32: 
        !            33:   COLOR_INACTIVECAPTION,
        !            34:   COLOR_MENU,
        !            35:   COLOR_MENUTEXT,
        !            36:   COLOR_SCROLLBAR,
        !            37:   COLOR_WINDOW,
        !            38:   COLOR_WINDOWFRAME,
        !            39:   COLOR_WINDOWTEXT
        !            40: };
        !            41: 
        !            42: #define NUM_SYS_COLORS ( sizeof( s_syspalindices ) / sizeof( int ) )
        !            43: 
        !            44: static int s_oldsyscolors[NUM_SYS_COLORS];
        !            45: 
        !            46: typedef struct dibinfo
        !            47: {
        !            48:        BITMAPINFOHEADER        header;
        !            49:        RGBQUAD                         acolors[256];
        !            50: } dibinfo_t;
        !            51: 
        !            52: typedef struct
        !            53: {
        !            54:        WORD palVersion;
        !            55:        WORD palNumEntries;
        !            56:        PALETTEENTRY palEntries[256];
        !            57: } identitypalette_t;
        !            58: 
        !            59: static identitypalette_t s_ipal;
        !            60: 
        !            61: static void DIB_SaveSystemColors( void );
        !            62: static void DIB_RestoreSystemColors( void );
        !            63: 
        !            64: /*
        !            65: ** DIB_Init
        !            66: **
        !            67: ** Builds our DIB section
        !            68: */
        !            69: qboolean DIB_Init( unsigned char **ppbuffer, int *ppitch )
        !            70: {
        !            71:        dibinfo_t   dibheader;
        !            72:        BITMAPINFO *pbmiDIB = ( BITMAPINFO * ) &dibheader;
        !            73:        int i;
        !            74: 
        !            75:        memset( &dibheader, 0, sizeof( dibheader ) );
        !            76: 
        !            77:        /*
        !            78:        ** grab a DC
        !            79:        */
        !            80:        if ( !sww_state.hDC )
        !            81:        {
        !            82:                if ( ( sww_state.hDC = GetDC( sww_state.hWnd ) ) == NULL )
        !            83:                        return false;
        !            84:        }
        !            85: 
        !            86:        /*
        !            87:        ** figure out if we're running in an 8-bit display mode
        !            88:        */
        !            89:        if ( GetDeviceCaps( sww_state.hDC, RASTERCAPS ) & RC_PALETTE )
        !            90:        {
        !            91:                sww_state.palettized = true;
        !            92: 
        !            93:                // save system colors
        !            94:                if ( !s_systemcolors_saved )
        !            95:                {
        !            96:                        DIB_SaveSystemColors();
        !            97:                        s_systemcolors_saved = true;
        !            98:                }
        !            99:        }
        !           100:        else
        !           101:        {
        !           102:                sww_state.palettized = false;
        !           103:        }
        !           104: 
        !           105:        /*
        !           106:        ** fill in the BITMAPINFO struct
        !           107:        */
        !           108:        pbmiDIB->bmiHeader.biSize          = sizeof(BITMAPINFOHEADER);
        !           109:        pbmiDIB->bmiHeader.biWidth         = vid.width;
        !           110:        pbmiDIB->bmiHeader.biHeight        = vid.height;
        !           111:        pbmiDIB->bmiHeader.biPlanes        = 1;
        !           112:        pbmiDIB->bmiHeader.biBitCount      = 8;
        !           113:        pbmiDIB->bmiHeader.biCompression   = BI_RGB;
        !           114:        pbmiDIB->bmiHeader.biSizeImage     = 0;
        !           115:        pbmiDIB->bmiHeader.biXPelsPerMeter = 0;
        !           116:        pbmiDIB->bmiHeader.biYPelsPerMeter = 0;
        !           117:        pbmiDIB->bmiHeader.biClrUsed       = 256;
        !           118:        pbmiDIB->bmiHeader.biClrImportant  = 256;
        !           119: 
        !           120:        /*
        !           121:        ** fill in the palette
        !           122:        */
        !           123:        for ( i = 0; i < 256; i++ )
        !           124:        {
        !           125:                dibheader.acolors[i].rgbRed   = ( d_8to24table[i] >> 0 )  & 0xff;
        !           126:                dibheader.acolors[i].rgbGreen = ( d_8to24table[i] >> 8 )  & 0xff;
        !           127:                dibheader.acolors[i].rgbBlue  = ( d_8to24table[i] >> 16 ) & 0xff;
        !           128:        }
        !           129: 
        !           130:        /*
        !           131:        ** create the DIB section
        !           132:        */
        !           133:        sww_state.hDIBSection = CreateDIBSection( sww_state.hDC,
        !           134:                                                     pbmiDIB,
        !           135:                                                                                         DIB_RGB_COLORS,
        !           136:                                                                                         &sww_state.pDIBBase,
        !           137:                                                                                         NULL,
        !           138:                                                                                         0 );
        !           139: 
        !           140:        if ( sww_state.hDIBSection == NULL )
        !           141:        {
        !           142:                ri.Con_Printf( PRINT_ALL, "DIB_Init() - CreateDIBSection failed\n" );
        !           143:                goto fail;
        !           144:        }
        !           145: 
        !           146:        if ( pbmiDIB->bmiHeader.biHeight > 0 )
        !           147:     {
        !           148:                // bottom up
        !           149:                *ppbuffer       = sww_state.pDIBBase + ( vid.height - 1 ) * vid.width;
        !           150:                *ppitch         = -vid.width;
        !           151:     }
        !           152:     else
        !           153:     {
        !           154:                // top down
        !           155:                *ppbuffer       = sww_state.pDIBBase;
        !           156:                *ppitch         = vid.width;
        !           157:     }
        !           158: 
        !           159:        /*
        !           160:        ** clear the DIB memory buffer
        !           161:        */
        !           162:        memset( sww_state.pDIBBase, 0xff, vid.width * vid.height );
        !           163: 
        !           164:        if ( ( sww_state.hdcDIBSection = CreateCompatibleDC( sww_state.hDC ) ) == NULL )
        !           165:        {
        !           166:                ri.Con_Printf( PRINT_ALL, "DIB_Init() - CreateCompatibleDC failed\n" );
        !           167:                goto fail;
        !           168:        }
        !           169:        if ( ( previously_selected_GDI_obj = SelectObject( sww_state.hdcDIBSection, sww_state.hDIBSection ) ) == NULL )
        !           170:        {
        !           171:                ri.Con_Printf( PRINT_ALL, "DIB_Init() - SelectObject failed\n" );
        !           172:                goto fail;
        !           173:        }
        !           174: 
        !           175:        return true;
        !           176: 
        !           177: fail:
        !           178:        DIB_Shutdown();
        !           179:        return false;
        !           180:        
        !           181: }
        !           182: 
        !           183: /*
        !           184: ** DIB_SetPalette
        !           185: **
        !           186: ** Sets the color table in our DIB section, and also sets the system palette
        !           187: ** into an identity mode if we're running in an 8-bit palettized display mode.
        !           188: **
        !           189: ** The palette is expected to be 1024 bytes, in the format:
        !           190: **
        !           191: ** R = offset 0
        !           192: ** G = offset 1
        !           193: ** B = offset 2
        !           194: ** A = offset 3
        !           195: */
        !           196: void DIB_SetPalette( const unsigned char *_pal )
        !           197: {
        !           198:        const unsigned char *pal = _pal;
        !           199:        LOGPALETTE              *pLogPal = ( LOGPALETTE * ) &s_ipal;
        !           200:        RGBQUAD                 colors[256];
        !           201:        int                             i;
        !           202:        int                             ret;
        !           203:        HDC                             hDC = sww_state.hDC;
        !           204: 
        !           205:        /*
        !           206:        ** set the DIB color table
        !           207:        */
        !           208:        if ( sww_state.hdcDIBSection )
        !           209:        {
        !           210:                for ( i = 0; i < 256; i++, pal += 4 )
        !           211:                {
        !           212:                        colors[i].rgbRed   = pal[0];
        !           213:                        colors[i].rgbGreen = pal[1];
        !           214:                        colors[i].rgbBlue  = pal[2];
        !           215:                        colors[i].rgbReserved = 0;
        !           216:                }
        !           217: 
        !           218:                colors[0].rgbRed = 0;
        !           219:                colors[0].rgbGreen = 0;
        !           220:                colors[0].rgbBlue = 0;
        !           221: 
        !           222:                colors[255].rgbRed = 0xff;
        !           223:                colors[255].rgbGreen = 0xff;
        !           224:                colors[255].rgbBlue = 0xff;
        !           225: 
        !           226:                if ( SetDIBColorTable( sww_state.hdcDIBSection, 0, 256, colors ) == 0 )
        !           227:                {
        !           228:                        ri.Con_Printf( PRINT_ALL, "DIB_SetPalette() - SetDIBColorTable failed\n" );
        !           229:                }
        !           230:        }
        !           231: 
        !           232:        /*
        !           233:        ** for 8-bit color desktop modes we set up the palette for maximum
        !           234:        ** speed by going into an identity palette mode.
        !           235:        */
        !           236:        if ( sww_state.palettized )
        !           237:        {
        !           238:                int i;
        !           239:                HPALETTE hpalOld;
        !           240: 
        !           241:                if ( SetSystemPaletteUse( hDC, SYSPAL_NOSTATIC ) == SYSPAL_ERROR )
        !           242:                {
        !           243:                        ri.Sys_Error( ERR_FATAL, "DIB_SetPalette() - SetSystemPaletteUse() failed\n" );
        !           244:                }
        !           245: 
        !           246:                /*
        !           247:                ** destroy our old palette
        !           248:                */
        !           249:                if ( sww_state.hPal )
        !           250:                {
        !           251:                        DeleteObject( sww_state.hPal );
        !           252:                        sww_state.hPal = 0;
        !           253:                }
        !           254: 
        !           255:                /*
        !           256:                ** take up all physical palette entries to flush out anything that's currently
        !           257:                ** in the palette
        !           258:                */
        !           259:                pLogPal->palVersion             = 0x300;
        !           260:                pLogPal->palNumEntries  = 256;
        !           261: 
        !           262:                for ( i = 0, pal = _pal; i < 256; i++, pal += 4 )
        !           263:                {
        !           264:                        pLogPal->palPalEntry[i].peRed   = pal[0];
        !           265:                        pLogPal->palPalEntry[i].peGreen = pal[1];
        !           266:                        pLogPal->palPalEntry[i].peBlue  = pal[2];
        !           267:                        pLogPal->palPalEntry[i].peFlags = PC_RESERVED | PC_NOCOLLAPSE;
        !           268:                }
        !           269:                pLogPal->palPalEntry[0].peRed           = 0;
        !           270:                pLogPal->palPalEntry[0].peGreen         = 0;
        !           271:                pLogPal->palPalEntry[0].peBlue          = 0;
        !           272:                pLogPal->palPalEntry[0].peFlags         = 0;
        !           273:                pLogPal->palPalEntry[255].peRed         = 0xff;
        !           274:                pLogPal->palPalEntry[255].peGreen       = 0xff;
        !           275:                pLogPal->palPalEntry[255].peBlue        = 0xff;
        !           276:                pLogPal->palPalEntry[255].peFlags       = 0;
        !           277: 
        !           278:                if ( ( sww_state.hPal = CreatePalette( pLogPal ) ) == NULL )
        !           279:                {
        !           280:                        ri.Sys_Error( ERR_FATAL, "DIB_SetPalette() - CreatePalette failed(%x)\n", GetLastError() );
        !           281:                }
        !           282: 
        !           283:                if ( ( hpalOld = SelectPalette( hDC, sww_state.hPal, FALSE ) ) == NULL )
        !           284:                {
        !           285:                        ri.Sys_Error( ERR_FATAL, "DIB_SetPalette() - SelectPalette failed(%x)\n",GetLastError() );
        !           286:                }
        !           287: 
        !           288:                if ( sww_state.hpalOld == NULL )
        !           289:                        sww_state.hpalOld = hpalOld;
        !           290: 
        !           291:                if ( ( ret = RealizePalette( hDC ) ) != pLogPal->palNumEntries ) 
        !           292:                {
        !           293:                        ri.Sys_Error( ERR_FATAL, "DIB_SetPalette() - RealizePalette set %d entries\n", ret );
        !           294:                }
        !           295:        }
        !           296: }
        !           297: 
        !           298: /*
        !           299: ** DIB_Shutdown
        !           300: */
        !           301: void DIB_Shutdown( void )
        !           302: {
        !           303:        if ( sww_state.palettized && s_systemcolors_saved )
        !           304:                DIB_RestoreSystemColors();
        !           305: 
        !           306:        if ( sww_state.hPal )
        !           307:        {
        !           308:                DeleteObject( sww_state.hPal );
        !           309:                sww_state.hPal = 0;
        !           310:        }
        !           311: 
        !           312:        if ( sww_state.hpalOld )
        !           313:        {
        !           314:                SelectPalette( sww_state.hDC, sww_state.hpalOld, FALSE );
        !           315:                RealizePalette( sww_state.hDC );
        !           316:                sww_state.hpalOld = NULL;
        !           317:        }
        !           318: 
        !           319:        if ( sww_state.hdcDIBSection )
        !           320:        {
        !           321:                SelectObject( sww_state.hdcDIBSection, previously_selected_GDI_obj );
        !           322:                DeleteDC( sww_state.hdcDIBSection );
        !           323:                sww_state.hdcDIBSection = NULL;
        !           324:        }
        !           325: 
        !           326:        if ( sww_state.hDIBSection )
        !           327:        {
        !           328:                DeleteObject( sww_state.hDIBSection );
        !           329:                sww_state.hDIBSection = NULL;
        !           330:                sww_state.pDIBBase = NULL;
        !           331:        }
        !           332: 
        !           333:        if ( sww_state.hDC )
        !           334:        {
        !           335:                ReleaseDC( sww_state.hWnd, sww_state.hDC );
        !           336:                sww_state.hDC = 0;
        !           337:        }
        !           338: }
        !           339: 
        !           340: 
        !           341: /*
        !           342: ** DIB_Save/RestoreSystemColors
        !           343: */
        !           344: static void DIB_RestoreSystemColors( void )
        !           345: {
        !           346:     SetSystemPaletteUse( sww_state.hDC, SYSPAL_STATIC );
        !           347:     SetSysColors( NUM_SYS_COLORS, s_syspalindices, s_oldsyscolors );
        !           348: }
        !           349: 
        !           350: static void DIB_SaveSystemColors( void )
        !           351: {
        !           352:        int i;
        !           353: 
        !           354:        for ( i = 0; i < NUM_SYS_COLORS; i++ )
        !           355:                s_oldsyscolors[i] = GetSysColor( s_syspalindices[i] );
        !           356: }

unix.superglobalmegacorp.com

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