Linux下的SDL图片浏览
#include "SDL.h"
//#include "SDL_ttf.h"
#include "SDL_rotozoom.h"
#include "SDL_image.h"
#include "math.h"
#include "string.h"
#define MAX 16
#define BMP_NAME "icon.bmp"
#define ICON "sample.bmp"
#define TITLE_NAME "TestSDL"
#define ICON_NAME "My WinFrame" //窗体最小化name
//#define PNG_NAME "Bliss.png" //背景图片
#define TEXT "欢迎光临" //文字设置
#define TEXT_SIZE 50 //设置字体大小
#define WIDTH 640
#define HEIGTH 480
char *picture[] = {
"1.jpg" , "2.jpg" , "3.jpg" , "4.jpg" ,
"5.jpg" , "6.jpg" , "7.jpg" , "8.jpg" ,
"9.jpg" , "10.jpg" , "11.jpg" , "12.jpg" ,
"13.png" , "14.jpg" , "15.jpg" , "16.jpg"
};
static SDL_Surface *screen = NULL;
int Init() //初始化SDL
{
if((SDL_Init(SDL_INIT_VIDEO)&&IMG_Init(IMG_INIT_PNG)) == -1)
{
fprintf(stderr,"SDL init error:%s",SDL_GetError());
return -1;
}
return 0;
}
SDL_Surface *loadBMP(char *fileName) //加载bmp图片
{
SDL_Surface *bmp;
bmp = SDL_LoadBMP(fileName);
if(bmp == NULL)
{
fprintf(stderr,"Could not load %s: %s",fileName,SDL_GetError());
exit(1);
}
return bmp;
}
void creatScreen(int width , int height , int bpp , Uint32 flags) //创建一个VideoMode
{
screen = SDL_SetVideoMode(width , height, bpp , flags);
if(screen == NULL)
{
fprintf(stderr,"Could not Creat a Screen!:%s",SDL_GetError());
exit(1);
}
return ;
}
int Destory(SDL_Surface *file) //释放空间
{
SDL_FreeSurface( file ); return 0;
}
void show_Pic(SDL_Surface *bmp ,SDL_Rect *rect) //显示bmp图片
{
SDL_BlitSurface(bmp , NULL , screen , rect);
SDL_UpdateRect(screen , 0 , 0 , 0 , 0 );
return ;
}
int getRightPic(int i)
{
i++;
if(i % 15 == 0)
{
i = 0;
}
return i;
}
int getLeftPic(int i)
{
i--;
if(i < 0)
{
i = 15;
}
return i;
}
void zoomBig(double *a)
{
*a -= 0.25;
if(*a <= 1.5)
{
*a = 1.5;
}
}
void zoomSmall(double *a)
{
*a += 0.25;
if(*a >= 5)
{
*a = 5;
}
}
void draw_button(char *str , int flag)
{
if(strcmp(str , "left") == 0)
{
boxColor(screen, 160, 420 , 200, 460, 0xf3f5ffff);
if(flag == 1)
{
hlineColor( screen, 160 , 200 ,460 , 0x000000ff);
vlineColor( screen, 200 , 420 , 460 , 0x000000ff);
}
show_Pic( screen , &(screen->clip_rect) );
}
if(strcmp(str , "right") == 0)
{
boxColor(screen, 438, 420 , 478, 460, 0xf3f5ffff);
if(flag == 1)
{
hlineColor( screen, 438 , 478 , 460, 0x000000ff);
vlineColor( screen, 478 , 420 , 460 , 0x000000ff);
}
show_Pic( screen , &(screen->clip_rect) );
}
return ;
}
void button(char *str)
{
SDL_Rect rect;
int x,y;
if(strcmp(str , "left") == 0)
{
boxColor(screen, 160, 420 , 200, 460, 0xf3f5ffff);
SDL_UpdateRect(screen , 0 , 0 , 0 , 0 );
}
if(strcmp(str , "right") == 0)
{
boxColor(screen, 438, 420 , 478, 460, 0xf3f5ffff);
SDL_UpdateRect(screen , 0 , 0 , 0 , 0 );
}
}
int main(int argc,char **argv)
{
const SDL_VideoInfo *info = NULL;
int flag = 1;
int i = 0;
int width = WIDTH;
int heigth = HEIGTH;
int bpp = 0;
double zoom_x,zoom_y;
SDL_Surface *backpng = NULL;
Init();
creatScreen(width , heigth, bpp , SDL_SWSURFACE);
info = SDL_GetVideoInfo();
if(info == NULL)
{
fprintf( stderr, "Video query failed: %s\n",SDL_GetError( ) );
exit(1);
}
bpp = info->vfmt->BitsPerPixel ; //得到VideoMode的色度bpp
backpng = IMG_Load(picture[i]);
if(!backpng)
{
fprintf(stderr,"Could not load %s: %s\n",picture[i],SDL_GetError());
exit(1);
}
zoom_x = (double)((screen->w) / (double)(backpng->w));
zoom_y = (double)((screen->h) / (double)(backpng->h));
backpng = zoomSurface(backpng , zoom_x , zoom_y , 1);
show_Pic(backpng ,&(screen->clip_rect));
SDL_Rect fillRect;
fillRect.x = 107;
fillRect.y = 80;
fillRect.w = 426;
fillRect.h = 320;
SDL_WM_SetCaption(TITLE_NAME, ICON_NAME); //设置窗口标题
SDL_WM_SetIcon(loadBMP(ICON) , NULL); //设置图标
static double zoomXY = 1.5;
SDL_Event event;
while(flag)
{
while(SDL_PollEvent(&event)) //将事件加入事件队列队列
{
switch(event.type)
{
case SDL_KEYDOWN:
printf("Key Down......\n");
if(event.key.keysym.sym == SDLK_ESCAPE)
{
flag = 0;
}
if(event.key.keysym.sym == SDLK_SPACE)
{
backpng = IMG_Load(picture[0]);
if(!backpng)
{
fprintf(stderr,"Could not load %s: %s\n",picture[i],SDL_GetError());
exit(1);
}
zoom_x = (double)((screen->w) / (double)(backpng->w));
zoom_y = (double)((screen->h) / (double)(backpng->h));
backpng = zoomSurface(backpng , zoom_x , zoom_y , 1);
show_Pic(backpng ,&(screen->clip_rect));
Destory(backpng);
backpng = NULL;
}
break;
case SDL_KEYUP:
/*
*keyborad test
*/
printf("Key up......\n");
printf("key : %d\n" , event.key.keysym.sym );
if(event.key.keysym.sym == 269)
{
zoomSmall(&zoomXY);
}
if(event.key.keysym.sym == 270)
{
zoomBig(&zoomXY);
}
break;
case SDL_MOUSEMOTION:
/*
*mouse motton test
*/
printf("mouse motton : x = %d , y = %d\n" ,event.button.x , event.button.y);
break;
case SDL_MOUSEBUTTONDOWN:
draw_button("left" , 0) ;
draw_button("right" , 0) ;
if(((event.button.x >= 160) && (event.button.x <= 200 )) && ((event.button.y >= 420) && (event.button.y <= 460 )))
{
draw_button("left" , 1) ;
i = getLeftPic(i);
backpng = IMG_Load(picture[i]);
if(!backpng)
{
fprintf(stderr,"Could not load %s: %s\n",picture[i],SDL_GetError());
exit(1);
}
zoom_x = (double)((screen->w) / (double)(backpng->w));
zoom_y = (double)((screen->h) / (double)(backpng->h));
backpng = zoomSurface(backpng , (zoom_x / zoomXY), (zoom_y / zoomXY) , 1);
SDL_Rect rect;
rect.x = (screen->w - backpng->w ) / 2;
rect.y = (screen->h - backpng->h ) / 2;
rect.w = backpng->w;
rect.h = backpng->h;
printf("%d , %d , %d , %d\n" , rect.x, rect.y, rect.w , rect.h );
SDL_FillRect(screen ,&fillRect , 0xffffffff);
SDL_UpdateRect(screen , 0 , 0 , 0 , 0 );
show_Pic(backpng , &rect);
Destory(backpng);
backpng = NULL;
}
if( (event.button.x >= 438 && event.button.x <= 478 ) && (event.button.y >= 420 && event.button.y <= 460 ) )
{
draw_button("right" , 1) ;
i = getRightPic(i);
backpng = IMG_Load(picture[i]);
if(!backpng)
{
fprintf(stderr,"Could not load %s: %s\n",picture[i],SDL_GetError());
exit(1);
}
zoom_x = (double)((screen->w) / (double)(backpng->w));
zoom_y = (double)((screen->h) / (double)(backpng->h));
backpng = zoomSurface(backpng , (zoom_x / zoomXY), (zoom_y / zoomXY) , 1);
SDL_Rect rect;
rect.x = (screen->w - backpng->w ) / 2;
rect.y = (screen->h - backpng->h ) / 2;
rect.w = backpng->w;
rect.h = backpng->h;
printf("%d , %d , %d , %d\n" , rect.x, rect.y, rect.w , rect.h );
SDL_FillRect(screen ,&fillRect , 0xffffffff);
SDL_UpdateRect(screen , 0 , 0 , 0 , 0 );
show_Pic(backpng , &rect);
Destory(backpng);
backpng = NULL;
}
break;
case SDL_MOUSEBUTTONUP:
draw_button("left" , 0) ;
draw_button("right" , 0) ;
break;
case SDL_QUIT:
printf("quit\n");
flag = 0;
break;
}
}
}
Destory(backpng);
Destory(screen);
//TTF_Quit();
SDL_Quit();
return 0;
}