QTMultiImage.c

//////////
//
//  File:       QTMultiImage.c
//
//  Contains:   Code for displaying multiple images contained in a single image file.
//
//  Written by: Tim Monroe
//
//  Copyright:  © 1998 by Apple Computer, Inc., all rights reserved.
//
//  Change History (most recent first):
//
//     <3>      03/21/00    rtm     changed QTMulti_ShowAllImagesInFile to use FSSpec parameter
//     <2>      10/30/98    rtm     cleaned up code; verified on both Mac and Windows
//     <1>      09/30/98    rtm     first file
//     
//  This file contains code that illustrates how to determine whether an image file contains 
//  more than one image and how to display any of those images. This is useful for working with
//  FlashPix files (which contain multiple resolutions of an image) and PhotoShop files (which
//  store layers as separate images), among others.
//
//  The key new functions to use are GraphicsImportGetImageCount and GraphicsImportSetImageIndex.
//  The rest of the image-handling is done using graphics importer routines that have previously
//  been available.
//
//  This file defines a single function that prompts the user for an image file, determines
//  how many images are contained in that file, and then displays each such image for a short
//  period of time (2 seconds).
//
//////////
 
#include "QTMultiImage.h"
 
WindowPtr                       gImageWindow = NULL;    // the window we display the image in
GraphicsImportComponent         gImporter = NULL;
 
 
//////////
//
// QTMulti_ShowAllImagesInFile
// Display all the images contained in the specified image file.
//
//////////
 
OSErr QTMulti_ShowAllImagesInFile (FSSpecPtr theFSSpecPtr)
{
    Rect                        myRect;
    unsigned long               myCount, myIndex, myIgnore;
    OSErr                       myErr = noErr;
 
    if (theFSSpecPtr == NULL)
        goto bail;
            
    //////////
    //
    // get a graphics importer for the image file and determine how many images are contained in it
    //
    //////////
 
    myErr = GetGraphicsImporterForFile(theFSSpecPtr, &gImporter);
    if (myErr != noErr)
        goto bail;
    
    myErr = GraphicsImportGetImageCount(gImporter, &myCount);
    if (myErr != noErr)
        goto bail;
    
    //////////
    //
    // loop thru all images the image file, drawing each into a window
    //
    //////////
    
    for (myIndex = 1; myIndex <= myCount; myIndex++) {
    
        // set the image index we want to display
        myErr = GraphicsImportSetImageIndex(gImporter, myIndex);
        if (myErr != noErr)
            goto bail;
        
        // determine the natural size of the image
        myErr = GraphicsImportGetNaturalBounds(gImporter, &myRect);
        if (myErr != noErr)
            goto bail;
            
        MacOffsetRect(&myRect, 50, 50);
        
        // create a window to display the image in
        gImageWindow = NewCWindow(NULL, &myRect, theFSSpecPtr->name, true, movableDBoxProc, (WindowPtr)-1L, true, 0);
        if (gImageWindow == NULL)
            goto bail;
        
        // set the current port and draw
        GraphicsImportSetGWorld(gImporter, (CGrafPtr)gImageWindow, NULL);       
        GraphicsImportDraw(gImporter);
        
        Delay(kImageDisplayTime, &myIgnore);
        DisposeWindow(gImageWindow);
    }
        
bail:
    if (myErr != noErr)
        if (gImporter != NULL)
            CloseComponent(gImporter);
        
    return(myErr);
}