سلام!

این جلسه می خواهیم عکس مورد نظر خود را سریع تر در صفحه کپی کنیم.

فرض کنید یک پنجره با مشخّصات زیر ساخته اید؛

SDL_Surface *screen = SDL_SetVideoMode( 640, 480, 32, SDL_HWSURFACE );

هر پیکسل از این پنجره حاوی ۳۲ بیت است. ولی تصاویر با فرمت bitmap و بعضی از فرمت های دیگر تنها دارای ۲۴ بیت به ازای هر پیکسل هستند. در صورتی که صفحه ی شما دارای ۳۲ بیت به ازای هر پیکسل (bpp) باشد، هنگام کپی کردن یک عکس bitmap، کتاب خانه ی SDL مجبور می شود که عکس شما را تبدیل کند و همین باعث می شود که برنامه کند شود.

در این جلسه می خواهیم عکس را لود کرده و سپس آن را متناسب با مشخّصات صفحه تغییر دهیم. برای این کار از تابعی استفاده می کنیم با مشخّصات زیر؛

SDL_Surface *SDL_DisplayFormat( SDL_Surface* );

این تابع یک SDL_Surface* را می گیرد، آن را متناسب با پنجره ی برنامه تغییر می دهد و سپس SDL_Surface* حاصل را برمی گرداند. برای آشنایی بیشتر با این تابع می توانید برنامه ی زیر را مطالعه کنید.

SDL_Surface *loadImage( string address ){
    SDL_Surface *returnValue = IMG_Load( address.c_str() );
    if ( returnValue != NULL )
        returnValue = SDL_DisplayFormat( returnValue );
    return returnValue;
}

توجّه: تابع c_str در کلاس string، آن را تبدیل به آرایه ای از char می کند. ورودی IMG_Load هم یک آرایه از char است نه یک string.

حالا دیگر کپی کردن عکس مورد نظر سریع تر خواهد بود؛ برنامه ی زیر همین کار را انجام می دهد.

int main () {
    SDL_Init( SDL_INIT_EVERYTHING );
    
    SDL_Surface *screen = SDL_SetVideoMode( 640, 480, 32, SDL_HWSURFACE );
    
    string path = "path/to/image.bmp";
    SDL_Surface *image = loadImage( path );
    SDL_BlitSurface( image, NULL, screen, NULL );
    SDL_Flip( screen );
    
    SDL_FreeSurface( image );
    SDL_Quit();
    return 0;
}

موفق باشید!