void QTTarg_SetTrackProperties (Media theMedia, UInt32 theIdleFrequency) { QTAtomContainer myTrackProperties; RGBColor myBackgroundColor; Boolean hasActions; UInt32 myFrequency; OSErr myErr = noErr; // add a background color to the sprite track myBackgroundColor.red = EndianU16_NtoB(0xffff); myBackgroundColor.green = EndianU16_NtoB(0xffff); myBackgroundColor.blue = EndianU16_NtoB(0xffff); myErr = QTNewAtomContainer(&myTrackProperties); if (myErr == noErr) { QTInsertChild(myTrackProperties, 0, kSpriteTrackPropertyBackgroundColor, 1, 1, sizeof(myBackgroundColor), &myBackgroundColor, NULL); // tell the movie controller that this sprite track has actions hasActions = true; QTInsertChild(myTrackProperties, 0, kSpriteTrackPropertyHasActions, 1, 1, sizeof(hasActions), &hasActions, NULL); // tell the sprite track to generate QTIdleEvents myFrequency = EndianU32_NtoB(theIdleFrequency); QTInsertChild(myTrackProperties, 0, kSpriteTrackPropertyQTIdleEventsFrequency, 1, 1, sizeof(myFrequency), &myFrequency, NULL); SetMediaPropertyAtom(theMedia, myTrackProperties); QTDisposeAtomContainer(myTrackProperties); } }
void ofxEtherPEG::update() { const unsigned char *ethernetPacket; const Packet *p; struct pcap_pkthdr header; ethernetPacket = pcap_next( pcap_session, &header ); if( ethernetPacket ) { if( *(unsigned short *)(ethernetPacket+12) == EndianU16_NtoB(0x0800) ) { // ETHERTYPE_IP // skip ethernet header: 6 byte source, 6 byte dest, 2 byte type p = (Packet *)( ethernetPacket + 6 + 6 + 2 ); } else if( *(unsigned short *)(ethernetPacket+12) == EndianU16_NtoB(0x8864) ) { // ETHERTYPE_??? // skip ethernet header: 6 byte source, 6 byte dest, 2 byte type, // plus 8 bytes I don't know much about, but often seemed to be // 11 00 07 fb 05 b0 00 21. something about promiscuous mode? p = (Packet *)( ethernetPacket + 6 + 6 + 2 + 8 ); } else { // some other kind of packet -- no concern of ours return; } #if 0 if (p->protocol != 6) printf("p->protocol != 6\n"); else if ((p->versionAndIHL & 0x0F) != 5) printf("(p->versionAndIHL & 0x0F) != 5\n"); else if ((p->totalLength < 40) && !(p->moreFlagsAndJunk & kFINBit)) printf("(p->totalLength < 40) && !(p->moreFlagsAndJunk & kFINBit)\n"); #endif if ((p->protocol == 6) && ((p->versionAndIHL & 0x0F) == 5)) { if ((p->totalLength > 40) || (p->moreFlagsAndJunk & kFINBit)) { createBlob(ConsumePacket( p )); } else createBlob( 0 ); // yellow } else createBlob( 0 ); // yellow } }
// Create the 'nclc' atom for video tracks. Guessed entirely from image size following ffdshow. // FIXME: read H.264 VUI/MPEG2 etc and especially read chroma positioning information. // this needs the parsers working // References: http://developer.apple.com/quicktime/icefloe/dispatch019.html // http://www.mir.com/DMG/chroma.html void set_track_colorspace_ext(ImageDescriptionHandle imgDescHandle, Fixed displayW, Fixed displayH) { ImageDescription *imgDesc = *imgDescHandle; Boolean isHd, isPAL; // otherwise NTSC AVRational palRatio = (AVRational) {5, 4}, displayRatio = (AVRational) { displayW, displayH }; int colorPrimaries, transferFunction, yuvMatrix; isHd = imgDesc->height > 576; isPAL = imgDesc->height == 576 || av_cmp_q(palRatio, displayRatio) == 0; NCLCColorInfoImageDescriptionExtension **nclc = (NCLCColorInfoImageDescriptionExtension**)NewHandle(sizeof(NCLCColorInfoImageDescriptionExtension)); if (isHd) { colorPrimaries = kQTPrimaries_ITU_R709_2; transferFunction = kQTTransferFunction_ITU_R709_2; yuvMatrix = kQTMatrix_ITU_R_709_2; } else if (isPAL) { colorPrimaries = kQTPrimaries_EBU_3213; transferFunction = kQTTransferFunction_ITU_R709_2; yuvMatrix = kQTMatrix_ITU_R_601_4; } else { colorPrimaries = kQTPrimaries_SMPTE_C; transferFunction = kQTTransferFunction_ITU_R709_2; yuvMatrix = kQTMatrix_ITU_R_601_4; } **nclc = (NCLCColorInfoImageDescriptionExtension) { EndianU32_NtoB(kVideoColorInfoImageDescriptionExtensionType), EndianU16_NtoB(colorPrimaries), EndianU16_NtoB(transferFunction), EndianU16_NtoB(yuvMatrix) }; AddImageDescriptionExtension(imgDescHandle, (Handle)nclc, kColorInfoImageDescriptionExtension); DisposeHandle((Handle)nclc); }
OSErr QTWired_CreateWiredSpritesMovie (void) { short myResRefNum = 0; short myResID = movieInDataForkResID; Movie myMovie = NULL; Track myTrack; Media myMedia; FSSpec myFile; Boolean myIsSelected = false; Boolean myIsReplacing = false; StringPtr myPrompt = QTUtils_ConvertCToPascalString(kWiredSavePrompt); StringPtr myFileName = QTUtils_ConvertCToPascalString(kWiredSaveFileName); QTAtomContainer mySample = NULL; QTAtomContainer myActions = NULL; QTAtomContainer myBeginButton, myPrevButton, myNextButton, myEndButton; QTAtomContainer myPenguinOne, myPenguinTwo, myPenguinOneOverride; QTAtomContainer myBeginActionButton, myPrevActionButton, myNextActionButton, myEndActionButton; QTAtomContainer myPenguinOneAction, myPenguinTwoAction; RGBColor myKeyColor; Point myLocation; short isVisible, myLayer, myIndex, myID, i, myDelta; Boolean hasActions; long myFlags = createMovieFileDeleteCurFile | createMovieFileDontCreateResFile; OSType myType = FOUR_CHAR_CODE('none'); UInt32 myFrequency; QTAtom myEventAtom; long myLoopingFlags; ModifierTrackGraphicsModeRecord myGraphicsMode; OSErr myErr = noErr; ////////// // // create a new movie file and set its controller type // ////////// // ask the user for the name of the new movie file QTFrame_PutFile(myPrompt, myFileName, &myFile, &myIsSelected, &myIsReplacing); if (!myIsSelected) goto bail; // create a movie file for the destination movie myErr = CreateMovieFile(&myFile, FOUR_CHAR_CODE('TVOD'), smSystemScript, myFlags, &myResRefNum, &myMovie); if (myErr != noErr) goto bail; // select the "no controller" movie controller myType = EndianU32_NtoB(myType); SetUserDataItem(GetMovieUserData(myMovie), &myType, sizeof(myType), kUserDataMovieControllerType, 1); ////////// // // create the sprite track and media // ////////// myTrack = NewMovieTrack(myMovie, ((long)kSpriteTrackWidth << 16), ((long)kSpriteTrackHeight << 16), kNoVolume); myMedia = NewTrackMedia(myTrack, SpriteMediaType, kSpriteMediaTimeScale, NULL, 0); ////////// // // create a key frame sample containing six sprites and all of their shared images // ////////// // create a new, empty key frame sample myErr = QTNewAtomContainer(&mySample); if (myErr != noErr) goto bail; myKeyColor.red = 0xffff; // white myKeyColor.green = 0xffff; myKeyColor.blue = 0xffff; // add images to the key frame sample SpriteUtils_AddPICTImageToKeyFrameSample(mySample, kGoToBeginningButtonUp, &myKeyColor, kGoToBeginningButtonUpIndex, NULL, NULL); SpriteUtils_AddPICTImageToKeyFrameSample(mySample, kGoToBeginningButtonDown, &myKeyColor, kGoToBeginningButtonDownIndex, NULL, NULL); SpriteUtils_AddPICTImageToKeyFrameSample(mySample, kGoToEndButtonUp, &myKeyColor, kGoToEndButtonUpIndex, NULL, NULL); SpriteUtils_AddPICTImageToKeyFrameSample(mySample, kGoToEndButtonDown, &myKeyColor, kGoToEndButtonDownIndex, NULL, NULL); SpriteUtils_AddPICTImageToKeyFrameSample(mySample, kGoToPrevButtonUp, &myKeyColor, kGoToPrevButtonUpIndex, NULL, NULL); SpriteUtils_AddPICTImageToKeyFrameSample(mySample, kGoToPrevButtonDown, &myKeyColor, kGoToPrevButtonDownIndex, NULL, NULL); SpriteUtils_AddPICTImageToKeyFrameSample(mySample, kGoToNextButtonUp, &myKeyColor, kGoToNextButtonUpIndex, NULL, NULL); SpriteUtils_AddPICTImageToKeyFrameSample(mySample, kGoToNextButtonDown, &myKeyColor, kGoToNextButtonDownIndex, NULL, NULL); SpriteUtils_AddPICTImageToKeyFrameSample(mySample, kPenguinForward, &myKeyColor, kPenguinForwardIndex, NULL, NULL); SpriteUtils_AddPICTImageToKeyFrameSample(mySample, kPenguinLeft, &myKeyColor, kPenguinLeftIndex, NULL, NULL); SpriteUtils_AddPICTImageToKeyFrameSample(mySample, kPenguinRight, &myKeyColor, kPenguinRightIndex, NULL, NULL); SpriteUtils_AddPICTImageToKeyFrameSample(mySample, kPenguinClosed, &myKeyColor, kPenguinClosedIndex, NULL, NULL); for (myIndex = kPenguinDownRightCycleStartIndex, myID = kWalkDownRightCycleStart; myIndex <= kPenguinDownRightCycleEndIndex; myIndex++, myID++) SpriteUtils_AddPICTImageToKeyFrameSample(mySample, myID, &myKeyColor, myIndex, NULL, NULL); // assign group IDs to the images SpriteUtils_AssignImageGroupIDsToKeyFrame(mySample); ////////// // // add samples to the sprite track's media // ////////// BeginMediaEdits(myMedia); // go to beginning button with no actions myErr = QTNewAtomContainer(&myBeginButton); if (myErr != noErr) goto bail; myLocation.h = (1 * kSpriteTrackWidth / 8) - (kStartEndButtonWidth / 2); myLocation.v = (4 * kSpriteTrackHeight / 5) - (kStartEndButtonHeight / 2); isVisible = false; myLayer = 1; myIndex = kGoToBeginningButtonUpIndex; myErr = SpriteUtils_SetSpriteData(myBeginButton, &myLocation, &isVisible, &myLayer, &myIndex, NULL, NULL, myActions); if (myErr != noErr) goto bail; // go to previous button with no actions myErr = QTNewAtomContainer(&myPrevButton); if (myErr != noErr) goto bail; myLocation.h = (3 * kSpriteTrackWidth / 8) - (kNextPrevButtonWidth / 2); myLocation.v = (4 * kSpriteTrackHeight / 5) - (kStartEndButtonHeight / 2); isVisible = false; myLayer = 1; myIndex = kGoToPrevButtonUpIndex; myErr = SpriteUtils_SetSpriteData(myPrevButton, &myLocation, &isVisible, &myLayer, &myIndex, NULL, NULL, myActions); if (myErr != noErr) goto bail; // go to next button with no actions myErr = QTNewAtomContainer(&myNextButton); if (myErr != noErr) goto bail; myLocation.h = (5 * kSpriteTrackWidth / 8) - (kNextPrevButtonWidth / 2); myLocation.v = (4 * kSpriteTrackHeight / 5) - (kStartEndButtonHeight / 2); isVisible = false; myLayer = 1; myIndex = kGoToNextButtonUpIndex; myErr = SpriteUtils_SetSpriteData(myNextButton, &myLocation, &isVisible, &myLayer, &myIndex, NULL, NULL, myActions); if (myErr != noErr) goto bail; // go to end button with no actions myErr = QTNewAtomContainer(&myEndButton); if (myErr != noErr) goto bail; myLocation.h = (7 * kSpriteTrackWidth / 8) - (kStartEndButtonWidth / 2); myLocation.v = (4 * kSpriteTrackHeight / 5) - (kStartEndButtonHeight / 2); isVisible = false; myLayer = 1; myIndex = kGoToEndButtonUpIndex; myErr = SpriteUtils_SetSpriteData(myEndButton, &myLocation, &isVisible, &myLayer, &myIndex, NULL, NULL, myActions); if (myErr != noErr) goto bail; // first penguin sprite with no actions myErr = QTNewAtomContainer(&myPenguinOne); if (myErr != noErr) goto bail; myLocation.h = (3 * kSpriteTrackWidth / 8) - (kPenguinWidth / 2); myLocation.v = (kSpriteTrackHeight / 4) - (kPenguinHeight / 2); isVisible = true; myLayer = 2; myIndex = kPenguinDownRightCycleStartIndex; myGraphicsMode.graphicsMode = blend; myGraphicsMode.opColor.red = myGraphicsMode.opColor.green = myGraphicsMode.opColor.blue = 0x8FFF; // grey myErr = SpriteUtils_SetSpriteData(myPenguinOne, &myLocation, &isVisible, &myLayer, &myIndex, &myGraphicsMode, NULL, myActions); if (myErr != noErr) goto bail; // second penguin sprite with no actions myErr = QTNewAtomContainer(&myPenguinTwo); if (myErr != noErr) goto bail; myLocation.h = (5 * kSpriteTrackWidth / 8) - (kPenguinWidth / 2); myLocation.v = (kSpriteTrackHeight / 4) - (kPenguinHeight / 2); isVisible = true; myLayer = 3; myIndex = kPenguinForwardIndex; myErr = SpriteUtils_SetSpriteData(myPenguinTwo, &myLocation, &isVisible, &myLayer, &myIndex, NULL, NULL, myActions); if (myErr != noErr) goto bail; ////////// // // add actions to the six sprites // ////////// // add go to beginning button myErr = QTCopyAtom(myBeginButton, kParentAtomIsContainer, &myBeginActionButton); if (myErr != noErr) goto bail; WiredUtils_AddSpriteSetImageIndexAction(myBeginActionButton, kParentAtomIsContainer, kQTEventMouseClick, 0, NULL, 0, 0, NULL, kGoToBeginningButtonDownIndex, NULL); WiredUtils_AddSpriteSetImageIndexAction(myBeginActionButton, kParentAtomIsContainer, kQTEventMouseClickEnd, 0, NULL, 0, 0, NULL, kGoToBeginningButtonUpIndex, NULL); WiredUtils_AddMovieGoToBeginningAction(myBeginActionButton, kParentAtomIsContainer, kQTEventMouseClickEndTriggerButton); WiredUtils_AddSpriteSetVisibleAction(myBeginActionButton, kParentAtomIsContainer, kQTEventMouseEnter, 0, NULL, 0, 0, NULL, true, NULL); WiredUtils_AddSpriteSetVisibleAction(myBeginActionButton, kParentAtomIsContainer, kQTEventMouseExit, 0, NULL, 0, 0, NULL, false, NULL); SpriteUtils_AddSpriteToSample(mySample, myBeginActionButton, kGoToBeginningSpriteID); QTDisposeAtomContainer(myBeginActionButton); // add go to prev button myErr = QTCopyAtom(myPrevButton, kParentAtomIsContainer, &myPrevActionButton); if (myErr != noErr) goto bail; WiredUtils_AddSpriteSetImageIndexAction(myPrevActionButton, kParentAtomIsContainer, kQTEventMouseClick, 0, NULL, 0, 0, NULL, kGoToPrevButtonDownIndex, NULL); WiredUtils_AddSpriteSetImageIndexAction(myPrevActionButton, kParentAtomIsContainer, kQTEventMouseClickEnd, 0, NULL, 0, 0, NULL, kGoToPrevButtonUpIndex, NULL); WiredUtils_AddMovieStepBackwardAction(myPrevActionButton, kParentAtomIsContainer, kQTEventMouseClickEndTriggerButton); WiredUtils_AddSpriteSetVisibleAction(myPrevActionButton, kParentAtomIsContainer, kQTEventMouseEnter, 0, NULL, 0, 0, NULL, true, NULL); WiredUtils_AddSpriteSetVisibleAction(myPrevActionButton, kParentAtomIsContainer, kQTEventMouseExit, 0, NULL, 0, 0, NULL, false, NULL); SpriteUtils_AddSpriteToSample(mySample, myPrevActionButton, kGoToPrevSpriteID); QTDisposeAtomContainer(myPrevActionButton); // add go to next button myErr = QTCopyAtom(myNextButton, kParentAtomIsContainer, &myNextActionButton); if (myErr != noErr) goto bail; WiredUtils_AddSpriteSetImageIndexAction(myNextActionButton, kParentAtomIsContainer, kQTEventMouseClick, 0, NULL, 0, 0, NULL, kGoToNextButtonDownIndex, NULL); WiredUtils_AddSpriteSetImageIndexAction(myNextActionButton, kParentAtomIsContainer, kQTEventMouseClickEnd, 0, NULL, 0, 0, NULL, kGoToNextButtonUpIndex, NULL); WiredUtils_AddMovieStepForwardAction(myNextActionButton, kParentAtomIsContainer, kQTEventMouseClickEndTriggerButton); WiredUtils_AddSpriteSetVisibleAction(myNextActionButton, kParentAtomIsContainer, kQTEventMouseEnter, 0, NULL, 0, 0, NULL, true, NULL); WiredUtils_AddSpriteSetVisibleAction(myNextActionButton, kParentAtomIsContainer, kQTEventMouseExit, 0, NULL, 0, 0, NULL, false, NULL); SpriteUtils_AddSpriteToSample(mySample, myNextActionButton, kGoToNextSpriteID); QTDisposeAtomContainer(myNextActionButton); // add go to end button myErr = QTCopyAtom(myEndButton, kParentAtomIsContainer, &myEndActionButton); if (myErr != noErr) goto bail; WiredUtils_AddSpriteSetImageIndexAction(myEndActionButton, kParentAtomIsContainer, kQTEventMouseClick, 0, NULL, 0, 0, NULL, kGoToEndButtonDownIndex, NULL); WiredUtils_AddSpriteSetImageIndexAction(myEndActionButton, kParentAtomIsContainer, kQTEventMouseClickEnd, 0, NULL, 0, 0, NULL, kGoToEndButtonUpIndex, NULL); WiredUtils_AddMovieGoToEndAction(myEndActionButton, kParentAtomIsContainer, kQTEventMouseClickEndTriggerButton); WiredUtils_AddSpriteSetVisibleAction(myEndActionButton, kParentAtomIsContainer, kQTEventMouseEnter, 0, NULL, 0, 0, NULL, true, NULL); WiredUtils_AddSpriteSetVisibleAction(myEndActionButton, kParentAtomIsContainer, kQTEventMouseExit, 0, NULL, 0, 0, NULL, false, NULL); SpriteUtils_AddSpriteToSample(mySample, myEndActionButton, kGoToEndSpriteID); QTDisposeAtomContainer(myEndActionButton); // add penguin one myErr = QTCopyAtom(myPenguinOne, kParentAtomIsContainer, &myPenguinOneAction); if (myErr != noErr) goto bail; // show the buttons on mouse enter and hide them on mouse exit WiredUtils_AddSpriteSetVisibleAction(myPenguinOneAction, kParentAtomIsContainer, kQTEventMouseEnter, 0, NULL, 0, kTargetSpriteID, (void *)kGoToBeginningSpriteID, true, NULL); WiredUtils_AddSpriteSetVisibleAction(myPenguinOneAction, kParentAtomIsContainer, kQTEventMouseExit, 0, NULL, 0, kTargetSpriteID, (void *)kGoToBeginningSpriteID, false, NULL); WiredUtils_AddSpriteSetVisibleAction(myPenguinOneAction, kParentAtomIsContainer, kQTEventMouseEnter, 0, NULL, 0, kTargetSpriteID, (void *)kGoToPrevSpriteID, true, NULL); WiredUtils_AddSpriteSetVisibleAction(myPenguinOneAction, kParentAtomIsContainer, kQTEventMouseExit, 0, NULL, 0, kTargetSpriteID, (void *)kGoToPrevSpriteID, false, NULL); WiredUtils_AddSpriteSetVisibleAction(myPenguinOneAction, kParentAtomIsContainer, kQTEventMouseEnter, 0, NULL, 0, kTargetSpriteID, (void *)kGoToNextSpriteID, true, NULL); WiredUtils_AddSpriteSetVisibleAction(myPenguinOneAction, kParentAtomIsContainer, kQTEventMouseExit, 0, NULL, 0, kTargetSpriteID, (void *)kGoToNextSpriteID, false, NULL); WiredUtils_AddSpriteSetVisibleAction(myPenguinOneAction, kParentAtomIsContainer, kQTEventMouseEnter, 0, NULL, 0, kTargetSpriteID, (void *)kGoToEndSpriteID, true, NULL); WiredUtils_AddSpriteSetVisibleAction(myPenguinOneAction, kParentAtomIsContainer, kQTEventMouseExit, 0, NULL, 0, kTargetSpriteID, (void *)kGoToEndSpriteID, false, NULL); SpriteUtils_AddSpriteToSample(mySample, myPenguinOneAction, kPenguinOneSpriteID); QTWired_AddCursorChangeOnMouseOver(mySample, kPenguinOneSpriteID); QTDisposeAtomContainer(myPenguinOneAction); // add penguin two myErr = QTCopyAtom(myPenguinTwo, kParentAtomIsContainer, &myPenguinTwoAction); if (myErr != noErr) goto bail; // blink when clicked on WiredUtils_AddSpriteSetImageIndexAction(myPenguinTwoAction, kParentAtomIsContainer, kQTEventMouseClick, 0, NULL, 0, 0, NULL, kPenguinClosedIndex, NULL); WiredUtils_AddSpriteSetImageIndexAction(myPenguinTwoAction, kParentAtomIsContainer, kQTEventMouseClickEnd, 0, NULL, 0, 0, NULL, kPenguinForwardIndex, NULL); WiredUtils_AddQTEventAtom(myPenguinTwoAction, kParentAtomIsContainer, kQTEventMouseClickEndTriggerButton, &myEventAtom); // toggle the movie rate and both of the birds' graphics modes QTWired_AddPenguinTwoConditionalActions(myPenguinTwoAction, myEventAtom); QTWired_AddWraparoundMatrixOnIdle(myPenguinTwoAction); SpriteUtils_AddSpriteToSample(mySample, myPenguinTwoAction, kPenguinTwoSpriteID); QTDisposeAtomContainer(myPenguinTwoAction); // add an action for when the key frame is loaded, to set the movie's looping mode to palindrome; // note that this will actually be triggered every time the key frame is reloaded, // so if the operation was expensive we could use a conditional to test if we've already done it myLoopingFlags = loopTimeBase | palindromeLoopTimeBase; WiredUtils_AddMovieSetLoopingFlagsAction(mySample, kParentAtomIsContainer, kQTEventFrameLoaded, myLoopingFlags); // add the key frame sample to the sprite track media // // to add the sample data in a compressed form, you would use a QuickTime DataCodec to perform the // compression; replace the call to the utility AddSpriteSampleToMedia with a call to the utility // AddCompressedSpriteSampleToMedia to do this SpriteUtils_AddSpriteSampleToMedia(myMedia, mySample, kSpriteMediaFrameDuration, true, NULL); //SpriteUtils_AddCompressedSpriteSampleToMedia(myMedia, mySample, kSpriteMediaFrameDuration, true, zlibDataCompressorSubType, NULL); ////////// // // add a few override samples to move penguin one and change its image index // ////////// // original penguin one location myLocation.h = (3 * kSpriteTrackWidth / 8) - (kPenguinWidth / 2); myLocation.v = (kSpriteTrackHeight / 4) - (kPenguinHeight / 2); myDelta = (kSpriteTrackHeight / 2) / kNumOverrideSamples; myIndex = kPenguinDownRightCycleStartIndex; for (i = 1; i <= kNumOverrideSamples; i++) { QTRemoveChildren(mySample, kParentAtomIsContainer); QTNewAtomContainer(&myPenguinOneOverride); myLocation.h += myDelta; myLocation.v += myDelta; myIndex++; if (myIndex > kPenguinDownRightCycleEndIndex) myIndex = kPenguinDownRightCycleStartIndex; SpriteUtils_SetSpriteData(myPenguinOneOverride, &myLocation, NULL, NULL, &myIndex, NULL, NULL, NULL); SpriteUtils_AddSpriteToSample(mySample, myPenguinOneOverride, kPenguinOneSpriteID); SpriteUtils_AddSpriteSampleToMedia(myMedia, mySample, kSpriteMediaFrameDuration, false, NULL); QTDisposeAtomContainer(myPenguinOneOverride); } EndMediaEdits(myMedia); // add the media to the track InsertMediaIntoTrack(myTrack, 0, 0, GetMediaDuration(myMedia), fixed1); ////////// // // set the sprite track properties // ////////// { QTAtomContainer myTrackProperties; RGBColor myBackgroundColor; // add a background color to the sprite track myBackgroundColor.red = EndianU16_NtoB(0x8000); myBackgroundColor.green = EndianU16_NtoB(0); myBackgroundColor.blue = EndianU16_NtoB(0xffff); QTNewAtomContainer(&myTrackProperties); QTInsertChild(myTrackProperties, 0, kSpriteTrackPropertyBackgroundColor, 1, 1, sizeof(RGBColor), &myBackgroundColor, NULL); // tell the movie controller that this sprite track has actions, Jackson hasActions = true; QTInsertChild(myTrackProperties, 0, kSpriteTrackPropertyHasActions, 1, 1, sizeof(hasActions), &hasActions, NULL); // tell the sprite track to generate QTIdleEvents myFrequency = EndianU32_NtoB(2); QTInsertChild(myTrackProperties, 0, kSpriteTrackPropertyQTIdleEventsFrequency, 1, 1, sizeof(myFrequency), &myFrequency, NULL); myErr = SetMediaPropertyAtom(myMedia, myTrackProperties); if (myErr != noErr) goto bail; QTDisposeAtomContainer(myTrackProperties); } ////////// // // finish up // ////////// // add the movie resource to the movie file myErr = AddMovieResource(myMovie, myResRefNum, &myResID, myFile.name); bail: free(myPrompt); free(myFileName); if (mySample != NULL) QTDisposeAtomContainer(mySample); if (myBeginButton != NULL) QTDisposeAtomContainer(myBeginButton); if (myPrevButton != NULL) QTDisposeAtomContainer(myPrevButton); if (myNextButton != NULL) QTDisposeAtomContainer(myNextButton); if (myEndButton != NULL) QTDisposeAtomContainer(myEndButton); if (myResRefNum != 0) CloseMovieFile(myResRefNum); if (myMovie != NULL) DisposeMovie(myMovie); return(myErr); }
OSErr SpriteUtils_SetSpriteData (QTAtomContainer theSprite, Point *theLocation, short *theVisible, short *theLayer, short *theImageIndex, ModifierTrackGraphicsModeRecord *theGraphicsMode, StringPtr theSpriteName, QTAtomContainer theActionAtoms) { QTAtom myPropertyAtom; OSErr myErr = noErr; if (theSprite == NULL) return(paramErr); // set the sprite location data if (theLocation != NULL) { MatrixRecord myMatrix; SetIdentityMatrix(&myMatrix); myMatrix.matrix[2][0] = ((long)theLocation->h << 16); myMatrix.matrix[2][1] = ((long)theLocation->v << 16); EndianUtils_MatrixRecord_NtoB(&myMatrix); myPropertyAtom = QTFindChildByIndex(theSprite, kParentAtomIsContainer, kSpritePropertyMatrix, 1, NULL); if (myPropertyAtom == 0) myErr = QTInsertChild(theSprite, kParentAtomIsContainer, kSpritePropertyMatrix, 1, 0, sizeof(MatrixRecord), &myMatrix, NULL); else myErr = QTSetAtomData(theSprite, myPropertyAtom, sizeof(MatrixRecord), &myMatrix); if (myErr != noErr) goto bail; } // set the sprite visibility state if (theVisible != NULL) { short myVisible = *theVisible; myVisible = EndianS16_NtoB(myVisible); myPropertyAtom = QTFindChildByIndex(theSprite, kParentAtomIsContainer, kSpritePropertyVisible, 1, NULL); if (myPropertyAtom == 0) myErr = QTInsertChild(theSprite, kParentAtomIsContainer, kSpritePropertyVisible, 1, 0, sizeof(short), &myVisible, NULL); else myErr = QTSetAtomData(theSprite, myPropertyAtom, sizeof(short), &myVisible); if (myErr != noErr) goto bail; } // set the sprite layer if (theLayer != NULL) { short myLayer = *theLayer; myLayer = EndianS16_NtoB(myLayer); myPropertyAtom = QTFindChildByIndex(theSprite, 0, kSpritePropertyLayer, 1, NULL); if (myPropertyAtom == 0) myErr = QTInsertChild(theSprite, 0, kSpritePropertyLayer, 1, 0, sizeof(short), &myLayer, NULL); else myErr = QTSetAtomData(theSprite, myPropertyAtom, sizeof(short), &myLayer); if (myErr != noErr) goto bail; } // set the sprite image index if (theImageIndex != NULL) { short myImageIndex = *theImageIndex; myImageIndex = EndianS16_NtoB(myImageIndex); myPropertyAtom = QTFindChildByIndex(theSprite, kParentAtomIsContainer, kSpritePropertyImageIndex, 1, NULL); if (myPropertyAtom == 0) myErr = QTInsertChild(theSprite, kParentAtomIsContainer, kSpritePropertyImageIndex, 1, 0, sizeof(short), &myImageIndex, NULL); else myErr = QTSetAtomData(theSprite, myPropertyAtom, sizeof(short), &myImageIndex); if (myErr != noErr) goto bail; } // set the sprite graphics mode if (theGraphicsMode != NULL) { ModifierTrackGraphicsModeRecord myGraphicsMode; myGraphicsMode.graphicsMode = EndianU32_NtoB(theGraphicsMode->graphicsMode); myGraphicsMode.opColor.red = EndianU16_NtoB(theGraphicsMode->opColor.red); myGraphicsMode.opColor.green = EndianU16_NtoB(theGraphicsMode->opColor.green); myGraphicsMode.opColor.blue = EndianU16_NtoB(theGraphicsMode->opColor.blue); myPropertyAtom = QTFindChildByIndex(theSprite, kParentAtomIsContainer, kSpritePropertyGraphicsMode, 1, NULL); if (myPropertyAtom == 0) myErr = QTInsertChild(theSprite, kParentAtomIsContainer, kSpritePropertyGraphicsMode, 1, 0, sizeof(myGraphicsMode), &myGraphicsMode, NULL); else myErr = QTSetAtomData(theSprite, myPropertyAtom, sizeof(myGraphicsMode), &myGraphicsMode); if (myErr != noErr) goto bail; } // set the sprite name if (theSpriteName != NULL) { QTAtom mySpriteNameAtom; mySpriteNameAtom = QTFindChildByIndex(theSprite, kParentAtomIsContainer, kSpriteNameAtomType, 1, NULL); if (mySpriteNameAtom == 0) myErr = QTInsertChild(theSprite, kParentAtomIsContainer, kSpriteNameAtomType, 1, 0, theSpriteName[0] + 1, theSpriteName, NULL); else myErr = QTSetAtomData(theSprite, mySpriteNameAtom, theSpriteName[0] + 1, theSpriteName); if (myErr != noErr) goto bail; } // set the action atoms if (theActionAtoms != NULL) myErr = QTInsertChildren(theSprite, kParentAtomIsContainer, theActionAtoms); bail: if ((myErr != noErr) && (theSprite != NULL)) QTRemoveChildren(theSprite, 0); return(myErr); }
void QTVectors_CreateVectorMovie (UInt32 theBuildAtomMethod) { Handle myHandle = NULL; ImageDescriptionHandle mySampleDesc = NULL; short myResRefNum = 0; short myResID = movieInDataForkResID; Movie myMovie = NULL; Track myTrack; Media myMedia; FSSpec myFile; Boolean myIsSelected = false; Boolean myIsReplacing = false; StringPtr myPrompt = QTUtils_ConvertCToPascalString(kVectorSavePrompt); StringPtr myFileName = QTUtils_ConvertCToPascalString(kVectorSaveMovieFileName); ComponentInstance myComponent; ComponentResult myResult; long myFlags = createMovieFileDeleteCurFile | createMovieFileDontCreateResFile; OSErr myErr = noErr; // METHOD ONE: use a raw data stream if (theBuildAtomMethod == kUseRawDataStream) { // kUseRawDataStream: build the vector data using a stream of hard-coded raw data // NOTE: the data in the stream *must* be big-endian, since it's stored in a QuickTime atom container. long myPath[] = { EndianU32_NtoB(kSizeOfSizeAndTagFields + sizeof(long)), EndianU32_NtoB(kCurveAntialiasControlAtom), EndianU32_NtoB(kCurveAntialiasOn), EndianU32_NtoB(kSizeOfSizeAndTagFields + sizeof(long)), EndianU32_NtoB(kCurveFillTypeAtom), EndianU32_NtoB(gxEvenOddFill), // a big white enclosing rectangle (600 x 600) EndianU32_NtoB(kSizeOfSizeAndTagFields + sizeof(ARGBColor)), EndianU32_NtoB(kCurveARGBColorAtom), EndianU32_NtoB(0xffffffff), // alpha, red EndianU32_NtoB(0xffffffff), // green, blue // it's white! EndianU32_NtoB(kSizeOfSizeAndTagFields + sizeof(long)*11), EndianU32_NtoB(kCurvePathAtom), EndianU32_NtoB(1), // one contour in path EndianU32_NtoB(4), // four points in path EndianU32_NtoB(0x00000000), // all points are on the curve: it's a rectangle! EndianU32_NtoB(0x00000000), EndianU32_NtoB(0x00000000), // top left EndianU32_NtoB(0x02580000), EndianU32_NtoB(0x00000000), // top right EndianU32_NtoB(0x02580000), EndianU32_NtoB(0x02580000), // bottom right EndianU32_NtoB(0x00000000), EndianU32_NtoB(0x02580000), // bottom left // a black rounded square, centered at 150,150 EndianU32_NtoB(kSizeOfSizeAndTagFields + sizeof(ARGBColor)), EndianU32_NtoB(kCurveARGBColorAtom), EndianU32_NtoB(0x00000000), // alpha, red EndianU32_NtoB(0x00000000), // green, blue // it's black! EndianU32_NtoB(kSizeOfSizeAndTagFields + sizeof(long)*11), EndianU32_NtoB(kCurvePathAtom), EndianU32_NtoB(1), // one contour in path EndianU32_NtoB(4), // four points in path EndianU32_NtoB(0xffffffff), // all points are off the curve: it's a rounded square! EndianU32_NtoB(0x00640000), EndianU32_NtoB(0x00640000), EndianU32_NtoB(0x00C80000), EndianU32_NtoB(0x00640000), EndianU32_NtoB(0x00C80000), EndianU32_NtoB(0x00C80000), EndianU32_NtoB(0x00640000), EndianU32_NtoB(0x00C80000), EndianU32_NtoB(kSizeOfSizeAndTagFields + sizeof(long)), EndianU32_NtoB(kCurveFillTypeAtom), EndianU32_NtoB(gxEvenOddFill), EndianU32_NtoB(kSizeOfSizeAndTagFields + sizeof(long)), EndianU32_NtoB(kCurvePenThicknessAtom), EndianU32_NtoB(0x100000), // enable linear gradient for all following atoms EndianU32_NtoB(kSizeOfSizeAndTagFields + sizeof(long)), EndianU32_NtoB(kCurveGradientTypeAtom), EndianU32_NtoB(kLinearGradient), // define the gradient: red -> green -> red -> blue EndianU32_NtoB(kSizeOfSizeAndTagFields + sizeof(GradientColorRecord)*4), EndianU32_NtoB(kCurveGradientRecordAtom), EndianU32_NtoB(0xffffffff), // gradient color record 1: EndianU32_NtoB(0x00000000), // red EndianU32_NtoB(0x00000000), // beginning of gradient EndianU32_NtoB(0x77770000), // gradient color record 2: EndianU32_NtoB(0xffff0000), // green EndianU32_NtoB(0x00004000), EndianU32_NtoB(0x3333ffff), // gradient color record 3: EndianU32_NtoB(0x00000000), // red EndianU32_NtoB(0x0000C000), EndianU32_NtoB(0xffff0000), // gradient color record 4: EndianU32_NtoB(0x0000ffff), // blue EndianU32_NtoB(0x00010000), // end of gradient EndianU32_NtoB(kSizeOfSizeAndTagFields + sizeof(long)), EndianU32_NtoB(kCurveGradientAngleAtom), EndianU32_NtoB(0x00450000), // gradient at 45û angle // a green rectangle, centered at 40,40, painted with a linear gradient EndianU32_NtoB(kSizeOfSizeAndTagFields + sizeof(ARGBColor)), EndianU32_NtoB(kCurveARGBColorAtom), EndianU32_NtoB(0x00000000), // alpha, red EndianU32_NtoB(0xffff0000), // green, blue // it's green! EndianU32_NtoB(kSizeOfSizeAndTagFields + sizeof(long)*11), EndianU32_NtoB(kCurvePathAtom), EndianU32_NtoB(1), // one contour in path EndianU32_NtoB(4), // four points in path EndianU32_NtoB(0x00000000), // all points are on the curve: it's a rectangle! EndianU32_NtoB(0x00100000), EndianU32_NtoB(0x00100000), EndianU32_NtoB(0x00400000), EndianU32_NtoB(0x00100000), EndianU32_NtoB(0x00400000), EndianU32_NtoB(0x00400000), EndianU32_NtoB(0x00100000), EndianU32_NtoB(0x00400000), // disable gradient for all following atoms (since no atom data) EndianU32_NtoB(kSizeOfSizeAndTagFields), EndianU32_NtoB(kCurveGradientRecordAtom), // a red rounded square, centered at 50,50 EndianU32_NtoB(kSizeOfSizeAndTagFields + sizeof(ARGBColor)), EndianU32_NtoB(kCurveARGBColorAtom), EndianU32_NtoB(0x3333ffff), // alpha, red EndianU32_NtoB(0x00000000), // green, blue // it's red! EndianU32_NtoB(kSizeOfSizeAndTagFields + sizeof(long)*11), EndianU32_NtoB(kCurvePathAtom), EndianU32_NtoB(1L), // one contour in path EndianU32_NtoB(4L), // four points in path EndianU32_NtoB(0xffffffff), // all points are off the curve: it's a rounded square! EndianU32_NtoB(0x001e0000), EndianU32_NtoB(0x001e0000), EndianU32_NtoB(0x00460000), EndianU32_NtoB(0x001e0000), EndianU32_NtoB(0x00460000), EndianU32_NtoB(0x00460000), EndianU32_NtoB(0x001e0000), EndianU32_NtoB(0x00460000), EndianU32_NtoB(kSizeOfZeroAtomHeader), EndianU32_NtoB(kCurveEndAtom), }; myHandle = NewHandle(sizeof(myPath)); if (myHandle == NULL) goto bail; BlockMove(myPath, *myHandle, sizeof(myPath)); } // end of kUseRawDataStream // METHOD TWO: use the Curve Utilities API if (theBuildAtomMethod == kUseCurveUtilities) { // kUseCurveUtilities: build the vector data using the Curve Utilities API Handle myPath; gxPoint myPoint; long myAtomData[14]; ARGBColor myColor; GradientColorRecord myGradients[4]; // open the vector codec; we'll need it for some subsequent calls myComponent = OpenDefaultComponent(decompressorComponentType, kVectorCodecType); if (myComponent == NULL) goto bail; // create a new, empty vector data stream myResult = CurveCreateVectorStream(myComponent, &myHandle); if (myResult != noErr) goto bail; // now start adding atoms holding the vector data // set antialiasing on myAtomData[0] = EndianU32_NtoB(kCurveAntialiasOn); CurveAddAtomToVectorStream(myComponent, kCurveAntialiasControlAtom, sizeof(long), myAtomData, myHandle); // set fill type myAtomData[0] = EndianU32_NtoB(gxEvenOddFill); CurveAddAtomToVectorStream(myComponent, kCurveFillTypeAtom, sizeof(long), myAtomData, myHandle); // a big white enclosing rectangle (600 x 600) myColor.alpha = EndianU16_NtoB(0xffff); myColor.red = EndianU16_NtoB(0xffff); myColor.green = EndianU16_NtoB(0xffff); myColor.blue = EndianU16_NtoB(0xffff); CurveAddAtomToVectorStream(myComponent, kCurveARGBColorAtom, sizeof(ARGBColor), &myColor, myHandle); #if USE_CURVE_INSERT_POINT_INTO_PATH // create a new, empty path CurveNewPath(myComponent, &myPath); myPoint.x = 0x00000000; myPoint.y = 0x00000000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 0, true); myPoint.x = 0x02580000; myPoint.y = 0x00000000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 1, true); myPoint.x = 0x02580000; myPoint.y = 0x02580000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 2, true); myPoint.x = 0x00000000; myPoint.y = 0x02580000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 3, true); // add the 'path' atom to the vector data stream CurveAddPathAtomToVectorStream(myComponent, myPath, myHandle); DisposeHandle(myPath); #else myAtomData[0] = EndianU32_NtoB(1L); myAtomData[1] = EndianU32_NtoB(4L); myAtomData[2] = EndianU32_NtoB(0x00000000); myAtomData[3] = EndianU32_NtoB(0x00000000); myAtomData[4] = EndianU32_NtoB(0x00000000); myAtomData[5] = EndianU32_NtoB(0x02580000); myAtomData[6] = EndianU32_NtoB(0x00000000); myAtomData[7] = EndianU32_NtoB(0x02580000); myAtomData[8] = EndianU32_NtoB(0x02580000); myAtomData[9] = EndianU32_NtoB(0x00000000); myAtomData[10] = EndianU32_NtoB(0x02580000); CurveAddAtomToVectorStream(myComponent, kCurvePathAtom, sizeof(long)*11, myAtomData, myHandle); #endif // a black rounded square, centered at 150,150 myColor.alpha = EndianU16_NtoB(0x0000); myColor.red = EndianU16_NtoB(0x0000); myColor.green = EndianU16_NtoB(0x0000); myColor.blue = EndianU16_NtoB(0x0000); CurveAddAtomToVectorStream(myComponent, kCurveARGBColorAtom, sizeof(ARGBColor), &myColor, myHandle); #if USE_CURVE_INSERT_POINT_INTO_PATH // create a new, empty path CurveNewPath(myComponent, &myPath); myPoint.x = 0x00640000; myPoint.y = 0x00640000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 0, false); myPoint.x = 0x00C80000; myPoint.y = 0x00640000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 1, false); myPoint.x = 0x00C80000; myPoint.y = 0x00C80000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 2, false); myPoint.x = 0x00640000; myPoint.y = 0x00C80000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 3, false); // add the 'path' atom to the vector data stream CurveAddPathAtomToVectorStream(myComponent, myPath, myHandle); DisposeHandle(myPath); #else myAtomData[0] = EndianU32_NtoB(1L); myAtomData[1] = EndianU32_NtoB(4L); myAtomData[2] = EndianU32_NtoB(0xffffffff); myAtomData[3] = EndianU32_NtoB(0x00640000); myAtomData[4] = EndianU32_NtoB(0x00640000); myAtomData[5] = EndianU32_NtoB(0x00C80000); myAtomData[6] = EndianU32_NtoB(0x00640000); myAtomData[7] = EndianU32_NtoB(0x00C80000); myAtomData[8] = EndianU32_NtoB(0x00C80000); myAtomData[9] = EndianU32_NtoB(0x00640000); myAtomData[10] = EndianU32_NtoB(0x00C80000); CurveAddAtomToVectorStream(myComponent, kCurvePathAtom, sizeof(long)*11, myAtomData, myHandle); #endif // set fill type myAtomData[0] = EndianU32_NtoB(gxEvenOddFill); CurveAddAtomToVectorStream(myComponent, kCurveFillTypeAtom, sizeof(long), myAtomData, myHandle); // set pen thickness myAtomData[0] = EndianU32_NtoB(0x100000); CurveAddAtomToVectorStream(myComponent, kCurvePenThicknessAtom, sizeof(long), myAtomData, myHandle); // enable linear gradient for all following atoms myAtomData[0] = EndianU32_NtoB(kLinearGradient); CurveAddAtomToVectorStream(myComponent, kCurveGradientTypeAtom, sizeof(long), myAtomData, myHandle); // define the gradient: red -> green -> red -> blue myGradients[0].thisColor.alpha = EndianU16_NtoB(0xffff); myGradients[0].thisColor.red = EndianU16_NtoB(0xffff); myGradients[0].thisColor.green = EndianU16_NtoB(0x0000); myGradients[0].thisColor.blue = EndianU16_NtoB(0x0000); myGradients[0].endingPercentage = EndianU32_NtoB(0x00000000); myGradients[1].thisColor.alpha = EndianU16_NtoB(0x7777); myGradients[1].thisColor.red = EndianU16_NtoB(0x0000); myGradients[1].thisColor.green = EndianU16_NtoB(0xffff); myGradients[1].thisColor.blue = EndianU16_NtoB(0x0000); myGradients[1].endingPercentage = EndianU32_NtoB(0x00004000); myGradients[2].thisColor.alpha = EndianU16_NtoB(0x3333); myGradients[2].thisColor.red = EndianU16_NtoB(0xffff); myGradients[2].thisColor.green = EndianU16_NtoB(0x0000); myGradients[2].thisColor.blue = EndianU16_NtoB(0x0000); myGradients[2].endingPercentage = EndianU32_NtoB(0x0000C000); myGradients[3].thisColor.alpha = EndianU16_NtoB(0xffff); myGradients[3].thisColor.red = EndianU16_NtoB(0x0000); myGradients[3].thisColor.green = EndianU16_NtoB(0x0000); myGradients[3].thisColor.blue = EndianU16_NtoB(0xffff); myGradients[3].endingPercentage = EndianU32_NtoB(0x00010000); CurveAddAtomToVectorStream(myComponent, kCurveGradientRecordAtom, sizeof(GradientColorRecord)*4, myGradients, myHandle); // set gradient angle myAtomData[0] = EndianU32_NtoB(0x00450000); CurveAddAtomToVectorStream(myComponent, kCurveGradientAngleAtom, sizeof(long), myAtomData, myHandle); // a green rectangle, centered at 40,40, painted with a linear gradient myColor.alpha = EndianU16_NtoB(0x0000); myColor.red = EndianU16_NtoB(0x0000); myColor.green = EndianU16_NtoB(0xffff); myColor.blue = EndianU16_NtoB(0x0000); CurveAddAtomToVectorStream(myComponent, kCurveARGBColorAtom, sizeof(ARGBColor), &myColor, myHandle); #if USE_CURVE_INSERT_POINT_INTO_PATH // create a new, empty path CurveNewPath(myComponent, &myPath); myPoint.x = 0x00100000; myPoint.y = 0x00100000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 0, true); myPoint.x = 0x00400000; myPoint.y = 0x00100000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 1, true); myPoint.x = 0x00400000; myPoint.y = 0x00400000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 2, true); myPoint.x = 0x00100000; myPoint.y = 0x00400000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 3, true); // add the 'path' atom to the vector data stream CurveAddPathAtomToVectorStream(myComponent, myPath, myHandle); DisposeHandle(myPath); #else myAtomData[0] = EndianU32_NtoB(1L); myAtomData[1] = EndianU32_NtoB(4L); myAtomData[2] = EndianU32_NtoB(0x00000000); myAtomData[3] = EndianU32_NtoB(0x00100000); myAtomData[4] = EndianU32_NtoB(0x00100000); myAtomData[5] = EndianU32_NtoB(0x00400000); myAtomData[6] = EndianU32_NtoB(0x00100000); myAtomData[7] = EndianU32_NtoB(0x00400000); myAtomData[8] = EndianU32_NtoB(0x00400000); myAtomData[9] = EndianU32_NtoB(0x00100000); myAtomData[10] = EndianU32_NtoB(0x00400000); CurveAddAtomToVectorStream(myComponent, kCurvePathAtom, sizeof(long)*11, myAtomData, myHandle); #endif // disable gradient for all following atoms (since no atom data) CurveAddAtomToVectorStream(myComponent, kCurveGradientTypeAtom, 0, NULL, myHandle); // a red rounded square, centered at 50,50 myColor.alpha = EndianU16_NtoB(0x3333); myColor.red = EndianU16_NtoB(0xffff); myColor.green = EndianU16_NtoB(0x0000); myColor.blue = EndianU16_NtoB(0x0000); CurveAddAtomToVectorStream(myComponent, kCurveARGBColorAtom, sizeof(ARGBColor), &myColor, myHandle); #if USE_CURVE_INSERT_POINT_INTO_PATH // create a new, empty path CurveNewPath(myComponent, &myPath); myPoint.x = 0x001e0000; myPoint.y = 0x001e0000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 0, false); myPoint.x = 0x00460000; myPoint.y = 0x001e0000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 1, false); myPoint.x = 0x00460000; myPoint.y = 0x00460000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 2, false); myPoint.x = 0x001e0000; myPoint.y = 0x00460000; CurveInsertPointIntoPath(myComponent, &myPoint, myPath, 0, 3, false); // add the 'path' atom to the vector data stream CurveAddPathAtomToVectorStream(myComponent, myPath, myHandle); DisposeHandle(myPath); #else myAtomData[0] = EndianU32_NtoB(1L); myAtomData[1] = EndianU32_NtoB(4L); myAtomData[2] = EndianU32_NtoB(0xffffffff); myAtomData[3] = EndianU32_NtoB(0x001e0000); myAtomData[4] = EndianU32_NtoB(0x001e0000); myAtomData[5] = EndianU32_NtoB(0x00460000); myAtomData[6] = EndianU32_NtoB(0x001e0000); myAtomData[7] = EndianU32_NtoB(0x00460000); myAtomData[8] = EndianU32_NtoB(0x00460000); myAtomData[9] = EndianU32_NtoB(0x001e0000); myAtomData[10] = EndianU32_NtoB(0x00460000); CurveAddAtomToVectorStream(myComponent, kCurvePathAtom, sizeof(long)*11, myAtomData, myHandle); #endif // add the 'zero' atom to the vector data stream CurveAddZeroAtomToVectorStream(myComponent, myHandle); } // end of kUseCurveUtilities // create the image description mySampleDesc = (ImageDescriptionHandle)NewHandleClear(sizeof(ImageDescription)); if (mySampleDesc == NULL) goto bail; // fill in the fields of the image description (**mySampleDesc).idSize = sizeof(ImageDescription); (**mySampleDesc).cType = kVectorCodecType; (**mySampleDesc).vendor = kAppleManufacturer; (**mySampleDesc).temporalQuality = codecNormalQuality; (**mySampleDesc).spatialQuality = codecNormalQuality; (**mySampleDesc).width = 300; (**mySampleDesc).height = 300; (**mySampleDesc).hRes = 72L << 16; (**mySampleDesc).vRes = 72L << 16; (**mySampleDesc).dataSize = 0L; (**mySampleDesc).frameCount = 1; (**mySampleDesc).depth = 0; (**mySampleDesc).clutID = -1; // prompt user for new file name QTFrame_PutFile(myPrompt, myFileName, &myFile, &myIsSelected, &myIsReplacing); if (!myIsSelected) goto bail; // create a movie file for the destination movie myErr = CreateMovieFile(&myFile, FOUR_CHAR_CODE('TVOD'), smCurrentScript, myFlags, &myResRefNum, &myMovie); if (myErr != noErr) goto bail; // create the vector track and media myTrack = NewMovieTrack(myMovie, FixDiv(300, 1), FixDiv(300, 1), kNoVolume); myMedia = NewTrackMedia(myTrack, VideoMediaType, 600, NULL, 0); // create the vector media sample BeginMediaEdits(myMedia); myErr = AddMediaSample(myMedia, myHandle, 0, GetHandleSize(myHandle), 600, (SampleDescriptionHandle)mySampleDesc, 1, 0, NULL); if (myErr != noErr) goto bail; EndMediaEdits(myMedia); // add the media to the track InsertMediaIntoTrack(myTrack, 0, 0, GetMediaDuration(myMedia), fixed1); AddMovieResource(myMovie, myResRefNum, &myResID, NULL); bail: free(myPrompt); free(myFileName); if (mySampleDesc != NULL) DisposeHandle((Handle)mySampleDesc); if (myResRefNum != 0) CloseMovieFile(myResRefNum); if (myHandle != NULL) DisposeHandle(myHandle); if (myMovie != NULL) DisposeMovie(myMovie); if (myComponent != NULL) CloseComponent(myComponent); }