shithub: freetype+ttf2subf

Download patch

ref: 547a252af18469d72f8da9b6593309d6d014b1c4
parent: d16a4b8111c42699e352cf2e758454c9a1189bab
author: Werner Lemberg <[email protected]>
date: Wed Feb 16 03:23:58 EST 2000

Formatting.  Adding/Fixing documentation.

git/fs: mount .git/fs: mount/attach disallowed
--- a/src/base/ftdriver.h
+++ b/src/base/ftdriver.h
@@ -72,8 +72,9 @@
   /*                                                                       */
   typedef FT_Error  (*FTDriver_doneDriver)( FT_Driver  driver );
 
-
   
+  typedef void  (*FTDriver_Interface)( void );
+
   /*************************************************************************/
   /*                                                                       */
   /* <FuncType>                                                            */
@@ -101,11 +102,9 @@
   /*    isn't available (i.e., wasn't compiled in the driver at build      */
   /*    time).                                                             */
   /*                                                                       */
-  typedef void  (*FTDriver_Interface)( void );
-
   typedef FTDriver_Interface  (*FTDriver_getInterface)
-                        ( FT_Driver         driver,
-                          const FT_String*  interface );
+                                ( FT_Driver         driver,
+                                  const FT_String*  interface );
 
 
   /*************************************************************************/
@@ -128,12 +127,14 @@
   /*    FT_Attach_Reader                                                   */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    This function is associated to the "attach_file" driver-specific   */
-  /*    interface. It is used to read additional data for a given face     */
-  /*    from another input stream/file. For example, it is used to         */
-  /*    attach a Type 1 AFM file to a given Type 1 face..                  */
+  /*    This function is associated to the `attach_file' driver-specific   */
+  /*    interface.  It is used to read additional data for a given face    */
+  /*    from another input stream/file.  For example, it is used to        */
+  /*    attach a Type 1 AFM file to a given Type 1 face.                   */
   /*                                                                       */
   typedef FT_Error  (*FT_Attach_Reader)( FT_Face  face, FT_Stream  stream );
+
+
 
   /*************************************************************************/
   /*************************************************************************/
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -51,7 +51,7 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    Allocates a new block of memory.  The returned area is always      */
-  /*    zero-filled, this is a strong convention in many FreeType parts.   */
+  /*    zero-filled; this is a strong convention in many FreeType parts.   */
   /*                                                                       */
   /* <Input>                                                               */
   /*    memory :: A handle to a given `memory object' where allocation     */
@@ -107,21 +107,21 @@
   /*    from the heap, possibly changing `*P'.                             */
   /*                                                                       */
   /* <Input>                                                               */
-  /*    memory :: A handle to a given `memory object' where allocation     */
-  /*              occurs.                                                  */
+  /*    memory  :: A handle to a given `memory object' where allocation    */
+  /*               occurs.                                                 */
   /*                                                                       */
-  /*    current :: current block size in bytes                             */
-  /*    size    :: the new block size in bytes                             */
+  /*    current :: The current block size in bytes.                        */
+  /*    size    :: The new block size in bytes.                            */
   /*                                                                       */
   /* <InOut>                                                               */
-  /*    P      :: A pointer to the fresh new block.  It should be set to   */
-  /*              NULL if `size' is 0, or in case of error.                */
+  /*    P       :: A pointer to the fresh new block.  It should be set to  */
+  /*               NULL if `size' is 0, or in case of error.               */
   /*                                                                       */
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    All callers of FT_Realloc _must_ provide the current block size    */
+  /*    All callers of FT_Realloc() _must_ provide the current block size  */
   /*    as well as the new one.                                            */
   /*                                                                       */
   /*    If the memory object's flag FT_SYSTEM_FLAG_NO_REALLOC is set, this */
@@ -129,13 +129,13 @@
   /*    FT_Free().  Otherwise, it will call the system-specific `realloc'  */
   /*    implementation.                                                    */
   /*                                                                       */
