/*
     File:       ScalerStreamTypes.h
 
     Contains:   Scaler streaming data structures and constants for OFA 1.x
 
     Version:    QuickTime 7.3
 
     Copyright:  (c) 2007 (c) 1994-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 __SCALERSTREAMTYPES__
#define __SCALERSTREAMTYPES__

#ifndef __MACTYPES__
#include "MacTypes.h"
#endif

#ifndef __SFNTTYPES__
#include "SFNTTypes.h"
#endif




#if PRAGMA_ONCE
#pragma once
#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

/* ScalerStream input/output types */
enum {
  cexec68K                      = 0x00000001,
  truetypeStreamType            = 0x00000001,
  type1StreamType               = 0x00000002,
  type3StreamType               = 0x00000004,
  type42StreamType              = 0x00000008,
  type42GXStreamType            = 0x00000010,
  portableStreamType            = 0x00000020,
  flattenedStreamType           = 0x00000040,
  cidType2StreamType            = 0x00000080,
  cidType0StreamType            = 0x00000100,
  type1CFFStreamType            = 0x00000200,
  evenOddModifierStreamType     = 0x00008000,
  eexecBinaryModifierStreamType = 0x00010000, /* encrypted portion of Type1Stream to be binary */
  unicodeMappingModifierStreamType = 0x00020000, /* include glyph ID to unicode mapping info for PDF */
  scalerSpecifcModifierMask     = 0x0000F000, /* for scaler's internal use */
  streamTypeModifierMask        = (long)0xFFFFF000 /* 16 bits for Apple, 4 bits for scaler */
};

/* Possible streamed font formats */
typedef unsigned long                   scalerStreamTypeFlag;
enum {
  downloadStreamAction          = 0,    /* Transmit the (possibly sparse) font data */
  asciiDownloadStreamAction     = 1,    /* Transmit font data to a 7-bit ASCII destination */
  fontSizeQueryStreamAction     = 2,    /* Estimate in-printer memory used if the font were downloaded */
  encodingOnlyStreamAction      = 3,    /* Transmit only the encoding for the font */
  prerequisiteQueryStreamAction = 4,    /* Return a list of prerequisite items needed for the font */
  prerequisiteItemStreamAction  = 5,    /* Transmit a specified prerequisite item */
  variationQueryStreamAction    = 6,    /* Return information regarding support for variation streaming */
  variationPSOperatorStreamAction = 7   /* Transmit Postscript code necessary to effect variation of a font */
};

typedef long                            scalerStreamAction;
enum {
  selectAllVariations           = -1    /* Special variationCount value meaning include all variation data */
};

struct scalerPrerequisiteItem {
  long                enumeration;            /* Shorthand tag identifying the item */
  long                size;                   /* Worst case vm in printer item requires */
  unsigned char       name[1];                /* Name to be used by the client when emitting the item (Pascal string) */
};
typedef struct scalerPrerequisiteItem   scalerPrerequisiteItem;
struct scalerStream {
  const void *        streamRefCon;           /* <- private reference for client */
  const char *        targetVersion;          /* <- e.g. Postscript printer name (C string) */
  scalerStreamTypeFlag  types;                /* <->    Data stream formats desired/supplied */
  scalerStreamAction  action;                 /* <-     What action to take */
  unsigned long       memorySize;             /* -> Worst case memory use (vm) in printer or as sfnt */
  long                variationCount;         /* <- The number of variations, or selectAllVariations */
  const void *        variations;             /* <- A pointer to an array of the variations (gxFontVariation) */
  union {
                                              /* Normal font streaming information*/
    struct {
      const unsigned short * encoding;        /* <- Intention is * unsigned short[256] */
      long *              glyphBits;          /* <->    Bitvector: a bit for each glyph, 1 = desired/supplied */
      char *              name;               /* <->    The printer font name to use/used (C string) */
    }                       font;

                                              /* Used to obtain a list of prerequisites from the scaler*/
    struct {
      long                size;               /* ->     Size of the prereq. list in bytes (0 indicates no prerequisites)*/
      void *              list;               /* <- Pointer to client block to hold list (nil = list size query only) */
    }                       prerequisiteQuery;

    long                prerequisiteItem;     /* <-     Enumeration value for the prerequisite item to be streamed.*/

    long                variationQueryResult; /* -> Output from the variationQueryStreamAction */
  }                       info;
};
typedef struct scalerStream             scalerStream;
struct scalerStreamData {
  long                hexFlag;                /* Indicates that the data is to be interpreted as hex, versus binary */
  long                byteCount;              /* Number of bytes in the data being streamed */
  const void *        data;                   /* Pointer to the data being streamed */
};
typedef struct scalerStreamData         scalerStreamData;

#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


#endif /* __SCALERSTREAMTYPES__ */

