/* SDL_rotozoom - test program Copyright (C) A. Schiffler, July 2001 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef DREAMCAST #include <kos.h> KOS_INIT_FLAGS(INIT_DEFAULT); #endif #ifdef GP32 #include <x_gp32.h> #endif #include <stdlib.h> #include <stdio.h> #include <string.h> #include "SDL.h" #include "SDL_rotozoom.h" #include "sample8.h" void HandleEvent() { SDL_Event event; /* Check for events */ while ( SDL_PollEvent(&event) ) { switch (event.type) { case SDL_JOYBUTTONDOWN: case SDL_KEYDOWN: case SDL_QUIT: exit(0); break; } } } #define ClearScreen(SCREEN) SDL_FillRect(SCREEN,NULL,0); void RotatePicture (SDL_Surface *screen, SDL_Surface *picture, int rotate, int flip, int smooth) { SDL_Surface *rotozoom_picture; SDL_Rect dest; int framecount, framemax, frameinc; sll angle, zoomf, zoomfx, zoomfy; /* Rotate and display the picture */ framemax=4*360; frameinc=1; for (framecount=360; framecount<framemax; framecount += frameinc) { if ((framecount % 360)==0) frameinc++; HandleEvent(); ClearScreen(screen); zoomf=slldiv(int2sll(framecount),int2sll(framemax)); zoomf=sllmul(sllmul(dbl2sll(1.5),zoomf),zoomf); /* Are we in flipping mode? */ if (flip) { /* Flip X factor */ if (flip & 1) { zoomfx=-zoomf; } else { zoomfx=zoomf; } /* Flip Y factor */ if (flip & 2) { zoomfy=-zoomf; } else { zoomfy=zoomf; } angle=int2sll(framecount*rotate); if ((rotozoom_picture=rotozoomSurfaceXY_sll (picture, angle, zoomfx, zoomfy, smooth))!=NULL) { dest.x = (screen->w - rotozoom_picture->w)/2;; dest.y = (screen->h - rotozoom_picture->h)/2; dest.w = rotozoom_picture->w; dest.h = rotozoom_picture->h; if ( SDL_BlitSurface(rotozoom_picture, NULL, screen, &dest) < 0 ) { fprintf(stderr, "Blit failed: %s\n", SDL_GetError()); break; } SDL_FreeSurface(rotozoom_picture); } } else { angle=int2sll(framecount*rotate); if ((rotozoom_picture=rotozoomSurface_sll (picture, angle, zoomf, smooth))!=NULL) { dest.x = (screen->w - rotozoom_picture->w)/2;; dest.y = (screen->h - rotozoom_picture->h)/2; dest.w = rotozoom_picture->w; dest.h = rotozoom_picture->h; if ( SDL_BlitSurface(rotozoom_picture, NULL, screen, &dest) < 0 ) { fprintf(stderr, "Blit failed: %s\n", SDL_GetError()); break; } SDL_FreeSurface(rotozoom_picture); } } /* Display by flipping screens */ SDL_Flip(screen); } if (rotate) { /* Final display with angle=0 */ HandleEvent(); ClearScreen(screen); if (flip) { if ((rotozoom_picture=rotozoomSurfaceXY_sll (picture, dbl2sll(0.01), zoomfx, zoomfy, smooth))!=NULL) { dest.x = (screen->w - rotozoom_picture->w)/2;; dest.y = (screen->h - rotozoom_picture->h)/2; dest.w = rotozoom_picture->w; dest.h = rotozoom_picture->h; if ( SDL_BlitSurface(rotozoom_picture, NULL, screen, &dest) < 0 ) { fprintf(stderr, "Blit failed: %s\n", SDL_GetError()); return; } SDL_FreeSurface(rotozoom_picture); } } else { if ((rotozoom_picture=rotozoomSurface_sll (picture, dbl2sll(0.01), zoomf, smooth))!=NULL) { dest.x = (screen->w - rotozoom_picture->w)/2;; dest.y = (screen->h - rotozoom_picture->h)/2; dest.w = rotozoom_picture->w; dest.h = rotozoom_picture->h; if ( SDL_BlitSurface(rotozoom_picture, NULL, screen, &dest) < 0 ) { fprintf(stderr, "Blit failed: %s\n", SDL_GetError()); return; } SDL_FreeSurface(rotozoom_picture); } } /* Display by flipping screens */ SDL_Flip(screen); } /* Pause for a sec */ SDL_Delay(1000); } void ZoomPicture (SDL_Surface *screen, SDL_Surface *picture, int smooth) { SDL_Surface *rotozoom_picture; SDL_Rect dest; int framecount, framemax, frameinc; sll zoomxf,zoomyf; /* Zoom and display the picture */ framemax=4*360; frameinc=1; for (framecount=360; framecount<framemax; framecount += frameinc) { if ((framecount % 360)==0) frameinc++; HandleEvent(); ClearScreen(screen); zoomxf=slldiv(int2sll(framecount),int2sll(framemax)); zoomxf=sllmul(sllmul(dbl2sll(1.5),zoomxf),zoomxf); zoomyf=slladd(dbl2sll(0.5),sllabs(sllsin(slldiv(int2sll(framecount),dbl2sll(80.0))))); if ((rotozoom_picture=zoomSurface_sll (picture, zoomxf, zoomyf, smooth))!=NULL) { dest.x = (screen->w - rotozoom_picture->w)/2;; dest.y = (screen->h - rotozoom_picture->h)/2; dest.w = rotozoom_picture->w; dest.h = rotozoom_picture->h; if ( SDL_BlitSurface(rotozoom_picture, NULL, screen, &dest) < 0 ) { fprintf(stderr, "Blit failed: %s\n", SDL_GetError()); break; } SDL_FreeSurface(rotozoom_picture); } /* Display by flipping screens */ SDL_Flip(screen); } /* Pause for a sec */ SDL_Delay(1000); } #define ROTATE_OFF 0 #define ROTATE_ON 1 #define FLIP_OFF 0 #define FLIP_X 1 #define FLIP_Y 2 #define FLIP_XY 3 void Draw (SDL_Surface *screen) { SDL_Surface *picture= SDL_LoadBMP_RW(SDL_RWFromMem(&sample8_bmp,SAMPLE8_LEN),0); if (screen->format->BytesPerPixel<2) SDL_SetPalette(screen, SDL_LOGPAL|SDL_PHYSPAL, picture->format->palette->colors,0,256); else { SDL_Surface *tmp = picture; picture=SDL_DisplayFormat(tmp); SDL_FreeSurface(tmp); } while(1) { RotatePicture(screen,picture,ROTATE_ON,FLIP_OFF,SMOOTHING_OFF); RotatePicture(screen,picture,ROTATE_OFF,FLIP_OFF,SMOOTHING_OFF); ZoomPicture(screen,picture,SMOOTHING_OFF); RotatePicture(screen,picture,ROTATE_ON,FLIP_OFF,SMOOTHING_ON); RotatePicture(screen,picture,ROTATE_OFF,FLIP_OFF,SMOOTHING_ON); ZoomPicture(screen,picture,SMOOTHING_ON); } SDL_FreeSurface(picture); } int main ( int argc, char *argv[] ) { SDL_Surface *screen; Uint32 video_flags = SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF; Uint32 video_bits = 0; #if defined(DREAMCAST) || defined(GP32) video_flags |= SDL_FULLSCREEN; video_bits=8; #ifdef GP32 x_gp32_SetCPUSpeed_133(); #endif #endif if ( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) < 0 ) { fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); exit(1); } screen = SDL_SetVideoMode(320, 240, video_bits, video_flags); if ( screen == NULL ) { fprintf(stderr, "Couldn't set %dx%dx%d video mode: %s\n", 320, 240, video_bits, SDL_GetError()); exit(1); } SDL_JoystickEventState(SDL_ENABLE); SDL_JoystickOpen(0); { SDL_Event event; SDL_Delay(333); while(SDL_PollEvent(&event)) SDL_Delay(50); } Draw (screen); return(0); }