#include #include #include "bmpdata.cpp" #include "ctrackbar.h" class cTrackbar { public: SDL_Surface *defs,*back,*fwd,*play,*pause,*logo,*hide,*vol,*volbar,*track, *point,*point2,*empty,*xw; int scrwidth; int seekDir; double pos,gottapos,newpos,oldpos; cTrackbar(); ~cTrackbar(); void width(int w) {scrwidth=w;} int width() {return scrwidth;} double getpos() {return gottapos;} void setpos(double p) {gottapos=p;} void seek(double psx) {pos=psx;} int display(SDL_Surface *dc,int y, int mx,int rev); }; static cTrackbar *trk=NULL; cTrackbar::cTrackbar() { pos=0;scrwidth=16;newpos=-1; #define OUCH(a) a = SDL_LoadBMP_RW(SDL_RWFromMem(ax_##a##_bmp,ax_##a##_bmp_size), 1); OUCH(defs) OUCH(back) OUCH(fwd) OUCH(play) OUCH(pause) OUCH(logo) OUCH(hide) OUCH(vol) OUCH(volbar) OUCH(track) OUCH(point) OUCH(point2) OUCH(empty) #undef OUCH } cTrackbar::~cTrackbar() { #define OUCH(a) SDL_FreeSurface(a); OUCH(defs) OUCH(back) OUCH(fwd) OUCH(play) OUCH(pause) OUCH(logo) OUCH(hide) OUCH(vol) OUCH(volbar) OUCH(track) OUCH(point) OUCH(point2) OUCH(empty) #undef OUCH } inline void blt(SDL_Surface *dc,int &x,int y,SDL_Surface *src) { SDL_Rect r1,r2; r1.x=x; r1.w=src->w; r1.y=y; r1.h=src->h; r2.x=0; r2.w=src->w; r2.y=0; r2.h=src->h; if (dc) SDL_BlitSurface(src, &r2, dc, &r1); x+=src->w; } int cTrackbar::display(SDL_Surface *dc,int y, int mx, int rev) { #define CHKY(a) if ((mx>=(x - a->w))&&(mx=width()) return res; int x=0, res=0; int ww=(width() - track->w - hide->w - /*vol->w*/ - 1); int stx,endx; blt(dc,x,y, logo); CHKX(logo,AX_LOGO) CHKZ blt(dc,x,y, back); CHKX(back,AX_PREV) CHKZ blt(dc,x,y, fwd); CHKX(fwd, AX_NEXT) CHKZ blt(dc,x,y, xw); CHKX(play,AX_PLAY_PAUSE) CHKZ stx=x; while(x < ww) { blt(dc,x,y, track); CHKX(track,AX_TRACK) } endx = x - point->w; blt(dc,x,y, empty); blt(dc,x,y, empty); x = ww+track->w; /* blt(dc,x,y, vol); CHKX(vol,AX_VOL) */ blt(dc,x,y, hide); CHKX(hide,AX_HIDE) if (((mx>=(stx+(point->w/2)))&&(mx<(endx+(point->w/2))))&&(endx>stx)) setpos( (double)(mx-stx-(point->w/2)) / (double)(endx-stx) ); else setpos(pos); if (gottapos>1.0) gottapos=1.0; if (newpos>0) { if (pos!=oldpos) newpos=-1; else pos=newpos; } x = (long)( stx + (-stx+endx)*(rev?getpos():pos) ) ; blt(NULL,x,y, point); CHKY(point) { x-=point->w; blt(dc,x,y, point2); }else { x-=point->w; blt(dc,x,y, point); } return res; } static int trk_en=0,trk_sh=0; int trk_init() { if (trk) return 0; trk=new cTrackbar(); return 1; } int trk_deinit() { if (!trk) return 0; delete trk; return 1; } int trk_width(int w) { if (!trk) return 0; trk->width(w); return 1; } int trk_display(SDL_Surface *dc,int y, int mx, int ps, int rev) { if (!trk) return 0; if (ps) trk->xw=trk->play;else trk->xw=trk->pause; return trk->display(dc,y,mx,rev); } int trk_height() { return 16; } int trk_enabled() { return trk_en; } int trk_enable(int yes) { trk_en=yes; return 1; } int trk_shown() { return trk_sh; } int trk_show(int yes) { trk_sh=yes; return 1; } int trk_seek(double posx) { if (!trk) return 0; trk->seek(posx); return 1; } double trk_manualpos() { if (!trk) return -1; return trk->getpos(); } void call_gettime(); int trk_newpos(double posx) { if (!trk) return 0; trk->newpos=posx; call_gettime(); trk->oldpos=trk->pos; return 1; }