-  /*    (Some embedded systems do not have a working realloc).             */
+  /*    (Some embedded systems do not have a working realloc function).    */
   /*                                                                       */
   BASE_FUNC
   FT_Error  FT_Realloc( FT_Memory  memory,
                         FT_Long    current,
                         FT_Long    size,
-                        void*     *P )
+                        void**     P )
   {
     void*  Q;
 
@@ -178,7 +178,7 @@
   /*                                                                       */
   /* <Input>                                                               */
   /*    memory :: A handle to a given `memory object' where allocation     */
-  /*              occured.                                                 */
+  /*              occurred.                                                */
   /*                                                                       */
   /*    P      :: This is the _address_ of a _pointer_ which points to the */
   /*              allocated block.  It is always set to NULL on exit.      */
@@ -193,7 +193,7 @@
   /*                                                                       */
   BASE_FUNC
   void  FT_Free( FT_Memory  memory,
-                 void*     *P )
+                 void**     P )
   {
     FT_TRACE2(( "FT_Free:" ));
     FT_TRACE2(( " Freeing block 0x%08lx, ref 0x%08lx\n",
@@ -209,45 +209,46 @@
   }
 
 
- /***************************************************************************
-  *
-  *  ft_new_input_stream:
-  *
-  *    create a new input stream object from a FT_Open_Args structure..
-  *
-  **************************************************************************/
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_new_input_stream                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Creates a new input stream object from an FT_Open_Args structure.  */
+  /*                                                                       */
   static
-  FT_Error  ft_new_input_stream( FT_Library    library,
-                                 FT_Open_Args* args,
-                                 FT_Stream    *astream )
+  FT_Error  ft_new_input_stream( FT_Library     library,
+                                 FT_Open_Args*  args,
+                                 FT_Stream*     astream )
   {
-    FT_Error  error;
-    FT_Memory memory;
-    FT_Stream stream;
+    FT_Error   error;
+    FT_Memory  memory;
+    FT_Stream  stream;
+
     
     memory = library->memory;
-    if  ( ALLOC( stream, sizeof(*stream) ) )
+    if ( ALLOC( stream, sizeof ( *stream ) ) )
       return error;
       
     stream->memory = memory;
     
-    /* is it a memory stream ------------------------- ? */
-    if (args->memory_base && args->memory_size)
-    {
+    /* is it a memory stream? */
+    if ( args->memory_base && args->memory_size )
       FT_New_Memory_Stream( library,
                             args->memory_base,
                             args->memory_size,
                             stream );
-    }
 
-    /* do we have an 8-bit pathname ------------------ ? */
-    else if (args->pathname)
+    /* do we have an 8-bit pathname? */
+    else if ( args->pathname )
       error = FT_New_Stream( args->pathname, stream );
 
-    /* do we have a custom stream -------------------- ? */
-    else if (args->stream)
+    /* do we have a custom stream? */
+    else if ( args->stream )
     {
-      /* copy the content of the argument stream into the new stream object */
+      /* copy the contents of the argument stream */
+      /* into the new stream object               */
       *stream = *(args->stream);
       stream->memory = memory;
     }
@@ -254,8 +255,8 @@
     else
       error = FT_Err_Invalid_Argument;
       
-    if (error)
-      FREE(stream);
+    if ( error )
+      FREE( stream );
       
     *astream = stream;
     return error;
@@ -262,20 +263,22 @@
   }
 
 
- /***************************************************************************
-  *
-  *  ft_done_stream:
-  *
-  *    closes and destroys a stream object.
-  *
-  **************************************************************************/
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_done_stream                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Closes and destroys a stream object.                               */
+  /*                                                                       */
   static
-  void ft_done_stream( FT_Stream*  astream )
+  void  ft_done_stream( FT_Stream*  astream )
   {
     FT_Stream  stream = *astream;
     FT_Memory  memory = stream->memory;
+
     
-    if (stream->close)
+    if ( stream->close )
       stream->close( stream );
       
     FREE( stream );
@@ -283,12 +286,13 @@
   }
 
 
+
   /*************************************************************************/
   /*************************************************************************/
   /*************************************************************************/
   /****                                                                 ****/
   /****                                                                 ****/
-  /****                   O B J E C T   M A N A G E M E N T             ****/
+  /****               O B J E C T   M A N A G E M E N T                 ****/
   /****                                                                 ****/
   /****                                                                 ****/
   /*************************************************************************/
@@ -343,7 +347,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
-  /*   Destroy_Driver                                                      */
+  /*    Destroy_Driver                                                     */
   /*                                                                       */
   /* <Description>                                                         */
   /*    Destroys a given driver object.  This also destroys all child      */
@@ -350,10 +354,10 @@
   /*    faces.                                                             */
   /*                                                                       */
   /* <InOut>                                                               */
-  /*    driver :: A handle to the target driver object.                    */
+  /*     driver :: A handle to the target driver object.                   */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    The driver _must_ be LOCKED!                                       */
+  /*     The driver _must_ be LOCKED!                                      */
   /*                                                                       */
   static
   void  Destroy_Driver( FT_Driver  driver )
@@ -502,11 +506,11 @@
   /*    font format.                                                       */
   /*                                                                       */
   /* <Input>                                                               */
-  /*    library     :: A handle to the library object.                     */
-  /*    hook_index  :: The index of the debug hook.  You should use the    */
-  /*                   values defined in ftobjs.h, e.g.                    */
-  /*                   FT_DEBUG_HOOK_TRUETYPE                              */
-  /*    debug_hook  :: The function used to debug the interpreter.         */
+  /*    library    :: A handle to the library object.                      */
+  /*    hook_index :: The index of the debug hook.  You should use the     */
+  /*                  values defined in ftobjs.h, e.g.                     */
+  /*                  FT_DEBUG_HOOK_TRUETYPE                               */
+  /*    debug_hook :: The function used to debug the interpreter.          */
   /*                                                                       */
   /* <Note>                                                                */
   /*    Currently, four debug hook slots are available, but only two (for  */
@@ -545,6 +549,7 @@
   {
     FT_Glyph_Format*  new = 0;
 
+
     {
       FT_Glyph_Format*  cur   = library->glyph_formats;
       FT_Glyph_Format*  limit = cur + FT_MAX_GLYPH_FORMATS;
@@ -562,7 +567,7 @@
     }
 
     /* if there is no place to hold the new format, return an error */
-    if (!new)
+    if ( !new )
       return FT_Err_Too_Many_Glyph_Formats;
 
     *new = *format;
@@ -643,11 +648,11 @@
   FT_Error  FT_New_Library( FT_Memory    memory,
                             FT_Library*  alibrary )
   {
-    FT_Library library      = 0;
+    FT_Library library = 0;
     FT_Error   error;
 
 
-    /* First of all, allocate the library object */
+    /* first of all, allocate the library object */
     if ( ALLOC( library, sizeof ( *library ) ) )
       return error;
 
@@ -719,7 +724,7 @@
     }
 
     /* Destroy raster object */
-    FREE( library->raster_pool   );
+    FREE( library->raster_pool );
 
     {
       FT_Glyph_Format*  cur   = library->glyph_formats;
@@ -913,7 +918,7 @@
     {
       if ( *cur == driver )
       {
-        /* Destroy the driver object */
+        /* destroy the driver object */
         Destroy_Driver( driver );
 
         /* now move the last driver in the table to the vacant slot */
@@ -933,6 +938,7 @@
     return error;
   }
 
+
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
@@ -947,7 +953,7 @@
   /*    driver_name :: The name of the driver to look up.                  */
   /*                                                                       */
   /* <Return>                                                              */
-  /*    A handle to the driver object,  0 otherwise.                       */
+  /*    A handle to the driver object, 0 otherwise.                        */
   /*                                                                       */
   EXPORT_FUNC
   FT_Driver  FT_Get_Driver( FT_Library  library,
@@ -970,6 +976,14 @@
   }
 
 
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    open_face                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function does some work for FT_Open_Face().                   */
+  /*                                                                       */
   static
   FT_Error  open_face( FT_Driver  driver,
                        FT_Stream  stream,
@@ -985,7 +999,7 @@
     interface = &driver->interface;
     memory    = driver->memory;
 
-    /* allocate the face object, and performs basic initialisation */
+    /* allocate the face object, and perform basic initialization */
     if ( ALLOC( face, interface->face_object_size ) )
       goto Fail;
 
@@ -1011,6 +1025,11 @@
   }
 
 
+  static
+  const FT_Open_Args  ft_default_open_args = 
+    { 0, 0, 0, 0, 0 };
+
+
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
@@ -1017,12 +1036,14 @@
   /*    FT_New_Face                                                        */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    Creates a new face object from a given resource and typeface       */
-  /*    index.                                                             */
+  /*    Creates a new face object from a given resource and typeface index */
+  /*    using a pathname to the font file.                                 */
   /*                                                                       */
-  /* <Input>                                                               */
-  /*    resource   :: A handle to a source resource.                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
   /*                                                                       */
+  /* <Input>                                                               */
+  /*    pathname   :: A path to the font file.                             */
   /*    face_index :: The index of the face within the resource.  The      */
   /*                  first face has index 0.                              */
   /* <Output>                                                              */
@@ -1032,11 +1053,11 @@
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    Unlike FreeType 1.1, this function automatically creates a glyph   */
+  /*    Unlike FreeType 1.x, this function automatically creates a glyph   */
   /*    slot for the face object which can be accessed directly through    */
   /*    `face->glyph'.                                                     */
   /*                                                                       */
-  /*    Note that additional slots can be added to each face through the   */
+  /*    Note that additional slots can be added to each face with the      */
   /*    FT_New_GlyphSlot() API function.  Slots are linked in a single     */
   /*    list through their `next' field.                                   */
   /*                                                                       */
@@ -1046,18 +1067,14 @@
   /*    `*face'.  Its return value should be 0 if the resource is          */
   /*    recognized, or non-zero if not.                                    */
   /*                                                                       */
-
-  static
-  const FT_Open_Args  ft_default_open_args = 
-    { 0, 0, 0, 0, 0 };
-
   EXPORT_FUNC
   FT_Error  FT_New_Face( FT_Library   library,
                          const char*  pathname,
                          FT_Long      face_index,
-                         FT_Face     *aface )
+                         FT_Face*     aface )
   {
     FT_Open_Args  args = ft_default_open_args;
+
     
     args.pathname = (char*)pathname;
     return FT_Open_Face( library, &args, face_index, aface );
@@ -1064,6 +1081,44 @@
   }
 
 
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Memory_Face                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Creates a new face object from a given resource and typeface index */
+  /*    using a font file already loaded into memory.                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    file_base  :: A pointer to the beginning of the font data.         */
+  /*    file_size  :: The size of the memory chunk used by the font data.  */
+  /*    face_index :: The index of the face within the resource.  The      */
+  /*                  first face has index 0.                              */
+  /* <Output>                                                              */
+  /*    face       :: A handle to a new face object.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Unlike FreeType 1.x, this function automatically creates a glyph   */
+  /*    slot for the face object which can be accessed directly through    */
+  /*    `face->glyph'.                                                     */
+  /*                                                                       */
+  /*    Note that additional slots can be added to each face with the      */
+  /*    FT_New_GlyphSlot() API function.  Slots are linked in a single     */
+  /*    list through their `next' field.                                   */
+  /*                                                                       */
+  /*    FT_New_Memory_Face() can be used to determine and/or check the     */
+  /*    font format of a given font resource.  If the `face_index' field   */
+  /*    is negative, the function will _not_ return any face handle in     */
+  /*    `*face'.  Its return value should be 0 if the resource is          */
+  /*    recognized, or non-zero if not.                                    */
+  /*                                                                       */
   EXPORT_FUNC
   FT_Error  FT_New_Memory_Face( FT_Library   library,
                                 void*        file_base,
@@ -1073,6 +1128,7 @@
   {
     FT_Open_Args  args = ft_default_open_args;
 
+
     args.memory_base = file_base;
     args.memory_size = file_size;
     return FT_Open_Face( library, &args, face_index, face );
@@ -1079,6 +1135,45 @@
   }
 
 
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Open_Face                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Opens a face object from a given resource and typeface index using */
+  /*    an `FT_Open_Args' structure.  If the face object doesn't exist, it */
+  /*    will be created.                                                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    args       :: A pointer to an `FT_Open_Args' structure which must  */
+  /*                  be filled by the caller.                             */
+  /*    face_index :: The index of the face within the resource.  The      */
+  /*                  first face has index 0.                              */
+  /* <Output>                                                              */
+  /*    face       :: A handle to a new face object.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Unlike FreeType 1.x, this function automatically creates a glyph   */
+  /*    slot for the face object which can be accessed directly through    */
+  /*    `face->glyph'.                                                     */
+  /*                                                                       */
+  /*    Note that additional slots can be added to each face with the      */
+  /*    FT_New_GlyphSlot() API function.  Slots are linked in a single     */
+  /*    list through their `next' field.                                   */
+  /*                                                                       */
+  /*    FT_Open_Face() can be used to determine and/or check the font      */
+  /*    format of a given font resource.  If the `face_index' field is     */
+  /*    negative, the function will _not_ return any face handle in        */
+  /*    `*face'.  Its return value should be 0 if the resource is          */
+  /*    recognized, or non-zero if not.                                    */
+  /*                                                                       */
   EXPORT_FUNC
   FT_Error  FT_Open_Face( FT_Library     library,
                           FT_Open_Args*  args,
@@ -1092,6 +1187,7 @@
     FT_Face      face = 0;
     FT_ListNode  node = 0;
 
+
     *aface = 0;
 
     if ( !library )
@@ -1099,20 +1195,22 @@
 
     /* create input stream */
     error = ft_new_input_stream( library, args, &stream );
-    if (error) goto Exit;
+    if ( error )
+      goto Exit;
 
     memory = library->memory;
 
-    /* if the font driver is specified in the args structure, use */
-    /* it. Otherwise, we'll scan the list of registered drivers.. */
-    if (args->driver)
+    /* if the font driver is specified in the `args' structure, use */
+    /* it.  Otherwise, we'll scan the list of registered drivers.   */
+    if ( args->driver )
     {
       driver = args->driver;
-      /* not all drivers directly support face objects, so check.. */
-      if (driver->interface.face_object_size)
+      /* not all drivers directly support face objects, so check... */
+      if ( driver->interface.face_object_size )
       {
         error = open_face( driver, stream, face_index, &face );
-        if (!error) goto Success;
+        if ( !error )
+          goto Success;
       }
       else
         error = FT_Err_Invalid_Handle;
@@ -1125,11 +1223,12 @@
       FT_Driver*  cur   = library->drivers;
       FT_Driver*  limit = cur + library->num_drivers;
 
+
       for ( ; cur < limit; cur++ )
       {
         driver = *cur;
-       /* not all drivers directly support face objects, so check.. */
-        if (driver->interface.face_object_size)
+        /* not all drivers directly support face objects, so check... */
+        if ( driver->interface.face_object_size )
         {
           error = open_face( driver, stream, face_index, &face );
           if ( !error )
@@ -1146,11 +1245,9 @@
     }
 
   Success:
-
     FT_TRACE4(( "FT_New_Face: New face object, adding to list\n" ));
 
-    /****************************************************************/
-    /* add the face object to its driver's list                     */
+    /* add the face object to its driver's list */
     if ( ALLOC( node, sizeof ( *node ) ) )
       goto Fail;
 
@@ -1157,24 +1254,26 @@
     node->data = face;
     FT_List_Add( &driver->faces_list, node );
 
-    /****************************************************************/
-    /* now allocate a glyph slot object for the face                */
+    /* now allocate a glyph slot object for the face */
     {
       FT_GlyphSlot  slot;
 
+
       FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" ));
       error = FT_New_GlyphSlot( face, &slot );
-      if ( error ) goto Fail;
+      if ( error )
+        goto Fail;
     }
 
-    /****************************************************************/
-    /* finally allocate a size object for the face                  */
+    /* finally allocate a size object for the face */
     {
       FT_Size  size;
 
+
       FT_TRACE4(( "FT_Open_Face: Creating size object\n" ));
       error = FT_New_Size( face, &size );
-      if ( error ) goto Fail;
+      if ( error )
+        goto Fail;
     }
 
     *aface = face;
@@ -1195,30 +1294,31 @@
   /*    FT_Attach_File                                                     */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    "Attach" a given font file to an existing face. This is usually    */
-  /*    to read additionnal information for a single face object. For      */
+  /*    `Attaches' a given font file to an existing face.  This is usually */
+  /*    to read additional information for a single face object.  For      */
   /*    example, it is used to read the AFM files that come with Type 1    */
-  /*    fonts in order to add kerning data and other metrics..             */
+  /*    fonts in order to add kerning data and other metrics.              */
   /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face         :: The target face object.                            */
+  /*                                                                       */
   /* <Input>                                                               */
-  /*    face         :: target face object                                 */
+  /*    filepathname :: An 8-bit pathname naming the `metrics' file.       */
   /*                                                                       */
-  /*    filepathname :: an 8-bit pathname naming the 'metrics' file.       */
-  /*                                                                       */
   /* <Return>                                                              */
-  /*    Error code.  0 means success.                                      */
+  /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
   /* <Note>                                                                */
   /*    If your font file is in memory, or if you want to provide your     */
-  /*    own input stream object, see FT_Attach_Stream.                     */
+  /*    own input stream object, use FT_Attach_Stream().                   */
   /*                                                                       */
-  /*    The meaning of the "attach" (i.e. what really happens when the     */
-  /*    new file is read) is not fixed by FreeType itself. It really       */
+  /*    The meaning of the `attach' action (i.e., what really happens when */
+  /*    the new file is read) is not fixed by FreeType itself.  It really  */
   /*    depends on the font format (and thus the font driver).             */
   /*                                                                       */
-  /*    Client applications are expected to know what they're doing        */
-  /*    when invoking this function. Most drivers simply do not implement  */
-  /*    file attachments..                                                 */
+  /*    Client applications are expected to know what they are doing       */
+  /*    when invoking this function. Most  drivers simply do not implement */
+  /*    file attachments.                                                  */
   /*                                                                       */
   EXPORT_FUNC
   FT_Error  FT_Attach_File( FT_Face      face,
@@ -1229,6 +1329,7 @@
     open.pathname = (char*)filepathname;
     return FT_Attach_Stream( face, &open );
   }
+
                             
   /*************************************************************************/
   /*                                                                       */