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); }
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 ) ; } } } }