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 #ifndef HB_H_IN
  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  * Note re various memory-modes:
  41  *
  42  * - In no case shall the HarfBuzz client modify memory
  43  *   that is passed to HarfBuzz in a blob.  If there is
  44  *   any such possibility, MODE_DUPLICATE should be used
  45  *   such that HarfBuzz makes a copy immediately,
  46  *
  47  * - Use MODE_READONLY otherse, unless you really really
  48  *   really know what you are doing,
  49  *
  50  * - MODE_WRITABLE is appropriate if you really made a
  51  *   copy of data solely for the purpose of passing to
  52  *   HarfBuzz and doing that just once (no reuse!),
  53  *
  54  * - If the font is mmap()ed, it's ok to use
  55  *   READONLY_MAY_MAKE_WRITABLE, however, using that mode
  56  *   correctly is very tricky.  Use MODE_READONLY instead.
  57  */
  58 typedef enum {
  59   HB_MEMORY_MODE_DUPLICATE,
  60   HB_MEMORY_MODE_READONLY,
  61   HB_MEMORY_MODE_WRITABLE,
  62   HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE
  63 } hb_memory_mode_t;
  64 
  65 typedef struct hb_blob_t hb_blob_t;
  66 
  67 hb_blob_t *
  68 hb_blob_create (const char        *data,
  69                 unsigned int       length,
  70                 hb_memory_mode_t   mode,
  71                 void              *user_data,
  72                 hb_destroy_func_t  destroy);
  73 
  74 /* Always creates with MEMORY_MODE_READONLY.
  75  * Even if the parent blob is writable, we don't
  76  * want the user of the sub-blob to be able to
  77  * modify the parent data as that data may be
  78  * shared among multiple sub-blobs.
  79  */
  80 hb_blob_t *
  81 hb_blob_create_sub_blob (hb_blob_t    *parent,
  82                          unsigned int  offset,
  83                          unsigned int  length);
  84 
  85 hb_blob_t *
  86 hb_blob_get_empty (void);
  87 
  88 hb_blob_t *
  89 hb_blob_reference (hb_blob_t *blob);
  90 
  91 void
  92 hb_blob_destroy (hb_blob_t *blob);
  93 
  94 hb_bool_t
  95 hb_blob_set_user_data (hb_blob_t          *blob,
  96                        hb_user_data_key_t *key,
  97                        void *              data,
  98                        hb_destroy_func_t   destroy,
  99                        hb_bool_t           replace);
 100 
 101 
 102 void *
 103 hb_blob_get_user_data (hb_blob_t          *blob,
 104                        hb_user_data_key_t *key);
 105 
 106 
 107 void
 108 hb_blob_make_immutable (hb_blob_t *blob);
 109 
 110 hb_bool_t
 111 hb_blob_is_immutable (hb_blob_t *blob);
 112 
 113 
 114 unsigned int
 115 hb_blob_get_length (hb_blob_t *blob);
 116 
 117 const char *
 118 hb_blob_get_data (hb_blob_t *blob, unsigned int *length);
 119 
 120 char *
 121 hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length);
 122 
 123 
 124 HB_END_DECLS
 125 
 126 #endif /* HB_BLOB_H */