gxmovie.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include "std.h"
  2. #include "gxmovie.h"
  3. #include "gxgraphics.h"
  4. gxMovie::gxMovie( gxGraphics *g,IMultiMediaStream *mm )
  5. :gfx(g),mm_stream( mm ),playing(true){
  6. mm_stream->GetMediaStream( MSPID_PrimaryVideo,&vid_stream );
  7. vid_stream->QueryInterface( IID_IDirectDrawMediaStream,(void**)&dd_stream );
  8. DDSURFACEDESC desc={sizeof(desc)};
  9. dd_stream->GetFormat( &desc,0,0,0 );
  10. canvas=gfx->createCanvas( desc.dwWidth,desc.dwHeight,0 ); //gxCanvas::CANVAS_NONDISPLAY );
  11. canvas->getSurface()->QueryInterface( IID_IDirectDrawSurface,(void**)&dd_surf );
  12. src_rect.left=src_rect.top=0;
  13. src_rect.right=desc.dwWidth;src_rect.bottom=desc.dwHeight;
  14. dd_stream->CreateSample( dd_surf,&src_rect,0,&dd_sample );
  15. mm_stream->SetState( STREAMSTATE_RUN );
  16. }
  17. gxMovie::~gxMovie(){
  18. mm_stream->SetState( STREAMSTATE_STOP );
  19. dd_sample->Release();
  20. dd_surf->Release();
  21. dd_stream->Release();
  22. vid_stream->Release();
  23. mm_stream->Release();
  24. gfx->freeCanvas( canvas );
  25. }
  26. bool gxMovie::draw( gxCanvas *dest,int x,int y,int w,int h ){
  27. if( !playing ) return false;
  28. if( !dd_sample->Update( 0,0,0,0 ) ){
  29. RECT dest_rect={x,y,x+w,y+h};
  30. dest->getSurface()->Blt( &dest_rect,canvas->getSurface(),&src_rect,DDBLT_WAIT,0 );
  31. dest->damage( dest_rect );
  32. }else{
  33. playing=false;
  34. }
  35. return playing;
  36. }