(root)/
harfbuzz-8.3.0/
src/
hb-blob.h
       1  /*
       2   * Copyright © 2009  Red Hat, Inc.
       3   *
       4   *  This is part of HarfBuzz, a text shaping library.
       5   *
       6   * Permission is hereby granted, without written agreement and without
       7   * license or royalty fees, to use, copy, modify, and distribute this
       8   * software and its documentation for any purpose, provided that the
       9   * above copyright notice and the following two paragraphs appear in
      10   * all copies of this software.
      11   *
      12   * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
      13   * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
      14   * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
      15   * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
      16   * DAMAGE.
      17   *
      18   * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
      19   * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
      20   * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
      21   * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
      22   * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
      23   *
      24   * Red Hat Author(s): Behdad Esfahbod
      25   */
      26  
      27  #if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
      28  #error "Include <hb.h> instead."
      29  #endif
      30  
      31  #ifndef HB_BLOB_H
      32  #define HB_BLOB_H
      33  
      34  #include "hb-common.h"
      35  
      36  HB_BEGIN_DECLS
      37  
      38  
      39  /**
      40   * hb_memory_mode_t:
      41   * @HB_MEMORY_MODE_DUPLICATE: HarfBuzz immediately makes a copy of the data.
      42   * @HB_MEMORY_MODE_READONLY: HarfBuzz client will never modify the data,
      43   *     and HarfBuzz will never modify the data.
      44   * @HB_MEMORY_MODE_WRITABLE: HarfBuzz client made a copy of the data solely
      45   *     for HarfBuzz, so HarfBuzz may modify the data.
      46   * @HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE: See above
      47   *
      48   * Data type holding the memory modes available to
      49   * client programs.
      50   *
      51   * Regarding these various memory-modes:
      52   *
      53   * - In no case shall the HarfBuzz client modify memory
      54   *   that is passed to HarfBuzz in a blob.  If there is
      55   *   any such possibility, @HB_MEMORY_MODE_DUPLICATE should be used
      56   *   such that HarfBuzz makes a copy immediately,
      57   *
      58   * - Use @HB_MEMORY_MODE_READONLY otherwise, unless you really really
      59   *   really know what you are doing,
      60   *
      61   * - @HB_MEMORY_MODE_WRITABLE is appropriate if you really made a
      62   *   copy of data solely for the purpose of passing to
      63   *   HarfBuzz and doing that just once (no reuse!),
      64   *
      65   * - If the font is mmap()ed, it's okay to use
      66   *   @HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, however, using that mode
      67   *   correctly is very tricky.  Use @HB_MEMORY_MODE_READONLY instead.
      68   **/
      69  typedef enum {
      70    HB_MEMORY_MODE_DUPLICATE,
      71    HB_MEMORY_MODE_READONLY,
      72    HB_MEMORY_MODE_WRITABLE,
      73    HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE
      74  } hb_memory_mode_t;
      75  
      76  /**
      77   * hb_blob_t:
      78   *
      79   * Data type for blobs. A blob wraps a chunk of binary
      80   * data and facilitates its lifecycle management between
      81   * a client program and HarfBuzz.
      82   *
      83   **/
      84  typedef struct hb_blob_t hb_blob_t;
      85  
      86  HB_EXTERN hb_blob_t *
      87  hb_blob_create (const char        *data,
      88  		unsigned int       length,
      89  		hb_memory_mode_t   mode,
      90  		void              *user_data,
      91  		hb_destroy_func_t  destroy);
      92  
      93  HB_EXTERN hb_blob_t *
      94  hb_blob_create_or_fail (const char        *data,
      95  			unsigned int       length,
      96  			hb_memory_mode_t   mode,
      97  			void              *user_data,
      98  			hb_destroy_func_t  destroy);
      99  
     100  HB_EXTERN hb_blob_t *
     101  hb_blob_create_from_file (const char *file_name);
     102  
     103  HB_EXTERN hb_blob_t *
     104  hb_blob_create_from_file_or_fail (const char *file_name);
     105  
     106  /* Always creates with MEMORY_MODE_READONLY.
     107   * Even if the parent blob is writable, we don't
     108   * want the user of the sub-blob to be able to
     109   * modify the parent data as that data may be
     110   * shared among multiple sub-blobs.
     111   */
     112  HB_EXTERN hb_blob_t *
     113  hb_blob_create_sub_blob (hb_blob_t    *parent,
     114  			 unsigned int  offset,
     115  			 unsigned int  length);
     116  
     117  HB_EXTERN hb_blob_t *
     118  hb_blob_copy_writable_or_fail (hb_blob_t *blob);
     119  
     120  HB_EXTERN hb_blob_t *
     121  hb_blob_get_empty (void);
     122  
     123  HB_EXTERN hb_blob_t *
     124  hb_blob_reference (hb_blob_t *blob);
     125  
     126  HB_EXTERN void
     127  hb_blob_destroy (hb_blob_t *blob);
     128  
     129  HB_EXTERN hb_bool_t
     130  hb_blob_set_user_data (hb_blob_t          *blob,
     131  		       hb_user_data_key_t *key,
     132  		       void *              data,
     133  		       hb_destroy_func_t   destroy,
     134  		       hb_bool_t           replace);
     135  
     136  
     137  HB_EXTERN void *
     138  hb_blob_get_user_data (const hb_blob_t    *blob,
     139  		       hb_user_data_key_t *key);
     140  
     141  
     142  HB_EXTERN void
     143  hb_blob_make_immutable (hb_blob_t *blob);
     144  
     145  HB_EXTERN hb_bool_t
     146  hb_blob_is_immutable (hb_blob_t *blob);
     147  
     148  
     149  HB_EXTERN unsigned int
     150  hb_blob_get_length (hb_blob_t *blob);
     151  
     152  HB_EXTERN const char *
     153  hb_blob_get_data (hb_blob_t *blob, unsigned int *length);
     154  
     155  HB_EXTERN char *
     156  hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length);
     157  
     158  HB_END_DECLS
     159  
     160  #endif /* HB_BLOB_H */