00001 #include "SDL_Window.h"
00002 
00003 using namespace std;
00004 
00005 
00006 bool SDL_Window::Draw()
00007 {
00008     
00009     SDL_Rect coordAbs=coord;
00010     calcCoord(&coordAbs);
00011 
00012     if(ClearWindow())
00013     {
00014         fprintf(stderr,"SDL_Window::Draw(), 1: Echec de ClearWindow\n");
00015         return true;
00016     }
00017     if(PrepareWindow())
00018     {
00019         fprintf(stderr,"SDL_Window::Draw(), 2: Echec de PrepareWindow\n");
00020         return true;
00021     }
00022     if(SDL_BlitSurface(screen,&coordAbs,shadow,NULL))
00023     {
00024         fprintf(stderr,"SDL_Window::Draw(), 3: Echec de SDL_BlitSurface:%s\n",SDL_GetError());
00025         return true;
00026     }
00027     if(SDL_BlitSurface(window,NULL,screen,&coordAbs))
00028     {
00029         fprintf(stderr,"SDL_Window::Draw(), 4: Echec de SDL_BlitSurface:%s\n",SDL_GetError());
00030         return true;
00031     }
00032 
00033     SDL_Window *ptrMere=mere;
00034     while(ptrMere)
00035     {fputc('\t',stderr);ptrMere=ptrMere->mere;}
00036     fprintf(stderr,"%x coord:(%d,%d)/(%d,%d)\toldCoord:(%d,%d)/(%d,%d)\n",(int)this,coord.x,coord.y,coord.w,coord.h,oldCoord.x,oldCoord.y,oldCoord.w,oldCoord.h);
00037     oldCoord=coord;
00038     for_each(filles.begin(),filles.end(), mem_fun(&SDL_Window::Draw));
00039 
00040     drawed=true;
00041     return false;
00042 }
00043 
00044 
00045 
00046 
00047 
00048 
00049 bool SDL_Window::Resize(short width, short height, unsigned char relative)
00050 {
00051     needInit=true;
00052     if(!relative)
00053     {
00054         if(height<0 || width<0)
00055         {
00056             fprintf(stderr,"SDL_Window::Resize(short,short,uchar), 1:height(=%d) ou width(=%d) sont nuls\n",height,width);
00057             return true;
00058         }
00059         coord.h=height;
00060         coord.w=width;
00061     }
00062     else
00063     {
00064         coord.h+=height;
00065         coord.w+=width;
00066     }
00067     return false;
00068 }
00069 
00070 
00071 
00072 
00073 
00074 bool SDL_Window::Resize(float width, float height, bool target)
00075 {
00076 
00077     if(!target)
00078     {
00079         if(!mere)
00080         {
00081             fprintf(stderr,"SDL_Window::Resize(float,float,uchar), 1:mere est nul\n");
00082             return true;
00083         }
00084         return Resize(mere->window->w*width,mere->window->h*height,0);
00085     }
00086     return Resize(window->w*width,window->h*height,1);
00087 }
00088 
00089 
00090 
00091 
00092 
00093 bool SDL_Window::Move(short x, short y, unsigned char relative)
00094 {
00095     if(relative==1)
00096     {
00097         if(!mere)
00098         {
00099             fprintf(stderr,"SDL_Window::Move(short,short,uchar), 1:mere est nul\n");
00100             return true;
00101         }
00102         coord.x=x;
00103         coord.y=y;
00104     }
00105     else if(relative==2)
00106     {
00107         coord.x+=x;
00108         coord.y+=y;
00109     }
00110     else
00111     {
00112         
00113         SDL_Window *ptrMere=mere;
00114         if(ptrMere)
00115         {
00116             coord.x=0;
00117             coord.y=0;
00118             while(ptrMere)
00119             {
00120                 coord.x+=ptrMere->coord.x;
00121                 coord.y+=ptrMere->coord.y;
00122                 ptrMere=ptrMere->mere;
00123             }
00124             coord.x-=x;
00125             coord.y-=y;
00126         }
00127         else
00128         {
00129             coord.x=x;
00130             coord.y=y;
00131         }
00132     }
00133     return false;
00134 }
00135 
00136 
00137 
00138 bool SDL_Window::Move(float x, float y)
00139 {
00140 
00141     if(!mere)
00142     {
00143         fprintf(stderr,"SDL_Window::Move(float,float), 1:mere est nul\n");
00144         return true;
00145     }
00146     return Move((short)(mere->coord.w*x),(short)(mere->coord.h*y),1);
00147 }
00148 
00149 
00150 bool SDL_Window::ClearWindow()
00151 {
00152 
00153     if(drawed)
00154     {
00155         
00156         SDL_Rect coordAbs=oldCoord;
00157         SDL_Window *ptrMere=this;
00158         while(ptrMere->mere)
00159         {
00160             ptrMere=ptrMere->mere;
00161             coordAbs.x+=ptrMere->oldCoord.x;
00162             coordAbs.y+=ptrMere->oldCoord.y;
00163         }
00164 
00165         for_each(filles.rbegin(),filles.rend(),mem_fun(&SDL_Window::ClearWindow));
00166         if(SDL_BlitSurface(shadow,NULL,screen,&coordAbs))
00167         {
00168             fprintf(stderr,"SDL_Window::ClearWindow(), 1:Echec de BlitSurface:%s\n",SDL_GetError());
00169             return true;
00170         }
00171         drawed=false;
00172     }
00173     return false;
00174 }
00175 
00176 
00177 bool SDL_Window::PrepareWindow()
00178 {
00179 
00180     
00181     
00182     if(!needInit)
00183         return false;
00184     if(!border || !body)
00185     {
00186         fprintf(stderr,"SDL_Window::PrepareWindow(), 1: border(=%x) ou body(=%x) n'ont pas été initialisé\n",(unsigned int)border,(unsigned int)body);
00187         return true; 
00188     }
00189     SDL_Rect destRect= {0,0,0,0};
00190     Uint32 flags=(screen->flags)&(SDL_SWSURFACE|SDL_HWSURFACE|SDL_SRCCOLORKEY|SDL_SRCALPHA);
00191     int bpp=screen->format->BitsPerPixel;
00192 
00193     SDL_FreeSurface(shadow);
00194     SDL_FreeSurface(window);
00195     shadow=SDL_CreateRGBSurface(flags,coord.w, coord.h, bpp, 0, 0, 0, 0);
00196     if(!shadow)
00197     {
00198         fprintf(stderr,"SDL_Window::PrepareWindow(), 2: shadow non initialisé: %s\n",SDL_GetError());
00199         return true;
00200     }
00201 
00202     window=SDL_CreateRGBSurface(flags,coord.w, coord.h, bpp, Rmask, Gmask, Bmask, Amask);
00203     if(!window)
00204     {
00205         fprintf(stderr,"SDL_Window::PrepareWindow(), 3: window non initialisé: %s\n",SDL_GetError());
00206         return true;
00207     }
00208 
00209     destRect.x=border->width[HAUTDROITE];
00210     destRect.y=border->height[HAUTGAUCHE];
00211     if(SDL_BlitSurface(body,NULL,window, &destRect))
00212     {
00213         fprintf(stderr,"SDL_Window::PrepareWindow(), 4: Echec de BlitSurface: %s\n",SDL_GetError());
00214         return true;
00215     }
00216 
00217     destRect.x=0;
00218     destRect.y=0;
00219     destRect.w=coord.w;
00220     destRect.h=coord.h;
00221     border->Draw(window,&destRect);
00222 
00223     needInit=false;
00224     return false;
00225 }
00226 
00227 SDL_Window::SDL_Window(void)
00228     :Rmask(0)
00229     ,Gmask(0)
00230     ,Bmask(0)
00231     ,Amask(0)
00232     ,filles()
00233     ,coord()
00234     ,mere(0)
00235     ,shadow(0)
00236     ,window(0)
00237     ,body(0)
00238     ,border(0)
00239     ,gesEvent()
00240     ,screen(0)
00241     ,oldCoord()
00242     ,drawed(false)
00243     ,needInit(true)
00244 {
00245     if(SDL_InitSubSystem(SDL_INIT_VIDEO))
00246         fprintf(stderr,"SDL_Window::SDL_Window(void), 1:Impossible d'initialiser le sous-système vidéo:%s\n",SDL_GetError()); 
00247     if(!(screen=SDL_GetVideoSurface()))
00248         fprintf(stderr,"SDL_Window::SDL_Window(void), 2:Echec de SDL_GetVideoSurface(): %s\n",SDL_GetError());
00249     coord.h=0;
00250     coord.w=0;
00251     coord.x=0;
00252     coord.y=0;
00253 }
00254 
00255 SDL_Window::SDL_Window(SDL_Window *Mere)
00256     :Rmask(0)
00257     ,Gmask(0)
00258     ,Bmask(0)
00259     ,Amask(0)
00260     ,filles()
00261     ,coord()
00262     ,mere(Mere)
00263     ,shadow(0)
00264     ,window(0)
00265     ,body(0)
00266     ,border(0)
00267     ,gesEvent()
00268     ,screen(mere->screen)
00269     ,oldCoord()
00270     ,drawed(false)
00271     ,needInit(true)
00272 {
00273 }
00274 
00275 void SDL_Window::SetMasks(unsigned long rmask, unsigned long gmask, unsigned long bmask, unsigned long amask)
00276 {
00277     needInit=true;
00278     Rmask=rmask;
00279     Gmask=gmask;
00280     Bmask=bmask;
00281     Amask=amask;
00282 }
00283 
00284 list<SDL_Window*>::iterator SDL_Window::CreateSubWindow(void)
00285 {
00286     filles.push_front(new SDL_Window(this));
00287     return filles.begin();
00288 }
00289 
00290 
00291 bool SDL_Window::InitTextures(BorderTexture *bordTex,char* filebody)
00292 {
00293     needInit=true;
00294     border=bordTex;
00295     SDL_FreeSurface(body);
00296     if(!filebody)
00297     {
00298         fprintf(stderr,"SDL_Window::InitTextures(BorderTexture *,char*), 1:filebody vaut NULL\n");
00299         return false;
00300     }
00301     if(!border)
00302     {
00303         fprintf(stderr,"SDL_Window::InitTextures(BorderTexture *,char*), 2:bordTex vaut NULL\n");
00304         return false;
00305     }
00306     if(!(body=SDL_LoadBMP(filebody)))
00307     {
00308         fprintf(stderr,"SDL_Window::InitTextures(BorderTexture *,char*), 3:Echec de SDL_LoadBMP: %s\n",SDL_GetError());
00309         return true;
00310     }
00311 
00312     if(border->isInit())
00313         return false;
00314     return true;
00315 }
00316 
00317 bool SDL_Window::SetAlpha(unsigned char alpha,bool srcAlpha,bool rleAccel)
00318 {
00319     Amask=alpha;
00320     if(SDL_SetAlpha(window,(srcAlpha*SDL_SRCALPHA)|(rleAccel*SDL_RLEACCEL),alpha))
00321     {
00322         fprintf(stderr,"SDL_Window::SetAlpha(uchar, bool, bool), 1:Echec de SDL_SetAlpha: %s\n",SDL_GetError());
00323         return true;
00324     }
00325     return false;
00326 }
00327 
00328 void SDL_Window::calcCoord(SDL_Rect *c)
00329 {
00330     
00331     SDL_Window *ptrMere=this;
00332     while(ptrMere->mere)
00333     {
00334         ptrMere=ptrMere->mere;
00335         c->x+=ptrMere->coord.x;
00336         c->y+=ptrMere->coord.y;
00337     }
00338 }
00339 
00340 SDL_Window::~SDL_Window()
00341 {
00342     if(mere)
00343         mere->filles.remove(this);
00344 
00345     while (!filles.empty())
00346         delete filles.front();
00347     SDL_FreeSurface(shadow);
00348     SDL_FreeSurface(window);
00349     SDL_FreeSurface(body);
00350 }
00351 
00352 SDL_Window::SDL_Window(SDL_Window &source, SDL_Window *Mere)
00353     :Rmask(source.Rmask)
00354     ,Gmask(source.Gmask)
00355     ,Bmask(source.Bmask)
00356     ,Amask(source.Amask)
00357     ,filles()
00358     ,coord(source.coord)
00359     ,mere(source.mere)
00360     ,shadow(0)
00361     ,window(0)
00362     ,body(source.body)
00363     ,border(source.border)
00364     ,gesEvent()
00365     ,screen(source.screen)
00366     ,oldCoord()
00367     ,drawed(false)
00368     ,needInit(true) 
00369 {
00370     list<SDL_Window*>::iterator it;
00371     coord.h=source.coord.h;
00372     coord.w=source.coord.w;
00373     coord.x=source.coord.x;
00374     coord.y=source.coord.y;
00375 
00376     if(Mere)
00377         mere=Mere;
00378 
00379     if(mere)
00380         (mere->filles).push_back(this);
00381 
00382     if(body)
00383         body->refcount++;
00384     for(it=source.filles.begin();it!=source.filles.end();it++)
00385         filles.push_back(new SDL_Window(**it,this));
00386 }
00387 
00388 SDL_Window &SDL_Window::operator=(SDL_Window &source)
00389 {
00390     Rmask=source.Rmask;
00391     Gmask=source.Gmask;
00392     Bmask=source.Bmask;
00393     Amask=source.Amask;
00394     coord.h=source.coord.h;
00395     coord.w=source.coord.w;
00396     coord.x=source.coord.x;
00397     coord.y=source.coord.y;
00398     mere=source.mere;
00399     shadow=0;
00400     window=0;
00401     body=source.body;
00402     border=source.border;
00403     screen=source.screen;
00404     drawed=false;
00405     needInit=true; 
00406 
00407     list<SDL_Window*>::iterator it;
00408 
00409     if(mere)
00410         (mere->filles).push_back(this);
00411 
00412     if(body)
00413         body->refcount++;
00414 
00415     
00416     for(it=source.filles.begin();it!=source.filles.end();it++)
00417         filles.push_back(new SDL_Window(**it,this));
00418     return *this;
00419     
00420 }
00421 
00422 
00423 
00424 
00425 
00426 
00427 
00428 
00429 
00430 
00431 
00432 
00433 
00434 
00435 
00436 
00437 
00438 
00439 
00440 
00441 
00442 
00443