/*
     File:       CGDataProvider.h
 
     Contains:   CoreGraphics data provider
 
     Version:    QuickTime 7.3
 
     Copyright:  (c) 2007 (c) 2000-2001 by Apple Computer, Inc., all rights reserved.
 
     Bugs?:      For bug reports, consult the following page on
                 the World Wide Web:
 
                     http://developer.apple.com/bugreporter/
 
*/
#ifndef CGDATAPROVIDER_H_
#define CGDATAPROVIDER_H_

#ifndef __CGBASE__
#include "CGBase.h"
#endif

#ifndef __CFURL__
#include "CFURL.h"
#endif




#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
    #pragma options align=mac68k
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
    #pragma pack(2)
#endif

typedef struct CGDataProvider*          CGDataProviderRef;
typedef CALLBACK_API_C( size_t , CGGetBytesProcPtr )(void *info, void *buffer, size_t count);
typedef CALLBACK_API_C( void , CGSkipBytesProcPtr )(void *info, size_t count);
typedef CALLBACK_API_C( void , CGRewindProcPtr )(void * info);
typedef CALLBACK_API_C( void , CGReleaseProviderProcPtr )(void * info);
/* Callbacks for sequentially accessing data.
 * `getBytes' is called to copy `count' bytes from the provider's data to
 * `buffer'.  It should return the number of bytes copied, or 0 if there's
 * no more data.
 * `skipBytes' is called to skip ahead in the provider's data by `count' bytes.
 * `rewind' is called to rewind the provider to the beginning of the data.
 * `releaseProvider', if non-NULL, is called when the provider is freed. */
struct CGDataProviderCallbacks {
  CGGetBytesProcPtr   getBytes;
  CGSkipBytesProcPtr  skipBytes;
  CGRewindProcPtr     rewind;
  CGReleaseProviderProcPtr  releaseProvider;
};
typedef struct CGDataProviderCallbacks  CGDataProviderCallbacks;
typedef CALLBACK_API_C( void *, CGGetBytePointerProcPtr )(void * info);
typedef CALLBACK_API_C( void , CGReleaseByteProcPtr )(void *info, const void *pointer);
typedef CALLBACK_API_C( size_t , CGGetBytesDirectProcPtr )(void *info, void *buffer, size_t offset, size_t count);
/* Callbacks for directly accessing data.
 * `getBytePointer', if non-NULL, is called to return a pointer to the
 * provider's entire block of data.
 * `releaseBytePointer', if non-NULL, is called to release a pointer to
 * the provider's entire block of data.
 * `getBytes', if non-NULL, is called to copy `count' bytes at offset
 * `offset' from the provider's data to `buffer'.  It should return the
 * number of bytes copied, or 0 if there's no more data.
 * `releaseProvider', if non-NULL, is called when the provider is freed.
 * At least one of `getBytePointer' or `getBytes' must be non-NULL.  */
struct CGDataProviderDirectAccessCallbacks {
  CGGetBytePointerProcPtr  getBytePointer;
  CGReleaseByteProcPtr  releaseBytePointer;
  CGGetBytesDirectProcPtr  getBytes;
  CGReleaseProviderProcPtr  releaseProvider;
};
typedef struct CGDataProviderDirectAccessCallbacks CGDataProviderDirectAccessCallbacks;
typedef CALLBACK_API_C( void , CGReleaseDataProcPtr )(void *info, const void *data, size_t size);
/* Create a sequential-access data provider using `callbacks' to provide
 * the data.  `info' is passed to each of the callback functions. */
/*
 *  CGDataProviderCreate()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         in version 10.0 and later
 */
EXTERN_API_C( CGDataProviderRef )
CGDataProviderCreate(
  void *                           info,
  const CGDataProviderCallbacks *  callbacks);


/* Create a direct-access data provider using `callbacks' to supply `size'
 * bytes of data. `info' is passed to each of the callback functions. */
/*
 *  CGDataProviderCreateDirectAccess()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         in version 10.0 and later
 */
EXTERN_API_C( CGDataProviderRef )
CGDataProviderCreateDirectAccess(
  void *                                       info,
  size_t                                       size,
  const CGDataProviderDirectAccessCallbacks *  callbacks);


/* Create a direct-access data provider using `data', an array of `size'
 * bytes.  `releaseData' is called when the data provider is freed, and is
 * passed `info' as its first argument. */
/*
 *  CGDataProviderCreateWithData()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         in version 10.0 and later
 */
EXTERN_API_C( CGDataProviderRef )
CGDataProviderCreateWithData(
  void *                 info,
  const void *           data,
  size_t                 size,
  CGReleaseDataProcPtr   releaseData);


/* Create a data provider using `url'. */
/*
 *  CGDataProviderCreateWithURL()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         in version 10.0 and later
 */
EXTERN_API_C( CGDataProviderRef )
CGDataProviderCreateWithURL(CFURLRef url);


/* Increment the retain count of `provider' and return it.  All data
 * providers are created with an initial retain count of 1. */
/*
 *  CGDataProviderRetain()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         in version 10.0 and later
 */
EXTERN_API_C( CGDataProviderRef )
CGDataProviderRetain(CGDataProviderRef provider);


/* Decrement the retain count of `provider'.  If the retain count reaches
 * 0, then free `provider' and any associated resources. */
/*
 *  CGDataProviderRelease()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         in version 10.0 and later
 */
EXTERN_API_C( void )
CGDataProviderRelease(CGDataProviderRef provider);



#if PRAGMA_STRUCT_ALIGN
    #pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
    #pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif

#endif /* CGDATAPROVIDER_H_ */

