home *** CD-ROM | disk | FTP | other *** search
/ QuickTime 2.0 Developer Kit / QuickTime 2.0 Developer Kit.iso / mac / MAC / Programming Stuff / Sample Code / Mixed Bag / Sample Components / PictMediaHandler.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-22  |  5.4 KB  |  197 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        PictMediaHandler.r
  3.  
  4.     Written by:    Peter Hoddie
  5.  
  6.     Copyright:    © 1992 by Apple Computer, Inc., all rights reserved.
  7.  
  8. */
  9.  
  10. #include <ToolUtils.h>
  11.  
  12. #include <MediaHandlers.h>
  13. #include <Movies.h>
  14.  
  15. typedef struct {
  16.     ComponentInstance    self;
  17.     ComponentInstance    parent;
  18.     ComponentInstance    delegateComponent;
  19.  
  20.     Fixed                width;
  21.     Fixed                height;
  22.  
  23.     MatrixRecord        matrix;
  24.  
  25.     Media                media;
  26.     Track                track;
  27. } PictGlobalsRecord, *PictGlobals;
  28.  
  29. pascal ComponentResult PictMediaDispatch(ComponentParameters *params, Handle storage);
  30. pascal ComponentResult PictOpen(PictGlobals globals, ComponentInstance self);
  31. pascal ComponentResult PictClose(PictGlobals globals, ComponentInstance self);
  32. pascal ComponentResult PictCanDo(PictGlobals globals, short ftnNumber);
  33. pascal ComponentResult PictVersion(PictGlobals globals);
  34. pascal ComponentResult PictTarget(PictGlobals store, ComponentInstance parentComponent);
  35. pascal ComponentResult PictInitialize (PictGlobals store, GetMovieCompleteParams *gmc);
  36. pascal ComponentResult PictIdle (PictGlobals store, TimeValue atMediaTime, long flagsIn, 
  37.                 long *flagsOut, const TimeValue *tr);
  38. pascal ComponentResult PictSetDimensions (PictGlobals store, Fixed width, Fixed height);
  39. pascal ComponentResult PictSetMatrix (PictGlobals store, MatrixRecord *trackMovieMatrix);
  40.  
  41. // entry point for all Component Manager requests
  42. pascal ComponentResult PictMediaDispatch(ComponentParameters *params, Handle storage)
  43. {
  44.     OSErr err = badComponentSelector;
  45.     ComponentFunction componentProc = 0;
  46.  
  47.     switch (params->what) {
  48.         case kComponentOpenSelect: componentProc = PictOpen; break;
  49.         case kComponentCloseSelect: componentProc = PictClose; break;
  50.         case kComponentCanDoSelect: componentProc = PictCanDo; break;
  51.         case kComponentVersionSelect: componentProc = PictVersion; break;
  52.         case kComponentTargetSelect: componentProc = PictVersion; break;
  53.  
  54.         case kMediaInitializeSelect: componentProc = PictInitialize; break;
  55.         case kMediaIdleSelect: componentProc = PictIdle; break;
  56.         case kMediaSetDimensionsSelect: componentProc = PictSetDimensions; break;
  57.         case kMediaSetMatrixSelect: componentProc = PictSetMatrix; break;
  58.     }
  59.  
  60.     if (componentProc)
  61.         err = CallComponentFunctionWithStorage(storage, params, componentProc);
  62.     else
  63.         err = DelegateComponentCall(params, ((PictGlobals)storage)->delegateComponent);
  64.  
  65.     return err;
  66. }
  67.  
  68. pascal ComponentResult PictCanDo(PictGlobals globals, short ftnNumber)
  69. {
  70.     switch (ftnNumber) {
  71.         case kComponentOpenSelect:
  72.         case kComponentCloseSelect:
  73.         case kComponentCanDoSelect:
  74.         case kComponentVersionSelect: 
  75.         case kComponentTargetSelect: 
  76.  
  77.         case kMediaInitializeSelect: 
  78.         case kMediaIdleSelect: 
  79.         case kMediaSetDimensionsSelect:
  80.         case kMediaSetMatrixSelect: 
  81.             return true;
  82.         default:
  83.             return ComponentFunctionImplemented( globals->delegateComponent, ftnNumber );
  84.     }
  85. }
  86.  
  87. pascal ComponentResult PictVersion(PictGlobals globals)
  88. {
  89.     return 0x00020001;
  90. }
  91.  
  92. pascal ComponentResult PictOpen(PictGlobals globals, ComponentInstance self)
  93. {
  94.     OSErr err;
  95.  
  96.     // allocate storage
  97.     globals = (PictGlobals)NewPtrClear(sizeof(PictGlobalsRecord));
  98.     if (err = MemError()) return err;
  99.  
  100.     SetComponentInstanceStorage(self, (Handle)globals);
  101.     globals->self = self;
  102.     globals->parent = self;
  103.  
  104.     // find a Base Media Handler to delegate to
  105.     globals->delegateComponent = OpenDefaultComponent(MediaHandlerType, BaseMediaType);
  106.     if (globals->delegateComponent)
  107.         PictTarget(globals, self);        // set up the calling chain
  108.     else {
  109.         DisposePtr((Ptr)globals);
  110.         err = cantOpenHandler;
  111.     }
  112.  
  113.     return err;
  114. }
  115.  
  116. pascal ComponentResult PictClose(PictGlobals globals, ComponentInstance self)
  117. {
  118.     if (globals) {
  119.         if (globals->delegateComponent)
  120.             CloseComponent(globals->delegateComponent);
  121.  
  122.         DisposePtr((Ptr)globals);
  123.     }
  124.     
  125.     return noErr;
  126. }
  127.  
  128. pascal ComponentResult PictTarget(PictGlobals store, ComponentInstance parentComponent)
  129. {
  130.     // remember who is at the top of our calling chain
  131.     store->parent = parentComponent;
  132.     // and inform out delegate component of the change as well
  133.     ComponentSetTarget(store->delegateComponent, parentComponent);
  134.  
  135.     return noErr;
  136. }
  137.  
  138. pascal ComponentResult PictInitialize (PictGlobals store, GetMovieCompleteParams *gmc)
  139. {
  140.     // remember some useful parameters
  141.     store->width = gmc->width;
  142.     store->height = gmc->height;
  143.     store->matrix = gmc->trackMovieMatrix;
  144.     store->media = gmc->theMedia;
  145.     store->track = gmc->theTrack;
  146.  
  147.     // tell the Base Media Handler about ourselves
  148.     MediaSetHandlerCapabilities(store->delegateComponent, handlerHasSpatial, handlerHasSpatial);
  149.  
  150.     return noErr;
  151. }
  152.  
  153. pascal ComponentResult PictIdle (PictGlobals store, TimeValue atMediaTime, long flagsIn, 
  154.             long *flagsOut, const TimeValue *tr)
  155. {
  156.     OSErr err;
  157.     Rect r;
  158.     Handle sample = NewHandle(0);
  159.  
  160.     if (err = MemError()) goto bail;
  161.  
  162.     // get the current sample
  163.     err = GetMediaSample(store->media, sample, 0, nil,
  164.         atMediaTime, nil, 0, 0, 0, 0, 0, 0);
  165.     if (err) goto bail;
  166.  
  167.     // draw it using the current matrix
  168.     SetRect(&r, 0, 0, FixRound(store->width), FixRound(store->height));    
  169.     TransformRect(&store->matrix, &r, nil);
  170.     EraseRect(&r);
  171.     DrawPicture((PicHandle)sample, &r);
  172.  
  173. bail:
  174.     DisposeHandle(sample);
  175.     *flagsOut |= mDidDraw;        // let MovieToolbox know we drew something
  176.  
  177.     return err;
  178. }
  179.  
  180. pascal ComponentResult PictSetDimensions (PictGlobals store, Fixed width, Fixed height)
  181. {
  182.     // remember the new track dimensions
  183.     store->width = width;
  184.     store->height = height;
  185.  
  186.     return noErr;
  187. }
  188.  
  189. pascal ComponentResult PictSetMatrix (PictGlobals store, MatrixRecord *trackMovieMatrix)
  190. {
  191.     // remember the new display matrix
  192.     store->matrix = *trackMovieMatrix;
  193.  
  194.     return noErr;
  195. }
  196.  
  197.