Example #1
0
EXPORT(void) FlipScreen()
{
    if (SDL_MUSTLOCK(SDLScreenBuffer))
        if (SDL_LockSurface(SDLScreenBuffer) != 0)
            return;

    int pitch = SDLScreenBuffer->pitch / sizeof(BGRA);

    if (Config.scale)
    {

        switch (Config.filter)
        {

            case I_NONE:
                DirectScale((dword*)SDLScreenBuffer->pixels, pitch, (dword*)ScreenBuffer, ScreenBufferWidth, ScreenBufferHeight);
                break;

            case I_SCALE2X:
                Scale2x(    (dword*)SDLScreenBuffer->pixels, pitch, (dword*)ScreenBuffer, ScreenBufferWidth, ScreenBufferHeight);
                break;

            case I_EAGLE:
                Eagle(      (dword*)SDLScreenBuffer->pixels, pitch, (dword*)ScreenBuffer, ScreenBufferWidth, ScreenBufferHeight);
                break;

            case I_HQ2X:
                hq2x(       (dword*)SDLScreenBuffer->pixels, pitch, (dword*)ScreenBuffer, ScreenBufferWidth, ScreenBufferHeight);
                break;

            case I_2XSAI:
                _2xSaI(     (dword*)SDLScreenBuffer->pixels, pitch, (dword*)ScreenBuffer, ScreenBufferWidth, ScreenBufferHeight);
                break;

            case I_SUPER_2XSAI:
                Super2xSaI( (dword*)SDLScreenBuffer->pixels, pitch, (dword*)ScreenBuffer, ScreenBufferWidth, ScreenBufferHeight);
                break;

            case I_SUPER_EAGLE:
                SuperEagle( (dword*)SDLScreenBuffer->pixels, pitch, (dword*)ScreenBuffer, ScreenBufferWidth, ScreenBufferHeight);
                break;

        }
    }
    else
    {
        BGRA* dst = (BGRA*)SDLScreenBuffer->pixels;
        BGRA* src = ScreenBuffer;

        for (int i = 0; i < ScreenBufferHeight; ++i)
        {
            memcpy(dst, src, ScreenBufferWidth * sizeof(BGRA));
            dst += pitch;
            src += ScreenBufferWidth;
        }
    }

    if (SDL_MUSTLOCK(SDLScreenBuffer))
        SDL_UnlockSurface(SDLScreenBuffer);

    SDL_Flip(SDLScreenBuffer);

}
Example #2
0
void gr_unlock_screen()
{
    if ( !screen_locked || !screen->pixels ) return ;

    screen_locked = 0 ;

    if ( scale_resolution != -1 )
    {
        uint8_t  * src8  = screen->pixels, * dst8  = scale_screen->pixels , * pdst = scale_screen->pixels ;
        uint16_t * src16 = screen->pixels, * dst16 = scale_screen->pixels ;
        uint32_t * src32 = screen->pixels, * dst32 = scale_screen->pixels ;
        int h, w;

        switch ( scale_screen->format->BitsPerPixel )
        {
            case    8:
                    if ( scale_resolution_orientation == 1 || scale_resolution_orientation == 3 )
                    {
                        if ( scale_resolution_aspectratio )
                        {
                            for ( w = 0; w < scale_screen->w; w++ )
                            {
                                if ( scale_resolution_table_w[w] != -1 )
                                {
                                    src8 = screen->pixels + scale_resolution_table_w[w];
                                    for ( h = scale_screen->h - 1; h-- ; )
                                    {
                                        if ( scale_resolution_table_h[h] != -1 ) *dst8 = src8[scale_resolution_table_h[h]];
                                        dst8 += scale_screen->pitch ;
                                    }
                                }
                                dst8 = pdst += scale_screen->format->BytesPerPixel ;
                            }
                        }
                        else
                        {
                            for ( w = 0; w < scale_screen->w; w++ )
                            {
                                src8 = screen->pixels + scale_resolution_table_w[w];
                                for ( h = scale_screen->h - 1; h-- ; )
                                {
                                    *dst8 = src8[scale_resolution_table_h[h]];
                                    dst8 += scale_screen->pitch ;
                                }
                            }
                            dst8 = pdst += scale_screen->format->BytesPerPixel ;
                        }
                    }
                    else
                    {
                        if ( scale_resolution_aspectratio )
                        {
                            for ( h = 0; h < scale_screen->h; h++ )
                            {
                                if ( scale_resolution_table_h[h] != -1 )
                                {
                                    src8 = screen->pixels + scale_resolution_table_h[h];
                                    for ( w = 0; w < scale_screen->w; w++ )
                                    {
                                        if ( scale_resolution_table_w[w] != -1 ) *dst8 = src8[scale_resolution_table_w[w]];
                                        dst8++;
                                    }
                                }
                                dst8 = pdst += scale_screen->pitch ;
                            }
                        }
                        else
                        {
                            for ( h = 0; h < scale_screen->h; h++ )
                            {
                                src8 = screen->pixels + scale_resolution_table_h[h];
                                for ( w = 0; w < scale_screen->w; w++ )
                                {
                                    *dst8 = src8[scale_resolution_table_w[w]];
                                    dst8++;
                                }
                                dst8 = pdst += scale_screen->pitch ;
                            }
                        }
                    }
                    break;

            case    16:
                    if ( scale_resolution_orientation == 1 || scale_resolution_orientation == 3 )
                    {
                        if ( scale_resolution_aspectratio )
                        {
                            int inc = scale_screen->pitch / scale_screen->format->BytesPerPixel;
                            for ( w = 0; w < scale_screen->w; w++ )
                            {
                                if ( scale_resolution_table_w[w] != -1 )
                                {
                                    src16 = screen->pixels + scale_resolution_table_w[w];
                                    for ( h = scale_screen->h - 1; h-- ; )
                                    {
                                        if ( scale_resolution_table_h[h] != -1 ) *dst16 = src16[scale_resolution_table_h[h]];
                                        dst16 += inc;
                                    }
                                }
                                dst16 = ( uint16_t * ) ( pdst += scale_screen->format->BytesPerPixel ) ;
                            }
                        }
                        else
                        {
                            int inc = scale_screen->pitch / scale_screen->format->BytesPerPixel;
                            for ( w = 0; w < scale_screen->w; w++ )
                            {
                                src16 = screen->pixels + scale_resolution_table_w[w];
                                for ( h = scale_screen->h - 1; h-- ; )
                                {
                                    *dst16 = src16[scale_resolution_table_h[h]];
                                    dst16 += inc;
                                }
                                dst16 = ( uint16_t * ) ( pdst += scale_screen->format->BytesPerPixel ) ;
                            }
                        }
                    }
                    else
                    {
                        if ( scale_resolution_aspectratio )
                        {
                            for ( h = 0; h < scale_screen->h; h++ )
                            {
                                if ( scale_resolution_table_h[h] != -1 )
                                {
                                    src16 = screen->pixels + scale_resolution_table_h[h];
                                    for ( w = 0; w < scale_screen->w; w++ )
                                    {
                                        if ( scale_resolution_table_w[w] != -1 ) *dst16 = src16[scale_resolution_table_w[w]];
                                        dst16++;
                                    }
                                }
                                dst16 = ( uint16_t * ) ( pdst += scale_screen->pitch ) ;
                            }
                        }
                        else
                        {
                            for ( h = 0; h < scale_screen->h; h++ )
                            {
                                src16 = screen->pixels + scale_resolution_table_h[h];
                                for ( w = 0; w < scale_screen->w; w++ )
                                {
                                    *dst16 = src16[scale_resolution_table_w[w]];
                                    dst16++;
                                }
                                dst16 = ( uint16_t * ) ( pdst += scale_screen->pitch ) ;
                            }
                        }
                    }
                    break;

            case    32:
                    if ( scale_resolution_orientation == 1 || scale_resolution_orientation == 3 )
                    {
                        if ( scale_resolution_aspectratio )
                        {
                            int inc = scale_screen->pitch / scale_screen->format->BytesPerPixel;
                            for ( w = 0; w < scale_screen->w; w++ )
                            {
                                if ( scale_resolution_table_w[w] != -1 )
                                {
                                    src32 = screen->pixels + scale_resolution_table_w[w];
                                    for ( h = scale_screen->h - 1; h-- ; )
                                    {
                                        if ( scale_resolution_table_h[h] != -1 ) *dst32 = src32[scale_resolution_table_h[h]];
                                        dst32 += inc;
                                    }
                                }
                                dst32 = ( uint32_t * ) ( pdst += scale_screen->format->BytesPerPixel ) ;
                            }
                        }
                        else
                        {
                            int inc = scale_screen->pitch / scale_screen->format->BytesPerPixel;
                            for ( w = 0; w < scale_screen->w; w++ )
                            {
                                src32 = screen->pixels + scale_resolution_table_w[w];
                                for ( h = scale_screen->h - 1; h-- ; )
                                {
                                    *dst32 = src32[scale_resolution_table_h[h]];
                                    dst32 += inc;
                                }
                                dst32 = ( uint32_t * ) ( pdst += scale_screen->format->BytesPerPixel ) ;
                            }
                        }
                    }
                    else
                    {
                        if ( scale_resolution_aspectratio )
                        {
                            for ( h = 0; h < scale_screen->h; h++ )
                            {
                                if ( scale_resolution_table_h[h] != -1 )
                                {
                                    src32 = screen->pixels + scale_resolution_table_h[h];
                                    for ( w = 0; w < scale_screen->w; w++ )
                                    {
                                        if ( scale_resolution_table_w[w] != -1 ) *dst32 = src32[scale_resolution_table_w[w]];
                                        dst32++;
                                    }
                                }
                                dst32 = ( uint32_t * ) ( pdst += scale_screen->pitch ) ;
                            }
                        }
                        else
                        {
                            for ( h = 0; h < scale_screen->h; h++ )
                            {
                                src32 = screen->pixels + scale_resolution_table_h[h];
                                for ( w = 0; w < scale_screen->w; w++ )
                                {
                                    *dst32 = src32[scale_resolution_table_w[w]];
                                    dst32++;
                                }
                                dst32 = ( uint32_t * ) ( pdst += scale_screen->pitch ) ;
                            }
                        }
                    }
                    break;
        }

        if ( SDL_MUSTLOCK( scale_screen ) ) SDL_UnlockSurface( scale_screen ) ;
        if ( waitvsync ) gr_wait_vsync();
        SDL_Flip( scale_screen ) ;
    }
    else if ( enable_scale )
    {
        GRAPH * scr;

        if ( scrbitmap->format->depth == 8 )
        {
            uint8_t * original, * poriginal;
            uint16_t * extra, * pextra;
            int n = scrbitmap->height, length;

            if (
                !scrbitmap_extra ||
                scrbitmap_extra->width != scrbitmap->width ||
                scrbitmap_extra->height != scrbitmap->height
            )
            {
                if ( scrbitmap_extra ) bitmap_destroy( scrbitmap_extra );
                scrbitmap_extra = bitmap_new( 0, scrbitmap->width, scrbitmap->height, 16 );
            }

            poriginal = scrbitmap->data;
            pextra = scrbitmap_extra->data;

            while ( n-- )
            {
                original = poriginal;
                extra = pextra;
                length = scrbitmap->width;
                while ( length-- ) *extra++ = sys_pixel_format->palette->colorequiv[ *original++ ];
                poriginal += scrbitmap->pitch;
                pextra = ( uint16_t * )((( uint8_t * ) pextra ) + scrbitmap_extra->pitch );
            }

            scr = scrbitmap_extra;
        }
        else
        {
            scr = scrbitmap;
        }

        /* Esto podria ir en un modulo aparte */
        switch ( scale_mode )
        {
            case SCALE_SCALE2X:
                scale2x( scr->data, scr->pitch, screen->pixels, screen->pitch, scr->width, scr->height );
                break;

            case SCALE_HQ2X:
                hq2x( scr->data, scr->pitch, screen->pixels, screen->pitch, scr->width, scr->height );
                break;

            case SCALE_SCANLINE2X:
                scanline2x( scr->data, scr->pitch, screen->pixels, screen->pitch, scr->width, scr->height );
                break;

            case SCALE_NOFILTER:
                scale_normal2x( scr->data, scr->pitch, screen->pixels, screen->pitch, scr->width, scr->height );
                break;

            case SCALE_NONE:
                // No usado
                break;
        }

        if ( SDL_MUSTLOCK( screen ) ) SDL_UnlockSurface( screen ) ;
        if ( waitvsync ) gr_wait_vsync();
        SDL_Flip( screen ) ;
    }
    else if ( scrbitmap->info_flags & GI_EXTERNAL_DATA )
    {
        if ( double_buffer ||
                (
                    updaterects_count == 1 &&
                    updaterects[0].x == 0 &&
                    updaterects[0].y == 0 &&
                    updaterects[0].x2 == scr_width - 1 &&
                    updaterects[0].y2 == scr_height - 1
                )
           )
        {
            if ( SDL_MUSTLOCK( screen ) ) SDL_UnlockSurface( screen ) ;
            if ( waitvsync ) gr_wait_vsync();
            SDL_Flip( screen ) ;
        }
        else
        {
            if ( updaterects_count )
            {
                int i;

                for ( i = 0 ; i < updaterects_count ; i++ )
                {
                    rects[ i ].x = updaterects[ i ].x;
                    rects[ i ].y = updaterects[ i ].y;
                    rects[ i ].w = ( updaterects[ i ].x2 - rects[ i ].x + 1 );
                    rects[ i ].h = ( updaterects[ i ].y2 - rects[ i ].y + 1 );
                }
                if ( SDL_MUSTLOCK( screen ) ) SDL_UnlockSurface( screen ) ;
                if ( waitvsync ) gr_wait_vsync();
                SDL_UpdateRects( screen, updaterects_count, rects ) ;
            }
        }
    }
}