سلام!
این جلسه می خواهیم عکس مورد نظر خود را سریع تر در صفحه کپی کنیم.
فرض کنید یک پنجره با مشخّصات زیر ساخته اید؛
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;
}
موفق باشید!